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 #define CAPABLE_JCOMMCARD 1
63 #elif defined(_FMNEW7)
64 #define DEVICE_NAME "FUJITSU FM-NEW7"
65 #define CONFIG_NAME "fmnew7"
67 #define DIPSWITCH_DEFAULT 0x000000000
69 #define CAPABLE_JCOMMCARD 1
71 #elif defined(_FM77) || defined(_FM77L2)
73 #define DEVICE_NAME "FUJITSU FM-77"
74 #define CONFIG_NAME "fm77"
75 #define DIPSWITCH_DEFAULT 0x00000001
77 #define DEVICE_NAME "FUJITSU FM-77L2"
78 #define CONFIG_NAME "fm77l2"
79 #define DIPSWITCH_DEFAULT 0x00000003
81 //#define USE_DRIVE_TYPE
82 #define _FM77_VARIANTS
84 # ifndef FM77_EXRAM_BANKS
85 # define FM77_EXRAM_BANKS 3
89 #elif defined(_FM77L4)
90 #define DEVICE_NAME "FUJITSU FM-77L4"
91 #define CONFIG_NAME "fm77l4"
95 #define HAS_CYCLESTEAL
96 #define HAS_400LINECARD
97 //#define CAPABLE_KANJI_CLASS2
98 #define _FM77_VARIANTS
100 # ifndef FM77_EXRAM_BANKS
101 # define FM77_EXRAM_BANKS 3
103 #define DIPSWITCH_DEFAULT 0x00000003
105 #define CAPABLE_JCOMMCARD 1
107 #elif defined(_FM77AV)
108 #define DEVICE_NAME "FUJITSU FM77AV"
109 #define CONFIG_NAME "fm77av"
110 #define _FM77AV_VARIANTS
111 #define DIPSWITCH_DEFAULT 0x80000001
113 #define CAPABLE_JCOMMCARD 1
115 #elif defined(_FM77AV20)
116 #define DEVICE_NAME "FUJITSU FM77AV20"
117 #define CONFIG_NAME "fm77av20"
118 #define _FM77AV_VARIANTS
121 #define CAPABLE_DICTROM
122 //#define USE_DRIVE_TYPE 2
123 #define CAPABLE_KANJI_CLASS2
124 #define DIPSWITCH_DEFAULT 0x80000001
127 #elif defined(_FM77AV20EX)
128 #define DEVICE_NAME "FUJITSU FM77AV20EX"
129 #define CONFIG_NAME "fm77av20ex"
130 #define _FM77AV_VARIANTS
134 //#define USE_DRIVE_TYPE 2
135 #define CAPABLE_DICTROM
136 #define CAPABLE_KANJI_CLASS2
137 #define DIPSWITCH_DEFAULT 0x80000001
140 #elif defined(_FM77AV40)
141 #define DEVICE_NAME "FUJITSU FM77AV40"
142 #define CONFIG_NAME "fm77av40"
143 #define _FM77AV_VARIANTS
146 //#define USE_DRIVE_TYPE 2
147 #define CAPABLE_DICTROM
148 #define HAS_400LINE_AV
149 #define CAPABLE_KANJI_CLASS2
150 #ifndef FM77_EXRAM_BANKS
151 #define FM77_EXRAM_BANKS 12
153 #define DIPSWITCH_DEFAULT 0x8000000d
156 #elif defined(_FM77AV40EX)
157 #define DEVICE_NAME "FUJITSU FM77AV40EX"
158 #define CONFIG_NAME "fm77av40ex"
159 #define _FM77AV_VARIANTS
162 //#define USE_DRIVE_TYPE 2
163 #define CAPABLE_DICTROM
164 #define HAS_400LINE_AV
165 #define CAPABLE_KANJI_CLASS2
166 #ifndef FM77_EXRAM_BANKS
167 #define FM77_EXRAM_BANKS 12
169 #define DIPSWITCH_DEFAULT 0x8000000d
172 #elif defined(_FM77AV40SX)
173 #define DEVICE_NAME "FUJITSU FM77AV40SX"
174 #define CONFIG_NAME "fm77av40sx"
175 #define _FM77AV_VARIANTS
178 //#define USE_DRIVE_TYPE 2
179 #define CAPABLE_DICTROM
180 #define HAS_400LINE_AV
181 #define CAPABLE_KANJI_CLASS2
182 # ifndef FM77_EXRAM_BANKS
183 # define FM77_EXRAM_BANKS 12
185 #define DIPSWITCH_DEFAULT 0x8000000d
191 #define USE_SOUND_TYPE 2
193 #define USE_MOUSE_TYPE 3
194 #define USE_SOUND_TYPE 8
197 #ifdef _FM77AV_VARIANTS
198 //#define CAPABLE_KANJI_CLASS2
200 #define HAS_CYCLESTEAL
201 #elif defined(_FM77_VARIANTS)
203 #define HAS_CYCLESTEAL
207 #if defined(_FM77_VARIANTS)
208 #define USE_BOOT_MODE 4
210 #define USE_BOOT_MODE 4
211 #elif defined(_FM7) || defined(_FMNEW7)
212 #define USE_BOOT_MODE 3
214 #define USE_BOOT_MODE 2
220 // 3 = WHG + OPN (+PSG)
222 // 5 = THG + OPN (+PSG)
223 // 6 = THG + WHG (+PSG)
224 // 7 = THG + WHG + OPN (+PSG)
227 #define SOUND_TYPE_DEFAULT 0
228 #elif defined(_FM7) || defined(_FMNEW7) || defined(_FM77_VARIANTS)
230 #define SOUND_TYPE_DEFAULT 0
231 #elif defined(_FM77AV_VARIANTS)
233 #define SOUND_TYPE_DEFAULT 1
237 #define USE_SOUND_VOLUME 5
239 #define USE_SOUND_VOLUME 11
241 #define SUPPORT_TV_RENDER
243 #define IGNORE_DISK_CRC_DEFAULT true
244 // device informations for virtual machine
246 // TODO: check refresh rate
247 #define FRAMES_PER_SEC 59.94
248 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || defined(_FM77L4)
249 #define LINES_PER_FRAME 400
251 #define LINES_PER_FRAME 200
254 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
255 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
256 #define CPU_CLOCKS 2016000
258 #define CPU_CLOCKS 1095000
260 #define CPU_CLOCKS 2000000
264 * If you wish to use software-scanline, define below.
267 #define FIXED_FRAMEBUFFER_SIZE
269 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || defined(_FM77L4)
270 #define SCREEN_WIDTH 640
271 #define SCREEN_HEIGHT 400
272 #undef SCREEN_FAKE_WIDTH
273 #undef SCREEN_FAKE_HEIGHT
274 #else /* Not have 400 line */
275 #define SCREEN_WIDTH 640
276 #define SCREEN_HEIGHT 200
277 # if defined(FIXED_FRAMEBUFFER_SIZE)
278 #define SCREEN_FAKE_WIDTH 640
279 #define SCREEN_FAKE_HEIGHT 400
281 #define SCREEN_FAKE_WIDTH 640
282 #define SCREEN_FAKE_HEIGHT 200
284 # if !defined(FIXED_FRAMEBUFFER_SIZE)
285 //#define SCREEN_Y_ZOOM 2.0
286 #define SCREEN_Y_ZOOM 2.0
290 #define WINDOW_HEIGHT_ASPECT 480
292 #define MB8877_MAX_CHIPS 1
293 //#define IO_ADDR_MAX 0x10000
295 // device informations for win32
311 // DIP Switch description
312 #define SWITCH_CYCLESTEAL 0x00000001
314 #define SWITCH_URA_RAM 0x00000002
316 #define SWITCH_URA_RAM 0x00000000
318 #define SWITCH_INVERT_CMT 0x00000004
320 // Belows are optional Hardwares.
321 #if !defined(_FM77_VARIANTS) && !defined(_FM77AV_VARIANTS)
322 #define SWITCH_FDC 0x00010000
324 #define SWITCH_FDC 0x00000000
326 #if !defined(_FM77_VARIANTS) && !defined(_FM77AV_VARIANTS)
327 #define SWITCH_Z80 0x00020000
329 #define SWITCH_Z80 0x00000000
331 #if defined(_FM77_VARIANTS)
332 #define SWITCH_DICTCARD 0x00040000
334 #define SWITCH_DICTCARD 0x00000000
336 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
337 #define SWITCH_EXTRA_RAM 0x00080000
339 #define SWITCH_EXTRA_RAM 0x00000000
341 #define MB8877_NO_BUSY_AFTER_SEEK
343 //#define ENABLE_OPENCL // If OpenCL renderer is enabled, define here.
345 //#include "../../config.h"
346 #include "../../common.h"
347 #include "../../fileio.h"
349 #ifdef USE_SOUND_VOLUME
350 static const _TCHAR *sound_device_caption[] = {
358 # if !defined(_FM77AV_VARIANTS)
361 _T("OPN (FM)"), _T("OPN (PSG)"), _T("WHG (FM)"), _T("WHG (PSG)"), _T("THG (FM)"), _T("THG (PSG)"),
362 _T("Beep"), _T("CMT (Signal)"),
363 # if defined(_FM77AV_VARIANTS)
366 _T("Noise (FDD)"), _T("Noise (CMT)"),
370 #ifdef USE_JOY_BUTTON_CAPTIONS
371 static const _TCHAR *joy_button_captions[] = {
376 _T("Button #1(1st)"),
377 _T("Button #2(1st)"),
378 _T("Button #1(2nd)"),
379 _T("Button #2(2nd)"),
388 #if defined(_FM77AV_VARIANTS)
397 #if defined(USE_AY_3_8910_AS_PSG) && !defined(_FM77AV_VARIANTS)
404 #if defined(_FM77AV_VARIANTS)
407 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
408 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
422 #ifdef CAPABLE_JCOMMCARD
434 FM7_MAINMEM* mainmem;
439 # if defined(USE_AY_3_8910_AS_PSG)
447 # if !defined(_FM77AV_VARIANTS)
448 # if defined(USE_AY_3_8910_AS_PSG)
451 YM2203* psg; // Is right? AY-3-8910 is right device.
456 BUBBLECASETTE *bubble_casette[2];
471 AND *g_substat_display;
472 AND *g_substat_mainhalt;
475 DEVICE* inteli_mouse;
479 #if defined(_FM77AV_VARIANTS)
489 KANJIROM *kanjiclass1;
490 #ifdef CAPABLE_KANJI_CLASS2
491 KANJIROM *kanjiclass2;
493 #if defined(CAPABLE_JCOMMCARD)
495 FM7_JCOMMCARD *jcommcard;
497 bool connect_320kfdc;
500 // ----------------------------------------
502 // ----------------------------------------
507 // ----------------------------------------
508 // for emulation class
509 // ----------------------------------------
511 // drive virtual machine
513 void special_reset();
515 double get_frame_rate();
519 DEVICE *get_cpu(int index);
521 void initialize(void);
522 void connect_bus(void);
524 void update_dipswitch(void);
529 void initialize_sound(int rate, int samples);
530 uint16_t* create_sound(int* extra_frames);
531 int get_sound_buffer_ptr();
532 #ifdef USE_SOUND_VOLUME
533 void set_sound_device_volume(int ch, int decibel_l, int decibel_r);
537 void key_down(int code, bool repeat);
538 void key_up(int code);
539 bool get_caps_locked();
540 bool get_kana_locked();
541 uint32_t get_extra_leds();
544 void open_floppy_disk(int drv, const _TCHAR* file_path, int bank);
545 void close_floppy_disk(int drv);
546 bool is_floppy_disk_inserted(int drv);
547 void is_floppy_disk_protected(int drv, bool value);
548 bool is_floppy_disk_protected(int drv);
549 uint32_t is_floppy_disk_accessed();
551 void play_tape(int drv, const _TCHAR* file_path);
552 void rec_tape(int drv, const _TCHAR* file_path);
553 void close_tape(int drv);
554 bool is_tape_inserted(int drv);
555 bool is_tape_playing(int drv);
556 bool is_tape_recording(int drv);
557 int get_tape_position(int drv);
558 const _TCHAR* get_tape_message(int drv);
560 bool is_frame_skippable();
561 void push_play(int drv);
562 void push_stop(int drv);
563 void push_fast_forward(int drv);
564 void push_fast_rewind(int drv);
565 void push_apss_forward(int drv);
566 void push_apss_rewind(int drv);
567 void update_config();
568 void save_state(FILEIO* state_fio);
569 bool load_state(FILEIO* state_fio);
570 #if defined(USE_BUBBLE1)
571 void open_bubble_casette(int drv, const _TCHAR *path, int bank);
572 void close_bubble_casette(int drv);
573 bool is_bubble_casette_inserted(int drv);
574 bool is_bubble_casette_protected(int drv);
575 void is_bubble_casette_protected(int drv, bool flag);
577 #if defined(USE_DIG_RESOLUTION)
578 void get_screen_resolution(int *w, int *h);
580 #if defined(USE_MINIMUM_RENDERING)
581 bool is_screen_changed(void);
583 // ----------------------------------------
585 // ----------------------------------------
586 void set_cpu_clock(DEVICE *cpu, uint32_t clocks);
588 DEVICE* get_device(int id);
590 DEVICE* first_device;