X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=source%2Fsrc%2Fvm%2Ffm7%2Ffm7.h;h=ec48034e285faf5c66d85840dd82b30ef4844d1b;hb=9657068762e0ebc1ed5a42638db31cdcdda7c9db;hp=2d9d242df27912c0dafff1cf613bd3abd343fe68;hpb=59fc5b4623a08b55dbe3d82782d533a3144be0e9;p=csp-qt%2Fcommon_source_project-fm7.git diff --git a/source/src/vm/fm7/fm7.h b/source/src/vm/fm7/fm7.h index 2d9d242df..ec48034e2 100644 --- a/source/src/vm/fm7/fm7.h +++ b/source/src/vm/fm7/fm7.h @@ -10,59 +10,80 @@ #ifndef _FM7_H_ #define _FM7_H_ -#define USE_TAPE +#define USE_TAPE 1 #define USE_TAPE_PTR #define USE_TAPE_BUTTON #define USE_SCANLINE #define USE_DIPSWITCH #define USE_CPU_TYPE 2 #define USE_SPECIAL_RESET -#define USE_LED_DEVICE 3 +#define USE_LED_DEVICE 3 #define USE_MINIMUM_RENDERING 1 #define USE_MOUSE #define USE_JOYSTICK +#define USE_JOY_BUTTON_CAPTIONS #define USE_PRINTER #define USE_PRINTER_TYPE 4 +#define USE_AY_3_8910_AS_PSG +#define SUPPORT_VARIABLE_TIMING -// 4:3 -#define USE_CRT_MONITOR_4_3 1 - +#define INDEPENDENT_CAPS_KANA_LED #define NOTIFY_KEY_DOWN //#define NOTIFY_KEY_UP #define NOTIFY_KEY_DOWN_LR_SHIFT +#define NOTIFY_KEY_DOWN_LR_MENU +#define USE_KEY_LOCKED #define USE_ALT_F10_KEY #define USE_AUTO_KEY 5 #define USE_AUTO_KEY_RELEASE 6 -#define USE_CRT_FILTER -#define USE_ACCESS_LAMP +#define USE_AUTO_KEY_NUMPAD +#define USE_SCREEN_FILTER #define USE_STATE #define USE_DEBUGGER +#define DATAREC_SOUND +#define USE_DIG_RESOLUTION +#define CPU_TYPE_DEFAULT 0 #if defined(_FM8) #define DEVICE_NAME "FUJITSU FM-8" #define CONFIG_NAME "fm8" #define CAPABLE_Z80 #define DIPSWITCH_DEFAULT 0x00000000 +#define USE_BUBBLE 2 +#define BASE_BUBBLE_NUM 0 +#define MAX_DRIVE 4 + +#undef CPU_TYPE_DEFAULT +#define CPU_TYPE_DEFAULT 1 +#define USE_GREEN_DISPLAY +#define USE_MONITOR_TYPE 2 #elif defined(_FM7) #define DEVICE_NAME "FUJITSU FM-7" #define CONFIG_NAME "fm7" #define CAPABLE_Z80 #define DIPSWITCH_DEFAULT 0x000000000 +#define MAX_DRIVE 4 +#define CAPABLE_JCOMMCARD 1 +#define USE_GREEN_DISPLAY +#define USE_MONITOR_TYPE 2 #elif defined(_FMNEW7) #define DEVICE_NAME "FUJITSU FM-NEW7" #define CONFIG_NAME "fmnew7" #define CAPABLE_Z80 #define DIPSWITCH_DEFAULT 0x000000000 +#define MAX_DRIVE 4 +#define CAPABLE_JCOMMCARD 1 +#define USE_GREEN_DISPLAY +#define USE_MONITOR_TYPE 2 #elif defined(_FM77) || defined(_FM77L2) # if defined(_FM77) #define DEVICE_NAME "FUJITSU FM-77" #define CONFIG_NAME "fm77" #define DIPSWITCH_DEFAULT 0x00000001 - # else #define DEVICE_NAME "FUJITSU FM-77L2" #define CONFIG_NAME "fm77l2" @@ -74,51 +95,62 @@ # ifndef FM77_EXRAM_BANKS # define FM77_EXRAM_BANKS 3 # endif +#define MAX_DRIVE 4 +#define CAPABLE_JCOMMCARD 1 +#define HAS_2HD +#define USE_GREEN_DISPLAY +#define USE_MONITOR_TYPE 2 #elif defined(_FM77L4) #define DEVICE_NAME "FUJITSU FM-77L4" #define CONFIG_NAME "fm77l4" -#define HAS_MMR #define HAS_TEXTVRAM #define HAS_2HD #define HAS_CYCLESTEAL #define HAS_400LINECARD //#define CAPABLE_KANJI_CLASS2 #define _FM77_VARIANTS -#define CAPABLE_Z80 +# define CAPABLE_Z80 # ifndef FM77_EXRAM_BANKS # define FM77_EXRAM_BANKS 3 # endif #define DIPSWITCH_DEFAULT 0x00000003 +#define MAX_DRIVE 4 +#define CAPABLE_JCOMMCARD 1 +#define USE_GREEN_DISPLAY +#define USE_MONITOR_TYPE 2 #elif defined(_FM77AV) #define DEVICE_NAME "FUJITSU FM77AV" #define CONFIG_NAME "fm77av" #define _FM77AV_VARIANTS #define DIPSWITCH_DEFAULT 0x80000001 +#define MAX_DRIVE 2 +#define CAPABLE_JCOMMCARD 1 +#define CAPABLE_DICTROM #elif defined(_FM77AV20) #define DEVICE_NAME "FUJITSU FM77AV20" #define CONFIG_NAME "fm77av20" #define _FM77AV_VARIANTS -#define HAS_MMR #define HAS_2DD_2D #define CAPABLE_DICTROM //#define USE_DRIVE_TYPE 2 #define CAPABLE_KANJI_CLASS2 #define DIPSWITCH_DEFAULT 0x80000001 +#define MAX_DRIVE 2 #elif defined(_FM77AV20EX) #define DEVICE_NAME "FUJITSU FM77AV20EX" #define CONFIG_NAME "fm77av20ex" #define _FM77AV_VARIANTS -#define HAS_MMR #define HAS_2DD_2D #define HAS_DMA //#define USE_DRIVE_TYPE 2 #define CAPABLE_DICTROM #define CAPABLE_KANJI_CLASS2 #define DIPSWITCH_DEFAULT 0x80000001 +#define MAX_DRIVE 4 #elif defined(_FM77AV40) #define DEVICE_NAME "FUJITSU FM77AV40" @@ -134,6 +166,7 @@ #define FM77_EXRAM_BANKS 12 #endif #define DIPSWITCH_DEFAULT 0x8000000d +#define MAX_DRIVE 4 #elif defined(_FM77AV40EX) #define DEVICE_NAME "FUJITSU FM77AV40EX" @@ -149,6 +182,7 @@ #define FM77_EXRAM_BANKS 12 #endif #define DIPSWITCH_DEFAULT 0x8000000d +#define MAX_DRIVE 4 #elif defined(_FM77AV40SX) #define DEVICE_NAME "FUJITSU FM77AV40SX" @@ -164,40 +198,27 @@ # define FM77_EXRAM_BANKS 12 # endif #define DIPSWITCH_DEFAULT 0x8000000d +#define MAX_DRIVE 4 #endif -#define DIPSWITCH_DEFAULT 0x8000000d #if defined(_FM8) -#define USE_SOUND_DEVICE_TYPE 2 +#define USE_SOUND_TYPE 2 #else -#define USE_DEVICE_TYPE 3 -#define USE_SOUND_DEVICE_TYPE 8 +#define USE_MOUSE_TYPE 3 +#define USE_SOUND_TYPE 8 #endif #ifdef _FM77AV_VARIANTS - -//#define CAPABLE_KANJI_CLASS2 #define HAS_MMR #define HAS_CYCLESTEAL - #elif defined(_FM77_VARIANTS) - #define HAS_MMR #define HAS_CYCLESTEAL #define CAPABLE_Z80 #endif -#define DIPSWITCH_DEFAULT 0x8000000d -#if defined(_FM77_VARIANTS) -#define USE_BOOT_MODE 4 -#elif defined(_FM8) -#define USE_BOOT_MODE 4 -#elif defined(_FM7) || defined(_FMNEW7) -#define USE_BOOT_MODE 3 -#else -#define USE_BOOT_MODE 2 -#endif +#define USE_BOOT_MODE 8 // 0 = PSG or NONE // 1 = OPN (+PSG) @@ -209,24 +230,28 @@ // 7 = THG + WHG + OPN (+PSG) #if defined(_FM8) // WITHOUT PSG? -#define SOUND_DEVICE_TYPE_DEFAULT 0 +#define SOUND_TYPE_DEFAULT 0 #elif defined(_FM7) || defined(_FMNEW7) || defined(_FM77_VARIANTS) // PSG ONLY -#define SOUND_DEVICE_TYPE_DEFAULT 0 +#define SOUND_TYPE_DEFAULT 0 #elif defined(_FM77AV_VARIANTS) // OPN -#define SOUND_DEVICE_TYPE_DEFAULT 1 +#define SOUND_TYPE_DEFAULT 1 #endif -#if !defined(_FM77AV_VARIANTS) -#define USE_SOUND_VOLUME 9 + +#if defined(_FM8) +#define USE_SOUND_VOLUME 5 #else -#define USE_SOUND_VOLUME 8 +#define USE_SOUND_VOLUME 11 #endif +#define SUPPORT_TV_RENDER + #define IGNORE_DISK_CRC_DEFAULT true // device informations for virtual machine // TODO: check refresh rate -#define FRAMES_PER_SEC 59.94 +//#define FRAMES_PER_SEC 60.0962 /* Related to display.cpp */ +#define FRAMES_PER_SEC 59.94 /* Related to display.cpp */ #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || defined(_FM77L4) #define LINES_PER_FRAME 400 #else @@ -234,34 +259,53 @@ #endif #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \ - defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX) -#define CPU_CLOCKS 2016000 -#elif defined(_FM8) -#define CPU_CLOCKS 1095000 + defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX) +#define CPU_CLOCKS 2016000 /* 2016 */ #else -#define CPU_CLOCKS 2000000 +#define CPU_CLOCKS 1798000 /* FM8,7 - 77AV/20? */ #endif + +/* + * If you wish to use software-scanline, define below. + * If not, undef. + */ +#define FIXED_FRAMEBUFFER_SIZE + +#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || defined(_FM77L4) #define SCREEN_WIDTH 640 #define SCREEN_HEIGHT 400 +#undef SCREEN_FAKE_WIDTH +#undef SCREEN_FAKE_HEIGHT +#else /* Not have 400 line */ + +#define SCREEN_WIDTH 640 +#define SCREEN_HEIGHT 200 +# if defined(FIXED_FRAMEBUFFER_SIZE) +# define SCREEN_FAKE_WIDTH 640 +# define SCREEN_FAKE_HEIGHT 400 +# else +# define SCREEN_FAKE_WIDTH 640 +# define SCREEN_FAKE_HEIGHT 200 +# endif + +# if !defined(FIXED_FRAMEBUFFER_SIZE) +# define SCREEN_Y_ZOOM 2.0 +# endif + +#endif #define WINDOW_HEIGHT_ASPECT 480 -#define MAX_DRIVE 4 #define HAS_MC6809 #define MB8877_MAX_CHIPS 1 //#define IO_ADDR_MAX 0x10000 // device informations for win32 -#define USE_FD1 -#define USE_FD2 -#define MAX_FD 2 - #if defined(HAS_2HD) -#define USE_FD3 -#define USE_FD4 -#undef MAX_FD -#define MAX_FD 4 +#define USE_FLOPPY_DISK 4 +#else +#define USE_FLOPPY_DISK 2 #endif - +#define BASE_FLOPPY_DISK_NUM 0 #ifdef BUILD_Z80 # ifdef CAPABLE_Z80 @@ -299,48 +343,91 @@ #else #define SWITCH_EXTRA_RAM 0x00000000 #endif +#define MB8877_NO_BUSY_AFTER_SEEK //#define ENABLE_OPENCL // If OpenCL renderer is enabled, define here. //#include "../../config.h" #include "../../common.h" #include "../../fileio.h" +#include "../vm_template.h" #ifdef USE_SOUND_VOLUME static const _TCHAR *sound_device_caption[] = { #if defined(_FM8) _T("PSG(Hack)"), _T("Beep"), - _T("CMT"), + _T("CMT (Signal)"), + _T("Noise (320KB FDD)"), + _T("Noise (CMT)"), #else # if !defined(_FM77AV_VARIANTS) _T("PSG"), # endif _T("OPN (FM)"), _T("OPN (PSG)"), _T("WHG (FM)"), _T("WHG (PSG)"), _T("THG (FM)"), _T("THG (PSG)"), - _T("Beep"), _T("CMT"), + _T("Beep"), _T("CMT (Signal)"), +# if defined(_FM77AV_VARIANTS) + _T("Keyboard"), +# endif + _T("Noise (320KB FDD)"), +# if defined(HAS_2HD) + _T("Noise (1MB FDD/2HD)"), +# endif + _T("Noise (CMT)"), #endif }; #endif +#ifdef USE_JOY_BUTTON_CAPTIONS +static const _TCHAR *joy_button_captions[] = { + _T("Up"), + _T("Down"), + _T("Left"), + _T("Right"), + _T("Button #1(1st)"), + _T("Button #2(1st)"), + _T("Button #1(2nd)"), + _T("Button #2(2nd)"), +}; +#endif + +/* + * NOTE: + * Below defines are for EVENT::run_cpu(). + * Please see event.cpp for details. + * 20180317 -- K.Ohta. + */ + +#define USE_CPU_MC6809 +#if defined(WITH_Z80) +#define USE_CPU_Z80 +#endif class EMU; class DEVICE; class EVENT; class FILEIO; +class AND; +#if defined(USE_AY_3_8910_AS_PSG) && !defined(_FM77AV_VARIANTS) +class AY_3_891X; +#endif #if defined(_FM77AV_VARIANTS) class BEEP; #endif -class PCM1BIT; +class DATAREC; +#if defined(_FM77L4) +class HD46505; +#endif +class I8251; +class MB8877; class MC6809; +class PCM1BIT; class YM2203; -class MB8877; -class MEMORY; -class DATAREC; -#if defined(USE_LED_DEVICE) -class DUMMYDEVICE; +#ifdef WITH_Z80 +class Z80; +class OR; #endif -class DISPLAY; #if defined(_FM77AV_VARIANTS) class MB61VH010; #endif @@ -348,52 +435,91 @@ class MB61VH010; defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX) class HD6844; #endif -class FM7_MAINMEM; -class FM7_MAINIO; -class KEYBOARD; -class KANJIROM; -class JOYSTICK; -#if WITH_Z80 -class Z80; +namespace FM7 { +#if defined(USE_BUBBLE) + class BUBBLECASETTE; +#endif + class DISPLAY; +#ifdef CAPABLE_JCOMMCARD +class FM7_JCOMMCARD; +#endif + class FM7_MAINMEM; +#if defined(_FM8) + class FM8_MAINIO; +#else + class FM7_MAINIO; #endif + class JOYSTICK; + class KEYBOARD; + class KANJIROM; +} -class VM { +class VM : public VM_TEMPLATE +{ protected: - EMU* emu; +// EMU* emu; // devices - EVENT* event; +// EVENT* event; + DEVICE* dummycpu; MC6809* maincpu; - FM7_MAINMEM* mainmem; - FM7_MAINIO* mainio; -#if defined(USE_LED_DEVICE) - DUMMYDEVICE* led_terminate; + FM7::FM7_MAINMEM* mainmem; +#if defined(_FM8) + FM7::FM8_MAINIO* mainio; #else - DEVICE* led_terminate; + FM7::FM7_MAINIO* mainio; #endif MB8877* fdc; +#if defined(HAS_2HD) + MB8877 *fdc_2HD; +#endif #if defined(_FM8) - YM2203 *psg; -#else + // FM8 +# if defined(USE_AY_3_8910_AS_PSG) + AY_3_891X *psg; +# else + YM2203* psg; +# endif +#else + // FM7 - YM2203* opn[3]; # if !defined(_FM77AV_VARIANTS) +# if defined(USE_AY_3_8910_AS_PSG) + AY_3_891X *psg; +#else YM2203* psg; // Is right? AY-3-8910 is right device. +# endif # endif #endif +#if defined(USE_BUBBLE) + FM7::BUBBLECASETTE *bubble_casette[USE_BUBBLE]; +#endif + I8251 *uart[3]; +# if defined(_FM77AV20) || defined(_FM77AV40) || defined(_FM77AV20EX) || defined(_FM77AV40EX) || defined(_FM77AV40SX) + AND *g_rs232c_dtr; +#endif + //BEEP* beep; PCM1BIT* pcm1bit; DATAREC *drec; - JOYSTICK *joystick; + FM7::JOYSTICK *joystick; #ifdef WITH_Z80 Z80* z80cpu; -#endif + AND *g_nmi; + OR *g_intr; + AND *g_intr_irq; + AND *g_intr_firq; + AND *g_mainstat; +#endif + AND *g_substat_display; + AND *g_substat_mainhalt; + DEVICE* printer; DEVICE* inteli_mouse; - DEVICE *dummycpu; MC6809* subcpu; #if defined(_FM77AV_VARIANTS) MB61VH010 *alu; @@ -402,14 +528,24 @@ protected: #if defined(HAS_DMA) HD6844 *dmac; #endif - DISPLAY* display; - KEYBOARD* keyboard; + FM7::DISPLAY* display; + FM7::KEYBOARD* keyboard; - KANJIROM *kanjiclass1; + FM7::KANJIROM *kanjiclass1; #ifdef CAPABLE_KANJI_CLASS2 - KANJIROM *kanjiclass2; + FM7::KANJIROM *kanjiclass2; +#endif +#if defined(CAPABLE_JCOMMCARD) + MC6809 *jsubcpu; + FM7::FM7_JCOMMCARD *jcommcard; + AND *g_jsubhalt; #endif - bool clock_low; +#if defined(_FM77L4) + HD46505 *l4crtc; +#endif + bool connect_320kfdc; + bool connect_1Mfdc; + public: // ---------------------------------------- // initialize @@ -427,21 +563,16 @@ public: void special_reset(); void run(); double get_frame_rate(); -#if defined(USE_LED_DEVICE) - uint32_t get_led_status(); -#endif #ifdef USE_DEBUGGER // debugger DEVICE *get_cpu(int index); #endif - void initialize(void); void connect_bus(void); void update_dipswitch(void); // draw screen void draw_screen(); - uint32_t get_access_lamp_status(); // sound generation void initialize_sound(int rate, int samples); @@ -450,10 +581,14 @@ public: #ifdef USE_SOUND_VOLUME void set_sound_device_volume(int ch, int decibel_l, int decibel_r); #endif + void set_vm_frame_rate(double fps); // notify key void key_down(int code, bool repeat); void key_up(int code); + bool get_caps_locked(); + bool get_kana_locked(); + uint32_t get_led_status(); // user interface void open_floppy_disk(int drv, const _TCHAR* file_path, int bank); @@ -461,26 +596,34 @@ public: bool is_floppy_disk_inserted(int drv); void is_floppy_disk_protected(int drv, bool value); bool is_floppy_disk_protected(int drv); + uint32_t is_floppy_disk_accessed(); - void play_tape(const _TCHAR* file_path); - void rec_tape(const _TCHAR* file_path); - void close_tape(); - bool is_tape_inserted(); - bool is_tape_playing(); - bool is_tape_recording(); - int get_tape_position(); + void play_tape(int drv, const _TCHAR* file_path); + void rec_tape(int drv, const _TCHAR* file_path); + void close_tape(int drv); + bool is_tape_inserted(int drv); + bool is_tape_playing(int drv); + bool is_tape_recording(int drv); + int get_tape_position(int drv); + const _TCHAR* get_tape_message(int drv); bool is_frame_skippable(); - void push_play(); - void push_stop(); - void push_fast_forward(); - void push_fast_rewind(); - void push_apss_forward(); - void push_apss_rewind(); + void push_play(int drv); + void push_stop(int drv); + void push_fast_forward(int drv); + void push_fast_rewind(int drv); + void push_apss_forward(int drv); + void push_apss_rewind(int drv); void update_config(); - void save_state(FILEIO* state_fio); - bool load_state(FILEIO* state_fio); - + bool process_state(FILEIO* state_fio, bool loading); + +#if defined(USE_BUBBLE) + void open_bubble_casette(int drv, const _TCHAR *path, int bank); + void close_bubble_casette(int drv); + bool is_bubble_casette_inserted(int drv); + bool is_bubble_casette_protected(int drv); + void is_bubble_casette_protected(int drv, bool flag); +#endif #if defined(USE_DIG_RESOLUTION) void get_screen_resolution(int *w, int *h); #endif @@ -493,9 +636,9 @@ public: void set_cpu_clock(DEVICE *cpu, uint32_t clocks); // devices DEVICE* get_device(int id); - DEVICE* dummy; - DEVICE* first_device; - DEVICE* last_device; +// DEVICE* dummy; +// DEVICE* first_device; +// DEVICE* last_device; }; #endif