OSDN Git Service

[VM][STATE] Update state feature with some VMs, some devices.
[csp-qt/common_source_project-fm7.git] / source / src / vm / mz2500 / mz80b.h
1 /*
2         SHARP MZ-80B Emulator 'EmuZ-80B'
3         SHARP MZ-2200 Emulator 'EmuZ-2200'
4
5         Author : Takeda.Toshiya
6         Date   : 2013.03.14-
7
8         [ virtual machine ]
9 */
10
11 #ifndef _MZ80B_H_
12 #define _MZ80B_H_
13
14 #if defined(_MZ80B)
15 #define DEVICE_NAME             "SHARP MZ-80B"
16 #define CONFIG_NAME             "mz80b"
17 #elif defined(_MZ2000)
18 #define DEVICE_NAME             "SHARP MZ-2000"
19 #define CONFIG_NAME             "mz2000"
20 #else
21 #define DEVICE_NAME             "SHARP MZ-2200"
22 #define CONFIG_NAME             "mz2200"
23 #endif
24
25 #ifndef _MZ80B
26 #define SUPPORT_QUICK_DISK
27 #define SUPPORT_16BIT_BOARD
28 #endif
29
30 // device informations for virtual machine
31 #define FRAMES_PER_SEC          60
32 #define LINES_PER_FRAME         262
33 #define CPU_CLOCKS              4000000
34 #define CPU_CLOCKS_HIGH         6000000
35 #define SCREEN_WIDTH            640
36 #define SCREEN_HEIGHT           400
37 #define WINDOW_HEIGHT_ASPECT    480
38 #define MAX_DRIVE               4
39 #define HAS_MB8876
40 #ifdef SUPPORT_QUICK_DISK
41 #endif
42 #ifdef SUPPORT_16BIT_BOARD
43 #define HAS_I88
44 #define I8259_MAX_CHIPS         1
45 #endif
46 #define PRINTER_STROBE_RISING_EDGE
47
48 // memory wait
49 #define Z80_MEMORY_WAIT
50 #define Z80_IO_WAIT
51
52 // device informations for win32
53 #define USE_SPECIAL_RESET
54 #define USE_CPU_TYPE            2
55 #define USE_DRIVE_TYPE          2
56 #define USE_FLOPPY_DISK         4
57 #ifdef SUPPORT_QUICK_DISK
58 #define USE_QUICK_DISK          1
59 #endif
60 #define USE_TAPE                1
61 #define USE_TAPE_BUTTON
62 #define USE_SHIFT_NUMPAD_KEY
63 #define USE_ALT_F10_KEY
64 #define USE_AUTO_KEY            5
65 #define USE_AUTO_KEY_RELEASE    6
66 #define USE_AUTO_KEY_CAPS
67 #define USE_AUTO_KEY_NUMPAD
68 #define USE_MONITOR_TYPE        4
69 #ifndef _MZ80B
70 #define USE_SCREEN_FILTER
71 #endif
72 #define USE_SCANLINE
73 #define USE_SOUND_VOLUME        4
74 #define USE_PRINTER
75 #define USE_PRINTER_TYPE        4
76 #define USE_DEBUGGER
77 #define USE_STATE
78 #define USE_CPU_Z80
79
80 #include "../../common.h"
81 #include "../../fileio.h"
82
83 #ifdef USE_SOUND_VOLUME
84 static const _TCHAR *sound_device_caption[] = {
85         _T("Beep"), _T("CMT (Signal)"), _T("Noise (FDD)"), _T("Noise (CMT)"),
86 };
87 #endif
88
89 class csp_state_utils;
90 class EMU;
91 class DEVICE;
92 class EVENT;
93
94 class DATAREC;
95 class I8253;
96 class I8255;
97 class IO;
98 class MB8877;
99 class PCM1BIT;
100 class Z80;
101 class Z80PIO;
102
103 class CMT;
104 class FLOPPY;
105 class KEYBOARD;
106 class MEMORY;
107 class MZ1R12;
108 class MZ1R13;
109 class PRINTER;
110 class TIMER;
111
112 #ifdef SUPPORT_QUICK_DISK
113 class Z80SIO;
114 class QUICKDISK;
115 #endif
116
117 #ifdef SUPPORT_16BIT_BOARD
118 class I286;
119 class I8259;
120 class MZ1M01;
121 #endif
122
123 class VM
124 {
125 protected:
126         EMU* emu;
127         csp_state_utils* state_entry;
128         
129         // devices
130         EVENT* event;
131         
132         DATAREC* drec;
133         I8253* pit;
134         I8255* pio_i;
135         IO* io;
136         MB8877* fdc;
137         PCM1BIT* pcm;
138         Z80* cpu;
139         Z80PIO* pio;
140         
141         CMT* cmt;
142         FLOPPY* floppy;
143         KEYBOARD* keyboard;
144         MEMORY* memory;
145         MZ1R12* mz1r12;
146         MZ1R13* mz1r13;
147         PRINTER* printer;
148         TIMER* timer;
149         
150 #ifdef SUPPORT_QUICK_DISK
151         Z80SIO* sio;
152         QUICKDISK* qd;
153 #endif
154         
155 #ifdef SUPPORT_16BIT_BOARD
156         Z80PIO* pio_to16;
157         I286* cpu_16;
158         I8259* pic_16;
159         MZ1M01* mz1m01;
160 #endif
161         
162 public:
163         // ----------------------------------------
164         // initialize
165         // ----------------------------------------
166         
167         VM(EMU* parent_emu);
168         ~VM();
169         
170         // ----------------------------------------
171         // for emulation class
172         // ----------------------------------------
173         
174         // drive virtual machine
175         void reset();
176         void special_reset();
177         void run();
178         
179 #ifdef USE_DEBUGGER
180         // debugger
181         DEVICE *get_cpu(int index);
182 #endif
183         
184         // draw screen
185         void draw_screen();
186         
187         // sound generation
188         void initialize_sound(int rate, int samples);
189         uint16_t* create_sound(int* extra_frames);
190         int get_sound_buffer_ptr();
191 #ifdef USE_SOUND_VOLUME
192         void set_sound_device_volume(int ch, int decibel_l, int decibel_r);
193 #endif
194         
195         // user interface
196         void open_floppy_disk(int drv, const _TCHAR* file_path, int bank);
197         void close_floppy_disk(int drv);
198         bool is_floppy_disk_inserted(int drv);
199         void is_floppy_disk_protected(int drv, bool value);
200         bool is_floppy_disk_protected(int drv);
201         uint32_t is_floppy_disk_accessed();
202 #ifdef SUPPORT_QUICK_DISK
203         void open_quick_disk(int drv, const _TCHAR* file_path);
204         void close_quick_disk(int drv);
205         bool is_quick_disk_inserted(int drv);
206         uint32_t is_quick_disk_accessed();
207 #endif
208         void play_tape(int drv, const _TCHAR* file_path);
209         void rec_tape(int drv, const _TCHAR* file_path);
210         void close_tape(int drv);
211         bool is_tape_inserted(int drv);
212         bool is_tape_playing(int drv);
213         bool is_tape_recording(int drv);
214         int get_tape_position(int drv);
215         const _TCHAR* get_tape_message(int drv);
216         void push_play(int drv);
217         void push_stop(int drv);
218         void push_fast_forward(int drv);
219         void push_fast_rewind(int drv);
220         void push_apss_forward(int drv) {}
221         void push_apss_rewind(int drv) {}
222         bool is_frame_skippable();
223         
224         void update_config();
225         void decl_state();
226         void save_state(FILEIO* state_fio);
227         bool load_state(FILEIO* state_fio);
228         
229         // ----------------------------------------
230         // for each device
231         // ----------------------------------------
232         
233         // devices
234         DEVICE* get_device(int id);
235         DEVICE* dummy;
236         DEVICE* first_device;
237         DEVICE* last_device;
238 };
239
240 #endif