From 212f5aa9cc089d39caf18ec09c104b4b995e66ed Mon Sep 17 00:00:00 2001 From: Toni Date: Sat, 12 Jul 2025 17:58:05 +0200 Subject: [PATCH] disassemble even more instructions --- mos6502.c | 137 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 131 insertions(+), 6 deletions(-) diff --git a/mos6502.c b/mos6502.c index c151351..8079a04 100644 --- a/mos6502.c +++ b/mos6502.c @@ -36,6 +36,19 @@ void mos6502_disassemble(MOS6502 *m, size_t ins_count) { case 0x00: { printf("BRK\n"); } break; + case 0x08: { + printf("PHP\n"); + } break; + case 0x09: { + printf("ORA #$%02X\n", m->memory[m->pc++]); + } break; + case 0x0A: { + printf("ASL A\n"); + } break; + case 0x10: { + int8_t offset = m->memory[m->pc++]; + printf("BPL $%04X\n", m->pc + offset); + } break; case 0x18: { printf("CLC\n"); } break; @@ -43,21 +56,79 @@ void mos6502_disassemble(MOS6502 *m, size_t ins_count) { READ_ADDR(); printf("JSR $%04X\n", addr); } break; + case 0x28: { + printf("PLP\n"); + } break; + case 0x29: { + printf("AND #$%02X\n", m->memory[m->pc++]); + } break; + case 0x2C: { + READ_ADDR(); + printf("BIT $%04X\n", addr); + } break; + case 0x2E: { + READ_ADDR(); + printf("ROL $%04X\n", addr); + } break; + case 0x30: { + int8_t offset = m->memory[m->pc++]; + printf("BMI $%04X\n", m->pc + offset); + } break; case 0x38: { printf("SEC\n"); } break; + case 0x40: { + printf("RTI\n"); + } break; case 0x4C: { READ_ADDR(); printf("JMP $%04X\n", addr); } break; + case 0x48: { + printf("PHA\n"); + } break; + case 0x49: { + printf("EOR #$%02X\n", m->memory[m->pc++]); + } break; + case 0x4A: { + printf("LSR A\n"); + } break; + case 0x50: { + int8_t offset = m->memory[m->pc++]; + printf("BVC $%04X\n", m->pc + offset); + } break; case 0x60: { printf("RTS\n"); } break; + case 0x68: { + printf("PLA\n"); + } break; case 0x69: { printf("ADC #$%02X\n", m->memory[m->pc++]); } break; + case 0x6E: { + READ_ADDR(); + printf("ROR $%04X\n", addr); + } break; + case 0x70: { + int8_t offset = m->memory[m->pc++]; + printf("BVS $%04X\n", m->pc + offset); + } break; + case 0x78: { + printf("SEI\n"); + } break; + case 0x7D: { + READ_ADDR(); + printf("ADC $%04X,X\n", addr); + } break; case 0x85: { - printf("STA #$%02X\n", m->memory[m->pc++]); + printf("STA $%02X\n", m->memory[m->pc++]); + } break; + case 0x88: { + printf("DEY\n"); + } break; + case 0x8A: { + printf("TXA\n"); } break; case 0x8C: { READ_ADDR(); @@ -75,19 +146,41 @@ void mos6502_disassemble(MOS6502 *m, size_t ins_count) { int8_t offset = m->memory[m->pc++]; printf("BCC $%04X\n", m->pc + offset); } break; + case 0x91: { + printf("STA ($%02X),Y\n", m->memory[m->pc++]); + } break; + case 0x98: { + printf("TYA\n"); + } break; case 0x99: { READ_ADDR(); printf("STA $%04X,Y\n", addr); } break; + case 0x9A: { + printf("TXS\n"); + } break; + case 0x9D: { + READ_ADDR(); + printf("STA $%04X,X\n", addr); + } break; case 0xA0: { printf("LDY #$%02X\n", m->memory[m->pc++]); } break; + case 0xA1: { + printf("LDA ($%02X,X)\n", m->memory[m->pc++]); + } break; case 0xA2: { printf("LDX #$%02X\n", m->memory[m->pc++]); } break; + case 0xA8: { + printf("TAY\n"); + } break; case 0xA9: { printf("LDA #$%02X\n", m->memory[m->pc++]); } break; + case 0xAA: { + printf("TAX\n"); + } break; case 0xAD: { READ_ADDR(); printf("LDA $%04X\n", addr); @@ -97,37 +190,69 @@ void mos6502_disassemble(MOS6502 *m, size_t ins_count) { printf("BCS $%04X\n", m->pc + offset); } break; case 0xB1: { - printf("LDA (#$%02X),Y\n", m->memory[m->pc++]); + printf("LDA ($%02X,Y)\n", m->memory[m->pc++]); + } break; + case 0xB8: { + printf("CLV\n"); + } break; + case 0xBA: { + printf("TSX\n"); } break; case 0xBD: { READ_ADDR(); printf("LDA $%04X,X\n", addr); } break; + case 0xC0: { + printf("CPY #$%02X\n", m->memory[m->pc++]); + } break; + case 0xCA: { + printf("DEX\n"); + } break; case 0xC8: { printf("INY\n"); } break; case 0xC9: { printf("CMP #$%02X\n", m->memory[m->pc++]); } break; + case 0xCE: { + READ_ADDR(); + printf("DEC $%04X\n", addr); + } break; case 0xD0: { int8_t offset = m->memory[m->pc++]; printf("BNE $%04X\n", m->pc + offset); } break; + case 0xD8: { + printf("CLD\n"); + } break; case 0xE0: { printf("CPX #$%02X\n", m->memory[m->pc++]); } break; + case 0xE6: { + printf("INC $%02X\n", m->memory[m->pc++]); + } break; case 0xE8: { printf("INX\n"); } break; case 0xE9: { printf("SBC #$%02X\n", m->memory[m->pc++]); } break; + case 0xEA: { + printf("NOP\n"); + } break; + case 0xEE: { + READ_ADDR(); + printf("INC $%04X\n", addr); + } break; case 0xF0: { int8_t offset = m->memory[m->pc++]; printf("BEQ $%04X\n", m->pc + offset); } break; + case 0xF8: { + printf("SED\n"); + } break; default: - fprintf(stderr, "unrecognized opcode: %x\n", op); + fprintf(stderr, "unrecognized opcode: %02X\n", op); exit(1); } } @@ -136,8 +261,8 @@ void mos6502_disassemble(MOS6502 *m, size_t ins_count) { void mos6502_free(MOS6502 m) { free(m.memory); } int main(int argc, char *argv[]) { - if (argc < 2) { - fprintf(stderr, "Usage: %s \n", argv[0]); + if (argc < 3) { + fprintf(stderr, "Usage: %s \n", argv[0]); return 1; } @@ -152,7 +277,7 @@ int main(int argc, char *argv[]) { m.memory[0x600 + i] = buffer[i]; } - mos6502_disassemble(&m, 103); + mos6502_disassemble(&m, atoi(argv[2])); mos6502_free(m); } \ No newline at end of file