2 NEC PC-98DO Emulator 'ePC-98DO'
3 NEC PC-8801MA Emulator 'ePC-8801MA'
4 NEC PC-8001mkIISR Emulator 'ePC-8001mkIISR'
6 Author : Takeda.Toshiya
16 #include "../../emu.h"
17 #include "../device.h"
19 #define SIG_PC88_USART_IRQ 0
20 #define SIG_PC88_SOUND_IRQ 1
21 #ifdef SUPPORT_PC88_SB2
22 #define SIG_PC88_SB2_IRQ 2
24 #define SIG_PC88_USART_OUT 3
25 #define SIG_PC88_DATAREC_MIX 4
26 #define SIG_PC88_DATAREC_VOLUME 5
29 #define CMT_BUFFER_SIZE 0x40000
31 #if defined(_PC8001SR) && !defined(PC88_EXRAM_BANKS)
32 #define PC88_EXRAM_BANKS 1
35 #if !defined(_PC8001SR)
45 uint8_t cursor, attrib;
54 uint8_t expand[200][80];
57 uint8_t expand[200][80];
64 uint8_t buffer[120 * 200];
68 uint8_t mode, reverse, intr_mask, status;
71 void reset(bool hireso);
72 void write_cmd(uint8_t data);
73 void write_param(uint8_t data);
74 uint32_t read_param();
75 uint32_t read_status();
78 void write_buffer(uint8_t data);
79 uint8_t read_buffer(int ofs);
81 void expand_buffer(bool hireso, bool line400);
82 void set_attrib(uint8_t code);
97 void write_io8(uint32_t addr, uint32_t data);
98 uint32_t read_io8(uint32_t addr);
100 void run(int c, int nbytes);
104 class PC88 : public DEVICE
108 #ifdef SUPPORT_PC88_SB2
112 DEVICE *d_pcm, *d_pio, *d_prn, *d_rtc, *d_sio;
113 #ifdef SUPPORT_PC88_PCG8100
114 DEVICE *d_pcg_pit, *d_pcg_pcm0, *d_pcg_pcm1, *d_pcg_pcm2;
119 uint8_t wdmy[0x1000];
120 uint8_t rdmy[0x1000];
122 uint8_t ram[0x10000];
123 #if defined(PC88_EXRAM_BANKS)
124 uint8_t exram[0x8000 * PC88_EXRAM_BANKS];
126 uint8_t gvram[0xc000];
127 uint8_t gvram_null[0x4000];
128 uint8_t tvram[0x1000];
129 #if defined(_PC8001SR)
130 uint8_t n80mk2rom[0x8000];
131 uint8_t n80mk2srrom[0xa000];
133 uint8_t n88rom[0x8000];
134 uint8_t n88exrom[0x8000];
135 uint8_t n80rom[0x8000];
137 uint8_t kanji1[0x20000];
138 uint8_t kanji2[0x20000];
139 #ifdef SUPPORT_PC88_DICTIONARY
140 uint8_t dicrom[0x80000];
151 uint8_t gvram_plane, gvram_sel;
153 void update_timing();
154 int get_m1_wait(bool addr_f000);
155 int get_main_wait(bool read);
156 int get_tvram_wait(bool read);
157 int get_gvram_wait(bool read);
158 void update_gvram_wait();
159 void update_gvram_sel();
160 #if defined(_PC8001SR)
161 void update_n80_write();
162 void update_n80_read();
164 void update_low_memmap();
165 void update_tvram_memmap();
170 #if defined(SUPPORT_PC88_HIGH_CLOCK)
171 bool cpu_clock_high_fe2;
175 int f000_m1_wait_clocks;
176 int mem_wait_clocks_r, mem_wait_clocks_w;
177 int tvram_wait_clocks_r, tvram_wait_clocks_w;
178 int gvram_wait_clocks_r, gvram_wait_clocks_w;
188 uint8_t sg_pattern[0x800];
189 uint8_t text[200][640];
190 uint8_t graph[400][640];
191 scrntype_t palette_text_pc[9]; // 0 = back color for attrib mode, 8 = black
192 scrntype_t palette_graph_pc[8];
195 #if defined(_PC8001SR)
196 bool draw_320x200_color_graph();
197 bool draw_320x200_4color_graph();
198 void draw_320x200_attrib_graph();
200 bool draw_640x200_color_graph();
201 void draw_640x200_mono_graph();
202 #if defined(_PC8001SR)
203 void draw_640x200_attrib_graph();
205 void draw_640x400_attrib_graph();
213 uint8_t key_status[256];
214 uint8_t key_caps, key_kana;
216 #ifdef SUPPORT_PC88_JOYSTICK
218 const uint32_t *joystick_status;
219 const int32_t* mouse_status;
220 uint32_t mouse_strobe_clock;
221 uint32_t mouse_strobe_clock_lim;
223 int mouse_dx, mouse_dy;
224 int mouse_lx, mouse_ly;
230 #ifdef SUPPORT_PC88_SB2
233 uint8_t intr_mask1, intr_mask2;
234 void request_intr(int level, bool status);
239 bool cmt_play, cmt_rec;
240 _TCHAR rec_file_path[_MAX_PATH];
241 int cmt_bufptr, cmt_bufcnt;
242 uint8_t cmt_buffer[CMT_BUFFER_SIZE];
243 int cmt_data_carrier[1024], cmt_data_carrier_cnt;
247 bool check_data_carrier();
250 bool beep_on, beep_signal, sing_signal;
251 #ifdef SUPPORT_PC88_PCG8100
254 uint8_t pcg_data, pcg_ctrl;
255 uint8_t pcg_pattern[0x800];
259 // dirty patch for NIPPY
264 PC88(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu) {}
272 void write_data8w(uint32_t addr, uint32_t data, int* wait);
273 uint32_t read_data8w(uint32_t addr, int* wait);
274 uint32_t fetch_op(uint32_t addr, int *wait);
275 void write_io8(uint32_t addr, uint32_t data);
276 uint32_t read_io8(uint32_t addr);
278 uint32_t read_io8_debug(uint32_t addr);
281 uint32_t read_dma_data8(uint32_t addr);
282 void write_dma_io8(uint32_t addr, uint32_t data);
284 void write_signal(int id, uint32_t data, uint32_t mask);
285 void event_callback(int event_id, int err);
287 void event_vline(int v, int clock);
288 uint32_t get_intr_ack();
289 void notify_intr_ei();
290 void save_state(FILEIO* state_fio);
291 bool load_state(FILEIO* state_fio);
296 #if !defined(_PC8001SR)
297 return (n88rom[0x79d7] < 0x38);
302 void set_context_cpu(Z80* device)
306 void set_context_opn(YM2203* device)
310 #ifdef SUPPORT_PC88_SB2
311 void set_context_sb2(YM2203* device)
316 void set_context_pcm(DEVICE* device)
320 void set_context_pio(DEVICE* device)
324 void set_context_prn(DEVICE* device)
328 void set_context_rtc(DEVICE* device)
332 void set_context_sio(DEVICE* device)
336 #ifdef SUPPORT_PC88_PCG8100
337 void set_context_pcg_pit(DEVICE* device)
341 void set_context_pcg_pcm0(DEVICE* device)
345 void set_context_pcg_pcm1(DEVICE* device)
349 void set_context_pcg_pcm2(DEVICE* device)
354 void key_down(int code, bool repeat);
356 void play_tape(const _TCHAR* file_path);
357 void rec_tape(const _TCHAR* file_path);
359 bool is_tape_inserted()
361 return (cmt_play || cmt_rec);
363 bool is_frame_skippable();