OSDN Git Service

f0bd3fe2cac0d5b104733887d16a987874e9285b
[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
45 #define CPU_TYPE_DEFAULT 0
46
47 #if defined(_FM8)
48 #define DEVICE_NAME             "FUJITSU FM-8"
49 #define CONFIG_NAME             "fm8"
50 #define CAPABLE_Z80
51 #define DIPSWITCH_DEFAULT 0x00000000 
52 #define USE_BUBBLE1
53 #define USE_BUBBLE2
54 #define MAX_BUBBLE 2
55 #define MAX_DRIVE  4
56
57 #undef CPU_TYPE_DEFAULT
58 #define CPU_TYPE_DEFAULT 1
59
60 #elif defined(_FM7)
61 #define DEVICE_NAME             "FUJITSU FM-7"
62 #define CONFIG_NAME             "fm7"
63 #define CAPABLE_Z80
64 #define DIPSWITCH_DEFAULT 0x000000000 
65 #define MAX_DRIVE  4
66 #define CAPABLE_JCOMMCARD 1
67 #elif defined(_FMNEW7)
68 #define DEVICE_NAME             "FUJITSU FM-NEW7"
69 #define CONFIG_NAME             "fmnew7"
70 #define CAPABLE_Z80
71 #define DIPSWITCH_DEFAULT 0x000000000 
72 #define MAX_DRIVE  4
73 #define CAPABLE_JCOMMCARD 1
74
75 #elif defined(_FM77) || defined(_FM77L2)
76 # if defined(_FM77)
77 #define DEVICE_NAME             "FUJITSU FM-77"
78 #define CONFIG_NAME             "fm77"
79 #define DIPSWITCH_DEFAULT 0x00000001
80 # else
81 #define DEVICE_NAME             "FUJITSU FM-77L2"
82 #define CONFIG_NAME             "fm77l2"
83 #define DIPSWITCH_DEFAULT 0x00000003 
84 # endif
85 //#define USE_DRIVE_TYPE
86 #define _FM77_VARIANTS
87 #define CAPABLE_Z80
88 # ifndef FM77_EXRAM_BANKS
89 #   define FM77_EXRAM_BANKS     3
90 # endif
91 #define MAX_DRIVE  4
92 #define CAPABLE_JCOMMCARD 1
93 #define HAS_2HD
94
95 #elif defined(_FM77L4)
96 #define DEVICE_NAME             "FUJITSU FM-77L4"
97 #define CONFIG_NAME             "fm77l4"
98 #define HAS_TEXTVRAM
99 #define HAS_2HD
100 #define HAS_CYCLESTEAL
101 #define HAS_400LINECARD
102 //#define CAPABLE_KANJI_CLASS2
103 #define _FM77_VARIANTS
104 # define CAPABLE_Z80
105 # ifndef FM77_EXRAM_BANKS
106 #  define FM77_EXRAM_BANKS      3
107 # endif
108 #define DIPSWITCH_DEFAULT 0x00000003 
109 #define MAX_DRIVE  4
110 #define CAPABLE_JCOMMCARD 1
111
112 #elif defined(_FM77AV)
113 #define DEVICE_NAME             "FUJITSU FM77AV"
114 #define CONFIG_NAME             "fm77av"
115 #define _FM77AV_VARIANTS
116 #define DIPSWITCH_DEFAULT 0x80000001 
117 #define MAX_DRIVE  2
118 #define CAPABLE_JCOMMCARD 1
119 #define CAPABLE_DICTROM
120
121 #elif defined(_FM77AV20)
122 #define DEVICE_NAME             "FUJITSU FM77AV20"
123 #define CONFIG_NAME             "fm77av20"
124 #define _FM77AV_VARIANTS
125 #define HAS_2DD_2D
126 #define CAPABLE_DICTROM
127 //#define USE_DRIVE_TYPE 2
128 #define CAPABLE_KANJI_CLASS2
129 #define DIPSWITCH_DEFAULT 0x80000001 
130 #define MAX_DRIVE  2
131
132 #elif defined(_FM77AV20EX)
133 #define DEVICE_NAME             "FUJITSU FM77AV20EX"
134 #define CONFIG_NAME             "fm77av20ex"
135 #define _FM77AV_VARIANTS
136 #define HAS_2DD_2D
137 #define HAS_DMA
138 //#define USE_DRIVE_TYPE 2
139 #define CAPABLE_DICTROM
140 #define CAPABLE_KANJI_CLASS2
141 #define DIPSWITCH_DEFAULT 0x80000001 
142 #define MAX_DRIVE  4
143
144 #elif defined(_FM77AV40)
145 #define DEVICE_NAME             "FUJITSU FM77AV40"
146 #define CONFIG_NAME             "fm77av40"
147 #define _FM77AV_VARIANTS
148 #define HAS_2DD_2D
149 #define HAS_DMA
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
156 #endif
157 #define DIPSWITCH_DEFAULT 0x8000000d 
158 #define MAX_DRIVE  4
159
160 #elif defined(_FM77AV40EX)
161 #define DEVICE_NAME             "FUJITSU FM77AV40EX"
162 #define CONFIG_NAME             "fm77av40ex"
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 #define MAX_DRIVE  4
175
176 #elif defined(_FM77AV40SX)
177 #define DEVICE_NAME             "FUJITSU FM77AV40SX"
178 #define CONFIG_NAME             "fm77av40sx"
179 #define _FM77AV_VARIANTS
180 #define HAS_2DD_2D
181 #define HAS_DMA
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
188 # endif
189 #define DIPSWITCH_DEFAULT 0x8000000d 
190 #define MAX_DRIVE  4
191
192 #endif
193
194 #if defined(_FM8)
195 #define USE_SOUND_TYPE          2
196 #else
197 #define USE_MOUSE_TYPE          3
198 #define USE_SOUND_TYPE          8
199 #endif
200
201 #ifdef _FM77AV_VARIANTS
202 #define HAS_MMR
203 #define HAS_CYCLESTEAL
204 #elif defined(_FM77_VARIANTS)
205 #define HAS_MMR
206 #define HAS_CYCLESTEAL
207 #define CAPABLE_Z80
208 #endif
209
210 #define USE_BOOT_MODE         8
211
212 // 0 = PSG or NONE
213 // 1 = OPN (+PSG)
214 // 2 = WHG (+PSG)
215 // 3 = WHG + OPN (+PSG)
216 // 4 = THG  (+PSG)
217 // 5 = THG + OPN (+PSG)
218 // 6 = THG + WHG (+PSG)
219 // 7 = THG + WHG + OPN (+PSG)
220 #if defined(_FM8)
221 // WITHOUT PSG?
222 #define SOUND_TYPE_DEFAULT      0
223 #elif defined(_FM7) || defined(_FMNEW7) || defined(_FM77_VARIANTS)
224 // PSG ONLY
225 #define SOUND_TYPE_DEFAULT      0
226 #elif defined(_FM77AV_VARIANTS)
227 // OPN
228 #define SOUND_TYPE_DEFAULT      1
229 #endif
230
231 #if defined(_FM8)
232 #define USE_SOUND_VOLUME        5
233 #else
234 #define USE_SOUND_VOLUME        11
235 #endif
236 #define SUPPORT_TV_RENDER
237
238 #define IGNORE_DISK_CRC_DEFAULT         true
239 // device informations for virtual machine
240
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
245 #else
246 #define LINES_PER_FRAME         200
247 #endif
248
249 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
250     defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
251 #define CPU_CLOCKS              2016000
252 #elif defined(_FM8)
253 #define CPU_CLOCKS              1095000
254 #else
255 #define CPU_CLOCKS              2000000
256 #endif
257
258 /*
259  * If you wish to use software-scanline, define below.
260  * If not, undef.
261  */
262 #define FIXED_FRAMEBUFFER_SIZE
263
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 */
270
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
276 # else
277 #  define SCREEN_FAKE_WIDTH   640
278 #  define SCREEN_FAKE_HEIGHT  200
279 # endif
280
281 # if !defined(FIXED_FRAMEBUFFER_SIZE)
282 #  define SCREEN_Y_ZOOM       2.0
283 # endif
284
285 #endif
286 #define WINDOW_HEIGHT_ASPECT 480
287 #define HAS_MC6809              
288 #define MB8877_MAX_CHIPS        1
289 //#define IO_ADDR_MAX           0x10000
290
291 // device informations for win32
292 #define USE_FD1
293 #define USE_FD2
294
295 #if defined(HAS_2HD)
296 #define USE_FD3
297 #define USE_FD4
298 #endif
299
300
301 #ifdef BUILD_Z80
302 # ifdef CAPABLE_Z80
303 #  define WITH_Z80
304 # endif
305 #endif
306
307 // DIP Switch description
308 #define SWITCH_CYCLESTEAL 0x00000001
309 #if defined(_FM8)
310 #define SWITCH_URA_RAM    0x00000002
311 #else
312 #define SWITCH_URA_RAM    0x00000000
313 #endif
314 #define SWITCH_INVERT_CMT 0x00000004
315
316 // Belows are optional Hardwares.
317 #if !defined(_FM77_VARIANTS) && !defined(_FM77AV_VARIANTS)
318 #define SWITCH_FDC 0x00010000
319 #else
320 #define SWITCH_FDC 0x00000000
321 #endif
322 #if !defined(_FM77_VARIANTS) && !defined(_FM77AV_VARIANTS)
323 #define SWITCH_Z80 0x00020000
324 #else
325 #define SWITCH_Z80 0x00000000
326 #endif
327 #if defined(_FM77_VARIANTS)
328 #define SWITCH_DICTCARD 0x00040000
329 #else
330 #define SWITCH_DICTCARD 0x00000000
331 #endif
332 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
333 #define SWITCH_EXTRA_RAM 0x00080000
334 #else
335 #define SWITCH_EXTRA_RAM 0x00000000
336 #endif
337 #define MB8877_NO_BUSY_AFTER_SEEK
338
339 //#define ENABLE_OPENCL // If OpenCL renderer is enabled, define here.
340
341 //#include "../../config.h"
342 #include "../../common.h"
343 #include "../../fileio.h"
344
345 #ifdef USE_SOUND_VOLUME
346 static const _TCHAR *sound_device_caption[] = {
347 #if defined(_FM8)
348         _T("PSG(Hack)"),
349         _T("Beep"),
350         _T("CMT (Signal)"),
351         _T("Noise (320KB FDD)"),
352         _T("Noise (CMT)"),
353 #else
354 # if !defined(_FM77AV_VARIANTS)
355         _T("PSG"),
356 # endif
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)
360         _T("Keyboard"),
361 # endif
362         _T("Noise (320KB FDD)"),
363 # if defined(HAS_2HD)
364         _T("Noise (1MB FDD/2HD)"),
365 # endif
366         _T("Noise (CMT)"),
367 #endif  
368 };
369 #endif
370 #ifdef USE_JOY_BUTTON_CAPTIONS
371 static const _TCHAR *joy_button_captions[] = {
372         _T("Up"),
373         _T("Down"),
374         _T("Left"),
375         _T("Right"),
376         _T("Button #1(1st)"),
377         _T("Button #2(1st)"),
378         _T("Button #1(2nd)"),
379         _T("Button #2(2nd)"),
380 };
381 #endif
382
383 class EMU;
384 class DEVICE;
385 class EVENT;
386 class FILEIO;
387
388 #if defined(_FM77AV_VARIANTS)
389 class BEEP;
390 #endif
391 class PCM1BIT;
392 class MC6809;
393 class YM2203;
394 class MB8877;
395 class MEMORY;
396 class DATAREC;
397 class I8251;
398 #if defined(USE_AY_3_8910_AS_PSG) && !defined(_FM77AV_VARIANTS)
399 class AY_3_891X;
400 #endif
401 #if defined(_FM8)
402 class BUBBLECASETTE;
403 #endif
404 class DISPLAY;
405 #if defined(_FM77AV_VARIANTS)
406 class MB61VH010;
407 #endif
408 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
409     defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
410 class HD6844;
411 #endif
412 class AND;
413 class FM7_MAINMEM;
414 #if defined(_FM8)
415 class FM8_MAINIO;
416 #else
417 class FM7_MAINIO;
418 #endif
419
420 class KEYBOARD;
421 class KANJIROM;
422 class JOYSTICK;
423
424 #ifdef WITH_Z80
425 class Z80;
426 class OR;
427 #endif
428 #ifdef CAPABLE_JCOMMCARD
429 class FM7_JCOMMCARD;
430 #endif
431
432 class VM {
433 protected:
434         EMU* emu;
435         
436         // devices
437         EVENT* event;
438
439         MC6809* maincpu;
440         FM7_MAINMEM* mainmem;
441 #if defined(_FM8)
442         FM8_MAINIO* mainio;
443 #else
444         FM7_MAINIO* mainio;
445 #endif
446         MB8877* fdc;
447 #if defined(HAS_2HD)
448         MB8877 *fdc_2HD;
449 #endif
450 #if defined(_FM8)
451         // FM8
452 # if defined(USE_AY_3_8910_AS_PSG)
453         AY_3_891X *psg;
454 # else
455         YM2203* psg;
456 # endif
457 #else
458         // FM7 -
459         YM2203* opn[3];
460 # if !defined(_FM77AV_VARIANTS)
461 #  if defined(USE_AY_3_8910_AS_PSG)
462         AY_3_891X *psg;
463 #else
464         YM2203* psg; // Is right? AY-3-8910 is right device.
465 #  endif
466 # endif
467 #endif
468 #if defined(_FM8)
469         BUBBLECASETTE *bubble_casette[2];
470 #endif
471         I8251 *uart[3];
472 # if defined(_FM77AV20) || defined(_FM77AV40) || defined(_FM77AV20EX) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
473         AND *g_rs232c_dtr;
474 #endif
475         
476         //BEEP* beep;
477         PCM1BIT* pcm1bit;
478         DATAREC *drec;
479         JOYSTICK *joystick;
480         
481 #ifdef  WITH_Z80
482         Z80* z80cpu;
483         AND *g_nmi;
484         OR *g_intr;
485         AND *g_intr_irq;
486         AND *g_intr_firq;
487         AND *g_mainstat;
488 #endif
489         AND *g_substat_display;
490         AND *g_substat_mainhalt;
491         
492         DEVICE* printer;
493         DEVICE* inteli_mouse; 
494    
495         MC6809* subcpu;
496 #if defined(_FM77AV_VARIANTS)
497         MB61VH010 *alu;
498         BEEP *keyboard_beep;
499 #endif
500 #if defined(HAS_DMA)
501         HD6844 *dmac;
502 #endif   
503         DISPLAY* display;
504         KEYBOARD* keyboard;
505    
506         KANJIROM *kanjiclass1;
507 #ifdef CAPABLE_KANJI_CLASS2
508         KANJIROM *kanjiclass2;
509 #endif
510 #if defined(CAPABLE_JCOMMCARD)
511         MC6809 *jsubcpu;
512         FM7_JCOMMCARD *jcommcard;
513         AND *g_jsubhalt;
514 #endif
515         bool connect_320kfdc;
516         bool connect_1Mfdc;
517 public:
518         // ----------------------------------------
519         // initialize
520         // ----------------------------------------
521         
522         VM(EMU* parent_emu);
523         ~VM();
524         
525         // ----------------------------------------
526         // for emulation class
527         // ----------------------------------------
528         
529         // drive virtual machine
530         void reset();
531         void special_reset();
532         void run();
533         double get_frame_rate();
534         
535 #ifdef USE_DEBUGGER
536         // debugger
537         DEVICE *get_cpu(int index);
538 #endif
539         void initialize(void);
540         void connect_bus(void);
541
542         void update_dipswitch(void);
543         // draw screen
544         void draw_screen();
545         
546         // sound generation
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);
552 #endif
553         
554         // notify key
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(); 
560         
561         // user interface
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();
568         
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);
577         
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);
594 #endif
595 #if defined(USE_DIG_RESOLUTION)
596         void get_screen_resolution(int *w, int *h);
597 #endif
598 #if defined(USE_MINIMUM_RENDERING)      
599         bool is_screen_changed(void);
600 #endif  
601         // ----------------------------------------
602         // for each device
603         // ----------------------------------------
604         void set_cpu_clock(DEVICE *cpu, uint32_t clocks);
605         // devices
606         DEVICE* get_device(int id);
607         DEVICE* dummy;
608         DEVICE* first_device;
609         DEVICE* last_device;
610 };
611
612 #endif