OSDN Git Service

73ddbb9395d271c27e3f5774333c8dd0733e9346
[csp-qt/common_source_project-fm7.git] / source / src / vm / fm7 / fm7.h
1 /*
2         FUJITSU FM7 Emulator 'eFM7'
3
4         Author : K.Ohta
5         Date   : 2015.01.01-
6
7         [ virtual machine ]
8 */
9
10 #ifndef _FM7_H_
11 #define _FM7_H_
12
13 #define USE_TAPE
14 #define USE_SOUND_DEVICE_TYPE 8
15 #define USE_SCANLINE
16 #define USE_DIPSWITCH
17 #define USE_BOOT_MODE         4
18 #define USE_CPU_TYPE
19 #define USE_SPECIAL_RESET
20 #define HAS_YM2608
21 #define SUPPORT_YM2203_PORT
22 //#define HAS_AY_3_8910
23 // 4:3
24 #define SCREEN_WIDTH_ASPECT 400 
25 #define SCREEN_HEIGHT_ASPECT 300
26
27 #define NOTIFY_KEY_DOWN
28 #define NOTIFY_KEY_UP
29 #define USE_ALT_F10_KEY
30 #define USE_AUTO_KEY            5
31 #define USE_AUTO_KEY_RELEASE    6
32 #define USE_ACCESS_LAMP
33 //#define USE_DEBUGGER
34
35 #if defined(_FM8)
36 #define DEVICE_NAME             "FUJITSU FM8"
37 #define CONFIG_NAME             "fm8"
38 #define CAPABLE_Z80
39
40 #elif defined(_FM7)
41 #define DEVICE_NAME             "FUJITSU FM7"
42 #define CONFIG_NAME             "fm7"
43 #define CAPABLE_Z80
44
45 #elif defined(_FM77L4)
46 #define DEVICE_NAME             "FUJITSU FM77L4"
47 #define CONFIG_NAME             "fm77l4"
48 #define HAS_MMR
49 #define HAS_400LINECARD
50 #define HAS_TEXTVRAM
51 #define HAS_2HD
52 #define HAS_CYCLESTEAL
53 #define CAPABLE_Z80
54 #define CAPABLE_KANJI_CLASS2
55 #define USE_DRIVE_TYPE
56
57 #elif defined(_FM77AV)
58 #define DEVICE_NAME             "FUJITSU FM77AV"
59 #define CONFIG_NAME             "fm77av"
60 #define _FM77AV_VARIANTS
61 #define HAS_MMR
62 #define HAS_CYCLESTEAL
63
64 #elif defined(_FM77AV20)
65 #define DEVICE_NAME             "FUJITSU FM77AV"
66 #define CONFIG_NAME             "fm77av20"
67 #define _FM77AV_VARIANTS
68 #define HAS_MMR
69 #define HAS_2DD_2D
70 #define HAS_CYCLESTEAL
71 #define USE_DRIVE_TYPE
72
73 #elif defined(_FM77AV40)
74 #define DEVICE_NAME             "FUJITSU FM77AV"
75 #define CONFIG_NAME             "fm77av40"
76 #define _FM77AV_VARIANTS
77 #define HAS_MMR
78 #define HAS_2DD_2D
79 #define HAS_CYCLESTEAL
80 #define CAPABLE_KANJI_CLASS2
81 #define USE_DRIVE_TYPE
82
83 #endif
84
85 // device informations for virtual machine
86
87 // TODO: check refresh rate
88 #define FRAMES_PER_SEC          60
89 #define LINES_PER_FRAME         400
90 #define CPU_CLOCKS              2000000
91 #define SCREEN_WIDTH            640
92 #define SCREEN_HEIGHT           400
93 #define MAX_DRIVE               4
94 #define HAS_MC6809              
95 #define MB8877_MAX_CHIPS        1
96 //#define IO_ADDR_MAX           0x10000
97
98 // device informations for win32
99 #define USE_FD1
100 #define USE_FD2
101 #define MAX_FD 2
102
103 #if defined(HAS_2HD)
104 #define USE_FD3
105 #define USE_FD4
106 #undef  MAX_FD
107 #define MAX_FD 4
108 #endif
109
110
111 #ifdef BUILD_Z80
112 # ifdef CAPABLE_Z80
113 #  define WITH_Z80
114 # endif
115 #endif
116
117 //#define ENABLE_OPENCL // If OpenCL renderer is enabled, define here.
118
119 #include "../../config.h"
120 #include "../../common.h"
121 #include "../../fileio.h"
122
123 class EMU;
124 class DEVICE;
125 class EVENT;
126 class FILEIO;
127
128 class PCM1BIT;
129 class MC6809;
130 class YM2203;
131 class MB8877;
132 class MEMORY;
133 class DATAREC;
134
135 class DISPLAY;
136
137 class FM7_MAINMEM;
138 class FM7_MAINIO;
139 class KEYBOARD;
140 class KANJIROM;
141
142 #if WITH_Z80
143 class Z80;
144 #endif
145
146 class VM {
147 protected:
148         EMU* emu;
149         
150         // devices
151         EVENT* event;
152         
153         MC6809* maincpu;
154         FM7_MAINMEM* mainmem;
155         FM7_MAINIO* mainio;
156
157         MB8877* fdc;
158         YM2203* opn[3];
159         YM2203* psg; // Is right? AY-3-8910 is right device.
160         PCM1BIT* pcm1bit;
161         DATAREC *drec;
162    
163 #ifdef  WITH_Z80
164         Z80* z80cpu;
165 #endif
166         DEVICE* printer;
167         DEVICE* mouse_opn;
168         DEVICE* inteli_mouse; 
169    
170         DEVICE *dummycpu;
171         MC6809* subcpu;
172         MEMORY* submem;
173
174         DISPLAY* display;
175         KEYBOARD* keyboard;
176    
177         KANJIROM *kanjiclass1;
178 #ifdef CAPABLE_KANJI_CLASS2
179         KANJIROM *kanjiclass2;
180 #endif
181         int machine_version; // 0 = FM8 / 1 = FM7 / 2 = FM77AV / 3 = FM77AV40, etc...
182         Uint32 bootmode;   
183         Uint32 connected_opns;
184         bool cycle_steal;
185         bool clock_low;
186         int mainfreq_type;
187         Uint32 mainfreq_low;
188         Uint32 mainfreq_high;
189         Uint32 mainfreq_mmr;
190         Uint32 mainfreq_high_mmr;
191  
192         Uint32 fdd_type[MAX_DRIVE];
193         BOOL   fdd_connect[MAX_DRIVE];
194
195         FILEIO* cmt_fileio;
196         bool cmt_enabled; // 77AV40SX is disabled.
197         bool cmt_play;
198         bool cmt_rec;
199         Uint32 cmt_bufptr;
200         bool connect_opn;
201         bool connect_whg;
202         bool connect_thg;
203    
204 public:
205         // ----------------------------------------
206         // initialize
207         // ----------------------------------------
208         
209         VM(EMU* parent_emu);
210         ~VM();
211         
212         // ----------------------------------------
213         // for emulation class
214         // ----------------------------------------
215         
216         // drive virtual machine
217         void reset();
218         void special_reset();
219         void run();
220         double frame_rate();
221         
222 #ifdef USE_DEBUGGER
223         // debugger
224         DEVICE *get_cpu(int index);
225 #endif
226         void initialize(void);
227         void connect_bus(void);
228
229         void update_dipswitch(void);
230         // draw screen
231         void draw_screen();
232         int access_lamp();
233         
234         // sound generation
235         void initialize_sound(int rate, int samples);
236         uint16* create_sound(int* extra_frames);
237         int sound_buffer_ptr();
238         
239         // notify key
240         void key_down(int code, bool repeat);
241         void key_up(int code);
242         
243         // user interface
244         void open_disk(int drv, _TCHAR* file_path, int offset);
245         void close_disk(int drv);
246         bool disk_inserted(int drv);
247         void write_protect_fd(int drv, bool flag);
248         bool is_write_protect_fd(int drv);
249         
250         void play_tape(_TCHAR* file_path);
251         void rec_tape(_TCHAR* file_path);
252         void close_tape();
253         bool tape_inserted();
254         bool now_skip();
255         int get_tape_ptr(void);
256    
257         void update_config();
258         //void save_state(FILEIO* state_fio);
259         //bool load_state(FILEIO* state_fio);
260
261         // ----------------------------------------
262         // for each device
263         // ----------------------------------------
264         void set_cpu_clock(DEVICE *cpu, uint32 clocks);
265         // devices
266         DEVICE* get_device(int id);
267         DEVICE* dummy;
268         DEVICE* first_device;
269         DEVICE* last_device;
270 };
271
272 #endif