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:
tearex 2006-06-11 15:49:38 +00:00
parent e72f4b4beb
commit e3c3ead902
20 changed files with 1584 additions and 881 deletions

View File

@ -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>

View 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

Binary file not shown.

View File

@ -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

View File

@ -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

View File

@ -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);

View File

@ -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

View File

@ -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);

View File

@ -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'

View File

@ -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_

View File

@ -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)"

View File

@ -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,

View File

@ -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;

View File

@ -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();
} }
//=========================================================================== //===========================================================================

View File

@ -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

View File

@ -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));

View File

@ -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;