OSDN Git Service

[General] Merge upstream 2018-05-24. Still not test to build, will test.
[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 OPEN_HARD_DISK_IN_RESET
82 #define NOTIFY_KEY_DOWN
83 #define USE_SHIFT_NUMPAD_KEY
84 #define USE_ALT_F10_KEY
85 #define USE_AUTO_KEY            5
86 #define USE_AUTO_KEY_RELEASE    6
87 #define USE_AUTO_KEY_NUMPAD
88 #define USE_SCREEN_FILTER
89 #define USE_SOUND_VOLUME        2
90 #define USE_DEBUGGER
91 #define USE_STATE
92 #if defined(HAS_I286)
93 #define USE_CPU_I286
94 #else
95 #define USE_CPU_I386
96 #endif
97
98 #include "../../common.h"
99 #include "../../fileio.h"
100
101 #ifdef USE_SOUND_VOLUME
102 static const _TCHAR *sound_device_caption[] = {
103         _T("Beep"), _T("Noise (FDD)"),
104 };
105 #endif
106
107 class EMU;
108 class DEVICE;
109 class EVENT;
110
111 class HD46505;
112 #ifdef _FMR60
113 class HD63484;
114 #endif
115 class I8251;
116 class I8253;
117 class I8259;
118 #if defined(HAS_I286)
119 class I286;
120 #else
121 class I386;
122 #endif
123 class IO;
124 class MB8877;
125 class MSM58321;
126 class PCM1BIT;
127 class SCSI_HDD;
128 class SCSI_HOST;
129 class UPD71071;
130
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 class VM
141 {
142 protected:
143         EMU* emu;
144         
145         // devices
146         EVENT* event;
147         
148         HD46505* crtc;
149 #if defined(_FMR60)
150         HD63484* acrtc;
151 #endif
152         I8251* sio;
153         I8253* pit0;
154         I8253* pit1;
155         I8259* pic;
156 #if defined(HAS_I286)
157         I286* cpu;
158 #else
159         I386* cpu;
160 #endif
161         IO* io;
162         MB8877* fdc;
163         MSM58321* rtc;
164         PCM1BIT* pcm;
165         SCSI_HDD* scsi_hdd[7];
166         SCSI_HOST* scsi_host;
167         UPD71071* dma;
168         
169         BIOS* bios;
170         CMOS* cmos;
171         FLOPPY* floppy;
172         KEYBOARD* keyboard;
173         MEMORY* memory;
174         SCSI* scsi;
175 //      SERIAL* serial;
176         TIMER* timer;
177         
178 #if defined(OPEN_HARD_DISK_IN_RESET)
179         _TCHAR hd_file_path[USE_HARD_DISK][_MAX_PATH];
180 #endif
181         void open_hard_disk_tmp(int drv, const _TCHAR* file_path);
182         void close_hard_disk_tmp(int drv);
183         bool is_hard_disk_inserted_tmp(int drv);
184         
185 public:
186         // ----------------------------------------
187         // initialize
188         // ----------------------------------------
189         
190         VM(EMU* parent_emu);
191         ~VM();
192         
193         // ----------------------------------------
194         // for emulation class
195         // ----------------------------------------
196         
197         // drive virtual machine
198         void reset();
199         void run();
200         
201 #ifdef USE_DEBUGGER
202         // debugger
203         DEVICE *get_cpu(int index);
204 #endif
205         
206         // draw screen
207         void draw_screen();
208         
209         // sound generation
210         void initialize_sound(int rate, int samples);
211         uint16_t* create_sound(int* extra_frames);
212         int get_sound_buffer_ptr();
213 #ifdef USE_SOUND_VOLUME
214         void set_sound_device_volume(int ch, int decibel_l, int decibel_r);
215 #endif
216         
217         // notify key
218         void key_down(int code, bool repeat);
219         void key_up(int code);
220         
221         // user interface
222         void open_floppy_disk(int drv, const _TCHAR* file_path, int bank);
223         void close_floppy_disk(int drv);
224         bool is_floppy_disk_inserted(int drv);
225         void is_floppy_disk_protected(int drv, bool value);
226         bool is_floppy_disk_protected(int drv);
227         uint32_t is_floppy_disk_accessed();
228         void open_hard_disk(int drv, const _TCHAR* file_path);
229         void close_hard_disk(int drv);
230         bool is_hard_disk_inserted(int drv);
231         uint32_t is_hard_disk_accessed();
232         bool is_frame_skippable();
233         
234         void update_config();
235         void save_state(FILEIO* state_fio);
236         bool load_state(FILEIO* state_fio);
237         
238         // ----------------------------------------
239         // for each device
240         // ----------------------------------------
241         
242         // devices
243         DEVICE* get_device(int id);
244         DEVICE* dummy;
245         DEVICE* first_device;
246         DEVICE* last_device;
247 };
248
249 #endif