OSDN Git Service

cfae88fb7277ee2fbe67d3b3b6d8d6e0a375e605
[csp-qt/common_source_project-fm7.git] / source / src / vm / fm7 / fm7.h
1 /*
2         FUJITSU FM7 Emulator 'eFM7'
3
4         Author : K.Ohta
5         Date   : 2015.01.01-
6
7         [ virtual machine ]
8 */
9
10 #ifndef _FM7_H_
11 #define _FM7_H_
12
13 #define USE_TAPE1
14 #define USE_TAPE_PTR
15 #define USE_TAPE_BUTTON
16 #define USE_SCANLINE
17 #define USE_DIPSWITCH
18 #define USE_CPU_TYPE 2
19 #define USE_SPECIAL_RESET
20 #define USE_EXTRA_LEDS 3
21 #define USE_MINIMUM_RENDERING 1
22 #define USE_MOUSE
23 #define USE_JOYSTICK
24 #define USE_JOY_BUTTON_CAPTIONS
25 #define USE_PRINTER
26 #define USE_PRINTER_TYPE 4
27 #define USE_AY_3_8910_AS_PSG
28
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
40 #define USE_STATE
41 #define USE_DEBUGGER
42 #define DATAREC_SOUND
43 #define USE_DIG_RESOLUTION
44 #define SUPPORT_ROMA_KANA_CONVERSION
45
46 #if defined(_FM8)
47 #define DEVICE_NAME             "FUJITSU FM-8"
48 #define CONFIG_NAME             "fm8"
49 #define CAPABLE_Z80
50 #define DIPSWITCH_DEFAULT 0x00000000 
51 #define USE_BUBBLE1
52 #define USE_BUBBLE2
53 #define MAX_BUBBLE 2
54
55 #elif defined(_FM7)
56 #define DEVICE_NAME             "FUJITSU FM-7"
57 #define CONFIG_NAME             "fm7"
58 #define CAPABLE_Z80
59 #define DIPSWITCH_DEFAULT 0x000000000 
60
61 #elif defined(_FMNEW7)
62 #define DEVICE_NAME             "FUJITSU FM-NEW7"
63 #define CONFIG_NAME             "fmnew7"
64 #define CAPABLE_Z80
65 #define DIPSWITCH_DEFAULT 0x000000000 
66
67 #elif defined(_FM77) || defined(_FM77L2)
68 # if defined(_FM77)
69 #define DEVICE_NAME             "FUJITSU FM-77"
70 #define CONFIG_NAME             "fm77"
71 #define DIPSWITCH_DEFAULT 0x00000001
72
73 # else
74 #define DEVICE_NAME             "FUJITSU FM-77L2"
75 #define CONFIG_NAME             "fm77l2"
76 #define DIPSWITCH_DEFAULT 0x00000003 
77 # endif
78 //#define USE_DRIVE_TYPE
79 #define _FM77_VARIANTS
80 #define CAPABLE_Z80
81 # ifndef FM77_EXRAM_BANKS
82 #   define FM77_EXRAM_BANKS     3
83 # endif
84
85 #elif defined(_FM77L4)
86 #define DEVICE_NAME             "FUJITSU FM-77L4"
87 #define CONFIG_NAME             "fm77l4"
88 #define HAS_MMR
89 #define HAS_TEXTVRAM
90 #define HAS_2HD
91 #define HAS_CYCLESTEAL
92 #define HAS_400LINECARD
93 //#define CAPABLE_KANJI_CLASS2
94 #define _FM77_VARIANTS
95 #define CAPABLE_Z80
96 # ifndef FM77_EXRAM_BANKS
97 #  define FM77_EXRAM_BANKS      3
98 # endif
99 #define DIPSWITCH_DEFAULT 0x00000003 
100
101 #elif defined(_FM77AV)
102 #define DEVICE_NAME             "FUJITSU FM77AV"
103 #define CONFIG_NAME             "fm77av"
104 #define _FM77AV_VARIANTS
105 #define DIPSWITCH_DEFAULT 0x80000001 
106
107 #elif defined(_FM77AV20)
108 #define DEVICE_NAME             "FUJITSU FM77AV20"
109 #define CONFIG_NAME             "fm77av20"
110 #define _FM77AV_VARIANTS
111 #define HAS_MMR
112 #define HAS_2DD_2D
113 #define CAPABLE_DICTROM
114 //#define USE_DRIVE_TYPE 2
115 #define CAPABLE_KANJI_CLASS2
116 #define DIPSWITCH_DEFAULT 0x80000001 
117
118 #elif defined(_FM77AV20EX)
119 #define DEVICE_NAME             "FUJITSU FM77AV20EX"
120 #define CONFIG_NAME             "fm77av20ex"
121 #define _FM77AV_VARIANTS
122 #define HAS_MMR
123 #define HAS_2DD_2D
124 #define HAS_DMA
125 //#define USE_DRIVE_TYPE 2
126 #define CAPABLE_DICTROM
127 #define CAPABLE_KANJI_CLASS2
128 #define DIPSWITCH_DEFAULT 0x80000001 
129
130 #elif defined(_FM77AV40)
131 #define DEVICE_NAME             "FUJITSU FM77AV40"
132 #define CONFIG_NAME             "fm77av40"
133 #define _FM77AV_VARIANTS
134 #define HAS_2DD_2D
135 #define HAS_DMA
136 //#define USE_DRIVE_TYPE 2
137 #define CAPABLE_DICTROM
138 #define HAS_400LINE_AV
139 #define CAPABLE_KANJI_CLASS2
140 #ifndef FM77_EXRAM_BANKS
141 #define FM77_EXRAM_BANKS        12
142 #endif
143 #define DIPSWITCH_DEFAULT 0x8000000d 
144
145 #elif defined(_FM77AV40EX)
146 #define DEVICE_NAME             "FUJITSU FM77AV40EX"
147 #define CONFIG_NAME             "fm77av40ex"
148 #define _FM77AV_VARIANTS
149 #define HAS_2DD_2D
150 #define HAS_DMA
151 //#define USE_DRIVE_TYPE 2
152 #define CAPABLE_DICTROM
153 #define HAS_400LINE_AV
154 #define CAPABLE_KANJI_CLASS2
155 #ifndef FM77_EXRAM_BANKS
156 #define FM77_EXRAM_BANKS        12
157 #endif
158 #define DIPSWITCH_DEFAULT 0x8000000d 
159
160 #elif defined(_FM77AV40SX)
161 #define DEVICE_NAME             "FUJITSU FM77AV40SX"
162 #define CONFIG_NAME             "fm77av40sx"
163 #define _FM77AV_VARIANTS
164 #define HAS_2DD_2D
165 #define HAS_DMA
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
172 # endif
173 #define DIPSWITCH_DEFAULT 0x8000000d 
174
175 #endif
176
177 #if defined(_FM8)
178 #define USE_SOUND_TYPE          2
179 #else
180 #define USE_MOUSE_TYPE          3
181 #define USE_SOUND_TYPE          8
182 #endif
183
184 #ifdef _FM77AV_VARIANTS
185 //#define CAPABLE_KANJI_CLASS2
186 #define HAS_MMR
187 #define HAS_CYCLESTEAL
188 #elif defined(_FM77_VARIANTS)
189 #define HAS_MMR
190 #define HAS_CYCLESTEAL
191 #define CAPABLE_Z80
192 #endif
193
194 #if defined(_FM77_VARIANTS)
195 #define USE_BOOT_MODE         4
196 #elif defined(_FM8)
197 #define USE_BOOT_MODE         4
198 #elif defined(_FM7) || defined(_FMNEW7)
199 #define USE_BOOT_MODE         3
200 #else
201 #define USE_BOOT_MODE         2
202 #endif
203
204 // 0 = PSG or NONE
205 // 1 = OPN (+PSG)
206 // 2 = WHG (+PSG)
207 // 3 = WHG + OPN (+PSG)
208 // 4 = THG  (+PSG)
209 // 5 = THG + OPN (+PSG)
210 // 6 = THG + WHG (+PSG)
211 // 7 = THG + WHG + OPN (+PSG)
212 #if defined(_FM8)
213 // WITHOUT PSG?
214 #define SOUND_TYPE_DEFAULT      0
215 #elif defined(_FM7) || defined(_FMNEW7) || defined(_FM77_VARIANTS)
216 // PSG ONLY
217 #define SOUND_TYPE_DEFAULT      0
218 #elif defined(_FM77AV_VARIANTS)
219 // OPN
220 #define SOUND_TYPE_DEFAULT      1
221 #endif
222
223 #if defined(_FM8)
224 #define USE_SOUND_VOLUME        5
225 #else
226 #define USE_SOUND_VOLUME        11
227 #endif
228 #define SUPPORT_TV_RENDER
229
230 #define IGNORE_DISK_CRC_DEFAULT         true
231 // device informations for virtual machine
232
233 // TODO: check refresh rate
234 #define FRAMES_PER_SEC          59.94
235 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || defined(_FM77L4)
236 #define LINES_PER_FRAME         400
237 #else
238 #define LINES_PER_FRAME         200
239 #endif
240
241 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
242     defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
243 #define CPU_CLOCKS              2016000
244 #elif defined(_FM8)
245 #define CPU_CLOCKS              1095000
246 #else
247 #define CPU_CLOCKS              2000000
248 #endif
249
250 # if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || defined(_FM77L4)
251 #define SCREEN_WIDTH            640
252 #define SCREEN_HEIGHT           400
253 #undef SCREEN_FAKE_WIDTH
254 #undef SCREEN_FAKE_HEIGHT
255 #else
256 #define SCREEN_WIDTH            640
257 #define SCREEN_HEIGHT           200
258 #define SCREEN_FAKE_WIDTH   640
259 #define SCREEN_FAKE_HEIGHT  200
260 #define SCREEN_Y_ZOOM       2.0
261 #endif
262 #define WINDOW_HEIGHT_ASPECT 480
263 #define HAS_MC6809              
264 #define MB8877_MAX_CHIPS        1
265 //#define IO_ADDR_MAX           0x10000
266
267 // device informations for win32
268 #define USE_FD1
269 #define USE_FD2
270
271 #if defined(HAS_2HD)
272 #define USE_FD3
273 #define USE_FD4
274 #endif
275
276
277 #ifdef BUILD_Z80
278 # ifdef CAPABLE_Z80
279 #  define WITH_Z80
280 # endif
281 #endif
282
283 // DIP Switch description
284 #define SWITCH_CYCLESTEAL 0x00000001
285 #if defined(_FM8)
286 #define SWITCH_URA_RAM    0x00000002
287 #else
288 #define SWITCH_URA_RAM    0x00000000
289 #endif
290 #define SWITCH_INVERT_CMT 0x00000004
291
292 // Belows are optional Hardwares.
293 #if !defined(_FM77_VARIANTS) && !defined(_FM77AV_VARIANTS)
294 #define SWITCH_FDC 0x00010000
295 #else
296 #define SWITCH_FDC 0x00000000
297 #endif
298 #if !defined(_FM77_VARIANTS) && !defined(_FM77AV_VARIANTS)
299 #define SWITCH_Z80 0x00020000
300 #else
301 #define SWITCH_Z80 0x00000000
302 #endif
303 #if defined(_FM77_VARIANTS)
304 #define SWITCH_DICTCARD 0x00040000
305 #else
306 #define SWITCH_DICTCARD 0x00000000
307 #endif
308 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
309 #define SWITCH_EXTRA_RAM 0x00080000
310 #else
311 #define SWITCH_EXTRA_RAM 0x00000000
312 #endif
313 #define MB8877_NO_BUSY_AFTER_SEEK
314
315 //#define ENABLE_OPENCL // If OpenCL renderer is enabled, define here.
316
317 //#include "../../config.h"
318 #include "../../common.h"
319 #include "../../fileio.h"
320
321 #ifdef USE_SOUND_VOLUME
322 static const _TCHAR *sound_device_caption[] = {
323 #if defined(_FM8)
324         _T("PSG(Hack)"),
325         _T("Beep"),
326         _T("CMT (Signal)"),
327         _T("Noise (FDD)"),
328         _T("Noise (CMT)"),
329 #else
330 # if !defined(_FM77AV_VARIANTS)
331         _T("PSG"),
332 # endif
333         _T("OPN (FM)"), _T("OPN (PSG)"), _T("WHG (FM)"), _T("WHG (PSG)"), _T("THG (FM)"), _T("THG (PSG)"),
334         _T("Beep"), _T("CMT (Signal)"),
335 # if defined(_FM77AV_VARIANTS)
336         _T("Keyboard"),
337 # endif
338         _T("Noise (FDD)"), _T("Noise (CMT)"),
339 #endif  
340 };
341 #endif
342 #ifdef USE_JOY_BUTTON_CAPTIONS
343 static const _TCHAR *joy_button_captions[] = {
344         _T("Up"),
345         _T("Down"),
346         _T("Left"),
347         _T("Right"),
348         _T("Button #1(1st)"),
349         _T("Button #2(1st)"),
350         _T("Button #1(2nd)"),
351         _T("Button #2(2nd)"),
352 };
353 #endif
354
355 class EMU;
356 class DEVICE;
357 class EVENT;
358 class FILEIO;
359
360 #if defined(_FM77AV_VARIANTS)
361 class BEEP;
362 #endif
363 class PCM1BIT;
364 class MC6809;
365 class YM2203;
366 class MB8877;
367 class MEMORY;
368 class DATAREC;
369 #if defined(USE_AY_3_8910_AS_PSG) && !defined(_FM77AV_VARIANTS)
370 class AY_3_891X;
371 #endif
372 #if defined(_FM8)
373 class BUBBLECASETTE;
374 #endif
375 class DISPLAY;
376 #if defined(_FM77AV_VARIANTS)
377 class MB61VH010;
378 #endif
379 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
380     defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
381 class HD6844;
382 #endif
383 class FM7_MAINMEM;
384 class FM7_MAINIO;
385 class KEYBOARD;
386 class KANJIROM;
387 class JOYSTICK;
388
389 #if WITH_Z80
390 class Z80;
391 #endif
392 class VM {
393 protected:
394         EMU* emu;
395         
396         // devices
397         EVENT* event;
398         
399         MC6809* maincpu;
400         FM7_MAINMEM* mainmem;
401         FM7_MAINIO* mainio;
402         MB8877* fdc;
403 #if defined(_FM8)
404         // FM8
405 # if defined(USE_AY_3_8910_AS_PSG)
406         AY_3_891X *psg;
407 # else
408         YM2203* psg;
409 # endif
410 #else
411         // FM7 -
412         YM2203* opn[3];
413 # if !defined(_FM77AV_VARIANTS)
414 #  if defined(USE_AY_3_8910_AS_PSG)
415         AY_3_891X *psg;
416 #else
417         YM2203* psg; // Is right? AY-3-8910 is right device.
418 #  endif
419 # endif
420 #endif
421 #if defined(_FM8)
422         BUBBLECASETTE *bubble_casette[2];
423 #endif
424         //BEEP* beep;
425         PCM1BIT* pcm1bit;
426         DATAREC *drec;
427         JOYSTICK *joystick;
428         
429 #ifdef  WITH_Z80
430         Z80* z80cpu;
431 #endif
432         DEVICE* printer;
433         DEVICE* inteli_mouse; 
434    
435         DEVICE *dummycpu;
436         MC6809* subcpu;
437 #if defined(_FM77AV_VARIANTS)
438         MB61VH010 *alu;
439         BEEP *keyboard_beep;
440 #endif
441 #if defined(HAS_DMA)
442         HD6844 *dmac;
443 #endif   
444         DISPLAY* display;
445         KEYBOARD* keyboard;
446    
447         KANJIROM *kanjiclass1;
448 #ifdef CAPABLE_KANJI_CLASS2
449         KANJIROM *kanjiclass2;
450 #endif
451         bool connect_320kfdc;
452         bool connect_1Mfdc;
453 public:
454         // ----------------------------------------
455         // initialize
456         // ----------------------------------------
457         
458         VM(EMU* parent_emu);
459         ~VM();
460         
461         // ----------------------------------------
462         // for emulation class
463         // ----------------------------------------
464         
465         // drive virtual machine
466         void reset();
467         void special_reset();
468         void run();
469         double get_frame_rate();
470         
471 #ifdef USE_DEBUGGER
472         // debugger
473         DEVICE *get_cpu(int index);
474 #endif
475         void initialize(void);
476         void connect_bus(void);
477
478         void update_dipswitch(void);
479         // draw screen
480         void draw_screen();
481         
482         // sound generation
483         void initialize_sound(int rate, int samples);
484         uint16_t* create_sound(int* extra_frames);
485         int get_sound_buffer_ptr();
486 #ifdef USE_SOUND_VOLUME
487         void set_sound_device_volume(int ch, int decibel_l, int decibel_r);
488 #endif
489         
490         // notify key
491         void key_down(int code, bool repeat);
492         void key_up(int code);
493         bool get_caps_locked();
494         bool get_kana_locked();
495         uint32_t get_extra_leds(); 
496         
497         // user interface
498         void open_floppy_disk(int drv, const _TCHAR* file_path, int bank);
499         void close_floppy_disk(int drv);
500         bool is_floppy_disk_inserted(int drv);
501         void is_floppy_disk_protected(int drv, bool value);
502         bool is_floppy_disk_protected(int drv);
503         uint32_t is_floppy_disk_accessed();
504         
505         void play_tape(int drv, const _TCHAR* file_path);
506         void rec_tape(int drv, const _TCHAR* file_path);
507         void close_tape(int drv);
508         bool is_tape_inserted(int drv);
509         bool is_tape_playing(int drv);
510         bool is_tape_recording(int drv);
511         int get_tape_position(int drv);
512         const _TCHAR* get_tape_message(int drv);
513         
514         bool is_frame_skippable();
515         void push_play(int drv);
516         void push_stop(int drv);
517         void push_fast_forward(int drv);
518         void push_fast_rewind(int drv);
519         void push_apss_forward(int drv);
520         void push_apss_rewind(int drv);
521         void update_config();
522         void save_state(FILEIO* state_fio);
523         bool load_state(FILEIO* state_fio);
524 #if defined(USE_BUBBLE1)
525         void open_bubble_casette(int drv, const _TCHAR *path, int bank);
526         void close_bubble_casette(int drv);
527         bool is_bubble_casette_inserted(int drv);
528         bool is_bubble_casette_protected(int drv);
529         void is_bubble_casette_protected(int drv, bool flag);
530 #endif
531 #if defined(USE_DIG_RESOLUTION)
532         void get_screen_resolution(int *w, int *h);
533 #endif
534 #if defined(USE_MINIMUM_RENDERING)      
535         bool is_screen_changed(void);
536 #endif  
537         // ----------------------------------------
538         // for each device
539         // ----------------------------------------
540         void set_cpu_clock(DEVICE *cpu, uint32_t clocks);
541         // devices
542         DEVICE* get_device(int id);
543         DEVICE* dummy;
544         DEVICE* first_device;
545         DEVICE* last_device;
546 };
547
548 #endif