mirror of
https://github.com/jborza/emu6502.git
synced 2024-06-26 06:29:28 +00:00
better handling of nestest
This commit is contained in:
parent
2b52c43605
commit
a2f4d4ef72
338
disassembler.c
338
disassembler.c
|
@ -3,184 +3,192 @@
|
||||||
#include "disassembler.h"
|
#include "disassembler.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
void disassemble_6502(byte* buffer, word pc) {
|
//returns the length of the disassembled line
|
||||||
printf("%04X ", pc);
|
|
||||||
|
char* disassemble_6502_to_string(byte* buffer, word pc) {
|
||||||
|
static char dasm_buffer[64];
|
||||||
byte* code = &buffer[pc];
|
byte* code = &buffer[pc];
|
||||||
int bytes = 1;
|
int bytes = 1;
|
||||||
char op[128] = "";
|
char op[32] = "";
|
||||||
switch (*code) {
|
switch (*code) {
|
||||||
|
case ADC_IMM: sprintf(op, "ADC #$%02X", code[1]); bytes = 2; break;
|
||||||
case ADC_IMM: sprintf(op, "ADC #$%02X", code[1]); bytes = 2; break;
|
case ADC_ZP: sprintf(op, "ADC $%02X", code[1]); bytes = 2; break;
|
||||||
case ADC_ZP: sprintf(op, "ADC $%02X", code[1]); bytes = 2; break;
|
case ADC_ZPX: sprintf(op, "ADC $%02X,X", code[1]); bytes = 2; break;
|
||||||
case ADC_ZPX: sprintf(op, "ADC $%02X,X", code[1]); bytes = 2; break;
|
case ADC_ABS: sprintf(op, "ADC $%02X%02X", code[2], code[1]); bytes = 3; break;
|
||||||
case ADC_ABS: sprintf(op, "ADC $%02X%02X", code[2], code[1]); bytes = 3; break;
|
case ADC_ABSX: sprintf(op, "ADC $%02X%02X,X", code[2], code[1]); bytes = 3; break;
|
||||||
case ADC_ABSX: sprintf(op, "ADC $%02X%02X,X", code[2], code[1]); bytes = 3; break;
|
case ADC_ABSY: sprintf(op, "ADC $%02X%02X,Y", code[2], code[1]); bytes = 3; break;
|
||||||
case ADC_ABSY: sprintf(op, "ADC $%02X%02X,Y", code[2], code[1]); bytes = 3; break;
|
case ADC_INDX: sprintf(op, "ADC ($%02X,X)", code[1]); bytes = 2; break;
|
||||||
case ADC_INDX: sprintf(op, "ADC ($%02X,X)", code[1]); bytes = 2; break;
|
case ADC_INDY: sprintf(op, "ADC ($%02X),Y", code[1]); bytes = 2; break;
|
||||||
case ADC_INDY: sprintf(op, "ADC ($%02X),Y", code[1]); bytes = 2; break;
|
case AND_IMM: sprintf(op, "AND #$%02X", code[1]); bytes = 2; break;
|
||||||
case AND_IMM: sprintf(op, "AND #$%02X", code[1]); bytes = 2; break;
|
case AND_ZP: sprintf(op, "AND $%02X", code[1]); bytes = 2; break;
|
||||||
case AND_ZP: sprintf(op, "AND $%02X", code[1]); bytes = 2; break;
|
case AND_ZPX: sprintf(op, "AND $%02X,X", code[1]); bytes = 2; break;
|
||||||
case AND_ZPX: sprintf(op, "AND $%02X,X", code[1]); bytes = 2; break;
|
case AND_ABS: sprintf(op, "AND $%02X%02X", code[2], code[1]); bytes = 3; break;
|
||||||
case AND_ABS: sprintf(op, "AND $%02X%02X", code[2], code[1]); bytes = 3; break;
|
case AND_ABSX: sprintf(op, "AND $%02X%02X,X", code[2], code[1]); bytes = 3; break;
|
||||||
case AND_ABSX: sprintf(op, "AND $%02X%02X,X", code[2], code[1]); bytes = 3; break;
|
case AND_ABSY: sprintf(op, "AND $%02X%02X,Y", code[2], code[1]); bytes = 3; break;
|
||||||
case AND_ABSY: sprintf(op, "AND $%02X%02X,Y", code[2], code[1]); bytes = 3; break;
|
case AND_INDX: sprintf(op, "AND ($%02X,X)", code[1]); bytes = 2; break;
|
||||||
case AND_INDX: sprintf(op, "AND ($%02X,X)", code[1]); bytes = 2; break;
|
case AND_INDY: sprintf(op, "AND ($%02X),Y", code[1]); bytes = 2; break;
|
||||||
case AND_INDY: sprintf(op, "AND ($%02X),Y", code[1]); bytes = 2; break;
|
case ASL_ACC: sprintf(op, "ASL A"); break;
|
||||||
case ASL_ACC: sprintf(op, "ASL A"); break;
|
case ASL_ZP: sprintf(op, "ASL $%02X", code[1]); bytes = 2; break;
|
||||||
case ASL_ZP: sprintf(op, "ASL $%02X", code[1]); bytes = 2; break;
|
case ASL_ZPX: sprintf(op, "ASL $%02X,X", code[1]); bytes = 2; break;
|
||||||
case ASL_ZPX: sprintf(op, "ASL $%02X,X", code[1]); bytes = 2; break;
|
case ASL_ABS: sprintf(op, "ASL $%02X%02X", code[2], code[1]); bytes = 3; break;
|
||||||
case ASL_ABS: sprintf(op, "ASL $%02X%02X", code[2], code[1]); bytes = 3; break;
|
case ASL_ABSX: sprintf(op, "ASL $%02X%02X,X", code[2], code[1]); bytes = 3; break;
|
||||||
case ASL_ABSX: sprintf(op, "ASL $%02X%02X,X", code[2], code[1]); bytes = 3; break;
|
case BCC_REL: sprintf(op, "BCC $%02X", code[1]); bytes = 2; break;
|
||||||
case BCC_REL: sprintf(op, "BCC $%02X", code[1]); bytes = 2; break;
|
case BCS_REL: sprintf(op, "BCS $%02X", code[1]); bytes = 2; break;
|
||||||
case BCS_REL: sprintf(op, "BCS $%02X", code[1]); bytes = 2; break;
|
case BEQ_REL: sprintf(op, "BEQ $%02X", code[1]); bytes = 2; break;
|
||||||
case BEQ_REL: sprintf(op, "BEQ $%02X", code[1]); bytes = 2; break;
|
case BMI_REL: sprintf(op, "BMI $%02X", code[1]); bytes = 2; break;
|
||||||
case BMI_REL: sprintf(op, "BMI $%02X", code[1]); bytes = 2; break;
|
case BNE_REL: sprintf(op, "BNE $%02X", code[1]); bytes = 2; break;
|
||||||
case BNE_REL: sprintf(op, "BNE $%02X", code[1]); bytes = 2; break;
|
case BPL_REL: sprintf(op, "BPL $%02X", code[1]); bytes = 2; break;
|
||||||
case BPL_REL: sprintf(op, "BPL $%02X", code[1]); bytes = 2; break;
|
case BVC_REL: sprintf(op, "BVC $%02X", code[1]); bytes = 2; break;
|
||||||
case BVC_REL: sprintf(op, "BVC $%02X", code[1]); bytes = 2; break;
|
case BVS_REL: sprintf(op, "BVS $%02X", code[1]); bytes = 2; break;
|
||||||
case BVS_REL: sprintf(op, "BVS $%02X", code[1]); bytes = 2; break;
|
case BIT_ZP: sprintf(op, "BIT $%02X", code[1]); bytes = 2; break;
|
||||||
case BIT_ZP: sprintf(op, "BIT $%02X", code[1]); bytes = 2; break;
|
case BIT_ABS: sprintf(op, "BIT $%02X%02X", code[2], code[1]); bytes = 3; break;
|
||||||
case BIT_ABS: sprintf(op, "BIT $%02X%02X", code[2], code[1]); bytes = 3; break;
|
case BRK: sprintf(op, "BRK"); break;
|
||||||
case BRK: sprintf(op, "BRK"); break;
|
case CLC: sprintf(op, "CLC"); break;
|
||||||
case CLC: sprintf(op, "CLC"); break;
|
case CLD: sprintf(op, "CLD"); break;
|
||||||
case CLD: sprintf(op, "CLD"); break;
|
case CLI: sprintf(op, "CLI"); break;
|
||||||
case CLI: sprintf(op, "CLI"); break;
|
case CLV: sprintf(op, "CLV"); break;
|
||||||
case CLV: sprintf(op, "CLV"); break;
|
case NOP: sprintf(op, "NOP"); break;
|
||||||
case NOP: sprintf(op, "NOP"); break;
|
case PHA: sprintf(op, "PHA"); break;
|
||||||
case PHA: sprintf(op, "PHA"); break;
|
case PLA: sprintf(op, "PLA"); break;
|
||||||
case PLA: sprintf(op, "PLA"); break;
|
case PHP: sprintf(op, "PHP"); break;
|
||||||
case PHP: sprintf(op, "PHP"); break;
|
case PLP: sprintf(op, "PLP"); break;
|
||||||
case PLP: sprintf(op, "PLP"); break;
|
case RTI: sprintf(op, "RTI"); break;
|
||||||
case RTI: sprintf(op, "RTI"); break;
|
case RTS: sprintf(op, "RTS"); break;
|
||||||
case RTS: sprintf(op, "RTS"); break;
|
case SEC: sprintf(op, "SEC"); break;
|
||||||
case SEC: sprintf(op, "SEC"); break;
|
case SED: sprintf(op, "SED"); break;
|
||||||
case SED: sprintf(op, "SED"); break;
|
case SEI: sprintf(op, "SEI"); break;
|
||||||
case SEI: sprintf(op, "SEI"); break;
|
case TAX: sprintf(op, "TAX"); break;
|
||||||
case TAX: sprintf(op, "TAX"); break;
|
case TXA: sprintf(op, "TXA"); break;
|
||||||
case TXA: sprintf(op, "TXA"); break;
|
case TAY: sprintf(op, "TAY"); break;
|
||||||
case TAY: sprintf(op, "TAY"); break;
|
case TYA: sprintf(op, "TYA"); break;
|
||||||
case TYA: sprintf(op, "TYA"); break;
|
case TSX: sprintf(op, "TSX"); break;
|
||||||
case TSX: sprintf(op, "TSX"); break;
|
case TXS: sprintf(op, "TXS"); break;
|
||||||
case TXS: sprintf(op, "TXS"); break;
|
case CMP_IMM: sprintf(op, "CMP #$%02X", code[1]); bytes = 2; break;
|
||||||
case CMP_IMM: sprintf(op, "CMP #$%02X", code[1]); bytes = 2; break;
|
case CMP_ZP: sprintf(op, "CMP $%02X", code[1]); bytes = 2; break;
|
||||||
case CMP_ZP: sprintf(op, "CMP $%02X", code[1]); bytes = 2; break;
|
case CMP_ZPX: sprintf(op, "CMP $%02X,X", code[1]); bytes = 2; break;
|
||||||
case CMP_ZPX: sprintf(op, "CMP $%02X,X", code[1]); bytes = 2; break;
|
case CMP_ABS: sprintf(op, "CMP $%02X%02X", code[2], code[1]); bytes = 3; break;
|
||||||
case CMP_ABS: sprintf(op, "CMP $%02X%02X", code[2], code[1]); bytes = 3; break;
|
case CMP_ABSX: sprintf(op, "CMP $%02X%02X,X", code[2], code[1]); bytes = 3; break;
|
||||||
case CMP_ABSX: sprintf(op, "CMP $%02X%02X,X", code[2], code[1]); bytes = 3; break;
|
case CMP_ABSY: sprintf(op, "CMP $%02X%02X,Y", code[2], code[1]); bytes = 3; break;
|
||||||
case CMP_ABSY: sprintf(op, "CMP $%02X%02X,Y", code[2], code[1]); bytes = 3; break;
|
case CMP_INDX: sprintf(op, "CMP ($%02X,X)", code[1]); bytes = 2; break;
|
||||||
case CMP_INDX: sprintf(op, "CMP ($%02X,X)", code[1]); bytes = 2; break;
|
case CMP_INDY: sprintf(op, "CMP ($%02X),Y", code[1]); bytes = 2; break;
|
||||||
case CMP_INDY: sprintf(op, "CMP ($%02X),Y", code[1]); bytes = 2; break;
|
case CPX_IMM: sprintf(op, "CPX #$%02X", code[1]); bytes = 2; break;
|
||||||
case CPX_IMM: sprintf(op, "CPX #$%02X", code[1]); bytes = 2; break;
|
case CPX_ZP: sprintf(op, "CPX $%02X", code[1]); bytes = 2; break;
|
||||||
case CPX_ZP: sprintf(op, "CPX $%02X", code[1]); bytes = 2; break;
|
case CPX_ABS: sprintf(op, "CPX $%02X%02X", code[2], code[1]); bytes = 3; break;
|
||||||
case CPX_ABS: sprintf(op, "CPX $%02X%02X", code[2], code[1]); bytes = 3; break;
|
case CPY_IMM: sprintf(op, "CPY #$%02X", code[1]); bytes = 2; break;
|
||||||
case CPY_IMM: sprintf(op, "CPY #$%02X", code[1]); bytes = 2; break;
|
case CPY_ZP: sprintf(op, "CPY $%02X", code[1]); bytes = 2; break;
|
||||||
case CPY_ZP: sprintf(op, "CPY $%02X", code[1]); bytes = 2; break;
|
case CPY_ABS: sprintf(op, "CPY $%02X%02X", code[2], code[1]); bytes = 3; break;
|
||||||
case CPY_ABS: sprintf(op, "CPY $%02X%02X", code[2], code[1]); bytes = 3; break;
|
case DEC_ZP: sprintf(op, "DEC $%02X", code[1]); bytes = 2; break;
|
||||||
case DEC_ZP: sprintf(op, "DEC $%02X", code[1]); bytes = 2; break;
|
case DEC_ZPX: sprintf(op, "DEC $%02X,X", code[1]); bytes = 2; break;
|
||||||
case DEC_ZPX: sprintf(op, "DEC $%02X,X", code[1]); bytes = 2; break;
|
case DEC_ABS: sprintf(op, "DEC $%02X%02X", code[2], code[1]); bytes = 3; break;
|
||||||
case DEC_ABS: sprintf(op, "DEC $%02X%02X", code[2], code[1]); bytes = 3; break;
|
case DEC_ABSX: sprintf(op, "DEC $%02X%02X,X", code[2], code[1]); bytes = 3; break;
|
||||||
case DEC_ABSX: sprintf(op, "DEC $%02X%02X,X", code[2], code[1]); bytes = 3; break;
|
case DEX: sprintf(op, "DEX"); break;
|
||||||
case DEX: sprintf(op, "DEX"); break;
|
case DEY: sprintf(op, "DEY"); break;
|
||||||
case DEY: sprintf(op, "DEY"); break;
|
case INX: sprintf(op, "INX"); break;
|
||||||
case INX: sprintf(op, "INX"); break;
|
case INY: sprintf(op, "INY"); break;
|
||||||
case INY: sprintf(op, "INY"); break;
|
case EOR_IMM: sprintf(op, "EOR #$%02X", code[1]); bytes = 2; break;
|
||||||
case EOR_IMM: sprintf(op, "EOR #$%02X", code[1]); bytes = 2; break;
|
case EOR_ZP: sprintf(op, "EOR $%02X", code[1]); bytes = 2; break;
|
||||||
case EOR_ZP: sprintf(op, "EOR $%02X", code[1]); bytes = 2; break;
|
case EOR_ZPX: sprintf(op, "EOR $%02X,X", code[1]); bytes = 2; break;
|
||||||
case EOR_ZPX: sprintf(op, "EOR $%02X,X", code[1]); bytes = 2; break;
|
case EOR_ABS: sprintf(op, "EOR $%02X%02X", code[2], code[1]); bytes = 3; break;
|
||||||
case EOR_ABS: sprintf(op, "EOR $%02X%02X", code[2], code[1]); bytes = 3; break;
|
case EOR_ABSX: sprintf(op, "EOR $%02X%02X,X", code[2], code[1]); bytes = 3; break;
|
||||||
case EOR_ABSX: sprintf(op, "EOR $%02X%02X,X", code[2], code[1]); bytes = 3; break;
|
case EOR_ABSY: sprintf(op, "EOR $%02X%02X,Y", code[2], code[1]); bytes = 3; break;
|
||||||
case EOR_ABSY: sprintf(op, "EOR $%02X%02X,Y", code[2], code[1]); bytes = 3; break;
|
case EOR_INDX: sprintf(op, "EOR ($%02X,X)", code[1]); bytes = 2; break;
|
||||||
case EOR_INDX: sprintf(op, "EOR ($%02X,X)", code[1]); bytes = 2; break;
|
case EOR_INDY: sprintf(op, "EOR ($%02X),Y", code[1]); bytes = 2; break;
|
||||||
case EOR_INDY: sprintf(op, "EOR ($%02X),Y", code[1]); bytes = 2; break;
|
case INC_ZP: sprintf(op, "INC $%02X", code[1]); bytes = 2; break;
|
||||||
case INC_ZP: sprintf(op, "INC $%02X", code[1]); bytes = 2; break;
|
case INC_ZPX: sprintf(op, "INC $%02X,X", code[1]); bytes = 2; break;
|
||||||
case INC_ZPX: sprintf(op, "INC $%02X,X", code[1]); bytes = 2; break;
|
case INC_ABS: sprintf(op, "INC $%02X%02X", code[2], code[1]); bytes = 3; break;
|
||||||
case INC_ABS: sprintf(op, "INC $%02X%02X", code[2], code[1]); bytes = 3; break;
|
case INC_ABSX: sprintf(op, "INC $%02X%02X,X", code[2], code[1]); bytes = 3; break;
|
||||||
case INC_ABSX: sprintf(op, "INC $%02X%02X,X", code[2], code[1]); bytes = 3; break;
|
case JMP_ABS: sprintf(op, "JMP $%02X%02X", code[2], code[1]); bytes = 3; break;
|
||||||
case JMP_ABS: sprintf(op, "JMP $%02X%02X", code[2], code[1]); bytes = 3; break;
|
case JMP_IND: sprintf(op, "JMP ($%02X%02X)", code[2], code[1]); bytes = 3; break;
|
||||||
case JMP_IND: sprintf(op, "JMP ($%02X%02X)", code[2], code[1]); bytes = 3; break;
|
case JSR_ABS: sprintf(op, "JSR $%02X%02X", code[2], code[1]); bytes = 3; break;
|
||||||
case JSR_ABS: sprintf(op, "JSR $%02X%02X", code[2], code[1]); bytes = 3; break;
|
case LDA_IMM: sprintf(op, "LDA #$%02X", code[1]); bytes = 2; break;
|
||||||
case LDA_IMM: sprintf(op, "LDA #$%02X", code[1]); bytes = 2; break;
|
case LDA_ZP: sprintf(op, "LDA $%02X", code[1]); bytes = 2; break;
|
||||||
case LDA_ZP: sprintf(op, "LDA $%02X", code[1]); bytes = 2; break;
|
case LDA_ZPX: sprintf(op, "LDA $%02X,X", code[1]); bytes = 2; break;
|
||||||
case LDA_ZPX: sprintf(op, "LDA $%02X,X", code[1]); bytes = 2; break;
|
case LDA_ABS: sprintf(op, "LDA $%02X%02X", code[2], code[1]); bytes = 3; break;
|
||||||
case LDA_ABS: sprintf(op, "LDA $%02X%02X", code[2], code[1]); bytes = 3; break;
|
case LDA_ABSX: sprintf(op, "LDA $%02X%02X,X", code[2], code[1]); bytes = 3; break;
|
||||||
case LDA_ABSX: sprintf(op, "LDA $%02X%02X,X", code[2], code[1]); bytes = 3; break;
|
case LDA_ABSY: sprintf(op, "LDA $%02X%02X,Y", code[2], code[1]); bytes = 3; break;
|
||||||
case LDA_ABSY: sprintf(op, "LDA $%02X%02X,Y", code[2], code[1]); bytes = 3; break;
|
case LDA_INDX: sprintf(op, "LDA ($%02X,X)", code[1]); bytes = 2; break;
|
||||||
case LDA_INDX: sprintf(op, "LDA ($%02X,X)", code[1]); bytes = 2; break;
|
case LDA_INDY: sprintf(op, "LDA ($%02X),Y", code[1]); bytes = 2; break;
|
||||||
case LDA_INDY: sprintf(op, "LDA ($%02X),Y", code[1]); bytes = 2; break;
|
case LDX_IMM: sprintf(op, "LDX #$%02X", code[1]); bytes = 2; break;
|
||||||
case LDX_IMM: sprintf(op, "LDX #$%02X", code[1]); bytes = 2; break;
|
case LDX_ZP: sprintf(op, "LDX $%02X", code[1]); bytes = 2; break;
|
||||||
case LDX_ZP: sprintf(op, "LDX $%02X", code[1]); bytes = 2; break;
|
case LDX_ZPY: sprintf(op, "LDX $%02X,Y", code[1]); bytes = 2; break;
|
||||||
case LDX_ZPY: sprintf(op, "LDX $%02X,Y", code[1]); bytes = 2; break;
|
case LDX_ABS: sprintf(op, "LDX $%02X%02X", code[2], code[1]); bytes = 3; break;
|
||||||
case LDX_ABS: sprintf(op, "LDX $%02X%02X", code[2], code[1]); bytes = 3; break;
|
case LDX_ABSY: sprintf(op, "LDX $%02X%02X,Y", code[2], code[1]); bytes = 3; break;
|
||||||
case LDX_ABSY: sprintf(op, "LDX $%02X%02X,Y", code[2], code[1]); bytes = 3; break;
|
case LDY_IMM: sprintf(op, "LDY #$%02X", code[1]); bytes = 2; break;
|
||||||
case LDY_IMM: sprintf(op, "LDY #$%02X", code[1]); bytes = 2; break;
|
case LDY_ZP: sprintf(op, "LDY $%02X", code[1]); bytes = 2; break;
|
||||||
case LDY_ZP: sprintf(op, "LDY $%02X", code[1]); bytes = 2; break;
|
case LDY_ZPX: sprintf(op, "LDY $%02X,X", code[1]); bytes = 2; break;
|
||||||
case LDY_ZPX: sprintf(op, "LDY $%02X,X", code[1]); bytes = 2; break;
|
case LDY_ABS: sprintf(op, "LDY $%02X%02X", code[2], code[1]); bytes = 3; break;
|
||||||
case LDY_ABS: sprintf(op, "LDY $%02X%02X", code[2], code[1]); bytes = 3; break;
|
case LDY_ABSX: sprintf(op, "LDY $%02X%02X,X", code[2], code[1]); bytes = 3; break;
|
||||||
case LDY_ABSX: sprintf(op, "LDY $%02X%02X,X", code[2], code[1]); bytes = 3; break;
|
case LSR_ACC: sprintf(op, "LSR A"); break;
|
||||||
case LSR_ACC: sprintf(op, "LSR A"); break;
|
case LSR_ZP: sprintf(op, "LSR $%02X", code[1]); bytes = 2; break;
|
||||||
case LSR_ZP: sprintf(op, "LSR $%02X", code[1]); bytes = 2; break;
|
case LSR_ZPX: sprintf(op, "LSR $%02X,X", code[1]); bytes = 2; break;
|
||||||
case LSR_ZPX: sprintf(op, "LSR $%02X,X", code[1]); bytes = 2; break;
|
case LSR_ABS: sprintf(op, "LSR $%02X%02X", code[2], code[1]); bytes = 3; break;
|
||||||
case LSR_ABS: sprintf(op, "LSR $%02X%02X", code[2], code[1]); bytes = 3; break;
|
case LSR_ABSX: sprintf(op, "LSR $%02X%02X,X", code[2], code[1]); bytes = 3; break;
|
||||||
case LSR_ABSX: sprintf(op, "LSR $%02X%02X,X", code[2], code[1]); bytes = 3; break;
|
case ORA_IMM: sprintf(op, "ORA #$%02X", code[1]); bytes = 2; break;
|
||||||
case ORA_IMM: sprintf(op, "ORA #$%02X", code[1]); bytes = 2; break;
|
case ORA_ZP: sprintf(op, "ORA $%02X", code[1]); bytes = 2; break;
|
||||||
case ORA_ZP: sprintf(op, "ORA $%02X", code[1]); bytes = 2; break;
|
case ORA_ZPX: sprintf(op, "ORA $%02X,X", code[1]); bytes = 2; break;
|
||||||
case ORA_ZPX: sprintf(op, "ORA $%02X,X", code[1]); bytes = 2; break;
|
case ORA_ABS: sprintf(op, "ORA $%02X%02X", code[2], code[1]); bytes = 3; break;
|
||||||
case ORA_ABS: sprintf(op, "ORA $%02X%02X", code[2], code[1]); bytes = 3; break;
|
case ORA_ABSX: sprintf(op, "ORA $%02X%02X,X", code[2], code[1]); bytes = 3; break;
|
||||||
case ORA_ABSX: sprintf(op, "ORA $%02X%02X,X", code[2], code[1]); bytes = 3; break;
|
case ORA_ABSY: sprintf(op, "ORA $%02X%02X,Y", code[2], code[1]); bytes = 3; break;
|
||||||
case ORA_ABSY: sprintf(op, "ORA $%02X%02X,Y", code[2], code[1]); bytes = 3; break;
|
case ORA_INDX: sprintf(op, "ORA ($%02X,X)", code[1]); bytes = 2; break;
|
||||||
case ORA_INDX: sprintf(op, "ORA ($%02X,X)", code[1]); bytes = 2; break;
|
case ORA_INDY: sprintf(op, "ORA ($%02X),Y", code[1]); bytes = 2; break;
|
||||||
case ORA_INDY: sprintf(op, "ORA ($%02X),Y", code[1]); bytes = 2; break;
|
case ROL_ACC: sprintf(op, "ROL A"); break;
|
||||||
case ROL_ACC: sprintf(op, "ROL A"); break;
|
case ROL_ZP: sprintf(op, "ROL $%02X", code[1]); bytes = 2; break;
|
||||||
case ROL_ZP: sprintf(op, "ROL $%02X", code[1]); bytes = 2; break;
|
case ROL_ZPX: sprintf(op, "ROL $%02X,X", code[1]); bytes = 2; break;
|
||||||
case ROL_ZPX: sprintf(op, "ROL $%02X,X", code[1]); bytes = 2; break;
|
case ROL_ABS: sprintf(op, "ROL $%02X%02X", code[2], code[1]); bytes = 3; break;
|
||||||
case ROL_ABS: sprintf(op, "ROL $%02X%02X", code[2], code[1]); bytes = 3; break;
|
case ROL_ABSX: sprintf(op, "ROL $%02X%02X,X", code[2], code[1]); bytes = 3; break;
|
||||||
case ROL_ABSX: sprintf(op, "ROL $%02X%02X,X", code[2], code[1]); bytes = 3; break;
|
case ROR_ACC: sprintf(op, "ROR A"); break;
|
||||||
case ROR_ACC: sprintf(op, "ROR A"); break;
|
case ROR_ZP: sprintf(op, "ROR $%02X", code[1]); bytes = 2; break;
|
||||||
case ROR_ZP: sprintf(op, "ROR $%02X", code[1]); bytes = 2; break;
|
case ROR_ZPX: sprintf(op, "ROR $%02X,X", code[1]); bytes = 2; break;
|
||||||
case ROR_ZPX: sprintf(op, "ROR $%02X,X", code[1]); bytes = 2; break;
|
case ROR_ABS: sprintf(op, "ROR $%02X%02X", code[2], code[1]); bytes = 3; break;
|
||||||
case ROR_ABS: sprintf(op, "ROR $%02X%02X", code[2], code[1]); bytes = 3; break;
|
case ROR_ABSX: sprintf(op, "ROR $%02X%02X,X", code[2], code[1]); bytes = 3; break;
|
||||||
case ROR_ABSX: sprintf(op, "ROR $%02X%02X,X", code[2], code[1]); bytes = 3; break;
|
case SBC_IMM: sprintf(op, "SBC #$%02X", code[1]); bytes = 2; break;
|
||||||
case SBC_IMM: sprintf(op, "SBC #$%02X", code[1]); bytes = 2; break;
|
case SBC_ZP: sprintf(op, "SBC $%02X", code[1]); bytes = 2; break;
|
||||||
case SBC_ZP: sprintf(op, "SBC $%02X", code[1]); bytes = 2; break;
|
case SBC_ZPX: sprintf(op, "SBC $%02X,X", code[1]); bytes = 2; break;
|
||||||
case SBC_ZPX: sprintf(op, "SBC $%02X,X", code[1]); bytes = 2; break;
|
case SBC_ABS: sprintf(op, "SBC $%02X%02X", code[2], code[1]); bytes = 3; break;
|
||||||
case SBC_ABS: sprintf(op, "SBC $%02X%02X", code[2], code[1]); bytes = 3; break;
|
case SBC_ABSX: sprintf(op, "SBC $%02X%02X,X", code[2], code[1]); bytes = 3; break;
|
||||||
case SBC_ABSX: sprintf(op, "SBC $%02X%02X,X", code[2], code[1]); bytes = 3; break;
|
case SBC_ABSY: sprintf(op, "SBC $%02X%02X,Y", code[2], code[1]); bytes = 3; break;
|
||||||
case SBC_ABSY: sprintf(op, "SBC $%02X%02X,Y", code[2], code[1]); bytes = 3; break;
|
case SBC_INDX: sprintf(op, "SBC ($%02X,X)", code[1]); bytes = 2; break;
|
||||||
case SBC_INDX: sprintf(op, "SBC ($%02X,X)", code[1]); bytes = 2; break;
|
case SBC_INDY: sprintf(op, "SBC ($%02X),Y", code[1]); bytes = 2; break;
|
||||||
case SBC_INDY: sprintf(op, "SBC ($%02X),Y", code[1]); bytes = 2; break;
|
case STA_ZP: sprintf(op, "STA $%02X", code[1]); bytes = 2; break;
|
||||||
case STA_ZP: sprintf(op, "STA $%02X", code[1]); bytes = 2; break;
|
case STA_ZPX: sprintf(op, "STA $%02X,X", code[1]); bytes = 2; break;
|
||||||
case STA_ZPX: sprintf(op, "STA $%02X,X", code[1]); bytes = 2; break;
|
case STA_ABS: sprintf(op, "STA $%02X%02X", code[2], code[1]); bytes = 3; break;
|
||||||
case STA_ABS: sprintf(op, "STA $%02X%02X", code[2], code[1]); bytes = 3; break;
|
case STA_ABSX: sprintf(op, "STA $%02X%02X,X", code[2], code[1]); bytes = 3; break;
|
||||||
case STA_ABSX: sprintf(op, "STA $%02X%02X,X", code[2], code[1]); bytes = 3; break;
|
case STA_ABSY: sprintf(op, "STA $%02X%02X,Y", code[2], code[1]); bytes = 3; break;
|
||||||
case STA_ABSY: sprintf(op, "STA $%02X%02X,Y", code[2], code[1]); bytes = 3; break;
|
case STA_INDX: sprintf(op, "STA ($%02X,X)", code[1]); bytes = 2; break;
|
||||||
case STA_INDX: sprintf(op, "STA ($%02X,X)", code[1]); bytes = 2; break;
|
case STA_INDY: sprintf(op, "STA ($%02X),Y", code[1]); bytes = 2; break;
|
||||||
case STA_INDY: sprintf(op, "STA ($%02X),Y", code[1]); bytes = 2; break;
|
case STX_ZP: sprintf(op, "STX $%02X", code[1]); bytes = 2; break;
|
||||||
case STX_ZP: sprintf(op, "STX $%02X", code[1]); bytes = 2; break;
|
case STX_ZPY: sprintf(op, "STX $%02X,Y", code[1]); bytes = 2; break;
|
||||||
case STX_ZPY: sprintf(op, "STX $%02X,Y", code[1]); bytes = 2; break;
|
case STX_ABS: sprintf(op, "STX $%02X%02X", code[2], code[1]); bytes = 3; break;
|
||||||
case STX_ABS: sprintf(op, "STX $%02X%02X", code[2], code[1]); bytes = 3; break;
|
case STY_ZP: sprintf(op, "STY $%02X", code[1]); bytes = 2; break;
|
||||||
case STY_ZP: sprintf(op, "STY $%02X", code[1]); bytes = 2; break;
|
case STY_ZPX: sprintf(op, "STY $%02X,X", code[1]); bytes = 2; break;
|
||||||
case STY_ZPX: sprintf(op, "STY $%02X,X", code[1]); bytes = 2; break;
|
case STY_ABS: sprintf(op, "STY $%02X%02X", code[2], code[1]); bytes = 3; break;
|
||||||
case STY_ABS: sprintf(op, "STY $%02X%02X", code[2], code[1]); bytes = 3; break;
|
|
||||||
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
printf("UNKNOWN %02x", *code);
|
sprintf(op, "UNKNOWN %02x", *code);
|
||||||
}
|
}
|
||||||
|
|
||||||
//print opcode
|
char arg1[3];
|
||||||
printf("%02X ", *code);
|
|
||||||
|
|
||||||
if (bytes > 1) {
|
if (bytes > 1) {
|
||||||
printf("%02x ", code[1]);
|
sprintf(arg1,"%02X", code[1]);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
printf(" ");
|
sprintf(arg1," ");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char arg2[3];
|
||||||
if (bytes > 2) {
|
if (bytes > 2) {
|
||||||
printf("%02x ", code[2]);
|
sprintf(arg2,"%02X", code[2]);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
printf(" ");
|
sprintf(arg2, " ");
|
||||||
}
|
}
|
||||||
printf(" %s", op);
|
|
||||||
|
sprintf(dasm_buffer, "%04X %02X %s %s %s", pc, *code, arg1, arg2, op);
|
||||||
|
return dasm_buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
void disassemble_6502(byte* buffer, word pc) {
|
||||||
|
|
||||||
|
printf("%s", disassemble_6502_to_string(buffer, pc));
|
||||||
}
|
}
|
|
@ -1,2 +1,3 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
void disassemble_6502(byte* buffer, word pc);
|
void disassemble_6502(byte* buffer, word pc);
|
||||||
|
char* disassemble_6502_to_string(byte* buffer, word pc);
|
38
emu6502.c
38
emu6502.c
|
@ -39,45 +39,15 @@ void run_nestest() {
|
||||||
memcpy(state.memory + 0x8000, bin, NESTEST_SIZE);
|
memcpy(state.memory + 0x8000, bin, NESTEST_SIZE);
|
||||||
state.pc = NESTEST_DST;
|
state.pc = NESTEST_DST;
|
||||||
do{
|
do{
|
||||||
disassemble_6502(state.memory, state.pc);
|
char* dasm = disassemble_6502_to_string(state.memory, state.pc);
|
||||||
|
printf("%-50s A:%02X X:%02X Y:%02X P:%02X SP:%02X\n", dasm, state.a, state.x, state.y, flags_as_byte(&state), state.sp);
|
||||||
emulate_6502_op(&state);
|
emulate_6502_op(&state);
|
||||||
printf(" A:%02X X:%02X Y:%02X P:%02X SP:%02X\n", state.a, state.x, state.y, flags_as_byte(&state), state.sp);
|
|
||||||
} while (state.flags.b != 1);
|
} while (state.flags.b != 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
run_nestest();
|
//run_nestest();
|
||||||
//run_tests();
|
run_tests();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//void emulate() {
|
|
||||||
// State6502 state;
|
|
||||||
// memset(&state.memory, 0, sizeof(State6502));
|
|
||||||
// print_state(&state);
|
|
||||||
// clear_state(&state);
|
|
||||||
// byte* memory = read_game();
|
|
||||||
// //state.memory = read_game();
|
|
||||||
// state.memory = malloc(4096);
|
|
||||||
// memset(state.memory, 0, sizeof(byte) * 4096);
|
|
||||||
// state.memory[0] = 0xEA;
|
|
||||||
// state.memory[1] = 0x05; //ORA $a0
|
|
||||||
// state.memory[2] = 0xA0;
|
|
||||||
// state.memory[3] = 0xEA; //NOP
|
|
||||||
// state.memory[4] = 0x09; //ORA #$ff
|
|
||||||
// state.memory[5] = 0xff;
|
|
||||||
// state.memory[6] = 0xA9; //LDA
|
|
||||||
// state.memory[7] = 0x00; //0
|
|
||||||
// state.memory[8] = 0x0D; //ORA $1234
|
|
||||||
// state.memory[9] = 0x34;
|
|
||||||
// state.memory[10] = 0x02;
|
|
||||||
// state.memory[0xA0] = 0x13;
|
|
||||||
// state.memory[0x0234] = 0xAA;
|
|
||||||
//
|
|
||||||
// for (int i = 0; i < 10; i++) {
|
|
||||||
// print_all(&state);
|
|
||||||
// disassemble_6502(state.memory, state.pc);
|
|
||||||
// emulate_6502_op(&state);
|
|
||||||
// }
|
|
||||||
//}
|
|
Loading…
Reference in New Issue
Block a user