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 #if defined(SUPPORT_24BIT_ADDRESS) || defined(SUPPORT_32BIT_ADDRESS)
177 #define MEMORY_ADDR_MAX 0x1000000 // 16MB
179 #define MEMORY_ADDR_MAX 0x100000 // 1MB
181 //#if defined(SUPPORT_32BIT_ADDRESS)
182 // #define SUPPORT_SYSTEM_16MB
184 #define MEMORY_BANK_SIZE 0x800
185 #define IO_ADDR_MAX 0x10000
188 //#define SUPPORT_PC98_OPNA
190 #if defined(_PC98DO) || defined(_PC98DOPLUS)
192 #define MODE_PC88_V1S 1
193 #define MODE_PC88_V1H 2
194 #define MODE_PC88_V2 3
195 #define MODE_PC88_N 4
196 //#define SUPPORT_PC88_DICTIONARY
197 #define SUPPORT_PC88_HIGH_CLOCK
198 //#define SUPPORT_PC88_JOYSTICK
199 #define PC88_EXRAM_BANKS 4
201 #if defined(_PC98DOPLUS)
202 #define SUPPORT_PC88_OPNA
203 #define SUPPORT_PC88_SB2
206 // device informations for virtual machine
207 #if !defined(SUPPORT_HIRESO)
208 #define FRAMES_PER_SEC 56.42
209 #define LINES_PER_FRAME 440
210 #define SCREEN_WIDTH 640
211 #define SCREEN_HEIGHT 400
212 #define WINDOW_HEIGHT_ASPECT 480
214 #define FRAMES_PER_SEC 79.09
215 #define LINES_PER_FRAME 784
216 #define SCREEN_WIDTH 1120
217 #define SCREEN_HEIGHT 750
218 #define WINDOW_HEIGHT_ASPECT 840
221 #define UPD765A_NO_ST1_EN_OR_FOR_RESULT7
222 #if defined(_PC98DO) || defined(_PC98DOPLUS)
223 #define PC80S31K_NO_WAIT
225 #define UPD7220_MSB_FIRST
226 #define UPD7220_HORIZ_FREQ 24830
227 #if defined(_PC98DO) || defined(_PC98DOPLUS)
228 #define Z80_MEMORY_WAIT
230 #if defined(SUPPORT_PC98_OPNA) || defined(SUPPORT_PC88_OPNA)
233 #define I8259_MAX_CHIPS 2
234 #define SINGLE_MODE_DMA
235 #define OVERRIDE_SOUND_FREQ_48000HZ 55467
236 #define SUPPORT_VARIABLE_TIMING
238 // device informations for win32
239 #if defined(_PC9801) || defined(_PC9801E)
240 #define USE_FLOPPY_DISK 6
241 #elif defined(_PC98DO) || defined(_PC98DOPLUS)
242 #define USE_BOOT_MODE 5
243 #define USE_DIPSWITCH
244 #define USE_FLOPPY_DISK 4
246 #define USE_FLOPPY_DISK 2
248 #if defined(SUPPORT_SASI_IF) || defined(SUPPORT_SCSI_IF) || defined(SUPPORT_IDE_IF)
249 #define USE_HARD_DISK 2
251 #if defined(SUPPORT_CMT_IF) || defined(_PC98DO) || defined(_PC98DOPLUS)
253 #define TAPE_BINARY_ONLY
255 #define NOTIFY_KEY_DOWN
256 #define USE_KEY_LOCKED
257 #define USE_SHIFT_NUMPAD_KEY
258 #define USE_ALT_F10_KEY
259 #if defined(_PC98DO) || defined(_PC98DOPLUS)
260 // slow enough for N88-
\93ú
\96{
\8cêBASIC
261 #define USE_AUTO_KEY 8
262 #define USE_AUTO_KEY_RELEASE 10
264 #define USE_AUTO_KEY 5
265 #define USE_AUTO_KEY_RELEASE 6
267 #define USE_AUTO_KEY_NUMPAD
268 #define USE_MONITOR_TYPE 2
270 #define USE_SCREEN_FILTER
271 #define USE_SOUND_TYPE 5
272 #if defined(_PC98DO) || defined(_PC98DOPLUS)
273 #if defined(SUPPORT_PC98_OPNA) && defined(SUPPORT_PC88_OPNA)
274 #define USE_SOUND_VOLUME (4 + 1 + 1 + 4 + 1 + 1)
275 #elif defined(SUPPORT_PC98_OPNA) && !defined(SUPPORT_PC88_OPNA)
276 #define USE_SOUND_VOLUME (4 + 1 + 1 + 2 + 1 + 1)
277 #elif !defined(SUPPORT_PC98_OPNA) && defined(SUPPORT_PC88_OPNA)
278 #define USE_SOUND_VOLUME (2 + 1 + 1 + 4 + 1 + 1)
279 #elif !defined(SUPPORT_PC98_OPNA) && !defined(SUPPORT_PC88_OPNA)
280 #define USE_SOUND_VOLUME (2 + 1 + 1 + 2 + 1 + 1)
283 #if defined(SUPPORT_PC98_OPNA)
284 #define USE_SOUND_VOLUME (4 + 1 + 1 + 1)
286 #define USE_SOUND_VOLUME (2 + 1 + 1 + 1)
292 #define USE_PRINTER_TYPE 3
295 #if defined(HAS_I86) || defined(HAS_V30)
297 #elif defined(HAS_I386) || defined(HAS_I486)
302 #if defined(SUPPORT_320KB_FDD_IF) || defined(_PC98DO) || defined(_PC98DOPLUS)
306 #include "../../common.h"
307 #include "../../fileio.h"
308 #include "../vm_template.h"
310 #ifdef USE_SOUND_VOLUME
311 static const _TCHAR *sound_device_caption[] = {
312 #if defined(SUPPORT_PC98_OPNA)
313 _T("PC-9801-86 (FM)"), _T("PC-9801-86 (PSG)"), _T("PC-9801-86 (ADPCM)"), _T("PC-9801-86 (Rhythm)"),
315 _T("PC-9801-26 (FM)"), _T("PC-9801-26 (PSG)"),
317 _T("PC-9801-14"), _T("Beep"),
318 #if defined(_PC98DO) || defined(_PC98DOPLUS)
319 #if defined(SUPPORT_PC88_OPNA)
320 _T("PC-88 OPNA (FM)"), _T("PC-88 OPNA (PSG)"), _T("PC-88 OPNA (ADPCM)"), _T("PC-88 OPNA (Rhythm)"),
322 _T("PC-88 OPN (FM)"), _T("PC-88 OPN (PSG)"),
330 class csp_state_utils;
336 #if defined(SUPPORT_OLD_BUZZER)
340 #if defined(USE_HARD_DISK)
348 #if defined(HAS_I86) || defined(HAS_V30)
350 #elif defined(HAS_I386) || defined(HAS_I486)
360 #if !defined(SUPPORT_OLD_BUZZER)
363 #if defined(SUPPORT_SASI_IF)
366 #define SCSI_HOST_AUTO_ACK
367 #elif defined(SUPPORT_SCSI_IF)
370 #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)
395 #if defined(SUPPORT_SCSI_IF)
398 #if defined(SUPPORT_IDE_IF)
402 #if defined(SUPPORT_320KB_FDD_IF)
408 #if defined(_PC98DO) || defined(_PC98DOPLUS)
414 class VM : public VM_TEMPLATE
418 //csp_state_utils* state_entry;
423 #if defined(SUPPORT_OLD_BUZZER)
430 #if defined(SUPPORT_CMT_IF)
436 #if defined(SUPPORT_320KB_FDD_IF)
443 #if defined(HAS_I386) || defined(HAS_I486)
445 #elif defined(HAS_I86) || defined(HAS_V30)
454 #if defined(HAS_I86) || defined(HAS_V30)
457 #if defined(SUPPORT_SASI_IF)
459 SCSI_HOST* sasi_host;
461 #if defined(SUPPORT_SCSI_IF)
462 SCSI_HDD* scsi_hdd[2];
463 SCSI_HOST* scsi_host;
466 #if defined(SUPPORT_2HD_FDD_IF)
469 #if defined(SUPPORT_2DD_FDD_IF)
472 #if defined(SUPPORT_2HD_2DD_FDD_IF)
476 NOISE* noise_head_down;
477 NOISE* noise_head_up;
482 #if defined(SUPPORT_CMT_IF)
485 #if defined(SUPPORT_24BIT_ADDRESS) || defined(SUPPORT_32BIT_ADDRESS)
496 #if defined(SUPPORT_SASI_IF)
499 #if defined(SUPPORT_SCSI_IF)
502 #if defined(SUPPORT_IDE_IF)
512 #if defined(SUPPORT_320KB_FDD_IF)
524 #if defined(_PC98DO) || defined(_PC98DOPLUS)
538 UPD765A* pc88fdc_sub;
539 NOISE* pc88noise_seek;
540 NOISE* pc88noise_head_down;
541 NOISE* pc88noise_head_up;
548 UPD765A *get_floppy_disk_controller(int drv);
549 DISK *get_floppy_disk_handler(int drv);
552 // ----------------------------------------
554 // ----------------------------------------
559 // ----------------------------------------
560 // for emulation class
561 // ----------------------------------------
563 // drive virtual machine
566 double get_frame_rate();
570 DEVICE *get_cpu(int index);
577 void initialize_sound(int rate, int samples);
578 uint16_t* create_sound(int* extra_frames);
579 int get_sound_buffer_ptr();
580 #ifdef USE_SOUND_VOLUME
581 void set_sound_device_volume(int ch, int decibel_l, int decibel_r);
585 void key_down(int code, bool repeat);
586 void key_up(int code);
587 bool get_caps_locked();
588 bool get_kana_locked();
591 void open_floppy_disk(int drv, const _TCHAR* file_path, int bank);
592 void close_floppy_disk(int drv);
593 bool is_floppy_disk_inserted(int drv);
594 void is_floppy_disk_protected(int drv, bool value);
595 bool is_floppy_disk_protected(int drv);
596 uint32_t is_floppy_disk_accessed();
597 #if defined(USE_HARD_DISK)
598 void open_hard_disk(int drv, const _TCHAR* file_path);
599 void close_hard_disk(int drv);
600 bool is_hard_disk_inserted(int drv);
601 uint32_t is_hard_disk_accessed();
603 #if defined(USE_TAPE)
604 void play_tape(int drv, const _TCHAR* file_path);
605 void rec_tape(int drv, const _TCHAR* file_path);
606 void close_tape(int drv);
607 bool is_tape_inserted(int drv);
609 bool is_frame_skippable();
611 void update_config();
612 bool process_state(FILEIO* state_fio, bool loading);
614 // ----------------------------------------
616 // ----------------------------------------
619 DEVICE* get_device(int id);
621 //DEVICE* first_device;
622 //DEVICE* last_device;