From e34f296af745710bbc638ebe11996f73bc960c3c Mon Sep 17 00:00:00 2001 From: "K.Ohta" Date: Sun, 16 May 2021 16:36:06 +0900 Subject: [PATCH] [VM][General] Merge Upstream 2021-05-06. Some variants of PC-6001 are temporally dropped. --- doc/VMs/bx1.txt | 50 ++ doc/VMs/readme.txt | 5 +- source/cmake/config_misccom.cmake | 5 + source/cmake/config_pc6001.cmake | 9 +- source/history.txt | 20 + source/readme.txt | 206 ++++++-- source/src/emu.h | 2 + source/src/qt/common/qrc/ax1.qrc | 6 + source/src/qt/common/qrc/bx1.qrc | 2 +- source/src/qt/machines/bx1/CMakeLists.txt | 8 +- source/src/qt/machines/bx1/MainWindow.cpp | 72 ++- source/src/qt/machines/bx1/menuclasses.h | 32 +- source/src/qt/machines/mz700/MainWindow.cpp | 13 + source/src/res/bx1.rc | 6 + source/src/res/mz1500.rc | 66 +++ source/src/res/mz700.rc | 66 +++ source/src/vm/bx1/CMakeLists.txt | 5 +- source/src/vm/bx1/bx1.cpp | 60 ++- source/src/vm/bx1/bx1.h | 22 +- source/src/vm/bx1/display.cpp | 56 ++- source/src/vm/bx1/floppy.cpp | 57 +++ source/src/vm/bx1/floppy.h | 45 ++ source/src/vm/bx1/keyboard.cpp | 553 +++++++++++----------- source/src/vm/bx1/keyboard.h | 3 - source/src/vm/bx1/printer.cpp | 50 +- source/src/vm/bx1/printer.h | 3 +- source/src/vm/common_vm/CMakeLists.txt | 2 +- source/src/vm/datarec.cpp | 7 +- source/src/vm/hd46505.cpp | 20 +- source/src/vm/hd46505.h | 2 +- source/src/vm/mc6843.cpp | 18 +- source/src/vm/mc6844.cpp | 35 +- source/src/vm/mcs48.h | 2 +- source/src/vm/mz700/CMakeLists.txt | 3 + source/src/vm/mz700/joystick.cpp | 186 ++++++++ source/src/vm/mz700/joystick.h | 54 +++ source/src/vm/mz700/memory.cpp | 2 +- source/src/vm/mz700/memory.h | 9 + source/src/vm/mz700/mz700.cpp | 10 + source/src/vm/mz700/mz700.h | 148 +++--- source/src/vm/pc6001/CMakeLists.txt | 9 +- source/src/vm/pc6001/memory.cpp | 600 +----------------------- source/src/vm/pc6001/memory.h | 136 +----- source/src/vm/pc6001/memory_draw.cpp | 699 ---------------------------- source/src/vm/pc6001/pc6001.cpp | 2 +- source/src/vm/x1/display.cpp | 35 +- source/src/vm/x1/display.h | 2 +- source/src/vm/z80ctc.cpp | 15 +- source/src/vm/z80ctc.h | 1 + source/src/vm/z80dma.cpp | 1 - source/src/vm/z80dma.h | 2 +- source/vc++2008/bx1.vcproj | 24 + source/vc++2008/mz1500.vcproj | 24 + source/vc++2008/mz700.vcproj | 24 + source/vc++2017/bx1.vcxproj | 2 + source/vc++2017/bx1.vcxproj.filters | 6 + source/vc++2017/mz1500.vcxproj | 2 + source/vc++2017/mz1500.vcxproj.filters | 6 + source/vc++2017/mz700.vcxproj | 2 + source/vc++2017/mz700.vcxproj.filters | 6 + 60 files changed, 1588 insertions(+), 1930 deletions(-) create mode 100644 doc/VMs/bx1.txt create mode 100644 source/src/qt/common/qrc/ax1.qrc create mode 100644 source/src/vm/bx1/floppy.cpp create mode 100644 source/src/vm/bx1/floppy.h create mode 100644 source/src/vm/mz700/joystick.cpp create mode 100644 source/src/vm/mz700/joystick.h delete mode 100644 source/src/vm/pc6001/memory_draw.cpp diff --git a/doc/VMs/bx1.txt b/doc/VMs/bx1.txt new file mode 100644 index 000000000..b9d9c901c --- /dev/null +++ b/doc/VMs/bx1.txt @@ -0,0 +1,50 @@ +"eBX-1" - CANON BX-1 emulator for Win32 + 5/2/2021 + +--- Internal ROM image + + BIOS_5000.ROM ROM CART #1 ($5000 - $5FFF) + BIOS_6000.ROM ROM CART #2 ($6000 - $6FFF) + BIOS_7000.ROM ROM CART #3 ($7000 - $7FFF) + BIOS_8000.ROM ROM CART #4 ($8000 - $8FFF) + BIOS_9000.ROM INTEGRATED BIOS ($9000 - $DFFF) + BIOS_F000.ROM INTEGRATED BIOS ($F000 - $FFFF) + +--- Key maps + + PC Virtual + -------------------------------- + Left Ctrl CAP + Right Ctrl UC + Left Shift SML + Caps CTRL + Tab INST + Escape CLEAR + F1 RUN + + Righit Shift PROGRAM + F2 RENAME + + Righit Shift NEW + F3 PROTECT + + Righit Shift SECURE + F4 PROG-LIST + + Righit Shift OPERATE + F5 STOP + + Righit Shift TRACE + F6 CONDENSE + + Righit Shift DISK LIST + F7 LINE-NO. + + Righit Shift RECALL + F9 EXP + F10 SIGH CHG + F11 CE + F12 START + Home ALPHA^X + End ( + Page Up SQR + Page Down ) + Scroll Lock PAPER FEED + +---------------------------------------- +TAKEDA, toshiya +t-takeda@m1.interq.or.jp +http://takeda-toshiya.my.coocan.jp/ diff --git a/doc/VMs/readme.txt b/doc/VMs/readme.txt index ab19903d4..941ba590e 100644 --- a/doc/VMs/readme.txt +++ b/doc/VMs/readme.txt @@ -1,5 +1,5 @@ Binary archive of retro pc emulator common source code - 1/24/2021 + 2/7/2021 --- What's this ? @@ -12,6 +12,7 @@ This archive includes the binaries of the emulators listed below: BANDAI eRX-78 RX-78 CANON + eBX-1 BX-1 eX-07 X-07 CASIO eFP-200 FP-200 @@ -495,7 +496,7 @@ Save/Load State info: MESS PC-8801 driver - vm/pc9801/display.* Neko Project 2 by Mr.Yui - Improved for EGC by Mr.Ryuji Okamoto (qemu/9821‰ü‘¢”Å) + Improved for EGC by Mr.Ryuji Okamoto (qemu/9821改造版) - vm/pcengine/pce.* Ootake (joypad) xpce (psg) diff --git a/source/cmake/config_misccom.cmake b/source/cmake/config_misccom.cmake index a4985da93..fbd4c772e 100644 --- a/source/cmake/config_misccom.cmake +++ b/source/cmake/config_misccom.cmake @@ -1,5 +1,6 @@ set(BUILD_BMJR ON CACHE BOOL "Build for Hitachi BASIC MASTER Jr.") set(BUILD_BUBCOM80 ON CACHE BOOL "Build for Systems Formulate BUBCOM-80.") +set(BUILD_AX1 OFF CACHE BOOL "Build CANON AX-1") set(BUILD_BX1 ON CACHE BOOL "Build CANON BX-1") set(BUILD_CEFUCOM21 ON CACHE BOOL "Build Hino Electronics CEFUCOM-21.") @@ -42,6 +43,10 @@ if(BUILD_BUBCOM80) set(RESOURCE ${PROJECT_SOURCE_DIR}/src/qt/common/qrc/bubcom80.qrc) ADD_VM(bubcom80 emububcom80 _BUBCOM80) endif() +if(BUILD_AX1) + set(RESOURCE ${PROJECT_SOURCE_DIR}/src/qt/common/qrc/ax1.qrc) + ADD_VM(bx1 emuax1 _AX1) +endif() if(BUILD_BX1) set(RESOURCE ${PROJECT_SOURCE_DIR}/src/qt/common/qrc/bx1.qrc) ADD_VM(bx1 emubx1 _BX1) diff --git a/source/cmake/config_pc6001.cmake b/source/cmake/config_pc6001.cmake index 58c1388fc..e98631728 100644 --- a/source/cmake/config_pc6001.cmake +++ b/source/cmake/config_pc6001.cmake @@ -1,8 +1,9 @@ set(BUILD_PC6001 ON CACHE BOOL "Build for NEC PC-6001") -set(BUILD_PC6001MK2 ON CACHE BOOL "Build for NEC PC-6001mk2") -set(BUILD_PC6001MK2SR ON CACHE BOOL "Build for NEC PC-6001mk2SR") -set(BUILD_PC6601 ON CACHE BOOL "Build for NEC PC-6601") -set(BUILD_PC6601SR ON CACHE BOOL "Build for NEC PC-6601SR") +# temporally disable to build from Upstream 2021-05-06; 20210516 K.O +set(BUILD_PC6001MK2 OFF CACHE BOOL "Build for NEC PC-6001mk2") +set(BUILD_PC6001MK2SR OFF CACHE BOOL "Build for NEC PC-6001mk2SR") +set(BUILD_PC6601 OFF CACHE BOOL "Build for NEC PC-6601") +set(BUILD_PC6601SR OFF CACHE BOOL "Build for NEC PC-6601SR") if(BUILD_PC6001) set(RESOURCE ${PROJECT_SOURCE_DIR}/src/qt/common/qrc/pc6001.qrc) diff --git a/source/history.txt b/source/history.txt index 69a888462..93be4ecb3 100644 --- a/source/history.txt +++ b/source/history.txt @@ -1,3 +1,23 @@ +5/2/2021 + +[VM/DATAREC] fix mixing sound track +[VM/HD46505] support smooth vertical scroll +[VM/MC6843] fix seek command +[VM/MC6844] fix data chain register to consider 2/4 channel select bit +[VM/MC6844] fix to transfer 64K when byte count register is zero +[VM/Z80CTC] fix to apply written time constant just after reset bit is cleared + +[BX1] fix memory map around ram +[BX1] support cartridge rom images +[BX1/DISPLAY] add missing font patterns +[BX1/FLOPPY] support i/o ports around fdc +[BX1/KEYBOARD] support PROG.SELECT switch +[BX1/PRINTER] support AUTO PRINT switch +[MZ1500/JOTSTICK] support joystick (thanks Mr.Koucha-Youkan) +[PC6001] remove some codes from iP6 Plus +[X1TURBO/DISPLAY] support smooth vertical scroll + + 2/7/2021 [WINMAIN] improve WM_KEYDOW/WM_KEYUP events for VK_PROCESSKEY case diff --git a/source/readme.txt b/source/readme.txt index aa4fb5ff4..b01cf7e33 100644 --- a/source/readme.txt +++ b/source/readme.txt @@ -1,9 +1,9 @@ -retro pc emulator common source code - 1/24/2021 +Binary archive of retro pc emulator common source code + 2/7/2021 --- What's this ? -This archive includes the all source codes of emulators listed below: +This archive includes the binaries of the emulators listed below: ASCII yayaMSX1 MSX1 (by Mr.tanam and Mr.umaiboux) @@ -49,8 +49,6 @@ This archive includes the all source codes of emulators listed below: eBabbage-2nd Babbage-2nd HITACHI eBASICMasterJr BASIC Master Jr - Hino Electronics - eCEFUCOM-21 CEFUCOM-21 Homebrew eZ80TVGAME Homebrew Z80 TV GAME SYSTEM IBM Japan Ltd @@ -95,7 +93,6 @@ This archive includes the all source codes of emulators listed below: ePC-100 PC-100 eTK-80BS TK-80BS / COMPO BS/80 eTK-85 TK-85 - eN5200 N5200 (work in progress) NEC-HE ePCEngine PC Engine / SuperGrafx + CD-ROM^2 Nintendo @@ -127,7 +124,6 @@ This archive includes the all source codes of emulators listed below: EmuZ-3500 MZ-3500 EmuZ-5500 MZ-5500 EmuZ-6500 MZ-6500 - EmuZ-6550 MZ-6550 (work in progress) eSM-B-80TE SM-B-80TE eX1 X1 eX1twin X1twin @@ -151,43 +147,191 @@ This archive includes the all source codes of emulators listed below: yayaHX-20+ HX-20 + FDD (by Mr.umaiboux) EmuPIA PASOPIA/PASOPIA5 EmuPIA7 PASOPIA7 - eJ-3100GT J-3100GT (work in progress) - eJ-3100SL J-3100SL (work in progress) YAMAHA eYIS YIS Yuasa Kyouiku System eYALKY YALKY +These binaries are for Windows XP/Vista/7. +DirectX9 and GDI+ are required. +They are tested on Windows 7 Home Premium with SP1. ---- How to build -Build the projects with the Microsoft Visual C++ 2008 with Service Pack 1 or -the Microsoft Visual C++ 2017. +--- How to use -The DirectX SDK is required. -I recommend the DirectX 9.0 SDK Update (December 2004), -and dinput.lib included in the DirectX 9.0 SDK Update (October 2004). +Common menus: -If you install the newer DirectX SDK, for example DirectX SDK (June 2010), -and it does not contain dinput.lib, pelase modify src/win32/osd.h to change -the definition of DIRECTINPUT_VERSION from 0x500 to 0x800 as follows: +Control + Reset Reset the virtual machine + -------- + CPU x1 Set CPU clock multipler + CPU x2 + CPU x4 + CPU x8 + CPU x16 + Full Speed Run simulation at full speed + -------- + Paste Auto key hitting from the clip board text + Stop Stop the auto key hitting + Romaji to Kana Enter kana letters with alphabet keys + -------- + Save State Save the virtual machine state + Load State Load the virtual machine state + -------- + Debug Main CPU Open console and debug target CPU like SYMDEB + Close Debugger Close debugger console + -------- + Exit Terminate the emulator -//#define DIRECTINPUT_VERSION 0x500 -#define DIRECTINPUT_VERSION 0x800 +Cart + Insert Insert the cart image + Eject Eject the cart image + -------- + History Insert the cart image -When you use the Microsoft Visual C++ 2017, the dir macros, -WindowsSDK_IncludePath, WindowsSDK_LibraryPath_x86, and DXSDK_DIR shoud be -defined and should specifies the install directories of the Windows SDK -and the DirectX SDK. -They are usually defined automatically when you install the SDKs. +FD + Insert Insert the floppy disk image + Eject Eject the floppy disk image + -------- + Write Protected Set the write protection of the inserted disk + Correct Timing Emulate FDC with correct timing + Ignore CRC Errors Ignore crc error status + ---- + History Insert the floppy disk image +CMT + Play Insert the cassette tape image to play + Rec Insert the cassette tape image to record + Eject Eject the cassette tape image + -------- + Play Button Control the cassette tape recorder + Stop Button + Fast Foward + Fast Rewind + -------- + Waveform Shaper Enable waveform shaping for *.wav data + -------- + History Insert the cassette tape image to play ---- License +Device + Sound + Sound Device Types + -------- + Play FDD Noise Enable playing FDD noise (seek, head up/down) + Play CMT Noise Enable playing CMT noise (relay on/off) + Play CMT Sound Enable playing CMT signal sound + Display + Monitor Types + -------- + Scanline Draw scanline -The copyright belongs to the author, but you can use the source codes -under the GNU GENERAL PUBLIC LICENSE Version 2. +Host + Rec Movie 60fps Record the movie to avi and wav files + Rec Movie 30fps + Rec Movie 15fps + Rec Sound Record the wave file + Stop Stop recording + Capture Screen Capture the screen to png file + -------- + Screen + - + Window x1 Set the window size + : + Window x8 + Fullscreen ?x? Set the fullscreen size + -------- + Dot By Dot Set the stretch screen mode in the fullscreen + Stretch (Aspect) + Stretch (Fill) + -------- + Rotate 0deg Rotate the screen + Rotate +90deg + Rotate 180deg + Rotate -90deg + Filter + RGB Filter Enable the RGB CRT filter + None + Sound + 2000Hz Set the sound frequency + 4000Hz You need to restart the emulator + 8000Hz + 11025Hz + 22050Hz + 44100Hz + 48000Hz + 96000Hz + -------- + 50msec Set the sound buffer size (latency) + 100msec You need to restart the emulator + 200msec + 300msec + 400msec + -------- + Realtime Mix Mix the sound in realtime + Light Weight Mix + -------- + Volume Set the volume of each sound device + Input + Joystcik #1/#2 Setup Joystick buttons + -------- + Use Direct2D1 Enable Direct2D1 to render screen + Use Direct3D9 Enable Direct3D9 to render screen + Wait Vsync Wait Vsync when Direct3D9 is enabled + Use DirectInput Enable DirectInput for keyboard + Disable Windows8 DWM Disable the Desktop Window Manager + Show Status Bar Show/Hide the status bar in windwo mode -See also COPYING.txt for more details about the license. + +--- Note + +For Windows PC environment: + + Support Windows PC compatible mouse and joystick devices. + + Accelerator key: + ALT+RETURN - Switch window / fullscreen + CTRL+RETURN - Enable/Disenable mouse control + APPLICATION - Enable/Disable full speed emulation + CTR+APPLICATION - Enable/Disable roman to kana conversion + + *) While the mouse control is enabled, the mouse cursor is hidden. + +Floppy disk images: + + P88SR D88 (*.d88;*.d77;*.1dd) + TeleDisk (*.td0) + ImageDisk (*.imd) + CPDRead (*.dsk) + T98-NEXT r0 (*.nfd) + Anex86 (*.fdi) + BKDSK (*.hdm;*.hd5;*.hd4;*.hdb;*.dd9;*.dd6) + + and any other solid images (*.tfd;*.xdf;*.2d;*.sf7;*.img;*.ima;*.vfd) + +Cassette tape images: + + Support wav files (PCM only) or special format images for each machine. + +CD-ROM images: + + Support BIN/IMG+CUE or IMG+CCD (CloneCD) format images. + +FDD noise: + + Place the wave files below: FDDSEEK.WAV. HEADDOWN.WAV. HEADUP.WAV + +CMT noise: + + Place the wave files below: RELAY_ON.WAV, RELAYOFF.WAV, FAST_FWD.WAV + +Save/Load State info: + + The state file contains any disk or other images. + Please NEVER upload your state files on the web. + + The state file format will be often changed. + Please don't invite your state file can be loaded after you update + the emulator binary. --- Thanks @@ -219,7 +363,9 @@ See also COPYING.txt for more details about the license. - vm/i386_np21.* Neko Project 21/W i386 core - vm/i8259.* - Neko Project 2 and MESS 8259 core + Neko Project 2 and MESS i8259 core +- vm/i8279.* + MAME i8279 core - vm/ld700.* openMSX LD-700 - vm/m6502.* diff --git a/source/src/emu.h b/source/src/emu.h index dddbb5efc..d63ac5e75 100644 --- a/source/src/emu.h +++ b/source/src/emu.h @@ -19,6 +19,8 @@ // #define _FDC_DEBUG_LOG // output scsi debug log // #define _SCSI_DEBUG_LOG + // output dma debug log +// #define _DMA_DEBUG_LOG // output i/o debug log // #define _IO_DEBUG_LOG #endif diff --git a/source/src/qt/common/qrc/ax1.qrc b/source/src/qt/common/qrc/ax1.qrc new file mode 100644 index 000000000..d623fb484 --- /dev/null +++ b/source/src/qt/common/qrc/ax1.qrc @@ -0,0 +1,6 @@ + + + ../../../res/bx1.ico + ../../../../../doc/VMs/bx1.txt + + diff --git a/source/src/qt/common/qrc/bx1.qrc b/source/src/qt/common/qrc/bx1.qrc index 76bd3a0b6..d623fb484 100644 --- a/source/src/qt/common/qrc/bx1.qrc +++ b/source/src/qt/common/qrc/bx1.qrc @@ -1,6 +1,6 @@ ../../../res/bx1.ico - ../../../../../doc/VMs/00_still_not_written.txt + ../../../../../doc/VMs/bx1.txt diff --git a/source/src/qt/machines/bx1/CMakeLists.txt b/source/src/qt/machines/bx1/CMakeLists.txt index 10c02faf6..8006747bd 100644 --- a/source/src/qt/machines/bx1/CMakeLists.txt +++ b/source/src/qt/machines/bx1/CMakeLists.txt @@ -1,14 +1,14 @@ message("* qt/emux07") -set(s_qt_bx1_headers +set(s_qt_${EXE_NAME}_headers menuclasses.h ) -QT5_WRAP_CPP(s_qt_emubx1_headers_MOC ${s_qt_bx1_headers}) +QT5_WRAP_CPP(s_qt_${EXE_NAME}_headers_MOC ${s_qt_${EXE_NAME}_headers}) -add_library(qt_emubx1 +add_library(qt_${EXE_NAME} MainWindow.cpp - ${s_qt_emubx1_headers_MOC} + ${s_qt_${EXE_NAME}_headers_MOC} ) diff --git a/source/src/qt/machines/bx1/MainWindow.cpp b/source/src/qt/machines/bx1/MainWindow.cpp index d4e91a022..cd1b09a26 100644 --- a/source/src/qt/machines/bx1/MainWindow.cpp +++ b/source/src/qt/machines/bx1/MainWindow.cpp @@ -10,6 +10,8 @@ #include #include #include +#include + #include "commonclasses.h" #include "menuclasses.h" #include "emu.h" @@ -17,16 +19,81 @@ //QT_BEGIN_NAMESPACE +Object_Menu_Control_BX1::Object_Menu_Control_BX1(QObject *parent, USING_FLAGS *p) : Object_Menu_Control(parent, p) +{ +} + +Object_Menu_Control_BX1::~Object_Menu_Control_BX1() +{ +} + +void Object_Menu_Control_BX1::do_set_dipsw(bool flag) +{ + int bitpos = getValue1(); + uint32_t bit = 0x00000001; + if((bitpos < 0) || (bitpos >= 32)) return; + bit = bit << bitpos; + if(flag) { + config.dipswitch = config.dipswitch | bit; + } else { + config.dipswitch = config.dipswitch & ((uint32_t)~bit); + } +} + +Action_Control_BX1::Action_Control_BX1(QObject *parent, USING_FLAGS *p, int num) : Action_Control(parent, p) +{ + bx1_binds = new Object_Menu_Control_BX1(parent, p); + bx1_binds->setValue1(num); +} + +Action_Control_BX1::~Action_Control_BX1() +{ + delete bx1_binds; +} void META_MainWindow::setupUI_Emu(void) { - int i; + menuMachine->addSeparator(); + uint32_t _bit = 0x00000001; + for(int i = 0; i < 4; i++) { + action_DipSWs[i] = new Action_Control_BX1(this, using_flags, i); + action_DipSWs[i]->setCheckable(true); + action_DipSWs[i]->setVisible(true); + action_DipSWs[i]->setEnabled(true); + menuMachine->addAction(action_DipSWs[i]); + if((config.dipswitch & _bit) != 0) action_DipSWs[i]->setChecked(true); + + connect(action_DipSWs[i], SIGNAL(toggled(bool)), action_DipSWs[i]->binds, SLOT(do_set_dipsw(bool))); + connect(action_DipSWs[i]->binds, SIGNAL(sig_emu_update_config()), this, SLOT(do_emu_update_config())); + _bit <<= 1; + } } void META_MainWindow::retranslateUi(void) { Ui_MainWindowBase::retranslateUi(); retranslateControlMenu("", false); + action_DipSWs[0]->setText(QApplication::translate("MachineBX1", "AUTO PRINT Switch", 0)); + action_DipSWs[1]->setText(QApplication::translate("MachineBX1", "PROG.SELECT Switch", 0)); + action_DipSWs[2]->setText(QApplication::translate("MachineBX1", "JPN/ENG Jumper", 0)); + action_DipSWs[0]->setVisible(true); + action_DipSWs[1]->setVisible(true); + action_DipSWs[2]->setVisible(true); + action_DipSWs[3]->setVisible(false); + + actionPrintDevice[3]->setText(QApplication::translate("MachineBX1", "None", 0)); + + actionPrintDevice[0]->setVisible(true); + actionPrintDevice[1]->setVisible(false); + actionPrintDevice[2]->setVisible(false); + actionPrintDevice[3]->setVisible(true); + + + actionPrintDevice[0]->setEnabled(true); + actionPrintDevice[1]->setEnabled(false); + actionPrintDevice[1]->setEnabled(false); + actionPrintDevice[3]->setEnabled(true); + #ifdef USE_DEBUGGER actionDebugger[0]->setVisible(true); actionDebugger[1]->setVisible(false); @@ -39,6 +106,9 @@ void META_MainWindow::retranslateUi(void) META_MainWindow::META_MainWindow(USING_FLAGS *p, CSP_Logger *logger, QWidget *parent) : Ui_MainWindow(p, logger, parent) { + for(int i = 0; i < 4; i++) { + action_DipSWs[i] = NULL; + } setupUI_Emu(); retranslateUi(); } diff --git a/source/src/qt/machines/bx1/menuclasses.h b/source/src/qt/machines/bx1/menuclasses.h index 860d5bacf..4e86ef392 100644 --- a/source/src/qt/machines/bx1/menuclasses.h +++ b/source/src/qt/machines/bx1/menuclasses.h @@ -2,19 +2,43 @@ #ifndef _CSP_QT_MENUCLASSES_H #define _CSP_QT_MENUCLASSES_H -//#include "commonclasses.h" +#include "commonclasses.h" #include "mainwidget.h" +#include "vm.h" // This extends class CSP_MainWindow as Ui_MainWindow. // You may use this as +class USING_FLAGS; +class CSP_Logger; + QT_BEGIN_NAMESPACE +class Object_Menu_Control_BX1: public Object_Menu_Control +{ + Q_OBJECT +public: + Object_Menu_Control_BX1(QObject *parent, USING_FLAGS *p); + ~Object_Menu_Control_BX1(); +signals: + // int sig_sound_device(int); + int sig_emu_update_config(void); +public slots: + void do_set_dipsw(bool flag); +}; + +class Action_Control_BX1 : public Action_Control +{ + Q_OBJECT +public: + Object_Menu_Control_BX1 *bx1_binds; + Action_Control_BX1(QObject *parent, USING_FLAGS *p, int num); + ~Action_Control_BX1(); +public slots: +}; -class Ui_MainWindow; -class USING_FLAGS; -class CSP_Logger; class META_MainWindow : public Ui_MainWindow { Q_OBJECT protected: + Action_Control_BX1 *action_DipSWs[4]; void setupUI_Emu(void); void retranslateUi(void); public: diff --git a/source/src/qt/machines/mz700/MainWindow.cpp b/source/src/qt/machines/mz700/MainWindow.cpp index f11f8ebb4..a66824182 100644 --- a/source/src/qt/machines/mz700/MainWindow.cpp +++ b/source/src/qt/machines/mz700/MainWindow.cpp @@ -70,6 +70,14 @@ void META_MainWindow::retranslateUi(void) { Ui_MainWindowBase::retranslateUi(); retranslateControlMenu(" ", true); +#if defined(USE_JOYSTICK_TYPE) + actionJoystickType[0]->setText(QApplication::translate("MachineMZ700", "MZ-1X03", 0)); + actionJoystickType[0]->setToolTip(QApplication::translate("MachineMZ700", "Use Sharp MZ-1X03 Joystick unit.", 0)); + actionJoystickType[1]->setText(QApplication::translate("MachineMZ700", "JOY-700", 0)); + actionJoystickType[1]->setToolTip(QApplication::translate("MachineMZ700", "Use Tsukumo JOY-700 Joystick unit.", 0)); + actionJoystickType[2]->setText(QApplication::translate("MachineMZ700", "AM7J", 0)); + actionJoystickType[2]->setToolTip(QApplication::translate("MachineMZ700", "Use AM7J ATARI-Joystick adapter.", 0)); +#endif #if defined(_MZ800) menuBootMode->setTitle(QApplication::translate("Machine", "BOOT Mode", 0)); actionBootMode[0]->setText(QString::fromUtf8("MZ-800")); @@ -90,6 +98,11 @@ void META_MainWindow::retranslateUi(void) #if defined(_MZ1500) actionPrintDevice[1]->setText(QString::fromUtf8("MZ-1P17")); actionPrintDevice[1]->setToolTip(QApplication::translate("MachineMZ700", "Sharp MZ-1P17 kanji thermal printer.", 0)); + actionPrintDevice[2]->setText(QString::fromUtf8("PC-PR201")); + actionPrintDevice[2]->setToolTip(QApplication::translate("MenuMZ700", "NEC PC-PR201 kanji serial printer.", 0)); + actionPrintDevice[2]->setEnabled(false); + + actionPrintDevice[3]->setText(QString::fromUtf8("None")); #endif #if defined(USE_DRIVE_TYPE) menuDriveType->setTitle(QApplication::translate("MachineMZ700", "Floppy Type", 0)); diff --git a/source/src/res/bx1.rc b/source/src/res/bx1.rc index 7d09fd07d..2f8b21e39 100644 --- a/source/src/res/bx1.rc +++ b/source/src/res/bx1.rc @@ -139,6 +139,12 @@ BEGIN END POPUP "Device" BEGIN + POPUP "Mode Switch" + BEGIN + MENUITEM "AUTO PRINT Switch", ID_VM_DIPSWITCH0 + MENUITEM "PROG.SELECT Switch", ID_VM_DIPSWITCH1 + MENUITEM "JPN/ENG Jumper", ID_VM_DIPSWITCH2 + END POPUP "Sound" BEGIN MENUITEM "Play FDD Noise", ID_VM_SOUND_NOISE_FDD, GRAYED diff --git a/source/src/res/mz1500.rc b/source/src/res/mz1500.rc index 666953fa0..7576346e0 100644 --- a/source/src/res/mz1500.rc +++ b/source/src/res/mz1500.rc @@ -176,6 +176,12 @@ BEGIN END POPUP "Device" BEGIN + POPUP "Joystick" + BEGIN + MENUITEM "MZ-1X03" ID_VM_JOYSTICK_TYPE0 + MENUITEM "Tsukumo JOY-700" ID_VM_JOYSTICK_TYPE1 + MENUITEM "AM7J adapter" ID_VM_JOYSTICK_TYPE2 + END POPUP "Sound" BEGIN MENUITEM "Play FDD Noise", ID_VM_SOUND_NOISE_FDD @@ -248,6 +254,12 @@ BEGIN MENUITEM SEPARATOR MENUITEM "Volume", ID_SOUND_VOLUME END + POPUP "Input" + BEGIN + MENUITEM "Joystick #1", ID_INPUT_JOYSTICK0 + MENUITEM "Joystick #2", ID_INPUT_JOYSTICK1 + MENUITEM "Joystick To Keyboard", ID_INPUT_JOYTOKEY + END MENUITEM SEPARATOR MENUITEM "Use Direct2D1", ID_HOST_USE_D2D1 MENUITEM "Use Direct3D9", ID_HOST_USE_D3D9 @@ -312,6 +324,60 @@ BEGIN DEFPUSHBUTTON "Reset",IDC_VOLUME_RESET,130,190,50,14 END +IDD_JOYSTICK DIALOG DISCARDABLE 0, 0, 175, 150 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Joystick #1" +FONT 9, "MS PGothic" +BEGIN + LTEXT "Button #1",IDC_JOYSTICK_CAPTION0,6,6,40,8 + EDITTEXT IDC_JOYSTICK_PARAM0,50,4,120,14,ES_MULTILINE + LTEXT "Button #2",IDC_JOYSTICK_CAPTION1,6,21,40,8 + EDITTEXT IDC_JOYSTICK_PARAM1,50,19,120,14,ES_MULTILINE + LTEXT "Button #3",IDC_JOYSTICK_CAPTION2,6,36,40,8 + EDITTEXT IDC_JOYSTICK_PARAM2,50,34,120,14,ES_MULTILINE + LTEXT "Button #4",IDC_JOYSTICK_CAPTION3,6,51,40,8 + EDITTEXT IDC_JOYSTICK_PARAM3,50,49,120,14,ES_MULTILINE + LTEXT "Button #5",IDC_JOYSTICK_CAPTION4,6,66,40,8 + EDITTEXT IDC_JOYSTICK_PARAM4,50,64,120,14,ES_MULTILINE + LTEXT "Button #6",IDC_JOYSTICK_CAPTION5,6,81,40,8 + EDITTEXT IDC_JOYSTICK_PARAM5,50,79,120,14,ES_MULTILINE + LTEXT "Button #7",IDC_JOYSTICK_CAPTION6,6,96,40,8 + EDITTEXT IDC_JOYSTICK_PARAM6,50,94,120,14,ES_MULTILINE + LTEXT "Button #8",IDC_JOYSTICK_CAPTION7,6,111,40,8 + EDITTEXT IDC_JOYSTICK_PARAM7,50,109,120,14,ES_MULTILINE + DEFPUSHBUTTON "OK",IDOK,35,130,50,14 + DEFPUSHBUTTON "Reset",IDC_JOYSTICK_RESET,90,130,50,14 +END + +IDD_JOYTOKEY DIALOG DISCARDABLE 0, 0, 175, 235 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Joystick To Keyboard" +FONT 9, "MS PGothic" +BEGIN + CONTROL "Enable Joystick To Keyboard",IDC_JOYTOKEY_CHECK0,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,6,164,8 + CONTROL "Cursor Key",IDC_JOYTOKEY_RADIO0,"Button",BS_AUTORADIOBUTTON,6,26,164,7 + CONTROL "NumPad Key (4-Directions)",IDC_JOYTOKEY_RADIO1,"Button",BS_AUTORADIOBUTTON,6,41,164,7 + CONTROL "NumPad Key (8-Directions)",IDC_JOYTOKEY_RADIO2,"Button",BS_AUTORADIOBUTTON,6,56,164,7 + CONTROL "Press NumPad 5 To Release Stick",IDC_JOYTOKEY_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,71,164,8 + LTEXT "Button #1",IDC_JOYSTICK_CAPTION0,6,91,40,8 + EDITTEXT IDC_JOYSTICK_PARAM0,50,89,120,14,ES_MULTILINE + LTEXT "Button #2",IDC_JOYSTICK_CAPTION1,6,106,40,8 + EDITTEXT IDC_JOYSTICK_PARAM1,50,104,120,14,ES_MULTILINE + LTEXT "Button #3",IDC_JOYSTICK_CAPTION2,6,121,40,8 + EDITTEXT IDC_JOYSTICK_PARAM2,50,119,120,14,ES_MULTILINE + LTEXT "Button #4",IDC_JOYSTICK_CAPTION3,6,136,40,8 + EDITTEXT IDC_JOYSTICK_PARAM3,50,134,120,14,ES_MULTILINE + LTEXT "Button #5",IDC_JOYSTICK_CAPTION4,6,151,40,8 + EDITTEXT IDC_JOYSTICK_PARAM4,50,149,120,14,ES_MULTILINE + LTEXT "Button #6",IDC_JOYSTICK_CAPTION5,6,166,40,8 + EDITTEXT IDC_JOYSTICK_PARAM5,50,164,120,14,ES_MULTILINE + LTEXT "Button #7",IDC_JOYSTICK_CAPTION6,6,181,40,8 + EDITTEXT IDC_JOYSTICK_PARAM6,50,179,120,14,ES_MULTILINE + LTEXT "Button #8",IDC_JOYSTICK_CAPTION7,6,196,40,8 + EDITTEXT IDC_JOYSTICK_PARAM7,50,194,120,14,ES_MULTILINE + DEFPUSHBUTTON "OK",IDOK,35,215,50,14 + DEFPUSHBUTTON "Reset",IDC_JOYSTICK_RESET,90,215,50,14 +END #ifndef APSTUDIO_INVOKED diff --git a/source/src/res/mz700.rc b/source/src/res/mz700.rc index aec633d34..b8d60c55a 100644 --- a/source/src/res/mz700.rc +++ b/source/src/res/mz700.rc @@ -147,6 +147,12 @@ BEGIN BEGIN MENUITEM "PCG-700", ID_VM_DIPSWITCH0 END + POPUP "Joystick" + BEGIN + MENUITEM "MZ-1X03" ID_VM_JOYSTICK_TYPE0 + MENUITEM "Tsukumo JOY-700" ID_VM_JOYSTICK_TYPE1 + MENUITEM "AM7J adapter" ID_VM_JOYSTICK_TYPE2 + END POPUP "Sound" BEGIN MENUITEM "Play CMT Noise", ID_VM_SOUND_NOISE_CMT @@ -211,6 +217,12 @@ BEGIN MENUITEM SEPARATOR MENUITEM "Volume", ID_SOUND_VOLUME END + POPUP "Input" + BEGIN + MENUITEM "Joystick #1", ID_INPUT_JOYSTICK0 + MENUITEM "Joystick #2", ID_INPUT_JOYSTICK1 + MENUITEM "Joystick To Keyboard", ID_INPUT_JOYTOKEY + END MENUITEM SEPARATOR MENUITEM "Use Direct2D1", ID_HOST_USE_D2D1 MENUITEM "Use Direct3D9", ID_HOST_USE_D3D9 @@ -257,6 +269,60 @@ BEGIN DEFPUSHBUTTON "Reset",IDC_VOLUME_RESET,130,100,50,14 END +IDD_JOYSTICK DIALOG DISCARDABLE 0, 0, 175, 150 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Joystick #1" +FONT 9, "MS PGothic" +BEGIN + LTEXT "Button #1",IDC_JOYSTICK_CAPTION0,6,6,40,8 + EDITTEXT IDC_JOYSTICK_PARAM0,50,4,120,14,ES_MULTILINE + LTEXT "Button #2",IDC_JOYSTICK_CAPTION1,6,21,40,8 + EDITTEXT IDC_JOYSTICK_PARAM1,50,19,120,14,ES_MULTILINE + LTEXT "Button #3",IDC_JOYSTICK_CAPTION2,6,36,40,8 + EDITTEXT IDC_JOYSTICK_PARAM2,50,34,120,14,ES_MULTILINE + LTEXT "Button #4",IDC_JOYSTICK_CAPTION3,6,51,40,8 + EDITTEXT IDC_JOYSTICK_PARAM3,50,49,120,14,ES_MULTILINE + LTEXT "Button #5",IDC_JOYSTICK_CAPTION4,6,66,40,8 + EDITTEXT IDC_JOYSTICK_PARAM4,50,64,120,14,ES_MULTILINE + LTEXT "Button #6",IDC_JOYSTICK_CAPTION5,6,81,40,8 + EDITTEXT IDC_JOYSTICK_PARAM5,50,79,120,14,ES_MULTILINE + LTEXT "Button #7",IDC_JOYSTICK_CAPTION6,6,96,40,8 + EDITTEXT IDC_JOYSTICK_PARAM6,50,94,120,14,ES_MULTILINE + LTEXT "Button #8",IDC_JOYSTICK_CAPTION7,6,111,40,8 + EDITTEXT IDC_JOYSTICK_PARAM7,50,109,120,14,ES_MULTILINE + DEFPUSHBUTTON "OK",IDOK,35,130,50,14 + DEFPUSHBUTTON "Reset",IDC_JOYSTICK_RESET,90,130,50,14 +END + +IDD_JOYTOKEY DIALOG DISCARDABLE 0, 0, 175, 235 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Joystick To Keyboard" +FONT 9, "MS PGothic" +BEGIN + CONTROL "Enable Joystick To Keyboard",IDC_JOYTOKEY_CHECK0,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,6,164,8 + CONTROL "Cursor Key",IDC_JOYTOKEY_RADIO0,"Button",BS_AUTORADIOBUTTON,6,26,164,7 + CONTROL "NumPad Key (4-Directions)",IDC_JOYTOKEY_RADIO1,"Button",BS_AUTORADIOBUTTON,6,41,164,7 + CONTROL "NumPad Key (8-Directions)",IDC_JOYTOKEY_RADIO2,"Button",BS_AUTORADIOBUTTON,6,56,164,7 + CONTROL "Press NumPad 5 To Release Stick",IDC_JOYTOKEY_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,71,164,8 + LTEXT "Button #1",IDC_JOYSTICK_CAPTION0,6,91,40,8 + EDITTEXT IDC_JOYSTICK_PARAM0,50,89,120,14,ES_MULTILINE + LTEXT "Button #2",IDC_JOYSTICK_CAPTION1,6,106,40,8 + EDITTEXT IDC_JOYSTICK_PARAM1,50,104,120,14,ES_MULTILINE + LTEXT "Button #3",IDC_JOYSTICK_CAPTION2,6,121,40,8 + EDITTEXT IDC_JOYSTICK_PARAM2,50,119,120,14,ES_MULTILINE + LTEXT "Button #4",IDC_JOYSTICK_CAPTION3,6,136,40,8 + EDITTEXT IDC_JOYSTICK_PARAM3,50,134,120,14,ES_MULTILINE + LTEXT "Button #5",IDC_JOYSTICK_CAPTION4,6,151,40,8 + EDITTEXT IDC_JOYSTICK_PARAM4,50,149,120,14,ES_MULTILINE + LTEXT "Button #6",IDC_JOYSTICK_CAPTION5,6,166,40,8 + EDITTEXT IDC_JOYSTICK_PARAM5,50,164,120,14,ES_MULTILINE + LTEXT "Button #7",IDC_JOYSTICK_CAPTION6,6,181,40,8 + EDITTEXT IDC_JOYSTICK_PARAM6,50,179,120,14,ES_MULTILINE + LTEXT "Button #8",IDC_JOYSTICK_CAPTION7,6,196,40,8 + EDITTEXT IDC_JOYSTICK_PARAM7,50,194,120,14,ES_MULTILINE + DEFPUSHBUTTON "OK",IDOK,35,215,50,14 + DEFPUSHBUTTON "Reset",IDC_JOYSTICK_RESET,90,215,50,14 +END #ifndef APSTUDIO_INVOKED diff --git a/source/src/vm/bx1/CMakeLists.txt b/source/src/vm/bx1/CMakeLists.txt index 030cafabb..94665a505 100644 --- a/source/src/vm/bx1/CMakeLists.txt +++ b/source/src/vm/bx1/CMakeLists.txt @@ -1,10 +1,11 @@ cmake_minimum_required (VERSION 2.6) -message("* vm/emubx1") +message("* vm/${EXE_NAME}") -add_library(vm_emubx1 +add_library(vm_${EXE_NAME} bx1.cpp display.cpp + floppy.cpp keyboard.cpp printer.cpp ) diff --git a/source/src/vm/bx1/bx1.cpp b/source/src/vm/bx1/bx1.cpp index 6fea276e6..7ece82675 100644 --- a/source/src/vm/bx1/bx1.cpp +++ b/source/src/vm/bx1/bx1.cpp @@ -25,10 +25,12 @@ #endif #include "display.h" +#include "floppy.h" #include "keyboard.h" #include "printer.h" using BX1::DISPLAY; +using BX1::FLOPPY; using BX1::KEYBOARD; using BX1::PRINTER; @@ -53,6 +55,7 @@ VM::VM(EMU_TEMPLATE* parent_emu) : VM_TEMPLATE(parent_emu) dma = new MC6844(this, emu); // HD46504 display = new DISPLAY(this, emu); + floppy = new FLOPPY(this, emu); keyboard = new KEYBOARD(this, emu); printer = new PRINTER(this, emu); @@ -62,13 +65,13 @@ VM::VM(EMU_TEMPLATE* parent_emu) : VM_TEMPLATE(parent_emu) event->set_context_sound(fdc->get_context_noise_head_down()); event->set_context_sound(fdc->get_context_noise_head_up()); -// fdc->set_context_irq(cpu, SIG_CPU_IRQ, 1); fdc->set_context_drq(dma, SIG_MC6844_TX_RQ_0, 1); dma->set_context_memory(memory); dma->set_context_ch0(fdc); dma->set_context_ch1(display); display->set_context_dma(dma); + floppy->set_context_fdc(fdc); printer->set_context_ram(ram); // cpu bus @@ -77,7 +80,8 @@ VM::VM(EMU_TEMPLATE* parent_emu) : VM_TEMPLATE(parent_emu) DEBUGGER *debugger = new DEBUGGER(this, emu); cpu->set_context_debugger(debugger); -// debugger->add_symbol(0x015c, _T("VRAM_TOP")); + debugger->add_symbol(0x015c, _T("VRAM_TOP")); + debugger->add_symbol(0xe121, _T("KEY_DOWN")); debugger->add_symbol(0xe122, _T("KEY_UP")); debugger->add_symbol(0xe140, _T("DMA[0].ADDR_HI")); @@ -111,25 +115,44 @@ VM::VM(EMU_TEMPLATE* parent_emu) : VM_TEMPLATE(parent_emu) debugger->add_symbol(0xe185, _T("FDC.GEN_COUNT")); debugger->add_symbol(0xe186, _T("FDC.CRC_CTRL")); debugger->add_symbol(0xe187, _T("FDC.LOGIC_TRACK")); + debugger->add_symbol(0xe18a, _T("FDD.MOTOR_ON")); // ??? #endif // memory bus memset(ram, 0x00, sizeof(ram)); + memset(cart_5000, 0xff, sizeof(cart_5000)); + memset(cart_6000, 0xff, sizeof(cart_6000)); + memset(cart_7000, 0xff, sizeof(cart_7000)); + memset(cart_8000, 0xff, sizeof(cart_8000)); memset(bios_9000, 0xff, sizeof(bios_9000)); memset(bios_f000, 0xff, sizeof(bios_f000)); + memory->read_bios(_T("CART_5000.ROM"), cart_5000, sizeof(cart_5000)); + memory->read_bios(_T("CART_6000.ROM"), cart_6000, sizeof(cart_6000)); + memory->read_bios(_T("CART_7000.ROM"), cart_7000, sizeof(cart_7000)); + memory->read_bios(_T("CART_8000.ROM"), cart_8000, sizeof(cart_8000)); memory->read_bios(_T("BIOS_9000.ROM"), bios_9000, sizeof(bios_9000)); memory->read_bios(_T("BIOS_F000.ROM"), bios_f000, sizeof(bios_f000)); - memory->set_memory_rw(0x0000, 0x3fff, ram); +#if defined(_AX1) + memory->set_memory_rw(0x0000, 0x07ff, ram + 0x0000); +#elif defined(_BX1) + memory->set_memory_rw(0x0000, 0x03ff, ram + 0x0000); +#endif + memory->set_memory_rw(0x1000, 0x4fff, ram + 0x1000); + memory->set_memory_r(0x5000, 0x5fff, cart_5000); + memory->set_memory_r(0x6000, 0x6fff, cart_6000); + memory->set_memory_r(0x7000, 0x7fff, cart_7000); + memory->set_memory_r(0x8000, 0x8fff, cart_8000); memory->set_memory_r(0x9000, 0xdfff, bios_9000); memory->set_memory_mapped_io_rw(0xe000, 0xefff, io); memory->set_memory_r(0xf000, 0xffff, bios_f000); // io bus - io->set_iomap_range_rw(0xe121, 0xe122, keyboard); + io->set_iomap_range_r (0xe121, 0xe122, keyboard); io->set_iomap_range_rw(0xe140, 0xe156, dma); io->set_iomap_range_rw(0xe180, 0xe187, fdc); + io->set_iomap_range_rw(0xe188, 0xe18f, floppy); io->set_iomap_range_rw(0xe210, 0xe212, printer); // ????? //! @note Not remove below comment. 20210511 K.O @@ -305,14 +328,11 @@ void VM::key_down(int code, bool repeat) { if(!repeat) { keyboard->key_down(code); -// printer->key_down(code); } } void VM::key_up(int code) { - keyboard->key_up(code); -// printer->key_up(code); } // ---------------------------------------------------------------------------- @@ -322,6 +342,30 @@ void VM::key_up(int code) void VM::open_floppy_disk(int drv, const _TCHAR* file_path, int bank) { fdc->open_disk(drv, file_path, bank); + + // unformatted disk image is inserted + if(fdc->is_disk_inserted(drv)) { + DISK *disk = fdc->get_disk_handler(drv); + bool formatted = false; + + for(int trk = 0; trk < 35; trk++) { + if(disk->get_track(trk, 0)) { + formatted = true; + break; + } + } + if(!formatted) { + // format disk image + for(int trk = 0; trk < 35; trk++) { + disk->format_track(trk, 0); + disk->track_mfm = false; + + for(int sec = 1; sec <= 16; sec++) { + disk->insert_sector(trk, 0, sec, 0, false, false, 0x00, 128); + } + } + } + } } void VM::close_floppy_disk(int drv) @@ -361,7 +405,7 @@ void VM::update_config() } } -#define STATE_VERSION 1 +#define STATE_VERSION 2 bool VM::process_state(FILEIO* state_fio, bool loading) { diff --git a/source/src/vm/bx1/bx1.h b/source/src/vm/bx1/bx1.h index 9542d2201..b2a4248c0 100644 --- a/source/src/vm/bx1/bx1.h +++ b/source/src/vm/bx1/bx1.h @@ -8,8 +8,13 @@ #ifndef _BX1_H_ #define _BX1_H_ +#if defined(_AX1) +#define DEVICE_NAME "CANON AX-1" +#define CONFIG_NAME "ax1" +#elif defined(_BX1) #define DEVICE_NAME "CANON BX-1" #define CONFIG_NAME "bx1" +#endif // device informations for virtual machine #define FRAMES_PER_SEC 30 @@ -19,11 +24,12 @@ #define SCREEN_HEIGHT (7 * 5) #define MAX_DRIVE 1 #define MEMORY_ADDR_MAX 0x10000 -#define MEMORY_BANK_SIZE 0x1000 +#define MEMORY_BANK_SIZE 0x400 #define IO_ADDR_MAX 0x10000 #define HAS_MC6800 // device informations for win32 +#define USE_DIPSWITCH #define USE_FLOPPY_DISK 1 #define USE_NUMPAD_ENTER #define USE_AUTO_KEY 6 @@ -31,6 +37,8 @@ #define USE_AUTO_KEY_CAPS #define DONT_KEEEP_KEY_PRESSED #define USE_SOUND_VOLUME 2 +#define USE_PRINTER +#define USE_PRINTER_TYPE 4 #define USE_DEBUGGER #define USE_STATE @@ -56,6 +64,7 @@ class MC6844; namespace BX1 { class DISPLAY; + class FLOPPY; class KEYBOARD; class PRINTER; } @@ -74,12 +83,17 @@ protected: MC6844* dma; BX1::DISPLAY* display; + BX1::FLOPPY* floppy; BX1::KEYBOARD* keyboard; BX1::PRINTER* printer; - uint8_t bios_9000[0x5000]; // 9000h-DFFFh - uint8_t bios_f000[0x1000]; // F000h-FFFFh - uint8_t ram[0x4000]; + uint8_t cart_5000[0x1000]; // 5000h-5FFFh + uint8_t cart_6000[0x1000]; // 6000h-6FFFh + uint8_t cart_7000[0x1000]; // 7000h-7FFFh + uint8_t cart_8000[0x1000]; // 8000h-8FFFh + uint8_t bios_9000[0x5000]; // 9000h-DFFFh (Integrated) + uint8_t bios_f000[0x1000]; // F000h-FFFFh (Integrated) + uint8_t ram[0x5000]; public: // ---------------------------------------- diff --git a/source/src/vm/bx1/display.cpp b/source/src/vm/bx1/display.cpp index 9e44a6af0..f151c2c0a 100644 --- a/source/src/vm/bx1/display.cpp +++ b/source/src/vm/bx1/display.cpp @@ -18,7 +18,7 @@ static const BYTE font[0x80][7] = { {0x04, 0x0F, 0x14, 0x0E, 0x05, 0x1E, 0x04}, {0x19, 0x1A, 0x02, 0x04, 0x08, 0x0B, 0x13}, {0x0C, 0x12, 0x14, 0x08, 0x15, 0x12, 0x0D}, {0x0C, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00}, {0x02, 0x04, 0x08, 0x08, 0x08, 0x04, 0x02}, {0x08, 0x04, 0x02, 0x02, 0x02, 0x04, 0x08}, - {0x04, 0x15, 0x0E, 0x04, 0x0E, 0x15, 0x04}, {0x04, 0x04, 0x04, 0x1F, 0x04, 0x04, 0x04}, + {0x04, 0x15, 0x0E, 0x04, 0x0E, 0x15, 0x04}, {0x00, 0x04, 0x04, 0x1F, 0x04, 0x04, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x0C, 0x04, 0x08}, {0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C}, {0x01, 0x02, 0x02, 0x04, 0x08, 0x08, 0x10}, @@ -65,29 +65,45 @@ static const BYTE font[0x80][7] = { {0x00, 0x00, 0x11, 0x0A, 0x04, 0x0A, 0x11}, {0x00, 0x00, 0x11, 0x11, 0x0F, 0x01, 0x0E}, {0x00, 0x00, 0x1F, 0x02, 0x04, 0x08, 0x1F}, {0x03, 0x04, 0x04, 0x18, 0x04, 0x04, 0x03}, {0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04}, {0x18, 0x04, 0x04, 0x03, 0x04, 0x04, 0x18}, - {0x09, 0x15, 0x12, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, {0x04, 0x0E, 0x0E, 0x04, 0x04, 0x00, 0x04}, - {0x1B, 0x09, 0x12, 0x00, 0x00, 0x00, 0x00}, {0x0A, 0x0A, 0x1F, 0x0A, 0x1F, 0x0A, 0x0A}, - {0x04, 0x0F, 0x14, 0x0E, 0x05, 0x1E, 0x04}, {0x19, 0x1A, 0x02, 0x04, 0x08, 0x0B, 0x13}, - {0x0C, 0x12, 0x14, 0x08, 0x15, 0x12, 0x0D}, {0x0C, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00}, - {0x02, 0x04, 0x08, 0x08, 0x08, 0x04, 0x02}, {0x08, 0x04, 0x02, 0x02, 0x02, 0x04, 0x08}, - {0x04, 0x15, 0x0E, 0x04, 0x0E, 0x15, 0x04}, {0x04, 0x04, 0x04, 0x1F, 0x04, 0x04, 0x04}, - {0x00, 0x00, 0x00, 0x00, 0x0C, 0x04, 0x08}, {0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00}, - {0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C}, {0x01, 0x02, 0x02, 0x04, 0x08, 0x08, 0x10}, - - {0x0E, 0x11, 0x13, 0x15, 0x19, 0x11, 0x0E}, {0x04, 0x0C, 0x04, 0x04, 0x04, 0x04, 0x0E}, - {0x0E, 0x11, 0x01, 0x02, 0x04, 0x08, 0x1F}, {0x0E, 0x11, 0x01, 0x0E, 0x01, 0x11, 0x0E}, - {0x02, 0x06, 0x0A, 0x12, 0x1F, 0x02, 0x02}, {0x1F, 0x10, 0x10, 0x1E, 0x01, 0x11, 0x0E}, - {0x06, 0x08, 0x10, 0x1E, 0x11, 0x11, 0x0E}, {0x1F, 0x11, 0x11, 0x02, 0x02, 0x04, 0x04}, - {0x0E, 0x11, 0x11, 0x0E, 0x11, 0x11, 0x0E}, {0x0E, 0x11, 0x11, 0x0F, 0x01, 0x11, 0x0E}, - {0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00}, {0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x04, 0x08}, - {0x01, 0x02, 0x04, 0x08, 0x04, 0x02, 0x01}, {0x00, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x00}, - {0x10, 0x08, 0x04, 0x02, 0x04, 0x08, 0x10}, {0x0E, 0x11, 0x01, 0x02, 0x04, 0x00, 0x04}, + {0x09, 0x15, 0x12, 0x00, 0x00, 0x00, 0x00}, {0x15, 0x0A, 0x15, 0x0A, 0x15, 0x0A, 0x15}, + + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x04, 0x0E, 0x15, 0x04, 0x04, 0x00}, + {0x00, 0x04, 0x04, 0x15, 0x0E, 0x04, 0x00}, {0x00, 0x04, 0x02, 0x1F, 0x02, 0x04, 0x00}, + {0x00, 0x04, 0x08, 0x1F, 0x08, 0x04, 0x00}, {0x00, 0x04, 0x1F, 0x04, 0x1F, 0x04, 0x00}, + {0x01, 0x06, 0x18, 0x06, 0x01, 0x00, 0x1F}, {0x10, 0x0C, 0x03, 0x0C, 0x10, 0x00, 0x1F}, + {0x00, 0x11, 0x0A, 0x04, 0x0A, 0x11, 0x00}, {0x00, 0x04, 0x00, 0x1F, 0x00, 0x04, 0x00}, + {0x07, 0x04, 0x04, 0x04, 0x14, 0x14, 0x0C}, {0x0A, 0x04, 0x0A, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x1F, 0x0A, 0x0A, 0x13, 0x00}, {0x1F, 0x11, 0x08, 0x04, 0x08, 0x11, 0x1F}, + {0x04, 0x04, 0x04, 0x07, 0x00, 0x00, 0x00}, {0x15, 0x0A, 0x15, 0x0A, 0x15, 0x0A, 0x15}, + + {0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x0E, 0x0A, 0x0E, 0x00, 0x00}, + {0x00, 0x00, 0x0A, 0x04, 0x0A, 0x00, 0x00}, {0x00, 0x00, 0x04, 0x0E, 0x04, 0x00, 0x00}, + {0x00, 0x00, 0x04, 0x0A, 0x04, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00}, + {0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04}, {0x00, 0x00, 0x00, 0x07, 0x04, 0x04, 0x04}, + {0x00, 0x00, 0x00, 0x1C, 0x04, 0x04, 0x04}, {0x04, 0x04, 0x04, 0x1C, 0x00, 0x00, 0x00}, + {0x0A, 0x15, 0x0A, 0x15, 0x0A, 0x15, 0x0A}, {0x00, 0x01, 0x03, 0x05, 0x09, 0x1F, 0x00}, + {0x0E, 0x0A, 0x0E, 0x00, 0x00, 0x00, 0x00}, {0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x05, 0x08, 0x08, 0x1E, 0x08, 0x10, 0x1F}, {0x00, 0x00, 0x15, 0x0A, 0x15, 0x0A, 0x15}, }; void DISPLAY::initialize() { +#if 0 + // test font pattern + for(int i = 0; i < 0x80; i++) { + for(int j = 0; j < 7; j++) { + this->out_debug_log(create_string(_T("%02X:%d\t%c%c%c%c%c\n"), + i, j, + font[i][j] & 0x10 ? _T('#') : _T(' '), + font[i][j] & 0x08 ? _T('#') : _T(' '), + font[i][j] & 0x04 ? _T('#') : _T(' '), + font[i][j] & 0x02 ? _T('#') : _T(' '), + font[i][j] & 0x01 ? _T('#') : _T(' ') + )); + } + this->out_debug_log(_T("\n")); + } +#endif // register event register_frame_event(this); diff --git a/source/src/vm/bx1/floppy.cpp b/source/src/vm/bx1/floppy.cpp new file mode 100644 index 000000000..803a1d731 --- /dev/null +++ b/source/src/vm/bx1/floppy.cpp @@ -0,0 +1,57 @@ +/* + CANON BX-1 Emulator 'eBX-1' + + Author : Takeda.Toshiya + Date : 2021.02.14- + + [ floppy ] +*/ + +#include "floppy.h" +#include "../mc6843.h" + +namespace BX1 { +uint32_t FLOPPY::read_io8(uint32_t addr) +{ + uint32_t value = 0xff; + + switch(addr & 0xffff) { + case 0xe189: + value = d_fdc->is_disk_inserted(0) && d_fdc->is_disk_protected(0) ? 1 : 0; + value |= d_fdc->is_disk_inserted(1) && d_fdc->is_disk_protected(1) ? 2 : 0; + break; + default: + break; + } + return value; +} + +void FLOPPY::write_io8(uint32_t addr, uint32_t data) +{ + switch(addr & 0xffff) { + case 0xe18a: + // drive reg + switch(data & 0x0f) { + case 0x01: + d_fdc->write_signal(SIG_MC6843_DRIVEREG, 0, 3); + break; + case 0x02: + d_fdc->write_signal(SIG_MC6843_DRIVEREG, 1, 3); + break; + case 0x04: + d_fdc->write_signal(SIG_MC6843_DRIVEREG, 2, 3); + break; + case 0x08: +// d_fdc->write_signal(SIG_MC6843_DRIVEREG, 3, 3); + break; + } + break; + case 0xe18c: + // ??? only clear + break; + default: + break; + } +} + +} diff --git a/source/src/vm/bx1/floppy.h b/source/src/vm/bx1/floppy.h new file mode 100644 index 000000000..5813710da --- /dev/null +++ b/source/src/vm/bx1/floppy.h @@ -0,0 +1,45 @@ +/* + CANON BX-1 Emulator 'eBX-1' + + Author : Takeda.Toshiya + Date : 2021.02.14- + + [ floppy ] +*/ + +#ifndef _FLOPPY_H_ +#define _FLOPPY_H_ + +#include "../vm.h" +#include "../../emu_template.h" +#include "../device.h" + +class MC6843; + +namespace BX1 { +class FLOPPY : public DEVICE +{ +private: + MC6843* d_fdc; + +public: + FLOPPY(VM_TEMPLATE* parent_vm, EMU_TEMPLATE* parent_emu) : DEVICE(parent_vm, parent_emu) + { + set_device_name(_T("Floppy I/F")); + } + ~FLOPPY() {} + + // common functions + virtual void __FASTCALL write_io8(uint32_t addr, uint32_t data); + virtual uint32_t __FASTCALL read_io8(uint32_t addr); + + // unique function + void set_context_fdc(MC6843* device) + { + d_fdc = device; + } +}; +} + +#endif + diff --git a/source/src/vm/bx1/keyboard.cpp b/source/src/vm/bx1/keyboard.cpp index 0f72a055a..a1a180b33 100644 --- a/source/src/vm/bx1/keyboard.cpp +++ b/source/src/vm/bx1/keyboard.cpp @@ -12,287 +12,279 @@ namespace BX1 { -static const int table[256][2] = { - { -1, -1}, // 00 - { -1, -1}, // 01 - { -1, -1}, // 02 - { -1, -1}, // 03 - { -1, -1}, // 04 - { -1, -1}, // 05 - { -1, -1}, // 06 - { -1, -1}, // 07 - { -1, -1}, // 08 Back - {0x13, 0x13}, // 09 Tab INST - { -1, -1}, // 0A - { -1, -1}, // 0B - { -1, -1}, // 0C - {0x42, 0x42}, // 0D Enter CR/LF - { -1, -1}, // 0E - { -1, -1}, // 0F - { -1, -1}, // 10 Shift - { -1, -1}, // 11 Ctrl - { -1, -1}, // 12 Alt - { -1, -1}, // 13 Pause - {0x12, 0x12}, // 14 Caps CTRL - { -1, -1}, // 15 Kana - { -1, -1}, // 16 - { -1, -1}, // 17 - { -1, -1}, // 18 - { -1, -1}, // 19 Kanji - { -1, -1}, // 1A - {0x4F, 0x4F}, // 1B Escape CLEAR - { -1, -1}, // 1C Convert - { -1, -1}, // 1D NonConv - { -1, -1}, // 1E - { -1, -1}, // 1F - {0x41, 0x41}, // 20 Space SPACE - {0x49, 0x49}, // 21 PgUp SQR - {0x4A, 0x4A}, // 22 PgDwn ) - {0x46, 0x46}, // 23 End ( - {0x45, 0x45}, // 24 Home alpha^x - {0x63, 0x63}, // 25 Left - {0x62, 0x62}, // 26 Up - {0x65, 0x65}, // 27 Right - {0x64, 0x64}, // 28 Down - { -1, -1}, // 29 - { -1, -1}, // 2A - { -1, -1}, // 2B - { -1, -1}, // 2C - {0x60, 0x60}, // 2D Ins INSERT - {0x61, 0x61}, // 2E Del DELETE - { -1, -1}, // 2F - {0x3B, 0x3B}, // 30 0 - {0x17, 0x17}, // 31 1 - {0x1B, 0x1B}, // 32 2 - {0x1F, 0x1F}, // 33 3 - {0x23, 0x23}, // 34 4 - {0x27, 0x27}, // 35 5 - {0x2B, 0x2B}, // 36 6 - {0x2F, 0x2F}, // 37 7 - {0x33, 0x33}, // 38 8 - {0x37, 0x37}, // 39 9 - { -1, -1}, // 3A - { -1, -1}, // 3B - { -1, -1}, // 3C - { -1, -1}, // 3D - { -1, -1}, // 3E - { -1, -1}, // 3F - { -1, -1}, // 40 - {0x15, 0x15}, // 41 A - {0x24, 0x24}, // 42 B - {0x1C, 0x1C}, // 43 C - {0x1D, 0x1D}, // 44 D - {0x1E, 0x1E}, // 45 E - {0x21, 0x21}, // 46 F - {0x25, 0x25}, // 47 G - {0x29, 0x29}, // 48 H - {0x32, 0x32}, // 49 I - {0x2D, 0x2D}, // 4A J - {0x31, 0x31}, // 4B K - {0x35, 0x35}, // 4C L - {0x2C, 0x2C}, // 4D M - {0x28, 0x28}, // 4E N - {0x36, 0x36}, // 4F O - {0x3A, 0x3A}, // 50 P - {0x16, 0x16}, // 51 Q - {0x22, 0x22}, // 52 R - {0x19, 0x19}, // 53 S - {0x26, 0x26}, // 54 T - {0x2E, 0x2E}, // 55 U - {0x20, 0x20}, // 56 V - {0x1A, 0x1A}, // 57 W - {0x18, 0x18}, // 58 X - {0x2A, 0x2A}, // 59 Y - {0x14, 0x14}, // 5A Z - { -1, -1}, // 5B - { -1, -1}, // 5C - { -1, -1}, // 5D - { -1, -1}, // 5E - { -1, -1}, // 5F - {0x0D, 0x0D}, // 60 NUM 0 - {0x01, 0x01}, // 61 NUM 1 - {0x02, 0x02}, // 62 NUM 2 - {0x03, 0x03}, // 63 NUM 3 - {0x04, 0x04}, // 64 NUM 4 - {0x05, 0x05}, // 65 NUM 5 - {0x06, 0x06}, // 66 NUM 6 - {0x07, 0x07}, // 67 NUM 7 - {0x08, 0x08}, // 68 NUM 8 - {0x09, 0x09}, // 69 NUM 9 - {0x47, 0x47}, // 6A NUM * - {0x48, 0x48}, // 6B NUM + - {0x4D, 0x4D}, // 6C NUM Ent = - {0x4C, 0x4C}, // 6D NUM - - {0x0E, 0x0E}, // 6E NUM . - {0x4B, 0x4B}, // 6F NUM / - {0x51, 0x50}, // 70 F1 RUN PROGRAM - {0x53, 0x52}, // 71 F2 RENAME NEW - {0x55, 0x54}, // 72 F3 PROTECT SECURE - {0x57, 0x56}, // 73 F4 PROG-LIST OPERATE - {0x59, 0x58}, // 74 F5 STOP TRACE - {0x5B, 0x5A}, // 75 F6 CONDENSE DISK-LIST - {0x5D, 0x5C}, // 76 F7 LINE-NO. RECALL - {0x5F, 0x5E}, // 77 F8 PROG.SELECT AUTO PRINT - {0x0A, 0x0A}, // 78 F9 EXP - {0x0B, 0x0B}, // 79 F10 SIGN CHG - {0x0C, 0x0C}, // 7A F11 CE - {0x0F, 0x0F}, // 7B F12 START ? - { -1, -1}, // 7C - { -1, -1}, // 7D - { -1, -1}, // 7E - { -1, -1}, // 7F - { -1, -1}, // 80 - { -1, -1}, // 81 - { -1, -1}, // 82 - { -1, -1}, // 83 - { -1, -1}, // 84 - { -1, -1}, // 85 - { -1, -1}, // 86 - { -1, -1}, // 87 - { -1, -1}, // 88 - { -1, -1}, // 89 - { -1, -1}, // 8A - { -1, -1}, // 8B - { -1, -1}, // 8C - { -1, -1}, // 8D - { -1, -1}, // 8E - { -1, -1}, // 8F - { -1, -1}, // 90 - {0x66, 0x66}, // 91 ScrLk PAPER FEED - { -1, -1}, // 92 - { -1, -1}, // 93 - { -1, -1}, // 94 - { -1, -1}, // 95 - { -1, -1}, // 96 - { -1, -1}, // 97 - { -1, -1}, // 98 - { -1, -1}, // 99 - { -1, -1}, // 9A - { -1, -1}, // 9B - { -1, -1}, // 9C - { -1, -1}, // 9D - { -1, -1}, // 9E - { -1, -1}, // 9F - {0x11, 0x11}, // A0 L Shift SML - { -1, -1}, // A1 R Shift (Switch F1-F8) - {0x10, 0x10}, // A2 L Ctrl CAP - {0x3C, 0x3C}, // A3 R Ctrl UC - { -1, -1}, // A4 L Alt - { -1, -1}, // A5 R Alt - { -1, -1}, // A6 - { -1, -1}, // A7 - { -1, -1}, // A8 - { -1, -1}, // A9 - { -1, -1}, // AA - { -1, -1}, // AB - { -1, -1}, // AC - { -1, -1}, // AD - { -1, -1}, // AE - { -1, -1}, // AF - { -1, -1}, // B0 - { -1, -1}, // B1 - { -1, -1}, // B2 - { -1, -1}, // B3 - { -1, -1}, // B4 - { -1, -1}, // B5 - { -1, -1}, // B6 - { -1, -1}, // B7 - { -1, -1}, // B8 - { -1, -1}, // B9 - {0x3D, 0x3D}, // BA : - {0x39, 0x39}, // BB ; - {0x30, 0x30}, // BC , - {0x3F, 0x3F}, // BD - - {0x34, 0x34}, // BE . - {0x38, 0x38}, // BF / - {0x3E, 0x3E}, // C0 @ - { -1, -1}, // C1 - { -1, -1}, // C2 - { -1, -1}, // C3 - { -1, -1}, // C4 - { -1, -1}, // C5 - { -1, -1}, // C6 - { -1, -1}, // C7 - { -1, -1}, // C8 - { -1, -1}, // C9 - { -1, -1}, // CA - { -1, -1}, // CB - { -1, -1}, // CC - { -1, -1}, // CD - { -1, -1}, // CE - { -1, -1}, // CF - { -1, -1}, // D0 - { -1, -1}, // D1 - { -1, -1}, // D2 - { -1, -1}, // D3 - { -1, -1}, // D4 - { -1, -1}, // D5 - { -1, -1}, // D6 - { -1, -1}, // D7 - { -1, -1}, // D8 - { -1, -1}, // D9 - { -1, -1}, // DA - {0x46, 0x46}, // DB [ - {0x44, 0x44}, // DC Yen - {0x4A, 0x4A}, // DD ] - {0x43, 0x43}, // DE ^ - { -1, -1}, // DF - { -1, -1}, // E0 - { -1, -1}, // E1 - { -1, -1}, // E2 _ - { -1, -1}, // E3 - { -1, -1}, // E4 - { -1, -1}, // E5 - { -1, -1}, // E6 - { -1, -1}, // E7 - { -1, -1}, // E8 - { -1, -1}, // E9 - { -1, -1}, // EA - { -1, -1}, // EB - { -1, -1}, // EC - { -1, -1}, // ED - { -1, -1}, // EE - { -1, -1}, // EF - { -1, -1}, // F0 - { -1, -1}, // F1 - { -1, -1}, // F2 - { -1, -1}, // F3 - { -1, -1}, // F4 - { -1, -1}, // F5 - { -1, -1}, // F6 - { -1, -1}, // F7 - { -1, -1}, // F8 - { -1, -1}, // F9 - { -1, -1}, // FA - { -1, -1}, // FB - { -1, -1}, // FC - { -1, -1}, // FD - { -1, -1}, // FE - { -1, -1}, // FF +static const int table[256] = { + -1, // 00 + -1, // 01 + -1, // 02 + -1, // 03 + -1, // 04 + -1, // 05 + -1, // 06 + -1, // 07 + -1, // 08 Back + 0x13, // 09 Tab INST + -1, // 0A + -1, // 0B + -1, // 0C + 0x42, // 0D Enter CR/LF + -1, // 0E + -1, // 0F + -1, // 10 Shift + -1, // 11 Ctrl + -1, // 12 Alt + -1, // 13 Pause + 0x12, // 14 Caps CTRL + -1, // 15 Kana + -1, // 16 + -1, // 17 + -1, // 18 + -1, // 19 Kanji + -1, // 1A + 0x4F, // 1B Escape CLEAR + -1, // 1C Convert + -1, // 1D NonConv + -1, // 1E + -1, // 1F + 0x41, // 20 Space SPACE + 0x49, // 21 PgUp SQR + 0x4A, // 22 PgDwn ) + 0x46, // 23 End ( + 0x45, // 24 Home alpha^x + 0x63, // 25 Left + 0x62, // 26 Up + 0x65, // 27 Right + 0x64, // 28 Down + -1, // 29 + -1, // 2A + -1, // 2B + -1, // 2C + 0x60, // 2D Ins INSERT + 0x61, // 2E Del DELETE + -1, // 2F + 0x3B, // 30 0 + 0x17, // 31 1 + 0x1B, // 32 2 + 0x1F, // 33 3 + 0x23, // 34 4 + 0x27, // 35 5 + 0x2B, // 36 6 + 0x2F, // 37 7 + 0x33, // 38 8 + 0x37, // 39 9 + -1, // 3A + -1, // 3B + -1, // 3C + -1, // 3D + -1, // 3E + -1, // 3F + -1, // 40 + 0x15, // 41 A + 0x24, // 42 B + 0x1C, // 43 C + 0x1D, // 44 D + 0x1E, // 45 E + 0x21, // 46 F + 0x25, // 47 G + 0x29, // 48 H + 0x32, // 49 I + 0x2D, // 4A J + 0x31, // 4B K + 0x35, // 4C L + 0x2C, // 4D M + 0x28, // 4E N + 0x36, // 4F O + 0x3A, // 50 P + 0x16, // 51 Q + 0x22, // 52 R + 0x19, // 53 S + 0x26, // 54 T + 0x2E, // 55 U + 0x20, // 56 V + 0x1A, // 57 W + 0x18, // 58 X + 0x2A, // 59 Y + 0x14, // 5A Z + -1, // 5B + -1, // 5C + -1, // 5D + -1, // 5E + -1, // 5F + 0x0D, // 60 NUM 0 + 0x01, // 61 NUM 1 + 0x02, // 62 NUM 2 + 0x03, // 63 NUM 3 + 0x04, // 64 NUM 4 + 0x05, // 65 NUM 5 + 0x06, // 66 NUM 6 + 0x07, // 67 NUM 7 + 0x08, // 68 NUM 8 + 0x09, // 69 NUM 9 + 0x47, // 6A NUM * + 0x48, // 6B NUM + + 0x4D, // 6C NUM Ent = + 0x4C, // 6D NUM - + 0x0E, // 6E NUM . + 0x4B, // 6F NUM / + 0x51, // 70 F1 RUN + 0x53, // 71 F2 RENAME + 0x55, // 72 F3 PROTECT + 0x57, // 73 F4 PROG-LIST + 0x59, // 74 F5 STOP + 0x5B, // 75 F6 CONDENSE + 0x5D, // 76 F7 LINE-NO. + -1, // 77 F8 + 0x0A, // 78 F9 EXP + 0x0B, // 79 F10 SIGN CHG + 0x0C, // 7A F11 CE + 0x0F, // 7B F12 START ? + 0x50, // 7C F13 PROGRAM + 0x52, // 7D F14 NEW + 0x54, // 7E F15 SECURE + 0x56, // 7F F16 OPERATE + 0x58, // 80 F17 TRACE + 0x5A, // 81 F18 DISK-LIST + 0x5C, // 82 F19 RECALL + -1, // 83 F20 + -1, // 84 F21 + -1, // 85 F22 + -1, // 86 F23 + -1, // 87 F24 + -1, // 88 + -1, // 89 + -1, // 8A + -1, // 8B + -1, // 8C + -1, // 8D + -1, // 8E + -1, // 8F + -1, // 90 + 0x4E, // 91 ScrLk PAPER FEED + -1, // 92 + -1, // 93 + -1, // 94 + -1, // 95 + -1, // 96 + -1, // 97 + -1, // 98 + -1, // 99 + -1, // 9A + -1, // 9B + -1, // 9C + -1, // 9D + -1, // 9E + -1, // 9F + 0x11, // A0 L Shift SML + -1, // A1 R Shift (Switch F1-F8) + 0x10, // A2 L Ctrl CAP + 0x3C, // A3 R Ctrl UC + -1, // A4 L Alt + -1, // A5 R Alt + -1, // A6 + -1, // A7 + -1, // A8 + -1, // A9 + -1, // AA + -1, // AB + -1, // AC + -1, // AD + -1, // AE + -1, // AF + -1, // B0 + -1, // B1 + -1, // B2 + -1, // B3 + -1, // B4 + -1, // B5 + -1, // B6 + -1, // B7 + -1, // B8 + -1, // B9 + 0x3D, // BA : + 0x39, // BB ; + 0x30, // BC , + 0x3F, // BD - + 0x34, // BE . + 0x38, // BF / + 0x3E, // C0 @ + -1, // C1 + -1, // C2 + -1, // C3 + -1, // C4 + -1, // C5 + -1, // C6 + -1, // C7 + -1, // C8 + -1, // C9 + -1, // CA + -1, // CB + -1, // CC + -1, // CD + -1, // CE + -1, // CF + -1, // D0 + -1, // D1 + -1, // D2 + -1, // D3 + -1, // D4 + -1, // D5 + -1, // D6 + -1, // D7 + -1, // D8 + -1, // D9 + -1, // DA + 0x46, // DB [ + 0x44, // DC Yen + 0x4A, // DD ] + 0x43, // DE ^ + -1, // DF + -1, // E0 + -1, // E1 + -1, // E2 _ + -1, // E3 + -1, // E4 + -1, // E5 + -1, // E6 + -1, // E7 + -1, // E8 + -1, // E9 + -1, // EA + -1, // EB + -1, // EC + -1, // ED + -1, // EE + -1, // EF + -1, // F0 + -1, // F1 + -1, // F2 + -1, // F3 + -1, // F4 + -1, // F5 + -1, // F6 + -1, // F7 + -1, // F8 + -1, // F9 + -1, // FA + -1, // FB + -1, // FC + -1, // FD + -1, // FE + -1, // FF }; void KEYBOARD::initialize() { fifo_down = new FIFO(8); - fifo_up = new FIFO(8); } void KEYBOARD::release() { fifo_down->release(); delete fifo_down; - fifo_up->release(); - delete fifo_up; } void KEYBOARD::reset() { fifo_down->clear(); - fifo_up->clear(); -} - -void KEYBOARD::write_io8(uint32_t addr, uint32_t data) -{ } uint32_t KEYBOARD::read_io8(uint32_t addr) @@ -308,12 +300,11 @@ uint32_t KEYBOARD::read_io8(uint32_t addr) } break; case 0xe122: - if(!fifo_up->empty()) { - value = fifo_up->read(); - } else { - value = 0xff; - } + // bit7: JPN/ENG Jumper? + // bit5: PROG.SELECT fifo_down->read(); + value = (config.dipswitch & 2) ? 0 : 0x20; + value |= (config.dipswitch & 4) ? 0 : 0x80; break; } return value; @@ -321,25 +312,20 @@ uint32_t KEYBOARD::read_io8(uint32_t addr) void KEYBOARD::key_down(int code) { - const uint8_t* key_stat = emu->get_key_buffer(); - int rshift = key_stat[0xa1] ? 1 : 0; - - if(table[code & 255][rshift] != -1) { - fifo_down->write(table[code & 255][rshift]); + if(code >= 0x70 && code <= 0x7b && emu->get_key_buffer()[0xa1]) { + // Right Shift + F1-F12 -> F13-F24 + code += 12; + } + if(table[code & 0xff] != -1) { + fifo_down->write(table[code & 0xff]); } } void KEYBOARD::key_up(int code) { - const uint8_t* key_stat = emu->get_key_buffer(); - int rshift = key_stat[0xa1] ? 1 : 0; - - if(table[code & 255][rshift] != -1) { - fifo_up->write(table[code & 255][rshift]); - } } -#define STATE_VERSION 1 +#define STATE_VERSION 2 bool KEYBOARD::process_state(FILEIO* state_fio, bool loading) { @@ -352,9 +338,6 @@ bool KEYBOARD::process_state(FILEIO* state_fio, bool loading) if(!fifo_down->process_state((void *)state_fio, loading)) { return false; } - if(!fifo_up->process_state((void *)state_fio, loading)) { - return false; - } return true; } } diff --git a/source/src/vm/bx1/keyboard.h b/source/src/vm/bx1/keyboard.h index 51f03719b..18c8aeeb9 100644 --- a/source/src/vm/bx1/keyboard.h +++ b/source/src/vm/bx1/keyboard.h @@ -21,13 +21,11 @@ class KEYBOARD : public DEVICE { private: FIFO *fifo_down; - FIFO *fifo_up; public: KEYBOARD(VM_TEMPLATE* parent_vm, EMU_TEMPLATE* parent_emu) : DEVICE(parent_vm, parent_emu) { fifo_down = NULL; - fifo_up = NULL; set_device_name(_T("Keyboard")); } ~KEYBOARD() {} @@ -36,7 +34,6 @@ public: virtual void initialize(); virtual void release(); virtual void reset(); - virtual void __FASTCALL write_io8(uint32_t addr, uint32_t data); virtual uint32_t __FASTCALL read_io8(uint32_t addr); virtual bool process_state(FILEIO* state_fio, bool loading); diff --git a/source/src/vm/bx1/printer.cpp b/source/src/vm/bx1/printer.cpp index 1d66a8cdb..0c9232dea 100644 --- a/source/src/vm/bx1/printer.cpp +++ b/source/src/vm/bx1/printer.cpp @@ -17,8 +17,7 @@ void PRINTER::initialize() fio = new FILEIO(); osd->open_console(80, 30, create_string(_T("Printer - %s"), osd->get_vm_device_name())); - - register_frame_event(this); + register_vline_event(this); } @@ -38,7 +37,7 @@ void PRINTER::reset() } column = htab = 0; - e210 = e211 = 0;//0xff; + strobe = outdata = 0; } /* @@ -51,11 +50,14 @@ void PRINTER::write_io8(uint32_t addr, uint32_t data) { switch(addr & 0xffff) { case 0xe210: - case 0xe212: - e210 = data; + // C1 -> A1‚Å$E211‚̃f[ƒ^‚ªo—Í‚³‚ê‚éH + if((strobe & 0xe1) == 0xc1 && (data & 0xe1) == 0xa1) { +// output(outdata); + } + strobe = data; break; case 0xe211: - e211 = data; + outdata = data; break; } } @@ -66,25 +68,21 @@ uint32_t PRINTER::read_io8(uint32_t addr) switch(addr & 0xffff) { case 0xe210: - value = e210; + // 0x00, 0x80, 0x81 ? + // bit7: 1=AUTO PRINT ? + // bit0: PE or BUSY ? + value = (config.dipswitch & 1) ? 0 : 0x80; break; case 0xe211: -// value = e211; + value = outdata; break; case 0xe212: - value = e210; -// e210 ^= 1; + value = strobe; break; } return value; } -void PRINTER::event_frame() -{ - // ????? - e210 ^= 1; -} - void PRINTER::event_vline(int v, int clock) { // ugly patch for printer :-( @@ -134,13 +132,14 @@ void PRINTER::event_vline(int v, int clock) void PRINTER::output(uint8_t value) { - if(!fio->IsOpened()) { - _TCHAR file_path[_MAX_PATH]; - create_date_file_path(file_path, _MAX_PATH, _T("txt")); - fio->Fopen(file_path, FILEIO_WRITE_BINARY); + if(config.printer_type == 0) { + if(!fio->IsOpened()) { + _TCHAR file_path[_MAX_PATH]; + create_date_file_path(file_path, _MAX_PATH, _T("txt")); + fio->Fopen(file_path, FILEIO_WRITE_BINARY); + } + fio->Fputc(value); } - fio->Fputc(value); - char temp[2]; temp[0] = (char)value; temp[1] = 0; @@ -150,8 +149,9 @@ void PRINTER::output(uint8_t value) void PRINTER::key_down(int code) { // ugly patch for PAPER FEED - if(code == 0x66) { + if(code == 0x91) { output(0x0d); + output(0x0a); } } @@ -171,8 +171,8 @@ bool PRINTER::process_state(FILEIO* state_fio, bool loading) } state_fio->StateValue(column); state_fio->StateValue(htab); - state_fio->StateValue(e210); - state_fio->StateValue(e211); + state_fio->StateValue(strobe); + state_fio->StateValue(outdata); return true; } diff --git a/source/src/vm/bx1/printer.h b/source/src/vm/bx1/printer.h index 5614a34be..d1e9def67 100644 --- a/source/src/vm/bx1/printer.h +++ b/source/src/vm/bx1/printer.h @@ -24,7 +24,7 @@ private: uint8_t *ram; FILEIO *fio; uint8_t column, htab; - uint8_t e210, e211; + uint8_t strobe, outdata; void output(uint8_t); @@ -39,7 +39,6 @@ public: void initialize(); void release(); void reset(); - void event_frame(); void event_vline(int v, int clock); void __FASTCALL write_io8(uint32_t addr, uint32_t data); uint32_t __FASTCALL read_io8(uint32_t addr); diff --git a/source/src/vm/common_vm/CMakeLists.txt b/source/src/vm/common_vm/CMakeLists.txt index 81c2c0fc8..911bbe1bb 100644 --- a/source/src/vm/common_vm/CMakeLists.txt +++ b/source/src/vm/common_vm/CMakeLists.txt @@ -1,6 +1,6 @@ message("* vm/common_vm") -SET(THIS_LIB_VERSION 3.6.0) +SET(THIS_LIB_VERSION 3.7.0) #include(cotire) set(s_vm_common_vm_srcs diff --git a/source/src/vm/datarec.cpp b/source/src/vm/datarec.cpp index 142080161..f3fef02c7 100644 --- a/source/src/vm/datarec.cpp +++ b/source/src/vm/datarec.cpp @@ -797,7 +797,7 @@ int DATAREC::load_wav_image(int offset) pair.b.h = tmp_buffer[tmp_ptr++]; \ sample[ch] = pair.s16; \ } else { \ - sample[ch] = (tmp_buffer[tmp_ptr++] - 128) * 256; \ + sample[ch] = ((int)tmp_buffer[tmp_ptr++] - 128) * 256; \ } \ } \ if(tmp_ptr == TMP_LENGTH) { \ @@ -1762,11 +1762,12 @@ void DATAREC::mix(int32_t* buffer, int cnt) sound_last_vol_r = apply_volume(sound_sample, sound_volume_r); buffer = buffer_tmp; // restore for(int i = 0; i < cnt; i++) { - *buffer += sound_last_vol_l; // L - *buffer += sound_last_vol_r; // R + *buffer++ += sound_last_vol_l; // L + *buffer++ += sound_last_vol_r; // R } } else if(sound_last_vol_l || sound_last_vol_r) { // suppress petite noise when go to mute + buffer = buffer_tmp; // restore for(int i = 0; i < cnt; i++) { *buffer++ += sound_last_vol_l; // L *buffer++ += sound_last_vol_r; // R diff --git a/source/src/vm/hd46505.cpp b/source/src/vm/hd46505.cpp index f6d0d9ca1..47aaa066d 100644 --- a/source/src/vm/hd46505.cpp +++ b/source/src/vm/hd46505.cpp @@ -98,6 +98,12 @@ void HD46505::write_io8(uint32_t addr, uint32_t data) if(ch < 10 && regs[ch] != data) { timing_changed = true; } + if(ch == 5 && !regs_written[5]) { + reg5_bottom = data; + } + if(ch == 9 && !regs_written[9]) { + reg9_bottom = data; + } regs[ch] = data; regs_written[ch] = true; } @@ -120,13 +126,15 @@ void HD46505::event_pre_frame() if(timing_changed) { if(regs_written[0] && regs_written[1] && regs_written[2] && regs_written[3] && regs_written[4] && regs_written[5] && regs_written[6] && regs_written[7] && regs_written[9]) { int ch_height = (regs[9] & 0x1f) + 1; + int ch_height_bottom = (reg9_bottom & 0x1f) + 1; hz_total = regs[0] + 1; hz_disp = regs[1]; hs_start = regs[2]; hs_end = hs_start + (regs[3] & 0x0f); - vt_total = ((regs[4] & 0x7f) + 1) * ch_height + (regs[5] & 0x1f); +// vt_total = ((regs[4] & 0x7f) + 1) * ch_height + (regs[5] & 0x1f); + vt_total = (regs[4] & 0x7f) * ch_height + ch_height_bottom + (reg5_bottom & 0x1f); vt_disp = (regs[6] & 0x7f) * ch_height; vs_start = ((regs[7] & 0x7f) + 1) * ch_height; vs_end = vs_start + ((regs[3] & 0xf0) ? (regs[3] >> 4) : 16); @@ -201,6 +209,12 @@ void HD46505::event_vline(int v, int clock) new_vblank = false; } + // virtical smooth scroll + if(v == vt_disp) { + reg5_bottom = regs[5]; + reg9_bottom = regs[9]; + } + // display if(outputs_disp.count) { set_display(new_vblank); @@ -266,7 +280,7 @@ void HD46505::set_hsync(bool val) } } -#define STATE_VERSION 3 +#define STATE_VERSION 4 bool HD46505::process_state(FILEIO* state_fio, bool loading) { @@ -278,6 +292,8 @@ bool HD46505::process_state(FILEIO* state_fio, bool loading) } state_fio->StateArray(regs, sizeof(regs), 1); state_fio->StateArray(regs_written, sizeof(regs_written), 1); + state_fio->StateValue(reg5_bottom); + state_fio->StateValue(reg9_bottom); state_fio->StateValue(ch); state_fio->StateValue(timing_changed); state_fio->StateValue(cpu_clocks); diff --git a/source/src/vm/hd46505.h b/source/src/vm/hd46505.h index ab2481b23..1f6f60134 100644 --- a/source/src/vm/hd46505.h +++ b/source/src/vm/hd46505.h @@ -24,7 +24,7 @@ private: outputs_t outputs_vsync; outputs_t outputs_hsync; - uint8_t regs[18]; + uint8_t regs[18], reg5_bottom, reg9_bottom; bool regs_written[18]; int ch; bool timing_changed; diff --git a/source/src/vm/mc6843.cpp b/source/src/vm/mc6843.cpp index 63d76aa19..9751d3370 100644 --- a/source/src/vm/mc6843.cpp +++ b/source/src/vm/mc6843.cpp @@ -319,7 +319,11 @@ int MC6843::address_search( chrn_id* id ) fdc[m_drive].searching = false; - if ( !disk[m_drive]->get_track(fdc[m_drive].track, m_side) ) +#if 0 + if ( !(fdc[m_drive].track >= 0 && fdc[m_drive].track < 70 && disk[m_drive]->get_track(fdc[m_drive].track >> 1, m_side)) ) +#else + if ( !disk[m_drive]->get_track(m_LTAR, m_side) ) +#endif { m_STRB |= 0x08; /* set Sector Address Undetected */ cmd_end( ); @@ -331,7 +335,11 @@ int MC6843::address_search( chrn_id* id ) // fixme: need to get current head position to determin next sector int sector = (fdc[m_drive].sector++) % disk[m_drive]->sector_num.sd; - if ( !disk[m_drive]->get_sector(fdc[m_drive].track, m_side, sector) ) +#if 0 + if ( !disk[m_drive]->get_sector(fdc[m_drive].track >> 1, m_side, sector) ) +#else + if ( !disk[m_drive]->get_sector(m_LTAR, m_side, sector) ) +#endif { /* read address error */ // LOG( "%f mc6843_address_search: get_next_id failed\n", machine().time().as_double() ); @@ -872,7 +880,11 @@ void MC6843::write(offs_t offset, uint8_t data) } register_event(this, EVENT_SEEK, 64 * ((m_SUR >> 4) + 1), false, &m_seek_id); // set target track number - fdc[m_drive].target_track = (cmd == CMD_STZ) ? 0 : m_GCR - (m_CTAR & 0x7F); + if(cmd == CMD_STZ) { + fdc[m_drive].target_track = 0; + } else { + fdc[m_drive].target_track = fdc[m_drive].track + m_GCR - (m_CTAR & 0x7F); + } if(__FDC_DEBUG_LOG) { this->out_debug_log(_T("FDC: SEEK DRIVE=%d TARGET=%d\n"), m_drive, fdc[m_drive].target_track); } diff --git a/source/src/vm/mc6844.cpp b/source/src/vm/mc6844.cpp index 4def3dc6e..3665e0a45 100644 --- a/source/src/vm/mc6844.cpp +++ b/source/src/vm/mc6844.cpp @@ -47,24 +47,36 @@ void MC6844::write_io8(uint32_t addr, uint32_t data) case 0x08: case 0x0c: dma[(addr >> 2) & 3].address_reg.b.h = data; +#ifdef _DMA_DEBUG_LOG + this->out_debug_log(_T("DMA: OUT CH=%d ADDRESS=%04X\n"), (addr >> 2) & 3, dma[(addr >> 2) & 3].address_reg.w.l); +#endif break; case 0x01: case 0x05: case 0x09: case 0x0d: dma[(addr >> 2) & 3].address_reg.b.l = data; +#ifdef _DMA_DEBUG_LOG + this->out_debug_log(_T("DMA: OUT CH=%d ADDRESS=%04X\n"), (addr >> 2) & 3, dma[(addr >> 2) & 3].address_reg.w.l); +#endif break; case 0x02: case 0x06: case 0x0a: case 0x0e: dma[(addr >> 2) & 3].byte_count_reg.b.h = data; +#ifdef _DMA_DEBUG_LOG + this->out_debug_log(_T("DMA: OUT CH=%d BYTECOUNT=%04X\n"), (addr >> 2) & 3, dma[(addr >> 2) & 3].byte_count_reg.w.l); +#endif break; case 0x03: case 0x07: case 0x0b: case 0x0f: dma[(addr >> 2) & 3].byte_count_reg.b.l = data; +#ifdef _DMA_DEBUG_LOG + this->out_debug_log(_T("DMA: OUT CH=%d BYTECOUNT=%04X\n"), (addr >> 2) & 3, dma[(addr >> 2) & 3].byte_count_reg.w.l); +#endif break; case 0x10: case 0x11: @@ -72,16 +84,28 @@ void MC6844::write_io8(uint32_t addr, uint32_t data) case 0x13: dma[addr & 3].channel_ctrl_reg &= (STAT_BUSY | STAT_DEND); dma[addr & 3].channel_ctrl_reg |= data & ~(STAT_BUSY | STAT_DEND); +#ifdef _DMA_DEBUG_LOG + this->out_debug_log(_T("DMA: OUT CH=%d CH_CTRL=%02X\n"), addr & 3, dma[addr & 3].channel_ctrl_reg); +#endif break; case 0x14: priority_ctrl_reg = data; +#ifdef _DMA_DEBUG_LOG + this->out_debug_log(_T("DMA: OUT PRI_CTRL=%02X\n"), priority_ctrl_reg); +#endif break; case 0x15: interrupt_ctrl_reg &= IRQ_FLAG; interrupt_ctrl_reg |= data & ~IRQ_FLAG; +#ifdef _DMA_DEBUG_LOG + this->out_debug_log(_T("DMA: OUT INT_CTRL=%02X\n"), interrupt_ctrl_reg); +#endif break; case 0x16: data_chain_reg = data; +#ifdef _DMA_DEBUG_LOG + this->out_debug_log(_T("DMA: OUT DAT_CHAIN=%02X\n"), data_chain_reg); +#endif break; } } @@ -156,7 +180,7 @@ uint32_t MC6844::read_via_debugger_data8(uint32_t addr) void MC6844::transfer(int ch) { if(priority_ctrl_reg & (1 << ch)) { - if(dma[ch].byte_count_reg.w.l != 0) { +// if(dma[ch].byte_count_reg.w.l != 0) { if(dma[ch].channel_ctrl_reg & 0x01) { uint8_t data; if(d_debugger != NULL && d_debugger->now_device_debugging) { @@ -179,9 +203,10 @@ void MC6844::transfer(int ch) dma[ch].address_reg.d++; } if(--dma[ch].byte_count_reg.w.l == 0) { - if(data_chain_reg & 0x01) { - dma[(data_chain_reg >> 1) & 3].address_reg.w.l = dma[3].address_reg.w.l; - dma[(data_chain_reg >> 1) & 3].byte_count_reg.w.l = dma[3].byte_count_reg.w.l; + static const int dest[8] = {0, 1, 0, 1, 0, 1, 2, 3}; + if((data_chain_reg & 0x01) && ch == dest[(data_chain_reg >> 1) & 3]) { + dma[ch].address_reg.w.l = dma[3].address_reg.w.l; + dma[ch].byte_count_reg.w.l = dma[3].byte_count_reg.w.l; } dma[ch].channel_ctrl_reg |= STAT_DEND; update_irq(); @@ -189,7 +214,7 @@ void MC6844::transfer(int ch) } else { dma[ch].channel_ctrl_reg |= STAT_BUSY; } - } +// } } } diff --git a/source/src/vm/mcs48.h b/source/src/vm/mcs48.h index 51ba48f29..d6295a581 100644 --- a/source/src/vm/mcs48.h +++ b/source/src/vm/mcs48.h @@ -8,7 +8,7 @@ [ MCS48 ] */ -#ifndef _MCS84_H_ +#ifndef _MCS48_H_ #define _MCS48_H_ //#include "vm.h" diff --git a/source/src/vm/mz700/CMakeLists.txt b/source/src/vm/mz700/CMakeLists.txt index 1afb63a4d..098a8889d 100644 --- a/source/src/vm/mz700/CMakeLists.txt +++ b/source/src/vm/mz700/CMakeLists.txt @@ -9,6 +9,7 @@ add_library(vm_${EXE_NAME} ./cmos.cpp ./emm.cpp ./kanji.cpp + ./joystick.cpp ./keyboard.cpp ./memory.cpp ./ramfile.cpp @@ -23,6 +24,7 @@ add_library(vm_${EXE_NAME} ./cmos.cpp ./emm.cpp + ./joystick.cpp ./kanji.cpp ./keyboard.cpp ./memory.cpp @@ -39,6 +41,7 @@ else() add_library(vm_${EXE_NAME} ./cmos.cpp ./emm.cpp + ./joystick.cpp ./kanji.cpp ./keyboard.cpp ./memory.cpp diff --git a/source/src/vm/mz700/joystick.cpp b/source/src/vm/mz700/joystick.cpp new file mode 100644 index 000000000..22fdc3584 --- /dev/null +++ b/source/src/vm/mz700/joystick.cpp @@ -0,0 +1,186 @@ +/* + SHARP MZ-700 Emulator 'EmuZ-700' + SHARP MZ-1500 Emulator 'EmuZ-1500' + + Author : Takeda.Toshiya + Date : 2006.11.24 - + + [ joystick ] +*/ + +#include "joystick.h" + +namespace MZ700 { + +void JOYSTICK::initialize() +{ + val_1x03 = 0x7e; + joy_stat = emu->get_joy_buffer(); + + // register event + register_vline_event(this); +} + +// __ _______________________ +// JA2 \_________/__y1___/__y0___/ \__ JA2は上下方向の状態をPWMする +// __ _________ _______ _______ _______ __ +// JA1 __X____A____X___B___X___R___X___L___X__ JA1は左右とボタンの状態をそのまま送る +// +// |← 38 →|← 30→|← 30→|← 30→| (3.579545MHz) +// +// y1y0 UD +// 0 0 01 +// 0 1 10 +// 1 1 11 +// +uint32_t JOYSTICK::read_AM7J(int jnum) +{ + uint32_t js; + uint32_t val = ~0; + uint32_t clk; + bool y0, y1; + + clk = get_current_clock() & 0x007f; + js = joy_stat[jnum]; + y0 = y1 = false; + + switch (js & 0xc0) { + case 0x40: // RUN + y1 = true; + y0 = true; + js |= 0x0c; // LEFT+RIGHT + break; + case 0x80: // SELECT + y0 = true; + js |= 0x0c; // LEFT+RIGHT + break; + case 0xc0: // RUN+SELECT + js |= 0x0c; // LEFT+RIGHT + break; + default: + switch (js & 0x03) { + case 0x01: // UP + break; + case 0x02: // DOWN + y0 = true; + break; + default: // center + y1 = true; + y0 = true; + break; + } + break; + } + + if (clk < 38) { + // JA2 = 0, JA1 = TRG-A + val &= ~0x10; + if(js & 0x10) val &= ~0x08; // trigger A + } else if (clk < 68) { + // JA2 = y1, JA1 = TRG-B + if(!y1) val &= ~0x10; + if(js & 0x20) val &= ~0x08; // trigger B + } else if (clk < 98) { + // JA2 = y0, JA1 = RIGHT + if(!y0) val &= ~0x10; + if(js & 0x08) val &= ~0x08; // right + } else { + // JA2 = 1, JA1 = LEFT + if(js & 0x04) val &= ~0x08; // left + } + if (jnum == 0) { + val >>= 2; + } + + return val; +} + +uint32_t JOYSTICK::read_io8(uint32_t addr) +{ + uint32_t val = 0x7e; + + switch (config.joystick_type) { + + case DEVICE_JOYSTICK_1X03: // SHARP MZ-1X03 + val = val_1x03; + break; + + case DEVICE_JOYSTICK_JOY700: // TSUKUMO JOY-700 + if(joy_stat[0] & 0x01) val &= ~0x10; // up : JB2 + if(joy_stat[0] & 0x02) val &= ~0x08; // down : JB1 + if(joy_stat[0] & 0x04) val &= ~0x02; // left : JA1 + if(joy_stat[0] & 0x08) val &= ~0x04; // right : JA2 + if(joy_stat[0] & 0x10) val &= ~0x1e; // trigger A : ALL + if(joy_stat[0] & 0x20) val &= ~0x1e; // trigger B : ALL + break; + + case DEVICE_JOYSTICK_AM7J: // AM7J ATARI Joystick adaptor + val &= read_AM7J(0); + val &= read_AM7J(1); + break; + + default: + break; + } + + return val; +} + +// +// MZ-1X03 は /VBLK=H でボタンの状態(押されていればL) +// /VBLK=L でスティックの傾き(PWM, 127.841kHz, (0〜255)+10のLowパルス) を出力する +// /VBLKが立ち下がってから 302 CPU clock待った後、28 CPU clock 単位のLowパルスを出力 +// +uint64_t JOYSTICK::pulse_width_1x03(uint32_t js, uint32_t mmin, uint32_t mmax) +{ + if (js & mmin) return 192; + if (js & mmax) return 10000; + return 4192; +} + +void JOYSTICK::event_vline(int v, int clock) +{ + if (config.joystick_type == DEVICE_JOYSTICK_1X03) { + if (v == 0) { + // trigger + val_1x03 = 0x7e; + if(joy_stat[0] & 0x10) val_1x03 &= ~0x02; + if(joy_stat[0] & 0x20) val_1x03 &= ~0x04; + if(joy_stat[1] & 0x10) val_1x03 &= ~0x08; + if(joy_stat[1] & 0x20) val_1x03 &= ~0x10; + } else if (v == 200) { + // stick (PWM) + val_1x03 &= ~(0x06 | 0x18); + register_event_by_clock(this, EVENT_1X03_X1, pulse_width_1x03(joy_stat[0], 0x04, 0x08), false, NULL); + register_event_by_clock(this, EVENT_1X03_Y1, pulse_width_1x03(joy_stat[0], 0x01, 0x02), false, NULL); + register_event_by_clock(this, EVENT_1X03_X2, pulse_width_1x03(joy_stat[1], 0x04, 0x08), false, NULL); + register_event_by_clock(this, EVENT_1X03_Y2, pulse_width_1x03(joy_stat[1], 0x01, 0x02), false, NULL); + } + } +} + +void JOYSTICK::event_callback(int event_id, int err) +{ + switch (event_id) { + case EVENT_1X03_X1: val_1x03 |= 0x02; break; + case EVENT_1X03_Y1: val_1x03 |= 0x04; break; + case EVENT_1X03_X2: val_1x03 |= 0x08; break; + case EVENT_1X03_Y2: val_1x03 |= 0x10; break; + } +} + +#define STATE_VERSION 2 + +bool JOYSTICK::process_state(FILEIO* state_fio, bool loading) +{ + if(!state_fio->StateCheckUint32(STATE_VERSION)) { + return false; + } + if(!state_fio->StateCheckInt32(this_device_id)) { + return false; + } + state_fio->StateValue(val_1x03); + return true; +} + +} diff --git a/source/src/vm/mz700/joystick.h b/source/src/vm/mz700/joystick.h new file mode 100644 index 000000000..15bdeac6e --- /dev/null +++ b/source/src/vm/mz700/joystick.h @@ -0,0 +1,54 @@ +/* + SHARP MZ-700 Emulator 'EmuZ-700' + SHARP MZ-1500 Emulator 'EmuZ-1500' + + Author : Takeda.Toshiya + Date : 2006.11.24 - + + [ joystick ] +*/ + +#ifndef _JOYSTICK_H_ +#define _JOYSTICK_H_ + +#include "../vm.h" +#include "../../emu.h" +#include "../device.h" + +#define DEVICE_JOYSTICK_1X03 0 // SHARP MZ-1X03 +#define DEVICE_JOYSTICK_JOY700 1 // TSUKUMO JOY-700 +#define DEVICE_JOYSTICK_AM7J 2 // AM7J ATARI Joystick adaptor + +#define EVENT_1X03_X1 0 +#define EVENT_1X03_Y1 1 +#define EVENT_1X03_X2 2 +#define EVENT_1X03_Y2 3 + +namespace MZ700 { + +class JOYSTICK : public DEVICE +{ +protected: + uint32_t val_1x03; + const uint32_t* joy_stat; + + uint64_t pulse_width_1x03(uint32_t js, uint32_t mmin, uint32_t mmax); + uint32_t read_AM7J(int jnum); + +public: + JOYSTICK(VM_TEMPLATE* parent_vm, EMU_TEMPLATE* parent_emu) : DEVICE(parent_vm, parent_emu) + { + set_device_name(_T("Joystick I/F")); + } + ~JOYSTICK() {} + + // common functions + virtual void initialize(); + virtual void event_vline(int v, int clock); + virtual void __FASTCALL event_callback(int event_id, int err); + virtual uint32_t __FASTCALL read_io8(uint32_t addr); + virtual bool process_state(FILEIO* state_fio, bool loading); +}; +} + +#endif diff --git a/source/src/vm/mz700/memory.cpp b/source/src/vm/mz700/memory.cpp index 5f2f04432..1d169e829 100644 --- a/source/src/vm/mz700/memory.cpp +++ b/source/src/vm/mz700/memory.cpp @@ -509,7 +509,7 @@ uint32_t MEMORY::read_data8(uint32_t addr) case 4: case 5: case 6: case 7: return d_pit->read_io8(addr & 3); case 8: - return (hblank ? 0 : 0x80) | (tempo ? 1 : 0) | 0x7e; + return (hblank ? 0 : 0x80) | (tempo ? 1 : 0) | d_joystick->read_io8(0); } return 0xff; } diff --git a/source/src/vm/mz700/memory.h b/source/src/vm/mz700/memory.h index aaa6d8077..42601a56e 100644 --- a/source/src/vm/mz700/memory.h +++ b/source/src/vm/mz700/memory.h @@ -29,6 +29,9 @@ private: #if defined(_MZ800) DEVICE *d_pio_int; #endif +#if defined(_MZ700) || defined(_MZ1500) + DEVICE *d_joystick; +#endif // memory uint8_t* rbank[32]; @@ -158,6 +161,12 @@ public: d_pio_int = device; } #endif +#if defined(_MZ700) || defined(_MZ1500) + void set_context_joystick(DEVICE* device) + { + d_joystick = device; + } +#endif void draw_screen(); }; diff --git a/source/src/vm/mz700/mz700.cpp b/source/src/vm/mz700/mz700.cpp index ea925cdb6..5c4d2bdf1 100644 --- a/source/src/vm/mz700/mz700.cpp +++ b/source/src/vm/mz700/mz700.cpp @@ -49,6 +49,9 @@ #endif #include "quickdisk.h" #endif +#if defined(_MZ700) || defined(_MZ1500) +#include "joystick.h" +#endif //using MZ700::CMOS* cmos; using MZ700::EMM; @@ -56,6 +59,9 @@ using MZ700::KANJI; using MZ700::KEYBOARD; using MZ700::MEMORY; using MZ700::RAMFILE; +#if defined(_MZ700) || defined(_MZ1500) +using MZ700::JOYSTICK; +#endif #if defined(_MZ800) || defined(_MZ1500) using MZ700::FLOPPY; #if defined(_MZ1500) @@ -141,6 +147,9 @@ VM::VM(EMU_TEMPLATE* parent_emu) : VM_TEMPLATE(parent_emu) #endif qd = new QUICKDISK(this, emu); #endif +#if defined(_MZ700) || defined(_MZ1500) + joystick = new JOYSTICK(this, emu); +#endif // set contexts event->set_context_cpu(cpu); @@ -180,6 +189,7 @@ VM::VM(EMU_TEMPLATE* parent_emu) : VM_TEMPLATE(parent_emu) #else // 8253:CLK#0 <- 895KHz pit->set_constant_clock(0, CPU_CLOCKS / 4); + memory->set_context_joystick(joystick); #endif #if defined(_MZ800) || defined(_MZ1500) diff --git a/source/src/vm/mz700/mz700.h b/source/src/vm/mz700/mz700.h index 14a9d5808..9e4ae01b7 100644 --- a/source/src/vm/mz700/mz700.h +++ b/source/src/vm/mz700/mz700.h @@ -64,6 +64,9 @@ #if defined(_MZ700) || defined(_MZ1500) #define USE_AUTO_KEY_NUMPAD #define USE_VM_AUTO_KEY_TABLE +#define USE_JOYSTICK +#define USE_JOYSTICK_TYPE 3 +#define USE_JOY_BUTTON_CAPTIONS #endif #if defined(_MZ800) #define USE_MONITOR_TYPE 2 @@ -89,69 +92,69 @@ #if defined(_MZ700) || defined(_MZ1500) static const int vm_auto_key_table_base[][2] = { // thanks Mr.Koucha Youkan - {0xa1, 0x300 | 0xbe}, // '¡' *** MODIFIED *** - {0xa2, 0x300 | 0x38}, // '¢' *** MODIFIED *** - {0xa3, 0x300 | 0x39}, // '£' *** MODIFIED *** - {0xa4, 0x300 | 0xbc}, // '¤' *** MODIFIED *** - {0xa5, 0x300 | 0x30}, // '¥' *** MODIFIED *** - {0xa6, 0x200 | 0xdb}, // '¦' *** MODIFIED *** - {0xa7, 0x300 | 0x31}, // '§' - {0xa8, 0x300 | 0x32}, // '¨' - {0xa9, 0x300 | 0x33}, // '©' - {0xaa, 0x300 | 0x34}, // 'ª' - {0xab, 0x300 | 0x35}, // '«' - {0xac, 0x300 | 0xbd}, // '¬' *** MODIFIED *** - {0xad, 0x300 | 0xde}, // '­' *** MODIFIED *** - {0xae, 0x300 | 0xdc}, // '®' *** MODIFIED *** - {0xaf, 0x300 | 0x43}, // '¯' - {0xb0, 0x200 | 0xe2}, // '°' *** MODIFIED *** - {0xb1, 0x200 | 0x31}, // '±' - {0xb2, 0x200 | 0x32}, // '²' - {0xb3, 0x200 | 0x33}, // '³' - {0xb4, 0x200 | 0x34}, // '´' - {0xb5, 0x200 | 0x35}, // 'µ' - {0xb6, 0x200 | 0x51}, // '¶' - {0xb7, 0x200 | 0x57}, // '·' - {0xb8, 0x200 | 0x45}, // '¸' - {0xb9, 0x200 | 0x52}, // '¹' - {0xba, 0x200 | 0x54}, // 'º' - {0xbb, 0x200 | 0x41}, // '»' - {0xbc, 0x200 | 0x53}, // '¼' - {0xbd, 0x200 | 0x44}, // '½' - {0xbe, 0x200 | 0x46}, // '¾' - {0xbf, 0x200 | 0x47}, // '¿' - {0xc0, 0x200 | 0x5a}, // 'À' - {0xc1, 0x200 | 0x58}, // 'Á' - {0xc2, 0x200 | 0x43}, // 'Â' - {0xc3, 0x200 | 0x56}, // 'Ã' - {0xc4, 0x200 | 0x42}, // 'Ä' - {0xc5, 0x200 | 0x36}, // 'Å' - {0xc6, 0x200 | 0x37}, // 'Æ' - {0xc7, 0x200 | 0x38}, // 'Ç' - {0xc8, 0x200 | 0x39}, // 'È' - {0xc9, 0x200 | 0x30}, // 'É' - {0xca, 0x200 | 0x59}, // 'Ê' - {0xcb, 0x200 | 0x55}, // 'Ë' - {0xcc, 0x200 | 0x49}, // 'Ì' - {0xcd, 0x200 | 0x4f}, // 'Í' - {0xce, 0x200 | 0x50}, // 'Î' - {0xcf, 0x200 | 0x48}, // 'Ï' - {0xd0, 0x200 | 0x4a}, // 'Ð' - {0xd1, 0x200 | 0x4b}, // 'Ñ' - {0xd2, 0x200 | 0x4c}, // 'Ò' - {0xd3, 0x200 | 0xbb}, // 'Ó' - {0xd4, 0x200 | 0xbd}, // 'Ô' *** MODIFIED *** - {0xd5, 0x200 | 0xde}, // 'Õ' *** MODIFIED *** - {0xd6, 0x200 | 0xdc}, // 'Ö' *** MODIFIED *** - {0xd7, 0x200 | 0x4e}, // '×' *** MODIFIED *** - {0xd8, 0x200 | 0x4d}, // 'Ø' *** MODIFIED *** - {0xd9, 0x200 | 0xbc}, // 'Ù' *** MODIFIED *** - {0xda, 0x200 | 0xbe}, // 'Ú' *** MODIFIED *** - {0xdb, 0x200 | 0xbf}, // 'Û' *** MODIFIED *** - {0xdc, 0x200 | 0xc0}, // 'Ü' *** MODIFIED *** - {0xdd, 0x200 | 0x78}, // 'Ý' *** MODIFIED *** - {0xde, 0x200 | 0xba}, // 'Þ' *** MODIFIED *** - {0xdf, 0x200 | 0xdd}, // 'ß' *** MODIFIED *** + {0xa1, 0x300 | 0xbe}, // '。' *** MODIFIED *** + {0xa2, 0x300 | 0x38}, // 'ï½¢' *** MODIFIED *** + {0xa3, 0x300 | 0x39}, // 'ï½£' *** MODIFIED *** + {0xa4, 0x300 | 0xbc}, // '、' *** MODIFIED *** + {0xa5, 0x300 | 0x30}, // 'ï½¥' *** MODIFIED *** + {0xa6, 0x200 | 0xdb}, // 'ヲ' *** MODIFIED *** + {0xa7, 0x300 | 0x31}, // 'ァ' + {0xa8, 0x300 | 0x32}, // 'ィ' + {0xa9, 0x300 | 0x33}, // 'ゥ' + {0xaa, 0x300 | 0x34}, // 'ェ' + {0xab, 0x300 | 0x35}, // 'ォ' + {0xac, 0x300 | 0xbd}, // 'ャ' *** MODIFIED *** + {0xad, 0x300 | 0xde}, // 'ï½­' *** MODIFIED *** + {0xae, 0x300 | 0xdc}, // 'ï½®' *** MODIFIED *** + {0xaf, 0x300 | 0x43}, // 'ッ' + {0xb0, 0x200 | 0xe2}, // 'ï½°' *** MODIFIED *** + {0xb1, 0x200 | 0x31}, // 'ï½±' + {0xb2, 0x200 | 0x32}, // 'ï½²' + {0xb3, 0x200 | 0x33}, // 'ï½³' + {0xb4, 0x200 | 0x34}, // 'ï½´' + {0xb5, 0x200 | 0x35}, // 'ï½µ' + {0xb6, 0x200 | 0x51}, // 'カ' + {0xb7, 0x200 | 0x57}, // 'ï½·' + {0xb8, 0x200 | 0x45}, // 'ク' + {0xb9, 0x200 | 0x52}, // 'ï½¹' + {0xba, 0x200 | 0x54}, // 'コ' + {0xbb, 0x200 | 0x41}, // 'ï½»' + {0xbc, 0x200 | 0x53}, // 'ï½¼' + {0xbd, 0x200 | 0x44}, // 'ï½½' + {0xbe, 0x200 | 0x46}, // 'ï½¾' + {0xbf, 0x200 | 0x47}, // 'ソ' + {0xc0, 0x200 | 0x5a}, // 'タ' + {0xc1, 0x200 | 0x58}, // 'チ' + {0xc2, 0x200 | 0x43}, // 'ツ' + {0xc3, 0x200 | 0x56}, // 'テ' + {0xc4, 0x200 | 0x42}, // 'ト' + {0xc5, 0x200 | 0x36}, // 'ナ' + {0xc6, 0x200 | 0x37}, // 'ニ' + {0xc7, 0x200 | 0x38}, // 'ヌ' + {0xc8, 0x200 | 0x39}, // 'ネ' + {0xc9, 0x200 | 0x30}, // 'ノ' + {0xca, 0x200 | 0x59}, // 'ハ' + {0xcb, 0x200 | 0x55}, // 'ヒ' + {0xcc, 0x200 | 0x49}, // 'フ' + {0xcd, 0x200 | 0x4f}, // 'ヘ' + {0xce, 0x200 | 0x50}, // 'ホ' + {0xcf, 0x200 | 0x48}, // 'マ' + {0xd0, 0x200 | 0x4a}, // 'ミ' + {0xd1, 0x200 | 0x4b}, // 'ム' + {0xd2, 0x200 | 0x4c}, // 'メ' + {0xd3, 0x200 | 0xbb}, // 'モ' + {0xd4, 0x200 | 0xbd}, // 'ヤ' *** MODIFIED *** + {0xd5, 0x200 | 0xde}, // 'ユ' *** MODIFIED *** + {0xd6, 0x200 | 0xdc}, // 'ヨ' *** MODIFIED *** + {0xd7, 0x200 | 0x4e}, // 'ラ' *** MODIFIED *** + {0xd8, 0x200 | 0x4d}, // 'リ' *** MODIFIED *** + {0xd9, 0x200 | 0xbc}, // 'ル' *** MODIFIED *** + {0xda, 0x200 | 0xbe}, // 'レ' *** MODIFIED *** + {0xdb, 0x200 | 0xbf}, // 'ロ' *** MODIFIED *** + {0xdc, 0x200 | 0xc0}, // 'ワ' *** MODIFIED *** + {0xdd, 0x200 | 0x78}, // 'ン' *** MODIFIED *** + {0xde, 0x200 | 0xba}, // '゙' *** MODIFIED *** + {0xdf, 0x200 | 0xdd}, // '゚' *** MODIFIED *** {-1, -1}, }; #endif @@ -175,6 +178,19 @@ static const _TCHAR *sound_device_caption[] = { }; #endif +#ifdef USE_JOY_BUTTON_CAPTIONS +static const _TCHAR *joy_button_captions[] = { + _T("Up"), + _T("Down"), + _T("Left"), + _T("Right"), + _T("Button #1"), + _T("Button #2"), + _T("Run"), + _T("Select"), +}; +#endif + class EMU; class DEVICE; class EVENT; @@ -190,6 +206,9 @@ class Z80; namespace MZ700 { //class CMOS; class EMM; +#if defined(_MZ700) || defined(_MZ1500) + class JOYSTICK; +#endif class KANJI; class KEYBOARD; class MEMORY; @@ -258,6 +277,9 @@ protected: #endif MZ700::QUICKDISK* qd; #endif +#if defined(_MZ700) || defined(_MZ1500) + MZ700::JOYSTICK* joystick; +#endif #if defined(_MZ800) int boot_mode; diff --git a/source/src/vm/pc6001/CMakeLists.txt b/source/src/vm/pc6001/CMakeLists.txt index 6177628ac..002e59715 100644 --- a/source/src/vm/pc6001/CMakeLists.txt +++ b/source/src/vm/pc6001/CMakeLists.txt @@ -9,8 +9,10 @@ set(BASIC_VM_FILES_PC6001 psub.cpp sub.cpp timer.cpp + pc6001.cpp ) + if(${EXE_NAME} STREQUAL emupc6001) add_library(vm_${EXE_NAME} ../mc6847.cpp @@ -19,19 +21,16 @@ if(${EXE_NAME} STREQUAL emupc6001) ) elseif(${EXE_NAME} STREQUAL emupc6601) add_library(vm_${EXE_NAME} - floppy.cpp - memory_draw.cpp + ./floppy.cpp ${BASIC_VM_FILES_PC6001} ) elseif(${EXE_NAME} STREQUAL emupc6601sr) add_library(vm_${EXE_NAME} - floppy.cpp - memory_draw.cpp + ./floppy.cpp ${BASIC_VM_FILES_PC6001} ) else() add_library(vm_${EXE_NAME} - memory_draw.cpp ${BASIC_VM_FILES_PC6001} ) endif() diff --git a/source/src/vm/pc6001/memory.cpp b/source/src/vm/pc6001/memory.cpp index ad4d63f2a..c8c2e4b43 100644 --- a/source/src/vm/pc6001/memory.cpp +++ b/source/src/vm/pc6001/memory.cpp @@ -1,13 +1,3 @@ -/** iP6: PC-6000/6600 series emualtor ************************/ -/** **/ -/** Refresh.c **/ -/** **/ -/** modified by Windy 2002-2004 **/ -/** by ISHIOKA Hiroshi 1998,1999 **/ -/** This code is based on fMSX written by Marat Fayzullin **/ -/** and Adaptions for any X-terminal by Arnold Metselaar **/ -/*************************************************************/ - /* NEC PC-6001 Emulator 'yaPC-6001' NEC PC-6001mkII Emulator 'yaPC-6201' @@ -22,29 +12,19 @@ */ #include "./memory.h" -#include "timer.h" +#include "./timer.h" #define RAM (MEMORY_BASE + RAM_BASE) #define BASICROM (MEMORY_BASE + BASICROM_BASE) #define EXTROM (MEMORY_BASE + EXTROM_BASE) #define CGROM1 (MEMORY_BASE + CGROM1_BASE) #define EmptyRAM (MEMORY_BASE + EmptyRAM_BASE) -// PC-6001mkII, PC-6601 -#define VOICEROM (MEMORY_BASE + VOICEROM_BASE) -#define KANJIROM (MEMORY_BASE + KANJIROM_BASE) -#define CGROM5 (MEMORY_BASE + CGROM5_BASE) -// PC-6001mkIISR, PC-6601SR -#define EXTRAM (MEMORY_BASE + EXTRAM_BASE) -#define SYSTEMROM1 (MEMORY_BASE + SYSTEMROM1_BASE) -#define SYSTEMROM2 (MEMORY_BASE + SYSTEMROM2_BASE) -#define CGROM6 (MEMORY_BASE + CGROM6_BASE) namespace PC6001 { void MEMORY::initialize() { FILEIO* fio = new FILEIO(); -#if defined(_PC6001) if(fio->Fopen(create_local_path(_T("BASICROM.60")), FILEIO_READ_BINARY)) { fio->Fread(BASICROM, 0x4000, 1); fio->Fclose(); @@ -53,128 +33,15 @@ void MEMORY::initialize() fio->Fread(CGROM1, 0x1000, 1); fio->Fclose(); } -#elif defined(_PC6001MK2) - if (fio->Fopen(create_local_path(_T("CGROM62.62")), FILEIO_READ_BINARY)) { - fio->Fread(CGROM5, 0x2000, 1); - fio->Fclose(); - } - else if (fio->Fopen(create_local_path(_T("CGROM60m.62")), FILEIO_READ_BINARY)) { - fio->Fread(CGROM5, 0x2000, 1); - fio->Fclose(); - } - if (fio->Fopen(create_local_path(_T("BASICROM.62")), FILEIO_READ_BINARY)) { - fio->Fread(BASICROM, 0x8000, 1); - fio->Fclose(); - } - if (fio->Fopen(create_local_path(_T("CGROM60.62")), FILEIO_READ_BINARY)) { - fio->Fread(CGROM1, 0x2000, 1); - fio->Fclose(); - } - if (fio->Fopen(create_local_path(_T("KANJIROM.62")), FILEIO_READ_BINARY)) { - fio->Fread(KANJIROM, 0x8000, 1); - fio->Fclose(); - } - if (fio->Fopen(create_local_path(_T("VOICEROM.62")), FILEIO_READ_BINARY)) { - fio->Fread(VOICEROM, 0x4000, 1); - fio->Fclose(); - } -#elif defined(_PC6601) - if (fio->Fopen(create_local_path(_T("CGROM66.66")), FILEIO_READ_BINARY)) { - fio->Fread(CGROM5, 0x2000, 1); - fio->Fclose(); - } - if (fio->Fopen(create_local_path(_T("BASICROM.66")), FILEIO_READ_BINARY)) { - fio->Fread(BASICROM, 0x8000, 1); - fio->Fclose(); - } - if (fio->Fopen(create_local_path(_T("CGROM60.66")), FILEIO_READ_BINARY)) { - fio->Fread(CGROM1, 0x2000, 1); - fio->Fclose(); - } - if (fio->Fopen(create_local_path(_T("KANJIROM.66")), FILEIO_READ_BINARY)) { - fio->Fread(KANJIROM, 0x8000, 1); - fio->Fclose(); - } - if (fio->Fopen(create_local_path(_T("VOICEROM.66")), FILEIO_READ_BINARY)) { - fio->Fread(VOICEROM, 0x4000, 1); - fio->Fclose(); - } -#elif defined(_PC6601SR) || defined(_PC6001MK2SR) - if (fio->Fopen(create_local_path(_T("CGROM68.68")), FILEIO_READ_BINARY)) { - fio->Fread(CGROM6, 0x4000, 1); - fio->Fclose(); - } - memcpy(CGROM1, CGROM6, 0x2400); - memcpy(CGROM5, CGROM6+0x2000, 0x2000); - if (fio->Fopen(create_local_path(_T("SYSTEMROM1.68")), FILEIO_READ_BINARY)) { - fio->Fread(SYSTEMROM1, 0x10000, 1); - fio->Fclose(); - } - memcpy(BASICROM, SYSTEMROM1, 0x8000); - if (fio->Fopen(create_local_path(_T("SYSTEMROM2.68")), FILEIO_READ_BINARY)) { - fio->Fread(SYSTEMROM2, 0x10000, 1); - fio->Fclose(); - } - memcpy(VOICEROM, SYSTEMROM2+0x4000, 0x4000); - memcpy(KANJIROM, SYSTEMROM2+0x8000, 0x8000); -#endif delete fio; -#ifndef _PC6001 - int i; - // for mkII/66 - int Pal11[ 4] = { 15, 8,10, 8 }; - int Pal12[ 8] = { 10,11,12, 9,15,14,13, 1 }; - int Pal13[ 8] = { 10,11,12, 9,15,14,13, 1 }; - int Pal14[ 4] = { 8,10, 8,15 }; - int Pal15[ 8] = { 8,9,11,14, 8,9,14,15 }; - int Pal53[32] = { 0, 4, 1, 5, 2, 6, 3, 7, 8,12, 9,13,10,14,11,15, - 10,11,12, 9,15,14,13, 1,10,11,12, 9,15,14,13, 1 }; - - for(i=0;i<32;i++) { - BPal53[i]=Pal53[i]; - if (i>15) continue; - BPal[i]=i; - if (i>7) continue; - BPal12[i]=Pal12[i]; - BPal13[i]=Pal13[i]; - BPal15[i]=Pal15[i]; - if (i>3) continue; - BPal11[i]=Pal11[i]; - BPal14[i]=Pal14[i]; - } - for (i=0;i<32;i++) BPal62[i] = BPal53[i]; // for RefreshScr62/63 - for (i=0;i<16;i++) BPal61[i] = BPal[i]; // for RefreshScr61 - - // mk2` palette - palette_pc[ 0] = RGB_COLOR(0x14,0x14,0x14); // COL065 = 141414 ;mk2` “§–¾(•) - palette_pc[ 1] = RGB_COLOR(0xFF,0xAC,0x00); // COL066 = FFAC00 ;mk2` žò - palette_pc[ 2] = RGB_COLOR(0x00,0xFF,0xAC); // COL067 = 00FFAC ;mk2` Â—Î - palette_pc[ 3] = RGB_COLOR(0xAC,0xFF,0x00); // COL068 = ACFF00 ;mk2` ‰©—Î - palette_pc[ 4] = RGB_COLOR(0xAC,0x00,0xFF); // COL069 = AC00FF ;mk2` ÂŽ‡ - palette_pc[ 5] = RGB_COLOR(0xFF,0x00,0xAC); // COL070 = FF00AC ;mk2` ÔŽ‡ - palette_pc[ 6] = RGB_COLOR(0x00,0xAC,0xFF); // COL071 = 00ACFF ;mk2` ‹óF - palette_pc[ 7] = RGB_COLOR(0xAC,0xAC,0xAC); // COL072 = ACACAC ;mk2` ŠDF - palette_pc[ 8] = RGB_COLOR(0x14,0x14,0x14); // COL073 = 141414 ;mk2` • - palette_pc[ 9] = RGB_COLOR(0xFF,0x00,0x00); // COL074 = FF0000 ;mk2` Ô - palette_pc[10] = RGB_COLOR(0x00,0xFF,0x00); // COL075 = 00FF00 ;mk2` —Î - palette_pc[11] = RGB_COLOR(0xFF,0xFF,0x00); // COL076 = FFFF00 ;mk2` ‰© - palette_pc[12] = RGB_COLOR(0x00,0x00,0xFF); // COL077 = 0000FF ;mk2` Â - palette_pc[13] = RGB_COLOR(0xFF,0x00,0xFF); // COL078 = FF00FF ;mk2` ƒ}ƒ[ƒ“ƒ^ - palette_pc[14] = RGB_COLOR(0x00,0xFF,0xFF); // COL079 = 00FFFF ;mk2` ƒVƒAƒ“ - palette_pc[15] = RGB_COLOR(0xFF,0xFF,0xFF); // COL080 = FFFFFF ;mk2` ”’ - - // register event -#endif register_vline_event(this); } void MEMORY::reset() { -#ifdef _PC6001 int J; if (!inserted) { -/// EXTROM1 = EXTROM2 = EmptyRAM; EXTROM1 = RAM + 0x4000; EXTROM2 = RAM + 0x6000; FILEIO* fio = new FILEIO(); @@ -196,76 +63,11 @@ void MEMORY::reset() RdMem[2] = EXTROM1; RdMem[3] = EXTROM2; for(J=4;J<8;J++) {RdMem[J]=RAM+0x2000*J;WrMem[J]=RAM+0x2000*J;}; EnWrite[0]=0; EnWrite[1]=EnWrite[2]=EnWrite[3]=1; -#else - int I, J; - uint8_t *addr=RAM; - memset(RAM ,0,0x10000); - memset(EmptyRAM, 0, 0x2000); - for(I=0; I<256; I++ ){ - for( J=0; J<64; J++ ){ - *addr++ = 0x00; - *addr++ = 0xff; - } - for( J=0; J<64; J++ ){ - *addr++ = 0xff; - *addr++ = 0x00; - } - } - if (!inserted) { - EXTROM1 = EXTROM2 = EmptyRAM; - } -#if defined(_PC6001MK2) || defined(_PC6601) - static_cast(vm)->sr_mode=0; - CGROM = CGROM1; - VRAM = RAM+0xE000; - for (I=0; I<0x200; I++ ) *(VRAM+I)=0xde; - for(J=0;J<4;J++) {RdMem[J]=BASICROM+0x2000*J;WrMem[J]=RAM+0x2000*J;}; - for(J=4;J<8;J++) {RdMem[J]=RAM+0x2000*J;WrMem[J]=RAM+0x2000*J;}; - EnWrite[0]=EnWrite[1]=0; EnWrite[2]=EnWrite[3]=1; -#elif defined(_PC6601SR) || defined(_PC6001MK2SR) - static_cast(vm)->sr_mode=1; - bitmap=1; - cols=40; - rows=20; - lines=200; - memset(EXTRAM ,0,0x10000); - for (int i=0; i<16; i++) palet[i] = i; - port60[0]= 0xf8; //I/O[60..67] READ MEMORY MAPPING - for (I=1; I<15; I++) port60[I]=0; //I/O[68-6f] WRITE MEMORY MAPPING - portC1 = 0x00; //I/O[C1] CRT CONTROLLER MODE - portC8 = 0x00; //I/O[C8] CRT CONTROLLER TYPE - portCA = 0x00; //I/O[CA] X GEOMETORY low HARDWARE SCROLL - portCB = 0x00; //I/O[CB] X GEOMETORY high HARDWARE SCROLL - portCC = 0x00; //I/O[CC] Y GEOMETORY HARDWARE SCROLL - portCE = 0x00; //I/O[CE] LINE SETTING BITMAP (low) */ - portCF = 0x00; //I/O[CF] LINE SETTING BITMAP (High) */ - CGROM=CGROM6; - make_semigraph(); - for(J=0;J<4;J++) {RdMem[J]=SYSTEMROM1+0x2000*J+0x8000;WrMem[J]=RAM+0x2000*J;}; - RdMem[2] = EXTROM1; RdMem[3] = EXTROM2; - for(J=4;J<8;J++) {RdMem[J]=RAM+0x2000*J;WrMem[J]=RAM+0x2000*J;}; - EnWrite[0]=EnWrite[1]=0; EnWrite[2]=EnWrite[3]=1; - VRAM=RAM; - TEXTVRAM=RAM; - SYSROM2=EmptyRAM; -#endif - portF0 = 0x11; - portF1 = 0xdd; - CRTMode1 = CRTMode2 = CRTMode3 = 0; - CSS3=CSS2=CSS1=0; - CurKANJIROM = KANJIROM; -#endif CGSW93 = CRTKILL = 0; } void MEMORY::write_data8(uint32_t addr, uint32_t data) { -#if defined(_PC6601SR) || defined(_PC6001MK2SR) - /* Graphics Vram Write (SR basic) */ - if(static_cast(vm)->sr_mode && chk_gvram(addr ,8)) - gvram_write(addr, data); - else -#endif /* normal memory write */ if(EnWrite[addr >> 14]) WrMem[addr >> 13][addr & 0x1FFF] = data; @@ -273,72 +75,23 @@ void MEMORY::write_data8(uint32_t addr, uint32_t data) uint32_t MEMORY::read_data8(uint32_t addr) { -#if defined(_PC6601SR) || defined(_PC6001MK2SR) - /* Graphics Vram Read (SR basic) */ - if(static_cast(vm)->sr_mode && chk_gvram(addr, 0)) - return(gvram_read(addr)); -#endif return(RdMem[addr >> 13][addr & 0x1FFF]); } void MEMORY::write_data8w(uint32_t addr, uint32_t data, int *wait) { -#ifdef _PC6001 *wait = addr < 0x8000 ? 1 : 0; -#else - bool is_rom; - uint32_t portF3 = d_timer->read_io8(0xf3); -#if defined(_PC6601SR) || defined(_PC6001MK2SR) - if (static_cast(vm)->sr_mode) { - is_rom = (port60[8 + (addr >> 13)] & 0xf0) > 0x20 ? true: false; - } else -#endif - { - is_rom = EnWrite[addr >> 14] ? false : true; - } - *wait = is_rom && (portF3 & 0x40) || !is_rom && (portF3 & 0x20) ? 1 : 0; -#endif write_data8(addr, data); } uint32_t MEMORY::read_data8w(uint32_t addr, int *wait) { -#ifdef _PC6001 *wait = addr < 0x8000 ? 1 : 0; -#else - bool is_rom; - uint32_t portF3 = d_timer->read_io8(0xf3); -#if defined(_PC6601SR) || defined(_PC6001MK2SR) - if (static_cast(vm)->sr_mode) { - is_rom = (port60[addr >> 13] & 0xf0) > 0x20 ? true : false; - } else -#endif - { - if (CGSW93 && 0x6000 <= addr && addr < 0x8000) { - is_rom = true; - } else if (addr < 0x4000) { - is_rom = (portF0 & 0x0f) == 0x0d || (portF0 & 0x0f) == 0x0e ? false : true; - } else if (addr < 0x8000) { - is_rom = (portF0 & 0xf0) == 0xd0 || (portF0 & 0xf0) == 0xe0 ? false : true; - } else if (addr < 0xc000) { - is_rom = (portF1 & 0x0f) == 0x0d || (portF1 & 0x0f) == 0x0e ? false : true; - } else { - is_rom = (portF1 & 0xf0) == 0xd0 || (portF1 & 0xf0) == 0xe0 ? false : true; - } - } - *wait = is_rom && (portF3 & 0x40) || !is_rom && (portF3 & 0x20) ? 1 : 0; -#endif return read_data8(addr); } uint32_t MEMORY::fetch_op(uint32_t addr, int *wait) { -#ifndef _PC6001 - uint32_t portF3 = d_timer->read_io8(0xf3); - if ((portF3 & 0x80) == 0) { - return read_data8w(addr, wait); - } -#endif *wait = 1; return read_data8(addr); } @@ -353,7 +106,6 @@ void MEMORY::write_io8(uint32_t addr, uint32_t data) uint8_t Value=data; switch(port) { -#ifdef _PC6001 /// 64K RAM /// case 0x00: if (Value & 1) { @@ -382,291 +134,10 @@ void MEMORY::write_io8(uint32_t addr, uint32_t data) EnWrite[0]=EnWrite[1]=0; } break; -#else -#if defined(_PC6601SR) || defined(_PC6001MK2SR) - case 0x40: - case 0x41: - case 0x42: - case 0x43: - int reg,val; - reg= 15-(port-0x40); - val= 15-Value; - palet[ reg]= val; - do_palet( reg,val); - break; - case 0x60: - case 0x61: - case 0x62: - case 0x63: - case 0x64: - case 0x65: - case 0x66: - case 0x67: - int start_adr; - start_adr= Value & 0xe; - port60[port-0x60]= Value; - switch( Value & 0xf0) { - case 0xf0: RdMem[(port& 0xf)]=SYSTEMROM1+(start_adr)*0x1000;break; - case 0xe0: RdMem[(port& 0xf)]=SYSTEMROM2+(start_adr)*0x1000;break; - case 0xd0: RdMem[(port& 0xf)]= CGROM6+(start_adr)*0x1000;break; - case 0xc0: RdMem[(port& 0xf)]= EXTROM2; /*+(start_adr)*0x1000; */break; - case 0xb0: RdMem[(port& 0xf)]= EXTROM1; /*+(start_adr)*0x1000; */break; - case 0x00: RdMem[(port& 0xf)]= RAM+(start_adr)*0x1000;break; - case 0x20: if (EXTRAM) RdMem[ port & 0xf]= EXTRAM+((start_adr)*0x1000); break; - } - return; - case 0x68: - case 0x69: - case 0x6a: - case 0x6b: - case 0x6c: - case 0x6d: - case 0x6e: - case 0x6f: - port60[port-0x60]= Value; - if ((Value & 0xf0)==0x00) { - WrMem[ (port& 0xf)-8]= RAM+((Value & 0xe)*0x1000); - EnWrite[ ((port & 0xe)-8)/2 ]= 1; - } - if (EXTRAM) { - if((Value & 0xf0)==0x20) { - WrMem[ (port& 0xf)-8]= EXTRAM+((Value & 0xe)*0x1000); - } - } - break; -#endif - case 0xB0: - if (static_cast(vm)->sr_mode) { - d_timer->set_portB0(Value); - } else { - VRAM=(RAM+VRAMHead[CRTMode1][(data&0x06)>>1]); - if (CRTMode1 && Value == 6) d_timer->set_portB0(Value | 0x01); /// Colony Oddysey - else d_timer->set_portB0(Value); - } - break; - case 0xC0: // CSS - CSS3=(Value&0x04)<<2;CSS2=(Value&0x02)<<2;CSS1=(Value&0x01)<<2; - break; - case 0xC1: // CRT controller mode - CRTMode1=(Value&0x02) ? 0 : 1; - CRTMode2=(Value&0x04) ? 0 : 1; - CRTMode3=(Value&0x08) ? 0 : 1; -#if defined(_PC6601SR) || defined(_PC6001MK2SR) - portC1 = Value; - if (static_cast(vm)->sr_mode) - lines=(Value&0x01) ? 200 : 204; - if (static_cast(vm)->sr_mode) - CGROM = CGROM6; // N66SR BASIC use CGROM6 - else - CGROM = ((CRTMode1 == 0) ? CGROM1 : CGROM5); - if (static_cast(vm)->sr_mode) { - if (CRTMode1==1 && CRTMode2==0 && !bitmap) { /* width 80 */ - cols=80; - } else if(CRTMode1==0 && CRTMode2==0 && !bitmap) { /* Width 40 */ - cols=40; - } - } -#else - CGROM = ((CRTMode1 == 0) ? CGROM1 : CGROM5); -#endif - break; - case 0xC2: // ROM swtich - if (static_cast(vm)->sr_mode) return; /* sr_mode do nothing! */ - if ((Value&0x02)==0x00) CurKANJIROM=KANJIROM; - else CurKANJIROM=KANJIROM+0x4000; - if ((Value&0x01)==0x00) { -/// if(RdMem[0]!=BASICROM) RdMem[0]=VOICEROM; -/// if(RdMem[1]!=BASICROM+0x2000) RdMem[1]=VOICEROM+0x2000; -/// if(RdMem[0]!=BASICROM) RdMem[0]=SYSTEMROM2; -/// if(RdMem[1]!=BASICROM+0x2000) RdMem[1]=SYSTEMROM2+0x2000; - if(RdMem[2]!=BASICROM+0x4000) RdMem[2]=VOICEROM; - if(RdMem[3]!=BASICROM+0x6000) RdMem[3]=VOICEROM+0x2000; - } - else { - write_io8(0xF0,portF0); - }; - break; - case 0xC3: break; // C2H in/out switch -#if defined(_PC6601SR) || defined(_PC6001MK2SR) - case 0xC8: - portC8 = Value; - bitmap = (Value & 8)? 0:1; - rows = (Value & 4)? 20:25; -/// busreq = (Value & 2)? 0:1; - static_cast(vm)->sr_mode = ((Value & 1)==1) ? 0 : 1; - if (bitmap && static_cast(vm)->sr_mode) - { - VRAM = (Value & 0x10) ? RAM+0x8000:RAM+0x0000; - } - if (static_cast(vm)->sr_mode) { - CGROM=CGROM6; - portF0=0x11; - } - break; - case 0xC9: - if (static_cast(vm)->sr_mode && !bitmap ) - { - TEXTVRAM=RAM+(Value & 0xf)*0x1000; - } - break; - case 0xCA: portCA=Value; break; // Graphics scroll X low - case 0xCB: portCB=Value; break;// Graphics scroll X high - case 0xCC: portCC=Value; break; // Graphics scroll Y - case 0xCE: portCE=Value; break; /* Graphics Y zahyou SR-BASIC add 2002/2 */ - case 0xCF: portCF=0; break; -#endif - case 0xF0: // read block set - if (static_cast(vm)->sr_mode) return; /* sr_mode do nothing! */ - portF0 = Value; - switch(data & 0x0f) - { - case 0x00: RdMem[0]=RdMem[1]=EmptyRAM; break; - case 0x01: RdMem[0]=BASICROM;RdMem[1]=BASICROM+0x2000; break; - case 0x02: RdMem[0]=CurKANJIROM;RdMem[1]=CurKANJIROM+0x2000; break; - case 0x03: RdMem[0]=RdMem[1]=EXTROM2; break; - case 0x04: RdMem[0]=RdMem[1]=EXTROM1; break; - case 0x05: RdMem[0]=CurKANJIROM;RdMem[1]=BASICROM+0x2000; break; -#if defined(_PC6601SR) || defined(_PC6001MK2SR) - case 0x06: RdMem[0]=BASICROM;RdMem[1]=(SYSROM2==EmptyRAM ? CurKANJIROM+0x2000 : SYSROM2); break; -#else - case 0x06: RdMem[0]=BASICROM;RdMem[1]=CurKANJIROM+0x2000;break; -#endif - case 0x07: RdMem[0]=EXTROM1;RdMem[1]=EXTROM2; break; - case 0x08: RdMem[0]=EXTROM2;RdMem[1]=EXTROM1; break; - case 0x09: RdMem[0]=EXTROM2;RdMem[1]=BASICROM+0x2000; break; - case 0x0a: RdMem[0]=BASICROM;RdMem[1]=EXTROM2; break; - case 0x0b: RdMem[0]=EXTROM1;RdMem[1]=CurKANJIROM+0x2000; break; - case 0x0c: RdMem[0]=CurKANJIROM;RdMem[1]=EXTROM1; break; - case 0x0d: RdMem[0]=RAM;RdMem[1]=RAM+0x2000; break; -#if defined(_PC6601SR) || defined(_PC6001MK2SR) - case 0x0e: if (EXTRAM) {RdMem[0]=EXTRAM; RdMem[1]=EXTRAM+0x2000;break;} -#else - case 0x0e: RdMem[0]=RdMem[1]=EmptyRAM; break; -#endif - case 0x0f: RdMem[0]=RdMem[1]=EmptyRAM; break; - }; - switch(data & 0xf0) - { - case 0x00: RdMem[2]=RdMem[3]=EmptyRAM; break; - case 0x10: RdMem[2]=BASICROM+0x4000;RdMem[3]=BASICROM+0x6000; break; - case 0x20: RdMem[2]=VOICEROM;RdMem[3]=VOICEROM+0x2000; break; - case 0x30: RdMem[2]=RdMem[3]=EXTROM2; break; - case 0x40: RdMem[2]=RdMem[3]=EXTROM1; break; - case 0x50: RdMem[2]=VOICEROM;RdMem[3]=BASICROM+0x6000; break; - case 0x60: RdMem[2]=BASICROM+0x4000;RdMem[3]=VOICEROM+0x2000; break; - case 0x70: RdMem[2]=EXTROM1;RdMem[3]=EXTROM2; break; - case 0x80: RdMem[2]=EXTROM2;RdMem[3]=EXTROM1; break; - case 0x90: RdMem[2]=EXTROM2;RdMem[3]=BASICROM+0x6000; break; - case 0xa0: RdMem[2]=BASICROM+0x4000;RdMem[3]=EXTROM2; break; - case 0xb0: RdMem[2]=EXTROM1;RdMem[3]=VOICEROM+0x2000; break; - case 0xc0: RdMem[2]=VOICEROM;RdMem[3]=EXTROM1; break; - case 0xd0: RdMem[2]=RAM+0x4000;RdMem[3]=RAM+0x6000; break; -#if defined(_PC6601SR) || defined(_PC6001MK2SR) - case 0xe0: if (EXTRAM) {RdMem[2]=EXTRAM+0x4000; RdMem[3]=EXTRAM+0x6000; break;} -#else - case 0xe0: RdMem[2]=RdMem[3]=EmptyRAM; break; -#endif - case 0xf0: RdMem[2]=RdMem[3]=EmptyRAM; break; - }; - if (CGSW93) RdMem[3] = CGROM; - break; - case 0xF1: // read block set - if (static_cast(vm)->sr_mode) return; /* sr_mode do nothing! */ - portF1 = Value; - switch(data & 0x0f) - { - case 0x00: RdMem[4]=RdMem[5]=EmptyRAM; break; - case 0x01: RdMem[4]=BASICROM;RdMem[5]=BASICROM+0x2000; break; - case 0x02: RdMem[4]=CurKANJIROM;RdMem[5]=CurKANJIROM+0x2000; break; - case 0x03: RdMem[4]=RdMem[5]=EXTROM2; break; - case 0x04: RdMem[4]=RdMem[5]=EXTROM1; break; - case 0x05: RdMem[4]=CurKANJIROM;RdMem[5]=BASICROM+0x2000; break; - case 0x06: RdMem[4]=BASICROM;RdMem[5]=CurKANJIROM+0x2000; break; - case 0x07: RdMem[4]=EXTROM1;RdMem[5]=EXTROM2; break; - case 0x08: RdMem[4]=EXTROM2;RdMem[5]=EXTROM1; break; - case 0x09: RdMem[4]=EXTROM2;RdMem[5]=BASICROM+0x2000; break; - case 0x0a: RdMem[4]=BASICROM;RdMem[5]=EXTROM2; break; - case 0x0b: RdMem[4]=EXTROM1;RdMem[5]=CurKANJIROM+0x2000; break; - case 0x0c: RdMem[4]=CurKANJIROM;RdMem[5]=EXTROM1; break; - case 0x0d: RdMem[4]=RAM+0x8000;RdMem[5]=RAM+0xa000; break; -#if defined(_PC6601SR) || defined(_PC6001MK2SR) - case 0x0e: if (EXTRAM) {RdMem[4]=EXTRAM+0x8000; RdMem[5]=EXTRAM+0xa000; break;} -#else - case 0x0e: RdMem[4]=RdMem[5]=EmptyRAM; break; -#endif - case 0x0f: RdMem[4]=RdMem[5]=EmptyRAM; break; - }; - switch(data & 0xf0) - { - case 0x00: RdMem[6]=RdMem[7]=EmptyRAM; break; - case 0x10: RdMem[6]=BASICROM+0x4000;RdMem[7]=BASICROM+0x6000; break; - case 0x20: RdMem[6]=CurKANJIROM;RdMem[7]=CurKANJIROM+0x2000; break; - case 0x30: RdMem[6]=RdMem[7]=EXTROM2; break; - case 0x40: RdMem[6]=RdMem[7]=EXTROM1; break; - case 0x50: RdMem[6]=CurKANJIROM;RdMem[7]=BASICROM+0x6000; break; - case 0x60: RdMem[6]=BASICROM+0x4000;RdMem[7]=CurKANJIROM+0x2000; break; - case 0x70: RdMem[6]=EXTROM1;RdMem[7]=EXTROM2; break; - case 0x80: RdMem[6]=EXTROM2;RdMem[7]=EXTROM1; break; - case 0x90: RdMem[6]=EXTROM2;RdMem[7]=BASICROM+0x6000; break; - case 0xa0: RdMem[6]=BASICROM+0x4000;RdMem[7]=EXTROM2; break; - case 0xb0: RdMem[6]=EXTROM1;RdMem[7]=CurKANJIROM+0x2000; break; - case 0xc0: RdMem[6]=CurKANJIROM;RdMem[7]=EXTROM1; break; - case 0xd0: RdMem[6]=RAM+0xc000;RdMem[7]=RAM+0xe000; break; -#if defined(_PC6601SR) || defined(_PC6001MK2SR) - case 0xe0: if (EXTRAM) {RdMem[6]=EXTRAM+0xc000;RdMem[7]=EXTRAM+0xe000; break;} -#else - case 0xe0: RdMem[6]=RdMem[7]=EmptyRAM; break; -#endif - case 0xf0: RdMem[6]=RdMem[7]=EmptyRAM; break; - }; - break; - case 0xF2: // write ram block set - if (static_cast(vm)->sr_mode) return; /* sr_mode do nothing! */ - if (data & 0x40) {EnWrite[3]=1;WrMem[6]=RAM+0xc000;WrMem[7]=RAM+0xe000;} - else EnWrite[3]=0; - if (data & 0x010) {EnWrite[2]=1;WrMem[4]=RAM+0x8000;WrMem[5]=RAM+0xa000;} - else EnWrite[2]=0; - if (data & 0x04) {EnWrite[1]=1;WrMem[2]=RAM+0x4000;WrMem[3]=RAM+0x6000;} - else EnWrite[1]=0; - if (data & 0x01) {EnWrite[0]=1;WrMem[0]=RAM;WrMem[1]=RAM+0x2000;} - else EnWrite[0]=0; -#if defined(_PC6601SR) || defined(_PC6001MK2SR) - if (EXTRAM) { - if (Value&0x80) {EnWrite[3]=2;WrMem[6]=EXTRAM+0xc000;WrMem[7]=EXTRAM+0xe000;} - if (Value&0x20) {EnWrite[2]=2;WrMem[4]=EXTRAM+0x8000;WrMem[5]=EXTRAM+0xa000;} - if (Value&0x08) {EnWrite[1]=2;WrMem[2]=EXTRAM+0x4000;WrMem[3]=EXTRAM+0x6000;} - if (Value&0x02) {EnWrite[0]=2;WrMem[0]=EXTRAM+0x0000;WrMem[1]=EXTRAM+0x2000;} - } -#endif - break; -#endif } return; } -#ifndef _PC6001 -uint32_t MEMORY::read_io8(uint32_t addr) -{ - uint16_t port=(addr & 0x00ff); - uint8_t Value=0xff; - - switch(port) - { -#if defined(_PC6601SR) || defined(_PC6001MK2SR) - case 0x60:case 0x61:case 0x62:case 0x63:case 0x64:case 0x65:case 0x66:case 0x67: - case 0x68:case 0x69:case 0x6a:case 0x6b:case 0x6c:case 0x6d:case 0x6e:case 0x6f: - Value=port60[ port-0x60 ]; - break; - case 0xC0: Value=0xff;break; - case 0xC2: Value=0xff;break; -#endif - case 0xF0: if (!static_cast(vm)->sr_mode) Value=portF0;break; - case 0xF1: if (!static_cast(vm)->sr_mode) Value=portF1;break; - } - return(Value); -} -#endif - void MEMORY::write_io8w(uint32_t addr, uint32_t data, int* wait) { *wait = (addr & 0xf0) == 0xa0 ? 1 : 0; @@ -683,29 +154,12 @@ uint32_t MEMORY::read_io8w(uint32_t addr, int* wait) void MEMORY::event_vline(int v, int clock) { -#if defined(_PC6601SR) || defined(_PC6001MK2SR) - if(static_cast(vm)->sr_mode) { - if(v == (CRTMode1 ? 200 : 192)) { - d_timer->write_signal(SIG_TIMER_IRQ_VRTC, 1, 1); - } - if(!CRTKILL) { - // SRƒ‚[ƒh‚ÌBUSRQ‚ɂ‚¢‚ẮA‚¦‚Ñ‚·—l‚̏î•ñ‘Ò‚¿ - } - } else -#endif { if (!CRTKILL) { -#ifdef _PC6001 if (v < 192) { d_cpu->write_signal(SIG_CPU_BUSREQ, 1, 1); register_event_by_clock(this, EVENT_HBLANK, (uint64_t)((double)CPU_CLOCKS / FRAMES_PER_SEC / LINES_PER_FRAME * 296 / 455), false, NULL); } -#else - if (v < (CRTMode1 ? 200 : 192)) { - d_cpu->write_signal(SIG_CPU_BUSREQ, 1, 1); - register_event_by_clock(this, EVENT_HBLANK, (uint64_t)((double)CPU_CLOCKS / FRAMES_PER_SEC / LINES_PER_FRAME * (CRTMode1 ? 368 : 304) / 456), false, NULL); - } -#endif } } } @@ -720,19 +174,11 @@ void MEMORY::event_callback(int event_id, int err) void MEMORY::write_signal(int id, uint32_t data, uint32_t mask) { if(id == SIG_MEMORY_PIO_PORT_C) { -#ifdef _PC6001 if(data & 4) { CGSW93=0;RdMem[3]=EXTROM2; } else { CGSW93=1; RdMem[3]=CGROM1; } -#else - if(data & 4) { - CGSW93=0; if (!static_cast(vm)->sr_mode) write_io8(0xf0, portF0); - } else { - CGSW93=1; RdMem[3]=CGROM; - } -#endif CRTKILL = (data & 2) ? 0 : 1; if (CRTKILL) { d_cpu->write_signal(SIG_CPU_BUSREQ, 0, 0); @@ -751,7 +197,6 @@ void MEMORY::open_cart(const _TCHAR* file_path) EnWrite[1]=0; inserted = true; } else { -/// EXTROM1 = EXTROM2 = EmptyRAM; EXTROM1 = RAM + 0x4000; EXTROM2 = RAM + 0x6000; EnWrite[1]=1; @@ -762,14 +207,13 @@ void MEMORY::open_cart(const _TCHAR* file_path) void MEMORY::close_cart() { -/// EXTROM1 = EXTROM2 = EmptyRAM; EXTROM1 = RAM + 0x4000; EXTROM2 = RAM + 0x6000; EnWrite[1]=1; inserted = false; } -#define STATE_VERSION 1 +#define STATE_VERSION 2 bool MEMORY::process_state(FILEIO* state_fio, bool loading) { @@ -802,46 +246,6 @@ bool MEMORY::process_state(FILEIO* state_fio, bool loading) state_fio->StateArray(EnWrite, sizeof(EnWrite), 1); state_fio->StateValue(CGSW93); state_fio->StateValue(inserted); -#ifndef _PC6001 - state_fio->StateValue(CRTKILL); - if(loading) { - CurKANJIROM = MEMORY_BASE + state_fio->FgetInt32_LE(); - } else { - state_fio->FputInt32_LE((int)(CurKANJIROM - MEMORY_BASE)); - } - state_fio->StateValue(CRTMode1); - state_fio->StateValue(CRTMode2); - state_fio->StateValue(CRTMode3); - state_fio->StateValue(CSS1); - state_fio->StateValue(CSS2); - state_fio->StateValue(CSS3); - state_fio->StateValue(portF0); - state_fio->StateValue(portF1); -#if defined(_PC6601SR) || defined(_PC6001MK2SR) - state_fio->StateValue(bitmap); - state_fio->StateValue(cols); - state_fio->StateValue(rows); - state_fio->StateValue(lines); - if(loading) { - TEXTVRAM = MEMORY_BASE + state_fio->FgetInt32_LE(); - SYSROM2 = MEMORY_BASE + state_fio->FgetInt32_LE(); - } else { - state_fio->FputInt32_LE((int)(TEXTVRAM - MEMORY_BASE)); - state_fio->FputInt32_LE((int)(SYSROM2 - MEMORY_BASE)); - } - state_fio->StateArray(EXTRAM, EXTRAM_SIZE, 1); - state_fio->StateArray(port60, sizeof(port60), 1); - state_fio->StateValue(portC1); - state_fio->StateValue(portC8); - state_fio->StateValue(portCA); - state_fio->StateValue(portCB); - state_fio->StateValue(portCC); - state_fio->StateValue(portCE); - state_fio->StateValue(portCF); - state_fio->StateArray(palet, sizeof(palet), 1); -#endif -#endif return true; } - } diff --git a/source/src/vm/pc6001/memory.h b/source/src/vm/pc6001/memory.h index 8696b86fe..a92e52307 100644 --- a/source/src/vm/pc6001/memory.h +++ b/source/src/vm/pc6001/memory.h @@ -1,9 +1,3 @@ -// -// refresh screen by Koichi Nishida 2006 -// based on Marat Fayzullin's fMSX -// and Hiroshi Ishioka's iP6 -// - /* NEC PC-6001 Emulator 'yaPC-6001' NEC PC-6001mkII Emulator 'yaPC-6201' @@ -26,12 +20,6 @@ #define SIG_MEMORY_PIO_PORT_C 0 -#ifndef _PC6001 -namespace PC6001 { - class TIMER; -} -#endif - // memory offset #define RAM_BASE 0 #define RAM_SIZE 0x10000 @@ -43,29 +31,8 @@ namespace PC6001 { #define CGROM1_SIZE 0x4000 #define EmptyRAM_BASE (CGROM1_BASE + CGROM1_SIZE) #define EmptyRAM_SIZE 0x2000 -#if defined(_PC6001) + #define MEMORY_SIZE (EmptyRAM_BASE + EmptyRAM_SIZE) -#endif -#define VOICEROM_BASE (EmptyRAM_BASE + EmptyRAM_SIZE) -#define VOICEROM_SIZE 0x4000 -#define KANJIROM_BASE (VOICEROM_BASE + VOICEROM_SIZE) -#define KANJIROM_SIZE 0x8000 -#define CGROM5_BASE (KANJIROM_BASE + KANJIROM_SIZE) -#define CGROM5_SIZE 0x2000 -#if defined(_PC6601) || defined(_PC6001MK2) -#define MEMORY_SIZE (CGROM5_BASE + CGROM5_SIZE) -#endif -#define EXTRAM_BASE (CGROM5_BASE + CGROM5_SIZE) -#define EXTRAM_SIZE 0x10000 -#define SYSTEMROM1_BASE (EXTRAM_BASE + EXTRAM_SIZE) -#define SYSTEMROM1_SIZE 0x10000 -#define SYSTEMROM2_BASE (SYSTEMROM1_BASE + SYSTEMROM1_SIZE) -#define SYSTEMROM2_SIZE 0x10000 -#define CGROM6_BASE (SYSTEMROM2_BASE + SYSTEMROM2_SIZE) -#define CGROM6_SIZE 0x8000 -#if defined(_PC6601SR) || defined(_PC6001MK2SR) -#define MEMORY_SIZE (CGROM6_BASE + CGROM6_SIZE) -#endif namespace PC6001 { @@ -73,100 +40,17 @@ class MEMORY : public DEVICE { private: DEVICE *d_cpu; -#ifndef _PC6001 - PC6001::TIMER *d_timer; -#endif uint8_t MEMORY_BASE[MEMORY_SIZE]; -// uint8_t RAM[0x10000]; -// uint8_t EXTROM[0x4000]; // CURRENT EXTEND ROM -// uint8_t BASICROM[0x8000]; // BASICROM uint8_t *CGROM; -// uint8_t CGROM1[0x4000]; // CGROM1 uint8_t *EXTROM1; // EXTEND ROM 1 uint8_t *EXTROM2; // EXTEND ROM 2 uint8_t *RdMem[8]; // READ MEMORY MAPPING ADDRESS uint8_t *WrMem[8]; // WRITE MEMORY MAPPING ADDRESS uint8_t *VRAM; -// uint8_t EmptyRAM[0x2000]; uint8_t EnWrite[4]; // MEMORY MAPPING WRITE ENABLE [N60/N66] uint8_t CGSW93; bool inserted; uint8_t CRTKILL; -#ifndef _PC6001 -// uint8_t VOICEROM[0x4000]; -// uint8_t KANJIROM[0x8000]; - uint8_t *CurKANJIROM; -// uint8_t CGROM5[0x2000]; // CGROM5 - uint8_t CRTMode1,CRTMode2,CRTMode3; - uint8_t CSS1,CSS2,CSS3; - uint8_t portF0; - uint8_t portF1; - uint8_t* dest; - scrntype_t palette_pc[16]; - int BPal[16],BPal11[4],BPal12[8],BPal13[8],BPal14[4],BPal15[8],BPal53[32],BPal61[16],BPal62[32]; - uint8_t W; -#if defined(_PC6601SR) || defined(_PC6001MK2SR) - int bitmap; - int cols; // text cols - int rows; // text rows - int lines; - uint8_t *TEXTVRAM; - uint8_t *SYSROM2; -// uint8_t CGROM6[0x8000]; // CGROM6 -// uint8_t SYSTEMROM1[0x10000]; // SYSTEMROM1 -// uint8_t SYSTEMROM2[0x10000]; // SYSTEMROM2 -// uint8_t EXTRAM[0x10000]; - uint8_t port60[16]; - uint8_t portC1; //I/O[C1] CRT CONTROLLER MODE - uint8_t portC8; //I/O[C8] CRT CONTROLLER TYPE - uint8_t portCA; //I/O[CA] X GEOMETORY low HARDWARE SCROLL - uint8_t portCB; //I/O[CB] X GEOMETORY high HARDWARE SCROLL - uint8_t portCC; //I/O[CC] Y GEOMETORY HARDWARE SCROLL - uint8_t portCE; //I/O[CE] LINE SETTING BITMAP (low) */ - uint8_t portCF; //I/O[CF] LINE SETTING BITMAP (High) */ - int palet[16]; // SR PALET - uint8_t screen[204][640]; -#else - uint8_t screen[200][320]; -#endif - - void RefreshScr10(); - void RefreshScr11(); - void RefreshScr13(); - void RefreshScr13a(); - void RefreshScr13b(); - void RefreshScr13c(); - void RefreshScr13d(); - void RefreshScr13e(); - void RefreshScr51(); - void RefreshScr53(); - void RefreshScr54(); -#if defined(_PC6601SR) || defined(_PC6001MK2SR) - void RefreshScr61(); - void RefreshScr62(); - void RefreshScr63(); - void __FASTCALL do_palet(int dest,int src); - void make_semigraph(void); - int __FASTCALL chk_gvram(uint32_t A,int flag); - uint8_t __FASTCALL gvram_read(uint32_t A); - void __FASTCALL gvram_write(uint32_t A, uint32_t V); -#endif -#endif - - // Pointer Values - int tmp_cgrom_ptr; - int tmp_extrom1_ptr; - int tmp_extrom2_ptr; - int tmp_rdmem_ptr[8]; - int tmp_wrmem_ptr[8]; - int tmp_vram_ptr; -#ifndef _PC6001 - int tmp_kanjirom_ptr; -#if defined(_PC6601SR) || defined(_PC6001MK2SR) - int tmp_textvram_ptr; - int tmp_sysrom2_ptr; -#endif -#endif public: MEMORY(VM_TEMPLATE* parent_vm, EMU_TEMPLATE* parent_emu) : DEVICE(parent_vm, parent_emu) @@ -185,9 +69,6 @@ public: uint32_t __FASTCALL read_data8w(uint32_t addr, int *wait); uint32_t __FASTCALL fetch_op(uint32_t addr, int *wait); void __FASTCALL write_io8(uint32_t addr, uint32_t data); -#ifndef _PC6001 - uint32_t __FASTCALL read_io8(uint32_t addr); -#endif void __FASTCALL write_io8w(uint32_t addr, uint32_t data, int* wait); uint32_t __FASTCALL read_io8w(uint32_t addr, int* wait); void event_vline(int v, int clock); @@ -196,19 +77,10 @@ public: bool process_state(FILEIO* state_fio, bool loading); // unique functions -#ifndef _PC6001 - void draw_screen(); -#endif void set_context_cpu(DEVICE* device) { d_cpu = device; } -#ifndef _PC6001 - void set_context_timer(PC6001::TIMER* device) - { - d_timer = device; - } -#endif void open_cart(const _TCHAR* file_path); void close_cart(); bool is_cart_inserted() @@ -219,12 +91,6 @@ public: { return MEMORY_BASE + RAM_BASE; } -#ifndef _PC6001 - int get_CRTMode2() - { - return CRTMode2; - } -#endif }; } diff --git a/source/src/vm/pc6001/memory_draw.cpp b/source/src/vm/pc6001/memory_draw.cpp deleted file mode 100644 index 455325e74..000000000 --- a/source/src/vm/pc6001/memory_draw.cpp +++ /dev/null @@ -1,699 +0,0 @@ -/** iP6: PC-6000/6600 series emualtor ************************/ -/** **/ -/** Refresh.c **/ -/** **/ -/** modified by Windy 2002-2004 **/ -/** by ISHIOKA Hiroshi 1998,1999 **/ -/** This code is based on fMSX written by Marat Fayzullin **/ -/** and Adaptions for any X-terminal by Arnold Metselaar **/ -/*************************************************************/ - -/* - NEC PC-6001 Emulator 'yaPC-6001' - NEC PC-6001mkII Emulator 'yaPC-6201' - NEC PC-6001mkIISR Emulator 'yaPC-6401' - NEC PC-6601 Emulator 'yaPC-6601' - NEC PC-6601SR Emulator 'yaPC-6801' - - Author : tanam - Date : 2013.07.15- - - [ draw ] -*/ - -#include "memory.h" - -#define CGROM1 (MEMORY_BASE + CGROM1_BASE) -#define CGROM5 (MEMORY_BASE + CGROM5_BASE) -#define CGROM6 (MEMORY_BASE + CGROM6_BASE) - -#define SETSCRVARM1(y1) dest = &screen[y1][0];W=0; -#define SETSCRVARM5(y1) dest = &screen[y1][0];W=0; -#define M1HEIGHT 192 -#define M5HEIGHT 200 -#define M6HEIGHT 204 -#define SeqPix21(c) dest[X*8+W]=c;W++; -#define SeqPix41(c) dest[X*8+W]=c;W++;dest[X*8+W]=c;W++; - -namespace PC6001 { - -void MEMORY::draw_screen() -{ - if (CRTKILL) { - for(int y = 0; y < 400; y++) { - scrntype_t* dest = emu->get_screen_buffer(y); - memset(dest, 0, 640 * sizeof(scrntype_t)); - } -#if defined(_PC6601SR) || defined(_PC6001MK2SR) - } else if (static_cast(vm)->sr_mode) { - if (CRTMode2) { - if (CRTMode3) RefreshScr63(); - else RefreshScr62(); - } else RefreshScr61(); - // copy to screen - emu->set_vm_screen_lines(200); - if (bitmap) { - for(int y = 0; y < 200; y++) { - scrntype_t* dest = emu->get_screen_buffer(y*2); - scrntype_t* dest1 = emu->get_screen_buffer(y*2+1); - for(int x = 0; x < 320; x++) { - dest[x*2] = dest[x*2+1] = palette_pc[screen[y][x*2]]; - } - if(config.scan_line) { - memset(dest1, 0, 640 * sizeof(scrntype_t)); - } else { - my_memcpy(dest1, dest, 640 * sizeof(scrntype_t)); - } - } - } else if (cols==40) { - for(int y = 0; y < 200; y++) { - scrntype_t* dest = emu->get_screen_buffer(y*2); - scrntype_t* dest1 = emu->get_screen_buffer(y*2+1); - for(int x = 0; x < 320; x++) { - dest[x*2] = dest[x*2+1] = palette_pc[screen[y][x]]; - } - if(config.scan_line) { - memset(dest1, 0, 640 * sizeof(scrntype_t)); - } else { - my_memcpy(dest1, dest, 640 * sizeof(scrntype_t)); - } - } - } else { - for(int y = 0; y < 200; y++) { - scrntype_t* dest = emu->get_screen_buffer(y*2); - scrntype_t* dest1 = emu->get_screen_buffer(y*2+1); - for(int x = 0; x < 640; x++) { - dest[x] = palette_pc[screen[y][x]]; - } - if(config.scan_line) { - memset(dest1, 0, 640 * sizeof(scrntype_t)); - } else { - my_memcpy(dest1, dest, 640 * sizeof(scrntype_t)); - } - } - } -#endif - } else { - if (CRTMode1) { - if (CRTMode2) - if (CRTMode3) RefreshScr54(); - else RefreshScr53(); - else RefreshScr51(); - // copy to screen - emu->set_vm_screen_lines(200); - for(int y = 0; y < 200; y++) { - scrntype_t* dest = emu->get_screen_buffer(y*2); - scrntype_t* dest1 = emu->get_screen_buffer(y*2+1); - for(int x = 0; x < 320; x++) { - dest[x*2] = dest[x*2+1] = palette_pc[screen[y][x]]; - } - if(config.scan_line) { - memset(dest1, 0, 640 * sizeof(scrntype_t)); - } else { - my_memcpy(dest1, dest, 640 * sizeof(scrntype_t)); - } - } - } else { - RefreshScr10(); - // copy to screen - emu->set_vm_screen_lines(200); - for(int y = 0; y < 200; y++) { - scrntype_t* dest = emu->get_screen_buffer(y*2); - scrntype_t* dest1 = emu->get_screen_buffer(y*2+1); - for(int x = 0; x < 320; x++) { - if (x >= 32 && x < 288 && y >=4 && y < 196) { - dest[x*2] = dest[x*2+1] = palette_pc[screen[y-4][x-32]]; - } else { - dest[x*2] = dest[x*2+1] = palette_pc[8]; - } - } - if(config.scan_line) { - memset(dest1, 0, 640 * sizeof(scrntype_t)); - } else { - my_memcpy(dest1, dest, 640 * sizeof(scrntype_t)); - } - } - } - } - emu->screen_skip_line(true); -} - -// RefreshScr10: N60-BASIC select function -void MEMORY::RefreshScr10() -{ - if ((*VRAM&0x80) == 0x00) - RefreshScr11(); - else - switch (*(VRAM)&0x1C) { - case 0x00: case 0x10: // 64x 64 color / 128x 64 - RefreshScr13a(); break; - case 0x08: // 128x 64 color - RefreshScr13b(); break; - case 0x18: // 128x 96 - RefreshScr13c(); break; - case 0x04: // 128x 96 color - RefreshScr13d(); break; - case 0x14: // 128x192 - RefreshScr13e(); break; - default: // 128x192 color / 256x192 - RefreshScr13(); break; - } -} - -// RefreshScr11: N60-BASIC screen 1,2 -void MEMORY::RefreshScr11() -{ - uint8_t X,Y,K; - int FC,BC; - uint8_t *S,*T1,*T2; - uint8_t *G; - - G = CGROM; /* CGROM */ - T1 = VRAM; /* attribute data */ - T2 = VRAM+0x0200; /* ascii/semi-graphic data */ - for(Y=0; Y>6]; BC = BPal[8]; - } else { /* semi-graphic 4 */ - S = G+((*T2&0x0f)<<4)+0x2000; - FC = BPal12[(*T2&0x70)>>4]; BC = BPal[8]; - } - } else { /* if normal character */ - S = G+((*T2)<<4); - FC = BPal11[(*T1&0x03)]; BC = BPal11[(*T1&0x03)^0x01]; - } - K=*(S+Y%12); -W=0; - SeqPix21(K&0x80? FC:BC); SeqPix21(K&0x40? FC:BC); - SeqPix21(K&0x20? FC:BC); SeqPix21(K&0x10? FC:BC); - SeqPix21(K&0x08? FC:BC); SeqPix21(K&0x04? FC:BC); - SeqPix21(K&0x02? FC:BC); SeqPix21(K&0x01? FC:BC); - } - if (Y%12!=11) { T1-=32; T2-=32; } - } -} - -// RefreshScr13: N60-BASIC screen 3,4 -void MEMORY::RefreshScr13() -{ - uint8_t X,Y; - uint8_t *T1,*T2; - uint8_t attr; - - T1 = VRAM; /* attribute data */ - T2 = VRAM+0x0200; /* graphic data */ - for (Y=0; Y>7]); - SeqPix21(BPal14[attr|(*T2&0x40)>>6]); - SeqPix21(BPal14[attr|(*T2&0x20)>>5]); - SeqPix21(BPal14[attr|(*T2&0x10)>>4]); - SeqPix21(BPal14[attr|(*T2&0x08)>>3]); - SeqPix21(BPal14[attr|(*T2&0x04)>>2]); - SeqPix21(BPal14[attr|(*T2&0x02)>>1]); - SeqPix21(BPal14[attr|(*T2&0x01) ]); - } else { /* 128x192 color (SCREEN 3) */ - attr = (*T1&0x02)<<1; -W=0; - SeqPix41(BPal13[attr|(*T2&0xC0)>>6]); - SeqPix41(BPal13[attr|(*T2&0x30)>>4]); - SeqPix41(BPal13[attr|(*T2&0x0C)>>2]); - SeqPix41(BPal13[attr|(*T2&0x03) ]); - } - } - if (T1 == VRAM+0x200) T1=VRAM; - } -} - -// RefreshScr13a: N60-BASIC screen 3,4 -void MEMORY::RefreshScr13a() /* 64x 64 color / 128x 64 */ -{ - uint8_t X,Y; - uint8_t *T1,*T2; - uint8_t attr; - int L; - - T1 = VRAM; /* attribute data */ - T2 = VRAM+0x0200; /* graphic data */ - for (Y=0; Y>7]); - SeqPix41(BPal14[attr|(*T2&0x40)>>6]); - SeqPix41(BPal14[attr|(*T2&0x20)>>5]); - SeqPix41(BPal14[attr|(*T2&0x10)>>4]); - SeqPix41(BPal14[attr|(*T2&0x08)>>3]); - SeqPix41(BPal14[attr|(*T2&0x04)>>2]); - SeqPix41(BPal14[attr|(*T2&0x02)>>1]); - SeqPix41(BPal14[attr|(*T2&0x01) ]); - } else { /* 64x 64 color */ - attr = (*T1&0x02)<<1; -W=0; - SeqPix41(L=BPal13[attr|(*T2&0xC0)>>6]); - SeqPix41(L); - SeqPix41(L=BPal13[attr|(*T2&0x30)>>4]); - SeqPix41(L); - SeqPix41(L=BPal13[attr|(*T2&0x0C)>>2]); - SeqPix41(L); - SeqPix41(L=BPal13[attr|(*T2&0x03) ]); - SeqPix41(L); - } - } - if (Y%3 != 2) { T1-=16; T2-=16; } - else if (T1 == VRAM+0x200) T1=VRAM; - } -} - -// RefreshScr13b: N60-BASIC screen 3,4 -void MEMORY::RefreshScr13b() /* 128x 64 color */ -{ - uint8_t X,Y; - uint8_t *T1,*T2; - uint8_t attr; - - T1 = VRAM; /* attribute data */ - T2 = VRAM+0x0200; /* graphic data */ - for (Y=0; Y>6]); - SeqPix41(BPal13[attr|(*T2&0x30)>>4]); - SeqPix41(BPal13[attr|(*T2&0x0C)>>2]); - SeqPix41(BPal13[attr|(*T2&0x03) ]); - } - if (Y%3 != 2) { T1-=32; T2-=32; } - else if (T1 == VRAM+0x200) T1=VRAM; - } -} - -// RefreshScr13c: N60-BASIC screen 3,4 -void MEMORY::RefreshScr13c() /* 128x 96 */ -{ - uint8_t X,Y; - uint8_t *T1,*T2; - uint8_t attr; - - T1 = VRAM; /* attribute data */ - T2 = VRAM+0x0200; /* graphic data */ - for (Y=0; Y>7]); - SeqPix41(BPal14[attr|(*T2&0x40)>>6]); - SeqPix41(BPal14[attr|(*T2&0x20)>>5]); - SeqPix41(BPal14[attr|(*T2&0x10)>>4]); - SeqPix41(BPal14[attr|(*T2&0x08)>>3]); - SeqPix41(BPal14[attr|(*T2&0x04)>>2]); - SeqPix41(BPal14[attr|(*T2&0x02)>>1]); - SeqPix41(BPal14[attr|(*T2&0x01) ]); - } - if (!(Y&1)) { T1-=16; T2-=16; } - else if (T1 == VRAM+0x200) T1=VRAM; - } -} - -// RefreshScr13d: N60-BASIC screen 3,4 -void MEMORY::RefreshScr13d() /* 128x 96 color */ -{ - uint8_t X,Y; - uint8_t *T1,*T2; - uint8_t attr; - - T1 = VRAM; /* attribute data */ - T2 = VRAM+0x0200; /* graphic data */ - for (Y=0; Y>6]); - SeqPix41(BPal13[attr|(*T2&0x30)>>4]); - SeqPix41(BPal13[attr|(*T2&0x0C)>>2]); - SeqPix41(BPal13[attr|(*T2&0x03) ]); - } - if (!(Y&1)) { T1-=32; T2-=32; } - else if (T1 == VRAM+0x200) T1=VRAM; - } -} - -// RefreshScr13e: N60-BASIC screen 3,4 -void MEMORY::RefreshScr13e() /* 128x192 */ -{ - uint8_t X,Y; - uint8_t *T1,*T2; - uint8_t attr; - - T1 = VRAM; /* attribute data */ - T2 = VRAM+0x0200; /* graphic data */ - for (Y=0; Y>7]); - SeqPix41(BPal14[attr|(*T2&0x40)>>6]); - SeqPix41(BPal14[attr|(*T2&0x20)>>5]); - SeqPix41(BPal14[attr|(*T2&0x10)>>4]); - SeqPix41(BPal14[attr|(*T2&0x08)>>3]); - SeqPix41(BPal14[attr|(*T2&0x04)>>2]); - SeqPix41(BPal14[attr|(*T2&0x02)>>1]); - SeqPix41(BPal14[attr|(*T2&0x01) ]); - } - if (T1 == VRAM+0x200) T1=VRAM; - } -} - -// RefreshScr51: N60m/66-BASIC screen 1,2 -void MEMORY::RefreshScr51() -{ - uint8_t X,Y,K; - int FC,BC; - uint8_t *S,*T1,*T2; - uint8_t *G; - - G = CGROM; /* CGROM */ - T1 = VRAM; /* attribute data */ - T2 = VRAM+0x0400; /* ascii/semi-graphic data */ - for(Y=0; Y>4)|CSS2]; - K=*(S+Y%10); -W=0; - SeqPix21(K&0x80? FC:BC); SeqPix21(K&0x40? FC:BC); - SeqPix21(K&0x20? FC:BC); SeqPix21(K&0x10? FC:BC); - SeqPix21(K&0x08? FC:BC); SeqPix21(K&0x04? FC:BC); - SeqPix21(K&0x02? FC:BC); SeqPix21(K&0x01? FC:BC); - } - if (Y%10!=9) { T1-=40; T2-=40; } - } -} - -// RefreshScr53: N60m/66-BASIC screen 3 -void MEMORY::RefreshScr53() -{ - uint8_t X,Y; - uint8_t *T1,*T2; - - T1 = VRAM; /* attribute data */ - T2 = VRAM+0x2000; /* graphic data */ - for(Y=0; Y>6|((*T2)&0xC0)>>4]); - SeqPix41(BPal53[CSS3|((*T1)&0x30)>>4|((*T2)&0x30)>>2]); - SeqPix41(BPal53[CSS3|((*T1)&0x0C)>>2|((*T2)&0x0C) ]); - SeqPix41(BPal53[CSS3|((*T1)&0x03) |((*T2)&0x03)<<2]); - T1++; T2++; - } - } -} - -// RefreshScr54: N60m/66-BASIC screen 4 -void MEMORY::RefreshScr54() -{ - uint8_t X,Y; - uint8_t *T1,*T2; - uint8_t cssor; - - T1 = VRAM; /* attribute data */ - T2 = VRAM+0x2000; /* graphic data */ - /* CSS OR */ - cssor = CSS3|CSS2|CSS1; - for(Y=0; Y>7|((*T2)&0x80)>>6]); - SeqPix21(BPal53[cssor|((*T1)&0x40)>>6|((*T2)&0x40)>>5]); - SeqPix21(BPal53[cssor|((*T1)&0x20)>>5|((*T2)&0x20)>>4]); - SeqPix21(BPal53[cssor|((*T1)&0x10)>>4|((*T2)&0x10)>>3]); - SeqPix21(BPal53[cssor|((*T1)&0x08)>>3|((*T2)&0x08)>>2]); - SeqPix21(BPal53[cssor|((*T1)&0x04)>>2|((*T2)&0x04)>>1]); - SeqPix21(BPal53[cssor|((*T1)&0x02)>>1|((*T2)&0x02) ]); - SeqPix21(BPal53[cssor|((*T1)&0x01) |((*T2)&0x01)<<1]); - T1++;T2++; - } - } -} - -#if defined(_PC6601SR) || defined(_PC6001MK2SR) -// RefreshScr61: N66-SR BASIC screen 1 -void MEMORY::RefreshScr61() -{ - uint8_t X,Y,K; - register int FC,BC; - uint8_t *S,*T1,*T2; - uint8_t *G; - int high; - int addr; - int semi_addr; - - G = CGROM; /* CGROM */ - T1 = TEXTVRAM+1; /* attribute data */ - T2 = TEXTVRAM; /* ascii/semi-graphic data */ - high= (rows==20)? 10:8; /* charactor's high SR BASIC 2002/2/23 */ - addr= (rows==20)? 0x2000: 0x1000; /* CGROM address SR BASIC 2002/2/23 */ - semi_addr= (rows==20)? 0x3000: 0x4000; /* semi address 2003/7/8 */ - for(Y=0; Y>4) |CSS2]; - K=*(S+Y%high); /* character high 2002/2/23 */ - SeqPix21(K&0x80? FC:BC); SeqPix21(K&0x40? FC:BC); - SeqPix21(K&0x20? FC:BC); SeqPix21(K&0x10? FC:BC); - SeqPix21(K&0x08? FC:BC); SeqPix21(K&0x04? FC:BC); - SeqPix21(K&0x02? FC:BC); SeqPix21(K&0x01? FC:BC); - } - if (Y% high!=high-1) { T1-=cols*2; T2-=cols*2; } /* character high 2002/2/23 */ - } -} - -// RefreshScr62 N66-SR BASIC screen 2 -void MEMORY::RefreshScr62() -{ - uint8_t X,Y; - uint8_t *T1,*T2; - T1 = VRAM+ 0x1a00; - T2 = VRAM; - for(Y=0; Y>4 ]); - T1++; - SeqPix41(BPal53[ CSS3|((*T1)&0x0f) ]); - SeqPix41(BPal53[ CSS3|((*T1)&0xf0)>>4 ]); - T1+=3; - } - for(X=64 ;X<80 ; X++) { -W=0; - SeqPix41(BPal53[ CSS3|((*T2)&0x0f) ]); - SeqPix41(BPal53[ CSS3|((*T2)&0xf0)>>4 ]); - T2++; - SeqPix41(BPal53[ CSS3|((*T2)&0x0f) ]); - SeqPix41(BPal53[ CSS3|((*T2)&0xf0)>>4 ]); - T2+=3; - } - if( (Y & 1)==0) - { T1-=(254); T2-=(62);} - else - { T1-=2; T2-=2; } - } -} - -// RefreshScr63 N66-SR BASIC screen 3 -void MEMORY::RefreshScr63() -{ - uint8_t X,Y; - uint8_t *T1,*T2; - uint8_t cssor; - - T1 = VRAM+ 0x1a00; - T2 = VRAM; - cssor = CSS3|CSS2|CSS1; - for(Y=0; Y>7|((*(T1+1))&0x80)>>6]); - SeqPix41(BPal53[cssor|((*T1)&0x40)>>6|((*(T1+1))&0x40)>>5]); - SeqPix41(BPal53[cssor|((*T1)&0x20)>>5|((*(T1+1))&0x20)>>4]); - SeqPix41(BPal53[cssor|((*T1)&0x10)>>4|((*(T1+1))&0x10)>>3]); - SeqPix41(BPal53[cssor|((*T1)&0x08)>>3|((*(T1+1))&0x08)>>2]); - SeqPix41(BPal53[cssor|((*T1)&0x04)>>2|((*(T1+1))&0x04)>>1]); - SeqPix41(BPal53[cssor|((*T1)&0x02)>>1|((*(T1+1))&0x02) ]); - SeqPix41(BPal53[cssor|((*T1)&0x01) |((*(T1+1))&0x01)<<1]); - T1+=4; - } - for(X=64 ;X<80 ; X++) { -W=0; - SeqPix41(BPal53[cssor|((*T2)&0x80)>>7|((*(T2+1))&0x80)>>6]); - SeqPix41(BPal53[cssor|((*T2)&0x40)>>6|((*(T2+1))&0x40)>>5]); - SeqPix41(BPal53[cssor|((*T2)&0x20)>>5|((*(T2+1))&0x20)>>4]); - SeqPix41(BPal53[cssor|((*T2)&0x10)>>4|((*(T2+1))&0x10)>>3]); - SeqPix41(BPal53[cssor|((*T2)&0x08)>>3|((*(T2+1))&0x08)>>2]); - SeqPix41(BPal53[cssor|((*T2)&0x04)>>2|((*(T2+1))&0x04)>>1]); - SeqPix41(BPal53[cssor|((*T2)&0x02)>>1|((*(T2+1))&0x02) ]); - SeqPix41(BPal53[cssor|((*T2)&0x01) |((*(T2+1))&0x01)<<1]); - T2+=4; - } - if( (Y & 1)==0) - { T1-=(254); T2-=(62);} - else - { T1-=2; T2-=2; } - } -} - -void MEMORY::do_palet(int dest,int src) -{ - int textpalet2[16]={0,4,1,5,2,6,3,7,8,12,9,13,10,14,11,15}; /* color code-> VRAM code*/ - // *************** for RefreshScr 53/54/62/63 *************************** - if ((CSS3 & 0x10) ==0 ) // CSS3 =0 - { - if(dest>=0 && dest<32 && src>=0 && src<32) - { - BPal53[dest]= BPal62[src]; - } - } else { // CSS3 =1 - if (dest>=0 && dest<32 && src>=0 && src<32) - { - int dest1,dest2; - switch( dest+1) - { - case 16: dest1 =13; dest2 = 5; break; - case 15: dest1 =10; dest2 = 2; break; - case 14: dest1 =14; dest2 = 6; break; - case 13: dest1 = 1; dest2 = 9; break; - } - BPal53[16+dest1-1]= BPal62[src]; - BPal53[16+dest2-1]= BPal62[src]; - } - } - // ************** for RefreshScr51/61 ************************** - if(dest>=0 && dest<16 && src>=0 && src<16) - BPal[textpalet2[dest]]= BPal61[ textpalet2[src]]; -} - -void MEMORY::make_semigraph(void) -{ - uint8_t *P; - unsigned int i, j, m1, m2; - P = CGROM1+0x1000; - for(i=0; i<64; i++) { - for(j=0; j<16; j++) { - switch (j/4) { - case 0: m1=0x20; m2=0x10; break; - case 1: m1=0x08; m2=0x04; break; - case 2: m1=0x02; m2=0x01; break; - default: m1=m2=0; - }; - *P++=(i&m1 ? 0xF0: 0) | (i&m2 ? 0x0F: 0); - } - } - P = CGROM1+0x2000; - for(i=0; i<16; i++) { - for(j=0; j<16; j++) { - switch (j/6) { - case 0: m1=0x08; m2=0x04; break; - case 1: m1=0x02; m2=0x01; break; - default: m1=m2=0; - }; - *P++=(i&m1 ? 0xF0: 0) | (i&m2 ? 0x0F: 0); - } - } - P = CGROM6+0x4000; - for(i=0; i<256; i++) { - for(j=0; j<16; j++) { - switch (j/2) { - case 0: m1=0x80; m2=0x40; break; - case 1: m1=0x20; m2=0x10; break; - case 2: m1=0x08; m2=0x04; break; - case 3: m1=0x02; m2=0x01; break; - default: m1=m2=0; - }; - *P++=(i&m1 ? 0xF0: 0) | (i&m2 ? 0x0F: 0); - } - } -} - -int MEMORY::chk_gvram(uint32_t A,int flag) -{ - if (port60[ (A>>13)+flag ]==0x00 && bitmap) // VRAM ‚̐擪‚©‚ACRT‚ª BITMAP mode - return 1; - return 0; -} - -uint8_t MEMORY::gvram_read(uint32_t A) -{ - uint8_t* adr; - uint8_t ret; - int x,y,z,w,off; - - x = A & 0x1fff; - y = portCF*16+portCE; /* yÀ•W */ - if( y >=204) y-=204; /* YÀ•W 204 ˆÈã‚¾‚Æ 204 ˆø‚­ add 2003/10/22 */ - w = (x <256) ? 256: 64; /* width:0..255 ‚È‚ç256 / 256..319‚È‚ç 64‚É‚·‚é*/ - off=(x <256) ? 0x1a00: 0x0000; /* offset: Vram offset address */ - x = (x <256) ? x: x-256; /* x:256..319 ‚È‚ç 256‚ðˆø‚­@ */ - z = ((y & 1 )==1) ? 2: 0; /* z:YÀ•W‚ªŠï”‚È‚çA2‚ð‘«‚· */ - adr = (VRAM+ (off+ (y>>1)*w + (x&0xffc)+z)); - switch(x & 3) - { - case 0: ret= *(adr); break; - case 1: ret= *(adr)>>4; break; - case 2: ret= *(adr+1); break; - case 3: ret= *(adr+1)>>4; break; - } - return (ret); -} - -void MEMORY::gvram_write(uint32_t A, uint32_t V) -{ - uint8_t* adr; - int x,y,z,w,off; - - x = A & 0x1fff; - y = portCF*16+portCE; /* yÀ•W */ - if( y >=204) y-=204; /* YÀ•W 204 ˆÈã‚¾‚Æ 204 ˆø‚­ */ - w = (x <256) ? 256: 64; /* width:0..255 ‚È‚ç256 / 256..319‚È‚ç 64‚É‚·‚é*/ - off=(x <256) ? 0x1a00: 0x0000; /* offset: Vram offset address */ - x = (x <256) ? x: x-256; /* x:256..319 ‚È‚ç 256‚ðˆø‚­@ */ - z = ((y & 1 )==1) ? 2: 0; /* z:YÀ•W‚ªŠï”‚È‚çA2‚ð‘«‚· */ - V&= 0x0f; - adr = VRAM+(off+ (y>>1)*(w) + (x&0xffc)+z); - switch(x & 3) - { - case 0: *(adr)=(*(adr) &0xf0) |V; break; - case 1: *(adr)=(*(adr) &0x0f) |V<<4; break; - case 2: *(adr+1)=(*(adr+1)&0xf0)|V; break; - case 3: *(adr+1)=(*(adr+1)&0x0f)|V<<4; break; - } -} -#endif - -} - diff --git a/source/src/vm/pc6001/pc6001.cpp b/source/src/vm/pc6001/pc6001.cpp index 2a7ec01f1..3bd075c50 100644 --- a/source/src/vm/pc6001/pc6001.cpp +++ b/source/src/vm/pc6001/pc6001.cpp @@ -743,7 +743,7 @@ uint64_t VM::get_current_clock_uint64() return event->get_current_clock_uint64(); } -#define STATE_VERSION 7 +#define STATE_VERSION 8 bool VM::process_state(FILEIO* state_fio, bool loading) { diff --git a/source/src/vm/x1/display.cpp b/source/src/vm/x1/display.cpp index fa5ecec54..3f21b233e 100644 --- a/source/src/vm/x1/display.cpp +++ b/source/src/vm/x1/display.cpp @@ -599,11 +599,13 @@ void DISPLAY::event_frame() hz_total = regs[0] + 1; hz_disp = regs[1]; vt_disp = regs[6] & 0x7f; + vt_ofs = regs[5] & 0x1f; st_addr = (regs[12] << 8) | regs[13]; #ifdef _X1TURBO_FEATURE int vt_total = ((regs[4] & 0x7f) + 1) * ch_height + (regs[5] & 0x1f); bool hireso_old = hireso; hireso = (vt_total >= 400); + if(!hireso) vt_ofs = max(vt_ofs - 2, 0); #endif int vlen; #ifdef _X1TURBO_FEATURE @@ -889,6 +891,16 @@ void DISPLAY::draw_screen() #endif } + // total raster_adjust +#ifdef _X1TURBO_FEATURE + for(int y = 0; y < vt_ofs * (hireso ? 1 : 2); y++) { +#else + for(int y = 0; y < vt_ofs * 2; y++) { +#endif + scrntype_t* dest = emu->get_screen_buffer(y); + memset(dest, 0, 640 * sizeof(scrntype_t)); + } + // copy to real screen __DECL_ALIGNED(16) scrntype_t dbuf[640]; #ifdef _X1TURBO_FEATURE @@ -897,8 +909,8 @@ void DISPLAY::draw_screen() // emu->set_vm_screen_lines(400); if(column40) { // 40 columns - for(int y = 0; y < 400; y++) { - scrntype_t* dest = emu->get_screen_buffer(y); + for(int y = 0; (y + vt_ofs) < 400; y++) { + scrntype_t* dest = emu->get_screen_buffer(y + vt_ofs); uint8_t* src_text = dr_text[y]; #ifdef _X1TURBOZ if(dr_aen_line[y]) { @@ -930,8 +942,8 @@ __DECL_VECTORIZED_LOOP } } else { // 80 columns - for(int y = 0; y < 400; y++) { - scrntype_t* dest = emu->get_screen_buffer(y); + for(int y = 0; (y + vt_ofs) < 400; y++) { + scrntype_t* dest = emu->get_screen_buffer(y + vt_ofs); uint8_t* src_text = dr_text[y]; #ifdef _X1TURBOZ if(dr_aen_line[y]) { @@ -971,10 +983,10 @@ __DECL_VECTORIZED_LOOP if(column40) { // 40 columns - for(int y = 0; y < 200; y++) { + for(int y = 0; (y + vt_ofs) < 200; y++) { + scrntype_t* dest0 = emu->get_screen_buffer((y + vt_ofs) * 2 + 0); + scrntype_t* dest1 = emu->get_screen_buffer((y + vt_ofs) * 2 + 1); uint8_t* src_text = dr_text[y]; - scrntype_t* dest0 = emu->get_screen_buffer(y * 2 + 0); - scrntype_t* dest1 = emu->get_screen_buffer(y * 2 + 1); #ifdef _X1TURBOZ if(dr_aen_line[y]) { uint16_t* src_cg0 = dr_zcg[0][y]; @@ -1025,9 +1037,9 @@ __DECL_VECTORIZED_LOOP } } else { // 80 columns - for(int y = 0; y < 200; y++) { - scrntype_t* dest0 = emu->get_screen_buffer(y * 2 + 0); - scrntype_t* dest1 = emu->get_screen_buffer(y * 2 + 1); + for(int y = 0; (y + vt_ofs) < 200; y++) { + scrntype_t* dest0 = emu->get_screen_buffer((y + vt_ofs) * 2 + 0); + scrntype_t* dest1 = emu->get_screen_buffer((y + vt_ofs) * 2 + 1); uint8_t* src_text = dr_text[y]; #ifdef _X1TURBOZ if(aen_line[y]) { @@ -1666,7 +1678,7 @@ uint16_t DISPLAY::jis2sjis(uint16_t jis) return (c1 << 8) | c2; } -#define STATE_VERSION 5 +#define STATE_VERSION 6 bool DISPLAY::process_state(FILEIO* state_fio, bool loading) { @@ -1735,6 +1747,7 @@ bool DISPLAY::process_state(FILEIO* state_fio, bool loading) state_fio->StateValue(hz_total); state_fio->StateValue(hz_disp); state_fio->StateValue(vt_disp); + state_fio->StateValue(vt_ofs); state_fio->StateValue(st_addr); state_fio->StateValue(vblank_clock); state_fio->StateValue(cur_blank); diff --git a/source/src/vm/x1/display.h b/source/src/vm/x1/display.h index 1c56d2d41..1a4011c4f 100644 --- a/source/src/vm/x1/display.h +++ b/source/src/vm/x1/display.h @@ -117,7 +117,7 @@ private: int raster, cblink; int ch_height; // HD46505 - int hz_total, hz_disp, vt_disp; + int hz_total, hz_disp, vt_disp, vt_ofs; int st_addr; uint32_t vblank_clock; int cur_vline; diff --git a/source/src/vm/z80ctc.cpp b/source/src/vm/z80ctc.cpp index db3f0dc1d..15abcddf5 100644 --- a/source/src/vm/z80ctc.cpp +++ b/source/src/vm/z80ctc.cpp @@ -29,7 +29,8 @@ void Z80CTC::reset() counter[ch].control = 0; counter[ch].slope = false; counter[ch].prescaler = 256; - counter[ch].freeze = counter[ch].start = counter[ch].latch = false; + counter[ch].freeze = counter[ch].freezed = false; + counter[ch].start = counter[ch].latch = false; counter[ch].clock_id = counter[ch].sysclock_id = -1; counter[ch].first_constant = true; // interrupt @@ -47,10 +48,11 @@ void Z80CTC::write_io8(uint32_t addr, uint32_t data) // time constant counter[ch].constant = data ? data : 256; counter[ch].latch = false; - if(counter[ch].freeze || counter[ch].first_constant) { + if(counter[ch].freezed || counter[ch].first_constant) { counter[ch].count = counter[ch].constant; counter[ch].clocks = 0; counter[ch].freeze = false; +// counter[ch].freezed = false; counter[ch].first_constant = false; update_event(ch, 0); } @@ -60,6 +62,9 @@ void Z80CTC::write_io8(uint32_t addr, uint32_t data) counter[ch].prescaler = (data & 0x20) ? 256 : 16; counter[ch].latch = ((data & 0x04) != 0); counter[ch].freeze = ((data & 0x02) != 0); + if(counter[ch].freeze) { + counter[ch].freezed = true; + } counter[ch].start = (counter[ch].freq || !(data & 0x08)); counter[ch].control = data; counter[ch].slope = ((data & 0x10) != 0); @@ -173,6 +178,7 @@ void Z80CTC::input_clock(int ch, int clock) if(counter[ch].freeze) { return; } + counter[ch].freezed = false; // update counter counter[ch].count -= clock; @@ -196,6 +202,8 @@ void Z80CTC::input_sysclock(int ch, int clock) if(!counter[ch].start || counter[ch].freeze) { return; } + counter[ch].freezed = false; + counter[ch].clocks += clock; int input = counter[ch].clocks >> (counter[ch].prescaler == 256 ? 8 : 4); counter[ch].clocks &= counter[ch].prescaler - 1; @@ -351,7 +359,7 @@ void Z80CTC::notify_intr_reti() } } -#define STATE_VERSION 1 +#define STATE_VERSION 2 bool Z80CTC::process_state(FILEIO* state_fio, bool loading) { @@ -370,6 +378,7 @@ bool Z80CTC::process_state(FILEIO* state_fio, bool loading) state_fio->StateValue(counter[i].clocks); state_fio->StateValue(counter[i].prescaler); state_fio->StateValue(counter[i].freeze); + state_fio->StateValue(counter[i].freezed); state_fio->StateValue(counter[i].start); state_fio->StateValue(counter[i].latch); state_fio->StateValue(counter[i].prev_in); diff --git a/source/src/vm/z80ctc.h b/source/src/vm/z80ctc.h index e9b6a6211..a7e39e63e 100644 --- a/source/src/vm/z80ctc.h +++ b/source/src/vm/z80ctc.h @@ -31,6 +31,7 @@ private: int clocks; int prescaler; bool freeze; + bool freezed; bool start; bool latch; bool prev_in; diff --git a/source/src/vm/z80dma.cpp b/source/src/vm/z80dma.cpp index 5dc2d862b..ec632c3da 100644 --- a/source/src/vm/z80dma.cpp +++ b/source/src/vm/z80dma.cpp @@ -115,7 +115,6 @@ void Z80DMA::initialize() DEVICE::initialize(); _SINGLE_MODE_DMA = osd->check_feature(_T("SINGLE_MODE_DMA")); _DMA_DEBUG = osd->check_feature(_T("DMA_DEBUG")); - _X1TURBO_FEATURE = osd->check_feature(_T("_X1TURBO_FEATURE")); // _DMA_DEBUG = true; // TMP if(d_debugger != NULL) { d_debugger->set_device_name(_T("Debugger (Z80DMA)")); diff --git a/source/src/vm/z80dma.h b/source/src/vm/z80dma.h index c7ef4e10d..2bece9e06 100644 --- a/source/src/vm/z80dma.h +++ b/source/src/vm/z80dma.h @@ -60,7 +60,7 @@ private: bool _SINGLE_MODE_DMA; bool _DMA_DEBUG; - bool _X1TURBO_FEATURE; + bool now_ready(); void request_bus(); void release_bus(); diff --git a/source/vc++2008/bx1.vcproj b/source/vc++2008/bx1.vcproj index 91a1f14c4..6c972c02d 100644 --- a/source/vc++2008/bx1.vcproj +++ b/source/vc++2008/bx1.vcproj @@ -697,6 +697,26 @@ + + + + + + + + + + diff --git a/source/vc++2008/mz1500.vcproj b/source/vc++2008/mz1500.vcproj index f5718d28b..0a322cd1e 100644 --- a/source/vc++2008/mz1500.vcproj +++ b/source/vc++2008/mz1500.vcproj @@ -875,6 +875,26 @@ + + + + + + + + + + diff --git a/source/vc++2008/mz700.vcproj b/source/vc++2008/mz700.vcproj index 818846e80..2ec43141d 100644 --- a/source/vc++2008/mz700.vcproj +++ b/source/vc++2008/mz700.vcproj @@ -695,6 +695,26 @@ + + + + + + + + + + diff --git a/source/vc++2017/bx1.vcxproj b/source/vc++2017/bx1.vcxproj index c436b547a..f40fdb184 100644 --- a/source/vc++2017/bx1.vcxproj +++ b/source/vc++2017/bx1.vcxproj @@ -329,6 +329,7 @@ + @@ -359,6 +360,7 @@ + diff --git a/source/vc++2017/bx1.vcxproj.filters b/source/vc++2017/bx1.vcxproj.filters index b972ab9cc..675f706e2 100644 --- a/source/vc++2017/bx1.vcxproj.filters +++ b/source/vc++2017/bx1.vcxproj.filters @@ -116,6 +116,9 @@ Source Files\VM Driver Source Files + + Source Files\VM Driver Source Files + Source Files\VM Driver Source Files @@ -187,6 +190,9 @@ Header Files\VM Driver Header Files + + Header Files\VM Driver Header Files + Header Files\VM Driver Header Files diff --git a/source/vc++2017/mz1500.vcxproj b/source/vc++2017/mz1500.vcxproj index 9b5f7bd5e..46ec196d6 100644 --- a/source/vc++2017/mz1500.vcxproj +++ b/source/vc++2017/mz1500.vcxproj @@ -339,6 +339,7 @@ + @@ -382,6 +383,7 @@ + diff --git a/source/vc++2017/mz1500.vcxproj.filters b/source/vc++2017/mz1500.vcxproj.filters index 4423983e3..c9093e026 100644 --- a/source/vc++2017/mz1500.vcxproj.filters +++ b/source/vc++2017/mz1500.vcxproj.filters @@ -143,6 +143,9 @@ Source Files\VM Driver Source Files + + Source Files\VM Driver Source Files + Source Files\VM Driver Source Files @@ -256,6 +259,9 @@ Header Files\VM Driver Header Files + + Header Files\VM Driver Header Files + Header Files\VM Driver Header Files diff --git a/source/vc++2017/mz700.vcxproj b/source/vc++2017/mz700.vcxproj index aef573331..4ae10d842 100644 --- a/source/vc++2017/mz700.vcxproj +++ b/source/vc++2017/mz700.vcxproj @@ -335,6 +335,7 @@ + @@ -367,6 +368,7 @@ + diff --git a/source/vc++2017/mz700.vcxproj.filters b/source/vc++2017/mz700.vcxproj.filters index 1a5f4d766..b2ed1c64d 100644 --- a/source/vc++2017/mz700.vcxproj.filters +++ b/source/vc++2017/mz700.vcxproj.filters @@ -116,6 +116,9 @@ Source Files\VM Driver Source Files + + Source Files\VM Driver Source Files + Source Files\VM Driver Source Files @@ -196,6 +199,9 @@ Header Files\VM Driver Header Files + + Header Files\VM Driver Header Files + Header Files\VM Driver Header Files -- 2.11.0