2 FUJITSU FMR-50 Emulator 'eFMTowns'
4 Author : Kyuma.Ohta <whatisthis.sowhat _at_ gmail.com>
22 #define RAM_SIZE_ORDER (1024*1024)
24 #if defined(_FMTOWNS_1)
25 #define DEVICE_NAME "FUJITSU FM-Towns Model 1"
26 #define CONFIG_NAME "fmtowns1"
30 #define USE_VARIABLE_MEMORY 6
31 #define MIN_RAM_SIZE 1
33 #elif defined(_FMTOWNS_2)
34 #define DEVICE_NAME "FUJITSU FM-Towns Model 2"
35 #define CONFIG_NAME "fmtowns2"
39 #define USE_VARIABLE_MEMORY 6
40 #define MIN_RAM_SIZE 1
42 #elif defined(_FMTOWNS_2F)
43 #define DEVICE_NAME "FUJITSU FM-Towns 2F"
44 #define CONFIG_NAME "fmtowns2F"
47 #define _FMTOWNS1_2ND_GEN
48 #define USE_VARIABLE_MEMORY 8
49 #define MIN_RAM_SIZE 2
51 #elif defined(_FMTOWNS_2H)
52 #define DEVICE_NAME "FUJITSU FM-Towns 2H"
53 #define CONFIG_NAME "fmtowns2H"
56 #define _FMTOWNS1_2ND_GEN
57 #define USE_VARIABLE_MEMORY 8
58 #define MIN_RAM_SIZE 2
60 #elif defined(_FMTOWNS_20F)
61 #define DEVICE_NAME "FUJITSU FM-Towns 20F"
62 #define CONFIG_NAME "fmtowns20F"
65 #define TYPE_TOWNS_X0 1
66 #define _FMTOWNS1_3RD_GEN
67 #define USE_VARIABLE_MEMORY 8
68 #define MIN_RAM_SIZE 2
70 #elif defined(_FMTOWNS_40H)
71 #define DEVICE_NAME "FUJITSU FM-Towns 40H"
72 #define CONFIG_NAME "fmtowns20H"
75 #define TYPE_TOWNS_X0 1
76 #define _FMTOWNS1_3RD_GEN
77 #define USE_VARIABLE_MEMORY 8
78 #define MIN_RAM_SIZE 2
80 #elif defined(_FMTOWNS2_UX20)
81 #define DEVICE_NAME "FUJITSU FM-Towns II UX20"
82 #define CONFIG_NAME "fmtowns2UX20"
86 #define TYPE_TOWNS2_UX 1
87 #define _FMTOWNS_UX_VARIANTS
88 #define USE_VARIABLE_MEMORY 9
89 #define MIN_RAM_SIZE 2
91 #elif defined(_FMTOWNS2_UX40)
92 #define DEVICE_NAME "FUJITSU FM-Towns II UX40"
93 #define CONFIG_NAME "fmtowns2UX40"
97 #define TYPE_TOWNS2_UX 1
98 #define _FMTOWNS_UX_VARIANTS
99 #define USE_VARIABLE_MEMORY 9
100 #define MIN_RAM_SIZE 2
102 #elif defined(_FMTOWNS2_CX20)
103 #define DEVICE_NAME "FUJITSU FM-Towns II CX20"
104 #define CONFIG_NAME "fmtowns2CX20"
107 #define TYPE_TOWNS2_CX 1
108 #define _FMTOWNS2_CX_VARIANTS
109 #define USE_VARIABLE_MEMORY 15
110 #define MIN_RAM_SIZE 2
112 #elif defined(_FMTOWNS2_CX40)
113 #define DEVICE_NAME "FUJITSU FM-Towns II CX40"
114 #define CONFIG_NAME "fmtowns2CX40"
117 #define TYPE_TOWNS2_CX 1
118 #define _FMTOWNS2_CX_VARIANTS
119 #define USE_VARIABLE_MEMORY 15
120 #define MIN_RAM_SIZE 2
122 #elif defined(_FMTOWNS2_CX100)
123 #define DEVICE_NAME "FUJITSU FM-Towns II CX40"
124 #define CONFIG_NAME "fmtowns2CX100"
127 #define TYPE_TOWNS2_CX 1
128 #define USE_VARIABLE_MEMORY 15
129 #define MIN_RAM_SIZE 2
130 #define _FMTOWNS2_CX_VARIANTS
132 #elif defined(_FMTOWNS2_UG10)
133 #define DEVICE_NAME "FUJITSU FM-Towns II UG10"
134 #define CONFIG_NAME "fmtowns2UG1"
138 #define USE_VARIABLE_MEMORY 9
139 #define MIN_RAM_SIZE 2
141 #define _FMTOWNS_UG_VARIANTS
143 #elif defined(_FMTOWNS2_UG20)
144 #define DEVICE_NAME "FUJITSU FM-Towns II UG20"
145 #define CONFIG_NAME "fmtowns2UG20"
149 #define USE_VARIABLE_MEMORY 9
150 #define MIN_RAM_SIZE 2
152 #define _FMTOWNS_UG_VARIANTS
154 #elif defined(_FMTOWNS2_UG40)
155 #define DEVICE_NAME "FUJITSU FM-Towns II UG40"
156 #define CONFIG_NAME "fmtowns2UG40"
160 #define USE_VARIABLE_MEMORY 9
161 #define MIN_RAM_SIZE 2
163 #define _FMTOWNS_UG_VARIANTS
165 #elif defined(_FMTOWNS2_UG80)
166 #define DEVICE_NAME "FUJITSU FM-Towns II UG80"
167 #define CONFIG_NAME "fmtowns2UG80"
171 #define USE_VARIABLE_MEMORY 9
172 #define MIN_RAM_SIZE 2
174 #define _FMTOWNS_UG_VARIANTS
176 #elif defined(_FMTOWNS2_HG20)
177 #define DEVICE_NAME "FUJITSU FM-Towns II HG20"
178 #define CONFIG_NAME "fmtowns2HG20"
181 #define USE_VARIABLE_MEMORY 15
182 #define MIN_RAM_SIZE 2
184 #define _FMTOWNS_HG_VARIANTS
185 #elif defined(_FMTOWNS2_HG40)
186 #define DEVICE_NAME "FUJITSU FM-Towns II HG40"
187 #define CONFIG_NAME "fmtowns2HG40"
191 #define USE_VARIABLE_MEMORY 15
192 #define MIN_RAM_SIZE 2
194 #define _FMTOWNS_HG_VARIANTS
196 #elif defined(_FMTOWNS2_HR20)
197 #define DEVICE_NAME "FUJITSU FM-Towns II HR20"
198 #define CONFIG_NAME "fmtowns2HR20"
201 #define _FMTOWNS_HR_VARIANTS
203 #define USE_VARIABLE_MEMORY 31
204 #define MIN_RAM_SIZE 2
207 #elif defined(_FMTOWNS2_HR100)
208 #define DEVICE_NAME "FUJITSU FM-Towns II HR100"
209 #define CONFIG_NAME "fmtowns2HR100"
213 #define USE_VARIABLE_MEMORY 31
214 #define MIN_RAM_SIZE 2
216 #define _FMTOWNS_HR_VARIANTS
219 #elif defined(_FMTOWNS2_HR200)
220 #define DEVICE_NAME "FUJITSU FM-Towns II HR200"
221 #define CONFIG_NAME "fmtowns2HR200"
224 #define _FMTOWNS_HR_VARIANTS
227 #define USE_VARIABLE_MEMORY 31
228 #define MIN_RAM_SIZE 2
232 #if defined(WITH_386SX)
233 #define MEMORY_ADDR_MAX 0x001000000 /* 16MB */
235 #define MEMORY_ADDR_MAX 0x100000000 /* 4GiB */
237 #define MEMORY_BANK_SIZE 1024
239 // device informations for virtual machine
240 #define FRAMES_PER_SEC 55.4 // OK?
241 #define LINES_PER_FRAME 784 // OK?
243 #define CPU_CLOCKS 16000000 // This maybe dummy value, see VM::VM().
245 #undef FIXED_FRAMEBUFFER_SIZE
246 #define SCREEN_WIDTH 1024
247 #define SCREEN_HEIGHT 768
248 #define WINDOW_WIDTH_ASPECT 1024
249 #define WINDOW_HEIGHT_ASPECT 768
251 #if defined(_HAS_HDD)
253 #define USE_HARD_DISK _HAS_HDD
255 #define USE_COMPACT_DISC 1
257 #define MAX_MEMCARD 2
258 #define I8259_MAX_CHIPS 2
259 //#define I8259_PC98_HACK
261 //#define SINGLE_MODE_DMA
262 #define MB8877_NO_BUSY_AFTER_SEEK
263 #define IO_ADDR_MAX 0x10000
264 #define SCSI_HOST_AUTO_ACK
265 //#define SCSI_HOST_WIDE
266 //#define _SCSI_DEBUG_LOG
267 //#define SCSI_DEV_IMMEDIATE_SELECT
268 //#define _CDROM_DEBUG_LOG
269 //#define _IO_DEBUG_LOG
271 // device informations for win32
272 #define USE_CPU_TYPE 2
273 #define USE_FLOPPY_DISK 4 // ??
275 #define USE_SPECIAL_RESET 12 /* 'CD' 'F0' - 'F3' 'H0' - 'H4' 'ICM' 'DEBUG' */
276 #define USE_FLOPPY_TYPE_BIT 0x0003 /* 5.0, 5.0, 3.5, 3.5 */
277 #define USE_MACHINE_FEATURES 2
278 #define NOTIFY_KEY_DOWN
279 #define USE_ALT_F10_KEY
280 #define USE_AUTO_KEY 5
281 #define USE_AUTO_KEY_RELEASE 6
282 #define USE_CRT_FILTER
283 #define USE_SOUND_FILES 1
284 #define USE_SOUND_FILES_FDD
286 #define USE_JOY_BUTTON_CAPTIONS
288 #define USE_CUSTOM_SCREEN_ZOOM_FACTOR 1.25
290 #if defined(USE_SOUND_FILES)
291 #define USE_SOUND_VOLUME 5
293 #define USE_SOUND_VOLUME 6
300 #define BASE_FLOPPY_DISK_NUM 0
301 //#define USE_QUEUED_SCSI_TRANSFER
303 #include "../../common.h"
304 #include "../../fileio.h"
305 #include "../vm_template.h"
307 #ifdef USE_SOUND_VOLUME
308 static const _TCHAR *sound_device_caption[] = {
309 _T("Beep"), _T("CD-DA"), _T("FM OPN2"), _T("ADPCM"),
310 #if defined(USE_SOUND_FILES)
315 #ifdef USE_JOY_BUTTON_CAPTIONS
316 static const _TCHAR *joy_button_captions[] = {
340 class YM2612; // OPNB
341 //class MB87078; // VOLUME
342 class AD7820KR; // A/D Converter.
346 class MSM58321; // RTC
347 class RF5C68; // ADPCM
368 #if defined(HAS_20PIX_FONTS)
369 class FONT_ROM_20PIX;
373 class TOWNS_DMAC; // DMAC
376 class TOWNS_SCSI_HOST;
385 class VM : public VM_TEMPLATE
396 I386* cpu; // i386DX/SX/486DX/486SX?/Pentium with FPU?
401 FMTOWNS::TOWNS_DMAC* dma;
402 FMTOWNS::TOWNS_DMAC* extra_dma;
404 NOISE* head_up_sound;
405 NOISE* head_down_sound;
408 // MB87078* e_volumes;
413 FMTOWNS::ADPCM* adpcm;
414 FMTOWNS::TOWNS_CRTC* crtc;
415 FMTOWNS::FLOPPY* floppy;
416 FMTOWNS::JOYSTICK* joystick;
417 FMTOWNS::JOYPAD_2BTN* joypad_2btn[2];
418 FMTOWNS::JOYPAD_6BTN* joypad_6btn[2];
419 FMTOWNS::MOUSE* mouse[2];
420 FMTOWNS::KEYBOARD* keyboard;
421 FMTOWNS::TIMER* timer;
422 FMTOWNS::TOWNS_VRAM* vram;
423 FMTOWNS::PLANEVRAM* planevram;
424 FMTOWNS::TOWNS_SPRITE* sprite;
425 FMTOWNS::TOWNS_MEMORY* memory;
426 FMTOWNS::DICTIONARY* dictionary;
427 FMTOWNS::SYSROM* sysrom;
428 FMTOWNS::MSDOSROM* msdosrom;
429 FMTOWNS::FONT_ROMS* fontrom;
430 FMTOWNS::TOWNS_ICCARD* iccard1;
431 FMTOWNS::TOWNS_ICCARD* iccard2;
432 #if defined(HAS_20PIX_FONTS)
433 FMTOWNS::FONT_ROM_20PIX* fontrom_20pix;
435 FMTOWNS::SERIAL_ROM* serialrom;
436 // FMTOWNS::CDC* cdc;
437 // FMTOWNS::TOWNS_SCSI_HOST* cdc_scsi;
438 FMTOWNS::TOWNS_CDROM* cdrom;
441 //FMTOWNS::TOWNS_SCSI_HOST* scsi_host;
442 SCSI_HOST* scsi_host;
443 SCSI_HDD* scsi_hdd[8]; //
460 scrntype_t *d_renderbuffer[2][2]; // [bank][layer]
461 uint32_t renderbuffer_size[2][2];
464 // ----------------------------------------
466 // ----------------------------------------
468 VM(EMU_TEMPLATE* parent_emu);
471 // ----------------------------------------
472 // for emulation class
473 // ----------------------------------------
475 // drive virtual machine
477 void special_reset(int num);
482 DEVICE *get_cpu(int index);
489 void initialize_sound(int rate, int samples);
490 uint16_t* create_sound(int* extra_frames);
491 int get_sound_buffer_ptr();
492 #ifdef USE_SOUND_VOLUME
493 void set_sound_device_volume(int ch, int decibel_l, int decibel_r);
497 void key_down(int code, bool repeat);
498 void key_up(int code);
501 // CARTs are IC CARD.Will implement something :-)
502 void open_cart(int drv, const _TCHAR* file_path);
503 void close_cart(int drv);
504 bool is_cart_inserted(int drv);
506 void open_floppy_disk(int drv, const _TCHAR* file_path, int bank);
507 void close_floppy_disk(int drv);
508 uint32_t is_floppy_disk_accessed();
509 bool is_floppy_disk_inserted(int drv);
510 void is_floppy_disk_protected(int drv, bool value);
511 bool is_floppy_disk_protected(int drv);
512 bool is_frame_skippable();
514 void open_compact_disc(int drv, const _TCHAR* file_path);
515 void close_compact_disc(int drv);
516 bool is_compact_disc_inserted(int drv);
517 uint32_t is_compact_disc_accessed();
518 #if defined(USE_HARD_DISK)
519 void open_hard_disk(int drv, const _TCHAR* file_path);
520 void close_hard_disk(int drv);
521 bool is_hard_disk_inserted(int drv);
522 uint32_t is_hard_disk_accessed();
524 void set_machine_type(uint16_t machine_id, uint16_t cpu_id);
526 void clear_sound_in();
527 int get_sound_in_data(int ch, int32_t* dst, int expect_samples, int expect_rate, int expect_channels);
528 int sound_in(int ch, int32_t* src, int samples);
530 double get_current_usec();
531 uint64_t get_current_clock_uint64();
533 void update_config();
534 bool process_state(FILEIO* state_fio, bool loading);
536 // ----------------------------------------
538 // ----------------------------------------
541 DEVICE* get_device(int id);
543 //DEVICE* first_device;
544 //DEVICE* last_device;