2 NEC PC-9801 Emulator 'ePC-9801'
3 NEC PC-9801E/F/M Emulator 'ePC-9801E'
4 NEC PC-9801U Emulator 'ePC-9801U'
5 NEC PC-9801VF Emulator 'ePC-9801VF'
6 NEC PC-9801VM Emulator 'ePC-9801VM'
7 NEC PC-9801VX Emulator 'ePC-9801VX'
8 NEC PC-9801RA Emulator 'ePC-9801RA'
9 NEC PC-98XA Emulator 'ePC-98XA'
10 NEC PC-98XL Emulator 'ePC-98XL'
11 NEC PC-98RL Emulator 'ePC-98RL'
12 NEC PC-98DO Emulator 'ePC-98DO'
14 Author : Takeda.Toshiya
25 PC-9801E/F/M 8086 5/8MHz
32 PC-9801VX 80286 8/10MHz
33 PC-9801RX/DX 80286 12MHz
39 PC-98XL 80286 8MHz/10MHz
46 #define DEVICE_NAME "NEC PC-9801"
47 #define CONFIG_NAME "pc9801"
49 #define CPU_CLOCKS 4992030
50 #define PIT_CLOCK_5MHZ
51 #elif defined(_PC9801E)
52 #define DEVICE_NAME "NEC PC-9801E/F/M"
53 #define CONFIG_NAME "pc9801e"
55 #define CPU_CLOCKS 7987248
56 #define PIT_CLOCK_8MHZ
57 // #define CPU_CLOCKS 4992030
58 // #define PIT_CLOCK_5MHZ
59 #define USE_CPU_TYPE 2
60 #elif defined(_PC9801U) || defined(_PC9801VF)
62 #define DEVICE_NAME "NEC PC-9801U"
63 #define CONFIG_NAME "pc9801u"
64 #elif defined(_PC9801VF)
65 #define DEVICE_NAME "NEC PC-9801VF"
66 #define CONFIG_NAME "pc9801vf"
69 #define CPU_CLOCKS 7987248
70 #define PIT_CLOCK_8MHZ
71 #elif defined(_PC9801VM) || defined(_PC98DO)
72 #if defined(_PC9801VM)
73 #define DEVICE_NAME "NEC PC-9801VM"
74 #define CONFIG_NAME "pc9801vm"
75 #elif defined(_PC98DO)
76 #define DEVICE_NAME "NEC PC-98DO"
77 #define CONFIG_NAME "pc98do"
80 #define CPU_CLOCKS 9984060
81 #define PIT_CLOCK_5MHZ
82 // #define CPU_CLOCKS 7987248
83 // #define PIT_CLOCK_8MHZ
84 #define USE_CPU_TYPE 2
85 #elif defined(_PC98DOPLUS)
86 #define DEVICE_NAME "NEC PC-98DO+"
87 #define CONFIG_NAME "pc98do+"
89 #define CPU_CLOCKS 15974496
90 #define PIT_CLOCK_8MHZ
91 // #define CPU_CLOCKS 7987248
92 // #define PIT_CLOCK_8MHZ
93 #define USE_CPU_TYPE 2
94 #elif defined(_PC9801VX) || defined(_PC98XL)
95 #if defined(_PC9801VX)
96 #define DEVICE_NAME "NEC PC-9801VX"
97 #define CONFIG_NAME "pc9801vx"
98 #elif defined(_PC98XL)
99 #define DEVICE_NAME "NEC PC-98XL"
100 #define CONFIG_NAME "pc98xl"
103 #define CPU_CLOCKS 9984060
104 #define PIT_CLOCK_5MHZ
105 // #define CPU_CLOCKS 7987248
106 // #define PIT_CLOCK_8MHZ
107 #define USE_CPU_TYPE 2
108 #elif defined(_PC98XA)
109 #define DEVICE_NAME "NEC PC-98XA"
110 #define CONFIG_NAME "pc98xa"
112 #define CPU_CLOCKS 7987248
113 #define PIT_CLOCK_8MHZ
114 #elif defined(_PC9801RA) || defined(_PC98RL)
115 #if defined(_PC9801RA)
116 #define DEVICE_NAME "NEC PC-9801RA"
117 #define CONFIG_NAME "pc9801ra"
118 #elif defined(_PC98RL)
119 #define DEVICE_NAME "NEC PC-98RL"
120 #define CONFIG_NAME "pc98rl"
123 #define CPU_CLOCKS 19968120
124 #define PIT_CLOCK_5MHZ
125 // #define CPU_CLOCKS 15974496
126 // #define PIT_CLOCK_8MHZ
127 #define USE_CPU_TYPE 2
132 #if defined(_PC9801) || defined(_PC9801E)
133 #define SUPPORT_CMT_IF
134 #define SUPPORT_2HD_FDD_IF
135 #define SUPPORT_2DD_FDD_IF
136 #define SUPPORT_320KB_FDD_IF
137 #define SUPPORT_OLD_BUZZER
138 #elif defined(_PC9801VF) || defined(_PC9801U)
139 #define SUPPORT_2DD_FDD_IF
141 #define SUPPORT_2HD_2DD_FDD_IF
144 #if defined(_PC98XA) || defined(_PC98XL) || defined(_PC98RL)
145 #define SUPPORT_HIRESO
147 #if !(defined(_PC9801) || defined(_PC9801U) || defined(SUPPORT_HIRESO))
148 #define SUPPORT_2ND_VRAM
150 #if !(defined(_PC9801) || defined(_PC9801E))
151 #define SUPPORT_16_COLORS
154 #if !(defined(HAS_I86) || defined(HAS_V30))
155 #if !defined(_PC98XA) && !defined(_PC98XL)
156 #define SUPPORT_ITF_ROM
158 #if !defined(_PC98XA)
162 #if !defined(SUPPORT_HIRESO)
163 #define SUPPORT_NEC_EMS
165 #define SUPPORT_SASI_IF
168 #if defined(HAS_I286)
169 #define SUPPORT_24BIT_ADDRESS
170 #elif defined(HAS_I386) || defined(HAS_I486)
171 #define SUPPORT_32BIT_ADDRESS
172 #if !defined(SUPPORT_HIRESO)
173 #define SUPPORT_BIOS_RAM
176 #define SUPPORT_PC98_OPNA
178 #if defined(SUPPORT_24BIT_ADDRESS) || defined(SUPPORT_32BIT_ADDRESS)
179 #define MEMORY_ADDR_MAX 0x1000000 // 16MB
181 #define MEMORY_ADDR_MAX 0x100000 // 1MB
183 //#if defined(SUPPORT_32BIT_ADDRESS)
184 // #define SUPPORT_SYSTEM_16MB
186 #define MEMORY_BANK_SIZE 0x800
187 #define IO_ADDR_MAX 0x10000
189 #if defined(_PC98DO) || defined(_PC98DOPLUS)
190 #define PC8801_VARIANT
191 #define PC8801SR_VARIANT
193 #define MODE_PC88_V1S 1
194 #define MODE_PC88_V1H 2
195 #define MODE_PC88_V2 3
196 #define MODE_PC88_N 4
197 #define SUPPORT_PC88_KANJI1
198 #define SUPPORT_PC88_KANJI2
199 //#define SUPPORT_PC88_DICTIONARY
200 #define SUPPORT_PC88_HIGH_CLOCK
201 //#define SUPPORT_PC88_JOYSTICK
202 #define PC88_EXRAM_BANKS 4
203 #define SUPPORT_PC88_OPN1
204 #if defined(_PC98DOPLUS)
205 #define SUPPORT_PC88_OPNA
209 // device informations for virtual machine
210 #if !defined(SUPPORT_HIRESO)
211 #define FRAMES_PER_SEC 56.42
212 #define LINES_PER_FRAME 440
213 #define SCREEN_WIDTH 640
214 #define SCREEN_HEIGHT 400
215 #define WINDOW_HEIGHT_ASPECT 480
217 #define FRAMES_PER_SEC 79.09
218 #define LINES_PER_FRAME 784
219 #define SCREEN_WIDTH 1120
220 #define SCREEN_HEIGHT 750
221 #define WINDOW_HEIGHT_ASPECT 840
224 #define UPD765A_NO_ST1_EN_OR_FOR_RESULT7
225 #if defined(_PC98DO) || defined(_PC98DOPLUS)
226 #define PC80S31K_NO_WAIT
228 #define UPD7220_MSB_FIRST
229 #define UPD7220_HORIZ_FREQ 24830
230 #if defined(_PC98DO) || defined(_PC98DOPLUS)
231 #define Z80_MEMORY_WAIT
233 #define I8259_MAX_CHIPS 2
234 #define SINGLE_MODE_DMA
235 #define OVERRIDE_SOUND_FREQ_48000HZ 55467
237 // device informations for win32
238 #if defined(_PC9801) || defined(_PC9801E)
239 #define USE_FLOPPY_DISK 6
240 #elif defined(_PC98DO) || defined(_PC98DOPLUS)
241 #define USE_BOOT_MODE 5
242 #define USE_DIPSWITCH
243 #define USE_FLOPPY_DISK 4
245 #define USE_FLOPPY_DISK 2
247 #if defined(SUPPORT_SASI_IF) || defined(SUPPORT_SCSI_IF) || defined(SUPPORT_IDE_IF)
248 #define USE_HARD_DISK 2
249 #if defined(HAS_I286)
250 #define I86_PSEUDO_BIOS
252 #define I386_PSEUDO_BIOS
255 #if defined(SUPPORT_CMT_IF) || defined(_PC98DO) || defined(_PC98DOPLUS)
257 #define TAPE_BINARY_ONLY
259 #define USE_KEY_LOCKED
260 #if defined(_PC98DO) || defined(_PC98DOPLUS)
261 // slow enough for N88-
\93ú
\96{
\8cêBASIC
262 #define USE_AUTO_KEY 8
263 #define USE_AUTO_KEY_RELEASE 10
265 #define USE_AUTO_KEY 5
266 #define USE_AUTO_KEY_RELEASE 6
268 #define USE_AUTO_KEY_NUMPAD
269 #define USE_MONITOR_TYPE 2
271 #define USE_SCREEN_FILTER
272 #define USE_SOUND_TYPE 5
273 #if defined(_PC98DO) || defined(_PC98DOPLUS)
274 #if defined(SUPPORT_PC98_OPNA) && defined(SUPPORT_PC88_OPNA)
275 #define USE_SOUND_VOLUME (4 + 1 + 1 + 4 + 1 + 1)
276 #elif defined(SUPPORT_PC98_OPNA) && !defined(SUPPORT_PC88_OPNA)
277 #define USE_SOUND_VOLUME (4 + 1 + 1 + 2 + 1 + 1)
278 #elif !defined(SUPPORT_PC98_OPNA) && defined(SUPPORT_PC88_OPNA)
279 #define USE_SOUND_VOLUME (2 + 1 + 1 + 4 + 1 + 1)
280 #elif !defined(SUPPORT_PC98_OPNA) && !defined(SUPPORT_PC88_OPNA)
281 #define USE_SOUND_VOLUME (2 + 1 + 1 + 2 + 1 + 1)
284 #if defined(SUPPORT_PC98_OPNA)
285 #define USE_SOUND_VOLUME (4 + 1 + 1 + 1)
287 #define USE_SOUND_VOLUME (2 + 1 + 1 + 1)
293 #define USE_PRINTER_TYPE 3
296 #if defined(HAS_I86) || defined(HAS_V30)
298 #elif defined(HAS_I386) || defined(HAS_I486)
303 #if defined(SUPPORT_320KB_FDD_IF) || defined(_PC98DO) || defined(_PC98DOPLUS)
307 #include "../../common.h"
308 #include "../../fileio.h"
309 #include "../vm_template.h"
311 #ifdef USE_SOUND_VOLUME
312 static const _TCHAR *sound_device_caption[] = {
313 #if defined(SUPPORT_PC98_OPNA)
314 _T("OPNA (FM)"), _T("OPNA (PSG)"), _T("OPNA (ADPCM)"), _T("OPNA (Rhythm)"),
316 _T("OPN (FM)"), _T("OPN (PSG)"),
318 _T("PC-9801-14"), _T("Beep"),
319 #if defined(_PC98DO) || defined(_PC98DOPLUS)
320 #if defined(SUPPORT_PC88_OPNA)
321 _T("PC-88 (FM)"), _T("PC-88 (PSG)"), _T("PC-88 (ADPCM)"), _T("PC-88 (Rhythm)"),
323 _T("PC-88 (FM)"), _T("PC-88 (PSG)"),
335 #if defined(SUPPORT_OLD_BUZZER)
339 #if defined(USE_HARD_DISK)
347 #if defined(HAS_I86) || defined(HAS_V30)
349 #elif defined(HAS_I386) || defined(HAS_I486)
359 #if !defined(SUPPORT_OLD_BUZZER)
362 #if defined(SUPPORT_SASI_IF)
365 #define SCSI_HOST_AUTO_ACK
366 #elif defined(SUPPORT_SCSI_IF)
369 #define SCSI_HOST_AUTO_ACK
378 #if defined(SUPPORT_CMT_IF)
381 #if defined(SUPPORT_24BIT_ADDRESS) || defined(SUPPORT_32BIT_ADDRESS)
392 #if defined(SUPPORT_SASI_IF)
396 #if defined(SUPPORT_SCSI_IF)
399 #if defined(SUPPORT_IDE_IF)
404 #if defined(SUPPORT_320KB_FDD_IF)
410 #if defined(_PC98DO) || defined(_PC98DOPLUS)
418 class VM : public VM_TEMPLATE
422 //csp_state_utils* state_entry;
427 #if defined(SUPPORT_OLD_BUZZER)
434 #if defined(SUPPORT_CMT_IF)
440 #if defined(SUPPORT_320KB_FDD_IF)
447 #if defined(HAS_I386) || defined(HAS_I486)
449 #elif defined(HAS_I86) || defined(HAS_V30)
458 #if defined(HAS_I86) || defined(HAS_V30)
461 #if defined(SUPPORT_SASI_IF)
463 SCSI_HOST* sasi_host;
465 #if defined(SUPPORT_SCSI_IF)
466 SCSI_HDD* scsi_hdd[2];
467 SCSI_HOST* scsi_host;
470 #if defined(SUPPORT_2HD_FDD_IF)
473 #if defined(SUPPORT_2DD_FDD_IF)
476 #if defined(SUPPORT_2HD_2DD_FDD_IF)
480 NOISE* noise_head_down;
481 NOISE* noise_head_up;
486 #if defined(SUPPORT_CMT_IF)
489 #if defined(SUPPORT_24BIT_ADDRESS) || defined(SUPPORT_32BIT_ADDRESS)
490 PC9801::CPUREG* cpureg;
492 PC9801::DISPLAY* display;
493 PC9801::DMAREG* dmareg;
494 PC9801::FLOPPY* floppy;
495 PC9801::FMSOUND* fmsound;
496 PC9801::JOYSTICK* joystick;
497 PC9801::KEYBOARD* keyboard;
498 PC9801::MEMBUS* memory;
499 PC9801::MOUSE* mouse;
500 #if defined(SUPPORT_SASI_IF)
502 PC9801::BIOS *sasi_bios;
504 #if defined(SUPPORT_SCSI_IF)
507 #if defined(SUPPORT_IDE_IF)
517 #if defined(SUPPORT_320KB_FDD_IF)
529 #if defined(_PC98DO) || defined(_PC98DOPLUS)
543 UPD765A* pc88fdc_sub;
544 NOISE* pc88noise_seek;
545 NOISE* pc88noise_head_down;
546 NOISE* pc88noise_head_up;
553 UPD765A *get_floppy_disk_controller(int drv);
554 DISK *get_floppy_disk_handler(int drv);
557 // ----------------------------------------
559 // ----------------------------------------
564 // ----------------------------------------
565 // for emulation class
566 // ----------------------------------------
568 // drive virtual machine
571 double get_frame_rate();
575 DEVICE *get_cpu(int index);
582 void initialize_sound(int rate, int samples);
583 uint16_t* create_sound(int* extra_frames);
584 int get_sound_buffer_ptr();
585 #ifdef USE_SOUND_VOLUME
586 void set_sound_device_volume(int ch, int decibel_l, int decibel_r);
590 void key_down(int code, bool repeat);
591 void key_up(int code);
592 bool get_caps_locked();
593 bool get_kana_locked();
596 void open_floppy_disk(int drv, const _TCHAR* file_path, int bank);
597 void close_floppy_disk(int drv);
598 bool is_floppy_disk_inserted(int drv);
599 void is_floppy_disk_protected(int drv, bool value);
600 bool is_floppy_disk_protected(int drv);
601 uint32_t is_floppy_disk_accessed();
602 #if defined(USE_HARD_DISK)
603 void open_hard_disk(int drv, const _TCHAR* file_path);
604 void close_hard_disk(int drv);
605 bool is_hard_disk_inserted(int drv);
606 uint32_t is_hard_disk_accessed();
608 #if defined(USE_TAPE)
609 void play_tape(int drv, const _TCHAR* file_path);
610 void rec_tape(int drv, const _TCHAR* file_path);
611 void close_tape(int drv);
612 bool is_tape_inserted(int drv);
614 bool is_frame_skippable();
616 void update_config();
617 bool process_state(FILEIO* state_fio, bool loading);
619 // ----------------------------------------
621 // ----------------------------------------
624 DEVICE* get_device(int id);
626 //DEVICE* first_device;
627 //DEVICE* last_device;