1
0
mirror of https://github.com/jborza/emu6502.git synced 2024-06-07 16:16:37 +00:00
emu6502/disassembler.c

50 lines
1.5 KiB
C
Raw Normal View History

2019-04-13 23:50:46 +00:00
#include "types.h"
#include "opcodes.h"
2019-04-14 08:57:25 +00:00
#include "disassembler.h"
2019-04-14 11:24:02 +00:00
#include <stdio.h>
2019-04-13 23:50:46 +00:00
void disassemble_6502(byte* buffer, word pc) {
printf("%04d ", pc);
byte* code = &buffer[pc];
2019-04-14 11:24:02 +00:00
int bytes = 1;
char op[128];
2019-04-13 23:50:46 +00:00
switch (*code) {
2019-04-14 11:24:02 +00:00
case 0x00: sprintf(op,"BRK"); break;
case ORA_IMM: sprintf(op, "ORA #$%02x", code[1]); break;
case ORA_ZP: sprintf(op, "ORA $%02x", code[1]); break;
case ORA_ZPX: sprintf(op, "ORA $%02x,X", code[1]); break;
case ORA_ABS: sprintf(op, "ORA $%02x%02x", code[2], code[1]); break;
case ORA_ABSX: sprintf(op, "ORA $%02x%02x,X", code[2], code[1]); break;
case ORA_ABSY: sprintf(op, "ORA $%02x%02x,Y", code[2], code[1]); break;
case ORA_INDX: sprintf(op, "ORA ($%02x,X)", code[1]); break;
case ORA_INDY: sprintf(op, "ORA ($%02x),Y", code[1]); break;
case LDA_IMM: sprintf(op, "LDA #$%02x", code[1]); break;
case LDA_ZP: sprintf(op, "LDA $%02x", code[1]); break;
case LDA_ZPX: sprintf(op, "LDA $%02x,X", code[1]); break;
case LDA_ABS: sprintf(op, "LDA $%02x%02x", code[2], code[1]); break;
case LDA_ABSX: sprintf(op, "LDA $%02x%02x,X", code[2], code[1]); break;
case LDA_ABSY: sprintf(op, "LDA $%02x%02x,Y", code[2], code[1]); break;
case LDA_INDX: sprintf(op, "LDA ($%02x,X)", code[1]); break;
case LDA_INDY: sprintf(op, "LDA ($%02x),Y", code[1]); break;
2019-04-13 23:50:46 +00:00
case 0xEA: printf("NOP"); break;
default:
printf("UNKNOWN %02x", *code);
}
2019-04-14 11:24:02 +00:00
if (bytes > 1) {
printf("%02x ", code[1]);
}
else {
printf(" ");
}
if (bytes > 2) {
printf("%02x ", code[2]);
}
else {
printf(" ");
}
printf(op);
2019-04-13 23:50:46 +00:00
printf("\n");
}