OSDN Git Service

[VM][X1][FM7] load_state(): Keep backward compatibility to SNAPSHOT 20160923.
[csp-qt/common_source_project-fm7.git] / source / src / vm / x1 / x1.h
1 /*
2         SHARP X1 Emulator 'eX1'
3         SHARP X1twin Emulator 'eX1twin'
4         SHARP X1turbo Emulator 'eX1turbo'
5
6         Author : Takeda.Toshiya
7         Date   : 2009.03.11-
8
9         [ virtual machine ]
10 */
11
12 #ifndef _X1_H_
13 #define _X1_H_
14
15 #if defined(_X1TURBOZ)
16 #define DEVICE_NAME             "SHARP X1turboZ"
17 #define CONFIG_NAME             "x1turboz"
18 #elif defined(_X1TURBO)
19 #define DEVICE_NAME             "SHARP X1turbo"
20 #define CONFIG_NAME             "x1turbo"
21 #elif defined(_X1TWIN)
22 #define DEVICE_NAME             "SHARP X1twin"
23 #define CONFIG_NAME             "x1twin"
24 #else
25 #define DEVICE_NAME             "SHARP X1"
26 #define CONFIG_NAME             "x1"
27 #endif
28
29 #if defined(_X1TURBO) || defined(_X1TURBOZ)
30 #define _X1TURBO_FEATURE
31 #endif
32
33 // device informations for virtual machine (x1)
34 #define VDP_CLOCK               28636363
35 //#ifdef _X1TURBO_FEATURE
36 //24KHz
37 //#define FRAMES_PER_SEC        55.49
38 //#define LINES_PER_FRAME       448
39 //#define CHARS_PER_LINE        56
40 //#define HD46505_CHAR_CLOCK    (VDP_CLOCK * 1.5 / 32.0)
41 //#else
42 // 15KHz
43 #define FRAMES_PER_SEC          61.94
44 #define LINES_PER_FRAME         258
45 #define CHARS_PER_LINE          56
46 #define HD46505_CHAR_CLOCK      (VDP_CLOCK / 32.0)
47 //#endif
48 #define CPU_CLOCKS              4000000
49 #define SCREEN_WIDTH            640
50 #define SCREEN_HEIGHT           400
51 #define WINDOW_HEIGHT_ASPECT    480
52 #define MAX_DRIVE               4
53 #define IO_ADDR_MAX             0x10000
54 #define HAS_AY_3_8910
55 #define Z80_IO_WAIT
56 #ifdef _X1TURBO_FEATURE
57 #define SINGLE_MODE_DMA
58 #endif
59 #define DATAREC_FAST_FWD_SPEED  16
60 #define DATAREC_FAST_REW_SPEED  16
61 #define PRINTER_STROBE_RISING_EDGE
62 #define SUPPORT_VARIABLE_TIMING
63
64 #ifdef _X1TURBO_FEATURE
65 #define IPL_ROM_FILE_SIZE       0x8000
66 #define IPL_ROM_FILE_NAME       _T("IPLROM.X1T")
67 #define SUB_ROM_FILE_NAME       _T("SUBROM.X1T")
68 #define KBD_ROM_FILE_NAME       _T("KBDROM.X1T")
69 #else
70 #define IPL_ROM_FILE_SIZE       0x1000
71 #define IPL_ROM_FILE_NAME       _T("IPLROM.X1")
72 #define SUB_ROM_FILE_NAME       _T("SUBROM.X1")
73 #define KBD_ROM_FILE_NAME       _T("KBDROM.X1")
74 #endif
75 #define CRC32_MSM80C49_262      0x43EE7D6F      // X1turbo with CMT
76 #define CRC32_MSM80C49_277      0x75904EFB      // X1turbo (not supported yet)
77
78 #ifdef _X1TWIN
79 // device informations for virtual machine (pce)
80 #define PCE_FRAMES_PER_SEC      60
81 #define PCE_LINES_PER_FRAME     262
82 #define PCE_CPU_CLOCKS          7159090
83 #endif
84
85 // device informations for win32
86 #define USE_SPECIAL_RESET
87 #ifdef _X1TURBO_FEATURE
88 #define USE_DEVICE_TYPE         2
89 // Keyboard mode B
90 #define DEVICE_TYPE_DEFAULT     1
91 #define USE_DRIVE_TYPE          2
92 #endif
93 #define USE_FD1
94 #define USE_FD2
95 #define FD_BASE_NUMBER          0
96 #define USE_TAPE
97 #define USE_TAPE_BUTTON
98 #ifdef _X1TWIN
99 #define USE_CART1
100 #endif
101 #define NOTIFY_KEY_DOWN
102 #define USE_SHIFT_NUMPAD_KEY
103 #define USE_ALT_F10_KEY
104 #define USE_AUTO_KEY            8
105 #define USE_AUTO_KEY_RELEASE    10
106 #define USE_MONITOR_TYPE        2
107 #define USE_CRT_FILTER
108 #define USE_SCANLINE
109 #define USE_ACCESS_LAMP
110 #define USE_SOUND_DEVICE_TYPE           3
111 // ToDo
112 #define DATAREC_SOUND
113 #define USE_SOUND_FILES             5
114 // CZ-8BS1 x1
115 #define SOUND_DEVICE_TYPE_DEFAULT       1
116 #if defined(USE_SOUND_FILES)
117 # if defined(_X1TWIN)
118 # define USE_SOUND_VOLUME       7
119 # else
120 # define USE_SOUND_VOLUME       6
121 # endif
122 #else
123 # if defined(_X1TWIN)
124 # define USE_SOUND_VOLUME       5
125 # else
126 # define USE_SOUND_VOLUME       4
127 # endif
128 #endif
129 #define USE_JOYSTICK
130 #define USE_JOY_BUTTON_CAPTIONS
131 #define USE_MOUSE
132 #define USE_PRINTER
133 #define USE_PRINTER_TYPE        4
134 #define USE_DEBUGGER
135 #define USE_STATE
136
137 #include "../../common.h"
138 #include "../../fileio.h"
139
140 #ifdef USE_SOUND_VOLUME
141 static const _TCHAR *sound_device_caption[] = {
142         _T("PSG"), _T("CZ-8BS1 #1"), _T("CZ-8BS1 #2"), _T("CMT"),
143 #if defined(_X1TWIN)
144         _T("Voice"),
145 #endif
146 #if defined(USE_SOUND_FILES)
147         _T("FDD SEEK"), _T("CMT BUTTONS"),
148 #endif
149 };
150 #endif
151
152 #ifdef USE_JOY_BUTTON_CAPTIONS
153 #ifdef _X1TWIN
154 static const _TCHAR *joy_button_captions[] = {
155         _T("Up"),
156         _T("Down"),
157         _T("Left"),
158         _T("Right"),
159         _T("Button #1"),
160         _T("Button #2"),
161         _T("Select"),
162         _T("Run"),
163         _T("Button #3"),
164         _T("Button #4"),
165         _T("Button #5"),
166         _T("Button #6"),
167 };
168 #else // not X1 Twin
169 static const _TCHAR *joy_button_captions[] = {
170         _T("Up"),
171         _T("Down"),
172         _T("Left"),
173         _T("Right"),
174         _T("Button #1"),
175         _T("Button #2"),
176 };
177 #endif
178 #endif
179 // from X-millenium
180
181 static const uint16_t ANKFONT7f_9f[0x21 * 8] = {
182         0x0000, 0x3000, 0x247f, 0x6c24, 0x484c, 0xce4b, 0x0000, 0x0000,
183
184         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff,
185         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff,
186         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff,
187         0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff,
188         0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
189         0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
190         0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
191         0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
192         0x8080, 0x8080, 0x8080, 0x8080, 0x8080, 0x8080, 0x8080, 0x8080,
193         0xc0c0, 0xc0c0, 0xc0c0, 0xc0c0, 0xc0c0, 0xc0c0, 0xc0c0, 0xc0c0,
194         0xe0e0, 0xe0e0, 0xe0e0, 0xe0e0, 0xe0e0, 0xe0e0, 0xe0e0, 0xe0e0,
195         0xf0f0, 0xf0f0, 0xf0f0, 0xf0f0, 0xf0f0, 0xf0f0, 0xf0f0, 0xf0f0,
196         0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8,
197         0xfcfc, 0xfcfc, 0xfcfc, 0xfcfc, 0xfcfc, 0xfcfc, 0xfcfc, 0xfcfc,
198         0xfefe, 0xfefe, 0xfefe, 0xfefe, 0xfefe, 0xfefe, 0xfefe, 0xfefe,
199         0x0101, 0x0202, 0x0404, 0x0808, 0x1010, 0x2020, 0x4040, 0x8080,
200
201         0x0000, 0x0000, 0x0000, 0x0000, 0x00ff, 0x0000, 0x0000, 0x0000,
202         0x1010, 0x1010, 0x1010, 0x1010, 0x1010, 0x1010, 0x1010, 0x1010,
203         0x1010, 0x1010, 0x1010, 0x1010, 0x00ff, 0x0000, 0x0000, 0x0000,
204         0x0000, 0x0000, 0x0000, 0x0000, 0x10ff, 0x1010, 0x1010, 0x1010,
205         0x1010, 0x1010, 0x1010, 0x1010, 0x10f0, 0x1010, 0x1010, 0x1010,
206         0x1010, 0x1010, 0x1010, 0x1010, 0x101f, 0x1010, 0x1010, 0x1010,
207         0x1010, 0x1010, 0x1010, 0x1010, 0x10ff, 0x1010, 0x1010, 0x1010,
208         0x0000, 0x0000, 0x0000, 0x0000, 0x10f0, 0x1010, 0x1010, 0x1010,
209         0x1010, 0x1010, 0x1010, 0x1010, 0x00f0, 0x0000, 0x0000, 0x0000,
210         0x1010, 0x1010, 0x1010, 0x1010, 0x001f, 0x0000, 0x0000, 0x0000,
211         0x0000, 0x0000, 0x0000, 0x0000, 0x101f, 0x1010, 0x1010, 0x1010,
212         0x0000, 0x0000, 0x0000, 0x0000, 0x4080, 0x2020, 0x1010, 0x1010,
213         0x1010, 0x1010, 0x0810, 0x0408, 0x0003, 0x0000, 0x0000, 0x0000,
214         0x1010, 0x1010, 0x2010, 0x4020, 0x0080, 0x0000, 0x0000, 0x0000,
215         0x0000, 0x0000, 0x0000, 0x0000, 0x0403, 0x0808, 0x1010, 0x1010,
216         0x8080, 0x4040, 0x2020, 0x1010, 0x0808, 0x0404, 0x0202, 0x0101
217 };
218
219 static const uint16_t ANKFONTe0_ff[0x20 * 8] = {
220         0x0000, 0x7e3c, 0xffff, 0xdbdb, 0xffff, 0xe7db, 0x7eff, 0x003c,
221         0x0000, 0x423c, 0x8181, 0xa5a5, 0x8181, 0x99a5, 0x4281, 0x003c,
222         0x0000, 0x3810, 0x7c7c, 0xfefe, 0xfefe, 0x106c, 0x7c38, 0x0000,
223         0x0000, 0x6c00, 0xfefe, 0xfefe, 0xfefe, 0x7c7c, 0x1038, 0x0000,
224         0x0000, 0x1010, 0x3838, 0x7c7c, 0x7cfe, 0x387c, 0x1038, 0x0010,
225         0x0000, 0x3810, 0x7c7c, 0x5438, 0xfefe, 0x6cfe, 0x7c10, 0x0000,
226         0x0101, 0x0303, 0x0707, 0x0f0f, 0x1f1f, 0x3f3f, 0x7f7f, 0xffff,
227         0x8080, 0xc0c0, 0xe0e0, 0xf0f0, 0xf8f8, 0xfcfc, 0xfefe, 0xffff,
228         0x8181, 0x4242, 0x2424, 0x1818, 0x1818, 0x2424, 0x4242, 0x8181,
229         0xf0f0, 0xf0f0, 0xf0f0, 0xf0f0, 0x0000, 0x0000, 0x0000, 0x0000,
230         0x0000, 0x0000, 0x0000, 0x0000, 0xf0f0, 0xf0f0, 0xf0f0, 0xf0f0,
231         0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, 0x0000, 0x0000, 0x0000, 0x0000,
232         0x0000, 0x0000, 0x0000, 0x0000, 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f,
233         0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, 0xf0f0, 0xf0f0, 0xf0f0, 0xf0f0,
234         0xf0f0, 0xf0f0, 0xf0f0, 0xf0f0, 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f,
235         0x81ff, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0xff81,
236
237         0x55aa, 0x55aa, 0x55aa, 0x55aa, 0x55aa, 0x55aa, 0x55aa, 0x55aa,
238         0x1000, 0x1010, 0xf01e, 0x1010, 0x1010, 0x1010, 0x7e10, 0x00c0,
239         0x1000, 0x2418, 0x7c42, 0x1090, 0x781c, 0x5410, 0xfe54, 0x0000,
240         0x1000, 0x1010, 0xfe10, 0x1010, 0x3030, 0x565c, 0x9090, 0x0010,
241         0x1000, 0x1210, 0xf412, 0x3034, 0x5030, 0x9654, 0x1090, 0x0000,
242         0x0800, 0x8808, 0x5292, 0x1454, 0x2020, 0x5020, 0x465c, 0x0040,
243         0x0000, 0xe23c, 0x8282, 0x82fa, 0x7a82, 0x4242, 0x0044, 0x0000,
244         0x0000, 0x443c, 0x8242, 0xf282, 0x8282, 0x8282, 0x3844, 0x0000,
245         0x0800, 0x5e18, 0xa468, 0xe4be, 0xbea4, 0xb2a2, 0x0a5a, 0x0002,
246         0x0000, 0x2628, 0x4042, 0xe23c, 0x2222, 0x4222, 0x4442, 0x0004,
247         0x0800, 0x0808, 0xda7a, 0x5454, 0x46e4, 0xe442, 0x08c4, 0x0000,
248         0x0000, 0x7e40, 0x8848, 0x28be, 0x2828, 0x3e28, 0x08e8, 0x0008,
249         0x0000, 0x723c, 0x9252, 0x9292, 0x8292, 0x84fc, 0x8484, 0x0000,
250         0x0000, 0x1010, 0x2010, 0x2020, 0x6040, 0x8c50, 0x8286, 0x0000,
251         0x0000, 0x4040, 0x784e, 0x88c0, 0x388e, 0x0848, 0x7e08, 0x0000,
252         0x0000, 0x7c00, 0x0000, 0x0000, 0x10fe, 0x1010, 0x1010, 0x0010
253 };
254
255 class EMU;
256 class DEVICE;
257 class EVENT;
258
259 class DATAREC;
260 class HD46505;
261 class I8255;
262 class IO;
263 class MB8877;
264 class YM2151;
265 class YM2203;
266 class Z80;
267 class Z80CTC;
268 class Z80SIO;
269 #ifdef _X1TURBO_FEATURE
270 class Z80DMA;
271 #endif
272
273 class DISPLAY;
274 class EMM;
275 class FLOPPY;
276 class IOBUS;
277 class JOYSTICK;
278 class MEMORY;
279 class MOUSE;
280 class PSUB;
281
282 class MCS48;
283 class UPD1990A;
284 class SUB;
285 class KEYBOARD;
286
287 #ifdef _X1TWIN
288 class HUC6280;
289 class PCE;
290 #endif
291 class VM
292 {
293 protected:
294         EMU* emu;
295         
296         // devices for x1
297         EVENT* event;
298         
299         DATAREC* drec;
300         DEVICE* printer;
301         HD46505* crtc;
302         I8255* pio;
303         IO* io;
304         MB8877* fdc;
305         YM2151* opm1;
306         YM2151* opm2;
307         YM2203* psg;
308         Z80* cpu;
309         Z80CTC* ctc;
310         Z80SIO* sio;
311         Z80CTC* ctc1;
312         Z80CTC* ctc2;
313 #ifdef _X1TURBO_FEATURE
314         Z80DMA* dma;
315 #endif
316         DISPLAY* display;
317         EMM* emm;
318         FLOPPY* floppy;
319         IOBUS* iobus;
320         JOYSTICK* joy;
321         MEMORY* memory;
322         MOUSE* mouse;
323         PSUB* psub;
324         
325         MCS48* cpu_sub;
326         UPD1990A* rtc_sub;
327         I8255* pio_sub;
328         SUB* sub;
329         
330         MCS48* cpu_kbd;
331         KEYBOARD* kbd;
332         
333         bool pseudo_sub_cpu;
334         int sound_device_type;
335         
336 #ifdef _X1TWIN
337         // device for pce
338         EVENT* pceevent;
339         
340         HUC6280* pcecpu;
341         PCE* pce;
342 #endif
343         
344 public:
345         // ----------------------------------------
346         // initialize
347         // ----------------------------------------
348         
349         VM(EMU* parent_emu);
350         ~VM();
351         
352         // ----------------------------------------
353         // for emulation class
354         // ----------------------------------------
355         
356         // drive virtual machine
357         void reset();
358         void special_reset();
359         void run();
360         double get_frame_rate();
361         
362 #ifdef USE_DEBUGGER
363         // debugger
364         DEVICE *get_cpu(int index);
365 #endif
366         
367         // draw screen
368         void draw_screen();
369         uint32_t get_access_lamp_status();
370         
371         // sound generation
372         void initialize_sound(int rate, int samples);
373         uint16_t* create_sound(int* extra_frames);
374         int get_sound_buffer_ptr();
375 #ifdef USE_SOUND_VOLUME
376         void set_sound_device_volume(int ch, int decibel_l, int decibel_r);
377 #endif
378         
379         // notify key
380         void key_down(int code, bool repeat);
381         void key_up(int code);
382         
383         // user interface
384         void open_floppy_disk(int drv, const _TCHAR* file_path, int bank);
385         void close_floppy_disk(int drv);
386         bool is_floppy_disk_inserted(int drv);
387         void is_floppy_disk_protected(int drv, bool value);
388         bool is_floppy_disk_protected(int drv);
389         void play_tape(const _TCHAR* file_path);
390         void rec_tape(const _TCHAR* file_path);
391         void close_tape();
392         bool is_tape_inserted();
393         bool is_tape_playing();
394         bool is_tape_recording();
395         int get_tape_position();
396         void push_play();
397         void push_stop();
398         void push_fast_forward();
399         void push_fast_rewind();
400         void push_apss_forward();
401         void push_apss_rewind();
402         bool is_frame_skippable();
403 #ifdef _X1TWIN
404         void open_cart(int drv, const _TCHAR* file_path);
405         void close_cart(int drv);
406         bool is_cart_inserted(int drv);
407 #endif
408         
409         void update_config();
410 #ifdef _X1TURBO_FEATURE
411         void update_dipswitch();
412 #endif
413         void save_state(FILEIO* state_fio);
414         bool load_state(FILEIO* state_fio);
415         
416         // ----------------------------------------
417         // for each device
418         // ----------------------------------------
419         
420         // devices
421         DEVICE* get_device(int id);
422         DEVICE* dummy;
423         DEVICE* first_device;
424         DEVICE* last_device;
425 };
426
427 #endif