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
45 #define CPU_TYPE_DEFAULT 0
48 #define DEVICE_NAME "FUJITSU FM-8"
49 #define CONFIG_NAME "fm8"
51 #define DIPSWITCH_DEFAULT 0x00000000
57 #undef CPU_TYPE_DEFAULT
58 #define CPU_TYPE_DEFAULT 1
61 #define DEVICE_NAME "FUJITSU FM-7"
62 #define CONFIG_NAME "fm7"
64 #define DIPSWITCH_DEFAULT 0x000000000
66 #define CAPABLE_JCOMMCARD 1
67 #elif defined(_FMNEW7)
68 #define DEVICE_NAME "FUJITSU FM-NEW7"
69 #define CONFIG_NAME "fmnew7"
71 #define DIPSWITCH_DEFAULT 0x000000000
73 #define CAPABLE_JCOMMCARD 1
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
95 #elif defined(_FM77L4)
96 #define DEVICE_NAME "FUJITSU FM-77L4"
97 #define CONFIG_NAME "fm77l4"
100 #define HAS_CYCLESTEAL
101 #define HAS_400LINECARD
102 //#define CAPABLE_KANJI_CLASS2
103 #define _FM77_VARIANTS
105 # ifndef FM77_EXRAM_BANKS
106 # define FM77_EXRAM_BANKS 3
108 #define DIPSWITCH_DEFAULT 0x00000003
110 #define CAPABLE_JCOMMCARD 1
112 #elif defined(_FM77AV)
113 #define DEVICE_NAME "FUJITSU FM77AV"
114 #define CONFIG_NAME "fm77av"
115 #define _FM77AV_VARIANTS
116 #define DIPSWITCH_DEFAULT 0x80000001
118 #define CAPABLE_JCOMMCARD 1
119 #define CAPABLE_DICTROM
121 #elif defined(_FM77AV20)
122 #define DEVICE_NAME "FUJITSU FM77AV20"
123 #define CONFIG_NAME "fm77av20"
124 #define _FM77AV_VARIANTS
126 #define CAPABLE_DICTROM
127 //#define USE_DRIVE_TYPE 2
128 #define CAPABLE_KANJI_CLASS2
129 #define DIPSWITCH_DEFAULT 0x80000001
132 #elif defined(_FM77AV20EX)
133 #define DEVICE_NAME "FUJITSU FM77AV20EX"
134 #define CONFIG_NAME "fm77av20ex"
135 #define _FM77AV_VARIANTS
138 //#define USE_DRIVE_TYPE 2
139 #define CAPABLE_DICTROM
140 #define CAPABLE_KANJI_CLASS2
141 #define DIPSWITCH_DEFAULT 0x80000001
144 #elif defined(_FM77AV40)
145 #define DEVICE_NAME "FUJITSU FM77AV40"
146 #define CONFIG_NAME "fm77av40"
147 #define _FM77AV_VARIANTS
150 //#define USE_DRIVE_TYPE 2
151 #define CAPABLE_DICTROM
152 #define HAS_400LINE_AV
153 #define CAPABLE_KANJI_CLASS2
154 #ifndef FM77_EXRAM_BANKS
155 #define FM77_EXRAM_BANKS 12
157 #define DIPSWITCH_DEFAULT 0x8000000d
160 #elif defined(_FM77AV40EX)
161 #define DEVICE_NAME "FUJITSU FM77AV40EX"
162 #define CONFIG_NAME "fm77av40ex"
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
176 #elif defined(_FM77AV40SX)
177 #define DEVICE_NAME "FUJITSU FM77AV40SX"
178 #define CONFIG_NAME "fm77av40sx"
179 #define _FM77AV_VARIANTS
182 //#define USE_DRIVE_TYPE 2
183 #define CAPABLE_DICTROM
184 #define HAS_400LINE_AV
185 #define CAPABLE_KANJI_CLASS2
186 # ifndef FM77_EXRAM_BANKS
187 # define FM77_EXRAM_BANKS 12
189 #define DIPSWITCH_DEFAULT 0x8000000d
195 #define USE_SOUND_TYPE 2
197 #define USE_MOUSE_TYPE 3
198 #define USE_SOUND_TYPE 8
201 #ifdef _FM77AV_VARIANTS
203 #define HAS_CYCLESTEAL
204 #elif defined(_FM77_VARIANTS)
206 #define HAS_CYCLESTEAL
210 #define USE_BOOT_MODE 8
215 // 3 = WHG + OPN (+PSG)
217 // 5 = THG + OPN (+PSG)
218 // 6 = THG + WHG (+PSG)
219 // 7 = THG + WHG + OPN (+PSG)
222 #define SOUND_TYPE_DEFAULT 0
223 #elif defined(_FM7) || defined(_FMNEW7) || defined(_FM77_VARIANTS)
225 #define SOUND_TYPE_DEFAULT 0
226 #elif defined(_FM77AV_VARIANTS)
228 #define SOUND_TYPE_DEFAULT 1
232 #define USE_SOUND_VOLUME 5
234 #define USE_SOUND_VOLUME 11
236 #define SUPPORT_TV_RENDER
238 #define IGNORE_DISK_CRC_DEFAULT true
239 // device informations for virtual machine
241 // TODO: check refresh rate
242 #define FRAMES_PER_SEC 59.94
243 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || defined(_FM77L4)
244 #define LINES_PER_FRAME 400
246 #define LINES_PER_FRAME 200
249 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
250 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
251 #define CPU_CLOCKS 2016000
253 #define CPU_CLOCKS 1095000
255 #define CPU_CLOCKS 2000000
259 * If you wish to use software-scanline, define below.
262 #define FIXED_FRAMEBUFFER_SIZE
264 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || defined(_FM77L4)
265 #define SCREEN_WIDTH 640
266 #define SCREEN_HEIGHT 400
267 #undef SCREEN_FAKE_WIDTH
268 #undef SCREEN_FAKE_HEIGHT
269 #else /* Not have 400 line */
271 #define SCREEN_WIDTH 640
272 #define SCREEN_HEIGHT 200
273 # if defined(FIXED_FRAMEBUFFER_SIZE)
274 # define SCREEN_FAKE_WIDTH 640
275 # define SCREEN_FAKE_HEIGHT 400
277 # define SCREEN_FAKE_WIDTH 640
278 # define SCREEN_FAKE_HEIGHT 200
281 # if !defined(FIXED_FRAMEBUFFER_SIZE)
282 # define SCREEN_Y_ZOOM 2.0
286 #define WINDOW_HEIGHT_ASPECT 480
288 #define MB8877_MAX_CHIPS 1
289 //#define IO_ADDR_MAX 0x10000
291 // device informations for win32
307 // DIP Switch description
308 #define SWITCH_CYCLESTEAL 0x00000001
310 #define SWITCH_URA_RAM 0x00000002
312 #define SWITCH_URA_RAM 0x00000000
314 #define SWITCH_INVERT_CMT 0x00000004
316 // Belows are optional Hardwares.
317 #if !defined(_FM77_VARIANTS) && !defined(_FM77AV_VARIANTS)
318 #define SWITCH_FDC 0x00010000
320 #define SWITCH_FDC 0x00000000
322 #if !defined(_FM77_VARIANTS) && !defined(_FM77AV_VARIANTS)
323 #define SWITCH_Z80 0x00020000
325 #define SWITCH_Z80 0x00000000
327 #if defined(_FM77_VARIANTS)
328 #define SWITCH_DICTCARD 0x00040000
330 #define SWITCH_DICTCARD 0x00000000
332 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
333 #define SWITCH_EXTRA_RAM 0x00080000
335 #define SWITCH_EXTRA_RAM 0x00000000
337 #define MB8877_NO_BUSY_AFTER_SEEK
339 //#define ENABLE_OPENCL // If OpenCL renderer is enabled, define here.
341 //#include "../../config.h"
342 #include "../../common.h"
343 #include "../../fileio.h"
345 #ifdef USE_SOUND_VOLUME
346 static const _TCHAR *sound_device_caption[] = {
351 _T("Noise (320KB FDD)"),
354 # if !defined(_FM77AV_VARIANTS)
357 _T("OPN (FM)"), _T("OPN (PSG)"), _T("WHG (FM)"), _T("WHG (PSG)"), _T("THG (FM)"), _T("THG (PSG)"),
358 _T("Beep"), _T("CMT (Signal)"),
359 # if defined(_FM77AV_VARIANTS)
362 _T("Noise (320KB FDD)"),
363 # if defined(HAS_2HD)
364 _T("Noise (1MB FDD/2HD)"),
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)
398 #if defined(USE_AY_3_8910_AS_PSG) && !defined(_FM77AV_VARIANTS)
405 #if defined(_FM77AV_VARIANTS)
408 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
409 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
428 #ifdef CAPABLE_JCOMMCARD
440 FM7_MAINMEM* mainmem;
452 # if defined(USE_AY_3_8910_AS_PSG)
460 # if !defined(_FM77AV_VARIANTS)
461 # if defined(USE_AY_3_8910_AS_PSG)
464 YM2203* psg; // Is right? AY-3-8910 is right device.
469 BUBBLECASETTE *bubble_casette[2];
472 # if defined(_FM77AV20) || defined(_FM77AV40) || defined(_FM77AV20EX) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
489 AND *g_substat_display;
490 AND *g_substat_mainhalt;
493 DEVICE* inteli_mouse;
496 #if defined(_FM77AV_VARIANTS)
506 KANJIROM *kanjiclass1;
507 #ifdef CAPABLE_KANJI_CLASS2
508 KANJIROM *kanjiclass2;
510 #if defined(CAPABLE_JCOMMCARD)
512 FM7_JCOMMCARD *jcommcard;
515 bool connect_320kfdc;
518 // ----------------------------------------
520 // ----------------------------------------
525 // ----------------------------------------
526 // for emulation class
527 // ----------------------------------------
529 // drive virtual machine
531 void special_reset();
533 double get_frame_rate();
537 DEVICE *get_cpu(int index);
539 void initialize(void);
540 void connect_bus(void);
542 void update_dipswitch(void);
547 void initialize_sound(int rate, int samples);
548 uint16_t* create_sound(int* extra_frames);
549 int get_sound_buffer_ptr();
550 #ifdef USE_SOUND_VOLUME
551 void set_sound_device_volume(int ch, int decibel_l, int decibel_r);
555 void key_down(int code, bool repeat);
556 void key_up(int code);
557 bool get_caps_locked();
558 bool get_kana_locked();
559 uint32_t get_extra_leds();
562 void open_floppy_disk(int drv, const _TCHAR* file_path, int bank);
563 void close_floppy_disk(int drv);
564 bool is_floppy_disk_inserted(int drv);
565 void is_floppy_disk_protected(int drv, bool value);
566 bool is_floppy_disk_protected(int drv);
567 uint32_t is_floppy_disk_accessed();
569 void play_tape(int drv, const _TCHAR* file_path);
570 void rec_tape(int drv, const _TCHAR* file_path);
571 void close_tape(int drv);
572 bool is_tape_inserted(int drv);
573 bool is_tape_playing(int drv);
574 bool is_tape_recording(int drv);
575 int get_tape_position(int drv);
576 const _TCHAR* get_tape_message(int drv);
578 bool is_frame_skippable();
579 void push_play(int drv);
580 void push_stop(int drv);
581 void push_fast_forward(int drv);
582 void push_fast_rewind(int drv);
583 void push_apss_forward(int drv);
584 void push_apss_rewind(int drv);
585 void update_config();
586 void save_state(FILEIO* state_fio);
587 bool load_state(FILEIO* state_fio);
588 #if defined(USE_BUBBLE1)
589 void open_bubble_casette(int drv, const _TCHAR *path, int bank);
590 void close_bubble_casette(int drv);
591 bool is_bubble_casette_inserted(int drv);
592 bool is_bubble_casette_protected(int drv);
593 void is_bubble_casette_protected(int drv, bool flag);
595 #if defined(USE_DIG_RESOLUTION)
596 void get_screen_resolution(int *w, int *h);
598 #if defined(USE_MINIMUM_RENDERING)
599 bool is_screen_changed(void);
601 // ----------------------------------------
603 // ----------------------------------------
604 void set_cpu_clock(DEVICE *cpu, uint32_t clocks);
606 DEVICE* get_device(int id);
608 DEVICE* first_device;