📄 nes6502.c
字号:
OPCODE_BEGIN(A7) /* LAX $nn */
LAX(3, ZERO_PAGE_BYTE);
OPCODE_END
OPCODE_BEGIN(A8) /* TAY */
TAY();
OPCODE_END
OPCODE_BEGIN(A9) /* LDA #$nn */
LDA(2, IMMEDIATE_BYTE);
OPCODE_END
OPCODE_BEGIN(AA) /* TAX */
TAX();
OPCODE_END
OPCODE_BEGIN(AB) /* LXA #$nn */
LXA(2, IMMEDIATE_BYTE);
OPCODE_END
OPCODE_BEGIN(AC) /* LDY $nnnn */
LDY(4, ABSOLUTE_BYTE);
OPCODE_END
OPCODE_BEGIN(AD) /* LDA $nnnn */
LDA(4, ABSOLUTE_BYTE);
OPCODE_END
OPCODE_BEGIN(AE) /* LDX $nnnn */
LDX(4, ABSOLUTE_BYTE);
OPCODE_END
OPCODE_BEGIN(AF) /* LAX $nnnn */
LAX(4, ABSOLUTE_BYTE);
OPCODE_END
OPCODE_BEGIN(B0) /* BCS $nnnn */
BCS();
OPCODE_END
OPCODE_BEGIN(B1) /* LDA ($nn),Y */
LDA(5, INDIR_Y_BYTE);
OPCODE_END
OPCODE_BEGIN(B3) /* LAX ($nn),Y */
LAX(5, INDIR_Y_BYTE);
OPCODE_END
OPCODE_BEGIN(B4) /* LDY $nn,X */
LDY(4, ZP_IND_X_BYTE);
OPCODE_END
OPCODE_BEGIN(B5) /* LDA $nn,X */
LDA(4, ZP_IND_X_BYTE);
OPCODE_END
OPCODE_BEGIN(B6) /* LDX $nn,Y */
LDX(4, ZP_IND_Y_BYTE);
OPCODE_END
OPCODE_BEGIN(B7) /* LAX $nn,Y */
LAX(4, ZP_IND_Y_BYTE);
OPCODE_END
OPCODE_BEGIN(B8) /* CLV */
CLV();
OPCODE_END
OPCODE_BEGIN(B9) /* LDA $nnnn,Y */
LDA(4, ABS_IND_Y_BYTE);
OPCODE_END
OPCODE_BEGIN(BA) /* TSX */
TSX();
OPCODE_END
OPCODE_BEGIN(BB) /* LAS $nnnn,Y */
LAS(4, ABS_IND_Y_BYTE);
OPCODE_END
OPCODE_BEGIN(BC) /* LDY $nnnn,X */
LDY(4, ABS_IND_X_BYTE);
OPCODE_END
OPCODE_BEGIN(BD) /* LDA $nnnn,X */
LDA(4, ABS_IND_X_BYTE);
OPCODE_END
OPCODE_BEGIN(BE) /* LDX $nnnn,Y */
LDX(4, ABS_IND_Y_BYTE);
OPCODE_END
OPCODE_BEGIN(BF) /* LAX $nnnn,Y */
LAX(4, ABS_IND_Y_BYTE);
OPCODE_END
OPCODE_BEGIN(C0) /* CPY #$nn */
CPY(2, IMMEDIATE_BYTE);
OPCODE_END
OPCODE_BEGIN(C1) /* CMP ($nn,X) */
CMP(6, INDIR_X_BYTE);
OPCODE_END
OPCODE_BEGIN(C3) /* DCP ($nn,X) */
DCP(8, INDIR_X, mem_writebyte, addr);
OPCODE_END
OPCODE_BEGIN(C4) /* CPY $nn */
CPY(3, ZERO_PAGE_BYTE);
OPCODE_END
OPCODE_BEGIN(C5) /* CMP $nn */
CMP(3, ZERO_PAGE_BYTE);
OPCODE_END
OPCODE_BEGIN(C6) /* DEC $nn */
DEC(5, ZERO_PAGE, ZP_WRITEBYTE, baddr);
OPCODE_END
OPCODE_BEGIN(C7) /* DCP $nn */
DCP(5, ZERO_PAGE, ZP_WRITEBYTE, baddr);
OPCODE_END
OPCODE_BEGIN(C8) /* INY */
INY();
OPCODE_END
OPCODE_BEGIN(C9) /* CMP #$nn */
CMP(2, IMMEDIATE_BYTE);
OPCODE_END
OPCODE_BEGIN(CA) /* DEX */
DEX();
OPCODE_END
OPCODE_BEGIN(CB) /* SBX #$nn */
SBX(2, IMMEDIATE_BYTE);
OPCODE_END
OPCODE_BEGIN(CC) /* CPY $nnnn */
CPY(4, ABSOLUTE_BYTE);
OPCODE_END
OPCODE_BEGIN(CD) /* CMP $nnnn */
CMP(4, ABSOLUTE_BYTE);
OPCODE_END
OPCODE_BEGIN(CE) /* DEC $nnnn */
DEC(6, ABSOLUTE, mem_writebyte, addr);
OPCODE_END
OPCODE_BEGIN(CF) /* DCP $nnnn */
DCP(6, ABSOLUTE, mem_writebyte, addr);
OPCODE_END
OPCODE_BEGIN(D0) /* BNE $nnnn */
BNE();
OPCODE_END
OPCODE_BEGIN(D1) /* CMP ($nn),Y */
CMP(5, INDIR_Y_BYTE);
OPCODE_END
OPCODE_BEGIN(D3) /* DCP ($nn),Y */
DCP(8, INDIR_Y, mem_writebyte, addr);
OPCODE_END
OPCODE_BEGIN(D5) /* CMP $nn,X */
CMP(4, ZP_IND_X_BYTE);
OPCODE_END
OPCODE_BEGIN(D6) /* DEC $nn,X */
DEC(6, ZP_IND_X, ZP_WRITEBYTE, baddr);
OPCODE_END
OPCODE_BEGIN(D7) /* DCP $nn,X */
DCP(6, ZP_IND_X, ZP_WRITEBYTE, baddr);
OPCODE_END
OPCODE_BEGIN(D8) /* CLD */
CLD();
OPCODE_END
OPCODE_BEGIN(D9) /* CMP $nnnn,Y */
CMP(4, ABS_IND_Y_BYTE);
OPCODE_END
OPCODE_BEGIN(DB) /* DCP $nnnn,Y */
DCP(7, ABS_IND_Y, mem_writebyte, addr);
OPCODE_END
OPCODE_BEGIN(DD) /* CMP $nnnn,X */
CMP(4, ABS_IND_X_BYTE);
OPCODE_END
OPCODE_BEGIN(DE) /* DEC $nnnn,X */
DEC(7, ABS_IND_X, mem_writebyte, addr);
OPCODE_END
OPCODE_BEGIN(DF) /* DCP $nnnn,X */
DCP(7, ABS_IND_X, mem_writebyte, addr);
OPCODE_END
OPCODE_BEGIN(E0) /* CPX #$nn */
CPX(2, IMMEDIATE_BYTE);
OPCODE_END
OPCODE_BEGIN(E1) /* SBC ($nn,X) */
SBC(6, INDIR_X_BYTE);
OPCODE_END
OPCODE_BEGIN(E3) /* ISB ($nn,X) */
ISB(8, INDIR_X, mem_writebyte, addr);
OPCODE_END
OPCODE_BEGIN(E4) /* CPX $nn */
CPX(3, ZERO_PAGE_BYTE);
OPCODE_END
OPCODE_BEGIN(E5) /* SBC $nn */
SBC(3, ZERO_PAGE_BYTE);
OPCODE_END
OPCODE_BEGIN(E6) /* INC $nn */
INC(5, ZERO_PAGE, ZP_WRITEBYTE, baddr);
OPCODE_END
OPCODE_BEGIN(E7) /* ISB $nn */
ISB(5, ZERO_PAGE, ZP_WRITEBYTE, baddr);
OPCODE_END
OPCODE_BEGIN(E8) /* INX */
INX();
OPCODE_END
OPCODE_BEGIN(E9) /* SBC #$nn */
OPCODE_BEGIN(EB) /* USBC #$nn */
SBC(2, IMMEDIATE_BYTE);
OPCODE_END
OPCODE_BEGIN(EA) /* NOP */
NOP();
OPCODE_END
OPCODE_BEGIN(EC) /* CPX $nnnn */
CPX(4, ABSOLUTE_BYTE);
OPCODE_END
OPCODE_BEGIN(ED) /* SBC $nnnn */
SBC(4, ABSOLUTE_BYTE);
OPCODE_END
OPCODE_BEGIN(EE) /* INC $nnnn */
INC(6, ABSOLUTE, mem_writebyte, addr);
OPCODE_END
OPCODE_BEGIN(EF) /* ISB $nnnn */
ISB(6, ABSOLUTE, mem_writebyte, addr);
OPCODE_END
OPCODE_BEGIN(F0) /* BEQ $nnnn */
BEQ();
OPCODE_END
OPCODE_BEGIN(F1) /* SBC ($nn),Y */
SBC(5, INDIR_Y_BYTE);
OPCODE_END
OPCODE_BEGIN(F3) /* ISB ($nn),Y */
ISB(8, INDIR_Y, mem_writebyte, addr);
OPCODE_END
OPCODE_BEGIN(F5) /* SBC $nn,X */
SBC(4, ZP_IND_X_BYTE);
OPCODE_END
OPCODE_BEGIN(F6) /* INC $nn,X */
INC(6, ZP_IND_X, ZP_WRITEBYTE, baddr);
OPCODE_END
OPCODE_BEGIN(F7) /* ISB $nn,X */
ISB(6, ZP_IND_X, ZP_WRITEBYTE, baddr);
OPCODE_END
OPCODE_BEGIN(F8) /* SED */
SED();
OPCODE_END
OPCODE_BEGIN(F9) /* SBC $nnnn,Y */
SBC(4, ABS_IND_Y_BYTE);
OPCODE_END
OPCODE_BEGIN(FB) /* ISB $nnnn,Y */
ISB(7, ABS_IND_Y, mem_writebyte, addr);
OPCODE_END
OPCODE_BEGIN(FD) /* SBC $nnnn,X */
SBC(4, ABS_IND_X_BYTE);
OPCODE_END
OPCODE_BEGIN(FE) /* INC $nnnn,X */
INC(7, ABS_IND_X, mem_writebyte, addr);
OPCODE_END
OPCODE_BEGIN(FF) /* ISB $nnnn,X */
ISB(7, ABS_IND_X, mem_writebyte, addr);
OPCODE_END
#ifdef NES6502_JUMPTABLE
end_execute:
#else /* !NES6502_JUMPTABLE */
}
}
#endif /* !NES6502_JUMPTABLE */
/* store local copy of regs */
STORE_LOCAL_REGS();
current_PC = 0;
/* Return our actual amount of executed cycles */
executed = org_rem_cycles - remaining_cycles;
cpu.total_cycles += executed;
return (executed);
}
#else /* OPCODES_BY_FREQUENCY */
static int nes6502_rare_op_execute(int remaining_cycles);
/* Execute instructions until count expires
**
** Returns the number of cycles *actually* executed, which will be
** anywhere from remaining_cycles to remaining_cycles + 6
*/
int nes6502_execute(int remaining_cycles)
{
//int old_cycles = cpu.total_cycles;
int org_rem_cycles = remaining_cycles;
int executed;
#if 1
uint32 temp, addr; /* for macros */
uint8 btemp, baddr; /* for macros */
uint8 data;
#endif
/* flags */
//uint8 n_flag, v_flag, b_flag;
//uint8 d_flag, i_flag, z_flag, c_flag;
uint32 n_flag, v_flag, b_flag;
uint32 i_flag, z_flag, c_flag;
/* local copies of regs */
uint32 PC;
uint8 * last_bank_ptr;
//uint8 A, X, Y, S;
uint8 X, Y;
uint32 A, S;
#undef ram
#undef stack
uint8* ram_l = ram;
uint8* stack_l = stack;
uint8** mem_page = cpu.mem_page;
uint8 (*read_func)(uint32 address) = cpu.read_handler->read_func;
void (*write_func)(uint32 address, uint8 value) = cpu.write_handler->write_func;
#define ram ram_l
#define stack stack_l
#define OPCODE_BEGIN_NO_VARS(xx) case 0x##xx:
#define OPCODE_BEGIN(xx) \
case 0x##xx: \
{ \
/*uint32 temp, addr; /* for macros */ \
/*uint8 btemp, baddr; /* for macros */\
/*uint8 data;*/
/* #define OPCODE_END break; */
#define OPCODE_END \
} \
goto next_opcode;
GET_GLOBAL_REGS();
if (cpu.int_pending && remaining_cycles)
{
if (0 == i_flag)
{
cpu.int_pending = 0;
IRQ();
}
}
/* check for DMA cycle burning */
if (cpu.burn_cycles && remaining_cycles)
{
int burn_for;
burn_for = MIN(remaining_cycles, cpu.burn_cycles);
ADD_CYCLES(burn_for);
cpu.burn_cycles -= burn_for;
}
current_PC = &PC;
current_last_bank_ptr = &last_bank_ptr;
next_opcode:
/* Continue until we run out of cycles */
while (remaining_cycles > 0)
{
#ifdef NES6502_DISASM
log_printf(nes6502_disasm(PC, COMBINE_FLAGS(), A, X, Y, S));
#endif /* NES6502_DISASM */
/* Fetch and execute instruction */
//switch (bank_readbyte(PC++))
/* uint8 c = bank_readbyte(PC);
PC++;
*/
#pragma warning ( disable : 4101 )
switch (*(uint8 *)PC++)
{
OPCODE_BEGIN(A5) /* LDA $nn */
LDA(3, ZERO_PAGE_BYTE);
OPCODE_END
OPCODE_BEGIN(4C) /* JMP $nnnn */
JMP_ABSOLUTE();
OPCODE_END
OPCODE_BEGIN(F0) /* BEQ $nnnn */
BEQ();
OPCODE_END
OPCODE_BEGIN(D0) /* BNE $nnnn */
BNE();
OPCODE_END
OPCODE_BEGIN(85) /* STA $nn */
STA(3, ZERO_PAGE_ADDR, ZP_WRITEBYTE, baddr);
OPCODE_END
OPCODE_BEGIN(C9) /* CMP #$nn */
CMP(2, IMMEDIATE_BYTE);
OPCODE_END
OPCODE_BEGIN(BD) /* LDA $nnnn,X */
LDA(4, ABS_IND_X_BYTE);
OPCODE_END
OPCODE_BEGIN(18) /* CLC */
CLC();
OPCODE_END
OPCODE_BEGIN(65) /* ADC $nn */
ADC(3, ZERO_PAGE_BYTE);
OPCODE_END
OPCODE_BEGIN(9D) /* STA $nnnn,X */
STA(5, ABS_IND_X_ADDR, mem_writebyte, addr);
OPCODE_END
OPCODE_BEGIN(C8) /* INY */
INY();
OPCODE_END
OPCODE_BEGIN(E6) /* INC $nn */
INC(5, ZERO_PAGE, ZP_WRITEBYTE, baddr);
OPCODE_END
OPCODE_BEGIN(8D) /* STA $nnnn */
STA(4, ABSOLUTE_ADDR, mem_writebyte, addr);
OPCODE_END
OPCODE_BEGIN(E8) /* INX */
INX();
OPCODE_END
OPCODE_BEGIN(29) /* AND #$nn */
AND(2, IMMEDIATE_BYTE);
OPCODE_END
OPCODE_BEGIN(20) /* JSR $nnnn */
JSR();
OPCODE_END
OPCODE_BEGIN(60) /* RTS */
RTS();
OPCODE_END
OPCODE_BEGIN(A9) /* LDA #$nn */
LDA(2, IMMEDIATE_BYTE);
OPCODE_END
OPCODE_BEGIN(30) /* BMI $nnnn */
BMI();
OPCODE_END
OPCODE_BEGIN(AD) /* LDA $nnnn */
LDA(4, ABSOLUTE_BYTE);
OPCODE_END
OPCODE_BEGIN(4A) /* LSR A */
LSR_A();
OPCODE_END
OPCODE_BEGIN(B1) /* LDA ($nn),Y */
LDA(5, INDIR_Y_BYTE);
OPCODE_END
OPCODE_BEGIN(88) /* DEY */
DEY();
OPCODE_END
OPCODE_BEGIN(69) /* ADC #$nn */
ADC(2, IMMEDIATE_BYTE);
OPCODE_END
OPCODE_BEGIN(90) /* BCC $nnnn */
BCC();
OPCODE_END
OPCODE_BEGIN(10) /* BPL $nnnn */
BPL();
OPCODE_END
OPCODE_BEGIN(B9) /* LDA $nnnn,Y */
LDA(4, ABS_IND_Y_BYTE);
OPCODE_END
OPCODE_BEGIN(AA) /* TAX */
TAX();
OPCODE_END
OPCODE_BEGIN(0A) /* ASL A */
ASL_A();
OPCODE_END
OPCODE_BEGIN(CA) /* DEX */
DEX();
OPCODE_END
OPCODE_BEGIN(B0) /* BCS $nnnn */
BCS();
OPCODE_END
OPCODE_BEGIN(38) /* SEC */
SEC();
OPCODE_END
OPCODE_BEGIN(A0) /* LDY #$nn */
LDY(2, IMMEDIATE_BYTE);
OPCODE_END
OPCODE_BEGIN(C6) /* DEC $nn */
DEC(5, ZERO_PAGE, ZP_WRITEBYTE, baddr);
OPCODE_END
OPCODE_BEGIN(2C) /* BIT $nnnn */
BIT(4, ABSOLUTE_BYTE);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -