2 NEC PC-9801 Emulator 'ePC-9801'
3 NEC PC-9801E/F/M Emulator 'ePC-9801E'
4 NEC PC-98DO Emulator 'ePC-98DO'
6 Author : Takeda.Toshiya
16 #define DEVICE_NAME "NEC PC-9801"
17 #define CONFIG_NAME "pc9801"
18 #elif defined(_PC9801E)
19 #define DEVICE_NAME "NEC PC-9801E/F/M"
20 #define CONFIG_NAME "pc9801e"
21 #elif defined(_PC9801U)
22 #define DEVICE_NAME "NEC PC-9801U"
23 #define CONFIG_NAME "pc9801u"
24 #elif defined(_PC9801VF)
25 #define DEVICE_NAME "NEC PC-9801VF"
26 #define CONFIG_NAME "pc9801vf"
27 #elif defined(_PC9801VM)
28 #define DEVICE_NAME "NEC PC-9801VM"
29 #define CONFIG_NAME "pc9801vm"
30 #elif defined(_PC98DO)
31 #define DEVICE_NAME "NEC PC-98DO"
32 #define CONFIG_NAME "pc98do"
33 #elif defined(_PC98DOPLUS)
34 #define DEVICE_NAME "NEC PC-98DO+"
35 #define CONFIG_NAME "pc98do+"
39 #if defined(_PC9801) || defined(_PC9801E)
40 #define SUPPORT_CMT_IF
41 #define SUPPORT_2HD_FDD_IF
42 #define SUPPORT_2DD_FDD_IF
43 #define SUPPORT_320KB_FDD_IF
44 #define SUPPORT_OLD_BUZZER
45 #elif defined(_PC9801VF) || defined(_PC9801U)
46 #define SUPPORT_2DD_FDD_IF
48 #define SUPPORT_2HD_2DD_FDD_IF
51 #if !(defined(_PC9801) || defined(_PC9801U))
52 #define SUPPORT_2ND_VRAM
54 #if !(defined(_PC9801) || defined(_PC9801E))
55 #define SUPPORT_16_COLORS
60 //#define SUPPORT_PC98_OPNA
62 #if defined(_PC98DO) || defined(_PC98DOPLUS)
64 #define MODE_PC88_V1S 1
65 #define MODE_PC88_V1H 2
66 #define MODE_PC88_V2 3
68 //#define SUPPORT_PC88_DICTIONARY
69 #define SUPPORT_PC88_HIGH_CLOCK
70 //#define SUPPORT_PC88_JOYSTICK
71 #define PC88_EXRAM_BANKS 4
73 #if defined(_PC98DOPLUS)
74 #define SUPPORT_PC88_OPNA
75 #define SUPPORT_PC88_SB2
78 // device informations for virtual machine
79 #define FRAMES_PER_SEC 56.4
80 #define LINES_PER_FRAME 440
82 #define CPU_CLOCKS 4992030
83 #define PIT_CLOCK_5MHZ
84 #elif defined(_PC9801E) || defined(_PC9801U) || defined(_PC9801VF)
85 #define CPU_CLOCKS 7987248
86 #define PIT_CLOCK_8MHZ
87 #elif defined(_PC98DOPLUS)
88 #define CPU_CLOCKS 15974496
89 #define PIT_CLOCK_8MHZ
91 #define CPU_CLOCKS 9984060
92 #define PIT_CLOCK_5MHZ
94 #define SCREEN_WIDTH 640
95 #define SCREEN_HEIGHT 400
97 #define UPD765A_NO_ST1_EN_OR_FOR_RESULT7
98 #if defined(_PC98DO) || defined(_PC98DOPLUS)
99 #define PC80S31K_NO_WAIT
101 #define UPD7220_MSB_FIRST
102 #define UPD7220_HORIZ_FREQ 24830
103 #if defined(_PC9801) || defined(_PC9801E)
105 #elif defined(_PC98DOPLUS)
110 #if defined(_PC98DO) || defined(_PC98DOPLUS)
112 #define Z80_MEMORY_WAIT
114 #if defined(SUPPORT_PC98_OPNA) || defined(SUPPORT_PC88_OPNA)
117 #define I8259_MAX_CHIPS 2
118 #define SINGLE_MODE_DMA
119 #define MEMORY_ADDR_MAX 0x100000
120 #define MEMORY_BANK_SIZE 0x800
121 #define IO_ADDR_MAX 0x10000
122 #define OVERRIDE_SOUND_FREQ_48000HZ 55467
123 #define SUPPORT_VARIABLE_TIMING
125 // device informations for win32
126 #if defined(_PC98DO) || defined(_PC98DOPLUS)
127 #define USE_BOOT_MODE 5
128 #define USE_DIPSWITCH
130 #if defined(_PC9801E) || defined(_PC9801VM) || defined(_PC98DO) || defined(_PC98DOPLUS)
131 #define USE_CPU_TYPE 2
135 #if defined(_PC9801) || defined(_PC9801E)
142 #elif defined(_PC98DO) || defined(_PC98DOPLUS)
143 // for PC-8801 drives
147 #if defined(SUPPORT_CMT_IF) || defined(_PC98DO) || defined(_PC98DOPLUS)
149 #define TAPE_BINARY_ONLY
151 #define NOTIFY_KEY_DOWN
152 #define USE_SHIFT_NUMPAD_KEY
153 #define USE_ALT_F10_KEY
154 #if defined(_PC98DO) || defined(_PC98DOPLUS)
155 // slow enough for N88-
\93ú
\96{
\8cêBASIC
156 #define USE_AUTO_KEY 8
157 #define USE_AUTO_KEY_RELEASE 10
158 #define USE_MONITOR_TYPE 2
161 #define USE_AUTO_KEY 5
162 #define USE_AUTO_KEY_RELEASE 6
164 #define USE_CRT_FILTER
165 #define USE_SCREEN_ROTATE
166 #define USE_ACCESS_LAMP
167 #define USE_SOUND_DEVICE_TYPE 4
168 #if defined(_PC98DO) || defined(_PC98DOPLUS)
169 #if defined(SUPPORT_PC98_OPNA) && defined(SUPPORT_PC88_OPNA)
170 #define USE_SOUND_VOLUME (4 + 1 + 1 + 4 + 1)
171 #elif defined(SUPPORT_PC98_OPNA) && !defined(SUPPORT_PC88_OPNA)
172 #define USE_SOUND_VOLUME (4 + 1 + 1 + 2 + 1)
173 #elif !defined(SUPPORT_PC98_OPNA) && defined(SUPPORT_PC88_OPNA)
174 #define USE_SOUND_VOLUME (2 + 1 + 1 + 4 + 1)
175 #elif !defined(SUPPORT_PC98_OPNA) && !defined(SUPPORT_PC88_OPNA)
176 #define USE_SOUND_VOLUME (2 + 1 + 1 + 2 + 1)
179 #if defined(SUPPORT_PC98_OPNA)
180 #define USE_SOUND_VOLUME (4 + 1 + 1)
182 #define USE_SOUND_VOLUME (2 + 1 + 1)
186 #define USE_PRINTER_TYPE 4
191 #define USE_CRT_MONITOR_4_3 1
193 #include "../../common.h"
194 #include "../../fileio.h"
196 #ifdef USE_SOUND_VOLUME
197 static const _TCHAR *sound_device_caption[] = {
198 #if defined(SUPPORT_PC98_OPNA)
199 _T("PC-9801-86 (FM)"), _T("PC-9801-86 (PSG)"), _T("PC-9801-86 (ADPCM)"), _T("PC-9801-86 (Rhythm)"),
201 _T("PC-9801-26 (FM)"), _T("PC-9801-26 (PSG)"),
203 _T("PC-9801-14"), _T("Beep"),
204 #if defined(_PC98DO) || defined(_PC98DOPLUS)
205 #if defined(SUPPORT_PC88_OPNA)
206 _T("PC-88 OPNA (FM)"), _T("PC-88 OPNA (PSG)"), _T("PC-88 OPNA (ADPCM)"), _T("PC-88 OPNA (Rhythm)"),
208 _T("PC-88 OPN (FM)"), _T("PC-88 OPN (PSG)"),
213 static const bool sound_device_monophonic[] = {
214 #if defined(SUPPORT_PC98_OPNA)
215 true, true, true, true,
220 #if defined(_PC98DO) || defined(_PC98DOPLUS)
221 #if defined(SUPPORT_PC88_OPNA)
222 true, true, true, true,
235 #if defined(SUPPORT_OLD_BUZZER)
248 #if !defined(SUPPORT_OLD_BUZZER)
257 #if defined(SUPPORT_CMT_IF)
267 #if defined(SUPPORT_320KB_FDD_IF)
273 #if defined(_PC98DO) || defined(_PC98DOPLUS)
287 #if defined(SUPPORT_OLD_BUZZER)
294 #if defined(SUPPORT_CMT_IF)
300 #if defined(SUPPORT_320KB_FDD_IF)
316 #if defined(HAS_I86) || defined(HAS_V30)
320 #if defined(SUPPORT_2HD_FDD_IF)
323 #if defined(SUPPORT_2DD_FDD_IF)
326 #if defined(SUPPORT_2HD_2DD_FDD_IF)
333 #if defined(SUPPORT_CMT_IF)
349 #if defined(SUPPORT_320KB_FDD_IF)
360 uint8 sound_bios[0x4000];
361 #if defined(_PC9801) || defined(_PC9801E)
362 uint8 fd_bios_2hd[0x1000];
363 uint8 fd_bios_2dd[0x1000];
368 int sound_device_type;
370 #if defined(_PC98DO) || defined(_PC98DOPLUS)
384 UPD765A* pc88fdc_sub;
391 // ----------------------------------------
393 // ----------------------------------------
398 // ----------------------------------------
399 // for emulation class
400 // ----------------------------------------
402 // drive virtual machine
409 DEVICE *get_cpu(int index);
417 void initialize_sound(int rate, int samples);
418 uint16* create_sound(int* extra_frames);
419 int sound_buffer_ptr();
420 #ifdef USE_SOUND_VOLUME
421 void set_sound_device_volume(int ch, int decibel_l, int decibel_r);
425 void key_down(int code, bool repeat);
426 void key_up(int code);
429 void open_disk(int drv, const _TCHAR* file_path, int bank);
430 void close_disk(int drv);
431 bool disk_inserted(int drv);
432 void set_disk_protected(int drv, bool value);
433 bool get_disk_protected(int drv);
434 #if defined(SUPPORT_CMT_IF) || defined(_PC98DO) || defined(_PC98DOPLUS)
435 void play_tape(const _TCHAR* file_path);
436 void rec_tape(const _TCHAR* file_path);
438 bool tape_inserted();
442 void update_config();
443 void save_state(FILEIO* state_fio);
444 bool load_state(FILEIO* state_fio);
446 // ----------------------------------------
448 // ----------------------------------------
451 DEVICE* get_device(int id);
453 DEVICE* first_device;