2 FUJITSU FM7 Emulator 'eFM7'
15 #define USE_TAPE_BUTTON
18 #define USE_CPU_TYPE 2
19 #define USE_SPECIAL_RESET
20 #define USE_LED_DEVICE 3
21 #define USE_MINIMUM_RENDERING 1
24 #define USE_JOY_BUTTON_CAPTIONS
26 #define USE_PRINTER_TYPE 4
28 #define NOTIFY_KEY_DOWN
29 //#define NOTIFY_KEY_UP
30 #define NOTIFY_KEY_DOWN_LR_SHIFT
31 #define NOTIFY_KEY_DOWN_LR_MENU
32 #define USE_ALT_F10_KEY
33 #define USE_AUTO_KEY 5
34 #define USE_AUTO_KEY_RELEASE 6
35 #define USE_CRT_FILTER
36 #define USE_ACCESS_LAMP
40 #define USE_DIG_RESOLUTION
41 #define SUPPORT_ROMA_KANA_CONVERSION
44 #define USE_SOUND_FILES 3
45 #define USE_SOUND_FILES_FDD
46 #define USE_SOUND_FILES_RELAY
49 #define DEVICE_NAME "FUJITSU FM-8"
50 #define CONFIG_NAME "fm8"
52 #define DIPSWITCH_DEFAULT 0x00000000
58 #define DEVICE_NAME "FUJITSU FM-7"
59 #define CONFIG_NAME "fm7"
61 #define DIPSWITCH_DEFAULT 0x000000000
63 #elif defined(_FMNEW7)
64 #define DEVICE_NAME "FUJITSU FM-NEW7"
65 #define CONFIG_NAME "fmnew7"
67 #define DIPSWITCH_DEFAULT 0x000000000
69 #elif defined(_FM77) || defined(_FM77L2)
71 #define DEVICE_NAME "FUJITSU FM-77"
72 #define CONFIG_NAME "fm77"
73 #define DIPSWITCH_DEFAULT 0x00000001
76 #define DEVICE_NAME "FUJITSU FM-77L2"
77 #define CONFIG_NAME "fm77l2"
78 #define DIPSWITCH_DEFAULT 0x00000003
80 //#define USE_DRIVE_TYPE
81 #define _FM77_VARIANTS
83 # ifndef FM77_EXRAM_BANKS
84 # define FM77_EXRAM_BANKS 3
87 #elif defined(_FM77L4)
88 #define DEVICE_NAME "FUJITSU FM-77L4"
89 #define CONFIG_NAME "fm77l4"
93 #define HAS_CYCLESTEAL
94 #define HAS_400LINECARD
95 //#define CAPABLE_KANJI_CLASS2
96 #define _FM77_VARIANTS
98 # ifndef FM77_EXRAM_BANKS
99 # define FM77_EXRAM_BANKS 3
101 #define DIPSWITCH_DEFAULT 0x00000003
103 #elif defined(_FM77AV)
104 #define DEVICE_NAME "FUJITSU FM77AV"
105 #define CONFIG_NAME "fm77av"
106 #define _FM77AV_VARIANTS
107 #define DIPSWITCH_DEFAULT 0x80000001
109 #elif defined(_FM77AV20)
110 #define DEVICE_NAME "FUJITSU FM77AV20"
111 #define CONFIG_NAME "fm77av20"
112 #define _FM77AV_VARIANTS
115 #define CAPABLE_DICTROM
116 //#define USE_DRIVE_TYPE 2
117 #define CAPABLE_KANJI_CLASS2
118 #define DIPSWITCH_DEFAULT 0x80000001
120 #elif defined(_FM77AV20EX)
121 #define DEVICE_NAME "FUJITSU FM77AV20EX"
122 #define CONFIG_NAME "fm77av20ex"
123 #define _FM77AV_VARIANTS
127 //#define USE_DRIVE_TYPE 2
128 #define CAPABLE_DICTROM
129 #define CAPABLE_KANJI_CLASS2
130 #define DIPSWITCH_DEFAULT 0x80000001
132 #elif defined(_FM77AV40)
133 #define DEVICE_NAME "FUJITSU FM77AV40"
134 #define CONFIG_NAME "fm77av40"
135 #define _FM77AV_VARIANTS
138 //#define USE_DRIVE_TYPE 2
139 #define CAPABLE_DICTROM
140 #define HAS_400LINE_AV
141 #define CAPABLE_KANJI_CLASS2
142 #ifndef FM77_EXRAM_BANKS
143 #define FM77_EXRAM_BANKS 12
145 #define DIPSWITCH_DEFAULT 0x8000000d
147 #elif defined(_FM77AV40EX)
148 #define DEVICE_NAME "FUJITSU FM77AV40EX"
149 #define CONFIG_NAME "fm77av40ex"
150 #define _FM77AV_VARIANTS
153 //#define USE_DRIVE_TYPE 2
154 #define CAPABLE_DICTROM
155 #define HAS_400LINE_AV
156 #define CAPABLE_KANJI_CLASS2
157 #ifndef FM77_EXRAM_BANKS
158 #define FM77_EXRAM_BANKS 12
160 #define DIPSWITCH_DEFAULT 0x8000000d
162 #elif defined(_FM77AV40SX)
163 #define DEVICE_NAME "FUJITSU FM77AV40SX"
164 #define CONFIG_NAME "fm77av40sx"
165 #define _FM77AV_VARIANTS
168 //#define USE_DRIVE_TYPE 2
169 #define CAPABLE_DICTROM
170 #define HAS_400LINE_AV
171 #define CAPABLE_KANJI_CLASS2
172 # ifndef FM77_EXRAM_BANKS
173 # define FM77_EXRAM_BANKS 12
175 #define DIPSWITCH_DEFAULT 0x8000000d
180 #define USE_SOUND_DEVICE_TYPE 2
182 #define USE_DEVICE_TYPE 3
183 #define USE_SOUND_DEVICE_TYPE 8
186 #ifdef _FM77AV_VARIANTS
188 //#define CAPABLE_KANJI_CLASS2
190 #define HAS_CYCLESTEAL
192 #elif defined(_FM77_VARIANTS)
195 #define HAS_CYCLESTEAL
199 #if defined(_FM77_VARIANTS)
200 #define USE_BOOT_MODE 4
202 #define USE_BOOT_MODE 4
203 #elif defined(_FM7) || defined(_FMNEW7)
204 #define USE_BOOT_MODE 3
206 #define USE_BOOT_MODE 2
212 // 3 = WHG + OPN (+PSG)
214 // 5 = THG + OPN (+PSG)
215 // 6 = THG + WHG (+PSG)
216 // 7 = THG + WHG + OPN (+PSG)
219 #define SOUND_DEVICE_TYPE_DEFAULT 0
220 #elif defined(_FM7) || defined(_FMNEW7) || defined(_FM77_VARIANTS)
222 #define SOUND_DEVICE_TYPE_DEFAULT 0
223 #elif defined(_FM77AV_VARIANTS)
225 #define SOUND_DEVICE_TYPE_DEFAULT 1
228 #if defined(USE_SOUND_FILES)
230 #define USE_SOUND_VOLUME 5
232 #define USE_SOUND_VOLUME 11
236 #define USE_SOUND_VOLUME 3
238 #define USE_SOUND_VOLUME 9
242 #define IGNORE_DISK_CRC_DEFAULT true
243 // device informations for virtual machine
245 // TODO: check refresh rate
246 #define FRAMES_PER_SEC 59.94
247 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || defined(_FM77L4)
248 #define LINES_PER_FRAME 400
250 #define LINES_PER_FRAME 200
253 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
254 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
255 #define CPU_CLOCKS 2016000
257 #define CPU_CLOCKS 1095000
259 #define CPU_CLOCKS 2000000
262 #define SCREEN_WIDTH 640
263 #define SCREEN_HEIGHT 400
264 #define WINDOW_HEIGHT_ASPECT 480
266 #define MB8877_MAX_CHIPS 1
267 //#define IO_ADDR_MAX 0x10000
269 // device informations for win32
291 // DIP Switch description
292 #define SWITCH_CYCLESTEAL 0x00000001
294 #define SWITCH_URA_RAM 0x00000002
296 #define SWITCH_URA_RAM 0x00000000
298 #define SWITCH_INVERT_CMT 0x00000004
300 // Belows are optional Hardwares.
301 #if !defined(_FM77_VARIANTS) && !defined(_FM77AV_VARIANTS)
302 #define SWITCH_FDC 0x00010000
304 #define SWITCH_FDC 0x00000000
306 #if !defined(_FM77_VARIANTS) && !defined(_FM77AV_VARIANTS)
307 #define SWITCH_Z80 0x00020000
309 #define SWITCH_Z80 0x00000000
311 #if defined(_FM77_VARIANTS)
312 #define SWITCH_DICTCARD 0x00040000
314 #define SWITCH_DICTCARD 0x00000000
316 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
317 #define SWITCH_EXTRA_RAM 0x00080000
319 #define SWITCH_EXTRA_RAM 0x00000000
321 #define MB8877_NO_BUSY_AFTER_SEEK
323 //#define ENABLE_OPENCL // If OpenCL renderer is enabled, define here.
325 //#include "../../config.h"
326 #include "../../common.h"
327 #include "../../fileio.h"
329 #ifdef USE_SOUND_VOLUME
330 static const _TCHAR *sound_device_caption[] = {
335 # if defined(USE_SOUND_FILES)
336 _T("FDD SEEK"), _T("RELAY"),
339 # if !defined(_FM77AV_VARIANTS)
342 _T("OPN (FM)"), _T("OPN (PSG)"), _T("WHG (FM)"), _T("WHG (PSG)"), _T("THG (FM)"), _T("THG (PSG)"),
343 _T("Beep"), _T("CMT"),
344 # if defined(_FM77AV_VARIANTS)
347 #if defined(USE_SOUND_FILES)
348 _T("FDD SEEK"), _T("RELAY"),
353 #ifdef USE_JOY_BUTTON_CAPTIONS
354 static const _TCHAR *joy_button_captions[] = {
359 _T("Button #1(1st)"),
360 _T("Button #2(1st)"),
361 _T("Button #1(2nd)"),
362 _T("Button #2(2nd)"),
371 #if defined(_FM77AV_VARIANTS)
383 #if defined(USE_LED_DEVICE)
388 #if defined(_FM77AV_VARIANTS)
391 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
392 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
412 FM7_MAINMEM* mainmem;
414 #if defined(USE_LED_DEVICE)
415 DUMMYDEVICE* led_terminate;
417 DEVICE* led_terminate;
424 # if !defined(_FM77AV_VARIANTS)
425 YM2203* psg; // Is right? AY-3-8910 is right device.
429 BUBBLECASETTE *bubble_casette[2];
440 DEVICE* inteli_mouse;
444 #if defined(_FM77AV_VARIANTS)
454 KANJIROM *kanjiclass1;
455 #ifdef CAPABLE_KANJI_CLASS2
456 KANJIROM *kanjiclass2;
458 bool connect_320kfdc;
461 // ----------------------------------------
463 // ----------------------------------------
468 // ----------------------------------------
469 // for emulation class
470 // ----------------------------------------
472 // drive virtual machine
474 void special_reset();
476 double get_frame_rate();
477 #if defined(USE_LED_DEVICE)
478 uint32_t get_led_status();
483 DEVICE *get_cpu(int index);
485 void initialize(void);
486 void connect_bus(void);
488 void update_dipswitch(void);
491 uint32_t get_access_lamp_status();
494 void initialize_sound(int rate, int samples);
495 uint16_t* create_sound(int* extra_frames);
496 int get_sound_buffer_ptr();
497 #ifdef USE_SOUND_VOLUME
498 void set_sound_device_volume(int ch, int decibel_l, int decibel_r);
502 void key_down(int code, bool repeat);
503 void key_up(int code);
506 void open_floppy_disk(int drv, const _TCHAR* file_path, int bank);
507 void close_floppy_disk(int drv);
508 bool is_floppy_disk_inserted(int drv);
509 void is_floppy_disk_protected(int drv, bool value);
510 bool is_floppy_disk_protected(int drv);
512 void play_tape(const _TCHAR* file_path);
513 void rec_tape(const _TCHAR* file_path);
515 bool is_tape_inserted();
516 bool is_tape_playing();
517 bool is_tape_recording();
518 int get_tape_position();
520 bool is_frame_skippable();
523 void push_fast_forward();
524 void push_fast_rewind();
525 void push_apss_forward();
526 void push_apss_rewind();
527 void update_config();
528 void save_state(FILEIO* state_fio);
529 bool load_state(FILEIO* state_fio);
530 #if defined(USE_BUBBLE1)
531 void open_bubble_casette(int drv, _TCHAR *path, int bank);
532 void close_bubble_casette(int drv);
533 bool is_bubble_casette_inserted(int drv);
534 bool is_bubble_casette_protected(int drv);
535 void is_bubble_casette_protected(int drv, bool flag);
537 #if defined(USE_DIG_RESOLUTION)
538 void get_screen_resolution(int *w, int *h);
540 #if defined(USE_MINIMUM_RENDERING)
541 bool is_screen_changed(void);
543 // ----------------------------------------
545 // ----------------------------------------
546 void set_cpu_clock(DEVICE *cpu, uint32_t clocks);
548 DEVICE* get_device(int id);
550 DEVICE* first_device;