📄 nes6502.c
字号:
{ \
RELATIVE_BRANCH(n_flag & N_FLAG); \
}
#define BNE() \
{ \
RELATIVE_BRANCH(0 != z_flag); \
}
#define BPL() \
{ \
RELATIVE_BRANCH(0 == (n_flag & N_FLAG)); \
}
/* Software interrupt type thang */
#define BRK() \
{ \
PTR_TO_PC(); \
PC++; \
PUSH(PC >> 8); \
PUSH(PC & 0xFF); \
b_flag = B_FLAG; \
PUSH(COMBINE_FLAGS()); \
i_flag = I_FLAG; \
JUMP(IRQ_VECTOR); \
ADD_CYCLES(7); \
}
#define BVC() \
{ \
RELATIVE_BRANCH(0 == v_flag); \
}
#define BVS() \
{ \
RELATIVE_BRANCH(0 != v_flag); \
}
#define CLC() \
{ \
c_flag = 0; \
ADD_CYCLES(2); \
}
#define CLD() \
{ \
/* d_flag = 0;*/ \
ADD_CYCLES(2); \
}
#define CLI() \
{ \
i_flag = 0; \
ADD_CYCLES(2); \
if (cpu.int_pending && (remaining_cycles > 0)) \
{ \
IRQ(); \
cpu.int_pending = 0; \
} \
}
#define CLV() \
{ \
v_flag = 0; \
ADD_CYCLES(2); \
}
#define _COMPARE(reg, value) \
{ \
temp = (reg) - (value); \
/* C is clear when data > A */ \
c_flag = (0 == (temp & 0x100)); \
SET_NZ_FLAGS((uint8) temp); \
}
#define CMP(cycles, read_func) \
{ \
read_func(data); \
_COMPARE(A, data); \
ADD_CYCLES(cycles); \
}
#define CPX(cycles, read_func) \
{ \
read_func(data); \
_COMPARE(X, data); \
ADD_CYCLES(cycles); \
}
#define CPY(cycles, read_func) \
{ \
read_func(data); \
_COMPARE(Y, data); \
ADD_CYCLES(cycles); \
}
/* undocumented */
#define DCP(cycles, read_func, write_func, addr) \
{ \
read_func(addr, data); \
data--; \
write_func(addr, data); \
CMP(cycles, EMPTY_READ); \
}
#define DEC(cycles, read_func, write_func, addr) \
{ \
read_func(addr, data); \
data--; \
write_func(addr, data); \
SET_NZ_FLAGS(data); \
ADD_CYCLES(cycles); \
}
#define DEX() \
{ \
/* X--; */\
X = (uint8)(X - 1); \
SET_NZ_FLAGS(X); \
ADD_CYCLES(2); \
}
#define DEY() \
{ \
/* Y--; */\
Y = (uint8)(Y - 1); \
SET_NZ_FLAGS(Y); \
ADD_CYCLES(2); \
}
/* undocumented (double-NOP) */
#define DOP(cycles) \
{ \
PC++; \
ADD_CYCLES(cycles); \
}
#define EOR(cycles, read_func) \
{ \
read_func(data); \
A ^= data; \
SET_NZ_FLAGS(A); \
ADD_CYCLES(cycles); \
}
#define INC(cycles, read_func, write_func, addr) \
{ \
read_func(addr, data); \
data++; \
write_func(addr, data); \
SET_NZ_FLAGS(data); \
ADD_CYCLES(cycles); \
}
#define INX() \
{ \
/* X++; */\
X = (uint8)(X + 1); \
SET_NZ_FLAGS(X); \
ADD_CYCLES(2); \
}
#define INY() \
{ \
/* Y++; */\
Y = (uint8)(Y + 1); \
SET_NZ_FLAGS(Y); \
ADD_CYCLES(2); \
}
/* undocumented */
#define ISB(cycles, read_func, write_func, addr) \
{ \
read_func(addr, data); \
data++; \
write_func(addr, data); \
SBC(cycles, EMPTY_READ); \
}
#ifdef NES6502_TESTOPS
#define JAM() \
{ \
cpu_Jam(); \
}
#else /* !NES6502_TESTOPS */
#define JAM() \
{ \
PC--; \
cpu.jammed = TRUE; \
cpu.int_pending = 0; \
ADD_CYCLES(2); \
}
#endif /* !NES6502_TESTOPS */
#define JMP_INDIRECT() \
{ \
/* temp = bank_readword(PC); */\
temp = *(uint8 *)PC + ((*(uint8 *)(PC+1)) << 8); \
/* bug in crossing page boundaries */ \
if (0xFF == (temp & 0xFF)) {\
PC = (bank_readbyte(temp & 0xFF00) << 8) | bank_readbyte(temp); \
PC_TO_PTR(); \
} \
else \
JUMP(temp); \
ADD_CYCLES(5); \
}
#define JMP_ABSOLUTE() \
{ \
/* JUMP(PC); */\
PC = *(uint8 *)PC + ((*(uint8 *)(PC+1)) << 8); \
PC_TO_PTR(); \
ADD_CYCLES(3); \
}
#define JSR() \
{ \
PTR_TO_PC(); \
PC++; \
PUSH(PC >> 8); \
PUSH(PC & 0xFF); \
ADD_CYCLES(6); \
JUMP(PC - 1); \
}
/* undocumented */
#define LAS(cycles, read_func) \
{ \
read_func(data); \
A = X = S = (S & data); \
SET_NZ_FLAGS(A); \
ADD_CYCLES(cycles); \
}
/* undocumented */
#define LAX(cycles, read_func) \
{ \
read_func(A); \
X = A; \
SET_NZ_FLAGS(A); \
ADD_CYCLES(cycles); \
}
#define LDA(cycles, read_func) \
{ \
read_func(A); \
SET_NZ_FLAGS(A); \
ADD_CYCLES(cycles); \
}
#define LDX(cycles, read_func) \
{ \
read_func(X); \
SET_NZ_FLAGS(X);\
ADD_CYCLES(cycles); \
}
#define LDY(cycles, read_func) \
{ \
read_func(Y); \
SET_NZ_FLAGS(Y);\
ADD_CYCLES(cycles); \
}
#define LSR(cycles, read_func, write_func, addr) \
{ \
read_func(addr, data); \
c_flag = data & 0x01; \
data >>= 1; \
write_func(addr, data); \
SET_NZ_FLAGS(data); \
ADD_CYCLES(cycles); \
}
#define LSR_A() \
{ \
c_flag = A & 0x01; \
A >>= 1; \
SET_NZ_FLAGS(A); \
ADD_CYCLES(2); \
}
/* undocumented */
#define LXA(cycles, read_func) \
{ \
read_func(data); \
A = X = ((A | 0xEE) & data); \
SET_NZ_FLAGS(A); \
ADD_CYCLES(cycles); \
}
#define NOP() \
{ \
ADD_CYCLES(2); \
}
#define ORA(cycles, read_func) \
{ \
read_func(data); \
A |= data; \
SET_NZ_FLAGS(A);\
ADD_CYCLES(cycles); \
}
#define PHA() \
{ \
PUSH(A); \
ADD_CYCLES(3); \
}
#define PHP() \
{ \
/* B flag is pushed on stack as well */ \
PUSH(COMBINE_FLAGS() | B_FLAG); \
ADD_CYCLES(3); \
}
#define PLA() \
{ \
A = PULL(); \
SET_NZ_FLAGS(A); \
ADD_CYCLES(4); \
}
#define PLP() \
{ \
btemp = PULL(); \
SCATTER_FLAGS(btemp); \
ADD_CYCLES(4); \
}
/* undocumented */
#define RLA(cycles, read_func, write_func, addr) \
{ \
read_func(addr, data); \
temp = c_flag; \
c_flag = data >> 7; \
data = (data << 1) | temp; \
write_func(addr, data); \
A &= data; \
SET_NZ_FLAGS(A); \
ADD_CYCLES(cycles); \
}
/* 9-bit rotation (carry flag used for rollover) */
#define ROL(cycles, read_func, write_func, addr) \
{ \
read_func(addr, data); \
temp = c_flag; \
c_flag = data >> 7; \
data = (data << 1) | temp; \
write_func(addr, data); \
SET_NZ_FLAGS(data); \
ADD_CYCLES(cycles); \
}
#define ROL_A() \
{ \
temp = c_flag; \
c_flag = A >> 7; \
/* A = (A << 1) | temp; */\
A = (uint8)((A << 1) | temp); \
SET_NZ_FLAGS(A); \
ADD_CYCLES(2); \
}
#define ROR(cycles, read_func, write_func, addr) \
{ \
read_func(addr, data); \
if (c_flag) \
{ \
c_flag = data & 1; \
data = (data >> 1) | 0x80; \
} \
else \
{ \
c_flag = data & 1; \
data >>= 1; \
} \
write_func(addr, data); \
SET_NZ_FLAGS(data); \
ADD_CYCLES(cycles); \
}
#define ROR_A() \
{ \
if (c_flag) \
{ \
c_flag = A & 1; \
A = (A >> 1) | 0x80; \
} \
else \
{ \
c_flag = A & 1; \
A >>= 1; \
} \
SET_NZ_FLAGS(A); \
ADD_CYCLES(2); \
}
/* undocumented */
#define RRA(cycles, read_func, write_func, addr) \
{ \
read_func(addr, data); \
if (c_flag) \
{ \
c_flag = data & 1; \
data = (data >> 1) | 0x80; \
} \
else \
{ \
c_flag = data & 1; \
data >>= 1; \
} \
write_func(addr, data); \
ADC(cycles, EMPTY_READ); \
}
#define RTI() \
{ \
btemp = PULL(); \
SCATTER_FLAGS(btemp); \
PC = PULL(); \
PC |= PULL() << 8; \
PC_TO_PTR(); \
ADD_CYCLES(6); \
if (0 == i_flag && cpu.int_pending && (remaining_cycles > 0)) \
{ \
cpu.int_pending = 0; \
IRQ(); \
} \
}
#define RTS() \
{ \
PC = PULL(); \
PC = (PC | (PULL() << 8)) + 1; \
ADD_CYCLES(6); \
PC_TO_PTR(); \
}
/* undocumented */
#define SAX(cycles, read_func, write_func, addr) \
{ \
read_func(addr); \
data = A & X; \
write_func(addr, data); \
ADD_CYCLES(cycles); \
}
/* Warning! NES CPU has no decimal mode, so by default this does no BCD! */
#ifdef NES6502_DECIMAL
#define SBC(cycles, read_func) \
{ \
read_func(data); \
temp = A - data - (c_flag ? 0 : 1); \
if (d_flag) \
{ \
uint8 al, ah; \
al = (A & 0x0F) - (data & 0x0F) - (c_flag ? 0 : 1); \
ah = (A >> 4) - (data >> 4); \
if (al & 0x10) \
{ \
al -= 6; \
ah--; \
} \
if (ah & 0x10) \
ah -= 6; \
c_flag = temp < 0x100; \
v_flag = ((A ^ temp) & 0x80) && ((A ^ data) & 0x80); \
SET_NZ_FLAGS(temp & 0xFF); \
A = (ah << 4) | (al & 0x0F); \
} \
else \
{ \
v_flag = ((A ^ temp) & 0x80) && ((A ^ data) & 0x80); \
c_flag = temp < 0x100; \
A = (uint8) temp; \
SET_NZ_FLAGS(A & 0xFF); \
} \
ADD_CYCLES(cycles); \
}
#else
#define SBC(cycles, read_func) \
{ \
read_func(data); \
temp = A - data - (c_flag ^ C_FLAG); \
v_flag = ((A ^ data) & (A ^ temp) & 0x80); \
c_flag = temp < 0x100; \
A = (uint8) temp; \
SET_NZ_FLAGS(A); \
ADD_CYCLES(cycles); \
}
#endif /* NES6502_DECIMAL */
/* undocumented */
#define SBX(cycles, read_func) \
{ \
read_func(data); \
temp = (A & X) - data; \
c_flag = temp < 0x100; \
X = temp & 0xFF; \
SET_NZ_FLAGS(X); \
ADD_CYCLES(cycles); \
}
#define SEC() \
{ \
c_flag = 1; \
ADD_CYCLES(2); \
}
#define SED() \
{ \
/* d_flag = 1; */\
ADD_CYCLES(2); \
}
#define SEI() \
{ \
i_flag = I_FLAG; \
ADD_CYCLES(2); \
}
/* undocumented */
#define SHA(cycles, read_func, write_func, addr) \
{ \
read_func(addr); \
data = A & X & ((uint8) ((addr >> 8) + 1)); \
write_func(addr, data); \
ADD_CYCLES(cycles); \
}
/* undocumented */
#define SHS(cycles, read_func, write_func, addr) \
{ \
read_func(addr); \
S = A & X; \
data = S & ((uint8) ((addr >> 8) + 1)); \
write_func(addr, data); \
ADD_CYCLES(cycles); \
}
/* undocumented */
#define SHX(cycles, read_func, write_func, addr) \
{ \
read_func(addr); \
data = X & ((uint8) ((addr >> 8) + 1)); \
write_func(addr, data); \
ADD_CYCLES(cycles); \
}
/* undocumented */
#define SHY(cycles, read_func, write_func, addr) \
{ \
read_func(addr); \
data = Y & ((uint8) ((addr >> 8 ) + 1)); \
write_func(addr, data); \
ADD_CYCLES(cycles); \
}
/* undocumented */
#define SLO(cycles, read_func, write_func, addr) \
{ \
read_func(addr, data); \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -