From 2f2d9cf8eeb0ea61a89c49dd56d53ede0478265b Mon Sep 17 00:00:00 2001 From: Toni Date: Sun, 13 Jul 2025 20:16:55 +0200 Subject: [PATCH] replace READ_ADDR --- mos6502.c | 307 +++++++++++++++++++++++------------------------------- 1 file changed, 128 insertions(+), 179 deletions(-) diff --git a/mos6502.c b/mos6502.c index 900a762..e7d5ad1 100644 --- a/mos6502.c +++ b/mos6502.c @@ -4,10 +4,8 @@ #include #include -#define READ_ADDR() \ - uint16_t low = m->memory[m->pc++]; \ - uint16_t high = m->memory[m->pc++]; \ - uint16_t addr = (high << 8) | low +#define READ_U8() m->memory[m->pc++] +#define READ_U16() (READ_U8() | (READ_U8() << 8)) typedef struct MOS6502 { uint8_t *memory; @@ -31,263 +29,239 @@ void mos6502_disassemble(MOS6502 *m, size_t program_size) { while (m->pc < 0x600 + program_size) { printf("%04X: ", m->pc); - uint8_t op = m->memory[m->pc++]; + uint8_t op = READ_U8(); switch (op) { case 0x00: { printf("BRK\n"); } break; case 0x01: { - printf("ORA ($%02X,X)\n", m->memory[m->pc++]); + printf("ORA ($%02X,X)\n", READ_U8()); } break; case 0x05: { - printf("ORA $%02X\n", m->memory[m->pc++]); + printf("ORA $%02X\n", READ_U8()); } break; case 0x06: { - printf("ASL $%02X\n", m->memory[m->pc++]); + printf("ASL $%02X\n", READ_U8()); } break; case 0x08: { printf("PHP\n"); } break; case 0x09: { - printf("ORA #$%02X\n", m->memory[m->pc++]); + printf("ORA #$%02X\n", READ_U8()); } break; case 0x0A: { printf("ASL A\n"); } break; case 0x0D: { - READ_ADDR(); - printf("ORA $%04X\n", addr); + printf("ORA $%04X\n", READ_U16()); } break; case 0x0E: { - READ_ADDR(); - printf("ASL $%04X\n", addr); + printf("ASL $%04X\n", READ_U16()); } break; case 0x10: { - int8_t offset = m->memory[m->pc++]; + int8_t offset = READ_U8(); printf("BPL $%04X\n", m->pc + offset); } break; case 0x11: { - printf("ORA ($%02X),Y\n", m->memory[m->pc++]); + printf("ORA ($%02X),Y\n", READ_U8()); } break; case 0x15: { - printf("ORA $%02X,X\n", m->memory[m->pc++]); + printf("ORA $%02X,X\n", READ_U8()); } break; case 0x16: { - printf("ASL $%02X,X\n", m->memory[m->pc++]); + printf("ASL $%02X,X\n", READ_U8()); } break; case 0x18: { printf("CLC\n"); } break; case 0x19: { - READ_ADDR(); - printf("ORA $%04X,Y\n", addr); + printf("ORA $%04X,Y\n", READ_U16()); } break; case 0x1D: { - READ_ADDR(); - printf("ORA $%04X,X\n", addr); + printf("ORA $%04X,X\n", READ_U16()); } break; case 0x1E: { - READ_ADDR(); - printf("ASL $%04X,X\n", addr); + printf("ASL $%04X,X\n", READ_U16()); } break; case 0x20: { - READ_ADDR(); - printf("JSR $%04X\n", addr); + printf("JSR $%04X\n", READ_U16()); } break; case 0x21: { - printf("AND ($%02X,X)\n", m->memory[m->pc++]); + printf("AND ($%02X,X)\n", READ_U8()); } break; case 0x24: { - printf("BIT $%02X\n", m->memory[m->pc++]); + printf("BIT $%02X\n", READ_U8()); } break; case 0x25: { - printf("AND $%02X\n", m->memory[m->pc++]); + printf("AND $%02X\n", READ_U8()); } break; case 0x26: { - printf("ROL $%02X\n", m->memory[m->pc++]); + printf("ROL $%02X\n", READ_U8()); } break; case 0x28: { printf("PLP\n"); } break; case 0x29: { - printf("AND #$%02X\n", m->memory[m->pc++]); + printf("AND #$%02X\n", READ_U8()); } break; case 0x2A: { printf("ROL A\n"); } break; case 0x2C: { - READ_ADDR(); - printf("BIT $%04X\n", addr); + printf("BIT $%04X\n", READ_U16()); } break; case 0x2D: { - READ_ADDR(); - printf("AND $%04X\n", addr); + printf("AND $%04X\n", READ_U16()); } break; case 0x2E: { - READ_ADDR(); - printf("ROL $%04X\n", addr); + printf("ROL $%04X\n", READ_U16()); } break; case 0x30: { - int8_t offset = m->memory[m->pc++]; + int8_t offset = READ_U8(); printf("BMI $%04X\n", m->pc + offset); } break; case 0x31: { - printf("AND ($%02X),Y\n", m->memory[m->pc++]); + printf("AND ($%02X),Y\n", READ_U8()); } break; case 0x35: { - printf("AND $%02X,X\n", m->memory[m->pc++]); + printf("AND $%02X,X\n", READ_U8()); } break; case 0x36: { - printf("ROL $%02X,X\n", m->memory[m->pc++]); + printf("ROL $%02X,X\n", READ_U8()); } break; case 0x38: { printf("SEC\n"); } break; case 0x39: { - READ_ADDR(); - printf("AND $%04X,Y\n", addr); + printf("AND $%04X,Y\n", READ_U16()); } break; case 0x3D: { - READ_ADDR(); - printf("AND $%04X,X\n", addr); + printf("AND $%04X,X\n", READ_U16()); } break; case 0x3E: { - READ_ADDR(); - printf("ROL $%04X,X\n", addr); + printf("ROL $%04X,X\n", READ_U16()); } break; case 0x40: { printf("RTI\n"); } break; case 0x41: { - printf("EOR ($%02X,X)\n", m->memory[m->pc++]); + printf("EOR ($%02X,X)\n", READ_U8()); } break; case 0x45: { - printf("EOR $%02X\n", m->memory[m->pc++]); + printf("EOR $%02X\n", READ_U8()); } break; case 0x46: { - printf("LSR $%02X\n", m->memory[m->pc++]); + printf("LSR $%02X\n", READ_U8()); } break; case 0x48: { printf("PHA\n"); } break; case 0x49: { - printf("EOR #$%02X\n", m->memory[m->pc++]); + printf("EOR #$%02X\n", READ_U8()); } break; case 0x4A: { printf("LSR A\n"); } break; case 0x4C: { - READ_ADDR(); - printf("JMP $%04X\n", addr); + printf("JMP $%04X\n", READ_U16()); } break; case 0x4D: { - READ_ADDR(); - printf("EOR $%04X\n", addr); + printf("EOR $%04X\n", READ_U16()); } break; case 0x4E: { - READ_ADDR(); - printf("LSR $%04X\n", addr); + printf("LSR $%04X\n", READ_U16()); } break; case 0x50: { - int8_t offset = m->memory[m->pc++]; + int8_t offset = READ_U8(); printf("BVC $%04X\n", m->pc + offset); } break; case 0x51: { - printf("EOR ($%02X),Y\n", m->memory[m->pc++]); + printf("EOR ($%02X),Y\n", READ_U8()); } break; case 0x55: { - printf("EOR $%02X,X\n", m->memory[m->pc++]); + printf("EOR $%02X,X\n", READ_U8()); } break; case 0x56: { - printf("LSR $%02X,X\n", m->memory[m->pc++]); + printf("LSR $%02X,X\n", READ_U8()); } break; case 0x58: { printf("CLI\n"); } break; case 0x59: { - READ_ADDR(); - printf("EOR $%04X,Y\n", addr); + printf("EOR $%04X,Y\n", READ_U16()); } break; case 0x5D: { - READ_ADDR(); - printf("EOR $%04X,X\n", addr); + printf("EOR $%04X,X\n", READ_U16()); } break; case 0x5E: { - READ_ADDR(); - printf("LSR $%04X,X\n", addr); + printf("LSR $%04X,X\n", READ_U16()); } break; case 0x60: { printf("RTS\n"); } break; case 0x61: { - printf("ADC ($%02X,X)\n", m->memory[m->pc++]); + printf("ADC ($%02X,X)\n", READ_U8()); } break; case 0x65: { - printf("ADC $%02X\n", m->memory[m->pc++]); + printf("ADC $%02X\n", READ_U8()); } break; case 0x66: { - printf("ROR $%02X\n", m->memory[m->pc++]); + printf("ROR $%02X\n", READ_U8()); } break; case 0x68: { printf("PLA\n"); } break; case 0x69: { - printf("ADC #$%02X\n", m->memory[m->pc++]); + printf("ADC #$%02X\n", READ_U8()); } break; case 0x6A: { printf("ROR A\n"); } break; case 0x6C: { - READ_ADDR(); - printf("JMP ($%04X)\n", addr); + printf("JMP ($%04X)\n", READ_U16()); } break; case 0x6D: { - READ_ADDR(); - printf("ADC $%04X\n", addr); + printf("ADC $%04X\n", READ_U16()); } break; case 0x6E: { - READ_ADDR(); - printf("ROR $%04X\n", addr); + printf("ROR $%04X\n", READ_U16()); } break; case 0x70: { - int8_t offset = m->memory[m->pc++]; + int8_t offset = READ_U8(); printf("BVS $%04X\n", m->pc + offset); } break; case 0x71: { - printf("ADC ($%02X),Y\n", m->memory[m->pc++]); + printf("ADC ($%02X),Y\n", READ_U8()); } break; case 0x75: { - printf("ADC $%02X,X\n", m->memory[m->pc++]); + printf("ADC $%02X,X\n", READ_U8()); } break; case 0x76: { - printf("ROR $%02X,X\n", m->memory[m->pc++]); + printf("ROR $%02X,X\n", READ_U8()); } break; case 0x78: { printf("SEI\n"); } break; case 0x79: { - READ_ADDR(); - printf("ADC $%04X,Y\n", addr); - } break; - case 0x7E: { - READ_ADDR(); - printf("ROR $%04X,X\n", addr); + printf("ADC $%04X,Y\n", READ_U16()); } break; case 0x7D: { - READ_ADDR(); - printf("ADC $%04X,X\n", addr); + printf("ADC $%04X,X\n", READ_U16()); + } break; + case 0x7E: { + printf("ROR $%04X,X\n", READ_U16()); } break; case 0x81: { - printf("STA ($%02X,X)\n", m->memory[m->pc++]); + printf("STA ($%02X,X)\n", READ_U8()); } break; case 0x84: { - printf("STY $%02X\n", m->memory[m->pc++]); + printf("STY $%02X\n", READ_U8()); } break; case 0x85: { - printf("STA $%02X\n", m->memory[m->pc++]); + printf("STA $%02X\n", READ_U8()); } break; case 0x86: { - printf("STX $%02X\n", m->memory[m->pc++]); + printf("STX $%02X\n", READ_U8()); } break; case 0x88: { printf("DEY\n"); @@ -296,255 +270,230 @@ void mos6502_disassemble(MOS6502 *m, size_t program_size) { printf("TXA\n"); } break; case 0x8C: { - READ_ADDR(); - printf("STY $%04X\n", addr); + printf("STY $%04X\n", READ_U16()); } break; case 0x8D: { - READ_ADDR(); - printf("STA $%04X\n", addr); + printf("STA $%04X\n", READ_U16()); } break; case 0x8E: { - READ_ADDR(); - printf("STX $%04X\n", addr); + printf("STX $%04X\n", READ_U16()); } break; case 0x90: { - int8_t offset = m->memory[m->pc++]; + int8_t offset = READ_U8(); printf("BCC $%04X\n", m->pc + offset); } break; case 0x91: { - printf("STA ($%02X),Y\n", m->memory[m->pc++]); + printf("STA ($%02X),Y\n", READ_U8()); } break; case 0x94: { - printf("STY $%02X,X\n", m->memory[m->pc++]); + printf("STY $%02X,X\n", READ_U8()); } break; case 0x95: { - printf("STA $%02X,X\n", m->memory[m->pc++]); + printf("STA $%02X,X\n", READ_U8()); } break; case 0x96: { - printf("STX $%02X,Y\n", m->memory[m->pc++]); + printf("STX $%02X,Y\n", READ_U8()); } break; case 0x98: { printf("TYA\n"); } break; case 0x99: { - READ_ADDR(); - printf("STA $%04X,Y\n", addr); + printf("STA $%04X,Y\n", READ_U16()); } break; case 0x9A: { printf("TXS\n"); } break; case 0x9D: { - READ_ADDR(); - printf("STA $%04X,X\n", addr); + printf("STA $%04X,X\n", READ_U16()); } break; case 0xA0: { - printf("LDY #$%02X\n", m->memory[m->pc++]); + printf("LDY #$%02X\n", READ_U8()); } break; case 0xA1: { - printf("LDA ($%02X,X)\n", m->memory[m->pc++]); + printf("LDA ($%02X,X)\n", READ_U8()); } break; case 0xA2: { - printf("LDX #$%02X\n", m->memory[m->pc++]); + printf("LDX #$%02X\n", READ_U8()); } break; case 0xA4: { - printf("LDY $%02X\n", m->memory[m->pc++]); + printf("LDY $%02X\n", READ_U8()); } break; case 0xA5: { - printf("LDA $%02X\n", m->memory[m->pc++]); + printf("LDA $%02X\n", READ_U8()); } break; case 0xA6: { - printf("LDX $%02X\n", m->memory[m->pc++]); + printf("LDX $%02X\n", READ_U8()); } break; case 0xA8: { printf("TAY\n"); } break; case 0xA9: { - printf("LDA #$%02X\n", m->memory[m->pc++]); + printf("LDA #$%02X\n", READ_U8()); } break; case 0xAA: { printf("TAX\n"); } break; case 0xAC: { - READ_ADDR(); - printf("LDY $%04X\n", addr); + printf("LDY $%04X\n", READ_U16()); } break; case 0xAD: { - READ_ADDR(); - printf("LDA $%04X\n", addr); + printf("LDA $%04X\n", READ_U16()); } break; case 0xAE: { - READ_ADDR(); - printf("LDX $%04X\n", addr); + printf("LDX $%04X\n", READ_U16()); } break; case 0xB0: { - int8_t offset = m->memory[m->pc++]; + int8_t offset = READ_U8(); printf("BCS $%04X\n", m->pc + offset); } break; case 0xB1: { - printf("LDA ($%02X,Y)\n", m->memory[m->pc++]); + printf("LDA ($%02X),Y\n", READ_U8()); } break; case 0xB4: { - printf("LDY $%02X,X\n", m->memory[m->pc++]); + printf("LDY $%02X,X\n", READ_U8()); } break; case 0xB5: { - printf("LDA $%02X,X\n", m->memory[m->pc++]); + printf("LDA $%02X,X\n", READ_U8()); } break; case 0xB6: { - printf("LDX $%02X,Y\n", m->memory[m->pc++]); + printf("LDX $%02X,Y\n", READ_U8()); } break; case 0xB8: { printf("CLV\n"); } break; case 0xB9: { - READ_ADDR(); - printf("LDA $%04X,Y\n", addr); + printf("LDA $%04X,Y\n", READ_U16()); } break; case 0xBA: { printf("TSX\n"); } break; case 0xBC: { - READ_ADDR(); - printf("LDY $%04X,X\n", addr); + printf("LDY $%04X,X\n", READ_U16()); } break; case 0xBD: { - READ_ADDR(); - printf("LDA $%04X,X\n", addr); + printf("LDA $%04X,X\n", READ_U16()); } break; case 0xBE: { - READ_ADDR(); - printf("LDX $%04X,Y\n", addr); + printf("LDX $%04X,Y\n", READ_U16()); } break; case 0xC0: { - printf("CPY #$%02X\n", m->memory[m->pc++]); + printf("CPY #$%02X\n", READ_U8()); } break; case 0xC1: { - printf("CMP ($%02X,X)\n", m->memory[m->pc++]); + printf("CMP ($%02X,X)\n", READ_U8()); } break; case 0xC4: { - printf("CPY $%02X\n", m->memory[m->pc++]); + printf("CPY $%02X\n", READ_U8()); } break; case 0xC5: { - printf("CMP $%02X\n", m->memory[m->pc++]); + printf("CMP $%02X\n", READ_U8()); } break; case 0xC6: { - printf("DEC $%02X\n", m->memory[m->pc++]); + printf("DEC $%02X\n", READ_U8()); } break; case 0xC8: { printf("INY\n"); } break; case 0xC9: { - printf("CMP #$%02X\n", m->memory[m->pc++]); + printf("CMP #$%02X\n", READ_U8()); } break; case 0xCA: { printf("DEX\n"); } break; case 0xCC: { - READ_ADDR(); - printf("CPY $%04X\n", addr); + printf("CPY $%04X\n", READ_U16()); } break; case 0xCD: { - READ_ADDR(); - printf("CMP $%04X\n", addr); + printf("CMP $%04X\n", READ_U16()); } break; case 0xCE: { - READ_ADDR(); - printf("DEC $%04X\n", addr); + printf("DEC $%04X\n", READ_U16()); } break; case 0xD0: { - int8_t offset = m->memory[m->pc++]; + int8_t offset = READ_U8(); printf("BNE $%04X\n", m->pc + offset); } break; case 0xD1: { - printf("CMP ($%02X),Y\n", m->memory[m->pc++]); + printf("CMP ($%02X),Y\n", READ_U8()); } break; case 0xD5: { - printf("CMP $%02X,X\n", m->memory[m->pc++]); + printf("CMP $%02X,X\n", READ_U8()); } break; case 0xD6: { - printf("DEC $%02X,X\n", m->memory[m->pc++]); + printf("DEC $%02X,X\n", READ_U8()); } break; case 0xD8: { printf("CLD\n"); } break; case 0xD9: { - READ_ADDR(); - printf("CMP $%04X,Y\n", addr); + printf("CMP $%04X,Y\n", READ_U16()); } break; case 0xDD: { - READ_ADDR(); - printf("CMP $%04X,X\n", addr); + printf("CMP $%04X,X\n", READ_U16()); } break; case 0xDE: { - READ_ADDR(); - printf("DEC $%04X,X\n", addr); + printf("DEC $%04X,X\n", READ_U16()); } break; case 0xE0: { - printf("CPX #$%02X\n", m->memory[m->pc++]); + printf("CPX #$%02X\n", READ_U8()); } break; case 0xE1: { - printf("SBC ($%02X,X)\n", m->memory[m->pc++]); + printf("SBC ($%02X,X)\n", READ_U8()); } break; case 0xE4: { - printf("CPX $%02X\n", m->memory[m->pc++]); + printf("CPX $%02X\n", READ_U8()); } break; case 0xE5: { - printf("SBC $%02X\n", m->memory[m->pc++]); + printf("SBC $%02X\n", READ_U8()); } break; case 0xE6: { - printf("INC $%02X\n", m->memory[m->pc++]); + printf("INC $%02X\n", READ_U8()); } break; case 0xE8: { printf("INX\n"); } break; case 0xE9: { - printf("SBC #$%02X\n", m->memory[m->pc++]); + printf("SBC #$%02X\n", READ_U8()); } break; case 0xEA: { printf("NOP\n"); } break; case 0xEC: { - READ_ADDR(); - printf("CPX $%04X\n", addr); + printf("CPX $%04X\n", READ_U16()); } break; case 0xED: { - READ_ADDR(); - printf("SBC $%04X\n", addr); + printf("SBC $%04X\n", READ_U16()); } break; case 0xEE: { - READ_ADDR(); - printf("INC $%04X\n", addr); + printf("INC $%04X\n", READ_U16()); } break; case 0xF0: { - int8_t offset = m->memory[m->pc++]; + int8_t offset = READ_U8(); printf("BEQ $%04X\n", m->pc + offset); } break; case 0xF1: { - printf("SBC ($%02X),Y\n", m->memory[m->pc++]); + printf("SBC ($%02X),Y\n", READ_U8()); } break; case 0xF5: { - printf("SBC $%02X,X\n", m->memory[m->pc++]); + printf("SBC $%02X,X\n", READ_U8()); } break; case 0xF6: { - printf("INC $%02X,X\n", m->memory[m->pc++]); + printf("INC $%02X,X\n", READ_U8()); } break; case 0xF8: { printf("SED\n"); } break; case 0xF9: { - READ_ADDR(); - printf("SBC $%04X,Y\n", addr); + printf("SBC $%04X,Y\n", READ_U16()); } break; case 0xFD: { - READ_ADDR(); - printf("SBC $%04X,X\n", addr); + printf("SBC $%04X,X\n", READ_U16()); } break; case 0xFE: { - READ_ADDR(); - printf("INC $%04X,X\n", addr); + printf("INC $%04X,X\n", READ_U16()); } break; default: - fprintf(stderr, "unrecognized opcode: %02X\n", op); - exit(1); + printf("???\n"); } } }