| @@ -515,7 +515,9 @@ static inline void sbc(e6502_Core *core, e6502_Address adr) { | |||
| static inline void inc(e6502_Core *core, e6502_Address adr) { | |||
| // 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 |= (val & e6502_Status_N); | |||
| 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) { | |||
| const e6502_Instruction* instr = &e6502_instructions[opcode]; | |||
| 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) { | |||
| uint8_t opcode = e6502_r8(core, addr); | |||
| 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) { | |||
| 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) { | |||
| fprintf(file, "S:%02x A:%02x X:%02x Y:%02x P:%02x\n", | |||
| core->registers.S, core->registers.A, | |||
| @@ -938,9 +938,14 @@ int e6502_step(e6502_Core* core) { | |||
| &e6502_instructions[opcode]; | |||
| if (!instr->operator) { | |||
| #ifdef E6502_DEBUG | |||
| fprintf(stdout, "$%04x: $%02x\n", last_pc, opcode); | |||
| fprintf(stdout, "$%04x: $%02x -> ILLEGAL\n", last_pc, opcode); | |||
| #endif | |||
| #ifndef E6502_ILLEGAL | |||
| core->cycle = -1; | |||
| #else | |||
| core->registers.PC++; | |||
| core->cycle += 1; | |||
| #endif | |||
| } else { | |||
| core->registers.PC++; | |||
| @@ -954,6 +959,8 @@ int e6502_step(e6502_Core* core) { | |||
| } | |||
| e6502_dump_regs(core, stdout); | |||
| fprintf(stdout, "$%04x: ", last_pc); | |||
| e6502_dump_instr(core, last_pc, stdout); | |||
| fputs(" -> ", stdout); | |||
| e6502_fprintf_instr(stdout, opcode, (uint8_t*)&val); | |||
| fputc('\n', stdout); | |||
| #endif | |||