2 NEC PC-8001 Emulator 'ePC-8001'
3 NEC PC-8001mkII Emulator 'ePC-8001mkII'
4 NEC PC-8001mkIISR Emulator 'ePC-8001mkIISR'
5 NEC PC-8801 Emulator 'ePC-8801'
6 NEC PC-8801mkII Emulator 'ePC-8801mkII'
7 NEC PC-8801MA Emulator 'ePC-8801MA'
8 NEC PC-98DO Emulator 'ePC-98DO'
10 Author : Takeda.Toshiya
20 #include "../../emu.h"
21 #include "../device.h"
23 #define SIG_PC88_USART_IRQ 0
24 #ifdef SUPPORT_PC88_OPN1
25 #define SIG_PC88_OPN1_IRQ 1
27 #ifdef SUPPORT_PC88_OPN2
28 #define SIG_PC88_OPN2_IRQ 2
30 #ifdef SUPPORT_PC88_CDROM
31 #define SIG_PC88_SCSI_DRQ 3
33 #define SIG_PC88_USART_OUT 4
35 #define CMT_BUFFER_SIZE 0x40000
37 #if defined(PC8801_VARIANT)
41 #if defined(SUPPORT_PC88_OPN1) || defined(SUPPORT_PC88_OPN2)
45 #ifdef SUPPORT_PC88_CDROM
54 uint8_t cursor, attrib;
63 uint8_t expand[200][80];
66 uint8_t expand[200][80];
73 uint8_t buffer[120 * 200];
77 uint8_t mode, reverse, intr_mask, status;
80 void reset(bool hireso);
81 void write_cmd(uint8_t data);
82 void write_param(uint8_t data);
83 uint32_t read_param();
84 uint32_t read_status();
87 void write_buffer(uint8_t data);
88 uint8_t read_buffer(int ofs);
90 void expand_buffer(bool hireso, bool line400);
91 void set_attrib(uint8_t code);
102 uint8_t mode, status;
106 void write_io8(uint32_t addr, uint32_t data);
107 uint32_t read_io8(uint32_t addr);
109 void run(int c, int nbytes);
113 class PC88 : public DEVICE
116 #ifdef SUPPORT_PC88_OPN1
119 #ifdef SUPPORT_PC88_OPN2
123 DEVICE *d_pcm, *d_pio, *d_prn, *d_rtc, *d_sio;
124 #ifdef SUPPORT_PC88_CDROM
125 SCSI_HOST* d_scsi_host;
126 SCSI_CDROM* d_scsi_cdrom;
128 #ifdef SUPPORT_PC88_HMB20
131 #ifdef SUPPORT_PC88_PCG8100
132 DEVICE *d_pcg_pit, *d_pcg_pcm0, *d_pcg_pcm1, *d_pcg_pcm2;
137 uint8_t wdmy[0x1000];
138 uint8_t rdmy[0x1000];
140 uint8_t ram[0x10000];
141 #if defined(PC88_EXRAM_BANKS)
142 uint8_t exram[0x8000 * PC88_EXRAM_BANKS];
144 uint8_t gvram[0xc000];
145 uint8_t gvram_null[0x4000];
146 #if defined(PC8801SR_VARIANT)
147 uint8_t tvram[0x1000];
149 #if defined(PC8001_VARIANT)
150 uint8_t n80rom[0x8000];
151 #if defined(_PC8001SR)
152 uint8_t n80srrom[0xa000];
155 uint8_t n88rom[0x8000];
156 uint8_t n88exrom[0x8000];
157 uint8_t n80rom[0x8000];
159 //#ifdef SUPPORT_PC88_KANJI1
160 uint8_t kanji1[0x20000];
162 #ifdef SUPPORT_PC88_KANJI2
163 uint8_t kanji2[0x20000];
165 #ifdef SUPPORT_PC88_DICTIONARY
166 uint8_t dicrom[0x80000];
168 #ifdef SUPPORT_PC88_CDROM
169 uint8_t cdbios[0x10000];
180 #if defined(_PC8001SR) || defined(PC8801SR_VARIANT)
183 uint8_t gvram_plane, gvram_sel;
185 void update_timing();
186 int get_m1_wait(bool addr_f000);
187 int get_main_wait(bool read);
188 #if defined(PC8801SR_VARIANT)
189 int get_tvram_wait(bool read);
191 int get_gvram_wait(bool read);
192 void update_gvram_wait();
193 void update_gvram_sel();
194 #if defined(PC8001_VARIANT)
195 void update_n80_write();
196 void update_n80_read();
198 void update_low_write();
199 void update_low_read();
200 #if defined(PC8801SR_VARIANT)
201 void update_tvram_memmap();
207 #if defined(SUPPORT_PC88_HIGH_CLOCK)
208 bool cpu_clock_high_fe2;
212 int f000_m1_wait_clocks;
213 int mem_wait_clocks_r, mem_wait_clocks_w;
214 #if defined(PC8801SR_VARIANT)
215 int tvram_wait_clocks_r, tvram_wait_clocks_w;
217 int gvram_wait_clocks_r, gvram_wait_clocks_w;
221 typedef struct palette_s {
224 palette_t palette[10]; // 8 = digital back color, 9 = analog back color
228 uint8_t sg_pattern[0x800];
229 uint8_t text[200][640];
230 uint8_t text_color[200][80];
231 bool text_reverse[200][80];
232 uint8_t graph[400][640];
234 palette_t palette_digital[9];
235 palette_t palette_analog [9];
236 palette_t palette_line_digital[400][9];
237 palette_t palette_line_analog [400][9];
238 bool palette_line_changed[400];
239 #if defined(SUPPORT_PC88_VAB)
240 scrntype_t palette_vab_pc[0x10000];
244 #if defined(PC8001_VARIANT)
245 #if defined(_PC8001SR)
246 bool draw_320x200_color_graph();
248 bool draw_320x200_4color_graph();
249 void draw_320x200_attrib_graph();
251 bool draw_640x200_color_graph();
252 void draw_640x200_mono_graph();
253 void draw_640x200_attrib_graph();
254 #if defined(PC8801SR_VARIANT)
255 void draw_640x400_mono_graph();
256 void draw_640x400_attrib_graph();
264 uint8_t key_status[256];
265 uint8_t key_caps, key_kana;
267 #ifdef SUPPORT_PC88_JOYSTICK
269 const uint32_t *joystick_status;
270 const int32_t* mouse_status;
271 uint32_t mouse_strobe_clock;
272 uint32_t mouse_strobe_clock_lim;
274 int mouse_dx, mouse_dy;
275 int mouse_lx, mouse_ly;
280 #ifdef SUPPORT_PC88_OPN1
283 #ifdef SUPPORT_PC88_OPN2
286 uint8_t intr_mask1, intr_mask2;
287 void request_intr(int level, bool status);
292 bool cmt_play, cmt_rec;
293 _TCHAR rec_file_path[_MAX_PATH];
294 int cmt_bufptr, cmt_bufcnt;
295 uint8_t cmt_buffer[CMT_BUFFER_SIZE];
296 int cmt_data_carrier[1024], cmt_data_carrier_cnt;
300 bool check_data_carrier();
303 bool beep_on, beep_signal, sing_signal;
305 #ifdef SUPPORT_PC88_PCG8100
308 uint8_t pcg_data, pcg_ctrl;
309 uint8_t pcg_pattern[0x800];
312 #ifdef SUPPORT_PC88_CDROM
313 int cdda_register_id;
318 // dirty patch for NIPPY
322 PC88(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
324 #if defined(PC8001_VARIANT)
325 set_device_name(_T("PC-8001 Core"));
327 set_device_name(_T("PC-8801 Core"));
337 void write_data8w(uint32_t addr, uint32_t data, int* wait);
338 uint32_t read_data8w(uint32_t addr, int* wait);
339 uint32_t fetch_op(uint32_t addr, int *wait);
340 void write_io8(uint32_t addr, uint32_t data);
341 uint32_t read_io8(uint32_t addr);
343 uint32_t read_io8_debug(uint32_t addr);
346 uint32_t read_dma_data8(uint32_t addr);
347 void write_dma_data8(uint32_t addr, uint32_t data);
348 void write_dma_io8(uint32_t addr, uint32_t data);
350 void write_signal(int id, uint32_t data, uint32_t mask);
351 void event_callback(int event_id, int err);
353 void event_vline(int v, int clock);
354 uint32_t get_intr_ack();
355 void notify_intr_ei();
356 bool process_state(FILEIO* state_fio, bool loading);
359 #ifdef PC8801SR_VARIANT
362 return (n88rom[0x79d7] < 0x38);
365 void set_context_cpu(Z80* device)
369 #ifdef SUPPORT_PC88_OPN1
370 void set_context_opn1(YM2203* device)
375 #ifdef SUPPORT_PC88_OPN2
376 void set_context_opn2(YM2203* device)
381 void set_context_pcm(DEVICE* device)
385 void set_context_pio(DEVICE* device)
389 void set_context_prn(DEVICE* device)
393 void set_context_rtc(DEVICE* device)
397 void set_context_sio(DEVICE* device)
401 #ifdef SUPPORT_PC88_CDROM
402 void set_context_scsi_host(SCSI_HOST* device)
404 d_scsi_host = device;
406 void set_context_scsi_cdrom(SCSI_CDROM* device)
408 d_scsi_cdrom = device;
411 #ifdef SUPPORT_PC88_HMB20
412 void set_context_opm(DEVICE* device)
417 #ifdef SUPPORT_PC88_PCG8100
418 void set_context_pcg_pit(DEVICE* device)
422 void set_context_pcg_pcm0(DEVICE* device)
426 void set_context_pcg_pcm1(DEVICE* device)
430 void set_context_pcg_pcm2(DEVICE* device)
435 void key_down(int code, bool repeat);
436 bool get_caps_locked()
438 return (key_caps != 0);
440 bool get_kana_locked()
442 return (key_kana != 0);
445 void play_tape(const _TCHAR* file_path);
446 void rec_tape(const _TCHAR* file_path);
448 bool is_tape_inserted()
450 return (cmt_play || cmt_rec);
452 bool is_frame_skippable();