| @@ -515,7 +515,9 @@ static inline void sbc(e6502_Core *core, e6502_Address adr) { | |||||
| static inline void inc(e6502_Core *core, e6502_Address adr) { | static inline void inc(e6502_Core *core, e6502_Address adr) { | ||||
| // TODO: Emulate double-read or double-write | // TODO: Emulate double-read or double-write | ||||
| uint8_t val = e6502_adr_r8(core, adr) + 1; | |||||
| uint8_t val = e6502_adr_r8(core, adr); | |||||
| e6502_adr_w8(core, adr, val); | |||||
| val += 1; | |||||
| core->registers.P &= ~(e6502_Status_Z | e6502_Status_N); | core->registers.P &= ~(e6502_Status_Z | e6502_Status_N); | ||||
| core->registers.P |= (val & e6502_Status_N); | core->registers.P |= (val & e6502_Status_N); | ||||
| if (!val) core->registers.P |= e6502_Status_Z; | if (!val) core->registers.P |= e6502_Status_Z; | ||||
| @@ -869,7 +871,7 @@ static const e6502_Instruction e6502_instructions[256] = { | |||||
| }; | }; | ||||
| /* | |||||
| #ifdef E6502_DEBUG | |||||
| int e6502_instr_size(uint8_t opcode) { | int e6502_instr_size(uint8_t opcode) { | ||||
| const e6502_Instruction* instr = &e6502_instructions[opcode]; | const e6502_Instruction* instr = &e6502_instructions[opcode]; | ||||
| if ( instr->address == adr_imp || | if ( instr->address == adr_imp || | ||||
| @@ -884,7 +886,7 @@ int e6502_instr_size(uint8_t opcode) { | |||||
| } | } | ||||
| } | } | ||||
| int e6502_dump_instr(e6502_Core* core, e6502_Mem_Addr addr, | |||||
| void e6502_dump_instr(e6502_Core* core, e6502_Mem_Addr addr, | |||||
| FILE* file) { | FILE* file) { | ||||
| uint8_t opcode = e6502_r8(core, addr); | uint8_t opcode = e6502_r8(core, addr); | ||||
| int size = e6502_instr_size(opcode); | int size = e6502_instr_size(opcode); | ||||
| @@ -894,11 +896,9 @@ int e6502_dump_instr(e6502_Core* core, e6502_Mem_Addr addr, | |||||
| } else if (size == 3) { | } else if (size == 3) { | ||||
| fprintf(file, " $%04x", e6502_r16(core, addr + 1)); | fprintf(file, " $%04x", e6502_r16(core, addr + 1)); | ||||
| } | } | ||||
| fputc('\n', file); | |||||
| // fputc('\n', file); | |||||
| } | } | ||||
| */ | |||||
| #ifdef E6502_DEBUG | |||||
| void e6502_dump_regs(e6502_Core* core, FILE* file) { | void e6502_dump_regs(e6502_Core* core, FILE* file) { | ||||
| fprintf(file, "S:%02x A:%02x X:%02x Y:%02x P:%02x\n", | fprintf(file, "S:%02x A:%02x X:%02x Y:%02x P:%02x\n", | ||||
| core->registers.S, core->registers.A, | core->registers.S, core->registers.A, | ||||
| @@ -938,9 +938,14 @@ int e6502_step(e6502_Core* core) { | |||||
| &e6502_instructions[opcode]; | &e6502_instructions[opcode]; | ||||
| if (!instr->operator) { | if (!instr->operator) { | ||||
| #ifdef E6502_DEBUG | #ifdef E6502_DEBUG | ||||
| fprintf(stdout, "$%04x: $%02x\n", last_pc, opcode); | |||||
| fprintf(stdout, "$%04x: $%02x -> ILLEGAL\n", last_pc, opcode); | |||||
| #endif | #endif | ||||
| #ifndef E6502_ILLEGAL | |||||
| core->cycle = -1; | core->cycle = -1; | ||||
| #else | |||||
| core->registers.PC++; | |||||
| core->cycle += 1; | |||||
| #endif | |||||
| } else { | } else { | ||||
| core->registers.PC++; | core->registers.PC++; | ||||
| @@ -954,6 +959,8 @@ int e6502_step(e6502_Core* core) { | |||||
| } | } | ||||
| e6502_dump_regs(core, stdout); | e6502_dump_regs(core, stdout); | ||||
| fprintf(stdout, "$%04x: ", last_pc); | fprintf(stdout, "$%04x: ", last_pc); | ||||
| e6502_dump_instr(core, last_pc, stdout); | |||||
| fputs(" -> ", stdout); | |||||
| e6502_fprintf_instr(stdout, opcode, (uint8_t*)&val); | e6502_fprintf_instr(stdout, opcode, (uint8_t*)&val); | ||||
| fputc('\n', stdout); | fputc('\n', stdout); | ||||
| #endif | #endif | ||||