OSDN Git Service

[VM][FMTOWNS][JOYSTICK][MOUSE] Re-Implement mouse.Still not working.
[csp-qt/common_source_project-fm7.git] / source / src / vm / fmtowns / fmtowns.h
1 /*
2         FUJITSU FMR-50 Emulator 'eFMTowns'
3
4         Author : Kyuma.Ohta <whatisthis.sowhat _at_ gmail.com>
5         Date   : 2019.01.09-
6         [ virtual machine ]
7 */
8 #pragma once
9
10
11 #undef WITH_386SX
12 #undef WITH_I486DX
13 #undef WITH_I486SX
14 #undef WITH_PENTIUM
15 #undef TYPE_TOWNS_X0
16 #undef TYPE_TOWNS2_UX
17 #undef TYPE_TOWNS2_CX
18
19
20 #define HAS_MB89311
21
22 #define RAM_SIZE_ORDER (1024*1024)
23
24 #if defined(_FMTOWNS_1)
25 #define DEVICE_NAME             "FUJITSU FM-Towns Model 1"
26 #define CONFIG_NAME             "fmtowns1"
27 #define MAX_DRIVE       1
28 #define _HAS_HDD        4
29 #undef HAS_MB89311
30 #define USE_VARIABLE_MEMORY 6
31 #define MIN_RAM_SIZE 1
32
33 #elif defined(_FMTOWNS_2)
34 #define DEVICE_NAME             "FUJITSU FM-Towns Model 2"
35 #define CONFIG_NAME             "fmtowns2"
36 #define MAX_DRIVE       2
37 #define _HAS_HDD        4
38 #undef HAS_MB89311
39 #define USE_VARIABLE_MEMORY 6
40 #define MIN_RAM_SIZE 1
41
42 #elif defined(_FMTOWNS_2F)
43 #define DEVICE_NAME             "FUJITSU FM-Towns 2F"
44 #define CONFIG_NAME             "fmtowns2F"
45 #define MAX_DRIVE       2
46 #undef  _HAS_HDD
47 #define _FMTOWNS1_2ND_GEN
48 #define USE_VARIABLE_MEMORY 8
49 #define MIN_RAM_SIZE 2
50
51 #elif defined(_FMTOWNS_2H)
52 #define DEVICE_NAME             "FUJITSU FM-Towns 2H"
53 #define CONFIG_NAME             "fmtowns2H"
54 #define MAX_DRIVE       2
55 #define _HAS_HDD        4
56 #define _FMTOWNS1_2ND_GEN
57 #define USE_VARIABLE_MEMORY 8
58 #define MIN_RAM_SIZE 2
59
60 #elif defined(_FMTOWNS_20F)
61 #define DEVICE_NAME             "FUJITSU FM-Towns 20F"
62 #define CONFIG_NAME             "fmtowns20F"
63 #define MAX_DRIVE       2
64 #undef  _HAS_HDD
65 #define TYPE_TOWNS_X0   1
66 #define _FMTOWNS1_3RD_GEN
67 #define USE_VARIABLE_MEMORY 8
68 #define MIN_RAM_SIZE 2
69
70 #elif defined(_FMTOWNS_40H)
71 #define DEVICE_NAME             "FUJITSU FM-Towns 40H"
72 #define CONFIG_NAME             "fmtowns20H"
73 #define MAX_DRIVE       2
74 #define _HAS_HDD        4
75 #define TYPE_TOWNS_X0   1
76 #define _FMTOWNS1_3RD_GEN
77 #define USE_VARIABLE_MEMORY 8
78 #define MIN_RAM_SIZE 2
79
80 #elif defined(_FMTOWNS2_UX20)
81 #define DEVICE_NAME             "FUJITSU FM-Towns II UX20"
82 #define CONFIG_NAME             "fmtowns2UX20"
83 #define MAX_DRIVE       2
84 #undef  _HAS_HDD
85 #define WITH_386SX      1
86 #define TYPE_TOWNS2_UX  1
87 #define _FMTOWNS_UX_VARIANTS
88 #define USE_VARIABLE_MEMORY 9
89 #define MIN_RAM_SIZE 2
90
91 #elif defined(_FMTOWNS2_UX40)
92 #define DEVICE_NAME             "FUJITSU FM-Towns II UX40"
93 #define CONFIG_NAME             "fmtowns2UX40"
94 #define MAX_DRIVE       2
95 #define _HAS_HDD        4
96 #define WITH_386SX      1
97 #define TYPE_TOWNS2_UX  1
98 #define _FMTOWNS_UX_VARIANTS
99 #define USE_VARIABLE_MEMORY 9
100 #define MIN_RAM_SIZE 2
101
102 #elif defined(_FMTOWNS2_CX20)
103 #define DEVICE_NAME             "FUJITSU FM-Towns II CX20"
104 #define CONFIG_NAME             "fmtowns2CX20"
105 #define MAX_DRIVE       2
106 #undef _HAS_HDD
107 #define TYPE_TOWNS2_CX  1
108 #define _FMTOWNS2_CX_VARIANTS
109 #define USE_VARIABLE_MEMORY 15
110 #define MIN_RAM_SIZE 2
111
112 #elif defined(_FMTOWNS2_CX40)
113 #define DEVICE_NAME             "FUJITSU FM-Towns II CX40"
114 #define CONFIG_NAME             "fmtowns2CX40"
115 #define MAX_DRIVE       2
116 #define _HAS_HDD        4
117 #define TYPE_TOWNS2_CX  1
118 #define _FMTOWNS2_CX_VARIANTS
119 #define USE_VARIABLE_MEMORY 15
120 #define MIN_RAM_SIZE 2
121
122 #elif defined(_FMTOWNS2_CX100)
123 #define DEVICE_NAME             "FUJITSU FM-Towns II CX40"
124 #define CONFIG_NAME             "fmtowns2CX100"
125 #define MAX_DRIVE       2
126 #define _HAS_HDD        4
127 #define TYPE_TOWNS2_CX  1
128 #define USE_VARIABLE_MEMORY 15
129 #define MIN_RAM_SIZE 2
130 #define _FMTOWNS2_CX_VARIANTS
131
132 #elif defined(_FMTOWNS2_UG10)
133 #define DEVICE_NAME             "FUJITSU FM-Towns II UG10"
134 #define CONFIG_NAME             "fmtowns2UG1"
135 #define MAX_DRIVE       2
136 #undef  _HAS_HDD        
137 #define WITH_386SX      1
138 #define USE_VARIABLE_MEMORY 9
139 #define MIN_RAM_SIZE 2
140
141 #define _FMTOWNS_UG_VARIANTS
142
143 #elif defined(_FMTOWNS2_UG20)
144 #define DEVICE_NAME             "FUJITSU FM-Towns II UG20"
145 #define CONFIG_NAME             "fmtowns2UG20"
146 #define MAX_DRIVE       2
147 #undef  _HAS_HDD        
148 #define WITH_386SX      1
149 #define USE_VARIABLE_MEMORY 9
150 #define MIN_RAM_SIZE 2
151
152 #define _FMTOWNS_UG_VARIANTS
153
154 #elif defined(_FMTOWNS2_UG40)
155 #define DEVICE_NAME             "FUJITSU FM-Towns II UG40"
156 #define CONFIG_NAME             "fmtowns2UG40"
157 #define MAX_DRIVE       2
158 #define _HAS_HDD        4
159 #define WITH_386SX      1
160 #define USE_VARIABLE_MEMORY 9
161 #define MIN_RAM_SIZE 2
162
163 #define _FMTOWNS_UG_VARIANTS
164
165 #elif defined(_FMTOWNS2_UG80)
166 #define DEVICE_NAME             "FUJITSU FM-Towns II UG80"
167 #define CONFIG_NAME             "fmtowns2UG80"
168 #define MAX_DRIVE       2
169 #define _HAS_HDD        1
170 #define WITH_386SX      1
171 #define USE_VARIABLE_MEMORY 9
172 #define MIN_RAM_SIZE 2
173
174 #define _FMTOWNS_UG_VARIANTS
175
176 #elif defined(_FMTOWNS2_HG20)
177 #define DEVICE_NAME             "FUJITSU FM-Towns II HG20"
178 #define CONFIG_NAME             "fmtowns2HG20"
179 #define MAX_DRIVE       2
180 #undef _HAS_HDD        
181 #define USE_VARIABLE_MEMORY 15
182 #define MIN_RAM_SIZE 2
183
184 #define _FMTOWNS_HG_VARIANTS
185 #elif defined(_FMTOWNS2_HG40)
186 #define DEVICE_NAME             "FUJITSU FM-Towns II HG40"
187 #define CONFIG_NAME             "fmtowns2HG40"
188 #define MAX_DRIVE       2
189 #define _HAS_HDD          4
190
191 #define USE_VARIABLE_MEMORY 15
192 #define MIN_RAM_SIZE 2
193
194 #define _FMTOWNS_HG_VARIANTS
195
196 #elif defined(_FMTOWNS2_HR20)
197 #define DEVICE_NAME             "FUJITSU FM-Towns II HR20"
198 #define CONFIG_NAME             "fmtowns2HR20"
199 #define MAX_DRIVE       2
200 #define _HAS_HDD        4
201 #define _FMTOWNS_HR_VARIANTS
202
203 #define USE_VARIABLE_MEMORY 31
204 #define MIN_RAM_SIZE 2
205
206 #define WITH_I486SX
207 #elif defined(_FMTOWNS2_HR100)
208 #define DEVICE_NAME             "FUJITSU FM-Towns II HR100"
209 #define CONFIG_NAME             "fmtowns2HR100"
210 #define MAX_DRIVE       2
211 #define _HAS_HDD        4
212
213 #define USE_VARIABLE_MEMORY 31
214 #define MIN_RAM_SIZE 2
215
216 #define _FMTOWNS_HR_VARIANTS
217 #define WITH_I486SX
218
219 #elif defined(_FMTOWNS2_HR200)
220 #define DEVICE_NAME             "FUJITSU FM-Towns II HR200"
221 #define CONFIG_NAME             "fmtowns2HR200"
222 #define MAX_DRIVE       2
223 #define _HAS_HDD        4
224 #define _FMTOWNS_HR_VARIANTS
225 #define WITH_I486SX
226
227 #define USE_VARIABLE_MEMORY 31
228 #define MIN_RAM_SIZE 2
229
230 #endif
231
232 #if defined(WITH_386SX)
233 #define MEMORY_ADDR_MAX 0x001000000 /* 16MB */
234 #else
235 #define MEMORY_ADDR_MAX 0x100000000 /* 4GiB */
236 #endif
237 #define MEMORY_BANK_SIZE 1024
238
239 // device informations for virtual machine
240 #define FRAMES_PER_SEC          55.4 // OK?
241 #define LINES_PER_FRAME         784  // OK?
242
243 #define CPU_CLOCKS              16000000 // This maybe dummy value, see VM::VM().
244
245 #undef FIXED_FRAMEBUFFER_SIZE
246 #define SCREEN_WIDTH                1024
247 #define SCREEN_HEIGHT               768
248 #define WINDOW_WIDTH_ASPECT         1024
249 #define WINDOW_HEIGHT_ASPECT    768
250
251 #if defined(_HAS_HDD)
252 #define MAX_SCSI                8
253 #define USE_HARD_DISK   _HAS_HDD
254 #endif
255 #define USE_COMPACT_DISC 1
256
257 #define MAX_MEMCARD             2
258 #define I8259_MAX_CHIPS         2
259 //#define I8259_PC98_HACK
260
261 //#define SINGLE_MODE_DMA
262 #define MB8877_NO_BUSY_AFTER_SEEK
263 #define IO_ADDR_MAX             0x10000
264 #define SCSI_HOST_AUTO_ACK
265 //#define SCSI_HOST_WIDE
266 //#define _SCSI_DEBUG_LOG
267 //#define SCSI_DEV_IMMEDIATE_SELECT
268 //#define _CDROM_DEBUG_LOG
269 //#define _IO_DEBUG_LOG
270
271 // device informations for win32
272 #define USE_CPU_TYPE                    2
273 #define USE_FLOPPY_DISK                 4 // ??
274 #define USE_CART                                2
275 #define USE_SPECIAL_RESET               12 /* 'CD' 'F0' - 'F3' 'H0' - 'H4' 'ICM' 'DEBUG' */
276 #define USE_FLOPPY_TYPE_BIT             0x0003 /* 5.0, 5.0, 3.5, 3.5 */
277 #define USE_MACHINE_FEATURES    2
278 #define NOTIFY_KEY_DOWN
279 #define USE_ALT_F10_KEY
280 #define USE_AUTO_KEY            5
281 #define USE_AUTO_KEY_RELEASE    6
282 #define USE_CRT_FILTER
283 #define USE_SOUND_FILES         1
284 #define USE_SOUND_FILES_FDD
285 #define USE_JOYSTICK
286 #define USE_JOY_BUTTON_CAPTIONS
287 #define USE_MOUSE
288 #define USE_CUSTOM_SCREEN_ZOOM_FACTOR 1.25
289
290 #if defined(USE_SOUND_FILES)
291 #define USE_SOUND_VOLUME        5
292 #else
293 #define USE_SOUND_VOLUME        6
294 #endif
295
296 #define USE_DEBUGGER
297 #define USE_STATE
298 #define USE_CPU_I386
299 #define HAS_I386
300 #define BASE_FLOPPY_DISK_NUM 0
301 //#define USE_QUEUED_SCSI_TRANSFER
302
303 #include "../../common.h"
304 #include "../../fileio.h"
305 #include "../vm_template.h"
306
307 #ifdef USE_SOUND_VOLUME
308 static const _TCHAR *sound_device_caption[] = {
309         _T("Beep"), _T("CD-DA"), _T("FM OPN2"), _T("ADPCM"), 
310 #if defined(USE_SOUND_FILES)
311         _T("FDD SEEK"),
312 #endif
313 };
314 #endif
315 #ifdef USE_JOY_BUTTON_CAPTIONS
316 static const _TCHAR *joy_button_captions[] = {
317         _T("Up"),
318         _T("Down"),
319         _T("Left"),
320         _T("Right"),
321         _T("Button #1"),
322         _T("Button #2"),
323         _T("RUN"),
324         _T("SELECT"),
325 };
326 #endif
327
328 class EMU;
329 class DEVICE;
330 class EVENT;
331
332 class I8251;
333 class I8253;
334 class I8259;
335 class I386;
336 class NOISE;
337
338 class IO;
339 class RF5C68;      // DAC
340 class YM2612;      // OPNB
341 //class MB87078;     // VOLUME
342 class AD7820KR;    // A/D Converter.
343 class PCM1BIT;
344
345 class MB8877;      // FDC
346 class MSM58321;    // RTC
347 class RF5C68;      // ADPCM
348
349 class SCSI_HOST;
350 class SCSI_DEV;
351 class SCSI_HDD;
352 class SCSI_CDROM;
353
354 namespace FMTOWNS {
355         class ADPCM;
356 //      class CDC;
357         class FLOPPY;
358         class JOYSTICK;
359         class KEYBOARD;
360         class SERIAL_ROM;
361         class SCSI;
362         class TIMER;
363         
364         class SYSROM;
365         class MSDOSROM;
366         class FONT_ROMS;
367         class DICTIONARY;
368 #if defined(HAS_20PIX_FONTS)
369         class FONT_ROM_20PIX;
370 #endif
371         class TOWNS_CRTC;
372         class TOWNS_CDROM;
373         class TOWNS_DMAC;    // DMAC
374         class TOWNS_ICCARD;
375         class TOWNS_MEMORY;
376         class TOWNS_SCSI_HOST;
377         class TOWNS_SPRITE;
378         class TOWNS_VRAM;
379         class PLANEVRAM;
380         class JOYPAD_2BTN;
381         class JOYPAD_6BTN;
382         class MOUSE;
383 }
384
385 class VM : public VM_TEMPLATE
386 {
387 protected:
388         // devices
389         
390         I8251* sio;
391         I8253* pit0;
392         I8253* pit1;
393         
394         I8259* pic;
395         
396         I386* cpu; // i386DX/SX/486DX/486SX?/Pentium with FPU?
397
398         IO*       io;
399         MB8877*   fdc;
400         MSM58321* rtc;
401         FMTOWNS::TOWNS_DMAC* dma;
402         FMTOWNS::TOWNS_DMAC* extra_dma;
403         NOISE*    seek_sound;
404         NOISE*    head_up_sound;
405         NOISE*    head_down_sound;
406         
407         RF5C68*   rf5c68;
408 //      MB87078*  e_volumes;
409         AD7820KR* adc;
410         PCM1BIT*  beep;
411         YM2612*   opn2;
412         
413         FMTOWNS::ADPCM*          adpcm;
414         FMTOWNS::TOWNS_CRTC*     crtc;
415         FMTOWNS::FLOPPY*         floppy;
416         FMTOWNS::JOYSTICK*       joystick;
417         FMTOWNS::JOYPAD_2BTN*    joypad_2btn[2];
418         FMTOWNS::JOYPAD_6BTN*    joypad_6btn[2];
419         FMTOWNS::MOUSE*                  mouse[2];
420         FMTOWNS::KEYBOARD*       keyboard;
421         FMTOWNS::TIMER*          timer;
422         FMTOWNS::TOWNS_VRAM*     vram;
423         FMTOWNS::PLANEVRAM*          planevram;
424         FMTOWNS::TOWNS_SPRITE*   sprite;
425         FMTOWNS::TOWNS_MEMORY*   memory;
426         FMTOWNS::DICTIONARY*     dictionary;
427         FMTOWNS::SYSROM*         sysrom;
428         FMTOWNS::MSDOSROM*       msdosrom;
429         FMTOWNS::FONT_ROMS*      fontrom;
430         FMTOWNS::TOWNS_ICCARD*   iccard1;
431         FMTOWNS::TOWNS_ICCARD*   iccard2;
432 #if defined(HAS_20PIX_FONTS)
433         FMTOWNS::FONT_ROM_20PIX* fontrom_20pix;
434 #endif
435         FMTOWNS::SERIAL_ROM*     serialrom;
436 //      FMTOWNS::CDC*            cdc;
437 //      FMTOWNS::TOWNS_SCSI_HOST* cdc_scsi;
438         FMTOWNS::TOWNS_CDROM*    cdrom;
439         
440         FMTOWNS::SCSI* scsi;
441         //FMTOWNS::TOWNS_SCSI_HOST* scsi_host;
442         SCSI_HOST* scsi_host;
443         SCSI_HDD*      scsi_hdd[8]; //
444
445         bool boot_seq;
446         
447         int adc_in_ch;
448         int line_in_ch;
449         int modem_in_ch;
450         int mic_in_ch;
451
452         int beep_mix_ch;
453         int cdc_mix_ch;
454         int opn2_mix_ch;
455         int pcm_mix_ch;
456         int line_mix_ch;
457         int modem_mix_ch;
458         int mic_mix_ch;
459 /*
460         scrntype_t *d_renderbuffer[2][2]; // [bank][layer]
461         uint32_t renderbuffer_size[2][2];
462 */
463 public:
464         // ----------------------------------------
465         // initialize
466         // ----------------------------------------
467         
468         VM(EMU_TEMPLATE* parent_emu);
469         ~VM();
470         
471         // ----------------------------------------
472         // for emulation class
473         // ----------------------------------------
474         
475         // drive virtual machine
476         void reset();
477         void special_reset(int num);
478         void run();
479         
480 #ifdef USE_DEBUGGER
481         // debugger
482         DEVICE *get_cpu(int index);
483 #endif
484         
485         // draw screen
486         void draw_screen();
487         
488         // sound generation
489         void initialize_sound(int rate, int samples);
490         uint16_t* create_sound(int* extra_frames);
491         int get_sound_buffer_ptr();
492 #ifdef USE_SOUND_VOLUME
493         void set_sound_device_volume(int ch, int decibel_l, int decibel_r);
494 #endif
495         
496         // notify key
497         void key_down(int code, bool repeat);
498         void key_up(int code);
499         
500         // user interface
501         // CARTs are IC CARD.Will implement something :-)
502         void open_cart(int drv, const _TCHAR* file_path);
503         void close_cart(int drv);
504         bool is_cart_inserted(int drv);
505         
506         void open_floppy_disk(int drv, const _TCHAR* file_path, int bank);
507         void close_floppy_disk(int drv);
508         uint32_t is_floppy_disk_accessed();
509         bool is_floppy_disk_inserted(int drv);
510         void is_floppy_disk_protected(int drv, bool value);
511         bool is_floppy_disk_protected(int drv);
512         bool is_frame_skippable();
513
514         void open_compact_disc(int drv, const _TCHAR* file_path);
515         void close_compact_disc(int drv);
516         bool is_compact_disc_inserted(int drv);
517         uint32_t is_compact_disc_accessed();
518 #if defined(USE_HARD_DISK)
519         void open_hard_disk(int drv, const _TCHAR* file_path);
520         void close_hard_disk(int drv);
521         bool is_hard_disk_inserted(int drv);
522         uint32_t is_hard_disk_accessed();
523 #endif  
524         void set_machine_type(uint16_t machine_id, uint16_t cpu_id);
525
526         void clear_sound_in();
527         int get_sound_in_data(int ch, int32_t* dst, int expect_samples, int expect_rate, int expect_channels);
528         int sound_in(int ch, int32_t* src, int samples);
529
530         double get_current_usec();
531         uint64_t get_current_clock_uint64();
532         
533         void update_config();
534         bool process_state(FILEIO* state_fio, bool loading);
535         
536         // ----------------------------------------
537         // for each device
538         // ----------------------------------------
539         
540         // devices
541         DEVICE* get_device(int id);
542         //DEVICE* dummy;
543         //DEVICE* first_device;
544         //DEVICE* last_device;
545 };
546