OSDN Git Service

[VM][STATE] Now enable to build @ALL VMs.Upstream 2018-10-05.
[csp-qt/common_source_project-fm7.git] / source / src / vm / fmr50 / fmr50.h
1 /*
2         FUJITSU FMR-50 Emulator 'eFMR-50'
3         FUJITSU FMR-60 Emulator 'eFMR-60'
4
5         Author : Takeda.Toshiya
6         Date   : 2008.04.28 -
7
8         [ virtual machine ]
9 */
10
11 #ifndef _FMR50_H_
12 #define _FMR50_H_
13
14 #if defined(_FMR50)
15 #if defined(HAS_I286)
16 #define DEVICE_NAME             "FUJITSU FMR-50 (i286)"
17 #define CONFIG_NAME             "fmr50_i286"
18 #elif defined(HAS_I386)
19 #define DEVICE_NAME             "FUJITSU FMR-50 (i386)"
20 #define CONFIG_NAME             "fmr50_i386"
21 #elif defined(HAS_I486)
22 #define DEVICE_NAME             "FUJITSU FMR-50 (i486)"
23 #define CONFIG_NAME             "fmr50_i486"
24 #elif defined(HAS_PENTIUM)
25 #define DEVICE_NAME             "FUJITSU FMR-250"
26 #define CONFIG_NAME             "fmr250"
27 #endif
28 #elif defined(_FMR60)
29 #if defined(HAS_I286)
30 #define DEVICE_NAME             "FUJITSU FMR-60"
31 #define CONFIG_NAME             "fmr60"
32 #elif defined(HAS_I386)
33 #define DEVICE_NAME             "FUJITSU FMR-70"
34 #define CONFIG_NAME             "fmr70"
35 #elif defined(HAS_I486)
36 #define DEVICE_NAME             "FUJITSU FMR-80"
37 #define CONFIG_NAME             "fmr80"
38 #elif defined(HAS_PENTIUM)
39 #define DEVICE_NAME             "FUJITSU FMR-280"
40 #define CONFIG_NAME             "fmr280"
41 #endif
42 #endif
43
44 // device informations for virtual machine
45 #define FRAMES_PER_SEC          55.4
46 #if defined(_FMR60)
47 #define LINES_PER_FRAME         784
48 #define CHARS_PER_LINE          98
49 #else
50 #define LINES_PER_FRAME         440
51 #define CHARS_PER_LINE          54
52 #endif
53 //#define CPU_CLOCKS            12000000
54 #define CPU_CLOCKS              8000000
55 #if defined(_FMR60)
56 #define SCREEN_WIDTH            1120
57 #define SCREEN_HEIGHT           750
58 #define WINDOW_HEIGHT_ASPECT    840
59 #else
60 #define SCREEN_WIDTH            640
61 #define SCREEN_HEIGHT           400
62 #define WINDOW_HEIGHT_ASPECT    480
63 #endif
64 #define MAX_DRIVE               4
65 #define MAX_MEMCARD             2
66 #if defined(HAS_I286)
67 #define I86_PSEUDO_BIOS
68 #else
69 #define I386_PSEUDO_BIOS
70 #endif
71 #define I8259_MAX_CHIPS         2
72 #define SINGLE_MODE_DMA
73 #define MB8877_NO_BUSY_AFTER_SEEK
74 #define IO_ADDR_MAX             0x10000
75 #define SCSI_HOST_AUTO_ACK
76
77 // device informations for win32
78 #define USE_CPU_TYPE            2
79 #define USE_FLOPPY_DISK         4
80 #define USE_HARD_DISK           7
81 #define NOTIFY_KEY_DOWN
82 #define USE_SHIFT_NUMPAD_KEY
83 #define USE_ALT_F10_KEY
84 #define USE_AUTO_KEY            5
85 #define USE_AUTO_KEY_RELEASE    6
86 #define USE_AUTO_KEY_NUMPAD
87 #define USE_SCREEN_FILTER
88 #define USE_SOUND_VOLUME        2
89 #define USE_DEBUGGER
90 #define USE_STATE
91 #if defined(HAS_I286)
92 #define USE_CPU_I286
93 #else
94 #define USE_CPU_I386
95 #endif
96
97 #include "../../common.h"
98 #include "../../fileio.h"
99 #include "../vm_template.h"
100
101 #ifdef USE_SOUND_VOLUME
102 static const _TCHAR *sound_device_caption[] = {
103         _T("Beep"), _T("Noise (FDD)"),
104 };
105 #endif
106 class EMU;
107 class DEVICE;
108 class EVENT;
109
110 class HD46505;
111 #ifdef _FMR60
112 class HD63484;
113 #endif
114 class I8251;
115 class I8253;
116 class I8259;
117 #if defined(HAS_I286)
118 class I286;
119 #else
120 class I386;
121 #endif
122 class IO;
123 class MB8877;
124 class MSM58321;
125 class PCM1BIT;
126 class SCSI_HDD;
127 class SCSI_HOST;
128 class UPD71071;
129
130 namespace FMR50 {
131         class BIOS;
132         class CMOS;
133         class FLOPPY;
134         class KEYBOARD;
135         class MEMORY;
136         //class SERIAL;
137         class SCSI;
138         class TIMER;
139 }
140
141 class VM : public VM_TEMPLATE
142 {
143 protected:
144         //EMU* emu;
145         //csp_state_utils *state_entry;
146         
147         // devices
148         //EVENT* event;
149         
150         HD46505* crtc;
151 #if defined(_FMR60)
152         HD63484* acrtc;
153 #endif
154         I8251* sio;
155         I8253* pit0;
156         I8253* pit1;
157         I8259* pic;
158 #if defined(HAS_I286)
159         I286* cpu;
160 #else
161         I386* cpu;
162 #endif
163         IO* io;
164         MB8877* fdc;
165         MSM58321* rtc;
166         PCM1BIT* pcm;
167         SCSI_HDD* scsi_hdd[7];
168         SCSI_HOST* scsi_host;
169         UPD71071* dma;
170         
171         FMR50::BIOS* bios;
172         FMR50::CMOS* cmos;
173         FMR50::FLOPPY* floppy;
174         FMR50::KEYBOARD* keyboard;
175         FMR50::MEMORY* memory;
176         FMR50::SCSI* scsi;
177 //      FMR50::SERIAL* serial;
178         FMR50::TIMER* timer;
179         
180 public:
181         // ----------------------------------------
182         // initialize
183         // ----------------------------------------
184         
185         VM(EMU* parent_emu);
186         ~VM();
187         
188         // ----------------------------------------
189         // for emulation class
190         // ----------------------------------------
191         
192         // drive virtual machine
193         void reset();
194         void run();
195         
196 #ifdef USE_DEBUGGER
197         // debugger
198         DEVICE *get_cpu(int index);
199 #endif
200         
201         // draw screen
202         void draw_screen();
203         
204         // sound generation
205         void initialize_sound(int rate, int samples);
206         uint16_t* create_sound(int* extra_frames);
207         int get_sound_buffer_ptr();
208 #ifdef USE_SOUND_VOLUME
209         void set_sound_device_volume(int ch, int decibel_l, int decibel_r);
210 #endif
211         
212         // notify key
213         void key_down(int code, bool repeat);
214         void key_up(int code);
215         
216         // user interface
217         void open_floppy_disk(int drv, const _TCHAR* file_path, int bank);
218         void close_floppy_disk(int drv);
219         bool is_floppy_disk_inserted(int drv);
220         void is_floppy_disk_protected(int drv, bool value);
221         bool is_floppy_disk_protected(int drv);
222         uint32_t is_floppy_disk_accessed();
223         void open_hard_disk(int drv, const _TCHAR* file_path);
224         void close_hard_disk(int drv);
225         bool is_hard_disk_inserted(int drv);
226         uint32_t is_hard_disk_accessed();
227         bool is_frame_skippable();
228         
229         void update_config();
230         bool process_state(FILEIO* state_fio, bool loading);
231         
232         // ----------------------------------------
233         // for each device
234         // ----------------------------------------
235         
236         // devices
237         DEVICE* get_device(int id);
238         //DEVICE* dummy;
239         //DEVICE* first_device;
240         //DEVICE* last_device;
241 };
242
243 #endif