OSDN Git Service

5dc75334c6bc34adf7374e57ec0b24e09dad1b54
[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_TAPE 1
14 #define USE_TAPE_PTR
15 #define USE_SCANLINE
16 #define USE_DIPSWITCH
17 #define USE_CPU_TYPE 2
18 #define USE_SPECIAL_RESET               1
19 #define USE_LED_DEVICE                  3
20 #define USE_MINIMUM_RENDERING 1
21 #define USE_MOUSE
22 #define USE_JOYSTICK
23 #define USE_JOY_BUTTON_CAPTIONS
24 #define USE_PRINTER
25 #define USE_PRINTER_TYPE 4
26 #define USE_AY_3_8910_AS_PSG
27
28 #define INDEPENDENT_CAPS_KANA_LED
29 #define USE_KEY_LOCKED
30 #define USE_AUTO_KEY            5
31 #define USE_AUTO_KEY_RELEASE    6
32 #define USE_AUTO_KEY_NUMPAD
33 #define USE_SCREEN_FILTER
34 #define USE_STATE
35 #define USE_DEBUGGER
36 #define DATAREC_SOUND
37 #define USE_DIG_RESOLUTION
38
39 #define CPU_TYPE_DEFAULT 0
40
41 #if defined(_FM8)
42 #define DEVICE_NAME             "FUJITSU FM-8"
43 #define CONFIG_NAME             "fm8"
44 #define CAPABLE_Z80
45 #define DIPSWITCH_DEFAULT 0x00000000 
46 #define USE_BUBBLE 2
47 #define BASE_BUBBLE_NUM 0
48 #define MAX_DRIVE  4
49
50 #undef CPU_TYPE_DEFAULT
51 #define CPU_TYPE_DEFAULT 1
52 #define USE_GREEN_DISPLAY
53 #define USE_MONITOR_TYPE 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 #define MAX_DRIVE  4
61 #define CAPABLE_JCOMMCARD 1
62 #define USE_GREEN_DISPLAY
63 #define USE_MONITOR_TYPE 2
64
65 #elif defined(_FMNEW7)
66 #define DEVICE_NAME             "FUJITSU FM-NEW7"
67 #define CONFIG_NAME             "fmnew7"
68 #define CAPABLE_Z80
69 #define DIPSWITCH_DEFAULT 0x000000000 
70 #define MAX_DRIVE  4
71 #define CAPABLE_JCOMMCARD 1
72 #define USE_GREEN_DISPLAY
73 #define USE_MONITOR_TYPE 2
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 #define USE_GREEN_DISPLAY
95 #define USE_MONITOR_TYPE 2
96
97 #elif defined(_FM77L4)
98 #define DEVICE_NAME             "FUJITSU FM-77L4"
99 #define CONFIG_NAME             "fm77l4"
100 #define HAS_TEXTVRAM
101 #define HAS_2HD
102 #define HAS_CYCLESTEAL
103 #define HAS_400LINECARD
104 //#define CAPABLE_KANJI_CLASS2
105 #define _FM77_VARIANTS
106 # define CAPABLE_Z80
107 # ifndef FM77_EXRAM_BANKS
108 #  define FM77_EXRAM_BANKS      3
109 # endif
110 #define DIPSWITCH_DEFAULT 0x00000003 
111 #define MAX_DRIVE  4
112 #define CAPABLE_JCOMMCARD 1
113 #define USE_GREEN_DISPLAY
114 #define USE_MONITOR_TYPE 2
115
116 #elif defined(_FM77AV)
117 #define DEVICE_NAME             "FUJITSU FM77AV"
118 #define CONFIG_NAME             "fm77av"
119 #define _FM77AV_VARIANTS
120 #define DIPSWITCH_DEFAULT 0x80000001 
121 #define MAX_DRIVE  2
122 #define CAPABLE_JCOMMCARD 1
123 #define CAPABLE_DICTROM
124
125 #elif defined(_FM77AV20)
126 #define DEVICE_NAME             "FUJITSU FM77AV20"
127 #define CONFIG_NAME             "fm77av20"
128 #define _FM77AV_VARIANTS
129 #define HAS_2DD_2D
130 #define CAPABLE_DICTROM
131 //#define USE_DRIVE_TYPE 2
132 #define CAPABLE_KANJI_CLASS2
133 #define DIPSWITCH_DEFAULT 0x80000001 
134 #define MAX_DRIVE  2
135
136 #elif defined(_FM77AV20EX)
137 #define DEVICE_NAME             "FUJITSU FM77AV20EX"
138 #define CONFIG_NAME             "fm77av20ex"
139 #define _FM77AV_VARIANTS
140 #define HAS_2DD_2D
141 #define HAS_DMA
142 //#define USE_DRIVE_TYPE 2
143 #define CAPABLE_DICTROM
144 #define CAPABLE_KANJI_CLASS2
145 #define DIPSWITCH_DEFAULT 0x80000001 
146 #define MAX_DRIVE  4
147
148 #elif defined(_FM77AV40)
149 #define DEVICE_NAME             "FUJITSU FM77AV40"
150 #define CONFIG_NAME             "fm77av40"
151 #define _FM77AV_VARIANTS
152 #define HAS_2DD_2D
153 #define HAS_DMA
154 //#define USE_DRIVE_TYPE 2
155 #define CAPABLE_DICTROM
156 #define HAS_400LINE_AV
157 #define CAPABLE_KANJI_CLASS2
158 #ifndef FM77_EXRAM_BANKS
159 #define FM77_EXRAM_BANKS        12
160 #endif
161 #define DIPSWITCH_DEFAULT 0x8000000d 
162 #define MAX_DRIVE  4
163
164 #elif defined(_FM77AV40EX)
165 #define DEVICE_NAME             "FUJITSU FM77AV40EX"
166 #define CONFIG_NAME             "fm77av40ex"
167 #define _FM77AV_VARIANTS
168 #define HAS_2DD_2D
169 #define HAS_DMA
170 //#define USE_DRIVE_TYPE 2
171 #define CAPABLE_DICTROM
172 #define HAS_400LINE_AV
173 #define CAPABLE_KANJI_CLASS2
174 #ifndef FM77_EXRAM_BANKS
175 #define FM77_EXRAM_BANKS        12
176 #endif
177 #define DIPSWITCH_DEFAULT 0x8000000d 
178 #define MAX_DRIVE  4
179
180 #elif defined(_FM77AV40SX)
181 #define DEVICE_NAME             "FUJITSU FM77AV40SX"
182 #define CONFIG_NAME             "fm77av40sx"
183 #define _FM77AV_VARIANTS
184 #define HAS_2DD_2D
185 #define HAS_DMA
186 //#define USE_DRIVE_TYPE 2
187 #define CAPABLE_DICTROM
188 #define HAS_400LINE_AV
189 #define CAPABLE_KANJI_CLASS2
190 # ifndef FM77_EXRAM_BANKS
191 #  define FM77_EXRAM_BANKS      12
192 # endif
193 #define DIPSWITCH_DEFAULT 0x8000000d 
194 #define MAX_DRIVE  4
195
196 #endif
197
198 #if defined(_FM8)
199 #define USE_SOUND_TYPE          2
200 #else
201 #define USE_MOUSE_TYPE          3
202 #define USE_SOUND_TYPE          8
203 #endif
204
205 #ifdef _FM77AV_VARIANTS
206 #define HAS_MMR
207 #define HAS_CYCLESTEAL
208 #elif defined(_FM77_VARIANTS)
209 #define HAS_MMR
210 #define HAS_CYCLESTEAL
211 #define CAPABLE_Z80
212 #endif
213
214 #define USE_BOOT_MODE         8
215
216 // 0 = PSG or NONE
217 // 1 = OPN (+PSG)
218 // 2 = WHG (+PSG)
219 // 3 = WHG + OPN (+PSG)
220 // 4 = THG  (+PSG)
221 // 5 = THG + OPN (+PSG)
222 // 6 = THG + WHG (+PSG)
223 // 7 = THG + WHG + OPN (+PSG)
224 #if defined(_FM8)
225 // WITHOUT PSG?
226 #define SOUND_TYPE_DEFAULT      0
227 #elif defined(_FM7) || defined(_FMNEW7) || defined(_FM77_VARIANTS)
228 // PSG ONLY
229 #define SOUND_TYPE_DEFAULT      0
230 #elif defined(_FM77AV_VARIANTS)
231 // OPN
232 #define SOUND_TYPE_DEFAULT      1
233 #endif
234
235 #if defined(_FM8)
236 #define USE_SOUND_VOLUME        5
237 #else
238 #define USE_SOUND_VOLUME        11
239 #endif
240
241 #define SUPPORT_TV_RENDER
242 #define SUPPORT_QUERY_PHY_KEY_NAME
243 #define IGNORE_DISK_CRC_DEFAULT         true
244 // device informations for virtual machine
245
246 // TODO: check refresh rate
247 //#define FRAMES_PER_SEC                60.0962 /* Related to display.cpp */ 
248 #define FRAMES_PER_SEC          59.94 /* Related to display.cpp */ 
249 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || defined(_FM77L4)
250 #define LINES_PER_FRAME         400
251 #else
252 #define LINES_PER_FRAME         200
253 #endif
254
255 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
256   defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
257 #define CPU_CLOCKS              2016000 /* 2016 */
258 #else
259 #define CPU_CLOCKS      1798000   /* FM8,7 - 77AV/20? */
260 #endif
261
262
263 /*
264  * If you wish to use software-scanline, define below.
265  * If not, undef.
266  */
267 #define FIXED_FRAMEBUFFER_SIZE
268
269 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || defined(_FM77L4)
270 #define SCREEN_WIDTH            640
271 #define SCREEN_HEIGHT           400
272 #undef SCREEN_FAKE_WIDTH
273 #undef SCREEN_FAKE_HEIGHT
274 #else /* Not have 400 line */
275
276 #define SCREEN_WIDTH            640
277 #define SCREEN_HEIGHT           200
278 # if defined(FIXED_FRAMEBUFFER_SIZE)
279 #  define SCREEN_FAKE_WIDTH   640
280 #  define SCREEN_FAKE_HEIGHT  400
281 # else
282 #  define SCREEN_FAKE_WIDTH   640
283 #  define SCREEN_FAKE_HEIGHT  200
284 # endif
285
286 # if !defined(FIXED_FRAMEBUFFER_SIZE)
287 #  define SCREEN_Y_ZOOM       2.0
288 # endif
289
290 #endif
291 #define WINDOW_HEIGHT_ASPECT 480
292 #define HAS_MC6809              
293 #define MB8877_MAX_CHIPS        1
294 #define MB8877_DELAY_AFTER_SEEK 60000
295 //#define IO_ADDR_MAX           0x10000
296
297 // device informations for win32
298 #if defined(HAS_2HD)
299 #define USE_FLOPPY_DISK 4
300 #else
301 #define USE_FLOPPY_DISK 2
302 #endif
303 #define BASE_FLOPPY_DISK_NUM 0
304
305 #ifdef CAPABLE_Z80
306 #  define WITH_Z80
307 #endif
308
309 // DIP Switch description
310 #define SWITCH_CYCLESTEAL 0x00000001
311 #if defined(_FM8)
312 #define SWITCH_URA_RAM    0x00000002
313 #else
314 #define SWITCH_URA_RAM    0x00000000
315 #endif
316 #define SWITCH_INVERT_CMT 0x00000004
317
318 // Belows are optional Hardwares.
319 #if !defined(_FM77_VARIANTS) && !defined(_FM77AV_VARIANTS)
320 #define SWITCH_FDC 0x00010000
321 #else
322 #define SWITCH_FDC 0x00000000
323 #endif
324 #if !defined(_FM77_VARIANTS) && !defined(_FM77AV_VARIANTS)
325 #define SWITCH_Z80 0x00020000
326 #else
327 #define SWITCH_Z80 0x00000000
328 #endif
329 #if defined(_FM77_VARIANTS)
330 #define SWITCH_DICTCARD 0x00040000
331 #else
332 #define SWITCH_DICTCARD 0x00000000
333 #endif
334 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
335 #define SWITCH_EXTRA_RAM 0x00080000
336 #else
337 #define SWITCH_EXTRA_RAM 0x00000000
338 #endif
339 #define MB8877_NO_BUSY_AFTER_SEEK
340
341 //#define ENABLE_OPENCL // If OpenCL renderer is enabled, define here.
342 #if defined(_FM77_VARIANTS) || defined(_FM77AV_VARIANTS)
343         #define USE_FLOPPY_TYPE_BIT 0x0003 /* 5.0, 5.0, 3.5, 3.5 */
344 #else
345         #define USE_FLOPPY_TYPE_BIT 0x0000 /* 5.0, 5.0, 5.0, 5.0 */
346 #endif
347 //#include "../../config.h"
348 #include "../../common.h"
349 #include "../../fileio.h"
350 #include "../vm_template.h"
351
352 #ifdef USE_SOUND_VOLUME
353 static const _TCHAR *sound_device_caption[] = {
354 #if defined(_FM8)
355         _T("PSG(Hack)"),
356         _T("Beep"),
357         _T("CMT (Signal)"),
358         _T("Noise (320KB FDD)"),
359         _T("Noise (CMT)"),
360 #else
361 # if !defined(_FM77AV_VARIANTS)
362         _T("PSG"),
363 # endif
364         _T("OPN (FM)"), _T("OPN (PSG)"), _T("WHG (FM)"), _T("WHG (PSG)"), _T("THG (FM)"), _T("THG (PSG)"),
365         _T("Beep"), _T("CMT (Signal)"),
366 # if defined(_FM77AV_VARIANTS)
367         _T("Keyboard"),
368 # endif
369         _T("Noise (320KB FDD)"),
370 # if defined(HAS_2HD)
371         _T("Noise (1MB FDD/2HD)"),
372 # endif
373         _T("Noise (CMT)"),
374 #endif  
375 };
376 #endif
377 #ifdef USE_JOY_BUTTON_CAPTIONS
378 static const _TCHAR *joy_button_captions[] = {
379         _T("Up"),
380         _T("Down"),
381         _T("Left"),
382         _T("Right"),
383         _T("Button #1(1st)"),
384         _T("Button #2(1st)"),
385         _T("Button #1(2nd)"),
386         _T("Button #2(2nd)"),
387 };
388 #endif
389
390 /*
391  * NOTE:
392  * Below defines are for EVENT::run_cpu().
393  * Please see event.cpp for details.
394  * 20180317 -- K.Ohta.
395  */
396
397 #define USE_CPU_MC6809
398 #if defined(WITH_Z80)
399 #define USE_CPU_Z80
400 #endif
401
402 class EMU;
403 class DEVICE;
404 class EVENT;
405 class FILEIO;
406
407 class AND;
408 #if defined(USE_AY_3_8910_AS_PSG) && !defined(_FM77AV_VARIANTS)
409 class AY_3_891X;
410 #endif
411 #if defined(_FM77AV_VARIANTS)
412 class BEEP;
413 #endif
414 class DATAREC;
415 #if defined(_FM77L4)
416 class HD46505;
417 #endif
418 class I8251;
419 class MB8877;
420 class MC6809;
421 class PCM1BIT;
422 class YM2203;
423 #ifdef WITH_Z80
424 class Z80;
425 class OR;
426 #endif
427
428 #if defined(_FM77AV_VARIANTS)
429 class MB61VH010;
430 #endif
431 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
432     defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
433 class HD6844;
434 #endif
435
436 namespace FM7 {
437 #if defined(USE_BUBBLE)
438         class BUBBLECASETTE;
439 #endif
440         class DISPLAY;
441 #ifdef CAPABLE_JCOMMCARD
442 class FM7_JCOMMCARD;
443 #endif
444         class FM7_MAINMEM;
445 #if defined(_FM8)
446         class FM8_MAINIO;
447 #else
448         class FM7_MAINIO;
449 #endif
450         class JOYSTICK;
451         class KEYBOARD;
452         class KANJIROM;
453 }
454
455 class VM : public VM_TEMPLATE
456 {
457 protected:
458 //      EMU* emu;
459         // devices
460 //      EVENT* event;
461         
462         DEVICE* dummycpu;
463         MC6809* maincpu;
464         FM7::FM7_MAINMEM* mainmem;
465 #if defined(_FM8)
466         FM7::FM8_MAINIO* mainio;
467 #else
468         FM7::FM7_MAINIO* mainio;
469 #endif
470         MB8877* fdc;
471 #if defined(HAS_2HD)
472         MB8877 *fdc_2HD;
473 #endif
474 #if defined(_FM8)
475         // FM8
476 # if defined(USE_AY_3_8910_AS_PSG)
477         AY_3_891X *psg;
478 # else
479         YM2203* psg;
480 # endif
481 #else
482         // FM7 -
483         YM2203* opn[3];
484 # if !defined(_FM77AV_VARIANTS)
485 #  if defined(USE_AY_3_8910_AS_PSG)
486         AY_3_891X *psg;
487 #else
488         YM2203* psg; // Is right? AY-3-8910 is right device.
489 #  endif
490 # endif
491 #endif
492 #if defined(USE_BUBBLE)
493         FM7::BUBBLECASETTE *bubble_casette[USE_BUBBLE];
494 #endif
495         I8251 *uart[3];
496 # if defined(_FM77AV20) || defined(_FM77AV40) || defined(_FM77AV20EX) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
497         AND *g_rs232c_dtr;
498 #endif
499         
500         //BEEP* beep;
501         PCM1BIT* pcm1bit;
502         DATAREC *drec;
503         FM7::JOYSTICK *joystick;
504         
505 #ifdef  WITH_Z80
506         Z80* z80cpu;
507         AND *g_nmi;
508         OR *g_intr;
509         AND *g_intr_irq;
510         AND *g_intr_firq;
511         AND *g_mainstat;
512 #endif
513         AND *g_substat_display;
514         AND *g_substat_mainhalt;
515         
516         DEVICE* printer;
517         DEVICE* inteli_mouse; 
518    
519         MC6809* subcpu;
520 #if defined(_FM77AV_VARIANTS)
521         MB61VH010 *alu;
522         BEEP *keyboard_beep;
523 #endif
524 #if defined(HAS_DMA)
525         HD6844 *dmac;
526 #endif   
527         FM7::DISPLAY* display;
528         FM7::KEYBOARD* keyboard;
529    
530         FM7::KANJIROM *kanjiclass1;
531 #ifdef CAPABLE_KANJI_CLASS2
532         FM7::KANJIROM *kanjiclass2;
533 #endif
534 #if defined(CAPABLE_JCOMMCARD)
535         MC6809 *jsubcpu;
536         FM7::FM7_JCOMMCARD *jcommcard;
537         AND *g_jsubhalt;
538 #endif
539 #if defined(_FM77L4)
540         HD46505 *l4crtc;
541 #endif
542         bool connect_320kfdc;
543         bool connect_1Mfdc;
544
545 public:
546         // ----------------------------------------
547         // initialize
548         // ----------------------------------------
549         
550         VM(EMU_TEMPLATE* parent_emu);
551         ~VM();
552         
553         // ----------------------------------------
554         // for emulation class
555         // ----------------------------------------
556         
557         // drive virtual machine
558         void reset() override;
559         void special_reset(int num) override;
560         void run() override;
561         double get_frame_rate() override;
562         
563 #ifdef USE_DEBUGGER
564         // debugger
565         DEVICE *get_cpu(int index) override;
566 #endif
567         void connect_bus(void);
568
569         void update_dipswitch(void) override;
570         // draw screen
571         void draw_screen() override;
572         
573         // sound generation
574         void initialize_sound(int rate, int samples) override;
575         uint16_t* create_sound(int* extra_frames) override;
576         int get_sound_buffer_ptr() override;
577 #ifdef USE_SOUND_VOLUME
578         void set_sound_device_volume(int ch, int decibel_l, int decibel_r) override;
579 #endif
580         void set_vm_frame_rate(double fps) override;
581         // notify key
582         void key_down(int code, bool repeat) override;
583         void key_up(int code) override;
584         bool get_caps_locked() override;
585         bool get_kana_locked() override;
586         uint32_t get_led_status() override; 
587         
588         // user interface
589         void open_floppy_disk(int drv, const _TCHAR* file_path, int bank) override;
590         void close_floppy_disk(int drv) override;
591         bool is_floppy_disk_inserted(int drv) override;
592         void is_floppy_disk_protected(int drv, bool value) override;
593         bool is_floppy_disk_protected(int drv) override;
594         uint32_t is_floppy_disk_accessed() override;
595         
596         void play_tape(int drv, const _TCHAR* file_path) override;
597         void rec_tape(int drv, const _TCHAR* file_path) override;
598         void close_tape(int drv) override;
599         bool is_tape_inserted(int drv) override;
600         bool is_tape_playing(int drv) override;
601         bool is_tape_recording(int drv) override;
602         int get_tape_position(int drv) override;
603         const _TCHAR* get_tape_message(int drv) override;
604         
605         bool is_frame_skippable() override;
606         void push_play(int drv) override;
607         void push_stop(int drv) override;
608         void push_fast_forward(int drv) override;
609         void push_fast_rewind(int drv) override;
610         void push_apss_forward(int drv) override;
611         void push_apss_rewind(int drv) override;
612         void update_config() override;
613         bool process_state(FILEIO* state_fio, bool loading);
614
615 #ifdef SUPPORT_QUERY_PHY_KEY_NAME
616         int get_key_name_table_size(void) override;
617         const _TCHAR *get_phy_key_name_by_scancode(uint32_t scancode) override;
618         const _TCHAR *get_phy_key_name_by_vk(uint32_t vk) override;
619         uint32_t get_scancode_by_vk(uint32_t vk) override;
620         uint32_t get_vk_by_scancode(uint32_t scancode) override;
621 #endif
622         
623 #if defined(USE_BUBBLE)
624         void open_bubble_casette(int drv, const _TCHAR *path, int bank) override;
625         void close_bubble_casette(int drv) override;
626         bool is_bubble_casette_inserted(int drv) override;
627         bool is_bubble_casette_protected(int drv) override;
628         void is_bubble_casette_protected(int drv, bool flag) override;
629 #endif
630 #if defined(USE_DIG_RESOLUTION)
631         void get_screen_resolution(int *w, int *h) override;
632 #endif
633 #if defined(USE_MINIMUM_RENDERING)      
634         bool is_screen_changed(void) override;
635 #endif  
636         double get_current_usec() override;
637         uint64_t get_current_clock_uint64() override;
638         // ----------------------------------------
639         // for each device
640         // ----------------------------------------
641         void set_cpu_clock(DEVICE *cpu, uint32_t clocks) override;
642         // devices
643         //DEVICE* get_device(int id);
644 //      DEVICE* dummy;
645 //      DEVICE* first_device;
646 //      DEVICE* last_device;
647 };
648
649 #endif