disassemble even more instructions
This commit is contained in:
137
mos6502.c
137
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 <path>\n", argv[0]);
|
||||
if (argc < 3) {
|
||||
fprintf(stderr, "Usage: %s <path> <ins count>\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);
|
||||
}
|
||||
Reference in New Issue
Block a user