mirror of
https://github.com/AppleWin/AppleWin.git
synced 2024-06-16 06:29:33 +00:00
Illegal opcodes support
Separate NMOS 6502 and CMOS 65C02 support CPU flag handling improvement NMI support Apple II (original model) support Apple II/IIPlus mode font improvement "M" glyph improvement Small _M14 / CLK_6502 fix. Reset behavior improvement Small monochrome video improvement - mono text now honors color selection just like mono graphics.
This commit is contained in:
parent
e72f4b4beb
commit
e3c3ead902
|
@ -358,6 +358,9 @@
|
||||||
<Filter
|
<Filter
|
||||||
Name="Docs"
|
Name="Docs"
|
||||||
Filter="">
|
Filter="">
|
||||||
|
<File
|
||||||
|
RelativePath=".\docs\Bugs.txt">
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath=".\docs\CodingConventions.txt">
|
RelativePath=".\docs\CodingConventions.txt">
|
||||||
</File>
|
</File>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
<?xml version="1.0" encoding="Windows-1252"?>
|
||||||
<VisualStudioProject
|
<VisualStudioProject
|
||||||
ProjectType="Visual C++"
|
ProjectType="Visual C++"
|
||||||
Version="8.00"
|
Version="8,00"
|
||||||
Name="Applewin"
|
Name="Applewin"
|
||||||
ProjectGUID="{1DA0C491-B5F4-4EC8-B1D2-CF6BE635DADC}"
|
ProjectGUID="{1DA0C491-B5F4-4EC8-B1D2-CF6BE635DADC}"
|
||||||
RootNamespace="Applewin"
|
RootNamespace="Applewin"
|
||||||
|
@ -516,11 +516,11 @@
|
||||||
Filter=".txt,.ico,.bmp,.rc"
|
Filter=".txt,.ico,.bmp,.rc"
|
||||||
>
|
>
|
||||||
<File
|
<File
|
||||||
RelativePath=".\resource\Apple2.rom"
|
RelativePath=".\resource\Apple2e.rom"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath=".\resource\Apple2e.rom"
|
RelativePath=".\resource\Apple2plus.rom"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
|
|
BIN
AppleWin/resource/Apple2orig.rom
Normal file
BIN
AppleWin/resource/Apple2orig.rom
Normal file
Binary file not shown.
|
@ -46,6 +46,23 @@ END
|
||||||
|
|
||||||
#endif // APSTUDIO_INVOKED
|
#endif // APSTUDIO_INVOKED
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// String Table
|
||||||
|
//
|
||||||
|
|
||||||
|
STRINGTABLE DISCARDABLE
|
||||||
|
BEGIN
|
||||||
|
IDS_TFE_CAPTION "Ethernet Settings"
|
||||||
|
IDS_TFE_ETHERNET "Ethernet"
|
||||||
|
IDS_TFE_INTERFACE "Interface"
|
||||||
|
END
|
||||||
|
|
||||||
|
STRINGTABLE
|
||||||
|
BEGIN
|
||||||
|
IDS_OK "OK"
|
||||||
|
IDS_CANCEL "Cancel"
|
||||||
|
END
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
|
@ -199,8 +216,8 @@ BEGIN
|
||||||
GROUPBOX "Harddisk Controller",IDC_STATIC,2,113,205,71
|
GROUPBOX "Harddisk Controller",IDC_STATIC,2,113,205,71
|
||||||
END
|
END
|
||||||
|
|
||||||
IDD_TFE_SETTINGS_DIALOG DIALOG 0, 0, 270, 100
|
IDD_TFE_SETTINGS_DIALOG DIALOG DISCARDABLE 0, 0, 270, 100
|
||||||
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||||
CAPTION "Ethernet Settings"
|
CAPTION "Ethernet Settings"
|
||||||
FONT 8, "MS Sans Serif"
|
FONT 8, "MS Sans Serif"
|
||||||
BEGIN
|
BEGIN
|
||||||
|
@ -216,7 +233,6 @@ BEGIN
|
||||||
PUSHBUTTON "Cancel",IDCANCEL,80,75,50,14
|
PUSHBUTTON "Cancel",IDCANCEL,80,75,50,14
|
||||||
END
|
END
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// Icon
|
// Icon
|
||||||
|
@ -233,8 +249,8 @@ DISK_ICON ICON "DISK.ICO"
|
||||||
//
|
//
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 1,13,1,0
|
FILEVERSION 1,12,9,2
|
||||||
PRODUCTVERSION 1,13,1,0
|
PRODUCTVERSION 1,12,9,2
|
||||||
FILEFLAGSMASK 0x3fL
|
FILEFLAGSMASK 0x3fL
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
FILEFLAGS 0x1L
|
FILEFLAGS 0x1L
|
||||||
|
@ -252,12 +268,12 @@ BEGIN
|
||||||
VALUE "Comments", "http://applewin.berlios.de"
|
VALUE "Comments", "http://applewin.berlios.de"
|
||||||
VALUE "CompanyName", "Michael O'Brien, Oliver Schmidt, Tom Charlesworth"
|
VALUE "CompanyName", "Michael O'Brien, Oliver Schmidt, Tom Charlesworth"
|
||||||
VALUE "FileDescription", "Apple //e Emulator for Windows"
|
VALUE "FileDescription", "Apple //e Emulator for Windows"
|
||||||
VALUE "FileVersion", "1, 13, 1, 0"
|
VALUE "FileVersion", "1, 12, 9, 2"
|
||||||
VALUE "InternalName", "APPLEWIN"
|
VALUE "InternalName", "APPLEWIN"
|
||||||
VALUE "LegalCopyright", "© 1994-2006 Michael O'Brien, Oliver Schmidt, Tom Charlesworth, Michael Pohoreski"
|
VALUE "LegalCopyright", "© 1994-2006 Michael O'Brien, Oliver Schmidt, Tom Charlesworth, Michael Pohoreski"
|
||||||
VALUE "OriginalFilename", "APPLEWIN.EXE"
|
VALUE "OriginalFilename", "APPLEWIN.EXE"
|
||||||
VALUE "ProductName", "Apple //e Emulator"
|
VALUE "ProductName", "Apple //e Emulator"
|
||||||
VALUE "ProductVersion", "1, 13, 1, 0"
|
VALUE "ProductVersion", "1, 12, 9, 2"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
@ -286,12 +302,14 @@ END
|
||||||
|
|
||||||
IDR_HDDRVR FIRMWARE "Hddrvr.bin"
|
IDR_HDDRVR FIRMWARE "Hddrvr.bin"
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// ROM
|
// ROM
|
||||||
//
|
//
|
||||||
|
|
||||||
IDR_APPLE2_ROM ROM "Apple2.rom"
|
IDR_APPLE2ORIG_ROM ROM "Apple2orig.rom"
|
||||||
|
IDR_APPLE2PLUS_ROM ROM "Apple2plus.rom"
|
||||||
IDR_APPLE2E_ROM ROM "Apple2e.rom"
|
IDR_APPLE2E_ROM ROM "Apple2e.rom"
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -324,25 +342,6 @@ BEGIN
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// String Table
|
|
||||||
//
|
|
||||||
|
|
||||||
STRINGTABLE
|
|
||||||
BEGIN
|
|
||||||
IDS_TFE_CAPTION "Ethernet Settings"
|
|
||||||
IDS_TFE_ETHERNET "Ethernet"
|
|
||||||
IDS_TFE_INTERFACE "Interface"
|
|
||||||
END
|
|
||||||
|
|
||||||
STRINGTABLE
|
|
||||||
BEGIN
|
|
||||||
IDS_OK "OK"
|
|
||||||
IDS_CANCEL "Cancel"
|
|
||||||
END
|
|
||||||
|
|
||||||
#endif // English (U.S.) resources
|
#endif // English (U.S.) resources
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 24 KiB |
|
@ -28,8 +28,9 @@
|
||||||
#define IDC_2_0_MHz 123
|
#define IDC_2_0_MHz 123
|
||||||
#define IDC_MAX_MHz 124
|
#define IDC_MAX_MHz 124
|
||||||
#define IDR_MENU 125
|
#define IDR_MENU 125
|
||||||
#define IDR_APPLE2_ROM 126
|
#define IDR_APPLE2ORIG_ROM 126
|
||||||
#define IDR_APPLE2E_ROM 127
|
#define IDR_APPLE2PLUS_ROM 127
|
||||||
|
#define IDR_APPLE2E_ROM 128
|
||||||
#define IDC_MB_ENABLE 130
|
#define IDC_MB_ENABLE 130
|
||||||
#define IDD_TFE_SETTINGS_DIALOG 131
|
#define IDD_TFE_SETTINGS_DIALOG 131
|
||||||
#define IDC_KEYB_BUFFER_ENABLE 1005
|
#define IDC_KEYB_BUFFER_ENABLE 1005
|
||||||
|
|
|
@ -32,6 +32,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
char VERSIONSTRING[] = "xx.yy.zz.ww";
|
char VERSIONSTRING[] = "xx.yy.zz.ww";
|
||||||
|
|
||||||
BOOL apple2e = 1;
|
BOOL apple2e = 1;
|
||||||
|
BOOL apple2plus = 1;
|
||||||
BOOL behind = 0; // Redundant
|
BOOL behind = 0; // Redundant
|
||||||
DWORD cumulativecycles = 0; // Wraps after ~1hr 9mins
|
DWORD cumulativecycles = 0; // Wraps after ~1hr 9mins
|
||||||
DWORD cyclenum = 0; // Used by SpkrToggle() for non-wave sound
|
DWORD cyclenum = 0; // Used by SpkrToggle() for non-wave sound
|
||||||
|
@ -347,7 +348,10 @@ void GetProgramDirectory () {
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
void LoadConfiguration () {
|
void LoadConfiguration () {
|
||||||
LOAD(TEXT("Computer Emulation"),(DWORD *)&apple2e);
|
DWORD comptype;
|
||||||
|
LOAD(TEXT("Computer Emulation"),&comptype);
|
||||||
|
apple2e = (comptype == 2);
|
||||||
|
apple2plus = (comptype == 1);
|
||||||
LOAD(TEXT("Joystick 0 Emulation"),&joytype[0]);
|
LOAD(TEXT("Joystick 0 Emulation"),&joytype[0]);
|
||||||
LOAD(TEXT("Joystick 1 Emulation"),&joytype[1]);
|
LOAD(TEXT("Joystick 1 Emulation"),&joytype[1]);
|
||||||
LOAD(TEXT("Sound Emulation") ,&soundtype);
|
LOAD(TEXT("Sound Emulation") ,&soundtype);
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
extern char VERSIONSTRING[]; // Contructed in WinMain()
|
extern char VERSIONSTRING[]; // Contructed in WinMain()
|
||||||
|
|
||||||
extern BOOL apple2e;
|
extern BOOL apple2e;
|
||||||
|
extern BOOL apple2plus;
|
||||||
extern BOOL behind;
|
extern BOOL behind;
|
||||||
extern DWORD cumulativecycles;
|
extern DWORD cumulativecycles;
|
||||||
extern DWORD cyclenum;
|
extern DWORD cyclenum;
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -11,7 +11,8 @@ typedef struct _regsrec {
|
||||||
BYTE ps; // processor status
|
BYTE ps; // processor status
|
||||||
WORD pc; // program counter
|
WORD pc; // program counter
|
||||||
WORD sp; // stack pointer
|
WORD sp; // stack pointer
|
||||||
BYTE bIRQ; // IRQ asserted flag
|
BYTE bRESET; // RESET asserted flag
|
||||||
|
BYTE bJammed; // CPU has crashed (NMOS 6502 only)
|
||||||
} regsrec, *regsptr;
|
} regsrec, *regsptr;
|
||||||
|
|
||||||
extern DWORD cpuemtype;
|
extern DWORD cpuemtype;
|
||||||
|
@ -31,5 +32,9 @@ BOOL CpuSupportsFastPaging ();
|
||||||
void CpuIrqReset();
|
void CpuIrqReset();
|
||||||
void CpuIrqAssert(eIRQSRC Device);
|
void CpuIrqAssert(eIRQSRC Device);
|
||||||
void CpuIrqDeassert(eIRQSRC Device);
|
void CpuIrqDeassert(eIRQSRC Device);
|
||||||
|
void CpuNmiReset();
|
||||||
|
void CpuNmiAssert(eIRQSRC Device);
|
||||||
|
void CpuNmiDeassert(eIRQSRC Device);
|
||||||
|
void CpuReset ();
|
||||||
DWORD CpuGetSnapshot(SS_CPU6502* pSS);
|
DWORD CpuGetSnapshot(SS_CPU6502* pSS);
|
||||||
DWORD CpuSetSnapshot(SS_CPU6502* pSS);
|
DWORD CpuSetSnapshot(SS_CPU6502* pSS);
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
const double _M14 = 14.31818e6;
|
const double _M14 = (157500000.0 / 11.0); // 14.3181818... * 10^6
|
||||||
const double CLK_6502 = (_M14 / 14.0); // 1022727 + 1/7
|
const double CLK_6502 = ((_M14 * 65.0) / 912.0); // 65 cycles per 912 14M clocks
|
||||||
//const double CLK_6502 = 23 * 44100; // 1014300
|
//const double CLK_6502 = 23 * 44100; // 1014300
|
||||||
|
|
||||||
const UINT uCyclesPerLine = 65; // 25 cycles of HBL & 40 cycles of HBL'
|
const UINT uCyclesPerLine = 65; // 25 cycles of HBL & 40 cycles of HBL'
|
||||||
|
|
|
@ -82,91 +82,88 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
#define SR MEM_S | MEM_RI
|
#define SR MEM_S | MEM_RI
|
||||||
const Opcodes_t g_aOpcodes65C02[ NUM_OPCODES ] =
|
const Opcodes_t g_aOpcodes65C02[ NUM_OPCODES ] =
|
||||||
{
|
{
|
||||||
{"BRK", 0 , 0}, {"ORA", AM_IZX, R_}, {"NOP", AM_2 , 0 }, {"NOP", AM_1 , 0 }, // 00 .. 03
|
{"BRK", 0 , 0}, {"ORA", AM_IZX, R_}, {"nop", AM_M , im}, {"nop", 0 , 0 }, // 00 .. 03
|
||||||
{"TSB", AM_Z , _W}, {"ORA", AM_Z , R_}, {"ASL", AM_Z , RW}, {"NOP", AM_1 , 0 }, // 04 .. 07
|
{"TSB", AM_Z , _W}, {"ORA", AM_Z , R_}, {"ASL", AM_Z , RW}, {"nop", 0 , 0 }, // 04 .. 07
|
||||||
{"PHP", 0 , SW}, {"ORA", AM_M , im}, {"ASL", 0 , 0}, {"NOP", AM_1 , 0 }, // 08 .. 0B
|
{"PHP", 0 , SW}, {"ORA", AM_M , im}, {"ASL", 0 , 0}, {"nop", 0 , 0 }, // 08 .. 0B
|
||||||
{"TSB", AM_A , _W}, {"ORA", AM_A , R_}, {"ASL", AM_A , RW}, {"NOP", AM_3 , 0 }, // 0C .. 0F
|
{"TSB", AM_A , _W}, {"ORA", AM_A , R_}, {"ASL", AM_A , RW}, {"nop", 0 , 0 }, // 0C .. 0F
|
||||||
{"BPL", AM_R , 0}, {"ORA", AM_NZY, R_}, {"ORA", AM_NZ , R_}, {"NOP", AM_1 , 0 }, // 10 .. 13
|
{"BPL", AM_R , 0}, {"ORA", AM_NZY, R_}, {"ORA", AM_NZ , R_}, {"nop", 0 , 0 }, // 10 .. 13
|
||||||
{"TRB", AM_Z , _W}, {"ORA", AM_ZX , R_}, {"ASL", AM_ZX , RW}, {"NOP", AM_1 , 0 }, // 14 .. 17
|
{"TRB", AM_Z , _W}, {"ORA", AM_ZX , R_}, {"ASL", AM_ZX , RW}, {"nop", 0 , 0 }, // 14 .. 17
|
||||||
{"CLC", 0 , 0}, {"ORA", AM_AY , R_}, {"INA", 0 , 0}, {"NOP", AM_1 , 0 }, // 18 .. 1B
|
{"CLC", 0 , 0}, {"ORA", AM_AY , R_}, {"INC", 0 , 0}, {"nop", 0 , 0 }, // 18 .. 1B
|
||||||
{"TRB", AM_A , _W}, {"ORA", AM_AX , R_}, {"ASL", AM_AX , RW}, {"NOP", AM_1 , 0 }, // 1C .. 1F
|
{"TRB", AM_A , _W}, {"ORA", AM_AX , R_}, {"ASL", AM_AX , RW}, {"nop", 0 , 0 }, // 1C .. 1F
|
||||||
|
|
||||||
{"JSR", AM_A , SW}, {"AND", AM_IZX, R_}, {"NOP", AM_2 , 0}, {"NOP", AM_1 , 0 }, // 20 .. 23
|
{"JSR", AM_A , SW}, {"AND", AM_IZX, R_}, {"nop", AM_M , im}, {"nop", 0 , 0 }, // 20 .. 23
|
||||||
{"BIT", AM_Z , R_}, {"AND", AM_Z , R_}, {"ROL", AM_Z , RW}, {"NOP", AM_1 , 0 }, // 24 .. 27
|
{"BIT", AM_Z , R_}, {"AND", AM_Z , R_}, {"ROL", AM_Z , RW}, {"nop", 0 , 0 }, // 24 .. 27
|
||||||
{"PLP", 0 , SR}, {"AND", AM_M , im}, {"ROL", 0 , 0}, {"NOP", AM_1 , 0 }, // 28 .. 2B
|
{"PLP", 0 , SR}, {"AND", AM_M , im}, {"ROL", 0 , 0}, {"nop", 0 , 0 }, // 28 .. 2B
|
||||||
{"BIT", AM_A , R_}, {"AND", AM_A , R_}, {"ROL", AM_A , RW}, {"NOP", AM_3 , 0 }, // 2C .. 2F
|
{"BIT", AM_A , R_}, {"AND", AM_A , R_}, {"ROL", AM_A , RW}, {"nop", 0 , 0 }, // 2C .. 2F
|
||||||
{"BMI", AM_R , 0}, {"AND", AM_NZY, R_}, {"AND", AM_NZ , R_}, {"NOP", AM_1 , 0 }, // 30 .. 33
|
{"BMI", AM_R , 0}, {"AND", AM_NZY, R_}, {"AND", AM_NZ , R_}, {"nop", 0 , 0 }, // 30 .. 33
|
||||||
{"BIT", AM_ZX , R_}, {"AND", AM_ZX , R_}, {"ROL", AM_ZX , RW}, {"NOP", AM_1 , 0 }, // 34 .. 37
|
{"BIT", AM_ZX , R_}, {"AND", AM_ZX , R_}, {"ROL", AM_ZX , RW}, {"nop", 0 , 0 }, // 34 .. 37
|
||||||
{"SEC", 0 , 0}, {"AND", AM_AY , R_}, {"DEA", 0 , 0}, {"NOP", AM_1 , 0 }, // 38 .. 3B
|
{"SEC", 0 , 0}, {"AND", AM_AY , R_}, {"DEC", 0 , 0}, {"nop", 0 , 0 }, // 38 .. 3B
|
||||||
{"BIT", AM_AX , R_}, {"AND", AM_AX , R_}, {"ROL", AM_AX , RW}, {"NOP", AM_1 , 0 }, // 3C .. 3F
|
{"BIT", AM_AX , R_}, {"AND", AM_AX , R_}, {"ROL", AM_AX , RW}, {"nop", 0 , 0 }, // 3C .. 3F
|
||||||
|
|
||||||
{"RTI", 0 , 0}, {"EOR", AM_IZX, R_}, {"NOP", AM_2 , 0}, {"NOP", AM_1 , 0 }, // 40 .. 43
|
{"RTI", 0 , 0}, {"EOR", AM_IZX, R_}, {"nop", AM_M , im}, {"nop", 0 , 0 }, // 40 .. 43
|
||||||
{"NOP", AM_2 , 0}, {"EOR", AM_Z , R_}, {"LSR", AM_Z , _W}, {"NOP", AM_1 , 0 }, // 44 .. 47
|
{"nop", AM_Z , 0}, {"EOR", AM_Z , R_}, {"LSR", AM_Z , _W}, {"nop", 0 , 0 }, // 44 .. 47
|
||||||
{"PHA", 0 , SW}, {"EOR", AM_M , im}, {"LSR", 0 , 0}, {"NOP", AM_1 , 0 }, // 48 .. 4B
|
{"PHA", 0 , SW}, {"EOR", AM_M , im}, {"LSR", 0 , 0}, {"nop", 0 , 0 }, // 48 .. 4B
|
||||||
{"JMP", AM_A , 0}, {"EOR", AM_A , R_}, {"LSR", AM_A , _W}, {"NOP", AM_1 , 0 }, // 4C .. 4F
|
{"JMP", AM_A , 0}, {"EOR", AM_A , R_}, {"LSR", AM_A , _W}, {"nop", 0 , 0 }, // 4C .. 4F
|
||||||
{"BVC", AM_R , 0}, {"EOR", AM_NZY, R_}, {"EOR", AM_NZ , R_}, {"NOP", AM_1 , 0 }, // 50 .. 53
|
{"BVC", AM_R , 0}, {"EOR", AM_NZY, R_}, {"EOR", AM_NZ , R_}, {"nop", 0 , 0 }, // 50 .. 53
|
||||||
{"NOP", AM_2 , 0}, {"EOR", AM_ZX , R_}, {"LSR", AM_ZX , _W}, {"NOP", AM_1 , 0 }, // 54 .. 57
|
{"nop", AM_ZX , 0}, {"EOR", AM_ZX , R_}, {"LSR", AM_ZX , _W}, {"nop", 0 , 0 }, // 54 .. 57
|
||||||
{"CLI", 0 , 0}, {"EOR", AM_AY , R_}, {"PHY", 0 , SW}, {"NOP", AM_1 , 0 }, // 58 .. 5B
|
{"CLI", 0 , 0}, {"EOR", AM_AY , R_}, {"PHY", 0 , SW}, {"nop", 0 , 0 }, // 58 .. 5B
|
||||||
{"NOP", AM_3 , 0}, {"EOR", AM_AX , R_}, {"LSR", AM_AX , RW}, {"NOP", AM_1 , 0 }, // 5C .. 5F
|
{"nop", AM_AX , 0}, {"EOR", AM_AX , R_}, {"LSR", AM_AX , RW}, {"nop", 0 , 0 }, // 5C .. 5F
|
||||||
|
|
||||||
{"RTS", 0 , SR}, {"ADC", AM_IZX, R_}, {"NOP", AM_2 , 0}, {"NOP", AM_1 , 0 }, // 60 .. 63
|
{"RTS", 0 , SR}, {"ADC", AM_IZX, R_}, {"nop", AM_M , im}, {"nop", 0 , 0 }, // 60 .. 63
|
||||||
{"STZ", AM_Z , _W}, {"ADC", AM_Z , R_}, {"ROR", AM_Z , RW}, {"NOP", AM_1 , 0 }, // 64 .. 67
|
{"STZ", AM_Z , _W}, {"ADC", AM_Z , R_}, {"ROR", AM_Z , RW}, {"nop", 0 , 0 }, // 64 .. 67
|
||||||
{"PLA", 0 , SR}, {"ADC", AM_M , im}, {"ROR", 0 , 0}, {"NOP", AM_1 , 0 }, // 68 .. 6B
|
{"PLA", 0 , SR}, {"ADC", AM_M , im}, {"ROR", 0 , 0}, {"nop", 0 , 0 }, // 68 .. 6B
|
||||||
{"JMP", AM_NA , 0}, {"ADC", AM_A , R_}, {"ROR", AM_A , RW}, {"NOP", AM_1 , 0 }, // 6C .. 6F
|
{"JMP", AM_NA , 0}, {"ADC", AM_A , R_}, {"ROR", AM_A , RW}, {"nop", 0 , 0 }, // 6C .. 6F
|
||||||
{"BVS", AM_R , 0}, {"ADC", AM_NZY, R_}, {"ADC", AM_NZ , R_}, {"NOP", AM_1 , 0 }, // 70 .. 73
|
{"BVS", AM_R , 0}, {"ADC", AM_NZY, R_}, {"ADC", AM_NZ , R_}, {"nop", 0 , 0 }, // 70 .. 73
|
||||||
{"STZ", AM_ZX , _W}, {"ADC", AM_ZX , R_}, {"ROR", AM_ZX , RW}, {"NOP", AM_1 , 0 }, // 74 .. 77
|
{"STZ", AM_ZX , _W}, {"ADC", AM_ZX , R_}, {"ROR", AM_ZX , RW}, {"nop", 0 , 0 }, // 74 .. 77
|
||||||
{"SEI", 0 , 0}, {"ADC", AM_AY , R_}, {"PLY", 0 , SR}, {"NOP", AM_1 , 0 }, // 78 .. 7B
|
{"SEI", 0 , 0}, {"ADC", AM_AY , R_}, {"PLY", 0 , SR}, {"nop", 0 , 0 }, // 78 .. 7B
|
||||||
{"JMP", AM_IAX, 0}, {"ADC", AM_AX , R_}, {"ROR", AM_AX , RW}, {"NOP", AM_1 , 0 }, // 7C .. 7F
|
{"JMP", AM_IAX, 0}, {"ADC", AM_AX , R_}, {"ROR", AM_AX , RW}, {"nop", 0 , 0 }, // 7C .. 7F
|
||||||
|
|
||||||
{"BRA", AM_R , 0}, {"STA", AM_IZX, _W}, {"NOP", AM_2 , 0}, {"NOP", AM_1 , 0 }, // 80 .. 83
|
{"BRA", AM_R , 0}, {"STA", AM_IZX, _W}, {"nop", AM_M , im}, {"nop", 0 , 0 }, // 80 .. 83
|
||||||
{"STY", AM_Z , _W}, {"STA", AM_Z , _W}, {"STX", AM_Z , _W}, {"NOP", AM_1 , 0 }, // 84 .. 87
|
{"STY", AM_Z , _W}, {"STA", AM_Z , _W}, {"STX", AM_Z , _W}, {"nop", 0 , 0 }, // 84 .. 87
|
||||||
{"DEY", 0 , 0}, {"BIT", AM_M , im}, {"TXA", 0 , 0}, {"NOP", AM_1 , 0 }, // 88 .. 8B
|
{"DEY", 0 , 0}, {"BIT", AM_M , im}, {"TXA", 0 , 0}, {"nop", 0 , 0 }, // 88 .. 8B
|
||||||
{"STY", AM_A , _W}, {"STA", AM_A , _W}, {"STX", AM_A , _W}, {"NOP", AM_1 , 0 }, // 8C .. 8F
|
{"STY", AM_A , _W}, {"STA", AM_A , _W}, {"STX", AM_A , _W}, {"nop", 0 , 0 }, // 8C .. 8F
|
||||||
{"BCC", AM_R , 0}, {"STA", AM_NZY, _W}, {"STA", AM_NZ , _W}, {"NOP", AM_1 , 0 }, // 90 .. 93
|
{"BCC", AM_R , 0}, {"STA", AM_NZY, _W}, {"STA", AM_NZ , _W}, {"nop", 0 , 0 }, // 90 .. 93
|
||||||
{"STY", AM_ZX , _W}, {"STA", AM_ZX , _W}, {"STX", AM_ZY , _W}, {"NOP", AM_1 , 0 }, // 94 .. 97
|
{"STY", AM_ZX , _W}, {"STA", AM_ZX , _W}, {"STX", AM_ZY , _W}, {"nop", 0 , 0 }, // 94 .. 97
|
||||||
{"TYA", 0 , 0}, {"STA", AM_AY , _W}, {"TXS", 0 , 0}, {"NOP", AM_1 , 0 }, // 98 .. 9B
|
{"TYA", 0 , 0}, {"STA", AM_AY , _W}, {"TXS", 0 , 0}, {"nop", 0 , 0 }, // 98 .. 9B
|
||||||
{"STZ", AM_A , _W}, {"STA", AM_AX , _W}, {"STZ", AM_AX , _W}, {"NOP", AM_1 , 0 }, // 9C .. 9F
|
{"STZ", AM_A , _W}, {"STA", AM_AX , _W}, {"STZ", AM_AX , _W}, {"nop", 0 , 0 }, // 9C .. 9F
|
||||||
|
|
||||||
{"LDY", AM_M , im}, {"LDA", AM_IZX, R_}, {"LDX", AM_M , im}, {"NOP", AM_1 , 0 }, // A0 .. A3
|
{"LDY", AM_M , im}, {"LDA", AM_IZX, R_}, {"LDX", AM_M , im}, {"nop", 0 , 0 }, // A0 .. A3
|
||||||
{"LDY", AM_Z , R_}, {"LDA", AM_Z , R_}, {"LDX", AM_Z , R_}, {"NOP", AM_1 , 0 }, // A4 .. A7
|
{"LDY", AM_Z , R_}, {"LDA", AM_Z , R_}, {"LDX", AM_Z , R_}, {"nop", 0 , 0 }, // A4 .. A7
|
||||||
{"TAY", 0 , 0}, {"LDA", AM_M , im}, {"TAX", 0 , 0 }, {"NOP", AM_1 , 0 }, // A8 .. AB
|
{"TAY", 0 , 0}, {"LDA", AM_M , im}, {"TAX", 0 , 0 }, {"nop", 0 , 0 }, // A8 .. AB
|
||||||
{"LDY", AM_A , R_}, {"LDA", AM_A , R_}, {"LDX", AM_A , R_}, {"NOP", AM_1 , 0 }, // AC .. AF
|
{"LDY", AM_A , R_}, {"LDA", AM_A , R_}, {"LDX", AM_A , R_}, {"nop", 0 , 0 }, // AC .. AF
|
||||||
{"BCS", AM_R , 0}, {"LDA", AM_NZY, R_}, {"LDA", AM_NZ , R_}, {"NOP", AM_1 , 0 }, // B0 .. B3
|
{"BCS", AM_R , 0}, {"LDA", AM_NZY, R_}, {"LDA", AM_NZ , R_}, {"nop", 0 , 0 }, // B0 .. B3
|
||||||
{"LDY", AM_ZX , R_}, {"LDA", AM_ZX , R_}, {"LDX", AM_ZY , R_}, {"NOP", AM_1 , 0 }, // B4 .. B7
|
{"LDY", AM_ZX , R_}, {"LDA", AM_ZX , R_}, {"LDX", AM_ZY , R_}, {"nop", 0 , 0 }, // B4 .. B7
|
||||||
{"CLV", 0 , 0}, {"LDA", AM_AY , R_}, {"TSX", 0 , 0 }, {"NOP", AM_1 , 0 }, // B8 .. BB
|
{"CLV", 0 , 0}, {"LDA", AM_AY , R_}, {"TSX", 0 , 0 }, {"nop", 0 , 0 }, // B8 .. BB
|
||||||
{"LDY", AM_AX , R_}, {"LDA", AM_AX , R_}, {"LDX", AM_AY , R_}, {"NOP", AM_1 , 0 }, // BC .. BF
|
{"LDY", AM_AX , R_}, {"LDA", AM_AX , R_}, {"LDX", AM_AY , R_}, {"nop", 0 , 0 }, // BC .. BF
|
||||||
|
|
||||||
{"CPY", AM_M , im}, {"CMP", AM_IZX, R_}, {"NOP", AM_2 , 0}, {"NOP", AM_1 , 0 }, // C0 .. C3
|
{"CPY", AM_M , im}, {"CMP", AM_IZX, R_}, {"nop", AM_M , im}, {"nop", 0 , 0 }, // C0 .. C3
|
||||||
{"CPY", AM_Z , R_}, {"CMP", AM_Z , R_}, {"DEC", AM_Z , RW}, {"NOP", AM_1 , 0 }, // C4 .. C7
|
{"CPY", AM_Z , R_}, {"CMP", AM_Z , R_}, {"DEC", AM_Z , RW}, {"nop", 0 , 0 }, // C4 .. C7
|
||||||
{"INY", 0 , 0}, {"CMP", AM_M , im}, {"DEX", 0 , 0}, {"NOP", AM_1 , 0 }, // C8 .. CB
|
{"INY", 0 , 0}, {"CMP", AM_M , im}, {"DEX", 0 , 0}, {"nop", 0 , 0 }, // C8 .. CB
|
||||||
{"CPY", AM_A , R_}, {"CMP", AM_A , R_}, {"DEC", AM_A , RW}, {"NOP", AM_1 , 0 }, // CC .. CF
|
{"CPY", AM_A , R_}, {"CMP", AM_A , R_}, {"DEC", AM_A , RW}, {"nop", 0 , 0 }, // CC .. CF
|
||||||
{"BNE", AM_R , 0}, {"CMP", AM_NZY, R_}, {"CMP", AM_NZ , 0}, {"NOP", AM_1 , 0 }, // D0 .. D3
|
{"BNE", AM_R , 0}, {"CMP", AM_NZY, R_}, {"CMP", AM_NZ , 0}, {"nop", 0 , 0 }, // D0 .. D3
|
||||||
{"NOP", AM_2 , 0}, {"CMP", AM_ZX , R_}, {"DEC", AM_ZX , RW}, {"NOP", AM_1 , 0 }, // D4 .. D7
|
{"nop", AM_ZX , 0}, {"CMP", AM_ZX , R_}, {"DEC", AM_ZX , RW}, {"nop", 0 , 0 }, // D4 .. D7
|
||||||
{"CLD", 0 , 0}, {"CMP", AM_AY , R_}, {"PHX", 0 , 0}, {"NOP", AM_1 , 0 }, // D8 .. DB
|
{"CLD", 0 , 0}, {"CMP", AM_AY , R_}, {"PHX", 0 , 0}, {"nop", 0 , 0 }, // D8 .. DB
|
||||||
{"NOP", AM_3 , 0}, {"CMP", AM_AX , R_}, {"DEC", AM_AX , RW}, {"NOP", AM_1 , 0 }, // DC .. DF
|
{"nop", AM_AX , 0}, {"CMP", AM_AX , R_}, {"DEC", AM_AX , RW}, {"nop", 0 , 0 }, // DC .. DF
|
||||||
|
|
||||||
{"CPX", AM_M , im}, {"SBC", AM_IZX, R_}, {"NOP", AM_2 , 0}, {"NOP", AM_1 , 0 }, // E0 .. E3
|
{"CPX", AM_M , im}, {"SBC", AM_IZX, R_}, {"nop", AM_M , im}, {"nop", 0 , 0 }, // E0 .. E3
|
||||||
{"CPX", AM_Z , R_}, {"SBC", AM_Z , R_}, {"INC", AM_Z , RW}, {"NOP", AM_1 , 0 }, // E4 .. E7
|
{"CPX", AM_Z , R_}, {"SBC", AM_Z , R_}, {"INC", AM_Z , RW}, {"nop", 0 , 0 }, // E4 .. E7
|
||||||
{"INX", 0 , 0}, {"SBC", AM_M , R_}, {"NOP", 0 , 0}, {"NOP", AM_1 , 0 }, // E8 .. EB
|
{"INX", 0 , 0}, {"SBC", AM_M , R_}, {"NOP", 0 , 0}, {"nop", 0 , 0 }, // E8 .. EB
|
||||||
{"CPX", AM_A , R_}, {"SBC", AM_A , R_}, {"INC", AM_A , RW}, {"NOP", AM_1 , 0 }, // EC .. EF
|
{"CPX", AM_A , R_}, {"SBC", AM_A , R_}, {"INC", AM_A , RW}, {"nop", 0 , 0 }, // EC .. EF
|
||||||
{"BEQ", AM_R , 0}, {"SBC", AM_NZY, R_}, {"SBC", AM_NZ , 0}, {"NOP", AM_1 , 0 }, // F0 .. F3
|
{"BEQ", AM_R , 0}, {"SBC", AM_NZY, R_}, {"SBC", AM_NZ , 0}, {"nop", 0 , 0 }, // F0 .. F3
|
||||||
{"NOP", AM_2 , 0}, {"SBC", AM_ZX , R_}, {"INC", AM_ZX , RW}, {"???", AM_ZX , 0 }, // F4 .. F7
|
{"nop", AM_ZX , 0}, {"SBC", AM_ZX , R_}, {"INC", AM_ZX , RW}, {"nop", 0 , 0 }, // F4 .. F7
|
||||||
{"SED", 0 , 0}, {"SBC", AM_AY , R_}, {"PLX", 0 , 0}, {"NOP", AM_1 , 0 }, // F8 .. FB
|
{"SED", 0 , 0}, {"SBC", AM_AY , R_}, {"PLX", 0 , 0}, {"nop", 0 , 0 }, // F8 .. FB
|
||||||
{"NOP", AM_3 , 0}, {"SBC", AM_AX , R_}, {"INC", AM_AX , RW}, {"NOP", AM_1 , 0 } // FF .. FF
|
{"nop", AM_AX , 0}, {"SBC", AM_AX , R_}, {"INC", AM_AX , RW}, {"nop", 0 , 0 } // FF .. FF
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// TODO:FIXME //e uses 65C02, ][ uses 6502
|
|
||||||
|
|
||||||
const Opcodes_t g_aOpcodes6502[ NUM_OPCODES ] =
|
const Opcodes_t g_aOpcodes6502[ NUM_OPCODES ] =
|
||||||
{ // Should match Cpu.cpp InternalCpuExecute() switch (*(mem+regs.pc++)) !!
|
{ // Should match Cpu.cpp InternalCpuExecute() switch (*(mem+regs.pc++)) !!
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Based on: http://axis.llx.com/~nparker/a2/opcodes.html
|
Based on: http://axis.llx.com/~nparker/a2/opcodes.html
|
||||||
|
|
||||||
If you really want to know what the undocumented --- (n/a) opcodes do, see:
|
If you really want to know what the undocumented --- (n/a) opcodes do, see
|
||||||
http://www.strotmann.de/twiki/bin/view/APG/AsmUnusedOpcodes
|
CPU.cpp
|
||||||
|
|
||||||
x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF
|
x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF
|
||||||
0x BRK ORA (d,X) --- --- tsb d ORA d ASL d --- PHP ORA # ASL A --- tsb a ORA a ASL a ---
|
0x BRK ORA (d,X) --- --- tsb d ORA d ASL d --- PHP ORA # ASL A --- tsb a ORA a ASL a ---
|
||||||
1x BPL r ORA (d),Y ora (d) --- trb d ORA d,X ASL d,X --- CLC ORA a,Y ina A --- trb a ORA a,X ASL a,X ---
|
1x BPL r ORA (d),Y ora (d) --- trb d ORA d,X ASL d,X --- CLC ORA a,Y ina A --- trb a ORA a,X ASL a,X ---
|
||||||
|
@ -205,77 +202,77 @@ Fx BEQ r SBC (d),Y sbc (d) --- --- SBC d,X INC d,X --- SED SBC a,Y
|
||||||
(d),Y
|
(d),Y
|
||||||
|
|
||||||
*/
|
*/
|
||||||
{"BRK", 0 , 0}, {"ORA", AM_IZX, R_}, {"NOP", AM_2 , 0 }, {"NOP", AM_1 , 0 }, // 00 .. 03
|
{"BRK", 0 , 0}, {"ORA", AM_IZX, R_}, {"hlt", 0 , 0 }, {"aso", AM_IZX, RW}, // 00 .. 03
|
||||||
{"TSB", AM_Z , _W}, {"ORA", AM_Z , R_}, {"ASL", AM_Z , RW}, {"NOP", AM_1 , 0 }, // 04 .. 07
|
{"nop", AM_Z , R_}, {"ORA", AM_Z , R_}, {"ASL", AM_Z , RW}, {"aso", AM_Z , RW}, // 04 .. 07
|
||||||
{"PHP", 0 , SW}, {"ORA", AM_M , im}, {"ASL", 0 , 0}, {"NOP", AM_1 , 0 }, // 08 .. 0B
|
{"PHP", 0 , SW}, {"ORA", AM_M , im}, {"ASL", 0 , 0}, {"anc", AM_M , im}, // 08 .. 0B
|
||||||
{"TSB", AM_A , _W}, {"ORA", AM_A , R_}, {"ASL", AM_A , RW}, {"NOP", AM_3 , 0 }, // 0C .. 0F
|
{"nop", AM_AX , 0}, {"ORA", AM_A , R_}, {"ASL", AM_A , RW}, {"aso", AM_A , RW}, // 0C .. 0F
|
||||||
{"BPL", AM_R , 0}, {"ORA", AM_NZY, R_}, {"ORA", AM_NZ , R_}, {"NOP", AM_1 , 0 }, // 10 .. 13
|
{"BPL", AM_R , 0}, {"ORA", AM_NZY, R_}, {"hlt", 0 , 0}, {"aso", AM_NZY, RW}, // 10 .. 13
|
||||||
{"TRB", AM_Z , _W}, {"ORA", AM_ZX , R_}, {"ASL", AM_ZX , RW}, {"NOP", AM_1 , 0 }, // 14 .. 17
|
{"nop", AM_ZX , 0}, {"ORA", AM_ZX , R_}, {"ASL", AM_ZX , RW}, {"aso", AM_ZX , RW}, // 14 .. 17
|
||||||
{"CLC", 0 , 0}, {"ORA", AM_AY , R_}, {"INA", 0 , 0}, {"NOP", AM_1 , 0 }, // 18 .. 1B
|
{"CLC", 0 , 0}, {"ORA", AM_AY , R_}, {"nop", 0 , 0}, {"aso", AM_AY , RW}, // 18 .. 1B
|
||||||
{"TRB", AM_A , _W}, {"ORA", AM_AX , R_}, {"ASL", AM_AX , RW}, {"NOP", AM_1 , 0 }, // 1C .. 1F
|
{"nop", AM_AX , 0}, {"ORA", AM_AX , R_}, {"ASL", AM_AX , RW}, {"aso", AM_AX , RW}, // 1C .. 1F
|
||||||
|
|
||||||
{"JSR", AM_A , SW}, {"AND", AM_IZX, R_}, {"NOP", AM_2 , 0}, {"NOP", AM_1 , 0 }, // 20 .. 23
|
{"JSR", AM_A , SW}, {"AND", AM_IZX, R_}, {"hlt", 0 , 0}, {"rla", AM_IZX, RW}, // 20 .. 23
|
||||||
{"BIT", AM_Z , R_}, {"AND", AM_Z , R_}, {"ROL", AM_Z , RW}, {"NOP", AM_1 , 0 }, // 24 .. 27
|
{"BIT", AM_Z , R_}, {"AND", AM_Z , R_}, {"ROL", AM_Z , RW}, {"rla", AM_Z , RW}, // 24 .. 27
|
||||||
{"PLP", 0 , SR}, {"AND", AM_M , im}, {"ROL", 0 , 0}, {"NOP", AM_1 , 0 }, // 28 .. 2B
|
{"PLP", 0 , SR}, {"AND", AM_M , im}, {"ROL", 0 , 0}, {"anc", AM_M , im}, // 28 .. 2B
|
||||||
{"BIT", AM_A , R_}, {"AND", AM_A , R_}, {"ROL", AM_A , RW}, {"NOP", AM_3 , 0 }, // 2C .. 2F
|
{"BIT", AM_A , R_}, {"AND", AM_A , R_}, {"ROL", AM_A , RW}, {"rla", AM_A , RW}, // 2C .. 2F
|
||||||
{"BMI", AM_R , 0}, {"AND", AM_NZY, R_}, {"AND", AM_NZ , R_}, {"NOP", AM_1 , 0 }, // 30 .. 33
|
{"BMI", AM_R , 0}, {"AND", AM_NZY, R_}, {"hlt", 0 , 0}, {"rla", AM_NZY, RW}, // 30 .. 33
|
||||||
{"BIT", AM_ZX , R_}, {"AND", AM_ZX , R_}, {"ROL", AM_ZX , RW}, {"NOP", AM_1 , 0 }, // 34 .. 37
|
{"nop", AM_ZX , 0}, {"AND", AM_ZX , R_}, {"ROL", AM_ZX , RW}, {"rla", AM_ZX , RW}, // 34 .. 37
|
||||||
{"SEC", 0 , 0}, {"AND", AM_AY , R_}, {"DEA", 0 , 0}, {"NOP", AM_1 , 0 }, // 38 .. 3B
|
{"SEC", 0 , 0}, {"AND", AM_AY , R_}, {"nop", 0 , 0}, {"rla", AM_AY , RW}, // 38 .. 3B
|
||||||
{"BIT", AM_AX , R_}, {"AND", AM_AX , R_}, {"ROL", AM_AX , RW}, {"NOP", AM_1 , 0 }, // 3C .. 3F
|
{"nop", AM_AX , 0}, {"AND", AM_AX , R_}, {"ROL", AM_AX , RW}, {"rla", AM_AX , RW}, // 3C .. 3F
|
||||||
|
|
||||||
{"RTI", 0 , 0}, {"EOR", AM_IZX, R_}, {"NOP", AM_2 , 0}, {"NOP", AM_1 , 0 }, // 40 .. 43
|
{"RTI", 0 , 0}, {"EOR", AM_IZX, R_}, {"hlt", 0 , 0}, {"lse", AM_IZX, RW}, // 40 .. 43
|
||||||
{"NOP", AM_2 , 0}, {"EOR", AM_Z , R_}, {"LSR", AM_Z , _W}, {"NOP", AM_1 , 0 }, // 44 .. 47
|
{"nop", AM_Z , 0}, {"EOR", AM_Z , R_}, {"LSR", AM_Z , RW}, {"lse", AM_Z , RW}, // 44 .. 47
|
||||||
{"PHA", 0 , SW}, {"EOR", AM_M , im}, {"LSR", 0 , 0}, {"NOP", AM_1 , 0 }, // 48 .. 4B
|
{"PHA", 0 , SW}, {"EOR", AM_M , im}, {"LSR", 0 , 0}, {"alr", AM_M , im}, // 48 .. 4B
|
||||||
{"JMP", AM_A , 0}, {"EOR", AM_A , R_}, {"LSR", AM_A , _W}, {"NOP", AM_1 , 0 }, // 4C .. 4F
|
{"JMP", AM_A , 0}, {"EOR", AM_A , R_}, {"LSR", AM_A , RW}, {"lse", AM_A , RW}, // 4C .. 4F
|
||||||
{"BVC", AM_R , 0}, {"EOR", AM_NZY, R_}, {"EOR", AM_NZ , R_}, {"NOP", AM_1 , 0 }, // 50 .. 53
|
{"BVC", AM_R , 0}, {"EOR", AM_NZY, R_}, {"hlt", 0 , 0}, {"lse", AM_NZY, RW}, // 50 .. 53
|
||||||
{"NOP", AM_2 , 0}, {"EOR", AM_ZX , R_}, {"LSR", AM_ZX , _W}, {"NOP", AM_1 , 0 }, // 54 .. 57
|
{"nop", AM_ZX , 0}, {"EOR", AM_ZX , R_}, {"LSR", AM_ZX , RW}, {"lse", AM_ZX , RW}, // 54 .. 57
|
||||||
{"CLI", 0 , 0}, {"EOR", AM_AY , R_}, {"PHY", 0 , SW}, {"NOP", AM_1 , 0 }, // 58 .. 5B
|
{"CLI", 0 , 0}, {"EOR", AM_AY , R_}, {"nop", 0 , 0}, {"lse", AM_AY , RW}, // 58 .. 5B
|
||||||
{"NOP", AM_3 , 0}, {"EOR", AM_AX , R_}, {"LSR", AM_AX , RW}, {"NOP", AM_1 , 0 }, // 5C .. 5F
|
{"nop", AM_AX , 0}, {"EOR", AM_AX , R_}, {"LSR", AM_AX , RW}, {"lse", AM_AX , RW}, // 5C .. 5F
|
||||||
|
|
||||||
{"RTS", 0 , SR}, {"ADC", AM_IZX, R_}, {"NOP", AM_2 , 0}, {"NOP", AM_1 , 0 }, // 60 .. 63
|
{"RTS", 0 , SR}, {"ADC", AM_IZX, R_}, {"hlt", 0 , 0}, {"rra", AM_IZX, RW}, // 60 .. 63
|
||||||
{"STZ", AM_Z , _W}, {"ADC", AM_Z , R_}, {"ROR", AM_Z , RW}, {"NOP", AM_1 , 0 }, // 64 .. 67
|
{"nop", AM_Z , 0}, {"ADC", AM_Z , R_}, {"ROR", AM_Z , RW}, {"rra", AM_Z , RW}, // 64 .. 67
|
||||||
{"PLA", 0 , SR}, {"ADC", AM_M , im}, {"ROR", 0 , 0}, {"NOP", AM_1 , 0 }, // 68 .. 6B
|
{"PLA", 0 , SR}, {"ADC", AM_M , im}, {"ROR", 0 , 0}, {"arr", AM_M , im}, // 68 .. 6B
|
||||||
{"JMP", AM_NA , 0}, {"ADC", AM_A , R_}, {"ROR", AM_A , RW}, {"NOP", AM_1 , 0 }, // 6C .. 6F
|
{"JMP", AM_NA , 0}, {"ADC", AM_A , R_}, {"ROR", AM_A , RW}, {"rra", AM_A , RW}, // 6C .. 6F
|
||||||
{"BVS", AM_R , 0}, {"ADC", AM_NZY, R_}, {"ADC", AM_NZ , R_}, {"NOP", AM_1 , 0 }, // 70 .. 73
|
{"BVS", AM_R , 0}, {"ADC", AM_NZY, R_}, {"hlt", 0 , 0}, {"rra", AM_NZY, RW}, // 70 .. 73
|
||||||
{"STZ", AM_ZX , _W}, {"ADC", AM_ZX , R_}, {"ROR", AM_ZX , RW}, {"NOP", AM_1 , 0 }, // 74 .. 77
|
{"nop", AM_ZX , 0}, {"ADC", AM_ZX , R_}, {"ROR", AM_ZX , RW}, {"rra", AM_ZX , RW}, // 74 .. 77
|
||||||
{"SEI", 0 , 0}, {"ADC", AM_AY , R_}, {"PLY", 0 , SR}, {"NOP", AM_1 , 0 }, // 78 .. 7B
|
{"SEI", 0 , 0}, {"ADC", AM_AY , R_}, {"nop", 0 , 0}, {"rra", AM_AY , RW}, // 78 .. 7B
|
||||||
{"JMP", AM_IAX, 0}, {"ADC", AM_AX , R_}, {"ROR", AM_AX , RW}, {"NOP", AM_1 , 0 }, // 7C .. 7F
|
{"nop", AM_AX , 0}, {"ADC", AM_AX , R_}, {"ROR", AM_AX , RW}, {"rra", AM_AX , RW}, // 7C .. 7F
|
||||||
|
|
||||||
{"BRA", AM_R , 0}, {"STA", AM_IZX, _W}, {"NOP", AM_2 , 0}, {"NOP", AM_1 , 0 }, // 80 .. 83
|
{"nop", AM_M , im}, {"STA", AM_IZX, _W}, {"nop", AM_M , im}, {"axs", AM_IZX, _W}, // 80 .. 83
|
||||||
{"STY", AM_Z , _W}, {"STA", AM_Z , _W}, {"STX", AM_Z , _W}, {"NOP", AM_1 , 0 }, // 84 .. 87
|
{"STY", AM_Z , _W}, {"STA", AM_Z , _W}, {"STX", AM_Z , _W}, {"axs", AM_Z , _W}, // 84 .. 87
|
||||||
{"DEY", 0 , 0}, {"BIT", AM_M , im}, {"TXA", 0 , 0}, {"NOP", AM_1 , 0 }, // 88 .. 8B
|
{"DEY", 0 , 0}, {"nop", AM_M , im}, {"TXA", 0 , 0}, {"xaa", AM_M , im}, // 88 .. 8B
|
||||||
{"STY", AM_A , _W}, {"STA", AM_A , _W}, {"STX", AM_A , _W}, {"NOP", AM_1 , 0 }, // 8C .. 8F
|
{"STY", AM_A , _W}, {"STA", AM_A , _W}, {"STX", AM_A , _W}, {"axs", AM_A , _W}, // 8C .. 8F
|
||||||
{"BCC", AM_R , 0}, {"STA", AM_NZY, _W}, {"STA", AM_NZ , _W}, {"NOP", AM_1 , 0 }, // 90 .. 93
|
{"BCC", AM_R , 0}, {"STA", AM_NZY, _W}, {"hlt", 0 , 0}, {"axa", AM_NZY, _W}, // 90 .. 93
|
||||||
{"STY", AM_ZX , _W}, {"STA", AM_ZX , _W}, {"STX", AM_ZY , _W}, {"NOP", AM_1 , 0 }, // 94 .. 97
|
{"STY", AM_ZX , _W}, {"STA", AM_ZX , _W}, {"STX", AM_ZY , _W}, {"axs", AM_ZY , _W}, // 94 .. 97
|
||||||
{"TYA", 0 , 0}, {"STA", AM_AY , _W}, {"TXS", 0 , 0}, {"NOP", AM_1 , 0 }, // 98 .. 9B
|
{"TYA", 0 , 0}, {"STA", AM_AY , _W}, {"TXS", 0 , 0}, {"tas", AM_AY , _W}, // 98 .. 9B
|
||||||
{"STZ", AM_A , _W}, {"STA", AM_AX , _W}, {"STZ", AM_AX , _W}, {"NOP", AM_1 , 0 }, // 9C .. 9F
|
{"say", AM_AX , _W}, {"STA", AM_AX , _W}, {"xas", AM_AX , _W}, {"axa", AM_AY , _W}, // 9C .. 9F
|
||||||
|
|
||||||
{"LDY", AM_M , im}, {"LDA", AM_IZX, R_}, {"LDX", AM_M , im}, {"NOP", AM_1 , 0 }, // A0 .. A3
|
{"LDY", AM_M , im}, {"LDA", AM_IZX, R_}, {"LDX", AM_M , im}, {"lax", AM_IZX, R_}, // A0 .. A3
|
||||||
{"LDY", AM_Z , R_}, {"LDA", AM_Z , R_}, {"LDX", AM_Z , R_}, {"NOP", AM_1 , 0 }, // A4 .. A7
|
{"LDY", AM_Z , R_}, {"LDA", AM_Z , R_}, {"LDX", AM_Z , R_}, {"lax", AM_Z , R_}, // A4 .. A7
|
||||||
{"TAY", 0 , 0}, {"LDA", AM_M , im}, {"TAX", 0 , 0 }, {"NOP", AM_1 , 0 }, // A8 .. AB
|
{"TAY", 0 , 0}, {"LDA", AM_M , im}, {"TAX", 0 , 0 }, {"oal", AM_M , im}, // A8 .. AB
|
||||||
{"LDY", AM_A , R_}, {"LDA", AM_A , R_}, {"LDX", AM_A , R_}, {"NOP", AM_1 , 0 }, // AC .. AF
|
{"LDY", AM_A , R_}, {"LDA", AM_A , R_}, {"LDX", AM_A , R_}, {"lax", AM_A , R_}, // AC .. AF
|
||||||
{"BCS", AM_R , 0}, {"LDA", AM_NZY, R_}, {"LDA", AM_NZ , R_}, {"NOP", AM_1 , 0 }, // B0 .. B3
|
{"BCS", AM_R , 0}, {"LDA", AM_NZY, R_}, {"hlt", 0 , 0 }, {"lax", AM_NZY, R_}, // B0 .. B3
|
||||||
{"LDY", AM_ZX , R_}, {"LDA", AM_ZX , R_}, {"LDX", AM_ZY , R_}, {"NOP", AM_1 , 0 }, // B4 .. B7
|
{"LDY", AM_ZX , R_}, {"LDA", AM_ZX , R_}, {"LDX", AM_ZY , R_}, {"lax", AM_ZY , 0 }, // B4 .. B7
|
||||||
{"CLV", 0 , 0}, {"LDA", AM_AY , R_}, {"TSX", 0 , 0 }, {"NOP", AM_1 , 0 }, // B8 .. BB
|
{"CLV", 0 , 0}, {"LDA", AM_AY , R_}, {"TSX", 0 , 0 }, {"las", AM_AY , R_}, // B8 .. BB
|
||||||
{"LDY", AM_AX , R_}, {"LDA", AM_AX , R_}, {"LDX", AM_AY , R_}, {"NOP", AM_1 , 0 }, // BC .. BF
|
{"LDY", AM_AX , R_}, {"LDA", AM_AX , R_}, {"LDX", AM_AY , R_}, {"lax", AM_AY , R_}, // BC .. BF
|
||||||
|
|
||||||
{"CPY", AM_M , im}, {"CMP", AM_IZX, R_}, {"NOP", AM_2 , 0}, {"NOP", AM_1 , 0 }, // C0 .. C3
|
{"CPY", AM_M , im}, {"CMP", AM_IZX, R_}, {"nop", AM_M , im}, {"dcm", AM_IZX, RW}, // C0 .. C3
|
||||||
{"CPY", AM_Z , R_}, {"CMP", AM_Z , R_}, {"DEC", AM_Z , RW}, {"NOP", AM_1 , 0 }, // C4 .. C7
|
{"CPY", AM_Z , R_}, {"CMP", AM_Z , R_}, {"DEC", AM_Z , RW}, {"dcm", AM_Z , RW}, // C4 .. C7
|
||||||
{"INY", 0 , 0}, {"CMP", AM_M , im}, {"DEX", 0 , 0}, {"NOP", AM_1 , 0 }, // C8 .. CB
|
{"INY", 0 , 0}, {"CMP", AM_M , im}, {"DEX", 0 , 0}, {"sax", AM_M , im}, // C8 .. CB
|
||||||
{"CPY", AM_A , R_}, {"CMP", AM_A , R_}, {"DEC", AM_A , RW}, {"NOP", AM_1 , 0 }, // CC .. CF
|
{"CPY", AM_A , R_}, {"CMP", AM_A , R_}, {"DEC", AM_A , RW}, {"dcm", AM_A , RW}, // CC .. CF
|
||||||
{"BNE", AM_R , 0}, {"CMP", AM_NZY, R_}, {"CMP", AM_NZ , 0}, {"NOP", AM_1 , 0 }, // D0 .. D3
|
{"BNE", AM_R , 0}, {"CMP", AM_NZY, R_}, {"hlt", 0 , 0}, {"dcm", AM_NZY, RW}, // D0 .. D3
|
||||||
{"NOP", AM_2 , 0}, {"CMP", AM_ZX , R_}, {"DEC", AM_ZX , RW}, {"NOP", AM_1 , 0 }, // D4 .. D7
|
{"nop", AM_ZX , 0}, {"CMP", AM_ZX , R_}, {"DEC", AM_ZX , RW}, {"dcm", AM_ZX , RW}, // D4 .. D7
|
||||||
{"CLD", 0 , 0}, {"CMP", AM_AY , R_}, {"PHX", 0 , 0}, {"NOP", AM_1 , 0 }, // D8 .. DB
|
{"CLD", 0 , 0}, {"CMP", AM_AY , R_}, {"nop", 0 , 0}, {"dcm", AM_AY , RW}, // D8 .. DB
|
||||||
{"NOP", AM_3 , 0}, {"CMP", AM_AX , R_}, {"DEC", AM_AX , RW}, {"NOP", AM_1 , 0 }, // DC .. DF
|
{"nop", AM_AX , 0}, {"CMP", AM_AX , R_}, {"DEC", AM_AX , RW}, {"dcm", AM_AX , RW}, // DC .. DF
|
||||||
|
|
||||||
{"CPX", AM_M , im}, {"SBC", AM_IZX, R_}, {"NOP", AM_2 , 0}, {"NOP", AM_1 , 0 }, // E0 .. E3
|
{"CPX", AM_M , im}, {"SBC", AM_IZX, R_}, {"nop", AM_M , im}, {"ins", AM_IZX, RW}, // E0 .. E3
|
||||||
{"CPX", AM_Z , R_}, {"SBC", AM_Z , R_}, {"INC", AM_Z , RW}, {"NOP", AM_1 , 0 }, // E4 .. E7
|
{"CPX", AM_Z , R_}, {"SBC", AM_Z , R_}, {"INC", AM_Z , RW}, {"ins", AM_Z , RW}, // E4 .. E7
|
||||||
{"INX", 0 , 0}, {"SBC", AM_M , R_}, {"NOP", 0 , 0}, {"NOP", AM_1 , 0 }, // E8 .. EB
|
{"INX", 0 , 0}, {"SBC", AM_M , im}, {"NOP", 0 , 0}, {"sbc", AM_M , im}, // E8 .. EB
|
||||||
{"CPX", AM_A , R_}, {"SBC", AM_A , R_}, {"INC", AM_A , RW}, {"NOP", AM_1 , 0 }, // EC .. EF
|
{"CPX", AM_A , R_}, {"SBC", AM_A , R_}, {"INC", AM_A , RW}, {"ins", AM_A , RW}, // EC .. EF
|
||||||
{"BEQ", AM_R , 0}, {"SBC", AM_NZY, R_}, {"SBC", AM_NZ , 0}, {"NOP", AM_1 , 0 }, // F0 .. F3
|
{"BEQ", AM_R , 0}, {"SBC", AM_NZY, R_}, {"hlt", 0 , 0}, {"ins", AM_NZY, RW}, // F0 .. F3
|
||||||
{"NOP", AM_2 , 0}, {"SBC", AM_ZX , R_}, {"INC", AM_ZX , RW}, {"???", AM_ZX , 0 }, // F4 .. F7
|
{"nop", AM_ZX , 0}, {"SBC", AM_ZX , R_}, {"INC", AM_ZX , RW}, {"ins", AM_ZX , RW}, // F4 .. F7
|
||||||
{"SED", 0 , 0}, {"SBC", AM_AY , R_}, {"PLX", 0 , 0}, {"NOP", AM_1 , 0 }, // F8 .. FB
|
{"SED", 0 , 0}, {"SBC", AM_AY , R_}, {"nop", 0 , 0}, {"ins", AM_AY , RW}, // F8 .. FB
|
||||||
{"NOP", AM_3 , 0}, {"SBC", AM_AX , R_}, {"INC", AM_AX , RW}, {"NOP", AM_1 , 0 } // FF .. FF
|
{"nop", AM_AX , 0}, {"SBC", AM_AX , R_}, {"INC", AM_AX , RW}, {"ins", AM_AX , RW} // FF .. FF
|
||||||
};
|
};
|
||||||
|
|
||||||
#undef R_
|
#undef R_
|
||||||
|
|
|
@ -132,7 +132,7 @@ Update_t CmdMOTD( int nArgs )
|
||||||
{
|
{
|
||||||
TCHAR sText[ CONSOLE_WIDTH ];
|
TCHAR sText[ CONSOLE_WIDTH ];
|
||||||
|
|
||||||
ConsoleBufferPush( TEXT(" Apple ][+ //e Emulator for Windows") );
|
ConsoleBufferPush( TEXT(" Apple ][ ][+ //e Emulator for Windows") );
|
||||||
CmdVersion(0);
|
CmdVersion(0);
|
||||||
CmdSymbols(0);
|
CmdSymbols(0);
|
||||||
wsprintf( sText, " '~' console, '%s' (specific), '%s' (all)"
|
wsprintf( sText, " '~' console, '%s' (specific), '%s' (all)"
|
||||||
|
|
|
@ -384,7 +384,8 @@ void DrawStatusArea (HDC passdc, int drawflags) {
|
||||||
}
|
}
|
||||||
if (drawflags & DRAW_TITLE) {
|
if (drawflags & DRAW_TITLE) {
|
||||||
TCHAR title[40];
|
TCHAR title[40];
|
||||||
_tcscpy(title,apple2e ? TITLE : TEXT("Apple ][+ Emulator"));
|
_tcscpy(title,apple2e ? TITLE : (apple2plus ? TEXT("Apple ][+ Emulator")
|
||||||
|
: TEXT("Apple ][ Emulator")));
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case MODE_PAUSED: _tcscat(title,TEXT(" [Paused]")); break;
|
case MODE_PAUSED: _tcscat(title,TEXT(" [Paused]")); break;
|
||||||
case MODE_STEPPING: _tcscat(title,TEXT(" [Stepping]")); break;
|
case MODE_STEPPING: _tcscat(title,TEXT(" [Stepping]")); break;
|
||||||
|
@ -1116,12 +1117,14 @@ void FrameCreateWindow () {
|
||||||
int ypos;
|
int ypos;
|
||||||
if (!RegLoadValue(TEXT("Preferences"),TEXT("Window Y-Position"),1,(DWORD *)&ypos))
|
if (!RegLoadValue(TEXT("Preferences"),TEXT("Window Y-Position"),1,(DWORD *)&ypos))
|
||||||
ypos = (GetSystemMetrics(SM_CYSCREEN)-height) >> 1;
|
ypos = (GetSystemMetrics(SM_CYSCREEN)-height) >> 1;
|
||||||
g_hFrameWindow = CreateWindow(TEXT("APPLE2FRAME"),apple2e ? TITLE
|
g_hFrameWindow = CreateWindow(TEXT("APPLE2FRAME"),
|
||||||
: TEXT("Apple ][+ Emulator"),
|
apple2e ? TITLE
|
||||||
WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX |
|
: (apple2plus ? TEXT("Apple ][+ Emulator")
|
||||||
WS_VISIBLE,
|
: TEXT("Apple ][ Emulator")),
|
||||||
xpos,ypos,width,height,
|
WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU |
|
||||||
HWND_DESKTOP,(HMENU)0,instance,NULL);
|
WS_MINIMIZEBOX | WS_VISIBLE,
|
||||||
|
xpos,ypos,width,height,
|
||||||
|
HWND_DESKTOP,(HMENU)0,instance,NULL);
|
||||||
InitCommonControls();
|
InitCommonControls();
|
||||||
tooltipwindow = CreateWindow(TOOLTIPS_CLASS,NULL,TTS_ALWAYSTIP,
|
tooltipwindow = CreateWindow(TOOLTIPS_CLASS,NULL,TTS_ALWAYSTIP,
|
||||||
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
|
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
|
||||||
|
|
|
@ -32,13 +32,9 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
static bool g_bKeybBufferEnable = false;
|
static bool g_bKeybBufferEnable = false;
|
||||||
|
|
||||||
#define KEY_OLD
|
#define KEY_OLD
|
||||||
#define OLIVER_SCHMIDT_FIX2 // PC's delete key maps to Apple's DEL key
|
|
||||||
|
|
||||||
#ifdef OLIVER_SCHMIDT_FIX2
|
static BYTE asciicode[2][10] = {{0x08,0x0D,0x15,0x2F,0x00,0x00,0x00,0x00,0x00,0x00},
|
||||||
static BYTE asciicode[10] = {0x08,0x0B,0x15,0x0A,0x00,0x00,0x00,0x00,0x00,0x7F}; // Convert PC arrow keys to Apple keycodes
|
{0x08,0x0B,0x15,0x0A,0x00,0x00,0x00,0x00,0x00,0x7F}}; // Convert PC arrow keys to Apple keycodes
|
||||||
#else
|
|
||||||
static BYTE asciicode[4] = {0x08,0x0B,0x15,0x0A}; // Convert PC arrow keys to Apple keycodes
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static bool gbShiftKey = false; // +PATCH MJP
|
static bool gbShiftKey = false; // +PATCH MJP
|
||||||
static bool gbCtrlKey = false; // +PATCH MJP
|
static bool gbCtrlKey = false; // +PATCH MJP
|
||||||
|
@ -148,21 +144,34 @@ DWORD KeybGetNumQueries () // Used in determining 'idleness' of Apple system
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
void KeybQueueKeypress (int key, BOOL bASCII)
|
void KeybQueueKeypress (int key, BOOL bASCII)
|
||||||
{
|
{
|
||||||
|
static bool bFreshReset;
|
||||||
|
|
||||||
if (bASCII == ASCII)
|
if (bASCII == ASCII)
|
||||||
{
|
{
|
||||||
|
if (bFreshReset && key == 0x03) {
|
||||||
|
bFreshReset = 0;
|
||||||
|
return; // Swallow spurious CTRL-C caused by CTRL-BREAK
|
||||||
|
}
|
||||||
|
bFreshReset = 0;
|
||||||
if (key > 0x7F)
|
if (key > 0x7F)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if ((key >= 'a') && (key <= 'z') && (capslock || !apple2e))
|
if (apple2e)
|
||||||
keycode = key - ('a'-'A');
|
if (capslock && (key >= 'a') && (key <='z'))
|
||||||
|
keycode = key - 32;
|
||||||
|
else
|
||||||
|
keycode = key;
|
||||||
else
|
else
|
||||||
keycode = key;
|
if (key >= '`')
|
||||||
|
keycode = key - 32;
|
||||||
|
else
|
||||||
|
keycode = key;
|
||||||
|
|
||||||
lastvirtkey = LOBYTE(VkKeyScan(key));
|
lastvirtkey = LOBYTE(VkKeyScan(key));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if ((key == VK_CANCEL) && ((!apple2e) || (GetKeyState(VK_CONTROL) < 0)) )
|
if ((key == VK_CANCEL) && (GetKeyState(VK_CONTROL) < 0))
|
||||||
{
|
{
|
||||||
// Ctrl+Reset
|
// Ctrl+Reset
|
||||||
if (apple2e)
|
if (apple2e)
|
||||||
|
@ -170,14 +179,16 @@ void KeybQueueKeypress (int key, BOOL bASCII)
|
||||||
|
|
||||||
DiskReset();
|
DiskReset();
|
||||||
KeybReset();
|
KeybReset();
|
||||||
VideoResetState(); // Switch Alternate char set off
|
if (apple2e)
|
||||||
|
VideoResetState(); // Switch Alternate char set off
|
||||||
MB_Reset();
|
MB_Reset();
|
||||||
|
|
||||||
#ifndef KEY_OLD
|
#ifndef KEY_OLD
|
||||||
g_nNextInIdx = g_nNextOutIdx = g_nKeyBufferCnt = 0;
|
g_nNextInIdx = g_nNextOutIdx = g_nKeyBufferCnt = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
CpuInitialize();
|
CpuReset();
|
||||||
|
bFreshReset = 1;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -188,19 +199,11 @@ void KeybQueueKeypress (int key, BOOL bASCII)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef OLIVER_SCHMIDT_FIX2
|
if (!((key >= VK_LEFT) && (key <= VK_DELETE) && asciicode[apple2e][key - VK_LEFT]))
|
||||||
if (!((key >= VK_LEFT) && (key <= VK_DELETE) && asciicode[key - VK_LEFT]))
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
keycode = asciicode[key - VK_LEFT]; // Convert to Apple arrow keycode
|
keycode = asciicode[apple2e][key - VK_LEFT]; // Convert to Apple arrow keycode
|
||||||
lastvirtkey = key;
|
lastvirtkey = key;
|
||||||
#else
|
|
||||||
if (!((key >= VK_LEFT) && (key <= VK_DOWN)))
|
|
||||||
return;
|
|
||||||
|
|
||||||
keycode = asciicode[key - VK_LEFT]; // Convert to Apple arrow keycode
|
|
||||||
lastvirtkey = key;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
#ifdef KEY_OLD
|
#ifdef KEY_OLD
|
||||||
keywaiting = 1;
|
keywaiting = 1;
|
||||||
|
|
|
@ -898,11 +898,14 @@ void MemInitialize () {
|
||||||
const UINT ROM_SIZE = 0x5000; // HACK: Magic #
|
const UINT ROM_SIZE = 0x5000; // HACK: Magic #
|
||||||
|
|
||||||
HRSRC hResInfo = apple2e ? FindResource(NULL, MAKEINTRESOURCE(IDR_APPLE2E_ROM), "ROM")
|
HRSRC hResInfo = apple2e ? FindResource(NULL, MAKEINTRESOURCE(IDR_APPLE2E_ROM), "ROM")
|
||||||
: FindResource(NULL, MAKEINTRESOURCE(IDR_APPLE2_ROM), "ROM");
|
: (apple2plus ? FindResource(NULL, MAKEINTRESOURCE(IDR_APPLE2PLUS_ROM), "ROM")
|
||||||
|
: FindResource(NULL, MAKEINTRESOURCE(IDR_APPLE2ORIG_ROM), "ROM"));
|
||||||
if(hResInfo == NULL)
|
if(hResInfo == NULL)
|
||||||
{
|
{
|
||||||
TCHAR sRomFileName[ 128 ];
|
TCHAR sRomFileName[ 128 ];
|
||||||
_tcscpy( sRomFileName, apple2e ? TEXT("APPLE2E.ROM") : TEXT("APPLE2.ROM") );
|
_tcscpy( sRomFileName, apple2e ? TEXT("APPLE2E.ROM")
|
||||||
|
: (apple2plus ? TEXT("APPLE2PLUS.ROM")
|
||||||
|
: TEXT("APPLE2ORIG.ROM")));
|
||||||
|
|
||||||
TCHAR sText[ 256 ];
|
TCHAR sText[ 256 ];
|
||||||
wsprintf( sText, TEXT("Unable to open the required firmware ROM data file.\n\nFile: %s."), sRomFileName );
|
wsprintf( sText, TEXT("Unable to open the required firmware ROM data file.\n\nFile: %s."), sRomFileName );
|
||||||
|
@ -982,8 +985,7 @@ void MemReset ()
|
||||||
|
|
||||||
// INITIALIZE PAGING, FILLING IN THE 64K MEMORY IMAGE
|
// INITIALIZE PAGING, FILLING IN THE 64K MEMORY IMAGE
|
||||||
ResetPaging(1);
|
ResetPaging(1);
|
||||||
regs.pc = *(LPWORD)(mem+0xFFFC);
|
regs.bRESET = 1;
|
||||||
CpuIrqReset();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
|
|
@ -304,9 +304,15 @@ static void UpdateIFR(SY6522_AY8910* pMB)
|
||||||
bIRQ |= g_MB[i].sy6522.IFR & 0x80;
|
bIRQ |= g_MB[i].sy6522.IFR & 0x80;
|
||||||
|
|
||||||
if (bIRQ)
|
if (bIRQ)
|
||||||
CpuIrqAssert(IS_6522);
|
if (pMB->nAY8910Number & 1)
|
||||||
|
CpuNmiAssert(IS_6522);
|
||||||
|
else
|
||||||
|
CpuIrqAssert(IS_6522);
|
||||||
else
|
else
|
||||||
CpuIrqDeassert(IS_6522);
|
if (pMB->nAY8910Number & 1)
|
||||||
|
CpuNmiDeassert(IS_6522);
|
||||||
|
else
|
||||||
|
CpuIrqDeassert(IS_6522);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void SY6522_Write(BYTE nDevice, BYTE nReg, BYTE nValue)
|
static void SY6522_Write(BYTE nDevice, BYTE nReg, BYTE nValue)
|
||||||
|
@ -568,6 +574,9 @@ static void SSI263_Write(BYTE nDevice, BYTE nReg, BYTE nValue)
|
||||||
|
|
||||||
// Datasheet is not clear, but a write to DURPHON must clear the IRQ
|
// Datasheet is not clear, but a write to DURPHON must clear the IRQ
|
||||||
if(g_bPhasorEnable)
|
if(g_bPhasorEnable)
|
||||||
|
if (pMB->nAY8910Number & 1)
|
||||||
|
CpuNmiDeassert(IS_SPEECH);
|
||||||
|
else
|
||||||
CpuIrqDeassert(IS_SPEECH);
|
CpuIrqDeassert(IS_SPEECH);
|
||||||
pMB->sy6522.IFR &= ~IxR_PERIPHERAL;
|
pMB->sy6522.IFR &= ~IxR_PERIPHERAL;
|
||||||
UpdateIFR(pMB);
|
UpdateIFR(pMB);
|
||||||
|
@ -895,7 +904,10 @@ static DWORD WINAPI SSI263Thread(LPVOID lpParameter)
|
||||||
pMB->SpeechChip.CurrentMode |= 1; // Set SSI263's D7 pin
|
pMB->SpeechChip.CurrentMode |= 1; // Set SSI263's D7 pin
|
||||||
|
|
||||||
// Is Phasor's SSI263.IRQ wired directly to IRQ? (Bypassing the 6522)
|
// Is Phasor's SSI263.IRQ wired directly to IRQ? (Bypassing the 6522)
|
||||||
CpuIrqAssert(IS_SPEECH);
|
if (pMB->nAY8910Number & 1)
|
||||||
|
CpuNmiAssert(IS_SPEECH);
|
||||||
|
else
|
||||||
|
CpuIrqAssert(IS_SPEECH);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -35,7 +35,8 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
#include "Tfe\Uilib.h"
|
#include "Tfe\Uilib.h"
|
||||||
|
|
||||||
|
|
||||||
TCHAR computerchoices[] = TEXT("Apple ][+\0")
|
TCHAR computerchoices[] = TEXT("Apple ][ (Original Model)\0")
|
||||||
|
TEXT("Apple ][+\0")
|
||||||
TEXT("Apple //e\0");
|
TEXT("Apple //e\0");
|
||||||
|
|
||||||
TCHAR* szJoyChoice0 = TEXT("Disabled\0");
|
TCHAR* szJoyChoice0 = TEXT("Disabled\0");
|
||||||
|
@ -206,7 +207,7 @@ static void ConfigDlg_OK(HWND window, BOOL afterclose)
|
||||||
DWORD newvidtype = (DWORD)SendDlgItemMessage(window,IDC_VIDEOTYPE,CB_GETCURSEL,0,0);
|
DWORD newvidtype = (DWORD)SendDlgItemMessage(window,IDC_VIDEOTYPE,CB_GETCURSEL,0,0);
|
||||||
DWORD newserialport = (DWORD)SendDlgItemMessage(window,IDC_SERIALPORT,CB_GETCURSEL,0,0);
|
DWORD newserialport = (DWORD)SendDlgItemMessage(window,IDC_SERIALPORT,CB_GETCURSEL,0,0);
|
||||||
|
|
||||||
if (newcomptype != apple2e)
|
if (newcomptype != (apple2e ? 2 : (apple2plus ? 1 : 0)))
|
||||||
{
|
{
|
||||||
if (MessageBox(window,
|
if (MessageBox(window,
|
||||||
TEXT("You have changed the emulated computer ")
|
TEXT("You have changed the emulated computer ")
|
||||||
|
@ -340,7 +341,7 @@ static BOOL CALLBACK ConfigDlgProc (HWND window,
|
||||||
{
|
{
|
||||||
g_nLastPage = PG_CONFIG;
|
g_nLastPage = PG_CONFIG;
|
||||||
|
|
||||||
FillComboBox(window,IDC_COMPUTER,computerchoices,apple2e);
|
FillComboBox(window,IDC_COMPUTER,computerchoices,apple2e ? 2 : (apple2plus ? 1 : 0));
|
||||||
FillComboBox(window,IDC_VIDEOTYPE,videochoices,videotype);
|
FillComboBox(window,IDC_VIDEOTYPE,videochoices,videotype);
|
||||||
FillComboBox(window,IDC_SERIALPORT,serialchoices,serialport);
|
FillComboBox(window,IDC_SERIALPORT,serialchoices,serialport);
|
||||||
SendDlgItemMessage(window,IDC_SLIDER_CPU_SPEED,TBM_SETRANGE,1,MAKELONG(0,40));
|
SendDlgItemMessage(window,IDC_SLIDER_CPU_SPEED,TBM_SETRANGE,1,MAKELONG(0,40));
|
||||||
|
|
|
@ -120,7 +120,8 @@ enum Color_Palette_Index_e
|
||||||
|
|
||||||
|
|
||||||
#define SRCOFFS_40COL 0
|
#define SRCOFFS_40COL 0
|
||||||
#define SRCOFFS_80COL (SRCOFFS_40COL + 256)
|
#define SRCOFFS_IIPLUS (SRCOFFS_40COL + 256)
|
||||||
|
#define SRCOFFS_80COL (SRCOFFS_IIPLUS + 256)
|
||||||
#define SRCOFFS_LORES (SRCOFFS_80COL + 128)
|
#define SRCOFFS_LORES (SRCOFFS_80COL + 128)
|
||||||
#define SRCOFFS_HIRES (SRCOFFS_LORES + 16)
|
#define SRCOFFS_HIRES (SRCOFFS_LORES + 16)
|
||||||
#define SRCOFFS_DHIRES (SRCOFFS_HIRES + 512)
|
#define SRCOFFS_DHIRES (SRCOFFS_HIRES + 512)
|
||||||
|
@ -906,10 +907,18 @@ void DrawMonoLoResSource () {
|
||||||
void DrawMonoTextSource (HDC dc) {
|
void DrawMonoTextSource (HDC dc) {
|
||||||
HDC memdc = CreateCompatibleDC(dc);
|
HDC memdc = CreateCompatibleDC(dc);
|
||||||
HBITMAP bitmap = LoadBitmap(instance,TEXT("CHARSET40"));
|
HBITMAP bitmap = LoadBitmap(instance,TEXT("CHARSET40"));
|
||||||
HBRUSH brush = CreateSolidBrush(monochrome);
|
HBRUSH brush;
|
||||||
|
switch (videotype)
|
||||||
|
{
|
||||||
|
case VT_MONO_AMBER: brush = CreateSolidBrush(RGB(0xFF,0x80,0x00)); break;
|
||||||
|
case VT_MONO_GREEN: brush = CreateSolidBrush(RGB(0x00,0xC0,0x00)); break;
|
||||||
|
case VT_MONO_WHITE: brush = CreateSolidBrush(RGB(0xFF,0xFF,0xFF)); break;
|
||||||
|
default : brush = CreateSolidBrush(monochrome); break;
|
||||||
|
}
|
||||||
SelectObject(memdc,bitmap);
|
SelectObject(memdc,bitmap);
|
||||||
SelectObject(dc,brush);
|
SelectObject(dc,brush);
|
||||||
BitBlt(dc,SRCOFFS_40COL,0,256,512,memdc,0,0,MERGECOPY);
|
BitBlt(dc,SRCOFFS_40COL,0,256,512,memdc,0,0,MERGECOPY);
|
||||||
|
BitBlt(dc,SRCOFFS_IIPLUS,0,256,256,memdc,0,512,MERGECOPY);
|
||||||
StretchBlt(dc,SRCOFFS_80COL,0,128,512,memdc,0,0,256,512,MERGECOPY);
|
StretchBlt(dc,SRCOFFS_80COL,0,128,512,memdc,0,0,256,512,MERGECOPY);
|
||||||
SelectObject(dc,GetStockObject(NULL_BRUSH));
|
SelectObject(dc,GetStockObject(NULL_BRUSH));
|
||||||
DeleteObject(brush);
|
DeleteObject(brush);
|
||||||
|
@ -923,6 +932,7 @@ void DrawTextSource (HDC dc) {
|
||||||
HBITMAP bitmap = LoadBitmap(instance,TEXT("CHARSET40"));
|
HBITMAP bitmap = LoadBitmap(instance,TEXT("CHARSET40"));
|
||||||
SelectObject(memdc,bitmap);
|
SelectObject(memdc,bitmap);
|
||||||
BitBlt(dc,SRCOFFS_40COL,0,256,512,memdc,0,0,SRCCOPY);
|
BitBlt(dc,SRCOFFS_40COL,0,256,512,memdc,0,0,SRCCOPY);
|
||||||
|
BitBlt(dc,SRCOFFS_IIPLUS,0,256,256,memdc,0,512,SRCCOPY);
|
||||||
StretchBlt(dc,SRCOFFS_80COL,0,128,512,memdc,0,0,256,512,SRCCOPY);
|
StretchBlt(dc,SRCOFFS_80COL,0,128,512,memdc,0,0,256,512,SRCCOPY);
|
||||||
DeleteDC(memdc);
|
DeleteDC(memdc);
|
||||||
DeleteObject(bitmap);
|
DeleteObject(bitmap);
|
||||||
|
@ -958,15 +968,10 @@ BOOL Update40ColCell (int x, int y, int xpixel, int ypixel, int offset)
|
||||||
{
|
{
|
||||||
bool bInvert = bCharFlashing ? g_bTextFlashState : false;
|
bool bInvert = bCharFlashing ? g_bTextFlashState : false;
|
||||||
|
|
||||||
// Apple ][ inits memory to FF,FF,00,00
|
|
||||||
// The 7F char is same as (inverse) space
|
|
||||||
if ((! apple2e) && (ch == 0xFF))
|
|
||||||
ch = 32;
|
|
||||||
|
|
||||||
CopySource(xpixel,ypixel,
|
CopySource(xpixel,ypixel,
|
||||||
14,16,
|
14,16,
|
||||||
SRCOFFS_40COL+((ch & 0x0F) << 4),
|
(apple2e?SRCOFFS_40COL:SRCOFFS_IIPLUS)+((ch & 0x0F) << 4),
|
||||||
(ch & 0xF0)+charoffs + (bInvert?0x40:0x00));
|
(ch & 0xF0)+charoffs + (bInvert?0x40:0x00));
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -1931,10 +1936,10 @@ BYTE __stdcall VideoSetMode (WORD, BYTE address, BYTE write, BYTE, ULONG) {
|
||||||
switch (address) {
|
switch (address) {
|
||||||
case 0x00: vidmode &= ~VF_MASK2; break;
|
case 0x00: vidmode &= ~VF_MASK2; break;
|
||||||
case 0x01: vidmode |= VF_MASK2; break;
|
case 0x01: vidmode |= VF_MASK2; break;
|
||||||
case 0x0C: vidmode &= ~VF_80COL; break;
|
case 0x0C: if (apple2e) vidmode &= ~VF_80COL; break;
|
||||||
case 0x0D: vidmode |= VF_80COL; break;
|
case 0x0D: if (apple2e) vidmode |= VF_80COL; break;
|
||||||
case 0x0E: charoffs = 0; break; // Alternate char set off
|
case 0x0E: if (apple2e) charoffs = 0; break; // Alternate char set off
|
||||||
case 0x0F: charoffs = 256; break; // Alternate char set on
|
case 0x0F: if (apple2e) charoffs = 256; break; // Alternate char set on
|
||||||
case 0x50: vidmode &= ~VF_TEXT; break;
|
case 0x50: vidmode &= ~VF_TEXT; break;
|
||||||
case 0x51: vidmode |= VF_TEXT; break;
|
case 0x51: vidmode |= VF_TEXT; break;
|
||||||
case 0x52: vidmode &= ~VF_MIXED; break;
|
case 0x52: vidmode &= ~VF_MIXED; break;
|
||||||
|
@ -1943,8 +1948,8 @@ BYTE __stdcall VideoSetMode (WORD, BYTE address, BYTE write, BYTE, ULONG) {
|
||||||
case 0x55: vidmode |= VF_PAGE2; break;
|
case 0x55: vidmode |= VF_PAGE2; break;
|
||||||
case 0x56: vidmode &= ~VF_HIRES; break;
|
case 0x56: vidmode &= ~VF_HIRES; break;
|
||||||
case 0x57: vidmode |= VF_HIRES; break;
|
case 0x57: vidmode |= VF_HIRES; break;
|
||||||
case 0x5E: vidmode |= VF_DHIRES; break;
|
case 0x5E: if (apple2e) vidmode |= VF_DHIRES; break;
|
||||||
case 0x5F: vidmode &= ~VF_DHIRES; break;
|
case 0x5F: if (apple2e) vidmode &= ~VF_DHIRES; break;
|
||||||
}
|
}
|
||||||
if (SW_MASK2)
|
if (SW_MASK2)
|
||||||
vidmode &= ~VF_PAGE2;
|
vidmode &= ~VF_PAGE2;
|
||||||
|
@ -2000,7 +2005,7 @@ void VideoUpdateFlash()
|
||||||
|
|
||||||
nTextFlashCnt++;
|
nTextFlashCnt++;
|
||||||
|
|
||||||
if(nTextFlashCnt == 60/4) // Flash rate = 4Hz (every 250ms)
|
if(nTextFlashCnt == 60/6) // Flash rate = 6Hz (every 166ms)
|
||||||
{
|
{
|
||||||
nTextFlashCnt = 0;
|
nTextFlashCnt = 0;
|
||||||
g_bTextFlashState = !g_bTextFlashState;
|
g_bTextFlashState = !g_bTextFlashState;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user