OSDN Git Service

[VM][FM8] Bubblecasette seems to work. Reading and writing may be okay.
[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
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_LED_DEVICE 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
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
36 #define USE_STATE
37 #define USE_DEBUGGER
38
39
40 #if defined(_FM8)
41 #define DEVICE_NAME             "FUJITSU FM-8"
42 #define CONFIG_NAME             "fm8"
43 #define CAPABLE_Z80
44 #define DIPSWITCH_DEFAULT 0x00000000 
45 #define USE_BUBBLE1
46 #define USE_BUBBLE2
47 #define MAX_BUBBLE 2
48
49 #elif defined(_FM7)
50 #define DEVICE_NAME             "FUJITSU FM-7"
51 #define CONFIG_NAME             "fm7"
52 #define CAPABLE_Z80
53 #define DIPSWITCH_DEFAULT 0x000000000 
54
55 #elif defined(_FMNEW7)
56 #define DEVICE_NAME             "FUJITSU FM-NEW7"
57 #define CONFIG_NAME             "fmnew7"
58 #define CAPABLE_Z80
59 #define DIPSWITCH_DEFAULT 0x000000000 
60
61 #elif defined(_FM77) || defined(_FM77L2)
62 # if defined(_FM77)
63 #define DEVICE_NAME             "FUJITSU FM-77"
64 #define CONFIG_NAME             "fm77"
65 #define DIPSWITCH_DEFAULT 0x00000001
66
67 # else
68 #define DEVICE_NAME             "FUJITSU FM-77L2"
69 #define CONFIG_NAME             "fm77l2"
70 #define DIPSWITCH_DEFAULT 0x00000003 
71 # endif
72 //#define USE_DRIVE_TYPE
73 #define _FM77_VARIANTS
74 #define CAPABLE_Z80
75 # ifndef FM77_EXRAM_BANKS
76 #   define FM77_EXRAM_BANKS     3
77 # endif
78
79 #elif defined(_FM77L4)
80 #define DEVICE_NAME             "FUJITSU FM-77L4"
81 #define CONFIG_NAME             "fm77l4"
82 #define HAS_MMR
83 #define HAS_TEXTVRAM
84 #define HAS_2HD
85 #define HAS_CYCLESTEAL
86 #define HAS_400LINECARD
87 //#define CAPABLE_KANJI_CLASS2
88 #define _FM77_VARIANTS
89 #define CAPABLE_Z80
90 # ifndef FM77_EXRAM_BANKS
91 #  define FM77_EXRAM_BANKS      3
92 # endif
93 #define DIPSWITCH_DEFAULT 0x00000003 
94
95 #elif defined(_FM77AV)
96 #define DEVICE_NAME             "FUJITSU FM77AV"
97 #define CONFIG_NAME             "fm77av"
98 #define _FM77AV_VARIANTS
99 #define DIPSWITCH_DEFAULT 0x80000001 
100
101 #elif defined(_FM77AV20)
102 #define DEVICE_NAME             "FUJITSU FM77AV20"
103 #define CONFIG_NAME             "fm77av20"
104 #define _FM77AV_VARIANTS
105 #define HAS_MMR
106 #define HAS_2DD_2D
107 #define CAPABLE_DICTROM
108 //#define USE_DRIVE_TYPE 2
109 #define CAPABLE_KANJI_CLASS2
110 #define DIPSWITCH_DEFAULT 0x80000001 
111
112 #elif defined(_FM77AV20EX)
113 #define DEVICE_NAME             "FUJITSU FM77AV20EX"
114 #define CONFIG_NAME             "fm77av20ex"
115 #define _FM77AV_VARIANTS
116 #define HAS_MMR
117 #define HAS_2DD_2D
118 #define HAS_DMA
119 //#define USE_DRIVE_TYPE 2
120 #define CAPABLE_DICTROM
121 #define CAPABLE_KANJI_CLASS2
122 #define DIPSWITCH_DEFAULT 0x80000001 
123
124 #elif defined(_FM77AV40)
125 #define DEVICE_NAME             "FUJITSU FM77AV40"
126 #define CONFIG_NAME             "fm77av40"
127 #define _FM77AV_VARIANTS
128 #define HAS_2DD_2D
129 #define HAS_DMA
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
136 #endif
137 #define DIPSWITCH_DEFAULT 0x8000000d 
138
139 #elif defined(_FM77AV40EX)
140 #define DEVICE_NAME             "FUJITSU FM77AV40EX"
141 #define CONFIG_NAME             "fm77av40ex"
142 #define _FM77AV_VARIANTS
143 #define HAS_2DD_2D
144 #define HAS_DMA
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
151 #endif
152 #define DIPSWITCH_DEFAULT 0x8000000d 
153
154 #elif defined(_FM77AV40SX)
155 #define DEVICE_NAME             "FUJITSU FM77AV40SX"
156 #define CONFIG_NAME             "fm77av40sx"
157 #define _FM77AV_VARIANTS
158 #define HAS_2DD_2D
159 #define HAS_DMA
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
166 # endif
167 #define DIPSWITCH_DEFAULT 0x8000000d 
168
169 #endif
170
171 #if defined(_FM8)
172 #define USE_SOUND_DEVICE_TYPE   2
173 #else
174 #define USE_DEVICE_TYPE         3
175 #define USE_SOUND_DEVICE_TYPE   8
176 #endif
177
178 #ifdef _FM77AV_VARIANTS
179
180 //#define CAPABLE_KANJI_CLASS2
181 #define HAS_MMR
182 #define HAS_CYCLESTEAL
183
184 #elif defined(_FM77_VARIANTS)
185
186 #define HAS_MMR
187 #define HAS_CYCLESTEAL
188 #define CAPABLE_Z80
189 #endif
190
191 #if defined(_FM77_VARIANTS)
192 #define USE_BOOT_MODE         4
193 #elif defined(_FM8)
194 #define USE_BOOT_MODE         4
195 #elif defined(_FM7) || defined(_FMNEW7)
196 #define USE_BOOT_MODE         3
197 #else
198 #define USE_BOOT_MODE         2
199 #endif
200
201 // 0 = PSG or NONE
202 // 1 = OPN (+PSG)
203 // 2 = WHG (+PSG)
204 // 3 = WHG + OPN (+PSG)
205 // 4 = THG  (+PSG)
206 // 5 = THG + OPN (+PSG)
207 // 6 = THG + WHG (+PSG)
208 // 7 = THG + WHG + OPN (+PSG)
209 #if defined(_FM8)
210 // WITHOUT PSG?
211 #define SOUND_DEVICE_TYPE_DEFAULT       0
212 #elif defined(_FM7) || defined(_FMNEW7) || defined(_FM77_VARIANTS)
213 // PSG ONLY
214 #define SOUND_DEVICE_TYPE_DEFAULT       0
215 #elif defined(_FM77AV_VARIANTS)
216 // OPN
217 #define SOUND_DEVICE_TYPE_DEFAULT       1
218 #endif
219 #if !defined(_FM77AV_VARIANTS)
220 #define USE_SOUND_VOLUME        9
221 #else
222 #define USE_SOUND_VOLUME        8
223 #endif
224 #define IGNORE_DISK_CRC_DEFAULT         true
225 // device informations for virtual machine
226
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
231 #else
232 #define LINES_PER_FRAME         200
233 #endif
234
235 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
236     defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
237 #define CPU_CLOCKS              2016000
238 #elif defined(_FM8)
239 #define CPU_CLOCKS              1095000
240 #else
241 #define CPU_CLOCKS              2000000
242 #endif
243
244 #define SCREEN_WIDTH            640
245 #define SCREEN_HEIGHT           400
246 #define WINDOW_HEIGHT_ASPECT 480
247 #define MAX_DRIVE               4
248 #define HAS_MC6809              
249 #define MB8877_MAX_CHIPS        1
250 //#define IO_ADDR_MAX           0x10000
251
252 // device informations for win32
253 #define USE_FD1
254 #define USE_FD2
255 #define MAX_FD 2
256
257 #if defined(HAS_2HD)
258 #define USE_FD3
259 #define USE_FD4
260 #undef  MAX_FD
261 #define MAX_FD 4
262 #endif
263
264
265 #ifdef BUILD_Z80
266 # ifdef CAPABLE_Z80
267 #  define WITH_Z80
268 # endif
269 #endif
270
271 // DIP Switch description
272 #define SWITCH_CYCLESTEAL 0x00000001
273 #if defined(_FM8)
274 #define SWITCH_URA_RAM    0x00000002
275 #else
276 #define SWITCH_URA_RAM    0x00000000
277 #endif
278 #define SWITCH_INVERT_CMT 0x00000004
279
280 // Belows are optional Hardwares.
281 #if !defined(_FM77_VARIANTS) && !defined(_FM77AV_VARIANTS)
282 #define SWITCH_FDC 0x00010000
283 #else
284 #define SWITCH_FDC 0x00000000
285 #endif
286 #if !defined(_FM77_VARIANTS) && !defined(_FM77AV_VARIANTS)
287 #define SWITCH_Z80 0x00020000
288 #else
289 #define SWITCH_Z80 0x00000000
290 #endif
291 #if defined(_FM77_VARIANTS)
292 #define SWITCH_DICTCARD 0x00040000
293 #else
294 #define SWITCH_DICTCARD 0x00000000
295 #endif
296 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
297 #define SWITCH_EXTRA_RAM 0x00080000
298 #else
299 #define SWITCH_EXTRA_RAM 0x00000000
300 #endif
301 //#define MB8877_NO_BUSY_AFTER_SEEK
302
303 //#define ENABLE_OPENCL // If OpenCL renderer is enabled, define here.
304
305 //#include "../../config.h"
306 #include "../../common.h"
307 #include "../../fileio.h"
308
309 #ifdef USE_SOUND_VOLUME
310 static const _TCHAR *sound_device_caption[] = {
311 #if defined(_FM8)
312         _T("PSG(Hack)"),
313         _T("Beep"),
314         _T("CMT"),
315 #else
316 # if !defined(_FM77AV_VARIANTS)
317         _T("PSG"),
318 # endif
319         _T("OPN (FM)"), _T("OPN (PSG)"), _T("WHG (FM)"), _T("WHG (PSG)"), _T("THG (FM)"), _T("THG (PSG)"),
320         _T("Beep"), _T("CMT"),
321 #endif  
322 };
323 #endif
324 #ifdef USE_JOY_BUTTON_CAPTIONS
325 static const _TCHAR *joy_button_captions[] = {
326         _T("Up"),
327         _T("Down"),
328         _T("Left"),
329         _T("Right"),
330         _T("Button #1(1st)"),
331         _T("Button #2(1st)"),
332         _T("Button #1(2nd)"),
333         _T("Button #2(2nd)"),
334 };
335 #endif
336
337 class EMU;
338 class DEVICE;
339 class EVENT;
340 class FILEIO;
341
342 #if defined(_FM77AV_VARIANTS)
343 class BEEP;
344 #endif
345 class PCM1BIT;
346 class MC6809;
347 class YM2203;
348 class MB8877;
349 class MEMORY;
350 class DATAREC;
351 #if defined(_FM8)
352 class BUBBLECASETTE;
353 #endif
354 #if defined(USE_LED_DEVICE)
355 class DUMMYDEVICE;
356 #endif
357
358 class DISPLAY;
359 #if defined(_FM77AV_VARIANTS)
360 class MB61VH010;
361 #endif
362 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
363     defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
364 class HD6844;
365 #endif
366 class FM7_MAINMEM;
367 class FM7_MAINIO;
368 class KEYBOARD;
369 class KANJIROM;
370 class JOYSTICK;
371
372 #if WITH_Z80
373 class Z80;
374 #endif
375
376 class VM {
377 protected:
378         EMU* emu;
379         
380         // devices
381         EVENT* event;
382         
383         MC6809* maincpu;
384         FM7_MAINMEM* mainmem;
385         FM7_MAINIO* mainio;
386 #if defined(USE_LED_DEVICE)
387         DUMMYDEVICE* led_terminate;
388 #else
389         DEVICE* led_terminate;
390 #endif
391         MB8877* fdc;
392 #if defined(_FM8)
393         YM2203 *psg;
394 #else   
395         YM2203* opn[3];
396 # if !defined(_FM77AV_VARIANTS)
397         YM2203* psg; // Is right? AY-3-8910 is right device.
398 # endif
399 #endif
400 #if defined(_FM8)
401         BUBBLECASETTE *bubble_casette[2];
402 #endif
403         //BEEP* beep;
404         PCM1BIT* pcm1bit;
405         DATAREC *drec;
406         JOYSTICK *joystick;
407         
408 #ifdef  WITH_Z80
409         Z80* z80cpu;
410 #endif
411         DEVICE* printer;
412         DEVICE* inteli_mouse; 
413    
414         DEVICE *dummycpu;
415         MC6809* subcpu;
416 #if defined(_FM77AV_VARIANTS)
417         MB61VH010 *alu;
418         BEEP *keyboard_beep;
419 #endif
420 #if defined(HAS_DMA)
421         HD6844 *dmac;
422 #endif   
423         DISPLAY* display;
424         KEYBOARD* keyboard;
425    
426         KANJIROM *kanjiclass1;
427 #ifdef CAPABLE_KANJI_CLASS2
428         KANJIROM *kanjiclass2;
429 #endif
430 public:
431         // ----------------------------------------
432         // initialize
433         // ----------------------------------------
434         
435         VM(EMU* parent_emu);
436         ~VM();
437         
438         // ----------------------------------------
439         // for emulation class
440         // ----------------------------------------
441         
442         // drive virtual machine
443         void reset();
444         void special_reset();
445         void run();
446         double get_frame_rate();
447 #if defined(USE_LED_DEVICE)
448         uint32_t get_led_status();
449 #endif
450         
451 #ifdef USE_DEBUGGER
452         // debugger
453         DEVICE *get_cpu(int index);
454 #endif
455         void initialize(void);
456         void connect_bus(void);
457
458         void update_dipswitch(void);
459         // draw screen
460         void draw_screen();
461         uint32_t get_access_lamp_status();
462         
463         // sound generation
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);
469 #endif
470         
471         // notify key
472         void key_down(int code, bool repeat);
473         void key_up(int code);
474         
475         // user interface
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);
481         
482         void play_tape(const _TCHAR* file_path);
483         void rec_tape(const _TCHAR* file_path);
484         void close_tape();
485         bool is_tape_inserted();
486         bool is_tape_playing();
487         bool is_tape_recording();
488         int get_tape_position();
489         
490         bool is_frame_skippable();
491         void push_play();
492         void push_stop();
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);
506 #endif
507 #if defined(USE_DIG_RESOLUTION)
508         void get_screen_resolution(int *w, int *h);
509 #endif
510 #if defined(USE_MINIMUM_RENDERING)      
511         bool is_screen_changed(void);
512 #endif  
513         // ----------------------------------------
514         // for each device
515         // ----------------------------------------
516         void set_cpu_clock(DEVICE *cpu, uint32_t clocks);
517         // devices
518         DEVICE* get_device(int id);
519         DEVICE* dummy;
520         DEVICE* first_device;
521         DEVICE* last_device;
522 };
523
524 #endif