2 FUJITSU FM7 Emulator 'eFM7'
15 #define USE_TAPE_BUTTON
18 #define USE_CPU_TYPE 2
19 #define USE_SPECIAL_RESET
20 #define USE_EXTRA_LEDS 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 INDEPENDENT_CAPS_KANA_LED
30 #define NOTIFY_KEY_DOWN
31 //#define NOTIFY_KEY_UP
32 #define NOTIFY_KEY_DOWN_LR_SHIFT
33 #define NOTIFY_KEY_DOWN_LR_MENU
34 #define USE_KEY_LOCKED
35 #define USE_ALT_F10_KEY
36 #define USE_AUTO_KEY 5
37 #define USE_AUTO_KEY_RELEASE 6
38 #define USE_AUTO_KEY_NUMPAD
39 #define USE_SCREEN_FILTER
43 #define USE_DIG_RESOLUTION
44 #define SUPPORT_ROMA_KANA_CONVERSION
47 #define DEVICE_NAME "FUJITSU FM-8"
48 #define CONFIG_NAME "fm8"
50 #define DIPSWITCH_DEFAULT 0x00000000
56 #define DEVICE_NAME "FUJITSU FM-7"
57 #define CONFIG_NAME "fm7"
59 #define DIPSWITCH_DEFAULT 0x000000000
61 #elif defined(_FMNEW7)
62 #define DEVICE_NAME "FUJITSU FM-NEW7"
63 #define CONFIG_NAME "fmnew7"
65 #define DIPSWITCH_DEFAULT 0x000000000
67 #elif defined(_FM77) || defined(_FM77L2)
69 #define DEVICE_NAME "FUJITSU FM-77"
70 #define CONFIG_NAME "fm77"
71 #define DIPSWITCH_DEFAULT 0x00000001
74 #define DEVICE_NAME "FUJITSU FM-77L2"
75 #define CONFIG_NAME "fm77l2"
76 #define DIPSWITCH_DEFAULT 0x00000003
78 //#define USE_DRIVE_TYPE
79 #define _FM77_VARIANTS
81 # ifndef FM77_EXRAM_BANKS
82 # define FM77_EXRAM_BANKS 3
85 #elif defined(_FM77L4)
86 #define DEVICE_NAME "FUJITSU FM-77L4"
87 #define CONFIG_NAME "fm77l4"
91 #define HAS_CYCLESTEAL
92 #define HAS_400LINECARD
93 //#define CAPABLE_KANJI_CLASS2
94 #define _FM77_VARIANTS
96 # ifndef FM77_EXRAM_BANKS
97 # define FM77_EXRAM_BANKS 3
99 #define DIPSWITCH_DEFAULT 0x00000003
101 #elif defined(_FM77AV)
102 #define DEVICE_NAME "FUJITSU FM77AV"
103 #define CONFIG_NAME "fm77av"
104 #define _FM77AV_VARIANTS
105 #define DIPSWITCH_DEFAULT 0x80000001
107 #elif defined(_FM77AV20)
108 #define DEVICE_NAME "FUJITSU FM77AV20"
109 #define CONFIG_NAME "fm77av20"
110 #define _FM77AV_VARIANTS
113 #define CAPABLE_DICTROM
114 //#define USE_DRIVE_TYPE 2
115 #define CAPABLE_KANJI_CLASS2
116 #define DIPSWITCH_DEFAULT 0x80000001
118 #elif defined(_FM77AV20EX)
119 #define DEVICE_NAME "FUJITSU FM77AV20EX"
120 #define CONFIG_NAME "fm77av20ex"
121 #define _FM77AV_VARIANTS
125 //#define USE_DRIVE_TYPE 2
126 #define CAPABLE_DICTROM
127 #define CAPABLE_KANJI_CLASS2
128 #define DIPSWITCH_DEFAULT 0x80000001
130 #elif defined(_FM77AV40)
131 #define DEVICE_NAME "FUJITSU FM77AV40"
132 #define CONFIG_NAME "fm77av40"
133 #define _FM77AV_VARIANTS
136 //#define USE_DRIVE_TYPE 2
137 #define CAPABLE_DICTROM
138 #define HAS_400LINE_AV
139 #define CAPABLE_KANJI_CLASS2
140 #ifndef FM77_EXRAM_BANKS
141 #define FM77_EXRAM_BANKS 12
143 #define DIPSWITCH_DEFAULT 0x8000000d
145 #elif defined(_FM77AV40EX)
146 #define DEVICE_NAME "FUJITSU FM77AV40EX"
147 #define CONFIG_NAME "fm77av40ex"
148 #define _FM77AV_VARIANTS
151 //#define USE_DRIVE_TYPE 2
152 #define CAPABLE_DICTROM
153 #define HAS_400LINE_AV
154 #define CAPABLE_KANJI_CLASS2
155 #ifndef FM77_EXRAM_BANKS
156 #define FM77_EXRAM_BANKS 12
158 #define DIPSWITCH_DEFAULT 0x8000000d
160 #elif defined(_FM77AV40SX)
161 #define DEVICE_NAME "FUJITSU FM77AV40SX"
162 #define CONFIG_NAME "fm77av40sx"
163 #define _FM77AV_VARIANTS
166 //#define USE_DRIVE_TYPE 2
167 #define CAPABLE_DICTROM
168 #define HAS_400LINE_AV
169 #define CAPABLE_KANJI_CLASS2
170 # ifndef FM77_EXRAM_BANKS
171 # define FM77_EXRAM_BANKS 12
173 #define DIPSWITCH_DEFAULT 0x8000000d
178 #define USE_SOUND_TYPE 2
180 #define USE_MOUSE_TYPE 3
181 #define USE_SOUND_TYPE 8
184 #ifdef _FM77AV_VARIANTS
185 //#define CAPABLE_KANJI_CLASS2
187 #define HAS_CYCLESTEAL
188 #elif defined(_FM77_VARIANTS)
190 #define HAS_CYCLESTEAL
194 #if defined(_FM77_VARIANTS)
195 #define USE_BOOT_MODE 4
197 #define USE_BOOT_MODE 4
198 #elif defined(_FM7) || defined(_FMNEW7)
199 #define USE_BOOT_MODE 3
201 #define USE_BOOT_MODE 2
207 // 3 = WHG + OPN (+PSG)
209 // 5 = THG + OPN (+PSG)
210 // 6 = THG + WHG (+PSG)
211 // 7 = THG + WHG + OPN (+PSG)
214 #define SOUND_TYPE_DEFAULT 0
215 #elif defined(_FM7) || defined(_FMNEW7) || defined(_FM77_VARIANTS)
217 #define SOUND_TYPE_DEFAULT 0
218 #elif defined(_FM77AV_VARIANTS)
220 #define SOUND_TYPE_DEFAULT 1
224 #define USE_SOUND_VOLUME 5
226 #define USE_SOUND_VOLUME 11
228 #define SUPPORT_TV_RENDER
230 #define IGNORE_DISK_CRC_DEFAULT true
231 // device informations for virtual machine
233 // TODO: check refresh rate
234 #define FRAMES_PER_SEC 59.94
235 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || defined(_FM77L4)
236 #define LINES_PER_FRAME 400
238 #define LINES_PER_FRAME 200
241 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
242 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
243 #define CPU_CLOCKS 2016000
245 #define CPU_CLOCKS 1095000
247 #define CPU_CLOCKS 2000000
250 # if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || defined(_FM77L4)
251 #define SCREEN_WIDTH 640
252 #define SCREEN_HEIGHT 400
253 #undef SCREEN_FAKE_WIDTH
254 #undef SCREEN_FAKE_HEIGHT
256 #define SCREEN_WIDTH 640
257 #define SCREEN_HEIGHT 200
258 #define SCREEN_FAKE_WIDTH 640
259 #define SCREEN_FAKE_HEIGHT 200
260 #define SCREEN_Y_ZOOM 2.0
262 #define WINDOW_HEIGHT_ASPECT 480
264 #define MB8877_MAX_CHIPS 1
265 //#define IO_ADDR_MAX 0x10000
267 // device informations for win32
283 // DIP Switch description
284 #define SWITCH_CYCLESTEAL 0x00000001
286 #define SWITCH_URA_RAM 0x00000002
288 #define SWITCH_URA_RAM 0x00000000
290 #define SWITCH_INVERT_CMT 0x00000004
292 // Belows are optional Hardwares.
293 #if !defined(_FM77_VARIANTS) && !defined(_FM77AV_VARIANTS)
294 #define SWITCH_FDC 0x00010000
296 #define SWITCH_FDC 0x00000000
298 #if !defined(_FM77_VARIANTS) && !defined(_FM77AV_VARIANTS)
299 #define SWITCH_Z80 0x00020000
301 #define SWITCH_Z80 0x00000000
303 #if defined(_FM77_VARIANTS)
304 #define SWITCH_DICTCARD 0x00040000
306 #define SWITCH_DICTCARD 0x00000000
308 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
309 #define SWITCH_EXTRA_RAM 0x00080000
311 #define SWITCH_EXTRA_RAM 0x00000000
313 #define MB8877_NO_BUSY_AFTER_SEEK
315 //#define ENABLE_OPENCL // If OpenCL renderer is enabled, define here.
317 //#include "../../config.h"
318 #include "../../common.h"
319 #include "../../fileio.h"
321 #ifdef USE_SOUND_VOLUME
322 static const _TCHAR *sound_device_caption[] = {
330 # if !defined(_FM77AV_VARIANTS)
333 _T("OPN (FM)"), _T("OPN (PSG)"), _T("WHG (FM)"), _T("WHG (PSG)"), _T("THG (FM)"), _T("THG (PSG)"),
334 _T("Beep"), _T("CMT (Signal)"),
335 # if defined(_FM77AV_VARIANTS)
338 _T("Noise (FDD)"), _T("Noise (CMT)"),
342 #ifdef USE_JOY_BUTTON_CAPTIONS
343 static const _TCHAR *joy_button_captions[] = {
348 _T("Button #1(1st)"),
349 _T("Button #2(1st)"),
350 _T("Button #1(2nd)"),
351 _T("Button #2(2nd)"),
360 #if defined(_FM77AV_VARIANTS)
369 #if defined(USE_AY_3_8910_AS_PSG) && !defined(_FM77AV_VARIANTS)
376 #if defined(_FM77AV_VARIANTS)
379 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
380 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
400 FM7_MAINMEM* mainmem;
405 # if defined(USE_AY_3_8910_AS_PSG)
413 # if !defined(_FM77AV_VARIANTS)
414 # if defined(USE_AY_3_8910_AS_PSG)
417 YM2203* psg; // Is right? AY-3-8910 is right device.
422 BUBBLECASETTE *bubble_casette[2];
433 DEVICE* inteli_mouse;
437 #if defined(_FM77AV_VARIANTS)
447 KANJIROM *kanjiclass1;
448 #ifdef CAPABLE_KANJI_CLASS2
449 KANJIROM *kanjiclass2;
451 bool connect_320kfdc;
454 // ----------------------------------------
456 // ----------------------------------------
461 // ----------------------------------------
462 // for emulation class
463 // ----------------------------------------
465 // drive virtual machine
467 void special_reset();
469 double get_frame_rate();
473 DEVICE *get_cpu(int index);
475 void initialize(void);
476 void connect_bus(void);
478 void update_dipswitch(void);
483 void initialize_sound(int rate, int samples);
484 uint16_t* create_sound(int* extra_frames);
485 int get_sound_buffer_ptr();
486 #ifdef USE_SOUND_VOLUME
487 void set_sound_device_volume(int ch, int decibel_l, int decibel_r);
491 void key_down(int code, bool repeat);
492 void key_up(int code);
493 bool get_caps_locked();
494 bool get_kana_locked();
495 uint32_t get_extra_leds();
498 void open_floppy_disk(int drv, const _TCHAR* file_path, int bank);
499 void close_floppy_disk(int drv);
500 bool is_floppy_disk_inserted(int drv);
501 void is_floppy_disk_protected(int drv, bool value);
502 bool is_floppy_disk_protected(int drv);
503 uint32_t is_floppy_disk_accessed();
505 void play_tape(int drv, const _TCHAR* file_path);
506 void rec_tape(int drv, const _TCHAR* file_path);
507 void close_tape(int drv);
508 bool is_tape_inserted(int drv);
509 bool is_tape_playing(int drv);
510 bool is_tape_recording(int drv);
511 int get_tape_position(int drv);
512 const _TCHAR* get_tape_message(int drv);
514 bool is_frame_skippable();
515 void push_play(int drv);
516 void push_stop(int drv);
517 void push_fast_forward(int drv);
518 void push_fast_rewind(int drv);
519 void push_apss_forward(int drv);
520 void push_apss_rewind(int drv);
521 void update_config();
522 void save_state(FILEIO* state_fio);
523 bool load_state(FILEIO* state_fio);
524 #if defined(USE_BUBBLE1)
525 void open_bubble_casette(int drv, const _TCHAR *path, int bank);
526 void close_bubble_casette(int drv);
527 bool is_bubble_casette_inserted(int drv);
528 bool is_bubble_casette_protected(int drv);
529 void is_bubble_casette_protected(int drv, bool flag);
531 #if defined(USE_DIG_RESOLUTION)
532 void get_screen_resolution(int *w, int *h);
534 #if defined(USE_MINIMUM_RENDERING)
535 bool is_screen_changed(void);
537 // ----------------------------------------
539 // ----------------------------------------
540 void set_cpu_clock(DEVICE *cpu, uint32_t clocks);
542 DEVICE* get_device(int id);
544 DEVICE* first_device;