📄 65816emu.cpp
字号:
case 0x59: // "XOR %w,Y", 3, 4,
mem = ABS_INDEX_Y;
ACCUM ^= *(ATYPE*)TRAPREAD(mem);
SETZERO (ACCUM); SETNEGATIVE (ACCUM);
PC += 3; cycles -= 4+A_IS16BIT; DOBREAK;
case 0x5A: // "PSH Y", 1, 3, // PHY
#ifdef XY_16BIT
PUSHWORD (INDEX_Y);
#else
PUSHBYTE (INDEX_Y);
#endif
PC += 1; cycles -= 3+XY_IS16BIT; DOBREAK;
case 0x5B: // "TAD", 1, 2,
//(*((ATYPE*)®.A)) = ACCUM;
D = ACCUM_16BIT;
SETZERO (D); // Flags are changed
SETNEGATIVE (D);
PC += 1; cycles -= 2; DOBREAK;
case 0x5C: // "JML %L", 4, 4,
PC = OPLONG;
cycles -= 4; DOBREAK;
case 0x5D: // "XOR %w,X", 3, 4,
mem = ABS_INDEX_X;
ACCUM ^= *(ATYPE*)TRAPREAD(mem);
SETZERO (ACCUM); SETNEGATIVE (ACCUM);
PC += 3; cycles -= 4+A_IS16BIT; DOBREAK;
case 0x5E: // "SHR %w,X", 3, 7,
mem = ABS_INDEX_X;
if (*(amem = (ATYPE*)TRAPREAD(mem)) & 1) P |= CARRY;
else P &= ~CARRY;
*amem >>= 1;
TRAPWRITE ((byte*)amem);
SETZERO (*amem);
P &= ~NEGATIVE;
PC += 3; cycles -= 7+A_IS16BIT; DOBREAK;
case 0x5F: // "XOR %L,X", 4, 5,
mem = ABS_LONG_INDEX_X;
ACCUM ^= *(ATYPE*)TRAPREAD(mem);
SETZERO (ACCUM); SETNEGATIVE (ACCUM);
PC += 4; cycles -= 5+A_IS16BIT; DOBREAK;
case 0x60: // "RTS", 1, 6,
_tmp = PC & 0xFFFF0000;
PULLWORD (PC);
PC |= _tmp;
PC++;
cycles -= 6; DOBREAK;
case 0x61: // "ADC (<%b,X)", 2, 6,
SAVE(ACCUM);
mem = DIR_INDEX_INDIR_X;
amem = (ATYPE*)TRAPREAD(mem);
_tmpc = (dword)ACCUM + (P&1) + *amem;
ADCSETCARRY(_tmpc);
ACCUM = _tmpc;
if (P & BCD) BCDADDADJUST (ACCUM);
SETZERO(ACCUM);
SETNEGATIVE(ACCUM); SETOVERFLOW(ACCUM, oldA);
PC += 2; cycles -= 6+A_IS16BIT; DOBREAK;
case 0x62: // "PSH @%w", 3, 6, // PER
PC += 3;
PUSHWORD ((word)PC + OPWORD);
cycles -= 6; DOBREAK;
case 0x63: // "ADC <%b,S", 2, 4,
SAVE(ACCUM);
mem = S_REL;
amem = (ATYPE*)TRAPREAD(mem);
_tmpc = (dword)ACCUM + (P&1) + *amem;
ADCSETCARRY(_tmpc);
ACCUM = _tmpc;
if (P & BCD) BCDADDADJUST (ACCUM);
SETZERO(ACCUM);
SETNEGATIVE(ACCUM); SETOVERFLOW(ACCUM, oldA);
PC += 2; cycles -= 4+A_IS16BIT; DOBREAK;
case 0x64: // "CLR <%b", 2, 3,
*(amem = (ATYPE*)DIR) = 0;
TRAPWRITE ((byte*)amem);
PC += 2; cycles -= 3+A_IS16BIT+A_IS16BIT; DOBREAK;
case 0x65: // "ADC <%b", 2, 3,
SAVE(ACCUM);
mem = DIR;
amem = (ATYPE*)TRAPREAD(mem);
_tmpc = (dword)ACCUM + (P&1) + *amem;
ADCSETCARRY(_tmpc);
ACCUM = _tmpc;
if (P & BCD) BCDADDADJUST (ACCUM);
SETZERO(ACCUM);
SETNEGATIVE(ACCUM); SETOVERFLOW(ACCUM, oldA);
PC += 2; cycles -= 3+A_IS16BIT; DOBREAK;
case 0x66: // "ROR <%b", 2, 5,
amem = (ATYPE*)DIR;
_tmp = *amem & 1;
*amem = (*amem >> 1) | ((P&CARRY) << SIGN_BIT_NUMBER);
TRAPWRITE ((byte*)amem);
SETZERO (*amem);
SETNEGATIVE (*amem);
if (_tmp) P |= CARRY; else P &= ~CARRY;
PC += 2; cycles -= 5+A_IS16BIT; DOBREAK;
case 0x67: // "ADC [<%b]", 2, 6,
SAVE(ACCUM);
mem = DIR_INDIR_LONG;
amem = (ATYPE*)TRAPREAD(mem);
_tmpc = (dword)ACCUM + (P&1) + *amem;
ADCSETCARRY(_tmpc);
ACCUM = _tmpc;
if (P & BCD) BCDADDADJUST (ACCUM);
SETZERO(ACCUM);
SETNEGATIVE(ACCUM); SETOVERFLOW(ACCUM, oldA);
PC += 2; cycles -= 6+A_IS16BIT; DOBREAK;
case 0x68: // "PUL A", 1, 4, // PLA
#ifdef A_16BIT
PULLWORD (ACCUM);
#else
PULLBYTE (ACCUM);
#endif
SETZERO (ACCUM); SETNEGATIVE (ACCUM);
PC += 1; cycles -= 4+A_IS16BIT; DOBREAK;
case 0x69: // "ADC %#", 2, 2,
SAVE(ACCUM);
_tmpc = (dword)ACCUM + (P&1) + IMM_ACCUM;
ADCSETCARRY(_tmpc);
ACCUM = _tmpc;
if (P & BCD) BCDADDADJUST (ACCUM);
SETZERO(ACCUM);
SETNEGATIVE(ACCUM); SETOVERFLOW(ACCUM, oldA);
PC += 2+A_IS16BIT; cycles -= 2+A_IS16BIT; DOBREAK;
case 0x6A: // "ROR A", 1, 2,
_tmp = ACCUM & 1;
ACCUM = (ACCUM >> 1) | ((P&CARRY) << SIGN_BIT_NUMBER);
SETZERO (ACCUM);
SETNEGATIVE (ACCUM);
if (_tmp) P |= CARRY; else P &= ~CARRY;
PC += 1; cycles -= 2; DOBREAK;
case 0x6B: // "RTL", 1, 6,
PULLWORD (PC);
PULLBYTE (_tmp2);
PC |= (_tmp2 << 16);
PC++; // If JSL %L only incs PC by 3, here there must be a final inc.
cycles -= 6; DOBREAK;
case 0x6C: // "JMP (%w)", 3, 5,
PC = (PC & 0xFF0000) | *(word*)ABS_INDIR;
cycles -= 5; DOBREAK;
case 0x6D: // "ADC %w", 3, 4,
SAVE(ACCUM);
mem = ABS;
amem = (ATYPE*)TRAPREAD(mem);
_tmpc = (dword)ACCUM + (P&1) + *amem;
ADCSETCARRY(_tmpc);
ACCUM = _tmpc;
if (P & BCD) BCDADDADJUST (ACCUM);
SETZERO(ACCUM);
SETNEGATIVE(ACCUM); SETOVERFLOW(ACCUM, oldA);
PC += 3; cycles -= 4+A_IS16BIT; DOBREAK;
case 0x6E: // "ROR %w", 3, 6,
amem = (ATYPE*)ABS;
_tmp = *amem & 1;
*amem = (*amem >> 1) | ((P&CARRY) << SIGN_BIT_NUMBER);
TRAPWRITE ((byte*)amem);
SETZERO (*amem);
SETNEGATIVE (*amem);
if (_tmp) P |= CARRY; else P &= ~CARRY;
PC += 3; cycles -= 6+A_IS16BIT; DOBREAK;
case 0x6F: // "ADC %L", 4, 5,
SAVE(ACCUM);
mem = ABS_LONG;
amem = (ATYPE*)TRAPREAD(mem);
_tmpc = (dword)ACCUM + (P&1) + *amem;
ADCSETCARRY(_tmpc);
ACCUM = _tmpc;
if (P & BCD) BCDADDADJUST (ACCUM);
SETZERO(ACCUM);
SETNEGATIVE(ACCUM); SETOVERFLOW(ACCUM, oldA);
PC += 4; cycles -= 5+A_IS16BIT; DOBREAK;
case 0x70: // "BVS @%b", 2, 2,
if (!(P & OVERFLOW)) { // False
PC += 2; cycles -= 2; DOBREAK;
}
PC += 2 + ((signed char) opdata);
cycles -= 3; DOBREAK;
case 0x71: // "ADC (<%b),Y", 2, 5,
SAVE(ACCUM);
mem = DIR_INDIR_INDEX_Y;
amem = (ATYPE*)TRAPREAD(mem);
_tmpc = (dword)ACCUM + (P&1) + *amem;
ADCSETCARRY(_tmpc);
ACCUM = _tmpc;
if (P & BCD) BCDADDADJUST (ACCUM);
SETZERO(ACCUM);
SETNEGATIVE(ACCUM); SETOVERFLOW(ACCUM, oldA);
PC += 2; cycles -= 5+A_IS16BIT; DOBREAK;
case 0x72: // "ADC (<%b)", 2, 5,
SAVE(ACCUM);
mem = DIR_INDIR;
amem = (ATYPE*)TRAPREAD(mem);
_tmpc = (dword)ACCUM + (P&1) + *amem;
ADCSETCARRY(_tmpc);
ACCUM = _tmpc;
if (P & BCD) BCDADDADJUST (ACCUM);
SETZERO(ACCUM);
SETNEGATIVE(ACCUM); SETOVERFLOW(ACCUM, oldA);
PC += 2; cycles -= 5+A_IS16BIT; DOBREAK;
case 0x73: // "ADC (<%b,s),Y", 2, 7,
SAVE(ACCUM);
mem = S_REL_INDIR_INDEX_Y;
amem = (ATYPE*)TRAPREAD(mem);
_tmpc = (dword)ACCUM + (P&1) + *amem;
ADCSETCARRY(_tmpc);
ACCUM = _tmpc;
if (P & BCD) BCDADDADJUST (ACCUM);
SETZERO(ACCUM);
SETNEGATIVE(ACCUM); SETOVERFLOW(ACCUM, oldA);
PC += 2; cycles -= 7+A_IS16BIT; DOBREAK;
case 0x74: // "CLR <%b,X", 2, 4,
*(amem = (ATYPE*)DIR_INDEX_X) = 0;
TRAPWRITE ((byte*)amem);
PC += 2; cycles -= 4+A_IS16BIT; DOBREAK;
case 0x75: // "ADC <%b,X", 2, 4,
SAVE(ACCUM);
mem = DIR_INDEX_X;
amem = (ATYPE*)TRAPREAD(mem);
_tmpc = (dword)ACCUM + (P&1) + *amem;
ADCSETCARRY(_tmpc);
ACCUM = _tmpc;
if (P & BCD) BCDADDADJUST (ACCUM);
SETZERO(ACCUM);
SETNEGATIVE(ACCUM); SETOVERFLOW(ACCUM, oldA);
PC += 2; cycles -= 4+A_IS16BIT; DOBREAK;
case 0x76: // "ROR <%b,X", 2, 6,
amem = (ATYPE*)DIR_INDEX_X;
_tmp = *amem & 1;
*amem = (*amem >> 1) | ((P&CARRY) << SIGN_BIT_NUMBER);
TRAPWRITE ((byte*)amem);
SETZERO (*amem);
SETNEGATIVE (*amem);
if (_tmp) P |= CARRY; else P &= ~CARRY;
PC += 2; cycles -= 6+A_IS16BIT; DOBREAK;
case 0x77: // "ADC [<%b],Y", 2, 6,
SAVE(ACCUM);
mem = DIR_INDIR_LONG_INDEX_Y;
amem = (ATYPE*)TRAPREAD(mem);
_tmpc = (dword)ACCUM + (P&1) + *amem;
ADCSETCARRY(_tmpc);
ACCUM = _tmpc;
if (P & BCD) BCDADDADJUST (ACCUM);
SETZERO(ACCUM);
SETNEGATIVE(ACCUM); SETOVERFLOW(ACCUM, oldA);
PC += 2; cycles -= 6+A_IS16BIT; DOBREAK;
case 0x78: // "SEI", 1, 2,
P |= INT_DISABLE;
PC += 1; cycles -= 2; DOBREAK;
case 0x79: // "ADC %w,Y", 3, 4,
SAVE(ACCUM);
mem = ABS_INDEX_Y;
amem = (ATYPE*)TRAPREAD(mem);
_tmpc = (dword)ACCUM + (P&1) + *amem;
ADCSETCARRY(_tmpc);
ACCUM = _tmpc;
if (P & BCD) BCDADDADJUST (ACCUM);
SETZERO(ACCUM);
SETNEGATIVE(ACCUM); SETOVERFLOW(ACCUM, oldA);
PC += 3; cycles -= 4+A_IS16BIT; DOBREAK;
case 0x7A: // "PUL Y", 1, 4, // PLY
#ifdef XY_16BIT
PULLWORD (INDEX_Y);
#else
PULLBYTE (INDEX_Y);
#endif
SETZERO (INDEX_Y); SETNEGATIVEXY (INDEX_Y);
PC += 1; cycles -= 4+XY_IS16BIT; DOBREAK;
case 0x7B: // "TDA", 1, 2,
/*ACCUM = (ATYPE)*/ (ACCUM_16BIT = D);
SETZERO (ACCUM); // Flags are changed
SETNEGATIVE (ACCUM);
PC += 1; cycles -= 2; DOBREAK;
case 0x7C: // "JMP (%w,X)", 3, 6,
PC = ABS_INDEX_INDIR_X_JMP;
cycles -= 6; DOBREAK;
case 0x7D: // "ADC %w,X", 3,4,
SAVE(ACCUM);
mem = ABS_INDEX_X;
amem = (ATYPE*)TRAPREAD(mem);
_tmpc = (dword)ACCUM + (P&1) + *amem;
ADCSETCARRY(_tmpc);
ACCUM = _tmpc;
if (P & BCD) BCDADDADJUST (ACCUM);
SETZERO(ACCUM);
SETNEGATIVE(ACCUM); SETOVERFLOW(ACCUM, oldA);
PC += 3; cycles -= 4+A_IS16BIT; DOBREAK;
case 0x7E: // "ROR %w,X", 3,7,
amem = (ATYPE*)ABS_INDEX_X;
_tmp = *amem & 1;
*amem = (*amem >> 1) | ((P&CARRY) << SIGN_BIT_NUMBER);
TRAPWRITE ((byte*)amem);
SETZERO (*amem);
SETNEGATIVE (*amem);
if (_tmp) P |= CARRY; else P &= ~CARRY;
PC += 3; cycles -= 7+A_IS16BIT; DOBREAK;
case 0x7F: // "ADC %L,X",4,5,
SAVE(ACCUM);
mem = ABS_LONG_INDEX_X;
amem = (ATYPE*)TRAPREAD(mem);
_tmpc = (dword)ACCUM + (P&1) + *amem;
ADCSETCARRY(_tmpc);
ACCUM = _tmpc;
if (P & BCD) BCDADDADJUST (ACCUM);
SETZERO(ACCUM);
SETNEGATIVE(ACCUM); SETOVERFLOW(ACCUM, oldA);
PC += 4; cycles -= 5+A_IS16BIT; DOBREAK;
case 0x80: // "BRA @%b", 2, 2,
PC += 2 + ((signed char) opdata);
cycles -= 2; DOBREAK;
case 0x81: // "STA (<%b,X)", 2, 6,
*(ATYPE*)(mem = DIR_INDEX_INDIR_X) = ACCUM;
TRAPWRITE (mem);
PC += 2; cycles -= 6+A_IS16BIT; DOBREAK;
case 0x82: // "BRL @%w", 3, 3,
_tmp = PC & 0xFF0000;
PC = ((PC + 3 + (signed short) OPWORD) & 0xFFFF) | _tmp;
cycles -= 3; DOBREAK;
case 0x83: // "STA <%b,S", 2, 4,
*(ATYPE*)(mem = S_REL) = ACCUM;
TRAPWRITE (mem);
PC += 2; cycles -= 4+A_IS16BIT; DOBREAK;
case 0x84: // "STY <%b", 2, 3,
*(XYTYPE*)(mem = DIR) = INDEX_Y;
#undef ISWORDOP
#define ISWORDOP XY_IS16BIT
TRAPWRITE (mem);
#undef ISWORDOP
#define ISWORDOP A_IS16BIT
PC += 2; cycles -= 3+XY_IS16BIT; DOBREAK;
case 0x85: // "STA <%b", 2, 3,
*(ATYPE*)(mem = DIR) = ACCUM;
TRAPWRITE (mem);
PC += 2; cycles -= 3+A_IS16BIT; DOBREAK;
case 0x86: // "STX <%b", 2, 3,
*(XYTYPE*)(mem = DIR) = INDEX_X;
#undef ISWORDOP
#define ISWORDOP XY_IS16BIT
TRAPWRITE (mem);
#undef ISWORDOP
#define ISWORDOP A_IS16BIT
PC += 2; cycles -= 3+XY_IS16BIT; DOBREAK;
case 0x87: // "STA [<%b]", 2, 6,
*(ATYPE*)(mem = DIR_INDIR_LONG) = ACCUM;
TRAPWRITE (mem);
PC += 2; cycles -= 6+A_IS16BIT; DOBREAK;
case 0x88: // "DEY", 1, 2,
INDEX_Y--;
SETZERO (INDEX_Y); SETNEGATIVEXY (INDEX_Y);
PC += 1; cycles -= 2; DOBREAK;
case 0x89: // "BIT %#", 2, 2,
if (ACCUM & IMM_ACCUM)
P &= ~ZERO; else P |= ZERO;
PC += 2+A_IS16BIT; cycles -= 2+A_IS16BIT; DOBREAK;
case 0x8A: // "TXA", 1, 2,
//(*((XYTYPE*)®.X)) = INDEX_X;
ACCUM = (ATYPE)INDEX_X_16BIT;
//ACCUM = (ATYPE)INDEX_X;
SETZERO (ACCUM); // Flags are changed
SETNEGATIVE (ACCUM);
PC += 1; cycles -= 2; DOBREAK;
case 0x8B: // "PSH DBR", 1, 3, // PHB
PUSHBYTE (DBR);
PC += 1; cycles -= 3; DOBREAK;
case 0x8C: // "STY %w", 3, 4,
*(XYTYPE*)(mem = ABS) = INDEX_Y;
#undef ISWORDOP
#define ISWORDOP XY_IS16BIT
TRAPWRITE (mem);
#undef ISWORDOP
#define ISWORDOP A_IS16BIT
PC += 3; cycles -= 4+XY_IS16BIT; DOBREAK;
case 0x8D: // "STA %w", 3, 4,
*(ATYPE*)(mem = ABS) = ACCUM;
TRAPWRITE (mem);
PC += 3; cycles -= 4+A_IS16BIT; DOBREAK;
case 0x8E: // "STX %w", 3, 4,
*(XYTYPE*)(mem = ABS) = INDEX_X;
#undef ISWORDOP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -