OSDN Git Service

806732038836c63437c103e177de86fd0196f4e7
[csp-qt/common_source_project-fm7.git] / source / src / vm / msx / msx_ex.h
1 /*
2         Common Source Code Project
3         MSX Series (experimental)
4
5         Origin : src/vm/msx/msx.h
6
7         modified by umaiboux
8         Date   : 2016.03.xx-
9
10         [ virtual machine ]
11 */
12
13 #ifndef _MSX_EX_H_
14 #define _MSX_EX_H_
15
16 #if defined(_PX7)
17 #define DEVICE_NAME             "PIONEER PX-7"
18 #define CONFIG_NAME             "px7"
19 #elif defined(_MSX1)
20 #define DEVICE_NAME             "ASCII MSX1"
21 #define CONFIG_NAME             "msx1"
22 #elif defined(_MSX2)
23 #define DEVICE_NAME             "ASCII MSX2"
24 #define CONFIG_NAME             "msx2"
25 #elif defined(_MSX2P)
26 #define DEVICE_NAME             "ASCII MSX2+"
27 #define CONFIG_NAME             "msx2p"
28 #elif defined(_HX20)
29 #define DEVICE_NAME             "TOSHIBA HX-20+"
30 #define CONFIG_NAME             "hx20"
31 #elif defined(_FSA1)
32 #define DEVICE_NAME             "Panasonic FS-A1"
33 #define CONFIG_NAME             "fsa1"
34 #elif defined(_HBF1XDJ)
35 #define DEVICE_NAME             "SONY HB-F1XDJ"
36 #define CONFIG_NAME             "hbf1xdj"
37 #endif
38
39 #if defined(_PX7)
40
41 #define _MSX1_VARIANTS
42 #define MAINROM_SLOT    0x00
43 #define CART1_SLOT      0x01
44 #define LDC_SLOT        0x02
45 #define CART2_SLOT      0x03
46 #define MAINROM_PLUS_RAM_32K
47
48 #elif defined(_HX20)
49
50 #define _MSX1_VARIANTS
51 #define MAINROM_SLOT    0x00
52 #define CART1_SLOT      0x01
53 #define CART2_SLOT      0x02
54 #define RAM64K_SLOT     0x83
55 #define FDD_PATCH_SLOT  0x8B
56 #define FIRMWARE32K1_SLOT 0x8F
57 #define FIRMWARE32K1_FILENAME _T("HX20FIRM.ROM")
58 #define MSX_PSG_STEREO
59
60 #elif defined(_FSA1)
61
62 #define _MSX2_VARIANTS
63 #define MAINROM_SLOT    0x00
64 #define CART1_SLOT      0x01
65 #define CART2_SLOT      0x02
66 #define RAM64K_SLOT     0x83
67 #define SUBROM_SLOT     0x87
68 #define FIRMWARE32K1_SLOT 0x8B
69 #define FIRMWARE32K1_FILENAME _T("FSA1FIRM1.ROM")
70 #define FIRMWARE32K2_SLOT 0x8F
71 #define FIRMWARE32K2_FILENAME _T("FSA1FIRM2.ROM")
72 #define MSX_KEYBOARD_50ON
73
74 #elif defined(_HBF1XDJ)
75
76 #define _MSX2P_VARIANTS
77 #define MAINROM_SLOT    0x80
78 //#define HALNOTE_SLOT  0x8C /* MSX-JE */
79 #define CART1_SLOT      0x01
80 #define CART2_SLOT      0x02
81 #define MAPPERRAM_SLOT  0x83
82 #define SUBROM_SLOT     0x87
83 #define FDD_PATCH_SLOT  0x8B
84 #define MSXMUSIC_SLOT   0x8F
85 #define MAPPERRAM_SIZE  (64*1024)
86 #define MAPPERRAM_MASK  0x03
87
88 #elif defined(_MSX2P)
89
90 #define _MSX2P_VARIANTS
91 #define MAINROM_SLOT    0x80
92 #define MSXMUSIC_SLOT   0x88
93 #define MSXDOS2_SLOT    0x8C
94 #define CART1_SLOT      0x01
95 #define CART2_SLOT      0x02
96 #define MAPPERRAM_SLOT  0x83
97 #define SUBROM_SLOT     0x87
98 #define FDD_PATCH_SLOT  0x8B
99 #define MAPPERRAM_SIZE  (2*1024*1024)
100 #define MAPPERRAM_MASK  0x7F
101 #define MSX_FDD_PATCH_WITH_2HD
102
103 #elif defined(_MSX2)
104
105 #define _MSX2_VARIANTS
106 #define MAINROM_SLOT    0x00
107 #define CART1_SLOT      0x01
108 #define CART2_SLOT      0x02
109 #define MAPPERRAM_SLOT  0x83
110 #define SUBROM_SLOT     0x87
111 #define MSXDOS2_SLOT    0x8B
112 #define FDD_PATCH_SLOT  0x8F
113 #define MAPPERRAM_SIZE  (128*1024)
114 #define MAPPERRAM_MASK  0x07
115
116 #elif defined(_MSX1)
117
118 #define _MSX1_VARIANTS
119 #define MAINROM_SLOT    0x00
120 #define CART1_SLOT      0x01
121 #define CART2_SLOT      0x02
122 #define MAPPERRAM_SLOT  0x83
123 #define MSXMUSIC_SLOT   0x87
124 #define FDD_PATCH_SLOT  0x8B
125 #define MAPPERRAM_SIZE  (128*1024)
126 #define MAPPERRAM_MASK  0x07
127
128 #endif
129
130 #if defined(_MSX_VDP_MESS)
131 #if defined(_MSX2P_VARIANTS)
132 #define V99X8 v9958_device
133 #elif defined(_MSX2_VARIANTS)
134 #define V99X8 v9938_device
135 #endif
136 #endif
137
138 // device informations for virtual machine
139 #define FRAMES_PER_SEC          60
140 #define LINES_PER_FRAME         262
141 #define CPU_CLOCKS              3579545
142 #if !defined(_MSX1_VARIANTS)
143 #if defined(_MSX_VDP_MESS)
144 //#define SCREEN_WIDTH          (544)   // v99x8_device::HVISIBLE
145 //#define SCREEN_HEIGHT         (480)   //
146 //#define WINDOW_WIDTH_ASPECT   (544*9/8)
147 #define SCREEN_WIDTH            ((256 + 15)*2)  // same as V99X8_WIDTH
148 #define SCREEN_HEIGHT           ((212 + 15)*2)  // same as V99X8_HEIGHT
149 #define WINDOW_WIDTH_ASPECT     ((288 + 17)*2)
150 #else
151 #define SCREEN_WIDTH            ((256 + 15)*2)  // V99X8_WIDTH
152 #define SCREEN_HEIGHT           ((212 + 15)*2)  // V99X8_HEIGHT
153 #define WINDOW_WIDTH_ASPECT     ((288 + 17)*2)
154 #endif
155 #else
156 #define SCREEN_WIDTH            512
157 #define SCREEN_HEIGHT           384
158 #define WINDOW_WIDTH_ASPECT     576
159 #endif
160 #define TMS9918A_VRAM_SIZE      0x4000
161 #define TMS9918A_LIMIT_SPRITES
162 #if defined(LDC_SLOT)
163 #define TMS9918A_SUPER_IMPOSE
164 #endif
165 #if defined(FDD_PATCH_SLOT)
166 #define MAX_DRIVE               2
167 #define SUPPORT_MEDIA_TYPE_1DD
168 #define Z80_PSEUDO_BIOS
169 #endif
170 #define HAS_AY_3_8910
171 // for Flappy Limited '85
172 #define AY_3_891X_PORT_MODE     0x80
173
174 // device informations for win32
175 #define USE_CART                2
176 #define USE_TAPE                1
177 #define USE_TAPE_BUTTON
178 #if defined(LDC_SLOT)
179 #define USE_LASER_DISC          1
180 #define USE_MOVIE_PLAYER
181 #endif
182 #if defined(FDD_PATCH_SLOT)
183 #define USE_FLOPPY_DISK         2
184 #endif
185 #define USE_ALT_F10_KEY
186 #define USE_AUTO_KEY            6
187 #define USE_AUTO_KEY_RELEASE    10
188 #if defined(_PX7)
189 #define USE_SOUND_VOLUME        8
190 #else
191 #define USE_SOUND_VOLUME        7
192 #endif
193 #define USE_JOYSTICK
194 #define USE_DEBUGGER
195 #define USE_STATE
196 #define USE_PRINTER
197 #define USE_PRINTER_TYPE        4
198 #if defined(MSX_PSG_STEREO)
199 #define USE_SOUND_TYPE          2
200 #endif
201 #define USE_CPU_Z80
202 #define SUPPORT_TV_RENDER
203
204 #include "../../common.h"
205 #include "../../fileio.h"
206 #include "../vm_template.h"
207
208 #ifdef USE_SOUND_VOLUME
209 static const _TCHAR *sound_device_caption[] = {
210         _T("PSG"), _T("Beep"), _T("CMT (Signal)"),
211 #if defined(_PX7)
212         _T("LD-700"),
213 #endif
214         _T("Cart#1"), _T("Cart#2"), _T("MSX-MUSIC"), _T("Noise (CMT)"),
215 };
216 #endif
217
218 class EMU;
219 class DEVICE;
220 class EVENT;
221
222 class DATAREC;
223 class I8255;
224 class IO;
225 #if defined(LDC_SLOT)
226 class LD700;
227 #endif
228 class NOT;
229 //class YM2203;
230 class AY_3_891X;
231 class PCM1BIT;
232 #if !defined(_MSX1_VARIANTS)
233 class RP5C01;
234 class V99X8;
235 #else
236 class TMS9918A;
237 #endif
238 class Z80;
239
240 namespace MSX {
241         class JOYSTICK;
242         class KEYBOARD;
243         class MEMORY_EX;
244 #if !defined(_MSX1_VARIANTS)
245         class RTCIF;
246 #endif
247         class SLOT_MAINROM;
248         class SLOT_CART;
249         class SOUND_CART;
250         class KANJIROM;
251 #if defined(MSX_PSG_STEREO)
252         class PSG_STEREO;
253 #endif
254 #if defined(USE_PRINTER)
255         class PRINTER;
256 #endif
257 #if defined(LDC_SLOT)
258         class SLOT_LDC;
259 #endif
260 #if defined(MAPPERRAM_SLOT)
261         class SLOT_MAPPERRAM;
262 #endif
263 #if defined(RAM64K_SLOT)
264         class SLOT_RAM64K;
265 #endif
266 #if defined(SUBROM_SLOT)
267         class SLOT_SUBROM;
268 #endif
269 #if defined(FIRMWARE32K1_SLOT)
270         class SLOT_FIRMWARE32K;
271 #endif
272 #if defined(FDD_PATCH_SLOT)
273         class SLOT_FDD_PATCH;
274 #endif
275 #if defined(MSXDOS2_SLOT)
276         class SLOT_MSXDOS2;
277 #endif
278 }
279 class YM2413;
280 #if defined(MSXMUSIC_SLOT)
281 namespace MSX {
282         class SLOT_MSXMUSIC;
283 }
284 #endif
285
286
287 class VM : public VM_TEMPLATE
288 {
289 protected:
290         //EMU* emu;
291         //csp_state_utils* state_entry;
292         
293         // devices
294         //EVENT* event;
295         
296         DATAREC* drec;
297         I8255* pio;
298         IO* io;
299 #if defined(LDC_SLOT)
300         LD700* ldp;
301 #endif
302         NOT* not_remote;
303 //      YM2203* psg;
304         AY_3_891X* psg;
305         PCM1BIT* pcm;
306 #if !defined(_MSX1_VARIANTS)
307         RP5C01* rtc;
308         V99X8* vdp;
309 #else
310         TMS9918A* vdp;
311 #endif
312         Z80* cpu;
313         
314         MSX::JOYSTICK* joystick;
315         MSX::KEYBOARD* keyboard;
316         MSX::MEMORY_EX* memory;
317 #if !defined(_MSX1_VARIANTS)
318         MSX::RTCIF* rtcif;
319 #endif
320         MSX::SLOT_MAINROM *slot_mainrom;
321         MSX::SLOT_CART *slot_cart[2];
322         MSX::SOUND_CART* sound_cart[2];
323         MSX::KANJIROM* kanjirom;
324 #if defined(MSX_PSG_STEREO)
325         MSX::PSG_STEREO* psg_stereo;
326 #endif
327 #ifdef USE_PRINTER
328         MSX::PRINTER* printer;
329 #endif
330 #if defined(LDC_SLOT)
331         MSX::SLOT_LDC *slot_ldc;
332 #endif
333 #if defined(MAPPERRAM_SLOT)
334         MSX::SLOT_MAPPERRAM *slot_ram;
335 #endif
336 #if defined(RAM64K_SLOT)
337         MSX::SLOT_RAM64K *slot_ram;
338 #endif
339 #if defined(SUBROM_SLOT)
340         MSX::SLOT_SUBROM *slot_subrom;
341 #endif
342 #if defined(FIRMWARE32K1_SLOT)
343         MSX::SLOT_FIRMWARE32K *slot_firmware32k1;
344 #endif
345 #if defined(FIRMWARE32K2_SLOT)
346         MSX::SLOT_FIRMWARE32K *slot_firmware32k2;
347 #endif
348 #if defined(FDD_PATCH_SLOT)
349         MSX::SLOT_FDD_PATCH *slot_fdd_patch;
350 #endif
351 #if defined(MSXDOS2_SLOT)
352         MSX::SLOT_MSXDOS2 *slot_msxdos2;
353 #endif
354         YM2413* ym2413;
355 #if defined(MSXMUSIC_SLOT)
356         MSX::SLOT_MSXMUSIC *slot_msxmusic;
357 #endif
358         
359 public:
360         // ----------------------------------------
361         // initialize
362         // ----------------------------------------
363         
364         VM(EMU* parent_emu);
365         ~VM();
366         
367         // ----------------------------------------
368         // for emulation class
369         // ----------------------------------------
370         
371         // drive virtual machine
372         void reset();
373         void run();
374         
375 #ifdef USE_DEBUGGER
376         // debugger
377         DEVICE *get_cpu(int index);
378 #endif
379         
380         // draw screen
381         void draw_screen();
382         
383         // sound generation
384         void initialize_sound(int rate, int samples);
385         uint16_t* create_sound(int* extra_frames);
386         int get_sound_buffer_ptr();
387 #if defined(LDC_SLOT)
388         void movie_sound_callback(uint8_t *buffer, long size);
389 #endif
390 #ifdef USE_SOUND_VOLUME
391         void set_sound_device_volume(int ch, int decibel_l, int decibel_r);
392 #endif
393         
394         // user interface
395         void open_cart(int drv, const _TCHAR* file_path);
396         void close_cart(int drv);
397         bool is_cart_inserted(int drv);
398         void play_tape(int drv, const _TCHAR* file_path);
399         void rec_tape(int drv, const _TCHAR* file_path);
400         void close_tape(int drv);
401         bool is_tape_inserted(int drv);
402         bool is_tape_playing(int drv);
403         bool is_tape_recording(int drv);
404         int get_tape_position(int drv);
405         const _TCHAR* get_tape_message(int drv);
406         void push_play(int drv);
407         void push_stop(int drv);
408         void push_fast_forward(int drv);
409         void push_fast_rewind(int drv);
410         void push_apss_forward(int drv) {}
411         void push_apss_rewind(int drv) {}
412 #if defined(LDC_SLOT)
413         void open_laser_disc(int drv, const _TCHAR* file_path);
414         void close_laser_disc(int drv);
415         bool is_laser_disc_inserted(int drv);
416         uint32_t is_laser_disc_accessed();
417 #endif
418 #if defined(FDD_PATCH_SLOT)
419         void open_floppy_disk(int drv, const _TCHAR* file_path, int bank);
420         void close_floppy_disk(int drv);
421         bool is_floppy_disk_inserted(int drv);
422         void is_floppy_disk_protected(int drv, bool value);
423         bool is_floppy_disk_protected(int drv);
424         uint32_t is_floppy_disk_accessed();
425 #endif
426         bool is_frame_skippable();
427         
428         void update_config();
429         bool process_state(FILEIO* state_fio, bool loading);
430         
431         // ----------------------------------------
432         // for each device
433         // ----------------------------------------
434         
435         // devices
436         DEVICE* get_device(int id);
437         //DEVICE* dummy;
438         //DEVICE* first_device;
439         //DEVICE* last_device;
440 };
441
442 #endif