OSDN Git Service

Merge branch 'master' of github.com:Artanejp/common_source_project-fm7
[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 #define USE_SOUND_FILES_FDD
115 #define USE_SOUND_FILES_BUTTONS
116 #define SUPPORT_ROMA_KANA_CONVERSION
117 // CZ-8BS1 x1
118 #define SOUND_DEVICE_TYPE_DEFAULT       1
119 #if defined(USE_SOUND_FILES)
120 # if defined(_X1TWIN)
121 # define USE_SOUND_VOLUME       7
122 # else
123 # define USE_SOUND_VOLUME       6
124 # endif
125 #else
126 # if defined(_X1TWIN)
127 # define USE_SOUND_VOLUME       5
128 # else
129 # define USE_SOUND_VOLUME       4
130 # endif
131 #endif
132 #define SUPPORT_TV_RENDER
133 #define USE_JOYSTICK
134 #define USE_JOY_BUTTON_CAPTIONS
135 #define USE_MOUSE
136 #define USE_PRINTER
137 #define USE_PRINTER_TYPE        4
138 #define USE_DEBUGGER
139 #define USE_STATE
140
141 #include "../../common.h"
142 #include "../../fileio.h"
143
144 #ifdef USE_SOUND_VOLUME
145 static const _TCHAR *sound_device_caption[] = {
146         _T("PSG"), _T("CZ-8BS1 #1"), _T("CZ-8BS1 #2"), _T("CMT"),
147 #if defined(_X1TWIN)
148         _T("Voice"),
149 #endif
150 #if defined(USE_SOUND_FILES)
151         _T("FDD SEEK"), _T("CMT BUTTONS"),
152 #endif
153 };
154 #endif
155
156 #ifdef USE_JOY_BUTTON_CAPTIONS
157 #ifdef _X1TWIN
158 static const _TCHAR *joy_button_captions[] = {
159         _T("Up"),
160         _T("Down"),
161         _T("Left"),
162         _T("Right"),
163         _T("Button #1"),
164         _T("Button #2"),
165         _T("Select"),
166         _T("Run"),
167         _T("Button #3"),
168         _T("Button #4"),
169         _T("Button #5"),
170         _T("Button #6"),
171 };
172 #else // not X1 Twin
173 static const _TCHAR *joy_button_captions[] = {
174         _T("Up"),
175         _T("Down"),
176         _T("Left"),
177         _T("Right"),
178         _T("Button #1"),
179         _T("Button #2"),
180 };
181 #endif
182 #endif
183 // from X-millenium
184
185 static const uint16_t ANKFONT7f_9f[0x21 * 8] = {
186         0x0000, 0x3000, 0x247f, 0x6c24, 0x484c, 0xce4b, 0x0000, 0x0000,
187
188         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff,
189         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff,
190         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff,
191         0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff,
192         0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
193         0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
194         0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
195         0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
196         0x8080, 0x8080, 0x8080, 0x8080, 0x8080, 0x8080, 0x8080, 0x8080,
197         0xc0c0, 0xc0c0, 0xc0c0, 0xc0c0, 0xc0c0, 0xc0c0, 0xc0c0, 0xc0c0,
198         0xe0e0, 0xe0e0, 0xe0e0, 0xe0e0, 0xe0e0, 0xe0e0, 0xe0e0, 0xe0e0,
199         0xf0f0, 0xf0f0, 0xf0f0, 0xf0f0, 0xf0f0, 0xf0f0, 0xf0f0, 0xf0f0,
200         0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8,
201         0xfcfc, 0xfcfc, 0xfcfc, 0xfcfc, 0xfcfc, 0xfcfc, 0xfcfc, 0xfcfc,
202         0xfefe, 0xfefe, 0xfefe, 0xfefe, 0xfefe, 0xfefe, 0xfefe, 0xfefe,
203         0x0101, 0x0202, 0x0404, 0x0808, 0x1010, 0x2020, 0x4040, 0x8080,
204
205         0x0000, 0x0000, 0x0000, 0x0000, 0x00ff, 0x0000, 0x0000, 0x0000,
206         0x1010, 0x1010, 0x1010, 0x1010, 0x1010, 0x1010, 0x1010, 0x1010,
207         0x1010, 0x1010, 0x1010, 0x1010, 0x00ff, 0x0000, 0x0000, 0x0000,
208         0x0000, 0x0000, 0x0000, 0x0000, 0x10ff, 0x1010, 0x1010, 0x1010,
209         0x1010, 0x1010, 0x1010, 0x1010, 0x10f0, 0x1010, 0x1010, 0x1010,
210         0x1010, 0x1010, 0x1010, 0x1010, 0x101f, 0x1010, 0x1010, 0x1010,
211         0x1010, 0x1010, 0x1010, 0x1010, 0x10ff, 0x1010, 0x1010, 0x1010,
212         0x0000, 0x0000, 0x0000, 0x0000, 0x10f0, 0x1010, 0x1010, 0x1010,
213         0x1010, 0x1010, 0x1010, 0x1010, 0x00f0, 0x0000, 0x0000, 0x0000,
214         0x1010, 0x1010, 0x1010, 0x1010, 0x001f, 0x0000, 0x0000, 0x0000,
215         0x0000, 0x0000, 0x0000, 0x0000, 0x101f, 0x1010, 0x1010, 0x1010,
216         0x0000, 0x0000, 0x0000, 0x0000, 0x4080, 0x2020, 0x1010, 0x1010,
217         0x1010, 0x1010, 0x0810, 0x0408, 0x0003, 0x0000, 0x0000, 0x0000,
218         0x1010, 0x1010, 0x2010, 0x4020, 0x0080, 0x0000, 0x0000, 0x0000,
219         0x0000, 0x0000, 0x0000, 0x0000, 0x0403, 0x0808, 0x1010, 0x1010,
220         0x8080, 0x4040, 0x2020, 0x1010, 0x0808, 0x0404, 0x0202, 0x0101
221 };
222
223 static const uint16_t ANKFONTe0_ff[0x20 * 8] = {
224         0x0000, 0x7e3c, 0xffff, 0xdbdb, 0xffff, 0xe7db, 0x7eff, 0x003c,
225         0x0000, 0x423c, 0x8181, 0xa5a5, 0x8181, 0x99a5, 0x4281, 0x003c,
226         0x0000, 0x3810, 0x7c7c, 0xfefe, 0xfefe, 0x106c, 0x7c38, 0x0000,
227         0x0000, 0x6c00, 0xfefe, 0xfefe, 0xfefe, 0x7c7c, 0x1038, 0x0000,
228         0x0000, 0x1010, 0x3838, 0x7c7c, 0x7cfe, 0x387c, 0x1038, 0x0010,
229         0x0000, 0x3810, 0x7c7c, 0x5438, 0xfefe, 0x6cfe, 0x7c10, 0x0000,
230         0x0101, 0x0303, 0x0707, 0x0f0f, 0x1f1f, 0x3f3f, 0x7f7f, 0xffff,
231         0x8080, 0xc0c0, 0xe0e0, 0xf0f0, 0xf8f8, 0xfcfc, 0xfefe, 0xffff,
232         0x8181, 0x4242, 0x2424, 0x1818, 0x1818, 0x2424, 0x4242, 0x8181,
233         0xf0f0, 0xf0f0, 0xf0f0, 0xf0f0, 0x0000, 0x0000, 0x0000, 0x0000,
234         0x0000, 0x0000, 0x0000, 0x0000, 0xf0f0, 0xf0f0, 0xf0f0, 0xf0f0,
235         0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, 0x0000, 0x0000, 0x0000, 0x0000,
236         0x0000, 0x0000, 0x0000, 0x0000, 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f,
237         0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, 0xf0f0, 0xf0f0, 0xf0f0, 0xf0f0,
238         0xf0f0, 0xf0f0, 0xf0f0, 0xf0f0, 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f,
239         0x81ff, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0xff81,
240
241         0x55aa, 0x55aa, 0x55aa, 0x55aa, 0x55aa, 0x55aa, 0x55aa, 0x55aa,
242         0x1000, 0x1010, 0xf01e, 0x1010, 0x1010, 0x1010, 0x7e10, 0x00c0,
243         0x1000, 0x2418, 0x7c42, 0x1090, 0x781c, 0x5410, 0xfe54, 0x0000,
244         0x1000, 0x1010, 0xfe10, 0x1010, 0x3030, 0x565c, 0x9090, 0x0010,
245         0x1000, 0x1210, 0xf412, 0x3034, 0x5030, 0x9654, 0x1090, 0x0000,
246         0x0800, 0x8808, 0x5292, 0x1454, 0x2020, 0x5020, 0x465c, 0x0040,
247         0x0000, 0xe23c, 0x8282, 0x82fa, 0x7a82, 0x4242, 0x0044, 0x0000,
248         0x0000, 0x443c, 0x8242, 0xf282, 0x8282, 0x8282, 0x3844, 0x0000,
249         0x0800, 0x5e18, 0xa468, 0xe4be, 0xbea4, 0xb2a2, 0x0a5a, 0x0002,
250         0x0000, 0x2628, 0x4042, 0xe23c, 0x2222, 0x4222, 0x4442, 0x0004,
251         0x0800, 0x0808, 0xda7a, 0x5454, 0x46e4, 0xe442, 0x08c4, 0x0000,
252         0x0000, 0x7e40, 0x8848, 0x28be, 0x2828, 0x3e28, 0x08e8, 0x0008,
253         0x0000, 0x723c, 0x9252, 0x9292, 0x8292, 0x84fc, 0x8484, 0x0000,
254         0x0000, 0x1010, 0x2010, 0x2020, 0x6040, 0x8c50, 0x8286, 0x0000,
255         0x0000, 0x4040, 0x784e, 0x88c0, 0x388e, 0x0848, 0x7e08, 0x0000,
256         0x0000, 0x7c00, 0x0000, 0x0000, 0x10fe, 0x1010, 0x1010, 0x0010
257 };
258
259 class EMU;
260 class DEVICE;
261 class EVENT;
262
263 class DATAREC;
264 class HD46505;
265 class I8255;
266 class IO;
267 class MB8877;
268 class YM2151;
269 //class YM2203;
270 class AY_3_891X;
271 class Z80;
272 class Z80CTC;
273 class Z80SIO;
274 #ifdef _X1TURBO_FEATURE
275 class Z80DMA;
276 #endif
277
278 class DISPLAY;
279 class EMM;
280 class FLOPPY;
281 class IOBUS;
282 class JOYSTICK;
283 class MEMORY;
284 class MOUSE;
285 class PSUB;
286
287 class MCS48;
288 class UPD1990A;
289 class SUB;
290 class KEYBOARD;
291
292 #ifdef _X1TWIN
293 class HUC6280;
294 class PCE;
295 #endif
296 class VM
297 {
298 protected:
299         EMU* emu;
300         
301         // devices for x1
302         EVENT* event;
303         
304         DATAREC* drec;
305         DEVICE* printer;
306         HD46505* crtc;
307         I8255* pio;
308         IO* io;
309         MB8877* fdc;
310         YM2151* opm1;
311         YM2151* opm2;
312         //YM2203* psg;
313         AY_3_891X* psg;
314         Z80* cpu;
315         Z80CTC* ctc;
316         Z80SIO* sio;
317         Z80CTC* ctc1;
318         Z80CTC* ctc2;
319 #ifdef _X1TURBO_FEATURE
320         Z80DMA* dma;
321 #endif
322         DISPLAY* display;
323         EMM* emm;
324         FLOPPY* floppy;
325         IOBUS* iobus;
326         JOYSTICK* joy;
327         MEMORY* memory;
328         MOUSE* mouse;
329         PSUB* psub;
330         
331         MCS48* cpu_sub;
332         UPD1990A* rtc_sub;
333         I8255* pio_sub;
334         SUB* sub;
335         
336         MCS48* cpu_kbd;
337         KEYBOARD* kbd;
338         
339         bool pseudo_sub_cpu;
340         int sound_device_type;
341         
342 #ifdef _X1TWIN
343         // device for pce
344         EVENT* pceevent;
345         
346         HUC6280* pcecpu;
347         PCE* pce;
348 #endif
349         
350 public:
351         // ----------------------------------------
352         // initialize
353         // ----------------------------------------
354         
355         VM(EMU* parent_emu);
356         ~VM();
357         
358         // ----------------------------------------
359         // for emulation class
360         // ----------------------------------------
361         
362         // drive virtual machine
363         void reset();
364         void special_reset();
365         void run();
366         double get_frame_rate();
367         
368 #ifdef USE_DEBUGGER
369         // debugger
370         DEVICE *get_cpu(int index);
371 #endif
372         
373         // draw screen
374         void draw_screen();
375         uint32_t get_access_lamp_status();
376         
377         // sound generation
378         void initialize_sound(int rate, int samples);
379         uint16_t* create_sound(int* extra_frames);
380         int get_sound_buffer_ptr();
381 #ifdef USE_SOUND_VOLUME
382         void set_sound_device_volume(int ch, int decibel_l, int decibel_r);
383 #endif
384         
385         // notify key
386         void key_down(int code, bool repeat);
387         void key_up(int code);
388         
389         // user interface
390         void open_floppy_disk(int drv, const _TCHAR* file_path, int bank);
391         void close_floppy_disk(int drv);
392         bool is_floppy_disk_inserted(int drv);
393         void is_floppy_disk_protected(int drv, bool value);
394         bool is_floppy_disk_protected(int drv);
395         void play_tape(const _TCHAR* file_path);
396         void rec_tape(const _TCHAR* file_path);
397         void close_tape();
398         bool is_tape_inserted();
399         bool is_tape_playing();
400         bool is_tape_recording();
401         int get_tape_position();
402         void push_play();
403         void push_stop();
404         void push_fast_forward();
405         void push_fast_rewind();
406         void push_apss_forward();
407         void push_apss_rewind();
408         bool is_frame_skippable();
409 #ifdef _X1TWIN
410         void open_cart(int drv, const _TCHAR* file_path);
411         void close_cart(int drv);
412         bool is_cart_inserted(int drv);
413 #endif
414         
415         void update_config();
416 #ifdef _X1TURBO_FEATURE
417         void update_dipswitch();
418 #endif
419         void save_state(FILEIO* state_fio);
420         bool load_state(FILEIO* state_fio);
421         
422         // ----------------------------------------
423         // for each device
424         // ----------------------------------------
425         
426         // devices
427         DEVICE* get_device(int id);
428         DEVICE* dummy;
429         DEVICE* first_device;
430         DEVICE* last_device;
431 };
432
433 #endif