mirror of
https://github.com/dschmenk/Appalm.git
synced 2024-12-21 05:30:44 +00:00
1961 lines
60 KiB
C
1961 lines
60 KiB
C
|
#include "6502.h"
|
||
|
#include "iou.h"
|
||
|
#include "memory.h"
|
||
|
|
||
|
extern READBYTE ReadFunction[256];
|
||
|
extern WRITEBYTE WriteFunction[256];
|
||
|
extern UInt8 *AppleMemory;
|
||
|
extern UInt8 *AuxMemory;
|
||
|
extern UInt8 *AppleROM;
|
||
|
extern UInt16 *IOUState;
|
||
|
|
||
|
extern UInt16 IOUSoftSwitch[2];
|
||
|
|
||
|
#define LOW_BYTE 1
|
||
|
#define HIGH_BYTE 0
|
||
|
|
||
|
// Macro for the Memory Read Operation
|
||
|
|
||
|
#define INSTRUCTION_FETCH(opcode) opcode = _AppleMemory[PC.PC]; asm("and.l #0xFFFF, %2\n\tmove.b 2(%1, %2.l), %0\n\tlsl.w #0x08, %0\n\tmove.b 1(%1, %2.l), %0" : : "d" (PreFetch), "a" (_AppleMemory), "d" (PC.PC)); PC.PC++;
|
||
|
|
||
|
#define MEMORY_READ(value, address) TempFuncRead = ReadFunction[address.Byte[HIGH_BYTE]]; if (TempFuncRead) { Address.PC = address.PC; value = TempFuncRead(); } else { value = _AppleMemory[address.PC]; }
|
||
|
|
||
|
#define MEMORY_WRITE(value, address) TempFuncWrite = WriteFunction[address.Byte[HIGH_BYTE]]; if (TempFuncWrite) { Address.PC = address.PC; TempFuncWrite(value); } else _AppleMemory[address.PC] = value;
|
||
|
|
||
|
#define ZERO_PAGE_READ(addr) _AppleMemory[addr.Byte[LOW_BYTE]]
|
||
|
#define ZERO_PAGE_WRITE(addr, data) _AppleMemory[addr.Byte[LOW_BYTE]] = data;
|
||
|
|
||
|
#define PUSH(X) _AppleMemory[Stack.PC] = X; Stack.Byte[LOW_BYTE]--;
|
||
|
#define POP(X) Stack.Byte[LOW_BYTE]++; X = _AppleMemory[Stack.PC];
|
||
|
|
||
|
// #define eaimm(value) INSTRUCTION_FETCH(value);
|
||
|
#define eaimm(value) PC.PC++; value = PreFetch & 0xFF;
|
||
|
|
||
|
// #define eazpx(value) INSTRUCTION_FETCH(value); value = value + X;
|
||
|
#define eazpx(value) PC.PC++; value = PreFetch & 0xFF + X;
|
||
|
|
||
|
/* #define mr_eazpx(value) eazpx(TempByte); value = _AppleMemory[TempByte]; */
|
||
|
/* #define mw_eazpx(value) eazpx(TempByte); _AppleMemory[TempByte] = value; */
|
||
|
#define mr_eazpx(value) PC.PC++; TempByte = (PreFetch & 0xFF) + X; value = _AppleMemory[TempByte];
|
||
|
#define mw_eazpx(value) PC.PC++; TempByte = (PreFetch & 0xFF) + X; _AppleMemory[TempByte] = value;
|
||
|
|
||
|
// #define eazpy(value) INSTRUCTION_FETCH(TempByte); value = value + Y;
|
||
|
#define eazpy(value) PC.PC++; value = PreFetch & 0xFF + Y;
|
||
|
|
||
|
/* #define mr_eazpy(value) eazpy(TempByte); value = _AppleMemory[TempByte]; */
|
||
|
/* #define mw_eazpy(value) eazpy(TempByte); _AppleMemory[TempByte] = value; */
|
||
|
#define mr_eazpy(value) PC.PC++; TempByte = PreFetch & 0xFF + Y; value = _AppleMemory[TempByte];
|
||
|
#define mw_eazpy(value) PC.PC++; TempByte = PreFetch & 0xFF + Y; _AppleMemory[TempByte] = value;
|
||
|
|
||
|
// #define eaabs(value) INSTRUCTION_FETCH(value.Byte[LOW_BYTE]); INSTRUCTION_FETCH(value.Byte[HIGH_BYTE]);
|
||
|
|
||
|
#define eaabs(value) PC.PC+=2; value.PC = PreFetch;
|
||
|
#define mr_eaabs(value) PC.PC+=2; TempWord.PC = PreFetch; MEMORY_READ(value, TempWord);
|
||
|
#define mw_eaabs(value) PC.PC+=2; TempWord.PC = PreFetch; MEMORY_WRITE(value, TempWord);
|
||
|
|
||
|
#define eaabsind() INSTRUCTION_FETCH(TempWord.Byte[LOW_BYTE]); \
|
||
|
INSTRUCTION_FETCH(TempWord.Byte[HIGH_BYTE]); MEMORY_READ(PC.Byte[LOW_BYTE], TempWord); \
|
||
|
TempWord.PC += 1; MEMORY_READ(PC.Byte[HIGH_BYTE], TempWord);
|
||
|
|
||
|
#define eaabsx(value) eaabs(value); value.PC += X;
|
||
|
#define mr_eaabsx(value) eaabsx(TempWord); MEMORY_READ(value, TempWord);
|
||
|
#define mw_eaabsx(value) eaabsx(TempWord); MEMORY_WRITE(value, TempWord);
|
||
|
|
||
|
#define eaabsy(value) eaabs(value); value.PC += Y;
|
||
|
#define mr_eaabsy(value) eaabsy(TempWord); MEMORY_READ(value, TempWord);
|
||
|
#define mw_eaabsy(value) eaabsy(TempWord); MEMORY_WRITE(value, TempWord);
|
||
|
|
||
|
#define earel(value) INSTRUCTION_FETCH(value.Byte[LOW_BYTE]); asm("ext.w %0" : : "d" (value.PC));
|
||
|
|
||
|
#define eazp(value) PC.PC++; TempByte = PreFetch & 0xFF; value = _AppleMemory[TempByte];
|
||
|
#define mw_eazp(value) PC.PC++; TempByte = PreFetch & 0xFF; _AppleMemory[TempByte] = value;
|
||
|
|
||
|
#define eazpxind(value) eazpx(TempByte); value.Byte[LOW_BYTE] = _AppleMemory[TempByte]; \
|
||
|
value.Byte[HIGH_BYTE] = _AppleMemory[TempByte + 1];
|
||
|
|
||
|
#define mr_eazpxind(value) eazpxind(TempWord); MEMORY_READ(value, TempWord);
|
||
|
#define mw_eazpxind(value) eazpxind(TempWord); MEMORY_WRITE(value, TempWord);
|
||
|
|
||
|
#define eazpindy(value) eaimm(TempByte); value.Byte[LOW_BYTE] = _AppleMemory[TempByte]; \
|
||
|
value.Byte[HIGH_BYTE] = _AppleMemory[TempByte + 1]; value.PC += Y;
|
||
|
|
||
|
#define mr_eazpindy(value) eazpindy(TempWord); MEMORY_READ(value, TempWord);
|
||
|
#define mw_eazpindy(value) eazpindy(TempWord); MEMORY_WRITE(value, TempWord);
|
||
|
|
||
|
/* MC6502 Instruction New Address Mode */
|
||
|
#define eazpind() PC.PC++; TempByte = PreFetch & 0xFF; TempWord.Byte[LOW_BYTE] = _AppleMemory[TempByte]; TempWord.Byte[HIGH_BYTE] = _AppleMemory[TempByte + 1];
|
||
|
#define mr_eazpind(value) eazpind(); value = _AppleMemory[TempWord.PC];
|
||
|
#define mw_eazpind(value) eazpind(); _AppleMemory[TempWord.PC] = value;
|
||
|
|
||
|
#define eaabsxind() eaabs(TempWord); TempWord.PC += X; PC.Byte[LOW_BYTE] = _AppleMemory[TempWord.PC]; PC.Byte[HIGH_BYTE] = _AppleMemory[TempWord.PC + 1];
|
||
|
|
||
|
union PCStruct PC;
|
||
|
union PCStruct Stack;
|
||
|
union PCStruct Address;
|
||
|
UInt8 X, Y, _A, Decimal;
|
||
|
Char buf[50];
|
||
|
UInt16 Status;
|
||
|
BOOL LOOP, QUIT;
|
||
|
UInt32 Start, End;
|
||
|
UInt16 Count, Count1;
|
||
|
|
||
|
extern UInt16 refNum;
|
||
|
extern char *AppleFontBitmap;
|
||
|
extern UInt8 LastKey;
|
||
|
|
||
|
UInt8 *AppleFont;
|
||
|
UInt8 *pointer;
|
||
|
|
||
|
UInt16 ScanlineOffsetTable[192];
|
||
|
UInt16 ScanlineAddressTable[192];
|
||
|
UInt16 ScanlineAddressTableH[192];
|
||
|
UInt16 AppleClock, DiskOffset =0;
|
||
|
extern UInt16 LastAppleClock;
|
||
|
extern UInt16 motor_on;
|
||
|
|
||
|
void SetupVideo(void) {
|
||
|
WinHandle onScreen;
|
||
|
UInt32 depth = 1;
|
||
|
Boolean colorMode = true;
|
||
|
BitmapType *scanline;
|
||
|
|
||
|
#ifdef SONY
|
||
|
HRWinScreenMode(refNum, winScreenModeSet, 0, 0, &depth, &colorMode);
|
||
|
#else
|
||
|
WinScreenMode(winScreenModeSet, 0, 0, &depth, &colorMode);
|
||
|
#endif
|
||
|
|
||
|
onScreen = WinGetDisplayWindow();
|
||
|
scanline = WinGetBitmap(onScreen);
|
||
|
pointer = (UInt8*) BmpGetBits(scanline);
|
||
|
|
||
|
#ifdef SONY
|
||
|
pointer += 160 * 12;
|
||
|
#else
|
||
|
pointer += 20 * 20;
|
||
|
#endif
|
||
|
|
||
|
{
|
||
|
MemHandle handle;
|
||
|
UInt16 count;
|
||
|
|
||
|
handle = MemHandleNew(0x100 * 0x08);
|
||
|
AppleFont = MemHandleLock(handle);
|
||
|
|
||
|
MemMove(AppleFont, AppleFontBitmap, 0x40 * 0x08);
|
||
|
MemMove(AppleFont + 0x40 * 0x08, AppleFontBitmap, 0x40 * 0x08);
|
||
|
MemMove(AppleFont + 0x40 * 0x08 * 2, AppleFontBitmap, 0x40 * 0x08);
|
||
|
MemMove(AppleFont + 0x40 * 0x08 * 3, AppleFontBitmap, 0x20 * 0x08);
|
||
|
MemMove(AppleFont + 0x40 * 0x08 * 3 + 0x20 * 0x08, AppleFontBitmap + 0x40 * 0x08, 0x20 * 0x08);
|
||
|
for (count = 0x80 * 0x08; count < (0x100 * 0x08) - 1; count++) AppleFont[count] = ~AppleFont[count];
|
||
|
}
|
||
|
|
||
|
{
|
||
|
UInt16 i;
|
||
|
|
||
|
for (i = 0;i < 192;i++) {
|
||
|
ScanlineOffsetTable[i] = (i & 7) * 0x400 + ((i >> 3) & 7) * 0x80 + (i >> 6) * 0x28;
|
||
|
}
|
||
|
|
||
|
for (i = 0;i < 192;i++) {
|
||
|
ScanlineAddressTable[i] = ScanlineOffsetTable[i & ~7] + 0x400;
|
||
|
ScanlineAddressTableH[i] = ScanlineOffsetTable[i] + 0x2000;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
void init_6502() {
|
||
|
Stack.PC = 0x01FF;
|
||
|
_A = 0; X = 0; Y = 0;
|
||
|
PC.Byte[LOW_BYTE] = AppleMemory[0x0000FFFC];
|
||
|
PC.Byte[HIGH_BYTE] = AppleMemory[0x0000FFFD];
|
||
|
LOOP = 1; QUIT = 1;
|
||
|
Count = 0; Count1 = 0;
|
||
|
Decimal = 0;
|
||
|
AppleClock = 0;
|
||
|
SetupVideo();
|
||
|
}
|
||
|
|
||
|
void run_6502() {
|
||
|
|
||
|
register UInt8 Opcode;
|
||
|
register READBYTE TempFuncRead;
|
||
|
register WRITEBYTE TempFuncWrite;
|
||
|
register UInt8 *_AppleMemory;
|
||
|
register union PCStruct TempWord;
|
||
|
register UInt8 TempByte;
|
||
|
register UInt8 MemValue;
|
||
|
register UInt16 PreFetch asm ("d4");
|
||
|
register Int16 hori, vert;
|
||
|
register UInt16 fps, scanaddr, chary;
|
||
|
register UInt8 *_pointer;
|
||
|
|
||
|
#ifdef SONY
|
||
|
hori = 191; vert = 39; fps = 0; chary = 7;
|
||
|
_pointer = pointer + 192 * 40;
|
||
|
if (IOUSoftSwitch[0] & SS_HIRES)
|
||
|
scanaddr = ScanlineAddressTableH[hori] + 39;
|
||
|
else
|
||
|
scanaddr = ScanlineAddressTable[hori] + 39;
|
||
|
#else
|
||
|
hori = 119; vert = 19; fps = 0; chary = 7;
|
||
|
_pointer = pointer + 120 * 20;
|
||
|
if (IOUSoftSwitch[0] & SS_HIRES)
|
||
|
scanaddr = ScanlineAddressTableH[hori] + 19;
|
||
|
else
|
||
|
scanaddr = ScanlineAddressTable[hori] + 19;
|
||
|
#endif
|
||
|
|
||
|
_AppleMemory = AppleMemory;
|
||
|
|
||
|
run_again:
|
||
|
|
||
|
#ifdef DEBUG
|
||
|
if (!LOOP) HostTraceOutputT(sysErrorClass, "PC : %X\n", PC.PC);
|
||
|
#endif
|
||
|
|
||
|
INSTRUCTION_FETCH(Opcode);
|
||
|
|
||
|
#ifdef DEBUG
|
||
|
if (!LOOP) HostTraceOutputT(sysErrorClass, "O : %X A : %X X : %X Y : %X\n", Opcode, _A, X, Y);
|
||
|
#endif
|
||
|
|
||
|
switch (Opcode) {
|
||
|
case 0x69: /* ADC #imm */
|
||
|
Status &= 0xFFEF; if (Status & 0x01) Status |= 0x10;
|
||
|
Status |= 0x04;
|
||
|
PC.PC++;
|
||
|
asm("move.b %0, %1\n\tbne .adc_69_decimal" : : "m" (Decimal), "d" (Decimal));
|
||
|
asm("move.w %0, %%ccr\n\taddx.b %2, %1\n\tmove.w %%sr, %0\n\tmove.b %1, %3"
|
||
|
:
|
||
|
: "m" (Status), "d" (_A), "d" (PreFetch), "m" (_A)
|
||
|
);
|
||
|
asm("bra .adc_69_finish");
|
||
|
asm(".adc_69_decimal:");
|
||
|
asm("move.w %0, %%ccr\n\tabcd %2, %1\n\tmove.w %%sr, %0\n\tmove.b %1, %3"
|
||
|
:
|
||
|
: "m" (Status), "d" (_A), "d" (PreFetch), "m" (_A)
|
||
|
);
|
||
|
asm(".adc_69_finish:");
|
||
|
AppleClock+=2;
|
||
|
break;
|
||
|
case 0x6D: /* ADC abs */
|
||
|
Status &= 0xFFEF; if (Status & 0x01) Status |= 0x10;
|
||
|
Status |= 0x04;
|
||
|
mr_eaabs(MemValue);
|
||
|
asm("move.b %0, %1\n\tbne .adc_6d_decimal" : : "m" (Decimal), "d" (Decimal));
|
||
|
asm("move.w %0, %%ccr\n\taddx.b %2, %1\n\tmove.w %%sr, %0\n\tmove.b %1, %3"
|
||
|
:
|
||
|
: "m" (Status), "d" (_A), "d" (MemValue), "m" (_A)
|
||
|
);
|
||
|
asm("bra .adc_6d_finish");
|
||
|
asm(".adc_6d_decimal:");
|
||
|
asm("move.w %0, %%ccr\n\tabcd %2, %1\n\tmove.w %%sr, %0\n\tmove.b %1, %3"
|
||
|
:
|
||
|
: "m" (Status), "d" (_A), "d" (MemValue), "m" (_A)
|
||
|
);
|
||
|
asm(".adc_6d_finish:");
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
case 0x65: /* ADC zp */
|
||
|
Status &= 0xFFEF; if (Status & 0x01) Status |= 0x10;
|
||
|
Status |= 0x04;
|
||
|
eazp(MemValue);
|
||
|
asm("move.b %0, %1\n\tbne .adc_65_decimal" : : "m" (Decimal), "d" (Decimal));
|
||
|
asm("move.w %0, %%ccr\n\taddx.b %2, %1\n\tmove.w %%sr, %0\n\tmove.b %1, %3"
|
||
|
:
|
||
|
: "m" (Status), "d" (_A), "d" (MemValue), "m" (_A)
|
||
|
);
|
||
|
asm("bra .adc_65_finish");
|
||
|
asm(".adc_65_decimal:");
|
||
|
asm("move.w %0, %%ccr\n\tabcd %2, %1\n\tmove.w %%sr, %0\n\tmove.b %1, %3"
|
||
|
:
|
||
|
: "m" (Status), "d" (_A), "d" (MemValue), "m" (_A)
|
||
|
);
|
||
|
asm(".adc_65_finish:");
|
||
|
AppleClock+=3;
|
||
|
break;
|
||
|
case 0x61: /* ADC (zp, X) */
|
||
|
Status &= 0xFFEF; if (Status & 0x01) Status |= 0x10;
|
||
|
Status |= 0x04;
|
||
|
mr_eazpxind(MemValue);
|
||
|
asm("move.b %0, %1\n\tbne .adc_61_decimal" : : "m" (Decimal), "d" (Decimal));
|
||
|
asm("move.w %0, %%ccr\n\taddx.b %2, %1\n\tmove.w %%sr, %0\n\tmove.b %1, %3"
|
||
|
:
|
||
|
: "m" (Status), "d" (_A), "d" (MemValue), "m" (_A)
|
||
|
);
|
||
|
asm("bra .adc_61_finish");
|
||
|
asm(".adc_61_decimal:");
|
||
|
asm("move.w %0, %%ccr\n\tabcd %2, %1\n\tmove.w %%sr, %0\n\tmove.b %1, %3"
|
||
|
:
|
||
|
: "m" (Status), "d" (_A), "d" (MemValue), "m" (_A)
|
||
|
);
|
||
|
asm(".adc_61_finish:");
|
||
|
AppleClock+=6;
|
||
|
break;
|
||
|
case 0x71: /* ADC (zp), Y */
|
||
|
Status &= 0xFFEF; if (Status & 0x01) Status |= 0x10;
|
||
|
Status |= 0x04;
|
||
|
mr_eazpindy(MemValue);
|
||
|
asm("move.b %0, %1\n\tbne .adc_71_decimal" : : "m" (Decimal), "d" (Decimal));
|
||
|
asm("move.w %0, %%ccr\n\taddx.b %2, %1\n\tmove.w %%sr, %0\n\tmove.b %1, %3"
|
||
|
:
|
||
|
: "m" (Status), "d" (_A), "d" (MemValue), "m" (_A)
|
||
|
);
|
||
|
asm("bra .adc_71_finish");
|
||
|
asm(".adc_71_decimal:");
|
||
|
asm("move.w %0, %%ccr\n\tabcd %2, %1\n\tmove.w %%sr, %0\n\tmove.b %1, %3"
|
||
|
:
|
||
|
: "m" (Status), "d" (_A), "d" (MemValue), "m" (_A)
|
||
|
);
|
||
|
asm(".adc_71_finish:");
|
||
|
AppleClock+=5;
|
||
|
break;
|
||
|
case 0x75: /* ADC zp, X */
|
||
|
Status &= 0xFFEF; if (Status & 0x01) Status |= 0x10;
|
||
|
Status |= 0x04;
|
||
|
mr_eazpx(MemValue);
|
||
|
asm("move.b %0, %1\n\tbne .adc_75_decimal" : : "m" (Decimal), "d" (Decimal));
|
||
|
asm("move.w %0, %%ccr\n\taddx.b %2, %1\n\tmove.w %%sr, %0\n\tmove.b %1, %3"
|
||
|
:
|
||
|
: "m" (Status), "d" (_A), "d" (MemValue), "m" (_A)
|
||
|
);
|
||
|
asm("bra .adc_75_finish");
|
||
|
asm(".adc_75_decimal:");
|
||
|
asm("move.w %0, %%ccr\n\tabcd %2, %1\n\tmove.w %%sr, %0\n\tmove.b %1, %3"
|
||
|
:
|
||
|
: "m" (Status), "d" (_A), "d" (MemValue), "m" (_A)
|
||
|
);
|
||
|
asm(".adc_75_finish:");
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
case 0x7D: /* ADC abs, X */
|
||
|
Status &= 0xFFEF; if (Status & 0x01) Status |= 0x10;
|
||
|
Status |= 0x04;
|
||
|
mr_eaabsx(MemValue);
|
||
|
asm("move.b %0, %1\n\tbne .adc_7d_decimal" : : "m" (Decimal), "d" (Decimal));
|
||
|
asm("move.w %0, %%ccr\n\taddx.b %2, %1\n\tmove.w %%sr, %0\n\tmove.b %1, %3"
|
||
|
:
|
||
|
: "m" (Status), "d" (_A), "d" (MemValue), "m" (_A)
|
||
|
);
|
||
|
asm("bra .adc_7d_finish");
|
||
|
asm(".adc_7d_decimal:");
|
||
|
asm("move.w %0, %%ccr\n\tabcd %2, %1\n\tmove.w %%sr, %0\n\tmove.b %1, %3"
|
||
|
:
|
||
|
: "m" (Status), "d" (_A), "d" (MemValue), "m" (_A)
|
||
|
);
|
||
|
asm(".adc_7d_finish:");
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
case 0x79: /* ADC abs, Y */
|
||
|
Status &= 0xFFEF; if (Status & 0x01) Status |= 0x10;
|
||
|
Status |= 0x04;
|
||
|
mr_eaabsy(MemValue);
|
||
|
asm("move.b %0, %1\n\tbne .adc_79_decimal" : : "m" (Decimal), "d" (Decimal));
|
||
|
asm("move.w %0, %%ccr\n\taddx.b %2, %1\n\tmove.w %%sr, %0\n\tmove.b %1, %3"
|
||
|
:
|
||
|
: "m" (Status), "d" (_A), "d" (MemValue), "m" (_A)
|
||
|
);
|
||
|
asm("bra .adc_79_finish");
|
||
|
asm(".adc_79_decimal:");
|
||
|
asm("move.w %0, %%ccr\n\tabcd %2, %1\n\tmove.w %%sr, %0\n\tmove.b %1, %3"
|
||
|
:
|
||
|
: "m" (Status), "d" (_A), "d" (MemValue), "m" (_A)
|
||
|
);
|
||
|
asm(".adc_79_finish:");
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
case 0x29: /* AND #imm */
|
||
|
// eaimm(MemValue);
|
||
|
PC.PC++;
|
||
|
asm("and.b %2, %1\n\tmove.w %%sr, %3\n\tmove %0, %4\n\tandi.w #0x000C, %3\n\tandi.w #0xFFF3, %4\n\tor.b %3, %4\n\tmove.w %4, %0"
|
||
|
: "=m" (Status)
|
||
|
: "m" (_A), "d" (PreFetch), "d" (Status), "d" (MemValue)
|
||
|
);
|
||
|
AppleClock+=2;
|
||
|
break;
|
||
|
case 0x2D: /* AND abs */
|
||
|
mr_eaabs(MemValue);
|
||
|
asm("and.b %2, %1\n\tmove.w %%sr, %3\n\tmove %0, %4\n\tandi.w #0x000C, %3\n\tandi.w #0xFFF3, %4\n\tor.b %3, %4\n\tmove.w %4, %0"
|
||
|
: "=m" (Status)
|
||
|
: "m" (_A), "d" (MemValue), "d" (Status), "d" (MemValue)
|
||
|
);
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
case 0x25: /* AND zp */
|
||
|
eazp(MemValue);
|
||
|
asm("and.b %2, %1\n\tmove.w %%sr, %3\n\tmove %0, %4\n\tandi.w #0x000C, %3\n\tandi.w #0xFFF3, %4\n\tor.b %3, %4\n\tmove.w %4, %0"
|
||
|
: "=m" (Status)
|
||
|
: "m" (_A), "d" (MemValue), "d" (Status), "d" (MemValue)
|
||
|
);
|
||
|
AppleClock+=3;
|
||
|
break;
|
||
|
case 0x21: /* AND (zp, X) */
|
||
|
mr_eazpxind(MemValue);
|
||
|
asm("and.b %2, %1\n\tmove.w %%sr, %3\n\tmove %0, %4\n\tandi.w #0x000C, %3\n\tandi.w #0xFFF3, %4\n\tor.b %3, %4\n\tmove.w %4, %0"
|
||
|
: "=m" (Status)
|
||
|
: "m" (_A), "d" (MemValue), "d" (Status), "d" (MemValue)
|
||
|
);
|
||
|
AppleClock+=6;
|
||
|
break;
|
||
|
case 0x31: /* AND (zp), Y */
|
||
|
mr_eazpindy(MemValue);
|
||
|
asm("and.b %2, %1\n\tmove.w %%sr, %3\n\tmove %0, %4\n\tandi.w #0x000C, %3\n\tandi.w #0xFFF3, %4\n\tor.b %3, %4\n\tmove.w %4, %0"
|
||
|
: "=m" (Status)
|
||
|
: "m" (_A), "d" (MemValue), "d" (Status), "d" (MemValue)
|
||
|
);
|
||
|
AppleClock+=5;
|
||
|
break;
|
||
|
case 0x35: /* AND zp, X */
|
||
|
mr_eazpx(MemValue);
|
||
|
asm("and.b %2, %1\n\tmove.w %%sr, %3\n\tmove %0, %4\n\tandi.w #0x000C, %3\n\tandi.w #0xFFF3, %4\n\tor.b %3, %4\n\tmove.w %4, %0"
|
||
|
: "=m" (Status)
|
||
|
: "m" (_A), "d" (MemValue), "d" (Status), "d" (MemValue)
|
||
|
);
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
case 0x3D: /* AND abs, X */
|
||
|
mr_eaabsx(MemValue);
|
||
|
asm("and.b %2, %1\n\tmove.w %%sr, %3\n\tmove %0, %4\n\tandi.w #0x000C, %3\n\tandi.w #0xFFF3, %4\n\tor.b %3, %4\n\tmove.w %4, %0"
|
||
|
: "=m" (Status)
|
||
|
: "m" (_A), "d" (MemValue), "d" (Status), "d" (MemValue)
|
||
|
);
|
||
|
break;
|
||
|
case 0x39: /* AND abs, Y */
|
||
|
mr_eaabsy(MemValue);
|
||
|
asm("and.b %2, %1\n\tmove.w %%sr, %3\n\tmove %0, %4\n\tandi.w #0x000C, %3\n\tandi.w #0xFFF3, %4\n\tor.b %3, %4\n\tmove.w %4, %0"
|
||
|
: "=m" (Status)
|
||
|
: "m" (_A), "d" (MemValue), "d" (Status), "d" (MemValue)
|
||
|
);
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
|
||
|
case 0x0E: /* ASL abs */
|
||
|
mr_eaabs(MemValue);
|
||
|
|
||
|
asm("lsl.b #1, %0\n\tmove.w %%sr, %1\n\tandi.w #0x0002, %2\n\tor.w %1, %2"
|
||
|
:
|
||
|
: "d" (MemValue), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
|
||
|
MEMORY_WRITE(MemValue, TempWord);
|
||
|
AppleClock+=6;
|
||
|
break;
|
||
|
case 0x06: /* ASL zp */
|
||
|
eazp(MemValue);
|
||
|
|
||
|
asm("lsl.b #1, %0\n\tmove.w %%sr, %1\n\tandi.w #0x0002, %2\n\tor.w %1, %2"
|
||
|
:
|
||
|
: "d" (MemValue), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
|
||
|
_AppleMemory[TempByte] = MemValue;
|
||
|
AppleClock+=5;
|
||
|
break;
|
||
|
case 0x0A: /* ASL acc */
|
||
|
asm("lsl.b #1, %0\n\tmove.w %%sr, %1\n\tandi.w #0x0002, %2\n\tor.w %1, %2\n\tmove.b %0, %3"
|
||
|
:
|
||
|
: "d" (_A), "d" (Status), "m" (Status), "m" (_A)
|
||
|
);
|
||
|
AppleClock+=2;
|
||
|
break;
|
||
|
case 0x16: /* ASL zp, X */
|
||
|
mr_eazpx(MemValue);
|
||
|
|
||
|
asm("lsl.b #1, %0\n\tmove.w %%sr, %1\n\tandi.w #0x0002, %2\n\tor.w %1, %2"
|
||
|
:
|
||
|
: "d" (MemValue), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
|
||
|
_AppleMemory[TempByte] = MemValue;
|
||
|
AppleClock+=6;
|
||
|
break;
|
||
|
case 0x1E: /* ASL abs, X */
|
||
|
mr_eaabsx(MemValue);
|
||
|
|
||
|
asm("lsl.b #1, %0\n\tmove.w %%sr, %1\n\tandi.w #0x0002, %2\n\tor.w %1, %2"
|
||
|
:
|
||
|
: "d" (MemValue), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
|
||
|
MEMORY_WRITE(MemValue, TempWord);
|
||
|
AppleClock+=7;
|
||
|
break;
|
||
|
|
||
|
case 0x90: /* BCC rr */
|
||
|
AppleClock+=2;
|
||
|
PC.PC++;
|
||
|
asm("move %0, %%ccr" : "=m" (Status));
|
||
|
asm("bcs .bcc_leave");
|
||
|
asm("ext.w %0" : : "d" (PreFetch));
|
||
|
PC.PC += PreFetch;
|
||
|
AppleClock++;
|
||
|
asm(".bcc_leave:");
|
||
|
break;
|
||
|
case 0xB0: /* BCS rr */
|
||
|
PC.PC++;
|
||
|
AppleClock+=2;
|
||
|
asm("move %0, %%ccr" : "=m" (Status));
|
||
|
asm("bcc .bcs_leave");
|
||
|
asm("ext.w %0" : : "d" (PreFetch));
|
||
|
PC.PC += PreFetch;
|
||
|
AppleClock++;
|
||
|
asm(".bcs_leave:");
|
||
|
break;
|
||
|
case 0xF0: /* BEQ rr */
|
||
|
PC.PC++;
|
||
|
AppleClock+=2;
|
||
|
asm("move %0, %%ccr" : "=m" (Status));
|
||
|
asm("bne .beq_leave");
|
||
|
asm("ext.w %0" : : "d" (PreFetch));
|
||
|
PC.PC += PreFetch;
|
||
|
AppleClock++;
|
||
|
asm(".beq_leave:");
|
||
|
break;
|
||
|
|
||
|
case 0x2C: /* BIT abs */
|
||
|
mr_eaabs(MemValue);
|
||
|
asm("andi.w #0xFFF1, %0\n\tand.b %2, %1\n\tmove.w %%sr, %3\n\tandi.w #0x04, %3\n\tor.w %3, %0\n\tclr.w %3\n\tmove.b %2, %3\n\tandi.w #0x0080, %3\n\tlsr.w #4, %3\n\tor.w %3, %0\n\tclr.w %3\n\tmove.b %2, %3\n\tandi.w #0x0040, %3\n\tlsr.w #5, %3\n\tor.w %3, %0"
|
||
|
:
|
||
|
: "m" (Status), "d" (_A), "d" (MemValue), "d" (Status)
|
||
|
);
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
case 0x24: /* BIT zp */
|
||
|
eazp(MemValue);
|
||
|
asm("andi.w #0xFFF1, %0\n\tand.b %2, %1\n\tmove.w %%sr, %3\n\tandi.w #0x04, %3\n\tor.w %3, %0\n\tclr.w %3\n\tmove.b %2, %3\n\tandi.w #0x0080, %3\n\tlsr.w #4, %3\n\tor.w %3, %0\n\tclr.w %3\n\tmove.b %2, %3\n\tandi.w #0x0040, %3\n\tlsr.w #5, %3\n\tor.w %3, %0"
|
||
|
:
|
||
|
: "m" (Status), "d" (_A), "d" (MemValue), "d" (Status)
|
||
|
);
|
||
|
AppleClock+=3;
|
||
|
break;
|
||
|
|
||
|
case 0x30: /* BMI rr */
|
||
|
PC.PC++;
|
||
|
AppleClock+=2;
|
||
|
asm("move %0, %%ccr" : "=m" (Status));
|
||
|
asm("bpl .bmi_leave");
|
||
|
asm("ext.w %0" : : "d" (PreFetch));
|
||
|
PC.PC += PreFetch;
|
||
|
AppleClock++;
|
||
|
asm(".bmi_leave:");
|
||
|
break;
|
||
|
case 0xD0: /* BNE rr */
|
||
|
PC.PC++;
|
||
|
AppleClock+=2;
|
||
|
asm("move %0, %%ccr" : "=m" (Status));
|
||
|
asm("beq .bne_leave");
|
||
|
asm("ext.w %0" : : "d" (PreFetch));
|
||
|
PC.PC += PreFetch;
|
||
|
AppleClock++;
|
||
|
asm(".bne_leave:");
|
||
|
break;
|
||
|
case 0x10: /* BPL rr */
|
||
|
PC.PC++;
|
||
|
AppleClock+=2;
|
||
|
asm("move %0, %%ccr" : "=m" (Status));
|
||
|
asm("bmi .bpl_leave");
|
||
|
asm("ext.w %0" : : "d" (PreFetch));
|
||
|
PC.PC += PreFetch;
|
||
|
AppleClock++;
|
||
|
asm(".bpl_leave:");
|
||
|
break;
|
||
|
|
||
|
case 0x00: /* BRK */
|
||
|
break;
|
||
|
|
||
|
case 0x50: /* BVC rr */
|
||
|
PC.PC++;
|
||
|
AppleClock+=2;
|
||
|
asm("move %0, %%ccr" : "=m" (Status));
|
||
|
asm("bvs .bvc_leave");
|
||
|
asm("ext.w %0" : : "d" (PreFetch));
|
||
|
PC.PC += PreFetch;
|
||
|
AppleClock++;
|
||
|
asm(".bvc_leave:");
|
||
|
break;
|
||
|
case 0x70: /* BVS rr */
|
||
|
PC.PC++;
|
||
|
AppleClock+=2;
|
||
|
asm("move %0, %%ccr" : "=m" (Status));
|
||
|
asm("bvc .bvs_leave");
|
||
|
asm("ext.w %0" : : "d" (PreFetch));
|
||
|
PC.PC += PreFetch;
|
||
|
AppleClock++;
|
||
|
asm(".bvs_leave:");
|
||
|
break;
|
||
|
|
||
|
case 0x18: /* CLC */
|
||
|
asm("andi.w #0xFFEE, %0" : "=m" (Status));
|
||
|
AppleClock+=2;
|
||
|
break;
|
||
|
case 0xD8: /* CLD */
|
||
|
asm("clr.b %0" : : "m" (Decimal));
|
||
|
AppleClock+=2;
|
||
|
break;
|
||
|
case 0x58: /* CLI */
|
||
|
AppleClock+=2;
|
||
|
break;
|
||
|
case 0xB8: /* CLV */
|
||
|
asm("andi.w #0xFFFD, %0" : "=m" (Status));
|
||
|
AppleClock+=2;
|
||
|
break;
|
||
|
case 0xC9: /* CMP #imm */
|
||
|
// eaimm(MemValue);
|
||
|
PC.PC++;
|
||
|
asm("neg.b %1\n\tadd.b %1, %0\n\tmove %%sr, %2\n\tandi.w #0xFFF2, %3\n\tandi.w #0x000D, %2\n\tor.w %2, %3\n\tneg.b %1"
|
||
|
:
|
||
|
: "d" (_A), "d" (PreFetch), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
if (_A >= (PreFetch & 0xFF)) Status |= 0x01; else Status &= 0xFFFE;
|
||
|
AppleClock+=2;
|
||
|
break;
|
||
|
case 0xCD: /* CMP abs */
|
||
|
mr_eaabs(MemValue);
|
||
|
asm("neg.b %1\n\tadd.b %1, %0\n\tmove %%sr, %2\n\tandi.w #0xFFF2, %3\n\tandi.w #0x000D, %2\n\tor.w %2, %3\n\tneg.b %1"
|
||
|
:
|
||
|
: "d" (_A), "d" (MemValue), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
if (_A >= MemValue) Status |= 0x01; else Status &= 0xFFFE;
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
case 0xC5: /* CMP zp */
|
||
|
eazp(MemValue);
|
||
|
asm("neg.b %1\n\tadd.b %1, %0\n\tmove %%sr, %2\n\tandi.w #0xFFF2, %3\n\tandi.w #0x000D, %2\n\tor.w %2, %3\n\tneg.b %1"
|
||
|
:
|
||
|
: "d" (_A), "d" (MemValue), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
if (_A >= MemValue) Status |= 0x01; else Status &= 0xFFFE;
|
||
|
AppleClock+=3;
|
||
|
break;
|
||
|
case 0xC1: /* CMP (zp, X) */
|
||
|
mr_eazpxind(MemValue);
|
||
|
asm("neg.b %1\n\tadd.b %1, %0\n\tmove %%sr, %2\n\tandi.w #0xFFF2, %3\n\tandi.w #0x000D, %2\n\tor.w %2, %3\n\tneg.b %1"
|
||
|
:
|
||
|
: "d" (_A), "d" (MemValue), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
if (_A >= MemValue) Status |= 0x01; else Status &= 0xFFFE;
|
||
|
AppleClock+=6;
|
||
|
break;
|
||
|
case 0xD1: /* CMP (zp), Y */
|
||
|
mr_eazpindy(MemValue);
|
||
|
asm("neg.b %1\n\tadd.b %1, %0\n\tmove %%sr, %2\n\tandi.w #0xFFF2, %3\n\tandi.w #0x000D, %2\n\tor.w %2, %3\n\tneg.b %1"
|
||
|
:
|
||
|
: "d" (_A), "d" (MemValue), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
if (_A >= MemValue) Status |= 0x01; else Status &= 0xFFFE;
|
||
|
AppleClock+=5;
|
||
|
break;
|
||
|
case 0xD5: /* CMP zp, X */
|
||
|
mr_eazpx(MemValue);
|
||
|
asm("neg.b %1\n\tadd.b %1, %0\n\tmove %%sr, %2\n\tandi.w #0xFFF2, %3\n\tandi.w #0x000D, %2\n\tor.w %2, %3\n\tneg.b %1"
|
||
|
:
|
||
|
: "d" (_A), "d" (MemValue), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
if (_A >= MemValue) Status |= 0x01; else Status &= 0xFFFE;
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
case 0xDD: /* CMP abs, X */
|
||
|
mr_eaabsx(MemValue);
|
||
|
asm("neg.b %1\n\tadd.b %1, %0\n\tmove %%sr, %2\n\tandi.w #0xFFF2, %3\n\tandi.w #0x000D, %2\n\tor.w %2, %3\n\tneg.b %1"
|
||
|
:
|
||
|
: "d" (_A), "d" (MemValue), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
if (_A >= MemValue) Status |= 0x01; else Status &= 0xFFFE;
|
||
|
/* if (!LOOP) HostTraceOutputT(sysErrorClass, "CMP abs, X : %X %X %X %X\n", TempWord.PC, X, MemValue, _A); */
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
case 0xD9: /* CMP abs, Y */
|
||
|
mr_eaabsy(MemValue);
|
||
|
asm("neg.b %1\n\tadd.b %1, %0\n\tmove %%sr, %2\n\tandi.w #0xFFF2, %3\n\tandi.w #0x000D, %2\n\tor.w %2, %3\n\tneg.b %1"
|
||
|
:
|
||
|
: "d" (_A), "d" (MemValue), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
if (_A >= MemValue) Status |= 0x01; else Status &= 0xFFFE;
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
|
||
|
case 0xE0: /* CPX #imm */
|
||
|
// eaimm(MemValue);
|
||
|
PC.PC++;
|
||
|
asm("neg.b %1\n\tadd.b %1, %0\n\tmove %%sr, %2\n\tandi.w #0xFFF2, %3\n\tandi.w #0x000D, %2\n\tor.w %2, %3\n\tneg.b %1"
|
||
|
:
|
||
|
: "d" (X), "d" (PreFetch), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
if (X >= (PreFetch & 0xFF)) Status |= 0x01; else Status &= 0xFFFE;
|
||
|
AppleClock+=2;
|
||
|
break;
|
||
|
case 0xEC: /* CPX abs */
|
||
|
mr_eaabs(MemValue);
|
||
|
asm("neg.b %1\n\tadd.b %1, %0\n\tmove %%sr, %2\n\tandi.w #0xFFF2, %3\n\tandi.w #0x000D, %2\n\tor.w %2, %3\n\tneg.b %1"
|
||
|
:
|
||
|
: "d" (X), "d" (MemValue), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
if (X >= MemValue) Status |= 0x01; else Status &= 0xFFFE;
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
case 0xE4: /* CPX zp */
|
||
|
eazp(MemValue);
|
||
|
asm("neg.b %1\n\tadd.b %1, %0\n\tmove %%sr, %2\n\tandi.w #0xFFF2, %3\n\tandi.w #0x000D, %2\n\tor.w %2, %3\n\tneg.b %1"
|
||
|
:
|
||
|
: "d" (X), "d" (MemValue), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
if (X >= MemValue) Status |= 0x01; else Status &= 0xFFFE;
|
||
|
AppleClock+=3;
|
||
|
break;
|
||
|
|
||
|
case 0xC0: /* CPY #imm */
|
||
|
// eaimm(MemValue);
|
||
|
PC.PC++;
|
||
|
asm("neg.b %1\n\tadd.b %1, %0\n\tmove %%sr, %2\n\tandi.w #0xFFF2, %3\n\tandi.w #0x000D, %2\n\tor.w %2, %3\n\tneg.b %1"
|
||
|
:
|
||
|
: "d" (Y), "d" (PreFetch), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
if (Y >= (PreFetch & 0xFF)) Status |= 0x01; else Status &= 0xFFFE;
|
||
|
AppleClock+=2;
|
||
|
break;
|
||
|
case 0xCC: /* CPY abs */
|
||
|
mr_eaabs(MemValue);
|
||
|
asm("neg.b %1\n\tadd.b %1, %0\n\tmove %%sr, %2\n\tandi.w #0xFFF2, %3\n\tandi.w #0x000D, %2\n\tor.w %2, %3\n\tneg.b %1"
|
||
|
:
|
||
|
: "d" (Y), "d" (MemValue), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
if (Y >= MemValue) Status |= 0x01; else Status &= 0xFFFE;
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
case 0xC4: /* CPY zp */
|
||
|
eazp(MemValue);
|
||
|
asm("neg.b %1\n\tadd.b %1, %0\n\tmove %%sr, %2\n\tandi.w #0xFFF2, %3\n\tandi.w #0x000D, %2\n\tor.w %2, %3\n\tneg.b %1"
|
||
|
:
|
||
|
: "d" (Y), "d" (MemValue), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
if (Y >= MemValue) Status |= 0x01; else Status &= 0xFFFE;
|
||
|
AppleClock+=3;
|
||
|
break;
|
||
|
|
||
|
case 0xCE: /* DEC abs */
|
||
|
mr_eaabs(MemValue);
|
||
|
asm("addi.b #0xFF, %0\n\tmove %%sr, %1\n\tandi.w #0x000C, %1\n\tandi.w #0xFFF3, %2\n\tor.w %1, %2"
|
||
|
:
|
||
|
: "d" (MemValue), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
MEMORY_WRITE(MemValue, TempWord);
|
||
|
AppleClock+=6;
|
||
|
break;
|
||
|
case 0xC6: /* DEC zp */
|
||
|
eazp(MemValue);
|
||
|
asm("addi.b #0xFF, %0\n\tmove %%sr, %1\n\tandi.w #0x000C, %1\n\tandi.w #0xFFF3, %2\n\tor.w %1, %2"
|
||
|
:
|
||
|
: "d" (MemValue), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
_AppleMemory[TempByte] = MemValue;
|
||
|
AppleClock+=5;
|
||
|
break;
|
||
|
case 0xD6: /* DEC zp, X */
|
||
|
mr_eazpx(MemValue);
|
||
|
asm("addi.b #0xFF, %0\n\tmove %%sr, %1\n\tandi.w #0x000C, %1\n\tandi.w #0xFFF3, %2\n\tor.w %1, %2"
|
||
|
:
|
||
|
: "d" (MemValue), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
_AppleMemory[TempByte] = MemValue;
|
||
|
AppleClock+=6;
|
||
|
break;
|
||
|
case 0xDE: /* DEC abs, X */
|
||
|
mr_eaabsx(MemValue);
|
||
|
asm("addi.b #0xFF, %0\n\tmove %%sr, %1\n\tandi.w #0x000C, %1\n\tandi.w #0xFFF3, %2\n\tor.w %1, %2"
|
||
|
:
|
||
|
: "d" (MemValue), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
MEMORY_WRITE(MemValue, TempWord);
|
||
|
AppleClock+=7;
|
||
|
break;
|
||
|
case 0xCA: /* DEX */
|
||
|
asm("addi.b #0xFF, %0\n\tmove %%sr, %1\n\tandi.w #0x000C, %1\n\tandi.w #0xFFF3, %2\n\tor.w %1, %2"
|
||
|
:
|
||
|
: "m" (X), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
AppleClock+=2;
|
||
|
break;
|
||
|
case 0x88: /* DEY */
|
||
|
asm("addi.b #0xFF, %0\n\tmove %%sr, %1\n\tandi.w #0x000C, %1\n\tandi.w #0xFFF3, %2\n\tor.w %1, %2"
|
||
|
:
|
||
|
: "m" (Y), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
AppleClock+=2;
|
||
|
break;
|
||
|
|
||
|
case 0x49: /* EOR #imm */
|
||
|
// eaimm(MemValue);
|
||
|
PC.PC++;
|
||
|
asm("eor.b %0, %1\n\tmove %%sr, %2\n\tandi.w #0x000C, %2\n\tandi.w #0xFFF3, %3\n\tor.w %2, %3"
|
||
|
:
|
||
|
: "d" (PreFetch), "m" (_A), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
AppleClock+=2;
|
||
|
break;
|
||
|
case 0x4D: /* EOR abs */
|
||
|
mr_eaabs(MemValue);
|
||
|
asm("eor.b %0, %1\n\tmove %%sr, %2\n\tandi.w #0x000C, %2\n\tandi.w #0xFFF3, %3\n\tor.w %2, %3"
|
||
|
:
|
||
|
: "d" (MemValue), "m" (_A), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
case 0x45: /* EOR zp */
|
||
|
eazp(MemValue);
|
||
|
asm("eor.b %0, %1\n\tmove %%sr, %2\n\tandi.w #0x000C, %2\n\tandi.w #0xFFF3, %3\n\tor.w %2, %3"
|
||
|
:
|
||
|
: "d" (MemValue), "m" (_A), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
AppleClock+=3;
|
||
|
break;
|
||
|
case 0x41: /* EOR (zp, X) */
|
||
|
mr_eazpxind(MemValue);
|
||
|
asm("eor.b %0, %1\n\tmove %%sr, %2\n\tandi.w #0x000C, %2\n\tandi.w #0xFFF3, %3\n\tor.w %2, %3"
|
||
|
:
|
||
|
: "d" (MemValue), "m" (_A), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
AppleClock+=6;
|
||
|
break;
|
||
|
case 0x51: /* EOR (zp), Y */
|
||
|
mr_eazpindy(MemValue);
|
||
|
asm("eor.b %0, %1\n\tmove %%sr, %2\n\tandi.w #0x000C, %2\n\tandi.w #0xFFF3, %3\n\tor.w %2, %3"
|
||
|
:
|
||
|
: "d" (MemValue), "m" (_A), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
AppleClock+=5;
|
||
|
break;
|
||
|
case 0x55: /* EOR zp, X */
|
||
|
mr_eazpx(MemValue);
|
||
|
asm("eor.b %0, %1\n\tmove %%sr, %2\n\tandi.w #0x000C, %2\n\tandi.w #0xFFF3, %3\n\tor.w %2, %3"
|
||
|
:
|
||
|
: "d" (MemValue), "m" (_A), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
case 0x5D: /* EOR abs, X */
|
||
|
mr_eaabsx(MemValue);
|
||
|
asm("eor.b %0, %1\n\tmove %%sr, %2\n\tandi.w #0x000C, %2\n\tandi.w #0xFFF3, %3\n\tor.w %2, %3"
|
||
|
:
|
||
|
: "d" (MemValue), "m" (_A), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
case 0x59: /* EOR abs, Y */
|
||
|
mr_eaabsy(MemValue);
|
||
|
asm("eor.b %0, %1\n\tmove %%sr, %2\n\tandi.w #0x000C, %2\n\tandi.w #0xFFF3, %3\n\tor.w %2, %3"
|
||
|
:
|
||
|
: "d" (MemValue), "m" (_A), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
|
||
|
case 0xEE: /* INC abs */
|
||
|
mr_eaabs(MemValue);
|
||
|
asm("addi.b #0x01, %0\n\tmove %%sr, %1\n\tandi.w #0x000C, %1\n\tandi.w #0xFFF3, %2\n\tor.w %1, %2"
|
||
|
:
|
||
|
: "d" (MemValue), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
MEMORY_WRITE(MemValue, TempWord);
|
||
|
AppleClock+=6;
|
||
|
break;
|
||
|
case 0xE6: /* INC zp */
|
||
|
eazp(MemValue);
|
||
|
asm("addi.b #0x01, %0\n\tmove %%sr, %1\n\tandi.w #0x000C, %1\n\tandi.w #0xFFF3, %2\n\tor.w %1, %2"
|
||
|
:
|
||
|
: "d" (MemValue), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
_AppleMemory[TempByte] = MemValue;
|
||
|
AppleClock+=5;
|
||
|
break;
|
||
|
case 0xF6: /* INC zp, X */
|
||
|
mr_eazpx(MemValue);
|
||
|
asm("addi.b #0x01, %0\n\tmove %%sr, %1\n\tandi.w #0x000C, %1\n\tandi.w #0xFFF3, %2\n\tor.w %1, %2"
|
||
|
:
|
||
|
: "d" (MemValue), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
_AppleMemory[TempByte] = MemValue;
|
||
|
AppleClock+=6;
|
||
|
break;
|
||
|
case 0xFE: /* INC abs, X */
|
||
|
mr_eaabsx(MemValue);
|
||
|
asm("addi.b #0x01, %0\n\tmove %%sr, %1\n\tandi.w #0x000C, %1\n\tandi.w #0xFFF3, %2\n\tor.w %1, %2"
|
||
|
:
|
||
|
: "d" (MemValue), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
MEMORY_WRITE(MemValue, TempWord);
|
||
|
AppleClock+=7;
|
||
|
break;
|
||
|
case 0xE8: /* INX */
|
||
|
asm("addi.b #0x01, %0\n\tmove %%sr, %1\n\tandi.w #0x000C, %1\n\tandi.w #0xFFF3, %2\n\tor.w %1, %2"
|
||
|
:
|
||
|
: "m" (X), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
AppleClock+=2;
|
||
|
break;
|
||
|
case 0xC8: /* INY */
|
||
|
asm("addi.b #0x01, %0\n\tmove %%sr, %1\n\tandi.w #0x000C, %1\n\tandi.w #0xFFF3, %2\n\tor.w %1, %2"
|
||
|
:
|
||
|
: "m" (Y), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
AppleClock+=2;
|
||
|
break;
|
||
|
|
||
|
case 0x4C: /* JMP abs */
|
||
|
// eaabs(TempWord);
|
||
|
PC.PC = PreFetch;
|
||
|
AppleClock+=3;
|
||
|
break;
|
||
|
case 0x6C: /* JMP (abs) */
|
||
|
eaabsind();
|
||
|
AppleClock+=5;
|
||
|
break;
|
||
|
|
||
|
case 0x20: /* JSR abs */
|
||
|
// eaabs(TempWord);
|
||
|
PC.PC++;
|
||
|
PUSH(PC.Byte[HIGH_BYTE]);
|
||
|
PUSH(PC.Byte[LOW_BYTE]);
|
||
|
PC.PC = PreFetch;
|
||
|
// PC.PC = TempWord.PC;
|
||
|
AppleClock+=6;
|
||
|
break;
|
||
|
|
||
|
case 0xA9: /* LDA #imm */
|
||
|
// eaimm(MemValue);
|
||
|
PC.PC++;
|
||
|
asm("move.b %0, %1\n\tmove %%sr, %2\n\tandi.w #0x000C, %2\n\tandi.w #0xFFF3, %3\n\tor.w %2, %3"
|
||
|
:
|
||
|
: "d" (PreFetch), "m" (_A), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
AppleClock+=2;
|
||
|
break;
|
||
|
case 0xAD: /* LDA abs */
|
||
|
mr_eaabs(MemValue);
|
||
|
asm("move.b %0, %1\n\tmove %%sr, %2\n\tandi.w #0x000C, %2\n\tandi.w #0xFFF3, %3\n\tor.w %2, %3"
|
||
|
:
|
||
|
: "d" (MemValue), "m" (_A), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
/* if (!LOOP) HostTraceOutputT(sysErrorClass, "LDA abs : %X %X\n", TempWord.PC, MemValue); */
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
case 0xA5: /* LDA zp */
|
||
|
eazp(MemValue);
|
||
|
asm("move.b %0, %1\n\tmove %%sr, %2\n\tandi.w #0x000C, %2\n\tandi.w #0xFFF3, %3\n\tor.w %2, %3"
|
||
|
:
|
||
|
: "d" (MemValue), "m" (_A), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
AppleClock+=3;
|
||
|
break;
|
||
|
case 0xA1: /* LDA (zp, X) */
|
||
|
mr_eazpxind(MemValue);
|
||
|
asm("move.b %0, %1\n\tmove %%sr, %2\n\tandi.w #0x000C, %2\n\tandi.w #0xFFF3, %3\n\tor.w %2, %3"
|
||
|
:
|
||
|
: "d" (MemValue), "m" (_A), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
AppleClock+=6;
|
||
|
break;
|
||
|
case 0xB1: /* LDA (zp), Y */
|
||
|
mr_eazpindy(MemValue);
|
||
|
asm("move.b %0, %1\n\tmove %%sr, %2\n\tandi.w #0x000C, %2\n\tandi.w #0xFFF3, %3\n\tor.w %2, %3"
|
||
|
:
|
||
|
: "d" (MemValue), "m" (_A), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
/* if (!LOOP) HostTraceOutputT(sysErrorClass, "LDA (zp), Y : %X %X %X\n", MemValue, TempByte, TempWord.PC); */
|
||
|
AppleClock+=5;
|
||
|
break;
|
||
|
case 0xB5: /* LDA zp, X */
|
||
|
mr_eazpx(MemValue);
|
||
|
asm("move.b %0, %1\n\tmove %%sr, %2\n\tandi.w #0x000C, %2\n\tandi.w #0xFFF3, %3\n\tor.w %2, %3"
|
||
|
:
|
||
|
: "d" (MemValue), "m" (_A), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
case 0xBD: /* LDA abs, X */
|
||
|
mr_eaabsx(MemValue);
|
||
|
asm("move.b %0, %1\n\tmove %%sr, %2\n\tandi.w #0x000C, %2\n\tandi.w #0xFFF3, %3\n\tor.w %2, %3"
|
||
|
:
|
||
|
: "d" (MemValue), "m" (_A), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
AppleClock+=4;
|
||
|
/* if (!LOOP) HostTraceOutputT(sysErrorClass, "LDA abs, X : %X %X %X\n", TempWord.PC, X, PreFetch); */
|
||
|
break;
|
||
|
case 0xB9: /* LDA abs, Y */
|
||
|
mr_eaabsy(MemValue);
|
||
|
asm("move.b %0, %1\n\tmove %%sr, %2\n\tandi.w #0x000C, %2\n\tandi.w #0xFFF3, %3\n\tor.w %2, %3"
|
||
|
:
|
||
|
: "d" (MemValue), "m" (_A), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
/* if (!LOOP) HostTraceOutputT(sysErrorClass, "LDA abs, Y : %X %X\n", TempWord.PC, MemValue); */
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
|
||
|
case 0xA2: /* LDX #imm */
|
||
|
// eaimm(MemValue);
|
||
|
PC.PC++;
|
||
|
asm("move.b %0, %1\n\tmove %%sr, %2\n\tandi.w #0x000C, %2\n\tandi.w #0xFFF3, %3\n\tor.w %2, %3"
|
||
|
:
|
||
|
: "d" (PreFetch), "m" (X), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
AppleClock+=2;
|
||
|
break;
|
||
|
case 0xAE: /* LDX abs */
|
||
|
mr_eaabs(MemValue);
|
||
|
asm("move.b %0, %1\n\tmove %%sr, %2\n\tandi.w #0x000C, %2\n\tandi.w #0xFFF3, %3\n\tor.w %2, %3"
|
||
|
:
|
||
|
: "d" (MemValue), "m" (X), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
case 0xA6: /* LDX zp */
|
||
|
eazp(MemValue);
|
||
|
asm("move.b %0, %1\n\tmove %%sr, %2\n\tandi.w #0x000C, %2\n\tandi.w #0xFFF3, %3\n\tor.w %2, %3"
|
||
|
:
|
||
|
: "d" (MemValue), "m" (X), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
AppleClock+=3;
|
||
|
break;
|
||
|
case 0xBE: /* LDX abs, Y */
|
||
|
mr_eaabsy(MemValue);
|
||
|
asm("move.b %0, %1\n\tmove %%sr, %2\n\tandi.w #0x000C, %2\n\tandi.w #0xFFF3, %3\n\tor.w %2, %3"
|
||
|
:
|
||
|
: "d" (MemValue), "m" (X), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
case 0xB6: /* LDX zp, Y */
|
||
|
mr_eazpy(MemValue);
|
||
|
asm("move.b %0, %1\n\tmove %%sr, %2\n\tandi.w #0x000C, %2\n\tandi.w #0xFFF3, %3\n\tor.w %2, %3"
|
||
|
:
|
||
|
: "d" (MemValue), "m" (X), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
|
||
|
case 0xA0: /* LDY #imm */
|
||
|
// eaimm(MemValue);
|
||
|
PC.PC++;
|
||
|
asm("move.b %0, %1\n\tmove %%sr, %2\n\tandi.w #0x000C, %2\n\tandi.w #0xFFF3, %3\n\tor.w %2, %3"
|
||
|
:
|
||
|
: "d" (PreFetch), "m" (Y), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
AppleClock+=2;
|
||
|
break;
|
||
|
case 0xAC: /* LDY abs */
|
||
|
mr_eaabs(MemValue);
|
||
|
asm("move.b %0, %1\n\tmove %%sr, %2\n\tandi.w #0x000C, %2\n\tandi.w #0xFFF3, %3\n\tor.w %2, %3"
|
||
|
:
|
||
|
: "d" (MemValue), "m" (Y), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
case 0xA4: /* LDY zp */
|
||
|
eazp(MemValue);
|
||
|
asm("move.b %0, %1\n\tmove %%sr, %2\n\tandi.w #0x000C, %2\n\tandi.w #0xFFF3, %3\n\tor.w %2, %3"
|
||
|
:
|
||
|
: "d" (MemValue), "m" (Y), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
AppleClock+=3;
|
||
|
break;
|
||
|
case 0xB4: /* LDY zp, X */
|
||
|
mr_eazpx(MemValue);
|
||
|
asm("move.b %0, %1\n\tmove %%sr, %2\n\tandi.w #0x000C, %2\n\tandi.w #0xFFF3, %3\n\tor.w %2, %3"
|
||
|
:
|
||
|
: "d" (MemValue), "m" (Y), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
case 0xBC: /* LDY abs, X */
|
||
|
mr_eaabsx(MemValue);
|
||
|
asm("move.b %0, %1\n\tmove %%sr, %2\n\tandi.w #0x000C, %2\n\tandi.w #0xFFF3, %3\n\tor.w %2, %3"
|
||
|
:
|
||
|
: "d" (MemValue), "m" (Y), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
|
||
|
case 0x4E: /* LSR abs */
|
||
|
mr_eaabs(MemValue);
|
||
|
|
||
|
asm("lsr.b #1, %0\n\tmove.w %%sr, %1\n\tandi.w #0x0002, %2\n\tandi.w #0xFFF7, %1\n\tor.w %1, %2"
|
||
|
:
|
||
|
: "d" (MemValue), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
|
||
|
MEMORY_WRITE(MemValue, TempWord);
|
||
|
AppleClock+=6;
|
||
|
break;
|
||
|
case 0x46: /* LSR zp */
|
||
|
eazp(MemValue);
|
||
|
|
||
|
asm("lsr.b #1, %0\n\tmove.w %%sr, %1\n\tandi.w #0x0002, %2\n\tandi.w #0xFFF7, %1\n\tor.w %1, %2"
|
||
|
:
|
||
|
: "d" (MemValue), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
|
||
|
_AppleMemory[TempByte] = MemValue;
|
||
|
AppleClock+=5;
|
||
|
break;
|
||
|
case 0x4A: /* LSR acc */
|
||
|
asm("lsr.b #1, %0\n\tmove.w %%sr, %1\n\tandi.w #0x0002, %2\n\tandi.w #0xFFF7, %1\n\tor.w %1, %2\n\tmove.b %0, %3"
|
||
|
:
|
||
|
: "d" (_A), "d" (Status), "m" (Status), "m" (_A)
|
||
|
);
|
||
|
AppleClock+=2;
|
||
|
break;
|
||
|
case 0x56: /* LSR zp, X */
|
||
|
mr_eazpx(MemValue);
|
||
|
|
||
|
asm("lsr.b #1, %0\n\tmove.w %%sr, %1\n\tandi.w #0x0002, %2\n\tandi.w #0xFFF7, %1\n\tor.w %1, %2"
|
||
|
:
|
||
|
: "d" (MemValue), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
|
||
|
_AppleMemory[TempByte] = MemValue;
|
||
|
AppleClock+=6;
|
||
|
break;
|
||
|
case 0x5E: /* LSR abs, X */
|
||
|
mr_eaabsx(MemValue);
|
||
|
|
||
|
asm("lsr.b #1, %0\n\tmove.w %%sr, %1\n\tandi.w #0x0002, %2\n\tandi.w #0xFFF7, %1\n\tor.w %1, %2"
|
||
|
:
|
||
|
: "d" (MemValue), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
|
||
|
MEMORY_WRITE(MemValue, TempWord);
|
||
|
AppleClock+=7;
|
||
|
break;
|
||
|
|
||
|
case 0xEA: /* NOP */
|
||
|
AppleClock+=2;
|
||
|
break;
|
||
|
|
||
|
case 0x09: /* ORA #imm */
|
||
|
// eaimm(MemValue);
|
||
|
PC.PC++;
|
||
|
asm("or.b %2, %1\n\tmove.w %%sr, %3\n\tmove %0, %4\n\tandi.w #0x000C, %3\n\tandi.w #0xFFF3, %4\n\tor.b %3, %4\n\tmove.w %4, %0"
|
||
|
: "=m" (Status)
|
||
|
: "m" (_A), "d" (PreFetch), "d" (Status), "d" (MemValue)
|
||
|
);
|
||
|
AppleClock+=2;
|
||
|
break;
|
||
|
case 0x0D: /* ORA abs */
|
||
|
mr_eaabs(MemValue);
|
||
|
asm("or.b %2, %1\n\tmove.w %%sr, %3\n\tmove %0, %4\n\tandi.w #0x000C, %3\n\tandi.w #0xFFF3, %4\n\tor.b %3, %4\n\tmove.w %4, %0"
|
||
|
: "=m" (Status)
|
||
|
: "m" (_A), "d" (MemValue), "d" (Status), "d" (MemValue)
|
||
|
);
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
case 0x05: /* ORA zp */
|
||
|
eazp(MemValue);
|
||
|
asm("or.b %2, %1\n\tmove.w %%sr, %3\n\tmove %0, %4\n\tandi.w #0x000C, %3\n\tandi.w #0xFFF3, %4\n\tor.b %3, %4\n\tmove.w %4, %0"
|
||
|
: "=m" (Status)
|
||
|
: "m" (_A), "d" (MemValue), "d" (Status), "d" (MemValue)
|
||
|
);
|
||
|
AppleClock+=3;
|
||
|
break;
|
||
|
case 0x01: /* ORA (zp, X) */
|
||
|
mr_eazpxind(MemValue);
|
||
|
asm("or.b %2, %1\n\tmove.w %%sr, %3\n\tmove %0, %4\n\tandi.w #0x000C, %3\n\tandi.w #0xFFF3, %4\n\tor.b %3, %4\n\tmove.w %4, %0"
|
||
|
: "=m" (Status)
|
||
|
: "m" (_A), "d" (MemValue), "d" (Status), "d" (MemValue)
|
||
|
);
|
||
|
AppleClock+=6;
|
||
|
break;
|
||
|
case 0x11: /* ORA (zp), Y */
|
||
|
mr_eazpindy(MemValue);
|
||
|
asm("or.b %2, %1\n\tmove.w %%sr, %3\n\tmove %0, %4\n\tandi.w #0x000C, %3\n\tandi.w #0xFFF3, %4\n\tor.b %3, %4\n\tmove.w %4, %0"
|
||
|
: "=m" (Status)
|
||
|
: "m" (_A), "d" (MemValue), "d" (Status), "d" (MemValue)
|
||
|
);
|
||
|
AppleClock+=5;
|
||
|
break;
|
||
|
case 0x15: /* ORA zp, X */
|
||
|
mr_eazpx(MemValue);
|
||
|
asm("or.b %2, %1\n\tmove.w %%sr, %3\n\tmove %0, %4\n\tandi.w #0x000C, %3\n\tandi.w #0xFFF3, %4\n\tor.b %3, %4\n\tmove.w %4, %0"
|
||
|
: "=m" (Status)
|
||
|
: "m" (_A), "d" (MemValue), "d" (Status), "d" (MemValue)
|
||
|
);
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
case 0x1D: /* ORA abs, X */
|
||
|
mr_eaabsx(MemValue);
|
||
|
asm("or.b %2, %1\n\tmove.w %%sr, %3\n\tmove %0, %4\n\tandi.w #0x000C, %3\n\tandi.w #0xFFF3, %4\n\tor.b %3, %4\n\tmove.w %4, %0"
|
||
|
: "=m" (Status)
|
||
|
: "m" (_A), "d" (MemValue), "d" (Status), "d" (MemValue)
|
||
|
);
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
case 0x19: /* ORA abs, Y */
|
||
|
mr_eaabsy(MemValue);
|
||
|
asm("or.b %2, %1\n\tmove.w %%sr, %3\n\tmove %0, %4\n\tandi.w #0x000C, %3\n\tandi.w #0xFFF3, %4\n\tor.b %3, %4\n\tmove.w %4, %0"
|
||
|
: "=m" (Status)
|
||
|
: "m" (_A), "d" (MemValue), "d" (Status), "d" (MemValue)
|
||
|
);
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
|
||
|
case 0x48: /* PHA */
|
||
|
PUSH(_A);
|
||
|
AppleClock+=3;
|
||
|
break;
|
||
|
case 0x08: /* PHP */
|
||
|
asm("clr.w %0"
|
||
|
:
|
||
|
: "d" (MemValue)
|
||
|
);
|
||
|
/* N Flags */
|
||
|
asm("move %0, %1\n\tandi.w #0x08, %1\n\tlsl.w #4, %1\n\tor.w %1, %2"
|
||
|
:
|
||
|
: "m" (Status), "d" (Status), "d" (MemValue)
|
||
|
);
|
||
|
/* V Flags */
|
||
|
asm("move %0, %1\n\tandi.w #0x02, %1\n\tlsl.w #5, %1\n\tor.w %1, %2"
|
||
|
:
|
||
|
: "m" (Status), "d" (Status), "d" (MemValue)
|
||
|
);
|
||
|
/* Bit 5 Flags */
|
||
|
asm("ori.w #0x20, %0"
|
||
|
:
|
||
|
: "d" (MemValue)
|
||
|
);
|
||
|
/* Z Flags */
|
||
|
asm("move %0, %1\n\tandi.w #0x04, %1\n\tlsr.w #1, %1\n\tor.w %1, %2"
|
||
|
:
|
||
|
: "m" (Status), "d" (Status), "d" (MemValue)
|
||
|
);
|
||
|
/* C Flags */
|
||
|
asm("move %0, %1\n\tandi.w #0x01, %1\n\tor.w %1, %2"
|
||
|
:
|
||
|
: "m" (Status), "d" (Status), "d" (MemValue)
|
||
|
);
|
||
|
MemValue |= Decimal;
|
||
|
PUSH(MemValue);
|
||
|
AppleClock+=3;
|
||
|
break;
|
||
|
case 0x68: /* PLA */
|
||
|
POP(_A);
|
||
|
asm("move.b %0, %1\n\tmove %%sr, %2\n\tandi.w #0x000C, %2\n\tandi.w #0xFFF3, %3\n\tor.w %2, %3"
|
||
|
:
|
||
|
: "m" (_A), "d" (_A), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
case 0x28: /* PLP */
|
||
|
POP(MemValue);
|
||
|
asm("clr.w %0"
|
||
|
:
|
||
|
: "m" (Status)
|
||
|
);
|
||
|
/* N Flags */
|
||
|
asm("move %2, %1\n\tandi.w #0x80, %1\n\tlsr.w #4, %1\n\tor.w %1, %0"
|
||
|
:
|
||
|
: "m" (Status), "d" (Status), "d" (MemValue)
|
||
|
);
|
||
|
/* V Flags */
|
||
|
asm("move %2, %1\n\tandi.w #0x40, %1\n\tlsr.w #5, %1\n\tor.w %1, %0"
|
||
|
:
|
||
|
: "m" (Status), "d" (Status), "d" (MemValue)
|
||
|
);
|
||
|
/* Z Flags */
|
||
|
asm("move %2, %1\n\tandi.w #0x02, %1\n\tlsl.w #1, %1\n\tor.w %1, %0"
|
||
|
:
|
||
|
: "m" (Status), "d" (Status), "d" (MemValue)
|
||
|
);
|
||
|
/* C Flags */
|
||
|
asm("move %2, %1\n\tandi.w #0x01, %1\n\tor.w %1, %0"
|
||
|
:
|
||
|
: "m" (Status), "d" (Status), "d" (MemValue)
|
||
|
);
|
||
|
/* D Flags */
|
||
|
asm("move %2, %1\n\tandi.w #0x08, %1\n\tmove.b %1, %0"
|
||
|
:
|
||
|
: "m" (Decimal), "d" (Status), "d" (MemValue)
|
||
|
);
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
|
||
|
case 0x2E: /* ROL abs */
|
||
|
mr_eaabs(MemValue);
|
||
|
Status &= 0xFFEF; if (Status & 0x01) Status |= 0x10;
|
||
|
asm("move.w %2, %%ccr\n\troxl.b #1, %0\n\tmove.w %%sr, %1\n\tandi.w #0x0002, %2\n\tor.w %1, %2"
|
||
|
:
|
||
|
: "d" (MemValue), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
|
||
|
MEMORY_WRITE(MemValue, TempWord);
|
||
|
AppleClock+=6;
|
||
|
break;
|
||
|
case 0x26: /* ROL zp */
|
||
|
eazp(MemValue);
|
||
|
Status &= 0xFFEF; if (Status & 0x01) Status |= 0x10;
|
||
|
asm("move.w %2, %%ccr\n\troxl.b #1, %0\n\tmove.w %%sr, %1\n\tandi.w #0x0002, %2\n\tor.w %1, %2"
|
||
|
:
|
||
|
: "d" (MemValue), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
|
||
|
_AppleMemory[TempByte] = MemValue;
|
||
|
AppleClock+=5;
|
||
|
break;
|
||
|
case 0x2A: /* ROL acc */
|
||
|
Status &= 0xFFEF; if (Status & 0x01) Status |= 0x10;
|
||
|
asm("move.w %2, %%ccr\n\troxl.b #1, %0\n\tmove.w %%sr, %1\n\tandi.w #0x0002, %2\n\tor.w %1, %2\n\tmove.b %0, %3"
|
||
|
:
|
||
|
: "d" (_A), "d" (Status), "m" (Status), "m" (_A)
|
||
|
);
|
||
|
AppleClock+=2;
|
||
|
break;
|
||
|
case 0x36: /* ROL zp, X */
|
||
|
mr_eazpx(MemValue);
|
||
|
Status &= 0xFFEF; if (Status & 0x01) Status |= 0x10;
|
||
|
asm("move.w %2, %%ccr\n\troxl.b #1, %0\n\tmove.w %%sr, %1\n\tandi.w #0x0002, %2\n\tor.w %1, %2"
|
||
|
:
|
||
|
: "d" (MemValue), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
|
||
|
_AppleMemory[TempByte] = MemValue;
|
||
|
AppleClock+=6;
|
||
|
break;
|
||
|
case 0x3E: /* ROL abs, X */
|
||
|
mr_eaabsx(MemValue);
|
||
|
Status &= 0xFFEF; if (Status & 0x01) Status |= 0x10;
|
||
|
asm("move.w %2, %%ccr\n\troxl.b #1, %0\n\tmove.w %%sr, %1\n\tandi.w #0x0002, %2\n\tor.w %1, %2"
|
||
|
:
|
||
|
: "d" (MemValue), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
|
||
|
MEMORY_WRITE(MemValue, TempWord);
|
||
|
AppleClock+=7;
|
||
|
break;
|
||
|
|
||
|
case 0x6E: /* ROR abs */
|
||
|
mr_eaabs(MemValue);
|
||
|
Status &= 0xFFEF; if (Status & 0x01) Status |= 0x10;
|
||
|
asm("move.w %2, %%ccr\n\troxr.b #1, %0\n\tmove.w %%sr, %1\n\tandi.w #0x0002, %2\n\tor.w %1, %2"
|
||
|
:
|
||
|
: "d" (MemValue), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
|
||
|
MEMORY_WRITE(MemValue, TempWord);
|
||
|
AppleClock+=6;
|
||
|
break;
|
||
|
case 0x66: /* ROR zp */
|
||
|
eazp(MemValue);
|
||
|
Status &= 0xFFEF; if (Status & 0x01) Status |= 0x10;
|
||
|
asm("move.w %2, %%ccr\n\troxr.b #1, %0\n\tmove.w %%sr, %1\n\tandi.w #0x0002, %2\n\tor.w %1, %2"
|
||
|
:
|
||
|
: "d" (MemValue), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
|
||
|
_AppleMemory[TempByte] = MemValue;
|
||
|
AppleClock+=5;
|
||
|
break;
|
||
|
case 0x6A: /* ROR acc */
|
||
|
Status &= 0xFFEF; if (Status & 0x01) Status |= 0x10;
|
||
|
asm("move.w %2, %%ccr\n\troxr.b #1, %0\n\tmove.w %%sr, %1\n\tandi.w #0x0002, %2\n\tor.w %1, %2\n\tmove.b %0, %3"
|
||
|
:
|
||
|
: "d" (_A), "d" (Status), "m" (Status), "m" (_A)
|
||
|
);
|
||
|
AppleClock+=2;
|
||
|
break;
|
||
|
case 0x76: /* ROR zp, X */
|
||
|
mr_eazpx(MemValue);
|
||
|
Status &= 0xFFEF; if (Status & 0x01) Status |= 0x10;
|
||
|
asm("move.w %2, %%ccr\n\troxr.b #1, %0\n\tmove.w %%sr, %1\n\tandi.w #0x0002, %2\n\tor.w %1, %2"
|
||
|
:
|
||
|
: "d" (MemValue), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
|
||
|
_AppleMemory[TempByte] = MemValue;
|
||
|
AppleClock+=6;
|
||
|
break;
|
||
|
case 0x7E: /* ROR abs, X */
|
||
|
mr_eaabsx(MemValue);
|
||
|
Status &= 0xFFEF; if (Status & 0x01) Status |= 0x10;
|
||
|
asm("move.w %2, %%ccr\n\troxr.b #1, %0\n\tmove.w %%sr, %1\n\tandi.w #0x0002, %2\n\tor.w %1, %2"
|
||
|
:
|
||
|
: "d" (MemValue), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
|
||
|
MEMORY_WRITE(MemValue, TempWord);
|
||
|
AppleClock+=7;
|
||
|
break;
|
||
|
|
||
|
case 0x40: /* RTI */
|
||
|
POP(MemValue);
|
||
|
asm("clr.w %0"
|
||
|
:
|
||
|
: "m" (Status)
|
||
|
);
|
||
|
/* N Flags */
|
||
|
asm("move %2, %1\n\tandi.w #0x80, %1\n\tlsr.w #4, %1\n\tor.w %1, %0"
|
||
|
:
|
||
|
: "m" (Status), "d" (Status), "d" (MemValue)
|
||
|
);
|
||
|
/* V Flags */
|
||
|
asm("move %2, %1\n\tandi.w #0x40, %1\n\tlsr.w #5, %1\n\tor.w %1, %0"
|
||
|
:
|
||
|
: "m" (Status), "d" (Status), "d" (MemValue)
|
||
|
);
|
||
|
/* Z Flags */
|
||
|
asm("move %2, %1\n\tandi.w #0x02, %1\n\tlsl.w #1, %1\n\tor.w %1, %0"
|
||
|
:
|
||
|
: "m" (Status), "d" (Status), "d" (MemValue)
|
||
|
);
|
||
|
/* C Flags */
|
||
|
asm("move %2, %1\n\tandi.w #0x01, %1\n\tor.w %1, %0"
|
||
|
:
|
||
|
: "m" (Status), "d" (Status), "d" (MemValue)
|
||
|
);
|
||
|
/* D Flags */
|
||
|
asm("move %2, %1\n\tandi.w #0x08, %1\n\tmove.b %1, %0"
|
||
|
:
|
||
|
: "m" (Decimal), "d" (Status), "d" (MemValue)
|
||
|
);
|
||
|
POP(PC.Byte[LOW_BYTE]);
|
||
|
POP(PC.Byte[HIGH_BYTE]);
|
||
|
AppleClock+=6;
|
||
|
break;
|
||
|
|
||
|
case 0x60: /* RTS */
|
||
|
POP(PC.Byte[LOW_BYTE]);
|
||
|
POP(PC.Byte[HIGH_BYTE]);
|
||
|
PC.PC++;
|
||
|
AppleClock+=6;
|
||
|
break;
|
||
|
|
||
|
case 0xE9: /* SBC #imm */
|
||
|
// eaimm(MemValue);
|
||
|
PC.PC++;
|
||
|
if (Status & 0x01) Status &= 0xFFEE; else Status |= 0x0011;
|
||
|
Status |= 0x04;
|
||
|
asm("move.b %0, %1\n\tbne .sbc_e9_decimal" : : "m" (Decimal), "d" (Decimal));
|
||
|
asm("move.w %0, %%ccr\n\tsubx.b %2, %1\n\tmove.w %%sr, %0\n\tmove.b %1, %3"
|
||
|
: "=m" (Status)
|
||
|
: "d" (_A), "d" (PreFetch), "m" (_A)
|
||
|
);
|
||
|
asm("bra .sbc_e9_finish");
|
||
|
asm(".sbc_e9_decimal:");
|
||
|
asm("move.w %0, %%ccr\n\tsbcd %2, %1\n\tmove.w %%sr, %0\n\tmove.b %1, %3"
|
||
|
: "=m" (Status)
|
||
|
: "d" (_A), "d" (PreFetch), "m" (_A)
|
||
|
);
|
||
|
asm(".sbc_e9_finish:");
|
||
|
if (Status & 0x01) Status &= 0xFFEE; else Status |= 0x0011;
|
||
|
AppleClock+=2;
|
||
|
break;
|
||
|
case 0xED: /* SBC abs */
|
||
|
mr_eaabs(MemValue);
|
||
|
if (Status & 0x01) Status &= 0xFFEE; else Status |= 0x0011;
|
||
|
Status |= 0x04;
|
||
|
asm("move.b %0, %1\n\tbne .sbc_ed_decimal" : : "m" (Decimal), "d" (Decimal));
|
||
|
asm("move.w %0, %%ccr\n\tsubx.b %2, %1\n\tmove.w %%sr, %0\n\tmove.b %1, %3"
|
||
|
: "=m" (Status)
|
||
|
: "d" (_A), "d" (MemValue), "m" (_A)
|
||
|
);
|
||
|
asm("bra .sbc_ed_finish");
|
||
|
asm(".sbc_ed_decimal:");
|
||
|
asm("move.w %0, %%ccr\n\tsbcd %2, %1\n\tmove.w %%sr, %0\n\tmove.b %1, %3"
|
||
|
: "=m" (Status)
|
||
|
: "d" (_A), "d" (MemValue), "m" (_A)
|
||
|
);
|
||
|
asm(".sbc_ed_finish:");
|
||
|
if (Status & 0x01) Status &= 0xFFEE; else Status |= 0x0011;
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
case 0xE5: /* SBC zp */
|
||
|
eazp(MemValue);
|
||
|
if (Status & 0x01) Status &= 0xFFEE; else Status |= 0x0011;
|
||
|
Status |= 0x04;
|
||
|
asm("move.b %0, %1\n\tbne .sbc_e5_decimal" : : "m" (Decimal), "d" (Decimal));
|
||
|
asm("move.w %0, %%ccr\n\tsubx.b %2, %1\n\tmove.w %%sr, %0\n\tmove.b %1, %3"
|
||
|
: "=m" (Status)
|
||
|
: "d" (_A), "d" (MemValue), "m" (_A)
|
||
|
);
|
||
|
asm("bra .sbc_e5_finish");
|
||
|
asm(".sbc_e5_decimal:");
|
||
|
asm("move.w %0, %%ccr\n\tsbcd %2, %1\n\tmove.w %%sr, %0\n\tmove.b %1, %3"
|
||
|
: "=m" (Status)
|
||
|
: "d" (_A), "d" (MemValue), "m" (_A)
|
||
|
);
|
||
|
asm(".sbc_e5_finish:");
|
||
|
if (Status & 0x01) Status &= 0xFFEE; else Status |= 0x0011;
|
||
|
AppleClock+=3;
|
||
|
break;
|
||
|
case 0xE1: /* SBC (zp, X) */
|
||
|
mr_eazpxind(MemValue);
|
||
|
if (Status & 0x01) Status &= 0xFFEE; else Status |= 0x0011;
|
||
|
Status |= 0x04;
|
||
|
asm("move.b %0, %1\n\tbne .sbc_e1_decimal" : : "m" (Decimal), "d" (Decimal));
|
||
|
asm("move.w %0, %%ccr\n\tsubx.b %2, %1\n\tmove.w %%sr, %0\n\tmove.b %1, %3"
|
||
|
: "=m" (Status)
|
||
|
: "d" (_A), "d" (MemValue), "m" (_A)
|
||
|
);
|
||
|
asm("bra .sbc_e1_finish");
|
||
|
asm(".sbc_e1_decimal:");
|
||
|
asm("move.w %0, %%ccr\n\tsbcd %2, %1\n\tmove.w %%sr, %0\n\tmove.b %1, %3"
|
||
|
: "=m" (Status)
|
||
|
: "d" (_A), "d" (MemValue), "m" (_A)
|
||
|
);
|
||
|
asm(".sbc_e1_finish:");
|
||
|
if (Status & 0x01) Status &= 0xFFEE; else Status |= 0x0011;
|
||
|
AppleClock+=6;
|
||
|
break;
|
||
|
case 0xF1: /* SBC (zp), Y */
|
||
|
mr_eazpindy(MemValue);
|
||
|
if (Status & 0x01) Status &= 0xFFEE; else Status |= 0x0011;
|
||
|
Status |= 0x04;
|
||
|
asm("move.b %0, %1\n\tbne .sbc_f1_decimal" : : "m" (Decimal), "d" (Decimal));
|
||
|
asm("move.w %0, %%ccr\n\tsubx.b %2, %1\n\tmove.w %%sr, %0\n\tmove.b %1, %3"
|
||
|
: "=m" (Status)
|
||
|
: "d" (_A), "d" (MemValue), "m" (_A)
|
||
|
);
|
||
|
asm("bra .sbc_f1_finish");
|
||
|
asm(".sbc_f1_decimal:");
|
||
|
asm("move.w %0, %%ccr\n\tsbcd %2, %1\n\tmove.w %%sr, %0\n\tmove.b %1, %3"
|
||
|
: "=m" (Status)
|
||
|
: "d" (_A), "d" (MemValue), "m" (_A)
|
||
|
);
|
||
|
asm(".sbc_f1_finish:");
|
||
|
if (Status & 0x01) Status &= 0xFFEE; else Status |= 0x0011;
|
||
|
AppleClock+=5;
|
||
|
break;
|
||
|
case 0xF5: /* SBC zp, X */
|
||
|
mr_eazpx(MemValue);
|
||
|
if (Status & 0x01) Status &= 0xFFEE; else Status |= 0x0011;
|
||
|
Status |= 0x04;
|
||
|
asm("move.b %0, %1\n\tbne .sbc_f5_decimal" : : "m" (Decimal), "d" (Decimal));
|
||
|
asm("move.w %0, %%ccr\n\tsubx.b %2, %1\n\tmove.w %%sr, %0\n\tmove.b %1, %3"
|
||
|
: "=m" (Status)
|
||
|
: "d" (_A), "d" (MemValue), "m" (_A)
|
||
|
);
|
||
|
asm("bra .sbc_f5_finish");
|
||
|
asm(".sbc_f5_decimal:");
|
||
|
asm("move.w %0, %%ccr\n\tsbcd %2, %1\n\tmove.w %%sr, %0\n\tmove.b %1, %3"
|
||
|
: "=m" (Status)
|
||
|
: "d" (_A), "d" (MemValue), "m" (_A)
|
||
|
);
|
||
|
asm(".sbc_f5_finish:");
|
||
|
if (Status & 0x01) Status &= 0xFFEE; else Status |= 0x0011;
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
case 0xFD: /* SBC abs, X */
|
||
|
mr_eaabsx(MemValue);
|
||
|
if (Status & 0x01) Status &= 0xFFEE; else Status |= 0x0011;
|
||
|
Status |= 0x04;
|
||
|
asm("move.b %0, %1\n\tbne .sbc_fd_decimal" : : "m" (Decimal), "d" (Decimal));
|
||
|
asm("move.w %0, %%ccr\n\tsubx.b %2, %1\n\tmove.w %%sr, %0\n\tmove.b %1, %3"
|
||
|
: "=m" (Status)
|
||
|
: "d" (_A), "d" (MemValue), "m" (_A)
|
||
|
);
|
||
|
asm("bra .sbc_fd_finish");
|
||
|
asm(".sbc_fd_decimal:");
|
||
|
asm("move.w %0, %%ccr\n\tsbcd %2, %1\n\tmove.w %%sr, %0\n\tmove.b %1, %3"
|
||
|
: "=m" (Status)
|
||
|
: "d" (_A), "d" (MemValue), "m" (_A)
|
||
|
);
|
||
|
asm(".sbc_fd_finish:");
|
||
|
if (Status & 0x01) Status &= 0xFFEE; else Status |= 0x0011;
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
case 0xF9: /* SBC abs, Y */
|
||
|
mr_eaabsy(MemValue);
|
||
|
if (Status & 0x01) Status &= 0xFFEE; else Status |= 0x0011;
|
||
|
Status |= 0x04;
|
||
|
asm("move.b %0, %1\n\tbne .sbc_f9_decimal" : : "m" (Decimal), "d" (Decimal));
|
||
|
asm("move.w %0, %%ccr\n\tsubx.b %2, %1\n\tmove.w %%sr, %0\n\tmove.b %1, %3"
|
||
|
: "=m" (Status)
|
||
|
: "d" (_A), "d" (MemValue), "m" (_A)
|
||
|
);
|
||
|
asm("bra .sbc_f9_finish");
|
||
|
asm(".sbc_f9_decimal:");
|
||
|
asm("move.w %0, %%ccr\n\tsbcd %2, %1\n\tmove.w %%sr, %0\n\tmove.b %1, %3"
|
||
|
: "=m" (Status)
|
||
|
: "d" (_A), "d" (MemValue), "m" (_A)
|
||
|
);
|
||
|
asm(".sbc_f9_finish:");
|
||
|
if (Status & 0x01) Status &= 0xFFEE; else Status |= 0x0011;
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
|
||
|
case 0x38: /* SEC */
|
||
|
asm("ori.w #0x11, %0" : "=m" (Status));
|
||
|
AppleClock+=2;
|
||
|
break;
|
||
|
case 0xF8: /* SED */
|
||
|
asm("move.b #0x08, %0" : : "m" (Decimal));
|
||
|
AppleClock+=2;
|
||
|
break;
|
||
|
case 0x78: /* SEI */
|
||
|
AppleClock+=2;
|
||
|
break;
|
||
|
|
||
|
case 0x8D: /* STA abs */
|
||
|
mw_eaabs(_A);
|
||
|
/* if (!LOOP) HostTraceOutputT(sysErrorClass, "STA abs : %X %X %X\n", */
|
||
|
/* TempWord.PC, _A, _AppleMemory[TempWord.PC]); */
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
case 0x85: /* STA zp */
|
||
|
mw_eazp(_A);
|
||
|
AppleClock+=3;
|
||
|
break;
|
||
|
case 0x81: /* STA (zp, X) */
|
||
|
mw_eazpxind(_A);
|
||
|
AppleClock+=6;
|
||
|
break;
|
||
|
case 0x91: /* STA (zp), Y */
|
||
|
mw_eazpindy(_A);
|
||
|
AppleClock+=6;
|
||
|
break;
|
||
|
case 0x95: /* STA zp, X */
|
||
|
mw_eazpx(_A);
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
case 0x9D: /* STA abs, X */
|
||
|
mw_eaabsx(_A);
|
||
|
AppleClock+=5;
|
||
|
break;
|
||
|
case 0x99: /* STA abs, Y */
|
||
|
mw_eaabsy(_A);
|
||
|
/* if (!LOOP) HostTraceOutputT(sysErrorClass, "STA abs, Y : %X %X %X %X\n", TempWord.PC, Y, _A, PreFetch); */
|
||
|
AppleClock+=5;
|
||
|
break;
|
||
|
|
||
|
case 0x8E: /* STX abs */
|
||
|
mw_eaabs(X);
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
case 0x86: /* STX zp */
|
||
|
mw_eazp(X);
|
||
|
AppleClock+=3;
|
||
|
break;
|
||
|
case 0x96: /* STX zp, Y */
|
||
|
mw_eazpy(X);
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
|
||
|
case 0x8C: /* STY abs */
|
||
|
mw_eaabs(Y);
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
case 0x84: /* STY zp */
|
||
|
mw_eazp(Y);
|
||
|
AppleClock+=3;
|
||
|
break;
|
||
|
case 0x94: /* STY zp, X */
|
||
|
mw_eazpx(Y);
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
|
||
|
case 0xAA: /* TAX */
|
||
|
asm("move.b %0, %1\n\tmove.w %%sr, %3\n\tmove %2, %4\n\tandi.w #0x000C, %3\n\tandi.w #0xFFF3, %4\n\tor.b %3, %4\n\tmove.w %4, %2"
|
||
|
:
|
||
|
: "m" (_A), "m" (X), "m" (Status), "d" (MemValue), "d" (Status)
|
||
|
);
|
||
|
AppleClock+=2;
|
||
|
break;
|
||
|
case 0xA8: /* TAY */
|
||
|
asm("move.b %0, %1\n\tmove.w %%sr, %3\n\tmove %2, %4\n\tandi.w #0x000C, %3\n\tandi.w #0xFFF3, %4\n\tor.b %3, %4\n\tmove.w %4, %2"
|
||
|
:
|
||
|
: "m" (_A), "m" (Y), "m" (Status), "d" (MemValue), "d" (Status)
|
||
|
);
|
||
|
AppleClock+=2;
|
||
|
break;
|
||
|
|
||
|
case 0xBA: /* TSX */
|
||
|
asm("move.b %0, %1\n\tmove.w %%sr, %3\n\tmove %2, %4\n\tandi.w #0x000C, %3\n\tandi.w #0xFFF3, %4\n\tor.b %3, %4\n\tmove.w %4, %2"
|
||
|
:
|
||
|
: "m" (Stack.Byte[LOW_BYTE]), "m" (X), "m" (Status), "d" (MemValue), "d" (Status)
|
||
|
);
|
||
|
AppleClock+=2;
|
||
|
break;
|
||
|
case 0x8A: /* TXA */
|
||
|
asm("move.b %0, %1\n\tmove.w %%sr, %3\n\tmove %2, %4\n\tandi.w #0x000C, %3\n\tandi.w #0xFFF3, %4\n\tor.b %3, %4\n\tmove.w %4, %2"
|
||
|
:
|
||
|
: "m" (X), "m" (_A), "m" (Status), "d" (MemValue), "d" (Status)
|
||
|
);
|
||
|
AppleClock+=2;
|
||
|
break;
|
||
|
case 0x9A: /* TXS */
|
||
|
asm("move.b %0, %1"
|
||
|
:
|
||
|
: "m" (X), "m" (Stack.Byte[LOW_BYTE])
|
||
|
);
|
||
|
AppleClock+=2;
|
||
|
break;
|
||
|
case 0x98: /* TYA */
|
||
|
asm("move.b %0, %1\n\tmove.w %%sr, %3\n\tmove %2, %4\n\tandi.w #0x000C, %3\n\tandi.w #0xFFF3, %4\n\tor.b %3, %4\n\tmove.w %4, %2"
|
||
|
:
|
||
|
: "m" (Y), "m" (_A), "m" (Status), "d" (MemValue), "d" (Status)
|
||
|
);
|
||
|
AppleClock+=2;
|
||
|
break;
|
||
|
/* MC6502 Instruction Set */
|
||
|
case 0x72: /* ADC (zp) */
|
||
|
Status &= 0xFFEF; if (Status & 0x01) Status |= 0x10;
|
||
|
Status |= 0x04;
|
||
|
mr_eazpind(MemValue);
|
||
|
asm("move.b %0, %1\n\tbne .adc_72_decimal" : : "m" (Decimal), "d" (Decimal));
|
||
|
asm("move.w %0, %%ccr\n\taddx.b %2, %1\n\tmove.w %%sr, %0\n\tmove.b %1, %3"
|
||
|
:
|
||
|
: "m" (Status), "d" (_A), "d" (MemValue), "m" (_A)
|
||
|
);
|
||
|
asm("bra .adc_72_finish");
|
||
|
asm(".adc_72_decimal:");
|
||
|
asm("move.w %0, %%ccr\n\tabcd %2, %1\n\tmove.w %%sr, %0\n\tmove.b %1, %3"
|
||
|
:
|
||
|
: "m" (Status), "d" (_A), "d" (MemValue), "m" (_A)
|
||
|
);
|
||
|
asm(".adc_72_finish:");
|
||
|
AppleClock+=5;
|
||
|
break;
|
||
|
case 0x32: /* AND (zp) */
|
||
|
mr_eazpind(MemValue);
|
||
|
asm("and.b %2, %1\n\tmove.w %%sr, %3\n\tmove %0, %4\n\tandi.w #0x000C, %3\n\tandi.w #0xFFF3, %4\n\tor.b %3, %4\n\tmove.w %4, %0"
|
||
|
: "=m" (Status)
|
||
|
: "m" (_A), "d" (MemValue), "d" (Status), "d" (MemValue)
|
||
|
);
|
||
|
AppleClock+=5;
|
||
|
break;
|
||
|
case 0x34: /* BIT zp, X */
|
||
|
mr_eazpx(MemValue);
|
||
|
asm("andi.w #0xFFF1, %0\n\tand.b %2, %1\n\tmove.w %%sr, %3\n\tandi.w #0x04, %3\n\tor.w %3, %0\n\tclr.w %3\n\tmove.b %2, %3\n\tandi.w #0x0080, %3\n\tlsr.w #4, %3\n\tor.w %3, %0\n\tclr.w %3\n\tmove.b %2, %3\n\tandi.w #0x0040, %3\n\tlsr.w #5, %3\n\tor.w %3, %0"
|
||
|
:
|
||
|
: "m" (Status), "d" (_A), "d" (MemValue), "d" (Status)
|
||
|
);
|
||
|
AppleClock+=3;
|
||
|
break;
|
||
|
case 0x89: /* BIT #imm */
|
||
|
PC.PC++;
|
||
|
MemValue = PreFetch & 0xFF;
|
||
|
asm("andi.w #0xFFF1, %0\n\tand.b %2, %1\n\tmove.w %%sr, %3\n\tandi.w #0x04, %3\n\tor.w %3, %0\n\tclr.w %3\n\tmove.b %2, %3\n\tandi.w #0x0080, %3\n\tlsr.w #4, %3\n\tor.w %3, %0\n\tclr.w %3\n\tmove.b %2, %3\n\tandi.w #0x0040, %3\n\tlsr.w #5, %3\n\tor.w %3, %0"
|
||
|
:
|
||
|
: "m" (Status), "d" (_A), "d" (MemValue), "d" (Status)
|
||
|
);
|
||
|
AppleClock+=2;
|
||
|
break;
|
||
|
case 0x3C: /* BIT abs, X */
|
||
|
mr_eaabsx(MemValue);
|
||
|
asm("andi.w #0xFFF1, %0\n\tand.b %2, %1\n\tmove.w %%sr, %3\n\tandi.w #0x04, %3\n\tor.w %3, %0\n\tclr.w %3\n\tmove.b %2, %3\n\tandi.w #0x0080, %3\n\tlsr.w #4, %3\n\tor.w %3, %0\n\tclr.w %3\n\tmove.b %2, %3\n\tandi.w #0x0040, %3\n\tlsr.w #5, %3\n\tor.w %3, %0"
|
||
|
:
|
||
|
: "m" (Status), "d" (_A), "d" (MemValue), "d" (Status)
|
||
|
);
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
case 0x80: /* BRA rr */
|
||
|
PC.PC++;
|
||
|
AppleClock+=3;
|
||
|
asm("ext.w %0" : : "d" (PreFetch));
|
||
|
PC.PC += PreFetch;
|
||
|
break;
|
||
|
case 0xD2: /* CMP (zp) */
|
||
|
mr_eazpind(MemValue);
|
||
|
asm("neg.b %1\n\tadd.b %1, %0\n\tmove %%sr, %2\n\tandi.w #0xFFF2, %3\n\tandi.w #0x000D, %2\n\tor.w %2, %3\n\tneg.b %1"
|
||
|
:
|
||
|
: "d" (_A), "d" (MemValue), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
if (_A >= MemValue) Status |= 0x01; else Status &= 0xFFFE;
|
||
|
AppleClock+=5;
|
||
|
break;
|
||
|
case 0x3A: /* DEA acc */
|
||
|
asm("addi.b #0xFF, %0\n\tmove %%sr, %1\n\tandi.w #0x000C, %1\n\tandi.w #0xFFF3, %2\n\tor.w %1, %2"
|
||
|
:
|
||
|
: "m" (_A), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
AppleClock+=2;
|
||
|
break;
|
||
|
case 0x52: /* EOR (zp) */
|
||
|
mr_eazpind(MemValue);
|
||
|
asm("eor.b %0, %1\n\tmove %%sr, %2\n\tandi.w #0x000C, %2\n\tandi.w #0xFFF3, %3\n\tor.w %2, %3"
|
||
|
:
|
||
|
: "d" (MemValue), "m" (_A), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
AppleClock+=5;
|
||
|
break;
|
||
|
case 0x1A: /* INA acc */
|
||
|
asm("addi.b #0x01, %0\n\tmove %%sr, %1\n\tandi.w #0x000C, %1\n\tandi.w #0xFFF3, %2\n\tor.w %1, %2"
|
||
|
:
|
||
|
: "m" (_A), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
AppleClock+=2;
|
||
|
break;
|
||
|
case 0x7C: /* JMP (abs, X) */
|
||
|
eaabsxind();
|
||
|
AppleClock+=6;
|
||
|
break;
|
||
|
case 0xB2: /* LDA (zp) */
|
||
|
mr_eazpind(MemValue);
|
||
|
asm("move.b %0, %1\n\tmove %%sr, %2\n\tandi.w #0x000C, %2\n\tandi.w #0xFFF3, %3\n\tor.w %2, %3"
|
||
|
:
|
||
|
: "d" (MemValue), "m" (_A), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
// if (!LOOP) HostTraceOutputT(sysErrorClass, "LDA (zp) : %X %X %X\n", TempWord.PC, TempByte, MemValue);
|
||
|
AppleClock+=5;
|
||
|
break;
|
||
|
case 0x12: /* ORA (zp) */
|
||
|
mr_eazpind(MemValue);
|
||
|
asm("or.b %2, %1\n\tmove.w %%sr, %3\n\tmove %0, %4\n\tandi.w #0x000C, %3\n\tandi.w #0xFFF3, %4\n\tor.b %3, %4\n\tmove.w %4, %0"
|
||
|
: "=m" (Status)
|
||
|
: "m" (_A), "d" (MemValue), "d" (Status), "d" (MemValue)
|
||
|
);
|
||
|
AppleClock+=5;
|
||
|
break;
|
||
|
case 0xDA: /* PHX */
|
||
|
PUSH(X);
|
||
|
AppleClock+=3;
|
||
|
break;
|
||
|
case 0xFA: /* PLX */
|
||
|
POP(X);
|
||
|
asm("move.b %0, %1\n\tmove %%sr, %2\n\tandi.w #0x000C, %2\n\tandi.w #0xFFF3, %3\n\tor.w %2, %3"
|
||
|
:
|
||
|
: "m" (X), "d" (X), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
case 0x5A: /* PHY */
|
||
|
PUSH(Y);
|
||
|
AppleClock+=3;
|
||
|
break;
|
||
|
case 0x7A: /* PLY */
|
||
|
POP(Y);
|
||
|
asm("move.b %0, %1\n\tmove %%sr, %2\n\tandi.w #0x000C, %2\n\tandi.w #0xFFF3, %3\n\tor.w %2, %3"
|
||
|
:
|
||
|
: "m" (Y), "d" (Y), "d" (Status), "m" (Status)
|
||
|
);
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
case 0xF2: /* SBC (zp) */
|
||
|
mr_eazpind(MemValue);
|
||
|
if (Status & 0x01) Status &= 0xFFEE; else Status |= 0x0011;
|
||
|
Status |= 0x04;
|
||
|
asm("move.b %0, %1\n\tbne .sbc_f2_decimal" : : "m" (Decimal), "d" (Decimal));
|
||
|
asm("move.w %0, %%ccr\n\tsubx.b %2, %1\n\tmove.w %%sr, %0\n\tmove.b %1, %3"
|
||
|
: "=m" (Status)
|
||
|
: "d" (_A), "d" (MemValue), "m" (_A)
|
||
|
);
|
||
|
asm("bra .sbc_f2_finish");
|
||
|
asm(".sbc_f2_decimal:");
|
||
|
asm("move.w %0, %%ccr\n\tsbcd %2, %1\n\tmove.w %%sr, %0\n\tmove.b %1, %3"
|
||
|
: "=m" (Status)
|
||
|
: "d" (_A), "d" (MemValue), "m" (_A)
|
||
|
);
|
||
|
asm(".sbc_f2_finish:");
|
||
|
if (Status & 0x01) Status &= 0xFFEE; else Status |= 0x0011;
|
||
|
AppleClock+=4;
|
||
|
break;
|
||
|
case 0x92: /* STA (zp) */
|
||
|
mw_eazpind(_A);
|
||
|
AppleClock+=6;
|
||
|
break;
|
||
|
case 0x9C: /* STZ abs */
|
||
|
mw_eaabs(0);
|
||
|
AppleClock+=3;
|
||
|
break;
|
||
|
case 0x64: /* STZ zp */
|
||
|
mw_eazp(0);
|
||
|
AppleClock+=3;
|
||
|
break;
|
||
|
case 0x74: /* STZ zp, X */
|
||
|
mw_eazpx(0);
|
||
|
AppleClock+=3;
|
||
|
break;
|
||
|
case 0x9E: /* STZ abs, X */
|
||
|
mw_eaabsx(0);
|
||
|
AppleClock+=3;
|
||
|
break;
|
||
|
case 0x1C: /* TRB abs */
|
||
|
mr_eaabs(MemValue);
|
||
|
asm("andi.w #0xFFF1, %3\n\tmove.b %0, %1\n\tandi.b #0x80, %1\n\tlsr.b #0x04, %1\n\tor.w %1, %3\n\tmove.b %0, %1\n\tand.b %4, %1\n\tmove.w %%sr, %1\n\tandi.w #0x04, %1\n\tor.w %1, %3\n\tmove.b %0, %1\n\tandi.b #0x40, %1\n\tlsr.b #0x05, %1\n\tor.w %1, %3"
|
||
|
:
|
||
|
: "d" (MemValue), "d" (_A), "m" (Status), "d" (Status), "m" (_A)
|
||
|
);
|
||
|
MEMORY_WRITE(MemValue & ~_A, TempWord);
|
||
|
break;
|
||
|
case 0x14: /* TRB zp */
|
||
|
eazp(MemValue);
|
||
|
asm("andi.w #0xFFF1, %3\n\tmove.b %0, %1\n\tandi.b #0x80, %1\n\tlsr.b #0x04, %1\n\tor.w %1, %3\n\tmove.b %0, %1\n\tand.b %4, %1\n\tmove.w %%sr, %1\n\tandi.w #0x04, %1\n\tor.w %1, %3\n\tmove.b %0, %1\n\tandi.b #0x40, %1\n\tlsr.b #0x05, %1\n\tor.w %1, %3"
|
||
|
:
|
||
|
: "d" (MemValue), "d" (_A), "m" (Status), "d" (Status), "m" (_A)
|
||
|
);
|
||
|
_AppleMemory[TempByte] = MemValue;
|
||
|
break;
|
||
|
case 0x0C: /* TSB abs */
|
||
|
mr_eaabs(MemValue);
|
||
|
asm("andi.w #0xFFF1, %3\n\tmove.b %0, %1\n\tandi.b #0x80, %1\n\tlsr.b #0x04, %1\n\tor.w %1, %3\n\tmove.b %0, %1\n\tand.b %4, %1\n\tmove.w %%sr, %1\n\tandi.w #0x04, %1\n\tor.w %1, %3\n\tmove.b %0, %1\n\tandi.b #0x40, %1\n\tlsr.b #0x05, %1\n\tor.w %1, %3"
|
||
|
:
|
||
|
: "d" (MemValue), "d" (_A), "m" (Status), "d" (Status), "m" (_A)
|
||
|
);
|
||
|
MEMORY_WRITE(MemValue | _A, TempWord);
|
||
|
break;
|
||
|
case 0x04: /* TSB zp */
|
||
|
eazp(MemValue);
|
||
|
asm("andi.w #0xFFF1, %3\n\tmove.b %0, %1\n\tandi.b #0x80, %1\n\tlsr.b #0x04, %1\n\tor.w %1, %3\n\tmove.b %0, %1\n\tand.b %4, %1\n\tmove.w %%sr, %1\n\tandi.w #0x04, %1\n\tor.w %1, %3\n\tmove.b %0, %1\n\tandi.b #0x40, %1\n\tlsr.b #0x05, %1\n\tor.w %1, %3"
|
||
|
:
|
||
|
: "d" (MemValue), "d" (_A), "m" (Status), "d" (Status), "m" (_A)
|
||
|
);
|
||
|
_AppleMemory[TempByte] = MemValue | _A;
|
||
|
break;
|
||
|
default:
|
||
|
StrPrintF(buf, "Unknown Opcode %X", Opcode);
|
||
|
WinDrawChars(buf, StrLen(buf), 60, 0);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
asm(".screen1:");
|
||
|
|
||
|
if (IOUSoftSwitch[0] & SS_HIRES)
|
||
|
*(--_pointer) = ~_AppleMemory[scanaddr--];
|
||
|
else
|
||
|
*(--_pointer) = AppleFont[_AppleMemory[scanaddr--] * 8 + chary];
|
||
|
|
||
|
vert--;
|
||
|
|
||
|
asm(".screen2:");
|
||
|
|
||
|
if (vert < 0) {
|
||
|
#ifdef SONY
|
||
|
vert = 39; hori--; chary--; chary &= 0x07;
|
||
|
if (IOUSoftSwitch[0] & SS_HIRES)
|
||
|
scanaddr = ScanlineAddressTableH[hori] + 39;
|
||
|
else
|
||
|
scanaddr = ScanlineAddressTable[hori] + 39;
|
||
|
#else
|
||
|
vert = 19; hori--; chary--; chary &= 0x07;
|
||
|
if (IOUSoftSwitch[0] & SS_HIRES)
|
||
|
scanaddr = ScanlineAddressTableH[hori] + 19;
|
||
|
else
|
||
|
scanaddr = ScanlineAddressTable[hori] + 19;
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
asm(".screen3:");
|
||
|
|
||
|
if (hori < 0) {
|
||
|
#ifdef SONY
|
||
|
_pointer += 40 * 192; chary = 7;
|
||
|
vert = 39; hori = 191; fps++;
|
||
|
if (IOUSoftSwitch[0] & SS_HIRES)
|
||
|
scanaddr = ScanlineAddressTableH[hori] + 39;
|
||
|
else
|
||
|
if (IOUSoftSwitch[0] & SS_TEXT)
|
||
|
scanaddr = ScanlineAddressTable[hori] + 39;
|
||
|
#else
|
||
|
_pointer += 20 * 120; chary = 7;
|
||
|
vert = 19; hori = 119; fps++;
|
||
|
if (IOUSoftSwitch[0] & SS_HIRES)
|
||
|
scanaddr = ScanlineAddressTableH[hori] + 19;
|
||
|
else
|
||
|
if (IOUSoftSwitch[0] & SS_TEXT)
|
||
|
scanaddr = ScanlineAddressTable[hori] + 19;
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
asm(".screen4:");
|
||
|
|
||
|
if (QUIT) goto run_again;
|
||
|
}
|