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
27 #define USE_AY_3_8910_AS_PSG
29 #define NOTIFY_KEY_DOWN
30 //#define NOTIFY_KEY_UP
31 #define NOTIFY_KEY_DOWN_LR_SHIFT
32 #define NOTIFY_KEY_DOWN_LR_MENU
33 #define USE_ALT_F10_KEY
34 #define USE_AUTO_KEY 5
35 #define USE_AUTO_KEY_RELEASE 6
36 #define USE_SCREEN_FILTER
40 #define USE_DIG_RESOLUTION
41 #define SUPPORT_ROMA_KANA_CONVERSION
44 #define DEVICE_NAME "FUJITSU FM-8"
45 #define CONFIG_NAME "fm8"
47 #define DIPSWITCH_DEFAULT 0x00000000
53 #define DEVICE_NAME "FUJITSU FM-7"
54 #define CONFIG_NAME "fm7"
56 #define DIPSWITCH_DEFAULT 0x000000000
58 #elif defined(_FMNEW7)
59 #define DEVICE_NAME "FUJITSU FM-NEW7"
60 #define CONFIG_NAME "fmnew7"
62 #define DIPSWITCH_DEFAULT 0x000000000
64 #elif defined(_FM77) || defined(_FM77L2)
66 #define DEVICE_NAME "FUJITSU FM-77"
67 #define CONFIG_NAME "fm77"
68 #define DIPSWITCH_DEFAULT 0x00000001
71 #define DEVICE_NAME "FUJITSU FM-77L2"
72 #define CONFIG_NAME "fm77l2"
73 #define DIPSWITCH_DEFAULT 0x00000003
75 //#define USE_DRIVE_TYPE
76 #define _FM77_VARIANTS
78 # ifndef FM77_EXRAM_BANKS
79 # define FM77_EXRAM_BANKS 3
82 #elif defined(_FM77L4)
83 #define DEVICE_NAME "FUJITSU FM-77L4"
84 #define CONFIG_NAME "fm77l4"
88 #define HAS_CYCLESTEAL
89 #define HAS_400LINECARD
90 //#define CAPABLE_KANJI_CLASS2
91 #define _FM77_VARIANTS
93 # ifndef FM77_EXRAM_BANKS
94 # define FM77_EXRAM_BANKS 3
96 #define DIPSWITCH_DEFAULT 0x00000003
98 #elif defined(_FM77AV)
99 #define DEVICE_NAME "FUJITSU FM77AV"
100 #define CONFIG_NAME "fm77av"
101 #define _FM77AV_VARIANTS
102 #define DIPSWITCH_DEFAULT 0x80000001
104 #elif defined(_FM77AV20)
105 #define DEVICE_NAME "FUJITSU FM77AV20"
106 #define CONFIG_NAME "fm77av20"
107 #define _FM77AV_VARIANTS
110 #define CAPABLE_DICTROM
111 //#define USE_DRIVE_TYPE 2
112 #define CAPABLE_KANJI_CLASS2
113 #define DIPSWITCH_DEFAULT 0x80000001
115 #elif defined(_FM77AV20EX)
116 #define DEVICE_NAME "FUJITSU FM77AV20EX"
117 #define CONFIG_NAME "fm77av20ex"
118 #define _FM77AV_VARIANTS
122 //#define USE_DRIVE_TYPE 2
123 #define CAPABLE_DICTROM
124 #define CAPABLE_KANJI_CLASS2
125 #define DIPSWITCH_DEFAULT 0x80000001
127 #elif defined(_FM77AV40)
128 #define DEVICE_NAME "FUJITSU FM77AV40"
129 #define CONFIG_NAME "fm77av40"
130 #define _FM77AV_VARIANTS
133 //#define USE_DRIVE_TYPE 2
134 #define CAPABLE_DICTROM
135 #define HAS_400LINE_AV
136 #define CAPABLE_KANJI_CLASS2
137 #ifndef FM77_EXRAM_BANKS
138 #define FM77_EXRAM_BANKS 12
140 #define DIPSWITCH_DEFAULT 0x8000000d
142 #elif defined(_FM77AV40EX)
143 #define DEVICE_NAME "FUJITSU FM77AV40EX"
144 #define CONFIG_NAME "fm77av40ex"
145 #define _FM77AV_VARIANTS
148 //#define USE_DRIVE_TYPE 2
149 #define CAPABLE_DICTROM
150 #define HAS_400LINE_AV
151 #define CAPABLE_KANJI_CLASS2
152 #ifndef FM77_EXRAM_BANKS
153 #define FM77_EXRAM_BANKS 12
155 #define DIPSWITCH_DEFAULT 0x8000000d
157 #elif defined(_FM77AV40SX)
158 #define DEVICE_NAME "FUJITSU FM77AV40SX"
159 #define CONFIG_NAME "fm77av40sx"
160 #define _FM77AV_VARIANTS
163 //#define USE_DRIVE_TYPE 2
164 #define CAPABLE_DICTROM
165 #define HAS_400LINE_AV
166 #define CAPABLE_KANJI_CLASS2
167 # ifndef FM77_EXRAM_BANKS
168 # define FM77_EXRAM_BANKS 12
170 #define DIPSWITCH_DEFAULT 0x8000000d
175 #define USE_SOUND_TYPE 2
177 #define USE_MOUSE_TYPE 3
178 #define USE_SOUND_TYPE 8
181 #ifdef _FM77AV_VARIANTS
182 //#define CAPABLE_KANJI_CLASS2
184 #define HAS_CYCLESTEAL
185 #elif defined(_FM77_VARIANTS)
187 #define HAS_CYCLESTEAL
191 #if defined(_FM77_VARIANTS)
192 #define USE_BOOT_MODE 4
194 #define USE_BOOT_MODE 4
195 #elif defined(_FM7) || defined(_FMNEW7)
196 #define USE_BOOT_MODE 3
198 #define USE_BOOT_MODE 2
204 // 3 = WHG + OPN (+PSG)
206 // 5 = THG + OPN (+PSG)
207 // 6 = THG + WHG (+PSG)
208 // 7 = THG + WHG + OPN (+PSG)
211 #define SOUND_TYPE_DEFAULT 0
212 #elif defined(_FM7) || defined(_FMNEW7) || defined(_FM77_VARIANTS)
214 #define SOUND_TYPE_DEFAULT 0
215 #elif defined(_FM77AV_VARIANTS)
217 #define SOUND_TYPE_DEFAULT 1
221 #define USE_SOUND_VOLUME 5
223 #define USE_SOUND_VOLUME 11
225 #define SUPPORT_TV_RENDER
227 #define IGNORE_DISK_CRC_DEFAULT true
228 // device informations for virtual machine
230 // TODO: check refresh rate
231 #define FRAMES_PER_SEC 59.94
232 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || defined(_FM77L4)
233 #define LINES_PER_FRAME 400
235 #define LINES_PER_FRAME 200
238 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
239 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
240 #define CPU_CLOCKS 2016000
242 #define CPU_CLOCKS 1095000
244 #define CPU_CLOCKS 2000000
247 # if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || defined(_FM77L4)
248 #define SCREEN_WIDTH 640
249 #define SCREEN_HEIGHT 400
250 #undef SCREEN_FAKE_WIDTH
251 #undef SCREEN_FAKE_HEIGHT
253 #define SCREEN_WIDTH 640
254 #define SCREEN_HEIGHT 200
255 #define SCREEN_FAKE_WIDTH 640
256 #define SCREEN_FAKE_HEIGHT 400
258 #define WINDOW_HEIGHT_ASPECT 480
260 #define MB8877_MAX_CHIPS 1
261 //#define IO_ADDR_MAX 0x10000
263 // device informations for win32
285 // DIP Switch description
286 #define SWITCH_CYCLESTEAL 0x00000001
288 #define SWITCH_URA_RAM 0x00000002
290 #define SWITCH_URA_RAM 0x00000000
292 #define SWITCH_INVERT_CMT 0x00000004
294 // Belows are optional Hardwares.
295 #if !defined(_FM77_VARIANTS) && !defined(_FM77AV_VARIANTS)
296 #define SWITCH_FDC 0x00010000
298 #define SWITCH_FDC 0x00000000
300 #if !defined(_FM77_VARIANTS) && !defined(_FM77AV_VARIANTS)
301 #define SWITCH_Z80 0x00020000
303 #define SWITCH_Z80 0x00000000
305 #if defined(_FM77_VARIANTS)
306 #define SWITCH_DICTCARD 0x00040000
308 #define SWITCH_DICTCARD 0x00000000
310 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
311 #define SWITCH_EXTRA_RAM 0x00080000
313 #define SWITCH_EXTRA_RAM 0x00000000
315 #define MB8877_NO_BUSY_AFTER_SEEK
317 //#define ENABLE_OPENCL // If OpenCL renderer is enabled, define here.
319 //#include "../../config.h"
320 #include "../../common.h"
321 #include "../../fileio.h"
323 #ifdef USE_SOUND_VOLUME
324 static const _TCHAR *sound_device_caption[] = {
332 # if !defined(_FM77AV_VARIANTS)
335 _T("OPN (FM)"), _T("OPN (PSG)"), _T("WHG (FM)"), _T("WHG (PSG)"), _T("THG (FM)"), _T("THG (PSG)"),
336 _T("Beep"), _T("CMT (Signal)"),
337 # if defined(_FM77AV_VARIANTS)
340 _T("Noise (FDD)"), _T("Noise (CMT)"),
344 #ifdef USE_JOY_BUTTON_CAPTIONS
345 static const _TCHAR *joy_button_captions[] = {
350 _T("Button #1(1st)"),
351 _T("Button #2(1st)"),
352 _T("Button #1(2nd)"),
353 _T("Button #2(2nd)"),
362 #if defined(_FM77AV_VARIANTS)
371 #if defined(USE_AY_3_8910_AS_PSG) && !defined(_FM77AV_VARIANTS)
377 #if defined(USE_LED_DEVICE)
382 #if defined(_FM77AV_VARIANTS)
385 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
386 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
406 FM7_MAINMEM* mainmem;
408 #if defined(USE_LED_DEVICE)
409 DUMMYDEVICE* led_terminate;
411 DEVICE* led_terminate;
416 # if defined(USE_AY_3_8910_AS_PSG)
424 # if !defined(_FM77AV_VARIANTS)
425 # if defined(USE_AY_3_8910_AS_PSG)
428 YM2203* psg; // Is right? AY-3-8910 is right device.
433 BUBBLECASETTE *bubble_casette[2];
444 DEVICE* inteli_mouse;
448 #if defined(_FM77AV_VARIANTS)
458 KANJIROM *kanjiclass1;
459 #ifdef CAPABLE_KANJI_CLASS2
460 KANJIROM *kanjiclass2;
462 bool connect_320kfdc;
465 // ----------------------------------------
467 // ----------------------------------------
472 // ----------------------------------------
473 // for emulation class
474 // ----------------------------------------
476 // drive virtual machine
478 void special_reset();
480 double get_frame_rate();
481 #if defined(USE_LED_DEVICE)
482 uint32_t get_led_status();
487 DEVICE *get_cpu(int index);
489 void initialize(void);
490 void connect_bus(void);
492 void update_dipswitch(void);
497 void initialize_sound(int rate, int samples);
498 uint16_t* create_sound(int* extra_frames);
499 int get_sound_buffer_ptr();
500 #ifdef USE_SOUND_VOLUME
501 void set_sound_device_volume(int ch, int decibel_l, int decibel_r);
505 void key_down(int code, bool repeat);
506 void key_up(int code);
509 void open_floppy_disk(int drv, const _TCHAR* file_path, int bank);
510 void close_floppy_disk(int drv);
511 bool is_floppy_disk_inserted(int drv);
512 void is_floppy_disk_protected(int drv, bool value);
513 bool is_floppy_disk_protected(int drv);
514 uint32_t is_floppy_disk_accessed();
516 void play_tape(int drv, const _TCHAR* file_path);
517 void rec_tape(int drv, const _TCHAR* file_path);
518 void close_tape(int drv);
519 bool is_tape_inserted(int drv);
520 bool is_tape_playing(int drv);
521 bool is_tape_recording(int drv);
522 int get_tape_position(int drv);
523 const _TCHAR* get_tape_message(int drv);
525 bool is_frame_skippable();
526 void push_play(int drv);
527 void push_stop(int drv);
528 void push_fast_forward(int drv);
529 void push_fast_rewind(int drv);
530 void push_apss_forward(int drv);
531 void push_apss_rewind(int drv);
532 void update_config();
533 void save_state(FILEIO* state_fio);
534 bool load_state(FILEIO* state_fio);
535 #if defined(USE_BUBBLE1)
536 void open_bubble_casette(int drv, const _TCHAR *path, int bank);
537 void close_bubble_casette(int drv);
538 bool is_bubble_casette_inserted(int drv);
539 bool is_bubble_casette_protected(int drv);
540 void is_bubble_casette_protected(int drv, bool flag);
542 #if defined(USE_DIG_RESOLUTION)
543 void get_screen_resolution(int *w, int *h);
545 #if defined(USE_MINIMUM_RENDERING)
546 bool is_screen_changed(void);
548 // ----------------------------------------
550 // ----------------------------------------
551 void set_cpu_clock(DEVICE *cpu, uint32_t clocks);
553 DEVICE* get_device(int id);
555 DEVICE* first_device;