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 #ifdef SUPPORT_PC88_CDROM
25 #define SIG_PC88_SCSI_DRQ 3
27 #define SIG_PC88_USART_OUT 4
29 #define CMT_BUFFER_SIZE 0x40000
31 #if defined(_PC8001SR) && !defined(PC88_EXRAM_BANKS)
32 #define PC88_EXRAM_BANKS 1
35 #if !defined(_PC8001SR)
41 #ifdef SUPPORT_PC88_CDROM
50 uint8_t cursor, attrib;
59 uint8_t expand[200][80];
62 uint8_t expand[200][80];
69 uint8_t buffer[120 * 200];
73 uint8_t mode, reverse, intr_mask, status;
76 void reset(bool hireso);
77 void write_cmd(uint8_t data);
78 void write_param(uint8_t data);
79 uint32_t read_param();
80 uint32_t read_status();
83 void write_buffer(uint8_t data);
84 uint8_t read_buffer(int ofs);
86 void expand_buffer(bool hireso, bool line400);
87 void set_attrib(uint8_t code);
102 void write_io8(uint32_t addr, uint32_t data);
103 uint32_t read_io8(uint32_t addr);
105 void run(int c, int nbytes);
109 class PC88 : public DEVICE
113 #ifdef SUPPORT_PC88_SB2
117 DEVICE *d_pcm, *d_pio, *d_prn, *d_rtc, *d_sio;
118 #ifdef SUPPORT_PC88_CDROM
119 SCSI_HOST* d_scsi_host;
120 SCSI_CDROM* d_scsi_cdrom;
122 #ifdef SUPPORT_PC88_HMB20
125 #ifdef SUPPORT_PC88_PCG8100
126 DEVICE *d_pcg_pit, *d_pcg_pcm0, *d_pcg_pcm1, *d_pcg_pcm2;
131 uint8_t wdmy[0x1000];
132 uint8_t rdmy[0x1000];
134 uint8_t ram[0x10000];
135 #if defined(PC88_EXRAM_BANKS)
136 uint8_t exram[0x8000 * PC88_EXRAM_BANKS];
138 uint8_t gvram[0xc000];
139 uint8_t gvram_null[0x4000];
140 uint8_t tvram[0x1000];
141 #if defined(_PC8001SR)
142 uint8_t n80mk2rom[0x8000];
143 uint8_t n80mk2srrom[0xa000];
145 uint8_t n88rom[0x8000];
146 uint8_t n88exrom[0x8000];
147 uint8_t n80rom[0x8000];
149 uint8_t kanji1[0x20000];
150 uint8_t kanji2[0x20000];
151 #ifdef SUPPORT_PC88_DICTIONARY
152 uint8_t dicrom[0x80000];
154 #ifdef SUPPORT_PC88_CDROM
155 uint8_t cdbios[0x10000];
167 uint8_t gvram_plane, gvram_sel;
169 void update_timing();
170 int get_m1_wait(bool addr_f000);
171 int get_main_wait(bool read);
172 int get_tvram_wait(bool read);
173 int get_gvram_wait(bool read);
174 void update_gvram_wait();
175 void update_gvram_sel();
176 #if defined(_PC8001SR)
177 void update_n80_write();
178 void update_n80_read();
180 void update_low_memmap();
181 void update_tvram_memmap();
186 #if defined(SUPPORT_PC88_HIGH_CLOCK)
187 bool cpu_clock_high_fe2;
191 int f000_m1_wait_clocks;
192 int mem_wait_clocks_r, mem_wait_clocks_w;
193 int tvram_wait_clocks_r, tvram_wait_clocks_w;
194 int gvram_wait_clocks_r, gvram_wait_clocks_w;
198 typedef struct palette_s {
201 palette_t palette[10]; // 8 = digital back color, 9 = analog back color
205 uint8_t sg_pattern[0x800];
206 uint8_t text[200][640];
207 uint8_t text_color[200][80];
208 bool text_reverse[200][80];
209 uint8_t graph[400][640];
211 palette_t palette_digital[9];
212 palette_t palette_analog [9];
213 palette_t palette_line_digital[400][9];
214 palette_t palette_line_analog [400][9];
215 bool palette_line_changed[400];
216 #if defined(SUPPORT_PC88_VAB)
217 scrntype_t palette_vab_pc[0x10000];
221 #if defined(_PC8001SR)
222 bool draw_320x200_color_graph();
223 bool draw_320x200_4color_graph();
224 void draw_320x200_attrib_graph();
226 bool draw_640x200_color_graph();
227 void draw_640x200_mono_graph();
228 void draw_640x200_attrib_graph();
229 #if !defined(_PC8001SR)
230 void draw_640x400_mono_graph();
231 void draw_640x400_attrib_graph();
239 uint8_t key_status[256];
240 uint8_t key_caps, key_kana;
242 #ifdef SUPPORT_PC88_JOYSTICK
244 const uint32_t *joystick_status;
245 const int32_t* mouse_status;
246 uint32_t mouse_strobe_clock;
247 uint32_t mouse_strobe_clock_lim;
249 int mouse_dx, mouse_dy;
250 int mouse_lx, mouse_ly;
256 #ifdef SUPPORT_PC88_SB2
259 uint8_t intr_mask1, intr_mask2;
260 void request_intr(int level, bool status);
265 bool cmt_play, cmt_rec;
266 _TCHAR rec_file_path[_MAX_PATH];
267 int cmt_bufptr, cmt_bufcnt;
268 uint8_t cmt_buffer[CMT_BUFFER_SIZE];
269 int cmt_data_carrier[1024], cmt_data_carrier_cnt;
273 bool check_data_carrier();
276 bool beep_on, beep_signal, sing_signal;
278 #ifdef SUPPORT_PC88_PCG8100
281 uint8_t pcg_data, pcg_ctrl;
282 uint8_t pcg_pattern[0x800];
285 #ifdef SUPPORT_PC88_CDROM
286 int cdda_register_id;
291 // dirty patch for NIPPY
295 PC88(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
297 #if defined(_PC8001SR)
298 set_device_name(_T("PC-8001 Core"));
300 set_device_name(_T("PC-8801 Core"));
310 void write_data8w(uint32_t addr, uint32_t data, int* wait);
311 uint32_t read_data8w(uint32_t addr, int* wait);
312 uint32_t fetch_op(uint32_t addr, int *wait);
313 void write_io8(uint32_t addr, uint32_t data);
314 uint32_t read_io8(uint32_t addr);
316 uint32_t read_io8_debug(uint32_t addr);
319 uint32_t read_dma_data8(uint32_t addr);
320 void write_dma_data8(uint32_t addr, uint32_t data);
321 void write_dma_io8(uint32_t addr, uint32_t data);
323 void write_signal(int id, uint32_t data, uint32_t mask);
324 void event_callback(int event_id, int err);
326 void event_vline(int v, int clock);
327 uint32_t get_intr_ack();
328 void notify_intr_ei();
329 bool process_state(FILEIO* state_fio, bool loading);
334 #if !defined(_PC8001SR)
335 return (n88rom[0x79d7] < 0x38);
340 void set_context_cpu(Z80* device)
344 void set_context_opn(YM2203* device)
348 #ifdef SUPPORT_PC88_SB2
349 void set_context_sb2(YM2203* device)
354 void set_context_pcm(DEVICE* device)
358 void set_context_pio(DEVICE* device)
362 void set_context_prn(DEVICE* device)
366 void set_context_rtc(DEVICE* device)
370 void set_context_sio(DEVICE* device)
374 #ifdef SUPPORT_PC88_CDROM
375 void set_context_scsi_host(SCSI_HOST* device)
377 d_scsi_host = device;
379 void set_context_scsi_cdrom(SCSI_CDROM* device)
381 d_scsi_cdrom = device;
384 #ifdef SUPPORT_PC88_HMB20
385 void set_context_opm(DEVICE* device)
390 #ifdef SUPPORT_PC88_PCG8100
391 void set_context_pcg_pit(DEVICE* device)
395 void set_context_pcg_pcm0(DEVICE* device)
399 void set_context_pcg_pcm1(DEVICE* device)
403 void set_context_pcg_pcm2(DEVICE* device)
408 void key_down(int code, bool repeat);
409 bool get_caps_locked()
411 return (key_caps != 0);
413 bool get_kana_locked()
415 return (key_kana != 0);
418 void play_tape(const _TCHAR* file_path);
419 void rec_tape(const _TCHAR* file_path);
421 bool is_tape_inserted()
423 return (cmt_play || cmt_rec);
425 bool is_frame_skippable();