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
28 #define SUPPORT_VARIABLE_TIMING
30 #define INDEPENDENT_CAPS_KANA_LED
31 #define NOTIFY_KEY_DOWN
32 //#define NOTIFY_KEY_UP
33 #define NOTIFY_KEY_DOWN_LR_SHIFT
34 #define NOTIFY_KEY_DOWN_LR_MENU
35 #define USE_KEY_LOCKED
36 #define USE_ALT_F10_KEY
37 #define USE_AUTO_KEY 5
38 #define USE_AUTO_KEY_RELEASE 6
39 #define USE_AUTO_KEY_NUMPAD
40 #define USE_SCREEN_FILTER
44 #define USE_DIG_RESOLUTION
46 #define CPU_TYPE_DEFAULT 0
49 #define DEVICE_NAME "FUJITSU FM-8"
50 #define CONFIG_NAME "fm8"
52 #define DIPSWITCH_DEFAULT 0x00000000
54 #define BASE_BUBBLE_NUM 0
57 #undef CPU_TYPE_DEFAULT
58 #define CPU_TYPE_DEFAULT 1
59 #define USE_GREEN_DISPLAY
60 #define USE_MONITOR_TYPE 2
63 #define DEVICE_NAME "FUJITSU FM-7"
64 #define CONFIG_NAME "fm7"
66 #define DIPSWITCH_DEFAULT 0x000000000
68 #define CAPABLE_JCOMMCARD 1
69 #define USE_GREEN_DISPLAY
70 #define USE_MONITOR_TYPE 2
72 #elif defined(_FMNEW7)
73 #define DEVICE_NAME "FUJITSU FM-NEW7"
74 #define CONFIG_NAME "fmnew7"
76 #define DIPSWITCH_DEFAULT 0x000000000
78 #define CAPABLE_JCOMMCARD 1
79 #define USE_GREEN_DISPLAY
80 #define USE_MONITOR_TYPE 2
82 #elif defined(_FM77) || defined(_FM77L2)
84 #define DEVICE_NAME "FUJITSU FM-77"
85 #define CONFIG_NAME "fm77"
86 #define DIPSWITCH_DEFAULT 0x00000001
88 #define DEVICE_NAME "FUJITSU FM-77L2"
89 #define CONFIG_NAME "fm77l2"
90 #define DIPSWITCH_DEFAULT 0x00000003
92 //#define USE_DRIVE_TYPE
93 #define _FM77_VARIANTS
95 # ifndef FM77_EXRAM_BANKS
96 # define FM77_EXRAM_BANKS 3
99 #define CAPABLE_JCOMMCARD 1
101 #define USE_GREEN_DISPLAY
102 #define USE_MONITOR_TYPE 2
104 #elif defined(_FM77L4)
105 #define DEVICE_NAME "FUJITSU FM-77L4"
106 #define CONFIG_NAME "fm77l4"
109 #define HAS_CYCLESTEAL
110 #define HAS_400LINECARD
111 //#define CAPABLE_KANJI_CLASS2
112 #define _FM77_VARIANTS
114 # ifndef FM77_EXRAM_BANKS
115 # define FM77_EXRAM_BANKS 3
117 #define DIPSWITCH_DEFAULT 0x00000003
119 #define CAPABLE_JCOMMCARD 1
120 #define USE_GREEN_DISPLAY
121 #define USE_MONITOR_TYPE 2
123 #elif defined(_FM77AV)
124 #define DEVICE_NAME "FUJITSU FM77AV"
125 #define CONFIG_NAME "fm77av"
126 #define _FM77AV_VARIANTS
127 #define DIPSWITCH_DEFAULT 0x80000001
129 #define CAPABLE_JCOMMCARD 1
130 #define CAPABLE_DICTROM
132 #elif defined(_FM77AV20)
133 #define DEVICE_NAME "FUJITSU FM77AV20"
134 #define CONFIG_NAME "fm77av20"
135 #define _FM77AV_VARIANTS
137 #define CAPABLE_DICTROM
138 //#define USE_DRIVE_TYPE 2
139 #define CAPABLE_KANJI_CLASS2
140 #define DIPSWITCH_DEFAULT 0x80000001
143 #elif defined(_FM77AV20EX)
144 #define DEVICE_NAME "FUJITSU FM77AV20EX"
145 #define CONFIG_NAME "fm77av20ex"
146 #define _FM77AV_VARIANTS
149 //#define USE_DRIVE_TYPE 2
150 #define CAPABLE_DICTROM
151 #define CAPABLE_KANJI_CLASS2
152 #define DIPSWITCH_DEFAULT 0x80000001
155 #elif defined(_FM77AV40)
156 #define DEVICE_NAME "FUJITSU FM77AV40"
157 #define CONFIG_NAME "fm77av40"
158 #define _FM77AV_VARIANTS
161 //#define USE_DRIVE_TYPE 2
162 #define CAPABLE_DICTROM
163 #define HAS_400LINE_AV
164 #define CAPABLE_KANJI_CLASS2
165 #ifndef FM77_EXRAM_BANKS
166 #define FM77_EXRAM_BANKS 12
168 #define DIPSWITCH_DEFAULT 0x8000000d
171 #elif defined(_FM77AV40EX)
172 #define DEVICE_NAME "FUJITSU FM77AV40EX"
173 #define CONFIG_NAME "fm77av40ex"
174 #define _FM77AV_VARIANTS
177 //#define USE_DRIVE_TYPE 2
178 #define CAPABLE_DICTROM
179 #define HAS_400LINE_AV
180 #define CAPABLE_KANJI_CLASS2
181 #ifndef FM77_EXRAM_BANKS
182 #define FM77_EXRAM_BANKS 12
184 #define DIPSWITCH_DEFAULT 0x8000000d
187 #elif defined(_FM77AV40SX)
188 #define DEVICE_NAME "FUJITSU FM77AV40SX"
189 #define CONFIG_NAME "fm77av40sx"
190 #define _FM77AV_VARIANTS
193 //#define USE_DRIVE_TYPE 2
194 #define CAPABLE_DICTROM
195 #define HAS_400LINE_AV
196 #define CAPABLE_KANJI_CLASS2
197 # ifndef FM77_EXRAM_BANKS
198 # define FM77_EXRAM_BANKS 12
200 #define DIPSWITCH_DEFAULT 0x8000000d
206 #define USE_SOUND_TYPE 2
208 #define USE_MOUSE_TYPE 3
209 #define USE_SOUND_TYPE 8
212 #ifdef _FM77AV_VARIANTS
214 #define HAS_CYCLESTEAL
215 #elif defined(_FM77_VARIANTS)
217 #define HAS_CYCLESTEAL
221 #define USE_BOOT_MODE 8
226 // 3 = WHG + OPN (+PSG)
228 // 5 = THG + OPN (+PSG)
229 // 6 = THG + WHG (+PSG)
230 // 7 = THG + WHG + OPN (+PSG)
233 #define SOUND_TYPE_DEFAULT 0
234 #elif defined(_FM7) || defined(_FMNEW7) || defined(_FM77_VARIANTS)
236 #define SOUND_TYPE_DEFAULT 0
237 #elif defined(_FM77AV_VARIANTS)
239 #define SOUND_TYPE_DEFAULT 1
243 #define USE_SOUND_VOLUME 5
245 #define USE_SOUND_VOLUME 11
247 #define SUPPORT_TV_RENDER
249 #define IGNORE_DISK_CRC_DEFAULT true
250 // device informations for virtual machine
252 // TODO: check refresh rate
253 //#define FRAMES_PER_SEC 60.0962 /* Related to display.cpp */
254 #define FRAMES_PER_SEC 59.94 /* Related to display.cpp */
255 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || defined(_FM77L4)
256 #define LINES_PER_FRAME 400
258 #define LINES_PER_FRAME 200
261 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
262 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
263 #define CPU_CLOCKS 2016000 /* 2016 */
265 #define CPU_CLOCKS 1798000 /* FM8,7 - 77AV/20? */
270 * If you wish to use software-scanline, define below.
273 #define FIXED_FRAMEBUFFER_SIZE
275 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || defined(_FM77L4)
276 #define SCREEN_WIDTH 640
277 #define SCREEN_HEIGHT 400
278 #undef SCREEN_FAKE_WIDTH
279 #undef SCREEN_FAKE_HEIGHT
280 #else /* Not have 400 line */
282 #define SCREEN_WIDTH 640
283 #define SCREEN_HEIGHT 200
284 # if defined(FIXED_FRAMEBUFFER_SIZE)
285 # define SCREEN_FAKE_WIDTH 640
286 # define SCREEN_FAKE_HEIGHT 400
288 # define SCREEN_FAKE_WIDTH 640
289 # define SCREEN_FAKE_HEIGHT 200
292 # if !defined(FIXED_FRAMEBUFFER_SIZE)
293 # define SCREEN_Y_ZOOM 2.0
297 #define WINDOW_HEIGHT_ASPECT 480
299 #define MB8877_MAX_CHIPS 1
300 //#define IO_ADDR_MAX 0x10000
302 // device informations for win32
304 #define USE_FLOPPY_DISK 4
306 #define USE_FLOPPY_DISK 2
308 #define BASE_FLOPPY_DISK_NUM 0
316 // DIP Switch description
317 #define SWITCH_CYCLESTEAL 0x00000001
319 #define SWITCH_URA_RAM 0x00000002
321 #define SWITCH_URA_RAM 0x00000000
323 #define SWITCH_INVERT_CMT 0x00000004
325 // Belows are optional Hardwares.
326 #if !defined(_FM77_VARIANTS) && !defined(_FM77AV_VARIANTS)
327 #define SWITCH_FDC 0x00010000
329 #define SWITCH_FDC 0x00000000
331 #if !defined(_FM77_VARIANTS) && !defined(_FM77AV_VARIANTS)
332 #define SWITCH_Z80 0x00020000
334 #define SWITCH_Z80 0x00000000
336 #if defined(_FM77_VARIANTS)
337 #define SWITCH_DICTCARD 0x00040000
339 #define SWITCH_DICTCARD 0x00000000
341 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
342 #define SWITCH_EXTRA_RAM 0x00080000
344 #define SWITCH_EXTRA_RAM 0x00000000
346 #define MB8877_NO_BUSY_AFTER_SEEK
348 //#define ENABLE_OPENCL // If OpenCL renderer is enabled, define here.
350 //#include "../../config.h"
351 #include "../../common.h"
352 #include "../../fileio.h"
353 #include "../vm_template.h"
355 #ifdef USE_SOUND_VOLUME
356 static const _TCHAR *sound_device_caption[] = {
361 _T("Noise (320KB FDD)"),
364 # if !defined(_FM77AV_VARIANTS)
367 _T("OPN (FM)"), _T("OPN (PSG)"), _T("WHG (FM)"), _T("WHG (PSG)"), _T("THG (FM)"), _T("THG (PSG)"),
368 _T("Beep"), _T("CMT (Signal)"),
369 # if defined(_FM77AV_VARIANTS)
372 _T("Noise (320KB FDD)"),
373 # if defined(HAS_2HD)
374 _T("Noise (1MB FDD/2HD)"),
380 #ifdef USE_JOY_BUTTON_CAPTIONS
381 static const _TCHAR *joy_button_captions[] = {
386 _T("Button #1(1st)"),
387 _T("Button #2(1st)"),
388 _T("Button #1(2nd)"),
389 _T("Button #2(2nd)"),
395 * Below defines are for EVENT::run_cpu().
396 * Please see event.cpp for details.
397 * 20180317 -- K.Ohta.
400 #define USE_CPU_MC6809
401 #if defined(WITH_Z80)
410 #if defined(_FM77AV_VARIANTS)
423 #if defined(USE_AY_3_8910_AS_PSG) && !defined(_FM77AV_VARIANTS)
426 #if defined(USE_BUBBLE)
430 #if defined(_FM77AV_VARIANTS)
433 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
434 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
453 #ifdef CAPABLE_JCOMMCARD
456 class csp_state_utils;
458 class VM : public VM_TEMPLATE
468 FM7_MAINMEM* mainmem;
480 # if defined(USE_AY_3_8910_AS_PSG)
488 # if !defined(_FM77AV_VARIANTS)
489 # if defined(USE_AY_3_8910_AS_PSG)
492 YM2203* psg; // Is right? AY-3-8910 is right device.
496 #if defined(USE_BUBBLE)
497 BUBBLECASETTE *bubble_casette[USE_BUBBLE];
500 # if defined(_FM77AV20) || defined(_FM77AV40) || defined(_FM77AV20EX) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
517 AND *g_substat_display;
518 AND *g_substat_mainhalt;
521 DEVICE* inteli_mouse;
524 #if defined(_FM77AV_VARIANTS)
534 KANJIROM *kanjiclass1;
535 #ifdef CAPABLE_KANJI_CLASS2
536 KANJIROM *kanjiclass2;
538 #if defined(CAPABLE_JCOMMCARD)
540 FM7_JCOMMCARD *jcommcard;
546 bool connect_320kfdc;
549 //csp_state_utils *state_entry;
551 // ----------------------------------------
553 // ----------------------------------------
558 // ----------------------------------------
559 // for emulation class
560 // ----------------------------------------
562 // drive virtual machine
564 void special_reset();
566 double get_frame_rate();
570 DEVICE *get_cpu(int index);
572 void connect_bus(void);
574 void update_dipswitch(void);
579 void initialize_sound(int rate, int samples);
580 uint16_t* create_sound(int* extra_frames);
581 int get_sound_buffer_ptr();
582 #ifdef USE_SOUND_VOLUME
583 void set_sound_device_volume(int ch, int decibel_l, int decibel_r);
585 void set_vm_frame_rate(double fps);
588 void key_down(int code, bool repeat);
589 void key_up(int code);
590 bool get_caps_locked();
591 bool get_kana_locked();
592 uint32_t get_led_status();
595 void open_floppy_disk(int drv, const _TCHAR* file_path, int bank);
596 void close_floppy_disk(int drv);
597 bool is_floppy_disk_inserted(int drv);
598 void is_floppy_disk_protected(int drv, bool value);
599 bool is_floppy_disk_protected(int drv);
600 uint32_t is_floppy_disk_accessed();
602 void play_tape(int drv, const _TCHAR* file_path);
603 void rec_tape(int drv, const _TCHAR* file_path);
604 void close_tape(int drv);
605 bool is_tape_inserted(int drv);
606 bool is_tape_playing(int drv);
607 bool is_tape_recording(int drv);
608 int get_tape_position(int drv);
609 const _TCHAR* get_tape_message(int drv);
611 bool is_frame_skippable();
612 void push_play(int drv);
613 void push_stop(int drv);
614 void push_fast_forward(int drv);
615 void push_fast_rewind(int drv);
616 void push_apss_forward(int drv);
617 void push_apss_rewind(int drv);
618 void update_config();
619 bool process_state(FILEIO* state_fio, bool loading);
621 #if defined(USE_BUBBLE)
622 void open_bubble_casette(int drv, const _TCHAR *path, int bank);
623 void close_bubble_casette(int drv);
624 bool is_bubble_casette_inserted(int drv);
625 bool is_bubble_casette_protected(int drv);
626 void is_bubble_casette_protected(int drv, bool flag);
628 #if defined(USE_DIG_RESOLUTION)
629 void get_screen_resolution(int *w, int *h);
631 #if defined(USE_MINIMUM_RENDERING)
632 bool is_screen_changed(void);
634 // ----------------------------------------
636 // ----------------------------------------
637 void set_cpu_clock(DEVICE *cpu, uint32_t clocks);
639 DEVICE* get_device(int id);
641 // DEVICE* first_device;
642 // DEVICE* last_device;