2 SHARP X1 Emulator 'eX1'
3 SHARP X1twin Emulator 'eX1twin'
4 SHARP X1turbo Emulator 'eX1turbo'
5 SHARP X1turboZ Emulator 'eX1turboZ'
7 Author : Takeda.Toshiya
16 #if defined(_X1TURBOZ)
17 #define DEVICE_NAME "SHARP X1turboZ"
18 #define CONFIG_NAME "x1turboz"
19 #elif defined(_X1TURBO)
20 #define DEVICE_NAME "SHARP X1turbo"
21 #define CONFIG_NAME "x1turbo"
22 #elif defined(_X1TWIN)
23 #define DEVICE_NAME "SHARP X1twin"
24 #define CONFIG_NAME "x1twin"
26 #define DEVICE_NAME "SHARP X1"
27 #define CONFIG_NAME "x1"
30 #if defined(_X1TURBO) || defined(_X1TURBOZ)
31 #define _X1TURBO_FEATURE
34 // device informations for virtual machine (x1)
35 #define VDP_CLOCK 28636363
36 //#ifdef _X1TURBO_FEATURE
38 //#define FRAMES_PER_SEC 55.49
39 //#define LINES_PER_FRAME 448
40 //#define CHARS_PER_LINE 56
41 //#define HD46505_CHAR_CLOCK (VDP_CLOCK * 1.5 / 32.0)
44 #define FRAMES_PER_SEC 61.94
45 #define LINES_PER_FRAME 258
46 #define CHARS_PER_LINE 56
47 #define HD46505_CHAR_CLOCK (VDP_CLOCK / 32.0)
49 #define CPU_CLOCKS 4000000
50 #define SCREEN_WIDTH 640
51 #define SCREEN_HEIGHT 400
52 #define WINDOW_HEIGHT_ASPECT 480
54 #define IO_ADDR_MAX 0x10000
57 #ifdef _X1TURBO_FEATURE
58 #define SINGLE_MODE_DMA
60 #define DATAREC_FAST_FWD_SPEED 16
61 #define DATAREC_FAST_REW_SPEED 16
62 #define PRINTER_STROBE_RISING_EDGE
63 #define SCSI_HOST_AUTO_ACK
64 #define SUPPORT_VARIABLE_TIMING
66 #ifdef _X1TURBO_FEATURE
67 #define IPL_ROM_FILE_SIZE 0x8000
68 #define IPL_ROM_FILE_NAME _T("IPLROM.X1T")
69 #define SUB_ROM_FILE_NAME _T("SUBROM.X1T")
70 #define KBD_ROM_FILE_NAME _T("KBDROM.X1T")
72 #define IPL_ROM_FILE_SIZE 0x1000
73 #define IPL_ROM_FILE_NAME _T("IPLROM.X1")
74 #define SUB_ROM_FILE_NAME _T("SUBROM.X1")
75 #define KBD_ROM_FILE_NAME _T("KBDROM.X1")
77 #define CRC32_MSM80C49_262 0x43EE7D6F // X1turbo with CMT
78 #define CRC32_MSM80C49_277 0x75904EFB // X1turbo (not supported yet)
81 // device informations for virtual machine (pce)
82 #define PCE_FRAMES_PER_SEC 60
83 #define PCE_LINES_PER_FRAME 262
84 #define PCE_CPU_CLOCKS 7159090
87 // device informations for win32
88 #define USE_SPECIAL_RESET
89 #ifdef _X1TURBO_FEATURE
90 #define USE_KEYBOARD_TYPE 2
92 #define KEYBOARD_TYPE_DEFAULT 1
93 #define USE_DRIVE_TYPE 3
95 #define USE_FLOPPY_DISK 2
96 #define BASE_FLOPPY_DISK_NUM 0
97 #define USE_HARD_DISK 4
99 #define USE_TAPE_BUTTON
103 #define NOTIFY_KEY_DOWN
104 #define USE_KEY_LOCKED
105 #define USE_SHIFT_NUMPAD_KEY
106 #define USE_ALT_F10_KEY
107 #define USE_AUTO_KEY 8
108 #define USE_AUTO_KEY_RELEASE 10
109 #define USE_AUTO_KEY_NUMPAD
110 #define USE_MONITOR_TYPE 2
111 #define USE_SCREEN_FILTER
113 #define USE_SOUND_TYPE 3
115 //#define DATAREC_SOUND
117 #define SOUND_TYPE_DEFAULT 1
118 # if defined(_X1TWIN)
119 # define USE_SOUND_VOLUME 7
121 # define USE_SOUND_VOLUME 6
123 #define SUPPORT_TV_RENDER
126 #define USE_JOYSTICK_TYPE 4
127 #define JOYSTICK_TYPE_DEFAULT 0
129 #define USE_JOY_BUTTON_CAPTIONS
132 #define USE_PRINTER_TYPE 4
136 #define USE_CPU_MCS48
138 #include "../../common.h"
139 #include "../../fileio.h"
140 #include "../vm_template.h"
142 #ifdef USE_SOUND_VOLUME
143 static const _TCHAR *sound_device_caption[] = {
144 _T("PSG"), _T("CZ-8BS1 #1"), _T("CZ-8BS1 #2"), _T("CMT (Signal)"), _T("Noise (FDD)"), _T("Noise (CMT)"),
151 #ifdef USE_JOY_BUTTON_CAPTIONS
153 static const _TCHAR *joy_button_captions[] = {
168 static const _TCHAR *joy_button_captions[] = {
180 static const uint16_t ANKFONT7f_9f[0x21 * 8] = {
181 0x0000, 0x3000, 0x247f, 0x6c24, 0x484c, 0xce4b, 0x0000, 0x0000,
183 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff,
184 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff,
185 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff,
186 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff,
187 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
188 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
189 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
190 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
191 0x8080, 0x8080, 0x8080, 0x8080, 0x8080, 0x8080, 0x8080, 0x8080,
192 0xc0c0, 0xc0c0, 0xc0c0, 0xc0c0, 0xc0c0, 0xc0c0, 0xc0c0, 0xc0c0,
193 0xe0e0, 0xe0e0, 0xe0e0, 0xe0e0, 0xe0e0, 0xe0e0, 0xe0e0, 0xe0e0,
194 0xf0f0, 0xf0f0, 0xf0f0, 0xf0f0, 0xf0f0, 0xf0f0, 0xf0f0, 0xf0f0,
195 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8,
196 0xfcfc, 0xfcfc, 0xfcfc, 0xfcfc, 0xfcfc, 0xfcfc, 0xfcfc, 0xfcfc,
197 0xfefe, 0xfefe, 0xfefe, 0xfefe, 0xfefe, 0xfefe, 0xfefe, 0xfefe,
198 0x0101, 0x0202, 0x0404, 0x0808, 0x1010, 0x2020, 0x4040, 0x8080,
200 0x0000, 0x0000, 0x0000, 0x0000, 0x00ff, 0x0000, 0x0000, 0x0000,
201 0x1010, 0x1010, 0x1010, 0x1010, 0x1010, 0x1010, 0x1010, 0x1010,
202 0x1010, 0x1010, 0x1010, 0x1010, 0x00ff, 0x0000, 0x0000, 0x0000,
203 0x0000, 0x0000, 0x0000, 0x0000, 0x10ff, 0x1010, 0x1010, 0x1010,
204 0x1010, 0x1010, 0x1010, 0x1010, 0x10f0, 0x1010, 0x1010, 0x1010,
205 0x1010, 0x1010, 0x1010, 0x1010, 0x101f, 0x1010, 0x1010, 0x1010,
206 0x1010, 0x1010, 0x1010, 0x1010, 0x10ff, 0x1010, 0x1010, 0x1010,
207 0x0000, 0x0000, 0x0000, 0x0000, 0x10f0, 0x1010, 0x1010, 0x1010,
208 0x1010, 0x1010, 0x1010, 0x1010, 0x00f0, 0x0000, 0x0000, 0x0000,
209 0x1010, 0x1010, 0x1010, 0x1010, 0x001f, 0x0000, 0x0000, 0x0000,
210 0x0000, 0x0000, 0x0000, 0x0000, 0x101f, 0x1010, 0x1010, 0x1010,
211 0x0000, 0x0000, 0x0000, 0x0000, 0x4080, 0x2020, 0x1010, 0x1010,
212 0x1010, 0x1010, 0x0810, 0x0408, 0x0003, 0x0000, 0x0000, 0x0000,
213 0x1010, 0x1010, 0x2010, 0x4020, 0x0080, 0x0000, 0x0000, 0x0000,
214 0x0000, 0x0000, 0x0000, 0x0000, 0x0403, 0x0808, 0x1010, 0x1010,
215 0x8080, 0x4040, 0x2020, 0x1010, 0x0808, 0x0404, 0x0202, 0x0101
218 static const uint16_t ANKFONTe0_ff[0x20 * 8] = {
219 0x0000, 0x7e3c, 0xffff, 0xdbdb, 0xffff, 0xe7db, 0x7eff, 0x003c,
220 0x0000, 0x423c, 0x8181, 0xa5a5, 0x8181, 0x99a5, 0x4281, 0x003c,
221 0x0000, 0x3810, 0x7c7c, 0xfefe, 0xfefe, 0x106c, 0x7c38, 0x0000,
222 0x0000, 0x6c00, 0xfefe, 0xfefe, 0xfefe, 0x7c7c, 0x1038, 0x0000,
223 0x0000, 0x1010, 0x3838, 0x7c7c, 0x7cfe, 0x387c, 0x1038, 0x0010,
224 0x0000, 0x3810, 0x7c7c, 0x5438, 0xfefe, 0x6cfe, 0x7c10, 0x0000,
225 0x0101, 0x0303, 0x0707, 0x0f0f, 0x1f1f, 0x3f3f, 0x7f7f, 0xffff,
226 0x8080, 0xc0c0, 0xe0e0, 0xf0f0, 0xf8f8, 0xfcfc, 0xfefe, 0xffff,
227 0x8181, 0x4242, 0x2424, 0x1818, 0x1818, 0x2424, 0x4242, 0x8181,
228 0xf0f0, 0xf0f0, 0xf0f0, 0xf0f0, 0x0000, 0x0000, 0x0000, 0x0000,
229 0x0000, 0x0000, 0x0000, 0x0000, 0xf0f0, 0xf0f0, 0xf0f0, 0xf0f0,
230 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, 0x0000, 0x0000, 0x0000, 0x0000,
231 0x0000, 0x0000, 0x0000, 0x0000, 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f,
232 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, 0xf0f0, 0xf0f0, 0xf0f0, 0xf0f0,
233 0xf0f0, 0xf0f0, 0xf0f0, 0xf0f0, 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f,
234 0x81ff, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0xff81,
236 0x55aa, 0x55aa, 0x55aa, 0x55aa, 0x55aa, 0x55aa, 0x55aa, 0x55aa,
237 0x1000, 0x1010, 0xf01e, 0x1010, 0x1010, 0x1010, 0x7e10, 0x00c0,
238 0x1000, 0x2418, 0x7c42, 0x1090, 0x781c, 0x5410, 0xfe54, 0x0000,
239 0x1000, 0x1010, 0xfe10, 0x1010, 0x3030, 0x565c, 0x9090, 0x0010,
240 0x1000, 0x1210, 0xf412, 0x3034, 0x5030, 0x9654, 0x1090, 0x0000,
241 0x0800, 0x8808, 0x5292, 0x1454, 0x2020, 0x5020, 0x465c, 0x0040,
242 0x0000, 0xe23c, 0x8282, 0x82fa, 0x7a82, 0x4242, 0x0044, 0x0000,
243 0x0000, 0x443c, 0x8242, 0xf282, 0x8282, 0x8282, 0x3844, 0x0000,
244 0x0800, 0x5e18, 0xa468, 0xe4be, 0xbea4, 0xb2a2, 0x0a5a, 0x0002,
245 0x0000, 0x2628, 0x4042, 0xe23c, 0x2222, 0x4222, 0x4442, 0x0004,
246 0x0800, 0x0808, 0xda7a, 0x5454, 0x46e4, 0xe442, 0x08c4, 0x0000,
247 0x0000, 0x7e40, 0x8848, 0x28be, 0x2828, 0x3e28, 0x08e8, 0x0008,
248 0x0000, 0x723c, 0x9252, 0x9292, 0x8292, 0x84fc, 0x8484, 0x0000,
249 0x0000, 0x1010, 0x2010, 0x2020, 0x6040, 0x8c50, 0x8286, 0x0000,
250 0x0000, 0x4040, 0x784e, 0x88c0, 0x388e, 0x0848, 0x7e08, 0x0000,
251 0x0000, 0x7c00, 0x0000, 0x0000, 0x10fe, 0x1010, 0x1010, 0x0010
271 #ifdef _X1TURBO_FEATURE
293 #define USE_CPU_HUC6280
295 class VM : public VM_TEMPLATE
309 SASI_HDD* sasi_hdd[(USE_HARD_DISK >> 1) + (USE_HARD_DISK & 1)];
310 SCSI_HOST* sasi_host;
320 #ifdef _X1TURBO_FEATURE
353 // ----------------------------------------
355 // ----------------------------------------
360 // ----------------------------------------
361 // for emulation class
362 // ----------------------------------------
364 // drive virtual machine
366 void special_reset();
368 double get_frame_rate();
372 DEVICE *get_cpu(int index);
379 void initialize_sound(int rate, int samples);
380 uint16_t* create_sound(int* extra_frames);
381 int get_sound_buffer_ptr();
382 #ifdef USE_SOUND_VOLUME
383 void set_sound_device_volume(int ch, int decibel_l, int decibel_r);
387 void key_down(int code, bool repeat);
388 void key_up(int code);
389 bool get_caps_locked();
390 bool get_kana_locked();
393 void open_floppy_disk(int drv, const _TCHAR* file_path, int bank);
394 void close_floppy_disk(int drv);
395 bool is_floppy_disk_inserted(int drv);
396 void is_floppy_disk_protected(int drv, bool value);
397 bool is_floppy_disk_protected(int drv);
398 uint32_t is_floppy_disk_accessed();
399 void open_hard_disk(int drv, const _TCHAR* file_path);
400 void close_hard_disk(int drv);
401 bool is_hard_disk_inserted(int drv);
402 uint32_t is_hard_disk_accessed();
403 void play_tape(int drv, const _TCHAR* file_path);
404 void rec_tape(int drv, const _TCHAR* file_path);
405 void close_tape(int drv);
406 bool is_tape_inserted(int drv);
407 bool is_tape_playing(int drv);
408 bool is_tape_recording(int drv);
409 int get_tape_position(int drv);
410 const _TCHAR* get_tape_message(int drv);
411 void push_play(int drv);
412 void push_stop(int drv);
413 void push_fast_forward(int drv);
414 void push_fast_rewind(int drv);
415 void push_apss_forward(int drv);
416 void push_apss_rewind(int drv);
417 bool is_frame_skippable();
419 void open_cart(int drv, const _TCHAR* file_path);
420 void close_cart(int drv);
421 bool is_cart_inserted(int drv);
424 void update_config();
425 #ifdef _X1TURBO_FEATURE
426 void update_dipswitch();
428 void save_state(FILEIO* state_fio);
429 bool load_state(FILEIO* state_fio);
430 void decl_state(void);
432 // ----------------------------------------
434 // ----------------------------------------
437 DEVICE* get_device(int id);
439 //DEVICE* first_device;
440 //DEVICE* last_device;