📄 65816emu.cpp
字号:
#define ISWORDOP XY_IS16BIT
TRAPWRITE (mem);
#undef ISWORDOP
#define ISWORDOP A_IS16BIT
PC += 3; cycles -= 4+XY_IS16BIT; DOBREAK;
case 0x8F: // "STA %L", 4, 5,
*(ATYPE*)(mem = ABS_LONG) = ACCUM;
TRAPWRITE (mem);
PC += 4; cycles -= 5+A_IS16BIT; DOBREAK;
case 0x90: // "BCC @%b", 2, 2,
if (P & CARRY) { // False
PC += 2; cycles -= 2; DOBREAK;
}
PC += 2 + ((signed char) opdata);
cycles -= 3; DOBREAK;
case 0x91: // "STA (<%b),Y", 2, 6,
*(ATYPE*)(mem = DIR_INDIR_INDEX_Y) = ACCUM;
TRAPWRITE (mem);
PC += 2; cycles -= 6+A_IS16BIT; DOBREAK;
case 0x92: // "STA (<%b)", 2, 5,
*(ATYPE*)(mem = DIR_INDIR) = ACCUM;
TRAPWRITE (mem);
PC += 2; cycles -= 5+A_IS16BIT; DOBREAK;
case 0x93: // "STA (<%b,S),Y", 2, 7,
*(ATYPE*)(mem = S_REL_INDIR_INDEX_Y) = ACCUM;
TRAPWRITE (mem);
PC += 2; cycles -= 7+A_IS16BIT; DOBREAK;
case 0x94: // "STY <%b,X", 2, 4,
*(XYTYPE*)(mem = DIR_INDEX_X) = INDEX_Y;
#undef ISWORDOP
#define ISWORDOP XY_IS16BIT
TRAPWRITE (mem);
#undef ISWORDOP
#define ISWORDOP A_IS16BIT
PC += 2; cycles -= 4+XY_IS16BIT; DOBREAK;
case 0x95: // "STA <%b,X", 2, 4,
*(ATYPE*)(mem = DIR_INDEX_X) = ACCUM;
TRAPWRITE (mem);
PC += 2; cycles -= 4+A_IS16BIT; DOBREAK;
case 0x96: // "STX <%b,Y", 2, 4,
*(XYTYPE*)(mem = DIR_INDEX_Y) = INDEX_X;
#undef ISWORDOP
#define ISWORDOP XY_IS16BIT
TRAPWRITE (mem);
#undef ISWORDOP
#define ISWORDOP A_IS16BIT
PC += 2; cycles -= 4+XY_IS16BIT; DOBREAK;
case 0x97: // "STA [<%b],Y", 2, 6,
*(ATYPE*)(mem = DIR_INDIR_LONG_INDEX_Y) = ACCUM;
TRAPWRITE (mem);
PC += 2; cycles -= 6+A_IS16BIT; DOBREAK;
case 0x98: // "TYA", 1, 2,
//(*((XYTYPE*)®.Y)) = INDEX_Y;
ACCUM = (ATYPE)INDEX_Y_16BIT;
//ACCUM = (ATYPE)INDEX_Y;
SETZERO (ACCUM); // Flags are changed
SETNEGATIVE (ACCUM);
PC += 1; cycles -= 2; DOBREAK;
case 0x99: // "STA %w,Y", 3, 5,
*(ATYPE*)(mem = ABS_INDEX_Y) = ACCUM;
TRAPWRITE (mem);
PC += 3; cycles -= 5+A_IS16BIT; DOBREAK;
case 0x9A: // "TXS", 1, 2,
S = INDEX_X_16BIT;
// Has no effect on flags
PC += 1; cycles -= 2; DOBREAK;
case 0x9B: // "TXY", 1, 2,
INDEX_Y = INDEX_X;
SETZERO (INDEX_Y); // Flags are changed
SETNEGATIVEXY (INDEX_Y);
PC += 1; cycles -= 2; DOBREAK;
case 0x9C: // "CLR %w", 3, 4,
*(ATYPE*)(mem = ABS) = 0;
TRAPWRITE (mem);
PC += 3; cycles -= 4+A_IS16BIT; DOBREAK;
case 0x9D: // "STA %w,X", 3, 5,
*(ATYPE*)(mem = ABS_INDEX_X) = ACCUM;
TRAPWRITE (mem);
PC += 3; cycles -= 5+A_IS16BIT; DOBREAK;
case 0x9E: // "CLR %w,X", 3, 5,
*(ATYPE*)(mem = ABS_INDEX_X) = 0;
TRAPWRITE (mem);
PC += 3; cycles -= 5+A_IS16BIT; DOBREAK;
case 0x9F: // "STA %L,X", 4, 5,
*(ATYPE*)(mem = ABS_LONG_INDEX_X) = ACCUM;
TRAPWRITE (mem);
PC += 4; cycles -= 5+A_IS16BIT; DOBREAK;
case 0xA0: // "LDY %#i", 2, 2,
INDEX_Y = IMM_INDEX;
SETZERO (INDEX_Y); SETNEGATIVEXY (INDEX_Y);
PC += 2+XY_IS16BIT; cycles -= 2+XY_IS16BIT; DOBREAK;
case 0xA1: // "LDA (<%b,X)", 2, 6,
mem = DIR_INDEX_INDIR_X;
ACCUM = *(ATYPE*)TRAPREAD(mem);
SETZERO (ACCUM); SETNEGATIVE (ACCUM);
PC += 2; cycles -= 6+A_IS16BIT; DOBREAK;
case 0xA2: // "LDX %#i", 2, 2,
INDEX_X = IMM_INDEX;
SETZERO (INDEX_X); SETNEGATIVEXY (INDEX_X);
PC += 2+XY_IS16BIT; cycles -= 2+XY_IS16BIT; DOBREAK;
case 0xA3: // "LDA <%b,S", 2, 4,
mem = S_REL;
ACCUM = *(ATYPE*)TRAPREAD(mem);
SETZERO (ACCUM); SETNEGATIVE (ACCUM);
PC += 2; cycles -= 4+A_IS16BIT; DOBREAK;
case 0xA4: // "LDY <%b", 2, 3,
mem = DIR;
INDEX_Y = *(XYTYPE*)TRAPREAD(mem);
SETZERO (INDEX_Y); SETNEGATIVEXY (INDEX_Y);
PC += 2; cycles -= 3+XY_IS16BIT; DOBREAK;
case 0xA5: // "LDA <%b", 2, 3,
mem = DIR;
ACCUM = *(ATYPE*)TRAPREAD(mem);
SETZERO (ACCUM); SETNEGATIVE (ACCUM);
PC += 2; cycles -= 3+A_IS16BIT; DOBREAK;
case 0xA6: // "LDX <%b", 2, 3,
mem = DIR;
INDEX_X = *(XYTYPE*)TRAPREAD(mem);
SETZERO (INDEX_X); SETNEGATIVEXY (INDEX_X);
PC += 2; cycles -= 3+XY_IS16BIT; DOBREAK;
case 0xA7: // "LDA [<%b]", 2, 6,
mem = DIR_INDIR_LONG;
ACCUM = *(ATYPE*)TRAPREAD(mem);
SETZERO (ACCUM); SETNEGATIVE (ACCUM);
PC += 2; cycles -= 6+A_IS16BIT; DOBREAK;
case 0xA8: // "TAY", 1, 2,
//(*((ATYPE*)®.A)) = ACCUM;
INDEX_Y = (XYTYPE)ACCUM_16BIT;
//INDEX_Y = (XYTYPE)ACCUM;
SETZERO (INDEX_Y); // Flags are changed
SETNEGATIVEXY (INDEX_Y);
PC += 1; cycles -= 2; DOBREAK;
case 0xA9: // "LDA %#", 2, 2,
ACCUM = IMM_ACCUM;
SETZERO (ACCUM);
/*debug0 ("LDA # - P=%X after setzero", P);
if ((ACCUM) & SIGN_BIT)
P |= NEGATIVE;
else
P &= ~NEGATIVE;
//(((ACCUM) & SIGN_BIT) ? : );
debug0 ("(byte)0xB5 & ~NEGATIVE = %X NEGATIVE=%X, ~=%X", (byte)0xB5 & ~NEGATIVE, NEGATIVE, ~(byte)NEGATIVE);*/
SETNEGATIVE (ACCUM);
PC += 2+A_IS16BIT; cycles -= 2+A_IS16BIT; DOBREAK;
case 0xAA: // "TAX", 1, 2,
//(*((ATYPE*)®.A)) = ACCUM;
INDEX_X = (XYTYPE)ACCUM_16BIT;
//INDEX_X = (XYTYPE)ACCUM;
SETZERO (INDEX_X); // Flags are changed
SETNEGATIVEXY (INDEX_X);
PC += 1; cycles -= 2; DOBREAK;
case 0xAB: // "PUL DBR", 1, 4, // PLB
PULLBYTE (DBR);
SETZERO (DBR);
if (DBR & 0x80) P |= NEGATIVE;
else P &= ~NEGATIVE;
PC += 1; cycles -= 4; DOBREAK;
case 0xAC: // "LDY %w", 3, 4,
mem = ABS;
INDEX_Y = *(XYTYPE*)TRAPREAD(mem);
SETZERO (INDEX_Y); SETNEGATIVEXY (INDEX_Y);
PC += 3; cycles -= 4+XY_IS16BIT; DOBREAK;
case 0xAD: // "LDA %w", 3, 4,
mem = ABS;
ACCUM = *(ATYPE*)TRAPREAD(mem);
SETZERO (ACCUM); SETNEGATIVE (ACCUM);
PC += 3; cycles -= 4+A_IS16BIT; DOBREAK;
case 0xAE: // "LDX %w", 3, 4,
mem = ABS;
INDEX_X = *(XYTYPE*)TRAPREAD(mem);
SETZERO (INDEX_X); SETNEGATIVEXY (INDEX_X);
PC += 3; cycles -= 4+XY_IS16BIT; DOBREAK;
case 0xAF: // "LDA %L", 4, 5,
mem = ABS_LONG;
ACCUM = *(ATYPE*)TRAPREAD(mem);
SETZERO (ACCUM); SETNEGATIVE (ACCUM);
PC += 4; cycles -= 5+A_IS16BIT; DOBREAK;
case 0xB0: // "BCS @%b", 2, 2,
if (!(P & CARRY)) { // False
PC += 2; cycles -= 2; DOBREAK;
}
PC += 2 + ((signed char) opdata);
cycles -= 3; DOBREAK;
case 0xB1: // "LDA (<%b),Y", 2, 5,
mem = DIR_INDIR_INDEX_Y;
ACCUM = *(ATYPE*)TRAPREAD(mem);
SETZERO (ACCUM); SETNEGATIVE (ACCUM);
PC += 2; cycles -= 5+A_IS16BIT; DOBREAK;
case 0xB2: // "LDA (<%b)", 2, 5,
mem = DIR_INDIR;
ACCUM = *(ATYPE*)TRAPREAD(mem);
SETZERO (ACCUM); SETNEGATIVE (ACCUM);
PC += 2; cycles -= 5+A_IS16BIT; DOBREAK;
case 0xB3: // "LDA (<%b,S),Y", 2, 7,
mem = S_REL_INDIR_INDEX_Y;
ACCUM = *(ATYPE*)TRAPREAD(mem);
SETZERO (ACCUM); SETNEGATIVE (ACCUM);
PC += 2; cycles -= 7+A_IS16BIT; DOBREAK;
case 0xB4: // "LDY <%b,X", 2, 4,
mem = DIR_INDEX_X;
INDEX_Y = *(XYTYPE*)TRAPREAD(mem);
SETZERO (INDEX_Y); SETNEGATIVEXY (INDEX_Y);
PC += 2; cycles -= 4+XY_IS16BIT; DOBREAK;
case 0xB5: // "LDA <%b,X", 2, 4,
mem = DIR_INDEX_X;
ACCUM = *(ATYPE*)TRAPREAD(mem);
SETZERO (ACCUM); SETNEGATIVE (ACCUM);
PC += 2; cycles -= 4+A_IS16BIT; DOBREAK;
case 0xB6: // "LDX <%b,Y", 2, 4,
mem = DIR_INDEX_Y;
INDEX_X = *(XYTYPE*)TRAPREAD(mem);
SETZERO (INDEX_X); SETNEGATIVEXY (INDEX_X);
PC += 2; cycles -= 4+XY_IS16BIT; DOBREAK;
case 0xB7: // "LDA [<%b],Y", 2, 6,
mem = DIR_INDIR_LONG_INDEX_Y;
ACCUM = *(ATYPE*)TRAPREAD(mem);
SETZERO (ACCUM); SETNEGATIVE (ACCUM);
PC += 2; cycles -= 6+A_IS16BIT;
DOBREAK;
case 0xB8: // "CLV", 1, 2,
P &= ~OVERFLOW;
PC += 1; cycles -= 2; DOBREAK;
case 0xB9: // "LDA %w,Y", 3, 4,
mem = ABS_INDEX_Y;
ACCUM = *(ATYPE*)TRAPREAD(mem);
SETZERO (ACCUM); SETNEGATIVE (ACCUM);
PC += 3; cycles -= 4+A_IS16BIT; DOBREAK;
case 0xBA: // "TSX", 1, 2,
INDEX_X = (XYTYPE) *(XYTYPE*)&S;
SETZERO (INDEX_X); // Flags are changed
SETNEGATIVEXY (INDEX_X);
PC += 1; cycles -= 2; DOBREAK;
case 0xBB: // "TYX", 1, 2,
INDEX_X = INDEX_Y;
SETZERO (INDEX_X); // Flags are changed
SETNEGATIVE (INDEX_X);
PC += 1; cycles -= 2; DOBREAK;
case 0xBC: // "LDY %w,X", 3, 4,
mem = ABS_INDEX_X;
INDEX_Y = *(XYTYPE*)TRAPREAD(mem);
SETZERO (INDEX_Y); SETNEGATIVEXY (INDEX_Y);
PC += 3; cycles -= 4+XY_IS16BIT; DOBREAK;
case 0xBD: // "LDA %w,X", 3, 4,
mem = ABS_INDEX_X;
ACCUM = *(ATYPE*)TRAPREAD(mem);
SETZERO (ACCUM); SETNEGATIVE (ACCUM);
PC += 3; cycles -= 4+A_IS16BIT; DOBREAK;
case 0xBE: // "LDX %w,Y", 3, 4,
mem = ABS_INDEX_Y;
INDEX_X = *(XYTYPE*)TRAPREAD(mem);
SETZERO (INDEX_X); SETNEGATIVEXY (INDEX_X);
PC += 3; cycles -= 4+XY_IS16BIT; DOBREAK;
case 0xBF: // "LDA %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 0xC0: // "CPY %#i", 2, 2,
oldXY = INDEX_Y - IMM_INDEX;
SETNEGATIVEXY (oldXY); SETZERO (oldXY);
if (oldXY > INDEX_Y)
P &= ~CARRY; else P |= CARRY;
PC += 2+XY_IS16BIT; cycles -= 2+XY_IS16BIT; DOBREAK;
case 0xC1: // "CMP (<%b,X)", 2, 6,
mem = DIR_INDEX_INDIR_X;
oldA = ACCUM - *(ATYPE*)TRAPREAD(mem);
SETNEGATIVE (oldA); SETZERO (oldA);
if (oldA > ACCUM)
P &= ~CARRY; else P |= CARRY;
PC += 2; cycles -= 6+A_IS16BIT; DOBREAK;
case 0xC2: // "CLP %#b", 2, 3,
PC += 2; cycles -= 3;
if (((P & ~IMM_BYTE) & (MEMORY | INDEX)) != (P & (MEMORY | INDEX))) { // Change
P &= ~IMM_BYTE;
goto saveregs_andexit;
}
P &= ~IMM_BYTE;
DOBREAK;
case 0xC3: // "CMP <%b,S", 2, 4,
mem = S_REL;
oldA = ACCUM - *(ATYPE*)TRAPREAD(mem);
SETNEGATIVE (oldA); SETZERO (oldA);
if (oldA > ACCUM)
P &= ~CARRY; else P |= CARRY;
PC += 2; cycles -= 4+A_IS16BIT; DOBREAK;
case 0xC4: // "CPY <%b", 2, 3,
mem = DIR;
oldXY = INDEX_Y - *(XYTYPE*)TRAPREAD(mem);
SETNEGATIVEXY (oldXY); SETZERO (oldXY);
if (oldXY > INDEX_Y)
P &= ~CARRY; else P |= CARRY;
PC += 2; cycles -= 3+XY_IS16BIT; DOBREAK;
case 0xC5: // "CMP <%b", 2, 3,
mem = DIR;
oldA = ACCUM - *(ATYPE*)TRAPREAD(mem);
SETNEGATIVE (oldA); SETZERO (oldA);
if (oldA > ACCUM)
P &= ~CARRY; else P |= CARRY;
PC += 2; cycles -= 3+A_IS16BIT; DOBREAK;
case 0xC6: // "DEC <%b", 2, 5,
mem = DIR;
(*(amem = (ATYPE*)TRAPREAD(mem)))--;
SETZERO (*amem); SETNEGATIVE (*amem);
PC += 2; cycles -= 5+A_IS16BIT; DOBREAK;
case 0xC7: // "CMP [<%b]", 2,6,
mem = DIR_INDIR_LONG;
oldA = ACCUM - *(ATYPE*)TRAPREAD(mem);
SETNEGATIVE (oldA); SETZERO (oldA);
if (oldA > ACCUM)
P &= ~CARRY; else P |= CARRY;
PC += 2; cycles -= 6+A_IS16BIT; DOBREAK;
case 0xC8: // "INY", 1, 2,
INDEX_Y++;
SETZERO (INDEX_Y); SETNEGATIVEXY (INDEX_Y);
PC += 1; cycles -= 2; DOBREAK;
case 0xC9: // "CMP %#", 2, 2,
oldA = ACCUM - IMM_ACCUM;
SETNEGATIVE (oldA); SETZERO (oldA);
if (oldA > ACCUM)
P &= ~CARRY; else P |= CARRY;
PC += 2+A_IS16BIT; cycles -= 2+A_IS16BIT; DOBREAK;
case 0xCA: // "DEX", 1, 2,
INDEX_X--;
SETZERO (INDEX_X); SETNEGATIVEXY (INDEX_X);
PC += 1; cycles -= 2; DOBREAK;
case 0xCB: // "WAI", 1, 3,
if (state.end_wai && state.within_wai) {
PC += 1;
state.end_wai = false;
state.within_wai = false;
} else {
state.within_wai = true;
state.end_wai = false;
}
cycles = -3; DOBREAK;
case 0xCC: // "CPY %w", 3, 4,
mem = ABS;
oldXY = INDEX_Y - *(XYTYPE*)TRAPREAD(mem);
SETNEGATIVEXY (oldXY); SETZERO (oldXY);
if (oldXY > INDEX_Y)
P &= ~CARRY; else P |= CARRY;
PC += 3; cycles -= 4+XY_IS16BIT; DOBREAK;
case 0xCD: // "CMP %w", 3, 4,
mem = ABS;
oldA = ACCUM - *(ATYPE*)TRAPREAD(mem);
SETNEGATIVE (oldA); SETZERO (oldA);
if (oldA > ACCUM)
P &= ~CARRY; else P |= CARRY;
PC += 3; cycles -= 4+A_IS16BIT; DOBREAK;
case 0xCE: // "DEC %w", 3, 6,
mem = ABS;
(*(amem = (ATYPE*)TRAPREAD(mem)))--;
SETZERO (*amem); SETNEGATIVE (*amem);
PC += 3; cycles -= 6+A_IS16BIT; DOBREAK;
case 0xCF: // "CMP %L", 4, 5,
mem = ABS_LONG;
oldA = ACCUM - *(ATYPE*)TRAPREAD(mem);
SETNEGATIVE (oldA); SETZERO (oldA);
if (oldA > ACCUM)
P &= ~CARRY; else P |= CARRY;
PC += 4; cycles -= 5+A_IS16BIT; DOBREAK;
case 0xD0: // "BNE @%b", 2, 2,
if (P & ZERO) { // False
PC += 2; cycles -= 2; DOBREAK;
}
PC += 2 + ((signed char) opdata);
cycles -= 3; DOBREAK;
case 0xD1: // "CMP (<%b),Y", 2, 5,
mem = DIR_INDIR_INDEX_Y;
oldA = ACCUM - *(ATYPE*)TRAPREAD(mem);
SETNEGATIVE (oldA); SETZERO (oldA);
if (oldA > ACCUM)
P &= ~CARRY; else P |= CARRY;
PC += 2; cycles -= 5+A_IS16BIT; DOBREAK;
case 0xD2: // "CMP (<%b)", 2, 5,
mem = DIR_INDIR;
oldA = ACCUM - *(ATYPE*)TRAPREAD(mem);
SETNEGATIVE (oldA); SETZERO (oldA);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -