OSDN Git Service

[VM][FM7] Add Japanese communication board (日本語通信カード) .
[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 #define MAX_DRIVE  4
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
63 #elif defined(_FMNEW7)
64 #define DEVICE_NAME             "FUJITSU FM-NEW7"
65 #define CONFIG_NAME             "fmnew7"
66 #define CAPABLE_Z80
67 #define DIPSWITCH_DEFAULT 0x000000000 
68 #define MAX_DRIVE  4
69 #define CAPABLE_JCOMMCARD 1
70
71 #elif defined(_FM77) || defined(_FM77L2)
72 # if defined(_FM77)
73 #define DEVICE_NAME             "FUJITSU FM-77"
74 #define CONFIG_NAME             "fm77"
75 #define DIPSWITCH_DEFAULT 0x00000001
76 # else
77 #define DEVICE_NAME             "FUJITSU FM-77L2"
78 #define CONFIG_NAME             "fm77l2"
79 #define DIPSWITCH_DEFAULT 0x00000003 
80 # endif
81 //#define USE_DRIVE_TYPE
82 #define _FM77_VARIANTS
83 #define CAPABLE_Z80
84 # ifndef FM77_EXRAM_BANKS
85 #   define FM77_EXRAM_BANKS     3
86 # endif
87 #define MAX_DRIVE  4
88
89 #elif defined(_FM77L4)
90 #define DEVICE_NAME             "FUJITSU FM-77L4"
91 #define CONFIG_NAME             "fm77l4"
92 #define HAS_MMR
93 #define HAS_TEXTVRAM
94 #define HAS_2HD
95 #define HAS_CYCLESTEAL
96 #define HAS_400LINECARD
97 //#define CAPABLE_KANJI_CLASS2
98 #define _FM77_VARIANTS
99 #define CAPABLE_Z80
100 # ifndef FM77_EXRAM_BANKS
101 #  define FM77_EXRAM_BANKS      3
102 # endif
103 #define DIPSWITCH_DEFAULT 0x00000003 
104 #define MAX_DRIVE  4
105 #define CAPABLE_JCOMMCARD 1
106
107 #elif defined(_FM77AV)
108 #define DEVICE_NAME             "FUJITSU FM77AV"
109 #define CONFIG_NAME             "fm77av"
110 #define _FM77AV_VARIANTS
111 #define DIPSWITCH_DEFAULT 0x80000001 
112 #define MAX_DRIVE  2
113 #define CAPABLE_JCOMMCARD 1
114
115 #elif defined(_FM77AV20)
116 #define DEVICE_NAME             "FUJITSU FM77AV20"
117 #define CONFIG_NAME             "fm77av20"
118 #define _FM77AV_VARIANTS
119 #define HAS_MMR
120 #define HAS_2DD_2D
121 #define CAPABLE_DICTROM
122 //#define USE_DRIVE_TYPE 2
123 #define CAPABLE_KANJI_CLASS2
124 #define DIPSWITCH_DEFAULT 0x80000001 
125 #define MAX_DRIVE  2
126
127 #elif defined(_FM77AV20EX)
128 #define DEVICE_NAME             "FUJITSU FM77AV20EX"
129 #define CONFIG_NAME             "fm77av20ex"
130 #define _FM77AV_VARIANTS
131 #define HAS_MMR
132 #define HAS_2DD_2D
133 #define HAS_DMA
134 //#define USE_DRIVE_TYPE 2
135 #define CAPABLE_DICTROM
136 #define CAPABLE_KANJI_CLASS2
137 #define DIPSWITCH_DEFAULT 0x80000001 
138 #define MAX_DRIVE  4
139
140 #elif defined(_FM77AV40)
141 #define DEVICE_NAME             "FUJITSU FM77AV40"
142 #define CONFIG_NAME             "fm77av40"
143 #define _FM77AV_VARIANTS
144 #define HAS_2DD_2D
145 #define HAS_DMA
146 //#define USE_DRIVE_TYPE 2
147 #define CAPABLE_DICTROM
148 #define HAS_400LINE_AV
149 #define CAPABLE_KANJI_CLASS2
150 #ifndef FM77_EXRAM_BANKS
151 #define FM77_EXRAM_BANKS        12
152 #endif
153 #define DIPSWITCH_DEFAULT 0x8000000d 
154 #define MAX_DRIVE  4
155
156 #elif defined(_FM77AV40EX)
157 #define DEVICE_NAME             "FUJITSU FM77AV40EX"
158 #define CONFIG_NAME             "fm77av40ex"
159 #define _FM77AV_VARIANTS
160 #define HAS_2DD_2D
161 #define HAS_DMA
162 //#define USE_DRIVE_TYPE 2
163 #define CAPABLE_DICTROM
164 #define HAS_400LINE_AV
165 #define CAPABLE_KANJI_CLASS2
166 #ifndef FM77_EXRAM_BANKS
167 #define FM77_EXRAM_BANKS        12
168 #endif
169 #define DIPSWITCH_DEFAULT 0x8000000d 
170 #define MAX_DRIVE  4
171
172 #elif defined(_FM77AV40SX)
173 #define DEVICE_NAME             "FUJITSU FM77AV40SX"
174 #define CONFIG_NAME             "fm77av40sx"
175 #define _FM77AV_VARIANTS
176 #define HAS_2DD_2D
177 #define HAS_DMA
178 //#define USE_DRIVE_TYPE 2
179 #define CAPABLE_DICTROM
180 #define HAS_400LINE_AV
181 #define CAPABLE_KANJI_CLASS2
182 # ifndef FM77_EXRAM_BANKS
183 #  define FM77_EXRAM_BANKS      12
184 # endif
185 #define DIPSWITCH_DEFAULT 0x8000000d 
186 #define MAX_DRIVE  4
187
188 #endif
189
190 #if defined(_FM8)
191 #define USE_SOUND_TYPE          2
192 #else
193 #define USE_MOUSE_TYPE          3
194 #define USE_SOUND_TYPE          8
195 #endif
196
197 #ifdef _FM77AV_VARIANTS
198 //#define CAPABLE_KANJI_CLASS2
199 #define HAS_MMR
200 #define HAS_CYCLESTEAL
201 #elif defined(_FM77_VARIANTS)
202 #define HAS_MMR
203 #define HAS_CYCLESTEAL
204 #define CAPABLE_Z80
205 #endif
206
207 #if defined(_FM77_VARIANTS)
208 #define USE_BOOT_MODE         4
209 #elif defined(_FM8)
210 #define USE_BOOT_MODE         4
211 #elif defined(_FM7) || defined(_FMNEW7)
212 #define USE_BOOT_MODE         3
213 #else
214 #define USE_BOOT_MODE         2
215 #endif
216
217 // 0 = PSG or NONE
218 // 1 = OPN (+PSG)
219 // 2 = WHG (+PSG)
220 // 3 = WHG + OPN (+PSG)
221 // 4 = THG  (+PSG)
222 // 5 = THG + OPN (+PSG)
223 // 6 = THG + WHG (+PSG)
224 // 7 = THG + WHG + OPN (+PSG)
225 #if defined(_FM8)
226 // WITHOUT PSG?
227 #define SOUND_TYPE_DEFAULT      0
228 #elif defined(_FM7) || defined(_FMNEW7) || defined(_FM77_VARIANTS)
229 // PSG ONLY
230 #define SOUND_TYPE_DEFAULT      0
231 #elif defined(_FM77AV_VARIANTS)
232 // OPN
233 #define SOUND_TYPE_DEFAULT      1
234 #endif
235
236 #if defined(_FM8)
237 #define USE_SOUND_VOLUME        5
238 #else
239 #define USE_SOUND_VOLUME        11
240 #endif
241 #define SUPPORT_TV_RENDER
242
243 #define IGNORE_DISK_CRC_DEFAULT         true
244 // device informations for virtual machine
245
246 // TODO: check refresh rate
247 #define FRAMES_PER_SEC          59.94
248 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || defined(_FM77L4)
249 #define LINES_PER_FRAME         400
250 #else
251 #define LINES_PER_FRAME         200
252 #endif
253
254 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
255     defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
256 #define CPU_CLOCKS              2016000
257 #elif defined(_FM8)
258 #define CPU_CLOCKS              1095000
259 #else
260 #define CPU_CLOCKS              2000000
261 #endif
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 #define SCREEN_WIDTH            640
276 #define SCREEN_HEIGHT           200
277 #  if defined(FIXED_FRAMEBUFFER_SIZE)
278 #define SCREEN_FAKE_WIDTH   640
279 #define SCREEN_FAKE_HEIGHT  400
280 # else
281 #define SCREEN_FAKE_WIDTH   640
282 #define SCREEN_FAKE_HEIGHT  200
283 # endif
284 # if !defined(FIXED_FRAMEBUFFER_SIZE)
285 //#define SCREEN_Y_ZOOM       2.0
286 #define SCREEN_Y_ZOOM       2.0
287 #endif
288
289 #endif
290 #define WINDOW_HEIGHT_ASPECT 480
291 #define HAS_MC6809              
292 #define MB8877_MAX_CHIPS        1
293 //#define IO_ADDR_MAX           0x10000
294
295 // device informations for win32
296 #define USE_FD1
297 #define USE_FD2
298
299 #if defined(HAS_2HD)
300 #define USE_FD3
301 #define USE_FD4
302 #endif
303
304
305 #ifdef BUILD_Z80
306 # ifdef CAPABLE_Z80
307 #  define WITH_Z80
308 # endif
309 #endif
310
311 // DIP Switch description
312 #define SWITCH_CYCLESTEAL 0x00000001
313 #if defined(_FM8)
314 #define SWITCH_URA_RAM    0x00000002
315 #else
316 #define SWITCH_URA_RAM    0x00000000
317 #endif
318 #define SWITCH_INVERT_CMT 0x00000004
319
320 // Belows are optional Hardwares.
321 #if !defined(_FM77_VARIANTS) && !defined(_FM77AV_VARIANTS)
322 #define SWITCH_FDC 0x00010000
323 #else
324 #define SWITCH_FDC 0x00000000
325 #endif
326 #if !defined(_FM77_VARIANTS) && !defined(_FM77AV_VARIANTS)
327 #define SWITCH_Z80 0x00020000
328 #else
329 #define SWITCH_Z80 0x00000000
330 #endif
331 #if defined(_FM77_VARIANTS)
332 #define SWITCH_DICTCARD 0x00040000
333 #else
334 #define SWITCH_DICTCARD 0x00000000
335 #endif
336 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
337 #define SWITCH_EXTRA_RAM 0x00080000
338 #else
339 #define SWITCH_EXTRA_RAM 0x00000000
340 #endif
341 #define MB8877_NO_BUSY_AFTER_SEEK
342
343 //#define ENABLE_OPENCL // If OpenCL renderer is enabled, define here.
344
345 //#include "../../config.h"
346 #include "../../common.h"
347 #include "../../fileio.h"
348
349 #ifdef USE_SOUND_VOLUME
350 static const _TCHAR *sound_device_caption[] = {
351 #if defined(_FM8)
352         _T("PSG(Hack)"),
353         _T("Beep"),
354         _T("CMT (Signal)"),
355         _T("Noise (FDD)"),
356         _T("Noise (CMT)"),
357 #else
358 # if !defined(_FM77AV_VARIANTS)
359         _T("PSG"),
360 # endif
361         _T("OPN (FM)"), _T("OPN (PSG)"), _T("WHG (FM)"), _T("WHG (PSG)"), _T("THG (FM)"), _T("THG (PSG)"),
362         _T("Beep"), _T("CMT (Signal)"),
363 # if defined(_FM77AV_VARIANTS)
364         _T("Keyboard"),
365 # endif
366         _T("Noise (FDD)"), _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 #if defined(USE_AY_3_8910_AS_PSG) && !defined(_FM77AV_VARIANTS)
398 class AY_3_891X;
399 #endif
400 #if defined(_FM8)
401 class BUBBLECASETTE;
402 #endif
403 class DISPLAY;
404 #if defined(_FM77AV_VARIANTS)
405 class MB61VH010;
406 #endif
407 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
408     defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
409 class HD6844;
410 #endif
411 class AND;
412 class FM7_MAINMEM;
413 class FM7_MAINIO;
414 class KEYBOARD;
415 class KANJIROM;
416 class JOYSTICK;
417
418 #ifdef WITH_Z80
419 class Z80;
420 class OR;
421 #endif
422 #ifdef CAPABLE_JCOMMCARD
423 class FM7_JCOMMCARD;
424 #endif
425
426 class VM {
427 protected:
428         EMU* emu;
429         
430         // devices
431         EVENT* event;
432         
433         MC6809* maincpu;
434         FM7_MAINMEM* mainmem;
435         FM7_MAINIO* mainio;
436         MB8877* fdc;
437 #if defined(_FM8)
438         // FM8
439 # if defined(USE_AY_3_8910_AS_PSG)
440         AY_3_891X *psg;
441 # else
442         YM2203* psg;
443 # endif
444 #else
445         // FM7 -
446         YM2203* opn[3];
447 # if !defined(_FM77AV_VARIANTS)
448 #  if defined(USE_AY_3_8910_AS_PSG)
449         AY_3_891X *psg;
450 #else
451         YM2203* psg; // Is right? AY-3-8910 is right device.
452 #  endif
453 # endif
454 #endif
455 #if defined(_FM8)
456         BUBBLECASETTE *bubble_casette[2];
457 #endif
458         //BEEP* beep;
459         PCM1BIT* pcm1bit;
460         DATAREC *drec;
461         JOYSTICK *joystick;
462         
463 #ifdef  WITH_Z80
464         Z80* z80cpu;
465         AND *g_nmi;
466         OR *g_intr;
467         AND *g_intr_irq;
468         AND *g_intr_firq;
469         AND *g_mainstat;
470 #endif
471         AND *g_substat_display;
472         AND *g_substat_mainhalt;
473         
474         DEVICE* printer;
475         DEVICE* inteli_mouse; 
476    
477         DEVICE *dummycpu;
478         MC6809* subcpu;
479 #if defined(_FM77AV_VARIANTS)
480         MB61VH010 *alu;
481         BEEP *keyboard_beep;
482 #endif
483 #if defined(HAS_DMA)
484         HD6844 *dmac;
485 #endif   
486         DISPLAY* display;
487         KEYBOARD* keyboard;
488    
489         KANJIROM *kanjiclass1;
490 #ifdef CAPABLE_KANJI_CLASS2
491         KANJIROM *kanjiclass2;
492 #endif
493 #if defined(CAPABLE_JCOMMCARD)
494         MC6809 *jsubcpu;
495         FM7_JCOMMCARD *jcommcard;
496 #endif
497         bool connect_320kfdc;
498         bool connect_1Mfdc;
499 public:
500         // ----------------------------------------
501         // initialize
502         // ----------------------------------------
503         
504         VM(EMU* parent_emu);
505         ~VM();
506         
507         // ----------------------------------------
508         // for emulation class
509         // ----------------------------------------
510         
511         // drive virtual machine
512         void reset();
513         void special_reset();
514         void run();
515         double get_frame_rate();
516         
517 #ifdef USE_DEBUGGER
518         // debugger
519         DEVICE *get_cpu(int index);
520 #endif
521         void initialize(void);
522         void connect_bus(void);
523
524         void update_dipswitch(void);
525         // draw screen
526         void draw_screen();
527         
528         // sound generation
529         void initialize_sound(int rate, int samples);
530         uint16_t* create_sound(int* extra_frames);
531         int get_sound_buffer_ptr();
532 #ifdef USE_SOUND_VOLUME
533         void set_sound_device_volume(int ch, int decibel_l, int decibel_r);
534 #endif
535         
536         // notify key
537         void key_down(int code, bool repeat);
538         void key_up(int code);
539         bool get_caps_locked();
540         bool get_kana_locked();
541         uint32_t get_extra_leds(); 
542         
543         // user interface
544         void open_floppy_disk(int drv, const _TCHAR* file_path, int bank);
545         void close_floppy_disk(int drv);
546         bool is_floppy_disk_inserted(int drv);
547         void is_floppy_disk_protected(int drv, bool value);
548         bool is_floppy_disk_protected(int drv);
549         uint32_t is_floppy_disk_accessed();
550         
551         void play_tape(int drv, const _TCHAR* file_path);
552         void rec_tape(int drv, const _TCHAR* file_path);
553         void close_tape(int drv);
554         bool is_tape_inserted(int drv);
555         bool is_tape_playing(int drv);
556         bool is_tape_recording(int drv);
557         int get_tape_position(int drv);
558         const _TCHAR* get_tape_message(int drv);
559         
560         bool is_frame_skippable();
561         void push_play(int drv);
562         void push_stop(int drv);
563         void push_fast_forward(int drv);
564         void push_fast_rewind(int drv);
565         void push_apss_forward(int drv);
566         void push_apss_rewind(int drv);
567         void update_config();
568         void save_state(FILEIO* state_fio);
569         bool load_state(FILEIO* state_fio);
570 #if defined(USE_BUBBLE1)
571         void open_bubble_casette(int drv, const _TCHAR *path, int bank);
572         void close_bubble_casette(int drv);
573         bool is_bubble_casette_inserted(int drv);
574         bool is_bubble_casette_protected(int drv);
575         void is_bubble_casette_protected(int drv, bool flag);
576 #endif
577 #if defined(USE_DIG_RESOLUTION)
578         void get_screen_resolution(int *w, int *h);
579 #endif
580 #if defined(USE_MINIMUM_RENDERING)      
581         bool is_screen_changed(void);
582 #endif  
583         // ----------------------------------------
584         // for each device
585         // ----------------------------------------
586         void set_cpu_clock(DEVICE *cpu, uint32_t clocks);
587         // devices
588         DEVICE* get_device(int id);
589         DEVICE* dummy;
590         DEVICE* first_device;
591         DEVICE* last_device;
592 };
593
594 #endif