OSDN Git Service

[VM][KEYBOARD] Add ROMAJI-KANA conversion.(When set SUPPORT_ROMA_KANA_CONVERSION...
[csp-qt/common_source_project-fm7.git] / source / src / vm / fm7 / fm7.h
index 73ddbb9..b0a837b 100644 (file)
 #define _FM7_H_
 
 #define USE_TAPE
-#define USE_SOUND_DEVICE_TYPE 8
+#define USE_TAPE_PTR
+#define USE_TAPE_BUTTON
 #define USE_SCANLINE
 #define USE_DIPSWITCH
-#define USE_BOOT_MODE         4
-#define USE_CPU_TYPE
+#define USE_CPU_TYPE 2
 #define USE_SPECIAL_RESET
-#define HAS_YM2608
-#define SUPPORT_YM2203_PORT
-//#define HAS_AY_3_8910
-// 4:3
-#define SCREEN_WIDTH_ASPECT 400 
-#define SCREEN_HEIGHT_ASPECT 300
+#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 NOTIFY_KEY_DOWN
-#define NOTIFY_KEY_UP
+//#define NOTIFY_KEY_UP
+#define NOTIFY_KEY_DOWN_LR_SHIFT
+#define NOTIFY_KEY_DOWN_LR_MENU
 #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_DEBUGGER
-
+#define USE_STATE
+#define USE_DEBUGGER
+#define DATAREC_SOUND
+#define USE_DIG_RESOLUTION
+#define SUPPORT_ROMA_KANA_CONVERSION
+
+#if defined(_USE_QT)
+#define USE_SOUND_FILES 3
+#define USE_SOUND_FILES_FDD
+#define USE_SOUND_FILES_RELAY
+#endif
 #if defined(_FM8)
-#define DEVICE_NAME            "FUJITSU FM8"
+#define DEVICE_NAME            "FUJITSU FM-8"
 #define CONFIG_NAME            "fm8"
 #define CAPABLE_Z80
+#define DIPSWITCH_DEFAULT 0x00000000 
+#define USE_BUBBLE1
+#define USE_BUBBLE2
+#define MAX_BUBBLE 2
 
 #elif defined(_FM7)
-#define DEVICE_NAME            "FUJITSU FM7"
+#define DEVICE_NAME            "FUJITSU FM-7"
 #define CONFIG_NAME            "fm7"
 #define CAPABLE_Z80
+#define DIPSWITCH_DEFAULT 0x000000000 
+
+#elif defined(_FMNEW7)
+#define DEVICE_NAME            "FUJITSU FM-NEW7"
+#define CONFIG_NAME            "fmnew7"
+#define CAPABLE_Z80
+#define DIPSWITCH_DEFAULT 0x000000000 
+
+#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"
+#define DIPSWITCH_DEFAULT 0x00000003 
+# endif
+//#define USE_DRIVE_TYPE
+#define _FM77_VARIANTS
+#define CAPABLE_Z80
+# ifndef FM77_EXRAM_BANKS
+#   define FM77_EXRAM_BANKS    3
+# endif
 
 #elif defined(_FM77L4)
-#define DEVICE_NAME            "FUJITSU FM77L4"
+#define DEVICE_NAME            "FUJITSU FM-77L4"
 #define CONFIG_NAME            "fm77l4"
 #define HAS_MMR
-#define HAS_400LINECARD
 #define HAS_TEXTVRAM
 #define HAS_2HD
 #define HAS_CYCLESTEAL
+#define HAS_400LINECARD
+//#define CAPABLE_KANJI_CLASS2
+#define _FM77_VARIANTS
 #define CAPABLE_Z80
-#define CAPABLE_KANJI_CLASS2
-#define USE_DRIVE_TYPE
+# ifndef FM77_EXRAM_BANKS
+#  define FM77_EXRAM_BANKS     3
+# endif
+#define DIPSWITCH_DEFAULT 0x00000003 
 
 #elif defined(_FM77AV)
 #define DEVICE_NAME            "FUJITSU FM77AV"
 #define CONFIG_NAME            "fm77av"
 #define _FM77AV_VARIANTS
-#define HAS_MMR
-#define HAS_CYCLESTEAL
+#define DIPSWITCH_DEFAULT 0x80000001 
 
 #elif defined(_FM77AV20)
-#define DEVICE_NAME            "FUJITSU FM77AV"
+#define DEVICE_NAME            "FUJITSU FM77AV20"
 #define CONFIG_NAME            "fm77av20"
 #define _FM77AV_VARIANTS
 #define HAS_MMR
 #define HAS_2DD_2D
-#define HAS_CYCLESTEAL
-#define USE_DRIVE_TYPE
+#define CAPABLE_DICTROM
+//#define USE_DRIVE_TYPE 2
+#define CAPABLE_KANJI_CLASS2
+#define DIPSWITCH_DEFAULT 0x80000001 
+
+#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 
 
 #elif defined(_FM77AV40)
-#define DEVICE_NAME            "FUJITSU FM77AV"
+#define DEVICE_NAME            "FUJITSU FM77AV40"
 #define CONFIG_NAME            "fm77av40"
 #define _FM77AV_VARIANTS
-#define HAS_MMR
 #define HAS_2DD_2D
-#define HAS_CYCLESTEAL
+#define HAS_DMA
+//#define USE_DRIVE_TYPE 2
+#define CAPABLE_DICTROM
+#define HAS_400LINE_AV
 #define CAPABLE_KANJI_CLASS2
-#define USE_DRIVE_TYPE
+#ifndef FM77_EXRAM_BANKS
+#define FM77_EXRAM_BANKS       12
+#endif
+#define DIPSWITCH_DEFAULT 0x8000000d 
 
+#elif defined(_FM77AV40EX)
+#define DEVICE_NAME            "FUJITSU FM77AV40EX"
+#define CONFIG_NAME            "fm77av40ex"
+#define _FM77AV_VARIANTS
+#define HAS_2DD_2D
+#define HAS_DMA
+//#define USE_DRIVE_TYPE 2
+#define CAPABLE_DICTROM
+#define HAS_400LINE_AV
+#define CAPABLE_KANJI_CLASS2
+#ifndef FM77_EXRAM_BANKS
+#define FM77_EXRAM_BANKS       12
+#endif
+#define DIPSWITCH_DEFAULT 0x8000000d 
+
+#elif defined(_FM77AV40SX)
+#define DEVICE_NAME            "FUJITSU FM77AV40SX"
+#define CONFIG_NAME            "fm77av40sx"
+#define _FM77AV_VARIANTS
+#define HAS_2DD_2D
+#define HAS_DMA
+//#define USE_DRIVE_TYPE 2
+#define CAPABLE_DICTROM
+#define HAS_400LINE_AV
+#define CAPABLE_KANJI_CLASS2
+# ifndef FM77_EXRAM_BANKS
+#  define FM77_EXRAM_BANKS     12
+# endif
+#define DIPSWITCH_DEFAULT 0x8000000d 
+
+#endif
+
+#if defined(_FM8)
+#define USE_SOUND_DEVICE_TYPE   2
+#else
+#define USE_DEVICE_TYPE                3
+#define USE_SOUND_DEVICE_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
+
+#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
+
+// 0 = PSG or NONE
+// 1 = OPN (+PSG)
+// 2 = WHG (+PSG)
+// 3 = WHG + OPN (+PSG)
+// 4 = THG  (+PSG)
+// 5 = THG + OPN (+PSG)
+// 6 = THG + WHG (+PSG)
+// 7 = THG + WHG + OPN (+PSG)
+#if defined(_FM8)
+// WITHOUT PSG?
+#define SOUND_DEVICE_TYPE_DEFAULT      0
+#elif defined(_FM7) || defined(_FMNEW7) || defined(_FM77_VARIANTS)
+// PSG ONLY
+#define SOUND_DEVICE_TYPE_DEFAULT      0
+#elif defined(_FM77AV_VARIANTS)
+// OPN
+#define SOUND_DEVICE_TYPE_DEFAULT      1
+#endif
+
+#if defined(USE_SOUND_FILES)
+# if defined(_FM8)
+#define USE_SOUND_VOLUME       5
+# else
+#define USE_SOUND_VOLUME       11
+# endif
+#else
+# if defined(_FM8)
+#define USE_SOUND_VOLUME       3
+# else
+#define USE_SOUND_VOLUME       9
+# endif
+#endif
+
+#define IGNORE_DISK_CRC_DEFAULT                true
 // device informations for virtual machine
 
 // TODO: check refresh rate
-#define FRAMES_PER_SEC         60
+#define FRAMES_PER_SEC         59.94
+#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || defined(_FM77L4)
 #define LINES_PER_FRAME        400
+#else
+#define LINES_PER_FRAME        200
+#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
+#else
 #define CPU_CLOCKS             2000000
+#endif
+
 #define SCREEN_WIDTH           640
 #define SCREEN_HEIGHT          400
-#define MAX_DRIVE              4
+#define WINDOW_HEIGHT_ASPECT 480
 #define HAS_MC6809              
 #define MB8877_MAX_CHIPS       1
 //#define IO_ADDR_MAX          0x10000
 #define USE_FD1
 #define USE_FD2
 #define MAX_FD 2
+#define MAX_DRIVE 4
 
 #if defined(HAS_2HD)
 #define USE_FD3
 #define USE_FD4
 #undef  MAX_FD
-#define MAX_FD 4
+#undef  MAX_DRIVE
+#define MAX_FD 6
+#define MAX_DRIVE 8
 #endif
 
 
 # endif
 #endif
 
+// DIP Switch description
+#define SWITCH_CYCLESTEAL 0x00000001
+#if defined(_FM8)
+#define SWITCH_URA_RAM    0x00000002
+#else
+#define SWITCH_URA_RAM    0x00000000
+#endif
+#define SWITCH_INVERT_CMT 0x00000004
+
+// Belows are optional Hardwares.
+#if !defined(_FM77_VARIANTS) && !defined(_FM77AV_VARIANTS)
+#define SWITCH_FDC 0x00010000
+#else
+#define SWITCH_FDC 0x00000000
+#endif
+#if !defined(_FM77_VARIANTS) && !defined(_FM77AV_VARIANTS)
+#define SWITCH_Z80 0x00020000
+#else
+#define SWITCH_Z80 0x00000000
+#endif
+#if defined(_FM77_VARIANTS)
+#define SWITCH_DICTCARD 0x00040000
+#else
+#define SWITCH_DICTCARD 0x00000000
+#endif
+#if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
+#define SWITCH_EXTRA_RAM 0x00080000
+#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 "../../config.h"
 #include "../../common.h"
 #include "../../fileio.h"
 
+#ifdef USE_SOUND_VOLUME
+static const _TCHAR *sound_device_caption[] = {
+#if defined(_FM8)
+       _T("PSG(Hack)"),
+       _T("Beep"),
+       _T("CMT"),
+# if defined(USE_SOUND_FILES)
+       _T("FDD SEEK"), _T("RELAY"),
+# endif
+#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"),
+# if defined(_FM77AV_VARIANTS)
+       _T("Keyboard"),
+# endif
+#if defined(USE_SOUND_FILES)
+       _T("FDD SEEK"), _T("RELAY"),
+#endif
+#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
+
 class EMU;
 class DEVICE;
 class EVENT;
 class FILEIO;
 
+#if defined(_FM77AV_VARIANTS)
+class BEEP;
+#endif
 class PCM1BIT;
 class MC6809;
 class YM2203;
 class MB8877;
 class MEMORY;
 class DATAREC;
+#if defined(_FM8)
+class BUBBLECASETTE;
+#endif
+#if defined(USE_LED_DEVICE)
+class DUMMYDEVICE;
+#endif
 
 class DISPLAY;
-
+#if defined(_FM77AV_VARIANTS)
+class MB61VH010;
+#endif
+#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
+    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;
 #endif
-
 class VM {
 protected:
        EMU* emu;
@@ -153,54 +411,52 @@ protected:
        MC6809* maincpu;
        FM7_MAINMEM* mainmem;
        FM7_MAINIO* mainio;
-
+#if defined(USE_LED_DEVICE)
+       DUMMYDEVICE* led_terminate;
+#else
+       DEVICE* led_terminate;
+#endif
        MB8877* fdc;
-        YM2203* opn[3];
-        YM2203* psg; // Is right? AY-3-8910 is right device.
-        PCM1BIT* pcm1bit;
+#if defined(_FM8)
+       YM2203* psg;
+#else  
+       YM2203* opn[3];
+# if !defined(_FM77AV_VARIANTS)
+       YM2203* psg; // Is right? AY-3-8910 is right device.
+# endif
+#endif
+#if defined(_FM8)
+       BUBBLECASETTE *bubble_casette[2];
+#endif
+       //BEEP* beep;
+       PCM1BIT* pcm1bit;
        DATAREC *drec;
-   
+       JOYSTICK *joystick;
+       
 #ifdef  WITH_Z80
-        Z80* z80cpu;
+       Z80* z80cpu;
 #endif
-        DEVICE* printer;
-        DEVICE* mouse_opn;
+       DEVICE* printer;
        DEVICE* inteli_mouse; 
    
        DEVICE *dummycpu;
        MC6809* subcpu;
-        MEMORY* submem;
-
-        DISPLAY* display;
-        KEYBOARD* keyboard;
+#if defined(_FM77AV_VARIANTS)
+       MB61VH010 *alu;
+       BEEP *keyboard_beep;
+#endif
+#if defined(HAS_DMA)
+       HD6844 *dmac;
+#endif   
+       DISPLAY* display;
+       KEYBOARD* keyboard;
    
        KANJIROM *kanjiclass1;
 #ifdef CAPABLE_KANJI_CLASS2
        KANJIROM *kanjiclass2;
 #endif
-       int machine_version; // 0 = FM8 / 1 = FM7 / 2 = FM77AV / 3 = FM77AV40, etc...
-        Uint32 bootmode;   
-        Uint32 connected_opns;
-        bool cycle_steal;
-        bool clock_low;
-        int mainfreq_type;
-        Uint32 mainfreq_low;
-        Uint32 mainfreq_high;
-        Uint32 mainfreq_mmr;
-        Uint32 mainfreq_high_mmr;
-        Uint32 fdd_type[MAX_DRIVE];
-        BOOL   fdd_connect[MAX_DRIVE];
-
-        FILEIO* cmt_fileio;
-        bool cmt_enabled; // 77AV40SX is disabled.
-        bool cmt_play;
-        bool cmt_rec;
-        Uint32 cmt_bufptr;
-       bool connect_opn;
-       bool connect_whg;
-       bool connect_thg;
-   
+       bool connect_320kfdc;
+       bool connect_1Mfdc;
 public:
        // ----------------------------------------
        // initialize
@@ -217,7 +473,10 @@ public:
        void reset();
        void special_reset();
        void run();
-       double frame_rate();
+       double get_frame_rate();
+#if defined(USE_LED_DEVICE)
+       uint32_t get_led_status();
+#endif
        
 #ifdef USE_DEBUGGER
        // debugger
@@ -229,39 +488,62 @@ public:
        void update_dipswitch(void);
        // draw screen
        void draw_screen();
-       int access_lamp();
+       uint32_t get_access_lamp_status();
        
        // sound generation
        void initialize_sound(int rate, int samples);
-       uint16* create_sound(int* extra_frames);
-       int sound_buffer_ptr();
+       uint16_t* create_sound(int* extra_frames);
+       int get_sound_buffer_ptr();
+#ifdef USE_SOUND_VOLUME
+       void set_sound_device_volume(int ch, int decibel_l, int decibel_r);
+#endif
        
        // notify key
        void key_down(int code, bool repeat);
        void key_up(int code);
        
        // user interface
-       void open_disk(int drv, _TCHAR* file_path, int offset);
-       void close_disk(int drv);
-       bool disk_inserted(int drv);
-       void write_protect_fd(int drv, bool flag);
-       bool is_write_protect_fd(int drv);
+       void open_floppy_disk(int drv, const _TCHAR* file_path, int bank);
+       void close_floppy_disk(int drv);
+       bool is_floppy_disk_inserted(int drv);
+       void is_floppy_disk_protected(int drv, bool value);
+       bool is_floppy_disk_protected(int drv);
        
-       void play_tape(_TCHAR* file_path);
-       void rec_tape(_TCHAR* file_path);
+       void play_tape(const _TCHAR* file_path);
+       void rec_tape(const _TCHAR* file_path);
        void close_tape();
-       bool tape_inserted();
-       bool now_skip();
-        int get_tape_ptr(void);
-   
+       bool is_tape_inserted();
+       bool is_tape_playing();
+       bool is_tape_recording();
+       int get_tape_position();
+       
+       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 update_config();
-       //void save_state(FILEIO* state_fio);
-       //bool load_state(FILEIO* state_fio);
-
+       void save_state(FILEIO* state_fio);
+       bool load_state(FILEIO* state_fio);
+#if defined(USE_BUBBLE1)
+       void open_bubble_casette(int drv, _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
+#if defined(USE_MINIMUM_RENDERING)     
+       bool is_screen_changed(void);
+#endif 
        // ----------------------------------------
        // for each device
        // ----------------------------------------
-       void set_cpu_clock(DEVICE *cpu, uint32 clocks);
+       void set_cpu_clock(DEVICE *cpu, uint32_t clocks);
        // devices
        DEVICE* get_device(int id);
        DEVICE* dummy;