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
28 #define NOTIFY_KEY_DOWN
29 //#define NOTIFY_KEY_UP
30 #define NOTIFY_KEY_DOWN_LR_SHIFT
31 #define USE_ALT_F10_KEY
32 #define USE_AUTO_KEY 5
33 #define USE_AUTO_KEY_RELEASE 6
34 #define USE_CRT_FILTER
35 #define USE_ACCESS_LAMP
41 #define DEVICE_NAME "FUJITSU FM-8"
42 #define CONFIG_NAME "fm8"
44 #define DIPSWITCH_DEFAULT 0x00000000
50 #define DEVICE_NAME "FUJITSU FM-7"
51 #define CONFIG_NAME "fm7"
53 #define DIPSWITCH_DEFAULT 0x000000000
55 #elif defined(_FMNEW7)
56 #define DEVICE_NAME "FUJITSU FM-NEW7"
57 #define CONFIG_NAME "fmnew7"
59 #define DIPSWITCH_DEFAULT 0x000000000
61 #elif defined(_FM77) || defined(_FM77L2)
63 #define DEVICE_NAME "FUJITSU FM-77"
64 #define CONFIG_NAME "fm77"
65 #define DIPSWITCH_DEFAULT 0x00000001
68 #define DEVICE_NAME "FUJITSU FM-77L2"
69 #define CONFIG_NAME "fm77l2"
70 #define DIPSWITCH_DEFAULT 0x00000003
72 //#define USE_DRIVE_TYPE
73 #define _FM77_VARIANTS
75 # ifndef FM77_EXRAM_BANKS
76 # define FM77_EXRAM_BANKS 3
79 #elif defined(_FM77L4)
80 #define DEVICE_NAME "FUJITSU FM-77L4"
81 #define CONFIG_NAME "fm77l4"
85 #define HAS_CYCLESTEAL
86 #define HAS_400LINECARD
87 //#define CAPABLE_KANJI_CLASS2
88 #define _FM77_VARIANTS
90 # ifndef FM77_EXRAM_BANKS
91 # define FM77_EXRAM_BANKS 3
93 #define DIPSWITCH_DEFAULT 0x00000003
95 #elif defined(_FM77AV)
96 #define DEVICE_NAME "FUJITSU FM77AV"
97 #define CONFIG_NAME "fm77av"
98 #define _FM77AV_VARIANTS
99 #define DIPSWITCH_DEFAULT 0x80000001
101 #elif defined(_FM77AV20)
102 #define DEVICE_NAME "FUJITSU FM77AV20"
103 #define CONFIG_NAME "fm77av20"
104 #define _FM77AV_VARIANTS
107 #define CAPABLE_DICTROM
108 //#define USE_DRIVE_TYPE 2
109 #define CAPABLE_KANJI_CLASS2
110 #define DIPSWITCH_DEFAULT 0x80000001
112 #elif defined(_FM77AV20EX)
113 #define DEVICE_NAME "FUJITSU FM77AV20EX"
114 #define CONFIG_NAME "fm77av20ex"
115 #define _FM77AV_VARIANTS
119 //#define USE_DRIVE_TYPE 2
120 #define CAPABLE_DICTROM
121 #define CAPABLE_KANJI_CLASS2
122 #define DIPSWITCH_DEFAULT 0x80000001
124 #elif defined(_FM77AV40)
125 #define DEVICE_NAME "FUJITSU FM77AV40"
126 #define CONFIG_NAME "fm77av40"
127 #define _FM77AV_VARIANTS
130 //#define USE_DRIVE_TYPE 2
131 #define CAPABLE_DICTROM
132 #define HAS_400LINE_AV
133 #define CAPABLE_KANJI_CLASS2
134 #ifndef FM77_EXRAM_BANKS
135 #define FM77_EXRAM_BANKS 12
137 #define DIPSWITCH_DEFAULT 0x8000000d
139 #elif defined(_FM77AV40EX)
140 #define DEVICE_NAME "FUJITSU FM77AV40EX"
141 #define CONFIG_NAME "fm77av40ex"
142 #define _FM77AV_VARIANTS
145 //#define USE_DRIVE_TYPE 2
146 #define CAPABLE_DICTROM
147 #define HAS_400LINE_AV
148 #define CAPABLE_KANJI_CLASS2
149 #ifndef FM77_EXRAM_BANKS
150 #define FM77_EXRAM_BANKS 12
152 #define DIPSWITCH_DEFAULT 0x8000000d
154 #elif defined(_FM77AV40SX)
155 #define DEVICE_NAME "FUJITSU FM77AV40SX"
156 #define CONFIG_NAME "fm77av40sx"
157 #define _FM77AV_VARIANTS
160 //#define USE_DRIVE_TYPE 2
161 #define CAPABLE_DICTROM
162 #define HAS_400LINE_AV
163 #define CAPABLE_KANJI_CLASS2
164 # ifndef FM77_EXRAM_BANKS
165 # define FM77_EXRAM_BANKS 12
167 #define DIPSWITCH_DEFAULT 0x8000000d
172 #define USE_SOUND_DEVICE_TYPE 2
174 #define USE_DEVICE_TYPE 3
175 #define USE_SOUND_DEVICE_TYPE 8
178 #ifdef _FM77AV_VARIANTS
180 //#define CAPABLE_KANJI_CLASS2
182 #define HAS_CYCLESTEAL
184 #elif defined(_FM77_VARIANTS)
187 #define HAS_CYCLESTEAL
191 #if defined(_FM77_VARIANTS)
192 #define USE_BOOT_MODE 4
194 #define USE_BOOT_MODE 4
195 #elif defined(_FM7) || defined(_FMNEW7)
196 #define USE_BOOT_MODE 3
198 #define USE_BOOT_MODE 2
204 // 3 = WHG + OPN (+PSG)
206 // 5 = THG + OPN (+PSG)
207 // 6 = THG + WHG (+PSG)
208 // 7 = THG + WHG + OPN (+PSG)
211 #define SOUND_DEVICE_TYPE_DEFAULT 0
212 #elif defined(_FM7) || defined(_FMNEW7) || defined(_FM77_VARIANTS)
214 #define SOUND_DEVICE_TYPE_DEFAULT 0
215 #elif defined(_FM77AV_VARIANTS)
217 #define SOUND_DEVICE_TYPE_DEFAULT 1
219 #if !defined(_FM77AV_VARIANTS)
220 #define USE_SOUND_VOLUME 9
222 #define USE_SOUND_VOLUME 8
224 #define IGNORE_DISK_CRC_DEFAULT true
225 // device informations for virtual machine
227 // TODO: check refresh rate
228 #define FRAMES_PER_SEC 59.94
229 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || defined(_FM77L4)
230 #define LINES_PER_FRAME 400
232 #define LINES_PER_FRAME 200
235 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
236 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
237 #define CPU_CLOCKS 2016000
239 #define CPU_CLOCKS 1095000
241 #define CPU_CLOCKS 2000000
244 #define SCREEN_WIDTH 640
245 #define SCREEN_HEIGHT 400
246 #define WINDOW_HEIGHT_ASPECT 480
249 #define MB8877_MAX_CHIPS 1
250 //#define IO_ADDR_MAX 0x10000
252 // device informations for win32
271 // DIP Switch description
272 #define SWITCH_CYCLESTEAL 0x00000001
274 #define SWITCH_URA_RAM 0x00000002
276 #define SWITCH_URA_RAM 0x00000000
278 #define SWITCH_INVERT_CMT 0x00000004
280 // Belows are optional Hardwares.
281 #if !defined(_FM77_VARIANTS) && !defined(_FM77AV_VARIANTS)
282 #define SWITCH_FDC 0x00010000
284 #define SWITCH_FDC 0x00000000
286 #if !defined(_FM77_VARIANTS) && !defined(_FM77AV_VARIANTS)
287 #define SWITCH_Z80 0x00020000
289 #define SWITCH_Z80 0x00000000
291 #if defined(_FM77_VARIANTS)
292 #define SWITCH_DICTCARD 0x00040000
294 #define SWITCH_DICTCARD 0x00000000
296 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
297 #define SWITCH_EXTRA_RAM 0x00080000
299 #define SWITCH_EXTRA_RAM 0x00000000
301 //#define MB8877_NO_BUSY_AFTER_SEEK
303 //#define ENABLE_OPENCL // If OpenCL renderer is enabled, define here.
305 //#include "../../config.h"
306 #include "../../common.h"
307 #include "../../fileio.h"
309 #ifdef USE_SOUND_VOLUME
310 static const _TCHAR *sound_device_caption[] = {
316 # if !defined(_FM77AV_VARIANTS)
319 _T("OPN (FM)"), _T("OPN (PSG)"), _T("WHG (FM)"), _T("WHG (PSG)"), _T("THG (FM)"), _T("THG (PSG)"),
320 _T("Beep"), _T("CMT"),
324 #ifdef USE_JOY_BUTTON_CAPTIONS
325 static const _TCHAR *joy_button_captions[] = {
330 _T("Button #1(1st)"),
331 _T("Button #2(1st)"),
332 _T("Button #1(2nd)"),
333 _T("Button #2(2nd)"),
342 #if defined(_FM77AV_VARIANTS)
354 #if defined(USE_LED_DEVICE)
359 #if defined(_FM77AV_VARIANTS)
362 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
363 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
384 FM7_MAINMEM* mainmem;
386 #if defined(USE_LED_DEVICE)
387 DUMMYDEVICE* led_terminate;
389 DEVICE* led_terminate;
396 # if !defined(_FM77AV_VARIANTS)
397 YM2203* psg; // Is right? AY-3-8910 is right device.
401 BUBBLECASETTE *bubble_casette[2];
412 DEVICE* inteli_mouse;
416 #if defined(_FM77AV_VARIANTS)
426 KANJIROM *kanjiclass1;
427 #ifdef CAPABLE_KANJI_CLASS2
428 KANJIROM *kanjiclass2;
431 // ----------------------------------------
433 // ----------------------------------------
438 // ----------------------------------------
439 // for emulation class
440 // ----------------------------------------
442 // drive virtual machine
444 void special_reset();
446 double get_frame_rate();
447 #if defined(USE_LED_DEVICE)
448 uint32_t get_led_status();
453 DEVICE *get_cpu(int index);
455 void initialize(void);
456 void connect_bus(void);
458 void update_dipswitch(void);
461 uint32_t get_access_lamp_status();
464 void initialize_sound(int rate, int samples);
465 uint16_t* create_sound(int* extra_frames);
466 int get_sound_buffer_ptr();
467 #ifdef USE_SOUND_VOLUME
468 void set_sound_device_volume(int ch, int decibel_l, int decibel_r);
472 void key_down(int code, bool repeat);
473 void key_up(int code);
476 void open_floppy_disk(int drv, const _TCHAR* file_path, int bank);
477 void close_floppy_disk(int drv);
478 bool is_floppy_disk_inserted(int drv);
479 void is_floppy_disk_protected(int drv, bool value);
480 bool is_floppy_disk_protected(int drv);
482 void play_tape(const _TCHAR* file_path);
483 void rec_tape(const _TCHAR* file_path);
485 bool is_tape_inserted();
486 bool is_tape_playing();
487 bool is_tape_recording();
488 int get_tape_position();
490 bool is_frame_skippable();
493 void push_fast_forward();
494 void push_fast_rewind();
495 void push_apss_forward();
496 void push_apss_rewind();
497 void update_config();
498 void save_state(FILEIO* state_fio);
499 bool load_state(FILEIO* state_fio);
500 #if defined(USE_BUBBLE1)
501 void open_bubble_casette(int drv, _TCHAR *path, int bank);
502 void close_bubble_casette(int drv);
503 bool is_bubble_casette_inserted(int drv);
504 bool is_bubble_casette_protected(int drv);
505 void is_bubble_casette_protected(int drv, bool flag);
507 #if defined(USE_DIG_RESOLUTION)
508 void get_screen_resolution(int *w, int *h);
510 #if defined(USE_MINIMUM_RENDERING)
511 bool is_screen_changed(void);
513 // ----------------------------------------
515 // ----------------------------------------
516 void set_cpu_clock(DEVICE *cpu, uint32_t clocks);
518 DEVICE* get_device(int id);
520 DEVICE* first_device;