2 FUJITSU FM7 Emulator 'eFM7'
17 #define USE_CPU_TYPE 2
18 #define USE_SPECIAL_RESET 1
19 #define USE_LED_DEVICE 3
20 #define USE_MINIMUM_RENDERING 1
23 #define USE_JOY_BUTTON_CAPTIONS
25 #define USE_PRINTER_TYPE 4
26 #define USE_AY_3_8910_AS_PSG
28 #define INDEPENDENT_CAPS_KANA_LED
29 #define USE_KEY_LOCKED
30 #define USE_AUTO_KEY 5
31 #define USE_AUTO_KEY_RELEASE 6
32 #define USE_AUTO_KEY_NUMPAD
33 #define USE_SCREEN_FILTER
37 #define USE_DIG_RESOLUTION
39 #define CPU_TYPE_DEFAULT 0
42 #define DEVICE_NAME "FUJITSU FM-8"
43 #define CONFIG_NAME "fm8"
45 #define DIPSWITCH_DEFAULT 0x00000000
47 #define BASE_BUBBLE_NUM 0
50 #undef CPU_TYPE_DEFAULT
51 #define CPU_TYPE_DEFAULT 1
52 #define USE_GREEN_DISPLAY
53 #define USE_MONITOR_TYPE 2
56 #define DEVICE_NAME "FUJITSU FM-7"
57 #define CONFIG_NAME "fm7"
59 #define DIPSWITCH_DEFAULT 0x000000000
61 #define CAPABLE_JCOMMCARD 1
62 #define USE_GREEN_DISPLAY
63 #define USE_MONITOR_TYPE 2
65 #elif defined(_FMNEW7)
66 #define DEVICE_NAME "FUJITSU FM-NEW7"
67 #define CONFIG_NAME "fmnew7"
69 #define DIPSWITCH_DEFAULT 0x000000000
71 #define CAPABLE_JCOMMCARD 1
72 #define USE_GREEN_DISPLAY
73 #define USE_MONITOR_TYPE 2
75 #elif defined(_FM77) || defined(_FM77L2)
77 #define DEVICE_NAME "FUJITSU FM-77"
78 #define CONFIG_NAME "fm77"
79 #define DIPSWITCH_DEFAULT 0x00000001
81 #define DEVICE_NAME "FUJITSU FM-77L2"
82 #define CONFIG_NAME "fm77l2"
83 #define DIPSWITCH_DEFAULT 0x00000003
85 //#define USE_DRIVE_TYPE
86 #define _FM77_VARIANTS
88 # ifndef FM77_EXRAM_BANKS
89 # define FM77_EXRAM_BANKS 3
92 #define CAPABLE_JCOMMCARD 1
94 #define USE_GREEN_DISPLAY
95 #define USE_MONITOR_TYPE 2
97 #elif defined(_FM77L4)
98 #define DEVICE_NAME "FUJITSU FM-77L4"
99 #define CONFIG_NAME "fm77l4"
102 #define HAS_CYCLESTEAL
103 #define HAS_400LINECARD
104 //#define CAPABLE_KANJI_CLASS2
105 #define _FM77_VARIANTS
107 # ifndef FM77_EXRAM_BANKS
108 # define FM77_EXRAM_BANKS 3
110 #define DIPSWITCH_DEFAULT 0x00000003
112 #define CAPABLE_JCOMMCARD 1
113 #define USE_GREEN_DISPLAY
114 #define USE_MONITOR_TYPE 2
116 #elif defined(_FM77AV)
117 #define DEVICE_NAME "FUJITSU FM77AV"
118 #define CONFIG_NAME "fm77av"
119 #define _FM77AV_VARIANTS
120 #define DIPSWITCH_DEFAULT 0x80000001
122 #define CAPABLE_JCOMMCARD 1
123 #define CAPABLE_DICTROM
125 #elif defined(_FM77AV20)
126 #define DEVICE_NAME "FUJITSU FM77AV20"
127 #define CONFIG_NAME "fm77av20"
128 #define _FM77AV_VARIANTS
130 #define CAPABLE_DICTROM
131 //#define USE_DRIVE_TYPE 2
132 #define CAPABLE_KANJI_CLASS2
133 #define DIPSWITCH_DEFAULT 0x80000001
136 #elif defined(_FM77AV20EX)
137 #define DEVICE_NAME "FUJITSU FM77AV20EX"
138 #define CONFIG_NAME "fm77av20ex"
139 #define _FM77AV_VARIANTS
142 //#define USE_DRIVE_TYPE 2
143 #define CAPABLE_DICTROM
144 #define CAPABLE_KANJI_CLASS2
145 #define DIPSWITCH_DEFAULT 0x80000001
148 #elif defined(_FM77AV40)
149 #define DEVICE_NAME "FUJITSU FM77AV40"
150 #define CONFIG_NAME "fm77av40"
151 #define _FM77AV_VARIANTS
154 //#define USE_DRIVE_TYPE 2
155 #define CAPABLE_DICTROM
156 #define HAS_400LINE_AV
157 #define CAPABLE_KANJI_CLASS2
158 #ifndef FM77_EXRAM_BANKS
159 #define FM77_EXRAM_BANKS 12
161 #define DIPSWITCH_DEFAULT 0x8000000d
164 #elif defined(_FM77AV40EX)
165 #define DEVICE_NAME "FUJITSU FM77AV40EX"
166 #define CONFIG_NAME "fm77av40ex"
167 #define _FM77AV_VARIANTS
170 //#define USE_DRIVE_TYPE 2
171 #define CAPABLE_DICTROM
172 #define HAS_400LINE_AV
173 #define CAPABLE_KANJI_CLASS2
174 #ifndef FM77_EXRAM_BANKS
175 #define FM77_EXRAM_BANKS 12
177 #define DIPSWITCH_DEFAULT 0x8000000d
180 #elif defined(_FM77AV40SX)
181 #define DEVICE_NAME "FUJITSU FM77AV40SX"
182 #define CONFIG_NAME "fm77av40sx"
183 #define _FM77AV_VARIANTS
186 //#define USE_DRIVE_TYPE 2
187 #define CAPABLE_DICTROM
188 #define HAS_400LINE_AV
189 #define CAPABLE_KANJI_CLASS2
190 # ifndef FM77_EXRAM_BANKS
191 # define FM77_EXRAM_BANKS 12
193 #define DIPSWITCH_DEFAULT 0x8000000d
199 #define USE_SOUND_TYPE 2
201 #define USE_MOUSE_TYPE 3
202 #define USE_SOUND_TYPE 8
205 #ifdef _FM77AV_VARIANTS
207 #define HAS_CYCLESTEAL
208 #elif defined(_FM77_VARIANTS)
210 #define HAS_CYCLESTEAL
214 #define USE_BOOT_MODE 8
219 // 3 = WHG + OPN (+PSG)
221 // 5 = THG + OPN (+PSG)
222 // 6 = THG + WHG (+PSG)
223 // 7 = THG + WHG + OPN (+PSG)
226 #define SOUND_TYPE_DEFAULT 0
227 #elif defined(_FM7) || defined(_FMNEW7) || defined(_FM77_VARIANTS)
229 #define SOUND_TYPE_DEFAULT 0
230 #elif defined(_FM77AV_VARIANTS)
232 #define SOUND_TYPE_DEFAULT 1
236 #define USE_SOUND_VOLUME 5
238 #define USE_SOUND_VOLUME 11
241 #define SUPPORT_TV_RENDER
242 #define SUPPORT_QUERY_PHY_KEY_NAME
243 #define IGNORE_DISK_CRC_DEFAULT true
244 // device informations for virtual machine
246 // TODO: check refresh rate
247 //#define FRAMES_PER_SEC 60.0962 /* Related to display.cpp */
248 #define FRAMES_PER_SEC 59.94 /* Related to display.cpp */
249 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || defined(_FM77L4)
250 #define LINES_PER_FRAME 400
252 #define LINES_PER_FRAME 200
255 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
256 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
257 #define CPU_CLOCKS 2016000 /* 2016 */
259 #define CPU_CLOCKS 1798000 /* FM8,7 - 77AV/20? */
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 */
276 #define SCREEN_WIDTH 640
277 #define SCREEN_HEIGHT 200
278 # if defined(FIXED_FRAMEBUFFER_SIZE)
279 # define SCREEN_FAKE_WIDTH 640
280 # define SCREEN_FAKE_HEIGHT 400
282 # define SCREEN_FAKE_WIDTH 640
283 # define SCREEN_FAKE_HEIGHT 200
286 # if !defined(FIXED_FRAMEBUFFER_SIZE)
287 # define SCREEN_Y_ZOOM 2.0
291 #define WINDOW_HEIGHT_ASPECT 480
293 #define MB8877_MAX_CHIPS 1
294 #define MB8877_DELAY_AFTER_SEEK 60000
295 //#define IO_ADDR_MAX 0x10000
297 // device informations for win32
299 #define USE_FLOPPY_DISK 4
301 #define USE_FLOPPY_DISK 2
303 #define BASE_FLOPPY_DISK_NUM 0
309 // DIP Switch description
310 #define SWITCH_CYCLESTEAL 0x00000001
312 #define SWITCH_URA_RAM 0x00000002
314 #define SWITCH_URA_RAM 0x00000000
316 #define SWITCH_INVERT_CMT 0x00000004
318 // Belows are optional Hardwares.
319 #if !defined(_FM77_VARIANTS) && !defined(_FM77AV_VARIANTS)
320 #define SWITCH_FDC 0x00010000
322 #define SWITCH_FDC 0x00000000
324 #if !defined(_FM77_VARIANTS) && !defined(_FM77AV_VARIANTS)
325 #define SWITCH_Z80 0x00020000
327 #define SWITCH_Z80 0x00000000
329 #if defined(_FM77_VARIANTS)
330 #define SWITCH_DICTCARD 0x00040000
332 #define SWITCH_DICTCARD 0x00000000
334 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
335 #define SWITCH_EXTRA_RAM 0x00080000
337 #define SWITCH_EXTRA_RAM 0x00000000
339 #define MB8877_NO_BUSY_AFTER_SEEK
341 //#define ENABLE_OPENCL // If OpenCL renderer is enabled, define here.
342 #if defined(_FM77_VARIANTS) || defined(_FM77AV_VARIANTS)
343 #define USE_FLOPPY_TYPE_BIT 0x0003 /* 5.0, 5.0, 3.5, 3.5 */
345 #define USE_FLOPPY_TYPE_BIT 0x0000 /* 5.0, 5.0, 5.0, 5.0 */
347 //#include "../../config.h"
348 #include "../../common.h"
349 #include "../../fileio.h"
350 #include "../vm_template.h"
352 #ifdef USE_SOUND_VOLUME
353 static const _TCHAR *sound_device_caption[] = {
358 _T("Noise (320KB FDD)"),
361 # if !defined(_FM77AV_VARIANTS)
364 _T("OPN (FM)"), _T("OPN (PSG)"), _T("WHG (FM)"), _T("WHG (PSG)"), _T("THG (FM)"), _T("THG (PSG)"),
365 _T("Beep"), _T("CMT (Signal)"),
366 # if defined(_FM77AV_VARIANTS)
369 _T("Noise (320KB FDD)"),
370 # if defined(HAS_2HD)
371 _T("Noise (1MB FDD/2HD)"),
377 #ifdef USE_JOY_BUTTON_CAPTIONS
378 static const _TCHAR *joy_button_captions[] = {
383 _T("Button #1(1st)"),
384 _T("Button #2(1st)"),
385 _T("Button #1(2nd)"),
386 _T("Button #2(2nd)"),
392 * Below defines are for EVENT::run_cpu().
393 * Please see event.cpp for details.
394 * 20180317 -- K.Ohta.
397 #define USE_CPU_MC6809
398 #if defined(WITH_Z80)
408 #if defined(USE_AY_3_8910_AS_PSG) && !defined(_FM77AV_VARIANTS)
411 #if defined(_FM77AV_VARIANTS)
428 #if defined(_FM77AV_VARIANTS)
431 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
432 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
437 #if defined(USE_BUBBLE)
441 #ifdef CAPABLE_JCOMMCARD
455 class VM : public VM_TEMPLATE
464 FM7::FM7_MAINMEM* mainmem;
466 FM7::FM8_MAINIO* mainio;
468 FM7::FM7_MAINIO* mainio;
476 # if defined(USE_AY_3_8910_AS_PSG)
484 # if !defined(_FM77AV_VARIANTS)
485 # if defined(USE_AY_3_8910_AS_PSG)
488 YM2203* psg; // Is right? AY-3-8910 is right device.
492 #if defined(USE_BUBBLE)
493 FM7::BUBBLECASETTE *bubble_casette[USE_BUBBLE];
496 # if defined(_FM77AV20) || defined(_FM77AV40) || defined(_FM77AV20EX) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
503 FM7::JOYSTICK *joystick;
513 AND *g_substat_display;
514 AND *g_substat_mainhalt;
517 DEVICE* inteli_mouse;
520 #if defined(_FM77AV_VARIANTS)
527 FM7::DISPLAY* display;
528 FM7::KEYBOARD* keyboard;
530 FM7::KANJIROM *kanjiclass1;
531 #ifdef CAPABLE_KANJI_CLASS2
532 FM7::KANJIROM *kanjiclass2;
534 #if defined(CAPABLE_JCOMMCARD)
536 FM7::FM7_JCOMMCARD *jcommcard;
542 bool connect_320kfdc;
546 // ----------------------------------------
548 // ----------------------------------------
550 VM(EMU_TEMPLATE* parent_emu);
553 // ----------------------------------------
554 // for emulation class
555 // ----------------------------------------
557 // drive virtual machine
558 void reset() override;
559 void special_reset(int num) override;
561 double get_frame_rate() override;
565 DEVICE *get_cpu(int index) override;
567 void connect_bus(void);
569 void update_dipswitch(void) override;
571 void draw_screen() override;
574 void initialize_sound(int rate, int samples) override;
575 uint16_t* create_sound(int* extra_frames) override;
576 int get_sound_buffer_ptr() override;
577 #ifdef USE_SOUND_VOLUME
578 void set_sound_device_volume(int ch, int decibel_l, int decibel_r) override;
580 void set_vm_frame_rate(double fps) override;
582 void key_down(int code, bool repeat) override;
583 void key_up(int code) override;
584 bool get_caps_locked() override;
585 bool get_kana_locked() override;
586 uint32_t get_led_status() override;
589 void open_floppy_disk(int drv, const _TCHAR* file_path, int bank) override;
590 void close_floppy_disk(int drv) override;
591 bool is_floppy_disk_inserted(int drv) override;
592 void is_floppy_disk_protected(int drv, bool value) override;
593 bool is_floppy_disk_protected(int drv) override;
594 uint32_t is_floppy_disk_accessed() override;
596 void play_tape(int drv, const _TCHAR* file_path) override;
597 void rec_tape(int drv, const _TCHAR* file_path) override;
598 void close_tape(int drv) override;
599 bool is_tape_inserted(int drv) override;
600 bool is_tape_playing(int drv) override;
601 bool is_tape_recording(int drv) override;
602 int get_tape_position(int drv) override;
603 const _TCHAR* get_tape_message(int drv) override;
605 bool is_frame_skippable() override;
606 void push_play(int drv) override;
607 void push_stop(int drv) override;
608 void push_fast_forward(int drv) override;
609 void push_fast_rewind(int drv) override;
610 void push_apss_forward(int drv) override;
611 void push_apss_rewind(int drv) override;
612 void update_config() override;
613 bool process_state(FILEIO* state_fio, bool loading);
615 #ifdef SUPPORT_QUERY_PHY_KEY_NAME
616 int get_key_name_table_size(void) override;
617 const _TCHAR *get_phy_key_name_by_scancode(uint32_t scancode) override;
618 const _TCHAR *get_phy_key_name_by_vk(uint32_t vk) override;
619 uint32_t get_scancode_by_vk(uint32_t vk) override;
620 uint32_t get_vk_by_scancode(uint32_t scancode) override;
623 #if defined(USE_BUBBLE)
624 void open_bubble_casette(int drv, const _TCHAR *path, int bank) override;
625 void close_bubble_casette(int drv) override;
626 bool is_bubble_casette_inserted(int drv) override;
627 bool is_bubble_casette_protected(int drv) override;
628 void is_bubble_casette_protected(int drv, bool flag) override;
630 #if defined(USE_DIG_RESOLUTION)
631 void get_screen_resolution(int *w, int *h) override;
633 #if defined(USE_MINIMUM_RENDERING)
634 bool is_screen_changed(void) override;
636 double get_current_usec() override;
637 uint64_t get_current_clock_uint64() override;
638 // ----------------------------------------
640 // ----------------------------------------
641 void set_cpu_clock(DEVICE *cpu, uint32_t clocks) override;
643 //DEVICE* get_device(int id);
645 // DEVICE* first_device;
646 // DEVICE* last_device;