--- /dev/null
+"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/
Binary archive of retro pc emulator common source code
- 1/24/2021
+ 2/7/2021
--- What's this ?
BANDAI
eRX-78 RX-78
CANON
+ eBX-1 BX-1
eX-07 X-07
CASIO
eFP-200 FP-200
MESS PC-8801 driver
- vm/pc9801/display.*
Neko Project 2 by Mr.Yui
- Improved for EGC by Mr.Ryuji Okamoto (qemu/9821\89ü\91¢\94Å)
+ Improved for EGC by Mr.Ryuji Okamoto (qemu/9821改造版)
- vm/pcengine/pce.*
Ootake (joypad)
xpce (psg)
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.")
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)
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)
+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
-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)
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
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
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
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
- 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.*
// #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
--- /dev/null
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource>
+ <file alias="default.ico">../../../res/bx1.ico</file>
+ <file alias="bios_and_keys.txt">../../../../../doc/VMs/bx1.txt</file>
+</qresource>
+</RCC>
<!DOCTYPE RCC><RCC version="1.0">
<qresource>
<file alias="default.ico">../../../res/bx1.ico</file>
- <file alias="bios_and_keys.txt">../../../../../doc/VMs/00_still_not_written.txt</file>
+ <file alias="bios_and_keys.txt">../../../../../doc/VMs/bx1.txt</file>
</qresource>
</RCC>
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}
)
#include <QApplication>
#include <QVariant>
#include <QtGui>
+#include <QMenu>
+
#include "commonclasses.h"
#include "menuclasses.h"
#include "emu.h"
//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);
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();
}
#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:
{
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"));
#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));
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
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
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
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
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
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
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
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
)
#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;
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);
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
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"));
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
{
if(!repeat) {
keyboard->key_down(code);
-// printer->key_down(code);
}
}
void VM::key_up(int code)
{
- keyboard->key_up(code);
-// printer->key_up(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)
}
}
-#define STATE_VERSION 1
+#define STATE_VERSION 2
bool VM::process_state(FILEIO* state_fio, bool loading)
{
#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
#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
#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
namespace BX1 {
class DISPLAY;
+ class FLOPPY;
class KEYBOARD;
class PRINTER;
}
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:
// ----------------------------------------
{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},
{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);
--- /dev/null
+/*
+ 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;
+ }
+}
+
+}
--- /dev/null
+/*
+ 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
+
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)
}
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;
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)
{
if(!fifo_down->process_state((void *)state_fio, loading)) {
return false;
}
- if(!fifo_up->process_state((void *)state_fio, loading)) {
- return false;
- }
return true;
}
}
{
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() {}
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);
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);
}
}
column = htab = 0;
- e210 = e211 = 0;//0xff;
+ strobe = outdata = 0;
}
/*
{
switch(addr & 0xffff) {
case 0xe210:
- case 0xe212:
- e210 = data;
+ // C1 -> A1\82Å$E211\82Ì\83f\81[\83^\82ª\8fo\97Í\82³\82ê\82é\81H
+ if((strobe & 0xe1) == 0xc1 && (data & 0xe1) == 0xa1) {
+// output(outdata);
+ }
+ strobe = data;
break;
case 0xe211:
- e211 = data;
+ outdata = data;
break;
}
}
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 :-(
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;
void PRINTER::key_down(int code)
{
// ugly patch for PAPER FEED
- if(code == 0x66) {
+ if(code == 0x91) {
output(0x0d);
+ output(0x0a);
}
}
}
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;
}
uint8_t *ram;
FILEIO *fio;
uint8_t column, htab;
- uint8_t e210, e211;
+ uint8_t strobe, outdata;
void output(uint8_t);
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);
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
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) { \
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
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;
}
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);
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);
}
}
-#define STATE_VERSION 3
+#define STATE_VERSION 4
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);
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;
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( );
// 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() );
}
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);
}
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:
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;
}
}
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) {
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();
} else {
dma[ch].channel_ctrl_reg |= STAT_BUSY;
}
- }
+// }
}
}
[ MCS48 ]
*/
-#ifndef _MCS84_H_
+#ifndef _MCS48_H_
#define _MCS48_H_
//#include "vm.h"
./cmos.cpp
./emm.cpp
./kanji.cpp
+ ./joystick.cpp
./keyboard.cpp
./memory.cpp
./ramfile.cpp
./cmos.cpp
./emm.cpp
+ ./joystick.cpp
./kanji.cpp
./keyboard.cpp
./memory.cpp
add_library(vm_${EXE_NAME}
./cmos.cpp
./emm.cpp
+ ./joystick.cpp
./kanji.cpp
./keyboard.cpp
./memory.cpp
--- /dev/null
+/*
+ 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;
+}
+
+}
--- /dev/null
+/*
+ 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
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;
}
#if defined(_MZ800)
DEVICE *d_pio_int;
#endif
+#if defined(_MZ700) || defined(_MZ1500)
+ DEVICE *d_joystick;
+#endif
// memory
uint8_t* rbank[32];
d_pio_int = device;
}
#endif
+#if defined(_MZ700) || defined(_MZ1500)
+ void set_context_joystick(DEVICE* device)
+ {
+ d_joystick = device;
+ }
+#endif
void draw_screen();
};
#endif
#include "quickdisk.h"
#endif
+#if defined(_MZ700) || defined(_MZ1500)
+#include "joystick.h"
+#endif
//using MZ700::CMOS* cmos;
using MZ700::EMM;
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)
#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);
#else
// 8253:CLK#0 <- 895KHz
pit->set_constant_clock(0, CPU_CLOCKS / 4);
+ memory->set_context_joystick(joystick);
#endif
#if defined(_MZ800) || defined(_MZ1500)
#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
#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
};
#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;
namespace MZ700 {
//class CMOS;
class EMM;
+#if defined(_MZ700) || defined(_MZ1500)
+ class JOYSTICK;
+#endif
class KANJI;
class KEYBOARD;
class MEMORY;
#endif
MZ700::QUICKDISK* qd;
#endif
+#if defined(_MZ700) || defined(_MZ1500)
+ MZ700::JOYSTICK* joystick;
+#endif
#if defined(_MZ800)
int boot_mode;
psub.cpp
sub.cpp
timer.cpp
+
pc6001.cpp
)
+
if(${EXE_NAME} STREQUAL emupc6001)
add_library(vm_${EXE_NAME}
../mc6847.cpp
)
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()
-/** 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'
*/
#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();
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\81` palette
- palette_pc[ 0] = RGB_COLOR(0x14,0x14,0x14); // COL065 = 141414 ;mk2\81` \93§\96¾(\8d\95)
- palette_pc[ 1] = RGB_COLOR(0xFF,0xAC,0x00); // COL066 = FFAC00 ;mk2\81` \9eò
- palette_pc[ 2] = RGB_COLOR(0x00,0xFF,0xAC); // COL067 = 00FFAC ;mk2\81` \90Â\97Î
- palette_pc[ 3] = RGB_COLOR(0xAC,0xFF,0x00); // COL068 = ACFF00 ;mk2\81` \89©\97Î
- palette_pc[ 4] = RGB_COLOR(0xAC,0x00,0xFF); // COL069 = AC00FF ;mk2\81` \90Â\8e\87
- palette_pc[ 5] = RGB_COLOR(0xFF,0x00,0xAC); // COL070 = FF00AC ;mk2\81` \90Ô\8e\87
- palette_pc[ 6] = RGB_COLOR(0x00,0xAC,0xFF); // COL071 = 00ACFF ;mk2\81` \8bó\90F
- palette_pc[ 7] = RGB_COLOR(0xAC,0xAC,0xAC); // COL072 = ACACAC ;mk2\81` \8aD\90F
- palette_pc[ 8] = RGB_COLOR(0x14,0x14,0x14); // COL073 = 141414 ;mk2\81` \8d\95
- palette_pc[ 9] = RGB_COLOR(0xFF,0x00,0x00); // COL074 = FF0000 ;mk2\81` \90Ô
- palette_pc[10] = RGB_COLOR(0x00,0xFF,0x00); // COL075 = 00FF00 ;mk2\81` \97Î
- palette_pc[11] = RGB_COLOR(0xFF,0xFF,0x00); // COL076 = FFFF00 ;mk2\81` \89©
- palette_pc[12] = RGB_COLOR(0x00,0x00,0xFF); // COL077 = 0000FF ;mk2\81` \90Â
- palette_pc[13] = RGB_COLOR(0xFF,0x00,0xFF); // COL078 = FF00FF ;mk2\81` \83}\83[\83\93\83^
- palette_pc[14] = RGB_COLOR(0x00,0xFF,0xFF); // COL079 = 00FFFF ;mk2\81` \83V\83A\83\93
- palette_pc[15] = RGB_COLOR(0xFF,0xFF,0xFF); // COL080 = FFFFFF ;mk2\81` \94\92
-
- // 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();
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 *>(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 *>(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 *>(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;
uint32_t MEMORY::read_data8(uint32_t addr)
{
-#if defined(_PC6601SR) || defined(_PC6001MK2SR)
- /* Graphics Vram Read (SR basic) */
- if(static_cast<VM *>(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 *>(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 *>(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);
}
uint8_t Value=data;
switch(port)
{
-#ifdef _PC6001
/// 64K RAM ///
case 0x00:
if (Value & 1) {
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 *>(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 *>(vm)->sr_mode)
- lines=(Value&0x01) ? 200 : 204;
- if (static_cast<VM *>(vm)->sr_mode)
- CGROM = CGROM6; // N66SR BASIC use CGROM6
- else
- CGROM = ((CRTMode1 == 0) ? CGROM1 : CGROM5);
- if (static_cast<VM *>(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 *>(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 *>(vm)->sr_mode = ((Value & 1)==1) ? 0 : 1;
- if (bitmap && static_cast<VM *>(vm)->sr_mode)
- {
- VRAM = (Value & 0x10) ? RAM+0x8000:RAM+0x0000;
- }
- if (static_cast<VM *>(vm)->sr_mode) {
- CGROM=CGROM6;
- portF0=0x11;
- }
- break;
- case 0xC9:
- if (static_cast<VM *>(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 *>(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 *>(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 *>(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 *>(vm)->sr_mode) Value=portF0;break;
- case 0xF1: if (!static_cast<VM *>(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;
void MEMORY::event_vline(int v, int clock)
{
-#if defined(_PC6601SR) || defined(_PC6001MK2SR)
- if(static_cast<VM *>(vm)->sr_mode) {
- if(v == (CRTMode1 ? 200 : 192)) {
- d_timer->write_signal(SIG_TIMER_IRQ_VRTC, 1, 1);
- }
- if(!CRTKILL) {
- // SR\83\82\81[\83h\82ÌBUSRQ\82É\82Â\82¢\82Ä\82Í\81A\82¦\82Ñ\82·\97l\82Ì\8fî\95ñ\91Ò\82¿
- }
- } 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
}
}
}
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 *>(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);
EnWrite[1]=0;
inserted = true;
} else {
-/// EXTROM1 = EXTROM2 = EmptyRAM;
EXTROM1 = RAM + 0x4000;
EXTROM2 = RAM + 0x6000;
EnWrite[1]=1;
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)
{
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;
}
-
}
-//
-// 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'
#define SIG_MEMORY_PIO_PORT_C 0
-#ifndef _PC6001
-namespace PC6001 {
- class TIMER;
-}
-#endif
-
// memory offset
#define RAM_BASE 0
#define RAM_SIZE 0x10000
#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 {
{
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)
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);
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()
{
return MEMORY_BASE + RAM_BASE;
}
-#ifndef _PC6001
- int get_CRTMode2()
- {
- return CRTMode2;
- }
-#endif
};
}
+++ /dev/null
-/** 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 *>(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<M1HEIGHT; Y++) {
- SETSCRVARM1(Y); /* Drawing area */
- for(X=0; X<32; X++, T1++, T2++) {
- /* get CGROM address and color */
- if (*T1&0x40) { /* if semi-graphic */
- if (*T1&0x20) { /* semi-graphic 6 */
- S = G+((*T2&0x3f)<<4)+0x1000;
- FC = BPal12[(*T1&0x02)<<1|(*T2)>>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<M1HEIGHT; Y++) {
- SETSCRVARM1(Y); /* Drawing area */
- for (X=0; X<32; X++,T1++,T2++) {
- if (*T1&0x10) { /* 256x192 (SCREEN 4) */
- attr = *T1&0x02;
-W=0;
- SeqPix21(BPal14[attr|(*T2&0x80)>>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<M1HEIGHT; Y++) {
- SETSCRVARM1(Y); /* Drawing area */
- for (X=0; X<16; X++,T1++,T2++) {
- if (*T1&0x10) { /* 128x 64 */
- attr = *T1&0x02;
-W=0;
- SeqPix41(BPal14[attr|(*T2&0x80)>>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<M1HEIGHT; Y++) {
- SETSCRVARM1(Y); /* Drawing area */
- for (X=0; X<32; X++,T1++,T2++) {
-W=0;
- attr = (*T1&0x02)<<1;
- SeqPix41(BPal13[attr|(*T2&0xC0)>>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<M1HEIGHT; Y++) {
- SETSCRVARM1(Y); /* Drawing area */
- for (X=0; X<16; X++,T1++,T2++) {
- attr = *T1&0x02;
-W=0;
- SeqPix41(BPal14[attr|(*T2&0x80)>>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<M1HEIGHT; Y++) {
- SETSCRVARM1(Y); /* Drawing area */
- for (X=0; X<32; X++,T1++,T2++) {
- 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 (!(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<M1HEIGHT; Y++) {
- SETSCRVARM1(Y); /* Drawing area */
- for (X=0; X<16; X++,T1++,T2++) {
- attr = *T1&0x02;
-W=0;
- SeqPix41(BPal14[attr|(*T2&0x80)>>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<M5HEIGHT; Y++) {
- SETSCRVARM5(Y); /* Drawing area */
- for(X=0; X<40; X++, T1++, T2++) {
- /* get CGROM address and color */
- S = G+(*T2<<4)+(*T1&0x80?0x1000:0);
- FC = BPal[(*T1)&0x0F]; BC = BPal[(((*T1)&0x70)>>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<M5HEIGHT; Y++) {
- SETSCRVARM5(Y); /* Drawing area */
- for(X=0; X<40; X++) {
-W=0;
- SeqPix41(BPal53[CSS3|((*T1)&0xC0)>>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<M5HEIGHT; Y++) {
- SETSCRVARM5(Y); /* Drawing area */
- for(X=0; X<40; X++) {
-W=0;
- SeqPix21(BPal53[cssor|((*T1)&0x80)>>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<M5HEIGHT; Y++) {
- SETSCRVARM5(Y); /* Drawing area */
- for(X=0; X< cols; X++, T1+=2, T2+=2) {
-W=0;
- S= G+(*T2<<4)+(*T1&0x80?semi_addr:addr); /*for CGROM6 SR semi graph 2002/2/23*//* 2003/7/8 */
- FC = BPal[ (*T1)&0x0F]; /* fast Palet (2002/9/27) */
- BC = BPal[ (((*T1)&0x70)>>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<M6HEIGHT; Y++) {
- SETSCRVARM5(Y); /* Drawing area */
- for(X=0; X< 64; X++) {
-W=0;
- SeqPix41(BPal53[ CSS3|((*T1)&0x0f) ]);
- SeqPix41(BPal53[ CSS3|((*T1)&0xf0)>>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<M6HEIGHT; Y++) {
- SETSCRVARM5(Y); /* Drawing area */
- for(X=0; X< 64; X++) {
-W=0;
- SeqPix41(BPal53[cssor|((*T1)&0x80)>>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 \82Ì\90æ\93ª\82©\82Â\81ACRT\82ª 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\8dÀ\95W */
- if( y >=204) y-=204; /* Y\8dÀ\95W 204 \88È\8fã\82¾\82Æ 204 \88ø\82 add 2003/10/22 */
- w = (x <256) ? 256: 64; /* width:0..255 \82È\82ç256 / 256..319\82È\82ç 64\82É\82·\82é*/
- off=(x <256) ? 0x1a00: 0x0000; /* offset: Vram offset address */
- x = (x <256) ? x: x-256; /* x:256..319 \82È\82ç 256\82ð\88ø\82\81@ */
- z = ((y & 1 )==1) ? 2: 0; /* z:Y\8dÀ\95W\82ª\8aï\90\94\82È\82ç\81A2\82ð\91«\82· */
- 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\8dÀ\95W */
- if( y >=204) y-=204; /* Y\8dÀ\95W 204 \88È\8fã\82¾\82Æ 204 \88ø\82 */
- w = (x <256) ? 256: 64; /* width:0..255 \82È\82ç256 / 256..319\82È\82ç 64\82É\82·\82é*/
- off=(x <256) ? 0x1a00: 0x0000; /* offset: Vram offset address */
- x = (x <256) ? x: x-256; /* x:256..319 \82È\82ç 256\82ð\88ø\82\81@ */
- z = ((y & 1 )==1) ? 2: 0; /* z:Y\8dÀ\95W\82ª\8aï\90\94\82È\82ç\81A2\82ð\91«\82· */
- 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
-
-}
-
return event->get_current_clock_uint64();
}
-#define STATE_VERSION 7
+#define STATE_VERSION 8
bool VM::process_state(FILEIO* state_fio, bool loading)
{
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
#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
// 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]) {
}
} 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]) {
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];
}
} 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]) {
return (c1 << 8) | c2;
}
-#define STATE_VERSION 5
+#define STATE_VERSION 6
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);
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;
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
// 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);
}
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);
if(counter[ch].freeze) {
return;
}
+ counter[ch].freezed = false;
// update counter
counter[ch].count -= 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;
}
}
-#define STATE_VERSION 1
+#define STATE_VERSION 2
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);
int clocks;
int prescaler;
bool freeze;
+ bool freezed;
bool start;
bool latch;
bool prev_in;
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)"));
bool _SINGLE_MODE_DMA;
bool _DMA_DEBUG;
- bool _X1TURBO_FEATURE;
+
bool now_ready();
void request_bus();
void release_bus();
</FileConfiguration>
</File>
<File
+ RelativePath="..\src\vm\bx1\floppy.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
RelativePath="..\src\vm\bx1\keyboard.cpp"
>
<FileConfiguration
>
</File>
<File
+ RelativePath="..\src\vm\bx1\floppy.h"
+ >
+ </File>
+ <File
RelativePath="..\src\vm\bx1\keyboard.h"
>
</File>
</FileConfiguration>
</File>
<File
+ RelativePath="..\src\vm\mz700\joystick.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
RelativePath="..\src\vm\mz700\kanji.cpp"
>
<FileConfiguration
>
</File>
<File
+ RelativePath="..\src\vm\mz700\joystick.h"
+ >
+ </File>
+ <File
RelativePath="..\src\vm\mz700\kanji.h"
>
</File>
</FileConfiguration>
</File>
<File
+ RelativePath="..\src\vm\mz700\joystick.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
RelativePath="..\src\vm\mz700\kanji.cpp"
>
<FileConfiguration
>
</File>
<File
+ RelativePath="..\src\vm\mz700\joystick.h"
+ >
+ </File>
+ <File
RelativePath="..\src\vm\mz700\kanji.h"
>
</File>
<ClCompile Include="..\src\fileio.cpp" />
<ClCompile Include="..\src\vm\bx1\bx1.cpp" />
<ClCompile Include="..\src\vm\bx1\display.cpp" />
+ <ClCompile Include="..\src\vm\bx1\floppy.cpp" />
<ClCompile Include="..\src\vm\bx1\keyboard.cpp" />
<ClCompile Include="..\src\vm\bx1\printer.cpp" />
<ClCompile Include="..\src\vm\disk.cpp" />
<ClInclude Include="..\src\res\resource.h" />
<ClInclude Include="..\src\vm\bx1\bx1.h" />
<ClInclude Include="..\src\vm\bx1\display.h" />
+ <ClInclude Include="..\src\vm\bx1\floppy.h" />
<ClInclude Include="..\src\vm\bx1\keyboard.h" />
<ClInclude Include="..\src\vm\bx1\printer.h" />
<ClInclude Include="..\src\vm\debugger.h" />
<ClCompile Include="..\src\vm\bx1\display.cpp">
<Filter>Source Files\VM Driver Source Files</Filter>
</ClCompile>
+ <ClCompile Include="..\src\vm\bx1\floppy.cpp">
+ <Filter>Source Files\VM Driver Source Files</Filter>
+ </ClCompile>
<ClCompile Include="..\src\vm\bx1\keyboard.cpp">
<Filter>Source Files\VM Driver Source Files</Filter>
</ClCompile>
<ClInclude Include="..\src\vm\bx1\display.h">
<Filter>Header Files\VM Driver Header Files</Filter>
</ClInclude>
+ <ClInclude Include="..\src\vm\bx1\floppy.h">
+ <Filter>Header Files\VM Driver Header Files</Filter>
+ </ClInclude>
<ClInclude Include="..\src\vm\bx1\keyboard.h">
<Filter>Header Files\VM Driver Header Files</Filter>
</ClInclude>
<ClCompile Include="..\src\vm\mz700\cmos.cpp" />
<ClCompile Include="..\src\vm\mz700\emm.cpp" />
<ClCompile Include="..\src\vm\mz700\floppy.cpp" />
+ <ClCompile Include="..\src\vm\mz700\joystick.cpp" />
<ClCompile Include="..\src\vm\mz700\kanji.cpp" />
<ClCompile Include="..\src\vm\mz700\keyboard.cpp" />
<ClCompile Include="..\src\vm\mz700\memory.cpp" />
<ClInclude Include="..\src\vm\mz700\cmos.h" />
<ClInclude Include="..\src\vm\mz700\emm.h" />
<ClInclude Include="..\src\vm\mz700\floppy.h" />
+ <ClInclude Include="..\src\vm\mz700\joystick.h" />
<ClInclude Include="..\src\vm\mz700\kanji.h" />
<ClInclude Include="..\src\vm\mz700\keyboard.h" />
<ClInclude Include="..\src\vm\mz700\memory.h" />
<ClCompile Include="..\src\vm\mz700\floppy.cpp">
<Filter>Source Files\VM Driver Source Files</Filter>
</ClCompile>
+ <ClCompile Include="..\src\vm\mz700\joystick.cpp">
+ <Filter>Source Files\VM Driver Source Files</Filter>
+ </ClCompile>
<ClCompile Include="..\src\vm\mz700\kanji.cpp">
<Filter>Source Files\VM Driver Source Files</Filter>
</ClCompile>
<ClInclude Include="..\src\vm\mz700\floppy.h">
<Filter>Header Files\VM Driver Header Files</Filter>
</ClInclude>
+ <ClInclude Include="..\src\vm\mz700\joystick.h">
+ <Filter>Header Files\VM Driver Header Files</Filter>
+ </ClInclude>
<ClInclude Include="..\src\vm\mz700\kanji.h">
<Filter>Header Files\VM Driver Header Files</Filter>
</ClInclude>
<ClCompile Include="..\src\vm\io.cpp" />
<ClCompile Include="..\src\vm\mz700\cmos.cpp" />
<ClCompile Include="..\src\vm\mz700\emm.cpp" />
+ <ClCompile Include="..\src\vm\mz700\joystick.cpp" />
<ClCompile Include="..\src\vm\mz700\kanji.cpp" />
<ClCompile Include="..\src\vm\mz700\keyboard.cpp" />
<ClCompile Include="..\src\vm\mz700\memory.cpp" />
<ClInclude Include="..\src\vm\io.h" />
<ClInclude Include="..\src\vm\mz700\cmos.h" />
<ClInclude Include="..\src\vm\mz700\emm.h" />
+ <ClInclude Include="..\src\vm\mz700\joystick.h" />
<ClInclude Include="..\src\vm\mz700\kanji.h" />
<ClInclude Include="..\src\vm\mz700\keyboard.h" />
<ClInclude Include="..\src\vm\mz700\memory.h" />
<ClCompile Include="..\src\vm\mz700\emm.cpp">
<Filter>Source Files\VM Driver Source Files</Filter>
</ClCompile>
+ <ClCompile Include="..\src\vm\mz700\joystick.cpp">
+ <Filter>Source Files\VM Driver Source Files</Filter>
+ </ClCompile>
<ClCompile Include="..\src\vm\mz700\kanji.cpp">
<Filter>Source Files\VM Driver Source Files</Filter>
</ClCompile>
<ClInclude Include="..\src\vm\mz700\emm.h">
<Filter>Header Files\VM Driver Header Files</Filter>
</ClInclude>
+ <ClInclude Include="..\src\vm\mz700\joystick.h">
+ <Filter>Header Files\VM Driver Header Files</Filter>
+ </ClInclude>
<ClInclude Include="..\src\vm\mz700\kanji.h">
<Filter>Header Files\VM Driver Header Files</Filter>
</ClInclude>