OSDN Git Service

[VM][General] Merge upstream 2016-03-01. (Pahse 1).
[csp-qt/common_source_project-fm7.git] / source / src / vm / pc9801 / pc9801.h
index 90f050b..3ebd4f3 100644 (file)
 #elif defined(_PC98DO)
 #define DEVICE_NAME            "NEC PC-98DO"
 #define CONFIG_NAME            "pc98do"
+#elif defined(_PC98DOPLUS)
+#define DEVICE_NAME            "NEC PC-98DO+"
+#define CONFIG_NAME            "pc98do+"
 #else
 #endif
 
-// 4:3
-#define SCREEN_WIDTH_ASPECT 640 
-#define SCREEN_HEIGHT_ASPECT 400
-#define WINDOW_WIDTH_ASPECT 640 
-#define WINDOW_HEIGHT_ASPECT 480
-
 #if defined(_PC9801) || defined(_PC9801E)
 #define SUPPORT_CMT_IF
 #define SUPPORT_2HD_FDD_IF
 #endif
 
 
-#if defined(_PC98DO)
+// PC-9801-86
+//#define SUPPORT_PC98_OPNA
+
+#if defined(_PC98DO) || defined(_PC98DOPLUS)
 #define MODE_PC98      0
 #define MODE_PC88_V1S  1
 #define MODE_PC88_V1H  2
 //#define SUPPORT_PC88_JOYSTICK
 #define PC88_EXRAM_BANKS       4
 #endif
+#if defined(_PC98DOPLUS)
+#define SUPPORT_PC88_OPNA
+#define SUPPORT_PC88_SB2
+#endif
 
 // device informations for virtual machine
 #define FRAMES_PER_SEC         56.4
 #elif defined(_PC9801E) || defined(_PC9801U) || defined(_PC9801VF)
 #define CPU_CLOCKS             7987248
 #define PIT_CLOCK_8MHZ
+#elif defined(_PC98DOPLUS)
+#define CPU_CLOCKS             15974496
+#define PIT_CLOCK_8MHZ
 #else
 #define CPU_CLOCKS             9984060
 #define PIT_CLOCK_5MHZ
 #endif
 #define SCREEN_WIDTH           640
 #define SCREEN_HEIGHT          400
+#define WINDOW_HEIGHT_ASPECT   480
 #define MAX_DRIVE              2
 #define UPD765A_NO_ST1_EN_OR_FOR_RESULT7
-#if defined(_PC98DO)
+#if defined(_PC98DO) || defined(_PC98DOPLUS)
 #define PC80S31K_NO_WAIT
 #endif
 #define UPD7220_MSB_FIRST
 #define UPD7220_HORIZ_FREQ     24830
 #if defined(_PC9801) || defined(_PC9801E)
 #define HAS_I86
+#elif defined(_PC98DOPLUS)
+#define HAS_V33A
 #else
 #define HAS_V30
 #endif
-#if defined(_PC98DO)
+#if defined(_PC98DO) || defined(_PC98DOPLUS)
 #define HAS_UPD4990A
-//#define HAS_YM2608
 #define Z80_MEMORY_WAIT
 #endif
+#if defined(SUPPORT_PC98_OPNA) || defined(SUPPORT_PC88_OPNA)
+#define HAS_YM2608
+#endif
 #define I8259_MAX_CHIPS                2
 #define SINGLE_MODE_DMA
 #define MEMORY_ADDR_MAX                0x100000
 #define SUPPORT_VARIABLE_TIMING
 
 // device informations for win32
-
-#if defined(_PC98DO)
+#if defined(_PC98DO) || defined(_PC98DOPLUS)
 #define USE_BOOT_MODE          5
 #define USE_DIPSWITCH
 #endif
-#if defined(_PC9801E) || defined(_PC9801VM) || defined(_PC98DO)
+#if defined(_PC9801E) || defined(_PC9801VM) || defined(_PC98DO) || defined(_PC98DOPLUS)
 #define USE_CPU_TYPE           2
 #endif
 #define USE_FD1
 // for 320KB drives
 #define USE_FD5
 #define USE_FD6
-#elif defined(_PC98DO)
+#elif defined(_PC98DO) || defined(_PC98DOPLUS)
 // for PC-8801 drives
 #define USE_FD3
 #define USE_FD4
 #endif
-#if defined(SUPPORT_CMT_IF)
+#if defined(SUPPORT_CMT_IF) || defined(_PC98DO) || defined(_PC98DOPLUS)
 #define USE_TAPE
-#define USE_TAPE_PTR
 #define TAPE_BINARY_ONLY
-#elif defined(_PC98DO)
-#define USE_TAPE
 #endif
 #define NOTIFY_KEY_DOWN
 #define USE_SHIFT_NUMPAD_KEY
 #define USE_ALT_F10_KEY
-#if defined(_PC98DO)
+#if defined(_PC98DO) || defined(_PC98DOPLUS)
 // slow enough for N88-\93ú\96{\8cêBASIC
 #define USE_AUTO_KEY           8
 #define USE_AUTO_KEY_RELEASE   10
 #define USE_AUTO_KEY_RELEASE   6
 #endif
 #define USE_CRT_FILTER
+#define USE_SCREEN_ROTATE
 #define USE_ACCESS_LAMP
-#define USE_DISK_WRITE_PROTECT
 #define USE_SOUND_DEVICE_TYPE  4
+#if defined(_PC98DO) || defined(_PC98DOPLUS)
+#if    defined(SUPPORT_PC98_OPNA) &&  defined(SUPPORT_PC88_OPNA)
+#define USE_SOUND_VOLUME       (4 + 1 + 1 + 4 + 1)
+#elif  defined(SUPPORT_PC98_OPNA) && !defined(SUPPORT_PC88_OPNA)
+#define USE_SOUND_VOLUME       (4 + 1 + 1 + 2 + 1)
+#elif !defined(SUPPORT_PC98_OPNA) &&  defined(SUPPORT_PC88_OPNA)
+#define USE_SOUND_VOLUME       (2 + 1 + 1 + 4 + 1)
+#elif !defined(SUPPORT_PC98_OPNA) && !defined(SUPPORT_PC88_OPNA)
+#define USE_SOUND_VOLUME       (2 + 1 + 1 + 2 + 1)
+#endif
+#else
+#if defined(SUPPORT_PC98_OPNA)
+#define USE_SOUND_VOLUME       (4 + 1 + 1)
+#else
+#define USE_SOUND_VOLUME       (2 + 1 + 1)
+#endif
+#endif
+#define USE_JOYSTICK
+#define USE_MOUSE
+#define USE_PRINTER
+#define USE_PRINTER_TYPE       4
 #define USE_DEBUGGER
 #define USE_STATE
+#define USE_MOUSE
+#define USE_JOYSTICK
+#define USE_CRT_MONITOR_4_3 1
 
 #include "../../common.h"
 #include "../../fileio.h"
 
+#ifdef USE_SOUND_VOLUME
+static const _TCHAR *sound_device_caption[] = {
+#if defined(SUPPORT_PC98_OPNA)
+       _T("PC-9801-86 (FM)"), _T("PC-9801-86 (PSG)"), _T("PC-9801-86 (ADPCM)"), _T("PC-9801-86 (Rhythm)"),
+#else
+       _T("PC-9801-26 (FM)"), _T("PC-9801-26 (PSG)"),
+#endif
+       _T("PC-9801-14"), _T("Beep"),
+#if defined(_PC98DO) || defined(_PC98DOPLUS)
+#if defined(SUPPORT_PC88_OPNA)
+       _T("PC-88 OPNA (FM)"), _T("PC-88 OPNA (PSG)"), _T("PC-88 OPNA (ADPCM)"), _T("PC-88 OPNA (Rhythm)"),
+#else
+       _T("PC-88 OPN (FM)"), _T("PC-88 OPN (PSG)"),
+#endif
+       _T("PC-88 Beep"), 
+#endif
+};
+#endif
+
 class EMU;
 class DEVICE;
 class EVENT;
@@ -180,9 +231,7 @@ class I286;
 class IO;
 class LS244;
 class MEMORY;
-#if defined(HAS_I86) || defined(HAS_V30)
 class NOT;
-#endif
 #if !defined(SUPPORT_OLD_BUZZER)
 class PCM1BIT;
 #endif
@@ -201,7 +250,6 @@ class FMSOUND;
 class JOYSTICK;
 class KEYBOARD;
 class MOUSE;
-class PRINTER;
 
 #if defined(SUPPORT_320KB_FDD_IF)
 // 320kb fdd drives
@@ -209,7 +257,7 @@ class PC80S31K;
 class Z80;
 #endif
 
-#if defined(_PC98DO)
+#if defined(_PC98DO) || defined(_PC98DOPLUS)
 class PC80S31K;
 class PC88;
 class Z80;
@@ -228,6 +276,7 @@ protected:
 #else
        PCM1BIT* beep;
 #endif
+       DEVICE* printer;
        I8237* dma;
 #if defined(SUPPORT_CMT_IF)
        I8251* sio_cmt;
@@ -250,8 +299,9 @@ protected:
        LS244* dmareg0;
        LS244* rtcreg;
        MEMORY* memory;
+       NOT* not_busy;
 #if defined(HAS_I86) || defined(HAS_V30)
-       NOT* g_not;
+       NOT* not_prn;
 #endif
        UPD1990A* rtc;
 #if defined(SUPPORT_2HD_FDD_IF)
@@ -276,7 +326,6 @@ protected:
        JOYSTICK* joystick;
        KEYBOARD* keyboard;
        MOUSE* mouse;
-       PRINTER* printer;
        
        // PC-9801-14
        TMS3631* tms3631;
@@ -293,22 +342,23 @@ protected:
 #endif
        
        // memory
-       uint8 ram[0xa0000];
-       uint8 ipl[0x18000];
-       uint8 sound_bios[0x4000];
+       uint8_t ram[0xa0000];
+       uint8_t ipl[0x18000];
+       uint8_t sound_bios[0x4000];
 #if defined(_PC9801) || defined(_PC9801E)
-       uint8 fd_bios_2hd[0x1000];
-       uint8 fd_bios_2dd[0x1000];
+       uint8_t fd_bios_2hd[0x1000];
+       uint8_t fd_bios_2dd[0x1000];
 #endif
        bool pit_clock_8mhz;
-       int cpu_type;
+
        // sound
        int sound_device_type;
        
-#if defined(_PC98DO)
+#if defined(_PC98DO) || defined(_PC98DOPLUS)
        EVENT* pc88event;
        
        PC88* pc88;
+       DEVICE* pc88prn;
        I8251* pc88sio;
        I8255* pc88pio;
        PCM1BIT* pc88pcm;
@@ -339,7 +389,7 @@ public:
        // drive virtual machine
        void reset();
        void run();
-       double frame_rate();
+       double get_frame_rate();
        
 #ifdef USE_DEBUGGER
        // debugger
@@ -348,40 +398,37 @@ public:
        
        // 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, const _TCHAR* file_path, int bank);
-       void close_disk(int drv);
-       bool disk_inserted(int drv);
-       void set_disk_protected(int drv, bool value);
-       bool get_disk_protected(int drv);
-#if defined(SUPPORT_CMT_IF) || defined(_PC98DO)
+       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);
+#if defined(SUPPORT_CMT_IF) || defined(_PC98DO) || defined(_PC98DOPLUS)
        void play_tape(const _TCHAR* file_path);
        void rec_tape(const _TCHAR* file_path);
        void close_tape();
-       bool tape_inserted();
-#if defined(USE_TAPE_PTR)
-       int  get_tape_ptr();
-#endif
+       bool is_tape_inserted();
 #endif
-       bool now_skip();
-       void set_mix_cmt(bool flag);
-       void set_volume_cmt(uint32 volume);
+       bool is_frame_skippable();
        
        void update_config();
        void save_state(FILEIO* state_fio);
        bool load_state(FILEIO* state_fio);
-
        
        // ----------------------------------------
        // for each device