From 12d1dc6ff1e3535008d7490fd0a7782f731bafb7 Mon Sep 17 00:00:00 2001 From: "Raimon @ quifisraimon" Date: Mon, 21 Sep 2026 12:52:55 +0200 Subject: [PATCH] =?UTF-8?q?-=20[NEW]=20Configuraci=C3=B3=20per=20a=20compi?= =?UTF-8?q?lar=20i=20depurar=20des=20de=20vscode=20-=20[FIX]=20Meimades=20?= =?UTF-8?q?per=20a=20que=20es=20calle=20el=20compilaor=20al=20dir-li=20-Wa?= =?UTF-8?q?ll=20-=20[NEW]=20Reestructurats=20els=20simbols,=206502dis=20pr?= =?UTF-8?q?obablement=20acabe=20desapareguent=20-=20[NEW]=20Reactivats=20e?= =?UTF-8?q?ls=20breakpoints=20i=20next=20(pas=20a=20pas=20sense=20entrar?= =?UTF-8?q?=20en=20subrutines)=20-=20[NEW]=20Nou=20motor=20de=20desensambl?= =?UTF-8?q?at=20-=20[NEW]=20Ja=20es=20mostren=20tots=20els=20simbols=20en?= =?UTF-8?q?=20el=20desensamblat=20-=20[NEW]=20Syntax=20colorets=20en=20el?= =?UTF-8?q?=20desensamblat?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/launch.json | 16 ++++ .vscode/tasks.json | 14 ++++ source/6502debugger.cpp | 96 ++++++++++++++++++----- source/6502debugger.h | 5 ++ source/6502dis.cpp | 163 +++++++++++++++++----------------------- source/6502dis.h | 17 +++-- source/main.cpp | 3 +- source/pia.cpp | 2 +- source/rom.cpp | 2 +- 9 files changed, 198 insertions(+), 120 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 .vscode/tasks.json diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..74895de --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,16 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Debug", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/atari2600_debug", + "args": [], + "cwd": "${workspaceFolder}", + "stopAtEntry": false, + "MIMode": "gdb", + "preLaunchTask": "Build Debug", + } + ] +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..ad96818 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,14 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "Build Debug", + "type": "shell", + "command": "lagueirto", + "args": [ + "linux_debug" + ], + "problemMatcher": "$gcc" + } + ] +} \ No newline at end of file diff --git a/source/6502debugger.cpp b/source/6502debugger.cpp index 0d077ef..b4cf5f9 100644 --- a/source/6502debugger.cpp +++ b/source/6502debugger.cpp @@ -269,8 +269,8 @@ namespace m6502debugger if (chrx>=midx+2 && chry>=sym_y+1) { const int line = chry-(sym_y+1); - if (line0) { + ui::printtxt(column,line, opcode_prefix, colors[1]); + column += strlen(opcode_prefix); + } + + char buffer[256]; + uint16_t value = 0; + const uint8_t len = m6502::opcodes::addressingModes[op.addrMode].length; + if (len>1) { + value = mem::read(address+1); + if (len>2) value |= (mem::read(address+2) << 8); + + if (op.addrMode != m6502::opcodes::amImmediate && op.addrMode != m6502::opcodes::amRelative && + ( m6502::opcodes::instructions[op.instr].group == m6502::opcodes::fgLoadStore || m6502::opcodes::instructions[op.instr].group == m6502::opcodes::fgJumpCall )) { + if (m6502dis::symbols::get(value)[0]!=0) { + sprintf(buffer, "%s", m6502dis::symbols::get(value)); + ui::printtxt(column,line, buffer, colors[2]); + column += strlen(buffer); + } + } + if (buffer[0] == 0) { + if (len==3) { + value |= (mem::read(address+2) << 8); + sprintf(buffer, "$%04x", value); + } else if (len==2) { + if (op.addrMode == m6502::opcodes::amRelative) { + sprintf(buffer, "%hhd", value); + } else { + sprintf(buffer, "$%02x", value); + } + } + ui::printtxt(column,line, buffer, colors[3]); + column += strlen(buffer); + } + } + + if (strlen(opcode_postfix)>0) { + ui::printtxt(column,line, opcode_postfix, colors[1]); + //column += strlen(opcode_prefix); + } + } + void printDissasemblerLine(const uint16_t address, const int line, const bool heuristics=false) { const bool isMemory = mem::debug::getInfo(address).memType & mdtMemory; + bool isConfirmedInstruction = true; uint8_t colors[4] = { COLOR_RED, COLOR_CYAN, COLOR_WHITE, COLOR_WHITE}; const uint8_t tag = tags[address]; - if ( !(tag & (MEMTAG_TINST | MEMTAG_TREPEAT)) ) colors[3]=COLOR_GRAY; + if ( !(tag & (MEMTAG_TINST | MEMTAG_TREPEAT)) ) { colors[3]=COLOR_GRAY; isConfirmedInstruction = false; } if ( !(tag & MEMTAG_TOUCHED) ) colors[1]=COLOR_GRAY; if (atari2600::is_paused() && (address == m6502::getPC())) { @@ -454,7 +514,7 @@ namespace m6502debugger if (!isMemory) return; if ( (tag & MEMTAG_INST) || heuristics ) { - const char *sym = m6502dis::getSymbol(address); + const char *sym = m6502dis::symbols::get(address); if (sym[0]!=0) ui::printtxt(7,line, sym, COLOR_YELLOW); const int opcodesize = m6502dis::getOpcodeSize(address); @@ -465,7 +525,8 @@ namespace m6502debugger } ui::printtxt(19,line, m6502dis::getOpcode(address), colors[2]); - ui::printtxt(31,line, m6502dis::getAsm(address), colors[3]); + //ui::printtxt(31,line, m6502dis::getAsm(address), colors[3]); + printAssemblerLine(address, line, isConfirmedInstruction); } else { ui::printrect(19,line,2,1,COLOR_GRAY); ui::printtxt(19,line, tohex(mem::read(address),2), COLOR_WHITE); @@ -719,18 +780,18 @@ namespace m6502debugger ui::printtxt(midx+3,sym_y, "SYMBOLS:", COLOR_WHITE); ui::setoffset(midx+1, sym_y+1); - const int num_symbols = m6502dis::getNumSymbols(); + const int num_symbols = m6502dis::symbols::count(); for (int i=0;i=sym_h-2) break; uint8_t colors[2] = {COLOR_GRAY, COLOR_WHITE}; - const uint16_t address = m6502dis::getSymbolAddress(i); + const uint16_t address = m6502dis::symbols::address(i); if (address==cursor) { ui::printrect(0,line,23,1,COLOR_BLUE); colors[0]=colors[1]=COLOR_YELLOW; } ui::printtxt(1, i, tohex(address,4), colors[0]); - ui::printtxt(6, i, m6502dis::getSymbol(address), colors[1]); + ui::printtxt(6, i, m6502dis::symbols::get(address), colors[1]); } @@ -864,11 +925,11 @@ namespace m6502debugger uint8_t break_type = 1; if (cmd[0]!=0) { if (strcmp(cmd, "x")==0 || strcmp(cmd, "exec")==0) { - break_type = 1; + break_type = BREAKPOINT_EXECUTE; } else if (strcmp(cmd, "r")==0 || strcmp(cmd, "read")==0) { - break_type = 2; + break_type = BREAKPOINT_READ; } else if (strcmp(cmd, "w")==0 || strcmp(cmd, "write")==0) { - break_type = 4; + break_type = BREAKPOINT_WRITE; } else { sendToConsoleLog("Illegal break type"); return; @@ -955,19 +1016,19 @@ namespace m6502debugger char tmp[12]; strcpy(tmp, cmd); getcmd(); if (cmd[0]==0) { - m6502dis::setSymbol(m6502::getPC(), tmp); + m6502dis::symbols::set(m6502::getPC(), tmp); } else { int value = getnum(cmd); - m6502dis::setSymbol(value, tmp); + m6502dis::symbols::set(value, tmp); } sendToConsoleLog("Symbol added"); } else if (strcmp(cmd, "del")==0) { getcmd(); if (cmd[0]==0) { - m6502dis::setSymbol(m6502::getPC(), NULL); + m6502dis::symbols::set(m6502::getPC(), NULL); } else { int value = getnum(cmd); - m6502dis::setSymbol(value, NULL); + m6502dis::symbols::set(value, NULL); } sendToConsoleLog("Symbol removed"); } @@ -1025,9 +1086,10 @@ namespace m6502debugger uint32_t next() { - breakpoints[m6502::getPC()+m6502dis::getOpcodeSize(m6502::getPC())] |= 8; + breakpoints[m6502::getPC()+m6502dis::getOpcodeSize(m6502::getPC())] |= BREAKPOINT_NEXT; //const uint32_t t = m6502::step(); - cont(); + atari2600::resume(); + //cont(); return 0; //t; } diff --git a/source/6502debugger.h b/source/6502debugger.h index bab363f..b24b213 100644 --- a/source/6502debugger.h +++ b/source/6502debugger.h @@ -16,6 +16,11 @@ namespace m6502debugger #define MEMTAG_KNOWN 0x07 #define MEMTAG_TOUCHED 0x70 + #define BREAKPOINT_EXECUTE 0x01 + #define BREAKPOINT_READ 0x02 + #define BREAKPOINT_WRITE 0x04 + #define BREAKPOINT_NEXT 0x08 + uint8_t getTag(uint16_t address); void setTag(uint16_t address, uint8_t value); diff --git a/source/6502dis.cpp b/source/6502dis.cpp index 1887282..630f913 100644 --- a/source/6502dis.cpp +++ b/source/6502dis.cpp @@ -1,5 +1,6 @@ #include "6502dis.h" #include "6502m.h" +#include "6502_opcodes.h" #include "mem.h" #include #include @@ -10,49 +11,8 @@ namespace m6502dis { char buffer[256]; int opcode_size = 0; - char symbols[65536][15]; - std::vector used_symbols; - -// $%04x -// $%02x -// %hhd const char *base_opcodes[256] = {"BRK ", "ORA ($%02x,X)", "---", "---", "---", "ORA $%02x", "ASL $%02x", "---", "PHP ", "ORA #$%02x", "ASL A", "---", "---", "ORA $%04x", "ASL $%04x", "---", "BPL %hhd", "ORA ($%02x),Y", "---", "---", "---", "ORA $%02x,X", "ASL $%02x,X", "---", "CLC ", "ORA $%04x,Y", "---", "---", "---", "ORA $%04x,X", "ASL $%04x,X", "---", "JSR $%04x", "AND ($%02x,X)", "---", "---", "BIT $%02x", "AND $%02x", "ROL $%02x", "---", "PLP ", "AND #$%02x", "ROL A", "---", "BIT $%04x", "AND $%04x", "ROL $%04x", "---", "BMI %hhd", "AND ($%02x),Y", "---", "---", "---", "AND $%02x,X", "ROL $%02x,X", "---", "SEC ", "AND $%04x,Y", "---", "---", "---", "AND $%04x,X", "ROL $%04x,X", "---", "RTI ", "EOR ($%02x,X)", "---", "---", "---", "EOR $%02x", "LSR $%02x", "---", "PHA ", "EOR #$%02x", "LSR A", "---", "JMP ($%04x)", "EOR $%04x", "LSR $%04x", "---", "BVC %hhd", "EOR ($%02x),Y", "---", "---", "---", "EOR $%02x,X", "LSR $%02x,X", "---", "CLI ", "EOR $%04x,Y", "---", "---", "---", "EOR $%04x,X", "LSR $%04x,X", "---", "RTS ", "ADC ($%02x,X)", "---", "---", "---", "ADC $%02x", "ROR $%02x", "---", "PLA ", "ADC #$%02x", "ROR A", "---", "JMP ($%04x)", "ADC $%04x", "ROR $%04x", "---", "BVS %hhd", "ADC ($%02x),Y", "---", "---", "---", "ADC $%02x,X", "ROR $%02x,X", "---", "SEI ", "ADC $%04x,Y", "---", "---", "---", "ADC $%04x,X", "ROR $%04x,X", "---", "---", "STA ($%02x,X)", "---", "---", "STY $%02x", "STA $%02x", "STX $%02x", "---", "DEY ", "---", "TXA ", "---", "STY $%04x", "STA $%04x", "STX $%04x", "---", "BCC %hhd", "STA ($%02x),Y", "---", "---", "STY $%02x,X", "STA $%02x,X", "STX $%02x,Y", "---", "TYA ", "STA $%04x,Y", "TXS ", "---", "---", "STA $%04x,X", "---", "---", "LDY #$%02x", "LDA ($%02x,X)", "LDX #$%02x", "---", "LDY $%02x", "LDA $%02x", "LDX $%02x", "---", "TAY ", "LDA #$%02x", "TAX ", "---", "LDY $%04x", "LDA $%04x", "LDX $%04x", "---", "BCS %hhd", "LDA ($%02x),Y", "---", "---", "LDY $%02x,X", "LDA $%02x,X", "LDX $%02x,Y", "---", "CLV ", "LDA $%04x,Y", "TSX ", "---", "LDY $%04x,X", "LDA $%04x,X", "LDX $%04x,Y", "---", "CPY #$%02x", "CMP ($%02x,X)", "---", "---", "CPY $%02x", "CMP $%02x", "DEC $%02x", "---", "INY ", "CMP #$%02x", "DEX ", "---", "CPY $%04x", "CMP $%04x", "DEC $%04x", "---", "BNE %hhd", "CMP ($%02x),Y", "---", "---", "---", "CMP $%02x,X", "DEC $%02x,X", "---", "CLD ", "CMP $%04x,Y", "---", "---", "---", "CMP $%04x,X", "DEC $%04x,X", "---", "CPX #$%02x", "SBC ($%02x,X)", "---", "---", "CPX $%02x", "SBC $%02x", "INC $%02x", "---", "INX ", "SBC #$%02x", "NOP ", "---", "CPX $%04x", "SBC $%04x", "INC $%04x", "---", "BEQ %hhd", "SBC ($%02x),Y", "---", "---", "---", "SBC $%02x,X", "INC $%02x,X", "---", "SED ", "SBC $%04x,Y", "---", "---", "---", "SBC $%04x,X", "INC $%04x,X", "---"}; -// const char *base_opcodes[256] = {"nop", "ld bc,$%04x", "ld (bc),a", "inc bc", "inc b", "dec b", "ld b,$%02x", "rlca", "ex af,af'", "add hl,bc", "ld a,(bc)", "dec bc", "inc c", "dec c", "ld c,$%02x", "rrca", "djnz $%Xx", "ld de,$%04x", "ld (de),a", "inc de", "inc d", "dec d", "ld d,$%02x", "rla", "jr $%Xx", "add hl,de", "ld a,(de)", "dec de", "inc e", "dec e", "ld e,$%02x", "rra", "jr nz,$%Xx", "ld hl,$%04x", "ld ($%04x),hl", "inc hl", "inc h", "dec h", "ld h,$%02x", "daa", "jr z,$%Xx", "add hl,hl", "ld hl,($%04x)", "dec hl", "inc l", "dec l", "ld l,$%02x", "cpl", "jr nc,$%Xx", "ld sp,$%04x", "ld ($%04x),a", "inc sp", "inc (hl)", "dec (hl)", "ld (hl),$%02x", "scf", "jr c,$%Xx", "add hl,sp", "ld a,($%04x)", "dec sp", "inc a", "dec a", "ld a,$%02x", "ccf", "ld b,b", "ld b,c", "ld b,d", "ld b,e", "ld b,h", "ld b,l", "ld b,(hl)", "ld b,a", "ld c,b", "ld c,c", "ld c,d", "ld c,e", "ld c,h", "ld c,l", "ld c,(hl)", "ld c,a", "ld d,b", "ld d,c", "ld d,d", "ld d,e", "ld d,h", "ld d,l", "ld d,(hl)", "ld d,a", "ld e,b", "ld e,c", "ld e,d", "ld e,e", "ld e,h", "ld e,l", "ld e,(hl)", "ld e,a", "ld h,b", "ld h,c", "ld h,d", "ld h,e", "ld h,h", "ld h,l", "ld h,(hl)", "ld h,a", "ld l,b", "ld l,c", "ld l,d", "ld l,e", "ld l,h", "ld l,l", "ld l,(hl)", "ld l,a", "ld (hl),b", "ld (hl),c", "ld (hl),d", "ld (hl),e", "ld (hl),h", "ld (hl),l", "halt", "ld (hl),a", "ld a,b", "ld a,c", "ld a,d", "ld a,e", "ld a,h", "ld a,l", "ld a,(hl)", "ld a,a", "add a,b", "add a,c", "add a,d", "add a,e", "add a,h", "add a,l", "add a,(hl)", "add a,a", "adc a,b", "adc a,c", "adc a,d", "adc a,e", "adc a,h", "adc a,l", "adc a,(hl)", "adc a,a", "sub b", "sub c", "sub d", "sub e", "sub h", "sub l", "sub (hl)", "sub a", "sbc a,b", "sbc a,c", "sbc a,d", "sbc a,e", "sbc a,h", "sbc a,l", "sbc a,(hl)", "sbc a,a", "and b", "and c", "and d", "and e", "and h", "and l", "and (hl)", "and a", "xor b", "xor c", "xor d", "xor e", "xor h", "xor l", "xor (hl)", "xor a", "or b", "or c", "or d", "or e", "or h", "or l", "or (hl)", "or a", "cp b", "cp c", "cp d", "cp e", "cp h", "cp l", "cp (hl)", "cp a", "ret nz", "pop bc", "jp nz,$%04x", "jp $%04x", "call nz,$%04x", "push bc", "add a,$%02x", "rst 00h", "ret z", "ret", "jp z,$%04x", "_Bit_", "call z,$%04x", "call $%04x", "adc a,$%02x", "rst 08h", "ret nc", "pop de", "jp nc,$%04x", "out ($%02x),a", "call nc,$%04x", "push de", "sub $%02x", "rst 10h", "ret c", "exx", "jp c,$%04x", "in a,($%02x)", "call c,$%04x", "_IX_", "sbc a,$%02x", "rst 18h", "ret po", "pop hl", "jp po,$%04x", "ex (sp),hl", "call po,$%04x", "push hl", "and $%02x", "rst 20h", "ret pe", "jp (hl)", "jp pe,$%04x", "ex de,hl", "call pe,$%04x", "_Misc._", "xor $%02x", "rst 28h", "ret p", "pop af", "jp p,$%04x", "di", "call p,$%04x", "push af", "or $%02x", "rst 30h", "ret m", "ld sp,hl", "jp m,$%04x", "ei", "call m,$%04x", "_IY_", "cp $%02x", "rst 38h"}; -// const char *cb_opcodes[256] = {"rlc b", "rlc c", "rlc d", "rlc e", "rlc h", "rlc l", "rlc (hl)", "rlc a", "rrc b", "rrc c", "rrc d", "rrc e", "rrc h", "rrc l", "rrc (hl)", "rrc a", "rl b", "rl c", "rl d", "rl e", "rl h", "rl l", "rl (hl)", "rl a", "rr b", "rr c", "rr d", "rr e", "rr h", "rr l", "rr (hl)", "rr a", "sla b", "sla c", "sla d", "sla e", "sla h", "sla l", "sla (hl)", "sla a", "sra b", "sra c", "sra d", "sra e", "sra h", "sra l", "sra (hl)", "sra a", "sll b", "sll c", "sll d", "sll e", "sll h", "sll l", "sll (hl)", "sll a", "srl b", "srl c", "srl d", "srl e", "srl h", "srl l", "srl (hl)", "srl a", "bit 0,b", "bit 0,c", "bit 0,d", "bit 0,e", "bit 0,h", "bit 0,l", "bit 0,(hl)", "bit 0,a", "bit 1,b", "bit 1,c", "bit 1,d", "bit 1,e", "bit 1,h", "bit 1,l", "bit 1,(hl)", "bit 1,a", "bit 2,b", "bit 2,c", "bit 2,d", "bit 2,e", "bit 2,h", "bit 2,l", "bit 2,(hl)", "bit 2,a", "bit 3,b", "bit 3,c", "bit 3,d", "bit 3,e", "bit 3,h", "bit 3,l", "bit 3,(hl)", "bit 3,a", "bit 4,b", "bit 4,c", "bit 4,d", "bit 4,e", "bit 4,h", "bit 4,l", "bit 4,(hl)", "bit 4,a", "bit 5,b", "bit 5,c", "bit 5,d", "bit 5,e", "bit 5,h", "bit 5,l", "bit 5,(hl)", "bit 5,a", "bit 6,b", "bit 6,c", "bit 6,d", "bit 6,e", "bit 6,h", "bit 6,l", "bit 6,(hl)", "bit 6,a", "bit 7,b", "bit 7,c", "bit 7,d", "bit 7,e", "bit 7,h", "bit 7,l", "bit 7,(hl)", "bit 7,a", "res 0,b", "res 0,c", "res 0,d", "res 0,e", "res 0,h", "res 0,l", "res 0,(hl)", "res 0,a", "res 1,b", "res 1,c", "res 1,d", "res 1,e", "res 1,h", "res 1,l", "res 1,(hl)", "res 1,a", "res 2,b", "res 2,c", "res 2,d", "res 2,e", "res 2,h", "res 2,l", "res 2,(hl)", "res 2,a", "res 3,b", "res 3,c", "res 3,d", "res 3,e", "res 3,h", "res 3,l", "res 3,(hl)", "res 3,a", "res 4,b", "res 4,c", "res 4,d", "res 4,e", "res 4,h", "res 4,l", "res 4,(hl)", "res 4,a", "res 5,b", "res 5,c", "res 5,d", "res 5,e", "res 5,h", "res 5,l", "res 5,(hl)", "res 5,a", "res 6,b", "res 6,c", "res 6,d", "res 6,e", "res 6,h", "res 6,l", "res 6,(hl)", "res 6,a", "res 7,b", "res 7,c", "res 7,d", "res 7,e", "res 7,h", "res 7,l", "res 7,(hl)", "res 7,a", "set 0,b", "set 0,c", "set 0,d", "set 0,e", "set 0,h", "set 0,l", "set 0,(hl)", "set 0,a", "set 1,b", "set 1,c", "set 1,d", "set 1,e", "set 1,h", "set 1,l", "set 1,(hl)", "set 1,a", "set 2,b", "set 2,c", "set 2,d", "set 2,e", "set 2,h", "set 2,l", "set 2,(hl)", "set 2,a", "set 3,b", "set 3,c", "set 3,d", "set 3,e", "set 3,h", "set 3,l", "set 3,(hl)", "set 3,a", "set 4,b", "set 4,c", "set 4,d", "set 4,e", "set 4,h", "set 4,l", "set 4,(hl)", "set 4,a", "set 5,b", "set 5,c", "set 5,d", "set 5,e", "set 5,h", "set 5,l", "set 5,(hl)", "set 5,a", "set 6,b", "set 6,c", "set 6,d", "set 6,e", "set 6,h", "set 6,l", "set 6,(hl)", "set 6,a", "set 7,b", "set 7,c", "set 7,d", "set 7,e", "set 7,h", "set 7,l", "set 7,(hl)", "set 7,a"}; -// const char *ix_opcodes[256] = {"", "", "", "", "inc b", "dec b", "ld b,$%02x", "", "", "add ix,bc", "", "", "inc c", "dec c", "ld c,$%02x", "", "", "", "", "", "inc d", "dec d", "ld d,$%02x", "", "", "add ix,de", "", "", "inc e", "dec e", "ld e,$%02x", "", "", "ld ix,$%04x", "ld ($%04x),ix", "inc ix", "inc ixh", "dec ixh", "ld ixh,$%02x", "", "", "add ix,ix", "ld ix,($%04x)", "dec ix", "inc ixl", "dec ixl", "ld ixl,$%02x", "", "", "", "", "", "inc (ix+%hhd)", "dec (ix+%hhd)", "ld (ix+%hhd),$%02x", "", "", "add ix,sp", "", "", "inc a", "dec a", "ld a,$%02x", "", "ld b,b", "ld b,c", "ld b,d", "ld b,e", "ld b,ixh", "ld b,ixl", "ld b,(ix+%hhd)", "ld b,a", "ld c,b", "ld c,c", "ld c,d", "ld c,e", "ld c,ixh", "ld c,ixl", "ld c,(ix+%hhd)", "ld c,a", "ld d,b", "ld d,c", "ld d,d", "ld d,e", "ld d,ixh", "ld d,ixl", "ld d,(ix+%hhd)", "ld d,a", "ld e,b", "ld e,c", "ld e,d", "ld e,e", "ld e,ixh", "ld e,ixl", "ld e,(ix+%hhd)", "ld e,a", "ld ixh,b", "ld ixh,c", "ld ixh,d", "ld ixh,e", "ld ixh,ixh", "ld ixh,ixl", "ld h,(ix+%hhd)", "ld ixh,a", "ld ixl,b", "ld ixl,c", "ld ixl,d", "ld ixl,e", "ld ixl,ixh", "ld ixl,ixl", "ld l,(ix+%hhd)", "ld ixl,a", "ld (ix+%hhd),b", "ld (ix+%hhd),c", "ld (ix+%hhd),d", "ld (ix+%hhd),e", "ld (ix+%hhd),h", "ld (ix+%hhd),l", "", "ld (ix+%hhd),a", "ld a,b", "ld a,c", "ld a,d", "ld a,e", "ld a,ixh", "ld a,ixl", "ld a,(ix+%hhd)", "ld a,a", "add a,b", "add a,c", "add a,d", "add a,e", "add a,ixh", "add a,ixl", "add a,(ix+%hhd)", "add a,a", "adc a,b", "adc a,c", "adc a,d", "adc a,e", "adc a,ixh", "adc a,ixl", "adc a,(ix+%hhd)", "adc a,a", "sub b", "sub c", "sub d", "sub e", "sub ixh", "sub ixl", "sub (ix+%hhd)", "sub a", "sbc a,b", "sbc a,c", "sbc a,d", "sbc a,e", "sbc a,ixh", "sbc a,ixl", "sbc a,(ix+%hhd)", "sbc a,a", "and b", "and c", "and d", "and e", "and ixh", "and ixl", "and (ix+%hhd)", "and a", "xor b", "xor c", "xor d", "xor e", "xor ixh", "xor ixl", "xor (ix+%hhd)", "xor a", "or b", "or c", "or d", "or e", "or ixh", "or ixl", "or (ix+%hhd)", "or a", "cp b", "cp c", "cp d", "cp e", "cp ixh", "cp ixl", "cp (ix+%hhd)", "cp a", "", "", "", "", "", "", "", "", "", "", "", "_IX Bit_", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "pop ix", "", "ex (sp),ix", "", "push ix", "", "", "", "jp (ix)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "ld sp,ix", "", "", "", "", "", ""}; -// const char *ix_bit_opcodes[256] = {"rlc (ix+%hhd),b", "rlc (ix+%hhd),c", "rlc (ix+%hhd),d", "rlc (ix+%hhd),e", "rlc (ix+%hhd),h", "rlc (ix+%hhd),l", "rlc (ix+%hhd)", "rlc (ix+%hhd),a", "rrc (ix+%hhd),b", "rrc (ix+%hhd),c", "rrc (ix+%hhd),d", "rrc (ix+%hhd),e", "rrc (ix+%hhd),h", "rrc (ix+%hhd),l", "rrc (ix+%hhd)", "rrc (ix+%hhd),a", "rl (ix+%hhd),b", "rl (ix+%hhd),c", "rl (ix+%hhd),d", "rl (ix+%hhd),e", "rl (ix+%hhd),h", "rl (ix+%hhd),l", "rl (ix+%hhd)", "rl (ix+%hhd),a", "rr (ix+%hhd),b", "rr (ix+%hhd),c", "rr (ix+%hhd),d", "rr (ix+%hhd),e", "rr (ix+%hhd),h", "rr (ix+%hhd),l", "rr (ix+%hhd)", "rr (ix+%hhd),a", "sla (ix+%hhd),b", "sla (ix+%hhd),c", "sla (ix+%hhd),d", "sla (ix+%hhd),e", "sla (ix+%hhd),h", "sla (ix+%hhd),l", "sla (ix+%hhd)", "sla (ix+%hhd),a", "sra (ix+%hhd),b", "sra (ix+%hhd),c", "sra (ix+%hhd),d", "sra (ix+%hhd),e", "sra (ix+%hhd),h", "sra (ix+%hhd),l", "sra (ix+%hhd)", "sra (ix+%hhd),a", "sll (ix+%hhd),b", "sll (ix+%hhd),c", "sll (ix+%hhd),d", "sll (ix+%hhd),e", "sll (ix+%hhd),h", "sll (ix+%hhd),l", "sll (ix+%hhd)", "sll (ix+%hhd),a", "srl (ix+%hhd),b", "srl (ix+%hhd),c", "srl (ix+%hhd),d", "srl (ix+%hhd),e", "srl (ix+%hhd),h", "srl (ix+%hhd),l", "srl (ix+%hhd)", "srl (ix+%hhd),a", "bit 0,(ix+%hhd)", "bit 0,(ix+%hhd)", "bit 0,(ix+%hhd)", "bit 0,(ix+%hhd)", "bit 0,(ix+%hhd)", "bit 0,(ix+%hhd)", "bit 0,(ix+%hhd)", "bit 0,(ix+%hhd)", "bit 1,(ix+%hhd)", "bit 1,(ix+%hhd)", "bit 1,(ix+%hhd)", "bit 1,(ix+%hhd)", "bit 1,(ix+%hhd)", "bit 1,(ix+%hhd)", "bit 1,(ix+%hhd)", "bit 1,(ix+%hhd)", "bit 2,(ix+%hhd)", "bit 2,(ix+%hhd)", "bit 2,(ix+%hhd)", "bit 2,(ix+%hhd)", "bit 2,(ix+%hhd)", "bit 2,(ix+%hhd)", "bit 2,(ix+%hhd)", "bit 2,(ix+%hhd)", "bit 3,(ix+%hhd)", "bit 3,(ix+%hhd)", "bit 3,(ix+%hhd)", "bit 3,(ix+%hhd)", "bit 3,(ix+%hhd)", "bit 3,(ix+%hhd)", "bit 3,(ix+%hhd)", "bit 3,(ix+%hhd)", "bit 4,(ix+%hhd)", "bit 4,(ix+%hhd)", "bit 4,(ix+%hhd)", "bit 4,(ix+%hhd)", "bit 4,(ix+%hhd)", "bit 4,(ix+%hhd)", "bit 4,(ix+%hhd)", "bit 4,(ix+%hhd)", "bit 5,(ix+%hhd)", "bit 5,(ix+%hhd)", "bit 5,(ix+%hhd)", "bit 5,(ix+%hhd)", "bit 5,(ix+%hhd)", "bit 5,(ix+%hhd)", "bit 5,(ix+%hhd)", "bit 5,(ix+%hhd)", "bit 6,(ix+%hhd)", "bit 6,(ix+%hhd)", "bit 6,(ix+%hhd)", "bit 6,(ix+%hhd)", "bit 6,(ix+%hhd)", "bit 6,(ix+%hhd)", "bit 6,(ix+%hhd)", "bit 6,(ix+%hhd)", "bit 7,(ix+%hhd)", "bit 7,(ix+%hhd)", "bit 7,(ix+%hhd)", "bit 7,(ix+%hhd)", "bit 7,(ix+%hhd)", "bit 7,(ix+%hhd)", "bit 7,(ix+%hhd)", "bit 7,(ix+%hhd)", "res 0,(ix+%hhd),b", "res 0,(ix+%hhd),c", "res 0,(ix+%hhd),d", "res 0,(ix+%hhd),e", "res 0,(ix+%hhd),h", "res 0,(ix+%hhd),l", "res 0,(ix+%hhd)", "res 0,(ix+%hhd),a", "res 1,(ix+%hhd),b", "res 1,(ix+%hhd),c", "res 1,(ix+%hhd),d", "res 1,(ix+%hhd),e", "res 1,(ix+%hhd),h", "res 1,(ix+%hhd),l", "res 1,(ix+%hhd)", "res 1,(ix+%hhd),a", "res 2,(ix+%hhd),b", "res 2,(ix+%hhd),c", "res 2,(ix+%hhd),d", "res 2,(ix+%hhd),e", "res 2,(ix+%hhd),h", "res 2,(ix+%hhd),l", "res 2,(ix+%hhd)", "res 2,(ix+%hhd),a", "res 3,(ix+%hhd),b", "res 3,(ix+%hhd),c", "res 3,(ix+%hhd),d", "res 3,(ix+%hhd),e", "res 3,(ix+%hhd),h", "res 3,(ix+%hhd),l", "res 3,(ix+%hhd)", "res 3,(ix+%hhd),a", "res 4,(ix+%hhd),b", "res 4,(ix+%hhd),c", "res 4,(ix+%hhd),d", "res 4,(ix+%hhd),e", "res 4,(ix+%hhd),h", "res 4,(ix+%hhd),l", "res 4,(ix+%hhd)", "res 4,(ix+%hhd),a", "res 5,(ix+%hhd),b", "res 5,(ix+%hhd),c", "res 5,(ix+%hhd),d", "res 5,(ix+%hhd),e", "res 5,(ix+%hhd),h", "res 5,(ix+%hhd),l", "res 5,(ix+%hhd)", "res 5,(ix+%hhd),a", "res 6,(ix+%hhd),b", "res 6,(ix+%hhd),c", "res 6,(ix+%hhd),d", "res 6,(ix+%hhd),e", "res 6,(ix+%hhd),h", "res 6,(ix+%hhd),l", "res 6,(ix+%hhd)", "res 6,(ix+%hhd),a", "res 7,(ix+%hhd),b", "res 7,(ix+%hhd),c", "res 7,(ix+%hhd),d", "res 7,(ix+%hhd),e", "res 7,(ix+%hhd),h", "res 7,(ix+%hhd),l", "res 7,(ix+%hhd)", "res 7,(ix+%hhd),a", "set 0,(ix+%hhd),b", "set 0,(ix+%hhd),c", "set 0,(ix+%hhd),d", "set 0,(ix+%hhd),e", "set 0,(ix+%hhd),h", "set 0,(ix+%hhd),l", "set 0,(ix+%hhd)", "set 0,(ix+%hhd),a", "set 1,(ix+%hhd),b", "set 1,(ix+%hhd),c", "set 1,(ix+%hhd),d", "set 1,(ix+%hhd),e", "set 1,(ix+%hhd),h", "set 1,(ix+%hhd),l", "set 1,(ix+%hhd)", "set 1,(ix+%hhd),a", "set 2,(ix+%hhd),b", "set 2,(ix+%hhd),c", "set 2,(ix+%hhd),d", "set 2,(ix+%hhd),e", "set 2,(ix+%hhd),h", "set 2,(ix+%hhd),l", "set 2,(ix+%hhd)", "set 2,(ix+%hhd),a", "set 3,(ix+%hhd),b", "set 3,(ix+%hhd),c", "set 3,(ix+%hhd),d", "set 3,(ix+%hhd),e", "set 3,(ix+%hhd),h", "set 3,(ix+%hhd),l", "set 3,(ix+%hhd)", "set 3,(ix+%hhd),a", "set 4,(ix+%hhd),b", "set 4,(ix+%hhd),c", "set 4,(ix+%hhd),d", "set 4,(ix+%hhd),e", "set 4,(ix+%hhd),h", "set 4,(ix+%hhd),l", "set 4,(ix+%hhd)", "set 4,(ix+%hhd),a", "set 5,(ix+%hhd),b", "set 5,(ix+%hhd),c", "set 5,(ix+%hhd),d", "set 5,(ix+%hhd),e", "set 5,(ix+%hhd),h", "set 5,(ix+%hhd),l", "set 5,(ix+%hhd)", "set 5,(ix+%hhd),a", "set 6,(ix+%hhd),b", "set 6,(ix+%hhd),c", "set 6,(ix+%hhd),d", "set 6,(ix+%hhd),e", "set 6,(ix+%hhd),h", "set 6,(ix+%hhd),l", "set 6,(ix+%hhd)", "set 6,(ix+%hhd),a", "set 7,(ix+%hhd),b", "set 7,(ix+%hhd),c", "set 7,(ix+%hhd),d", "set 7,(ix+%hhd),e", "set 7,(ix+%hhd),h", "set 7,(ix+%hhd),l", "set 7,(ix+%hhd)", "set 7,(ix+%hhd),a"}; -// const char *misc_opcodes[128] = {"in b,(c)", "out (c),b", "sbc hl,bc", "ld ($%04x),bc", "neg", "retn", "im 0", "ld i,a", "in c,(c)", "out (c),c", "adc hl,bc", "ld bc,($%04x)", "mlt bc", "reti", "", "ld r,a", "in d,(c)", "out (c),d", "sbc hl,de", "ld ($%04x),de", "", "", "im 1", "ld a,i", "in e,(c)", "out (c),e", "adc hl,de", "ld de,($%04x)", "mlt de", "", "im 2", "ld a,r", "in h,(c)", "out (c),h", "sbc hl,hl", "ld ($%04x),hl", "tst $%02x", "", "", "rrd", "in l,(c)", "out (c),l", "adc hl,hl", "ld hl,($%04x)", "mlt hl", "", "", "rld", "in (c)", "out (c),0", "sbc hl,sp", "ld ($%04x),sp", "tstio $%02x", "", "slp", "", "in a,(c)", "out (c),a", "adc hl,sp", "ld sp,($%04x)", "mlt sp", "", "", "", "", "", "", "otim", "", "", "", "", "", "", "", "otdm", "", "", "", "", "", "", "", "otimr", "", "", "", "", "", "", "", "otdmr", "", "", "", "", "ldi", "cpi", "ini", "outi", "", "", "", "", "ldd", "cpd", "ind", "outd", "", "", "", "", "ldir", "cpir", "inir", "otir", "", "", "", "", "lddr", "cpdr", "indr", "otdr", "", "", "", ""}; -// const char *iy_opcodes[256] = {"", "", "", "", "inc b", "dec b", "ld b,$%02x", "", "", "add iy,bc", "", "", "inc c", "dec c", "ld c,$%02x", "", "", "", "", "", "inc d", "dec d", "ld d,$%02x", "", "", "add iy,de", "", "", "inc e", "dec e", "ld e,$%02x", "", "", "ld iy,$%04x", "ld ($%04x),iy", "inc iy", "inc iyh", "dec iyh", "ld iyh,$%02x", "", "", "add iy,iy", "ld iy,($%04x)", "dec iy", "inc iyl", "dec iyl", "ld iyl,$%02x", "", "", "", "", "", "inc (iy+%hhd)", "dec (iy+%hhd)", "ld (iy+%hhd),$%02x", "", "", "add iy,sp", "", "", "inc a", "dec a", "ld a,$%02x", "", "ld b,b", "ld b,c", "ld b,d", "ld b,e", "ld b,iyh", "ld b,iyl", "ld b,(iy+%hhd)", "ld b,a", "ld c,b", "ld c,c", "ld c,d", "ld c,e", "ld c,iyh", "ld c,iyl", "ld c,(iy+%hhd)", "ld c,a", "ld d,b", "ld d,c", "ld d,d", "ld d,e", "ld d,iyh", "ld d,iyl", "ld d,(iy+%hhd)", "ld d,a", "ld e,b", "ld e,c", "ld e,d", "ld e,e", "ld e,iyh", "ld e,iyl", "ld e,(iy+%hhd)", "ld e,a", "ld iyh,b", "ld iyh,c", "ld iyh,d", "ld iyh,e", "ld iyh,iyh", "ld iyh,iyl", "ld h,(iy+%hhd)", "ld iyh,a", "ld iyl,b", "ld iyl,c", "ld iyl,d", "ld iyl,e", "ld iyl,iyh", "ld iyl,iyl", "ld l,(iy+%hhd)", "ld iyl,a", "ld (iy+%hhd),b", "ld (iy+%hhd),c", "ld (iy+%hhd),d", "ld (iy+%hhd),e", "ld (iy+%hhd),h", "ld (iy+%hhd),l", "", "ld (iy+%hhd),a", "ld a,b", "ld a,c", "ld a,d", "ld a,e", "ld a,iyh", "ld a,iyl", "ld a,(iy+%hhd)", "ld a,a", "add a,b", "add a,c", "add a,d", "add a,e", "add a,iyh", "add a,iyl", "add a,(iy+%hhd)", "add a,a", "adc a,b", "adc a,c", "adc a,d", "adc a,e", "adc a,iyh", "adc a,iyl", "adc a,(iy+%hhd)", "adc a,a", "sub b", "sub c", "sub d", "sub e", "sub iyh", "sub iyl", "sub (iy+%hhd)", "sub a", "sbc a,b", "sbc a,c", "sbc a,d", "sbc a,e", "sbc a,iyh", "sbc a,iyl", "sbc a,(iy+%hhd)", "sbc a,a", "and b", "and c", "and d", "and e", "and iyh", "and iyl", "and (iy+%hhd)", "and a", "xor b", "xor c", "xor d", "xor e", "xor iyh", "xor iyl", "xor (iy+%hhd)", "xor a", "or b", "or c", "or d", "or e", "or iyh", "or iyl", "or (iy+%hhd)", "or a", "cp b", "cp c", "cp d", "cp e", "cp iyh", "cp iyl", "cp (iy+%hhd)", "cp a", "", "", "", "", "", "", "", "", "", "", "", "_IY Bit_", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "pop iy", "", "ex (sp),iy", "", "push iy", "", "", "", "jp (iy)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "ld sp,iy", "", "", "", "", "", ""}; -// const char *iy_bit_opcodes[256] = {"rlc (iy+%hhd),b", "rlc (iy+%hhd),c", "rlc (iy+%hhd),d", "rlc (iy+%hhd),e", "rlc (iy+%hhd),h", "rlc (iy+%hhd),l", "rlc (iy+%hhd)", "rlc (iy+%hhd),a", "rrc (iy+%hhd),b", "rrc (iy+%hhd),c", "rrc (iy+%hhd),d", "rrc (iy+%hhd),e", "rrc (iy+%hhd),h", "rrc (iy+%hhd),l", "rrc (iy+%hhd)", "rrc (iy+%hhd),a", "rl (iy+%hhd),b", "rl (iy+%hhd),c", "rl (iy+%hhd),d", "rl (iy+%hhd),e", "rl (iy+%hhd),h", "rl (iy+%hhd),l", "rl (iy+%hhd)", "rl (iy+%hhd),a", "rr (iy+%hhd),b", "rr (iy+%hhd),c", "rr (iy+%hhd),d", "rr (iy+%hhd),e", "rr (iy+%hhd),h", "rr (iy+%hhd),l", "rr (iy+%hhd)", "rr (iy+%hhd),a", "sla (iy+%hhd),b", "sla (iy+%hhd),c", "sla (iy+%hhd),d", "sla (iy+%hhd),e", "sla (iy+%hhd),h", "sla (iy+%hhd),l", "sla (iy+%hhd)", "sla (iy+%hhd),a", "sra (iy+%hhd),b", "sra (iy+%hhd),c", "sra (iy+%hhd),d", "sra (iy+%hhd),e", "sra (iy+%hhd),h", "sra (iy+%hhd),l", "sra (iy+%hhd)", "sra (iy+%hhd),a", "sll (iy+%hhd),b", "sll (iy+%hhd),c", "sll (iy+%hhd),d", "sll (iy+%hhd),e", "sll (iy+%hhd),h", "sll (iy+%hhd),l", "sll (iy+%hhd)", "sll (iy+%hhd),a", "srl (iy+%hhd),b", "srl (iy+%hhd),c", "srl (iy+%hhd),d", "srl (iy+%hhd),e", "srl (iy+%hhd),h", "srl (iy+%hhd),l", "srl (iy+%hhd)", "srl (iy+%hhd),a", "bit 0,(iy+%hhd)", "bit 0,(iy+%hhd)", "bit 0,(iy+%hhd)", "bit 0,(iy+%hhd)", "bit 0,(iy+%hhd)", "bit 0,(iy+%hhd)", "bit 0,(iy+%hhd)", "bit 0,(iy+%hhd)", "bit 1,(iy+%hhd)", "bit 1,(iy+%hhd)", "bit 1,(iy+%hhd)", "bit 1,(iy+%hhd)", "bit 1,(iy+%hhd)", "bit 1,(iy+%hhd)", "bit 1,(iy+%hhd)", "bit 1,(iy+%hhd)", "bit 2,(iy+%hhd)", "bit 2,(iy+%hhd)", "bit 2,(iy+%hhd)", "bit 2,(iy+%hhd)", "bit 2,(iy+%hhd)", "bit 2,(iy+%hhd)", "bit 2,(iy+%hhd)", "bit 2,(iy+%hhd)", "bit 3,(iy+%hhd)", "bit 3,(iy+%hhd)", "bit 3,(iy+%hhd)", "bit 3,(iy+%hhd)", "bit 3,(iy+%hhd)", "bit 3,(iy+%hhd)", "bit 3,(iy+%hhd)", "bit 3,(iy+%hhd)", "bit 4,(iy+%hhd)", "bit 4,(iy+%hhd)", "bit 4,(iy+%hhd)", "bit 4,(iy+%hhd)", "bit 4,(iy+%hhd)", "bit 4,(iy+%hhd)", "bit 4,(iy+%hhd)", "bit 4,(iy+%hhd)", "bit 5,(iy+%hhd)", "bit 5,(iy+%hhd)", "bit 5,(iy+%hhd)", "bit 5,(iy+%hhd)", "bit 5,(iy+%hhd)", "bit 5,(iy+%hhd)", "bit 5,(iy+%hhd)", "bit 5,(iy+%hhd)", "bit 6,(iy+%hhd)", "bit 6,(iy+%hhd)", "bit 6,(iy+%hhd)", "bit 6,(iy+%hhd)", "bit 6,(iy+%hhd)", "bit 6,(iy+%hhd)", "bit 6,(iy+%hhd)", "bit 6,(iy+%hhd)", "bit 7,(iy+%hhd)", "bit 7,(iy+%hhd)", "bit 7,(iy+%hhd)", "bit 7,(iy+%hhd)", "bit 7,(iy+%hhd)", "bit 7,(iy+%hhd)", "bit 7,(iy+%hhd)", "bit 7,(iy+%hhd)", "res 0,(iy+%hhd),b", "res 0,(iy+%hhd),c", "res 0,(iy+%hhd),d", "res 0,(iy+%hhd),e", "res 0,(iy+%hhd),h", "res 0,(iy+%hhd),l", "res 0,(iy+%hhd)", "res 0,(iy+%hhd),a", "res 1,(iy+%hhd),b", "res 1,(iy+%hhd),c", "res 1,(iy+%hhd),d", "res 1,(iy+%hhd),e", "res 1,(iy+%hhd),h", "res 1,(iy+%hhd),l", "res 1,(iy+%hhd)", "res 1,(iy+%hhd),a", "res 2,(iy+%hhd),b", "res 2,(iy+%hhd),c", "res 2,(iy+%hhd),d", "res 2,(iy+%hhd),e", "res 2,(iy+%hhd),h", "res 2,(iy+%hhd),l", "res 2,(iy+%hhd)", "res 2,(iy+%hhd),a", "res 3,(iy+%hhd),b", "res 3,(iy+%hhd),c", "res 3,(iy+%hhd),d", "res 3,(iy+%hhd),e", "res 3,(iy+%hhd),h", "res 3,(iy+%hhd),l", "res 3,(iy+%hhd)", "res 3,(iy+%hhd),a", "res 4,(iy+%hhd),b", "res 4,(iy+%hhd),c", "res 4,(iy+%hhd),d", "res 4,(iy+%hhd),e", "res 4,(iy+%hhd),h", "res 4,(iy+%hhd),l", "res 4,(iy+%hhd)", "res 4,(iy+%hhd),a", "res 5,(iy+%hhd),b", "res 5,(iy+%hhd),c", "res 5,(iy+%hhd),d", "res 5,(iy+%hhd),e", "res 5,(iy+%hhd),h", "res 5,(iy+%hhd),l", "res 5,(iy+%hhd)", "res 5,(iy+%hhd),a", "res 6,(iy+%hhd),b", "res 6,(iy+%hhd),c", "res 6,(iy+%hhd),d", "res 6,(iy+%hhd),e", "res 6,(iy+%hhd),h", "res 6,(iy+%hhd),l", "res 6,(iy+%hhd)", "res 6,(iy+%hhd),a", "res 7,(iy+%hhd),b", "res 7,(iy+%hhd),c", "res 7,(iy+%hhd),d", "res 7,(iy+%hhd),e", "res 7,(iy+%hhd),h", "res 7,(iy+%hhd),l", "res 7,(iy+%hhd)", "res 7,(iy+%hhd),a", "set 0,(iy+%hhd),b", "set 0,(iy+%hhd),c", "set 0,(iy+%hhd),d", "set 0,(iy+%hhd),e", "set 0,(iy+%hhd),h", "set 0,(iy+%hhd),l", "set 0,(iy+%hhd)", "set 0,(iy+%hhd),a", "set 1,(iy+%hhd),b", "set 1,(iy+%hhd),c", "set 1,(iy+%hhd),d", "set 1,(iy+%hhd),e", "set 1,(iy+%hhd),h", "set 1,(iy+%hhd),l", "set 1,(iy+%hhd)", "set 1,(iy+%hhd),a", "set 2,(iy+%hhd),b", "set 2,(iy+%hhd),c", "set 2,(iy+%hhd),d", "set 2,(iy+%hhd),e", "set 2,(iy+%hhd),h", "set 2,(iy+%hhd),l", "set 2,(iy+%hhd)", "set 2,(iy+%hhd),a", "set 3,(iy+%hhd),b", "set 3,(iy+%hhd),c", "set 3,(iy+%hhd),d", "set 3,(iy+%hhd),e", "set 3,(iy+%hhd),h", "set 3,(iy+%hhd),l", "set 3,(iy+%hhd)", "set 3,(iy+%hhd),a", "set 4,(iy+%hhd),b", "set 4,(iy+%hhd),c", "set 4,(iy+%hhd),d", "set 4,(iy+%hhd),e", "set 4,(iy+%hhd),h", "set 4,(iy+%hhd),l", "set 4,(iy+%hhd)", "set 4,(iy+%hhd),a", "set 5,(iy+%hhd),b", "set 5,(iy+%hhd),c", "set 5,(iy+%hhd),d", "set 5,(iy+%hhd),e", "set 5,(iy+%hhd),h", "set 5,(iy+%hhd),l", "set 5,(iy+%hhd)", "set 5,(iy+%hhd),a", "set 6,(iy+%hhd),b", "set 6,(iy+%hhd),c", "set 6,(iy+%hhd),d", "set 6,(iy+%hhd),e", "set 6,(iy+%hhd),h", "set 6,(iy+%hhd),l", "set 6,(iy+%hhd)", "set 6,(iy+%hhd),a", "set 7,(iy+%hhd),b", "set 7,(iy+%hhd),c", "set 7,(iy+%hhd),d", "set 7,(iy+%hhd),e", "set 7,(iy+%hhd),h", "set 7,(iy+%hhd),l", "set 7,(iy+%hhd)", "set 7,(iy+%hhd),a"}; - - - void loadSymbols() - { - used_symbols.clear(); - for (int i=0; i<65536; ++i) symbols[i][0] = 0; - FILE *f = fopen("symbols.txt", "r"); - if (f==NULL) return; - while (true) { - uint16_t address; - char tmp[15]; - const int result = fscanf(f, "%hx %s", &address, tmp); - if (result != 2) break; - strcpy(symbols[address], tmp); - used_symbols.push_back(address); - } - fclose(f); - } - - void saveSymbols() - { - FILE *f = fopen("symbols.txt", "w"); - for (auto sym_addr : used_symbols) - { - fprintf(f, "0x%x %s\n", sym_addr, symbols[sym_addr]); - } - fclose(f); - } const char *getBase(const uint16_t pos) { @@ -60,19 +20,6 @@ namespace m6502dis return base_opcodes[mem::read(pos)]; } - void printOpcode(const uint16_t pos) - { - char hex[4]; - for (int i=0; i<4;++i) - { - if (opcode_size>i) - sprintf(hex, "%02x ", mem::read(pos+i)); - else - sprintf(hex, " "); - strcat(buffer, hex); - } - } - const char *getAsm(const uint16_t pos) { opcode_size = 0; @@ -84,7 +31,7 @@ namespace m6502dis opcode_size+=2; //const uint8_t memvalue = mem::read(pos); const uint16_t word = mem::read(pos+1) + (mem::read(pos+2)<<8); - if (symbols[word][0]!=0) { + if (symbols::get(word)[0]!=0) { char *p = strstr(buffer, "$"); (*p)='%'; p++; (*p)='s'; p++; @@ -93,7 +40,7 @@ namespace m6502dis p++; } strcpy(base, buffer); - sprintf(buffer, base, symbols[word]); + sprintf(buffer, base, symbols::get(word)); } else { strcpy(base, buffer); sprintf(buffer, base, word); @@ -119,54 +66,82 @@ namespace m6502dis const char *getOpcode(const uint16_t pos) { - opcode_size = 0; + opcode_size = getOpcodeSize(pos); buffer[0]=0; - const char *base = getBase(pos); - - if (strstr(base, "4x")) opcode_size+=2; - if (strstr(base, "2x")) opcode_size+=1; - if (strstr(base, "hh")) opcode_size+=1; - printOpcode(pos); + char hex[4]; + for (int i=0; i<4;++i) + { + if (opcode_size>i) + sprintf(hex, "%02x ", mem::read(pos+i)); + else + sprintf(hex, " "); + strcat(buffer, hex); + } return buffer; } const int getOpcodeSize(const uint16_t pos) { - opcode_size = 0; - const char *base = getBase(pos); - - if (strstr(base, "4x")) opcode_size+=2; - if (strstr(base, "2x")) opcode_size+=1; - if (strstr(base, "hh")) opcode_size+=1; - return opcode_size; + return m6502::opcodes::addressingModes[m6502::opcodes::opcodeDescriptors[mem::read(pos)].addrMode].length; } - const char *getSymbol(const uint16_t pos) + namespace symbols { - return symbols[pos]; - } + char symbols[65536][15]; + std::vector used_symbols; - void setSymbol(const uint16_t pos, const char *sym) - { - if (sym) { - strcpy(symbols[pos], sym); - } else { - symbols[pos][0] = 0; + void load() + { + used_symbols.clear(); + for (int i=0; i<65536; ++i) symbols[i][0] = 0; + FILE *f = fopen("symbols.txt", "r"); + if (f==NULL) return; + while (true) { + uint16_t address; + char tmp[15]; + const int result = fscanf(f, "%hx %s", &address, tmp); + if (result != 2) break; + strcpy(symbols[address], tmp); + used_symbols.push_back(address); + } + fclose(f); + } + + void save() + { + FILE *f = fopen("symbols.txt", "w"); + for (auto sym_addr : used_symbols) + { + fprintf(f, "0x%x %s\n", sym_addr, symbols[sym_addr]); + } + fclose(f); + } + + const char *get(const uint16_t pos) + { + return symbols[pos]; + } + + void set(const uint16_t pos, const char *sym) + { + if (sym) { + strcpy(symbols[pos], sym); + } else { + symbols[pos][0] = 0; + } + used_symbols.clear(); + for (int i=0; i<65536; ++i) if (symbols[i][0]!=0) used_symbols.push_back(i); + save(); + } + + const int count() + { + return used_symbols.size(); + } + + const uint16_t address(const int pos) + { + return used_symbols[pos]; } - used_symbols.clear(); - for (int i=0; i<65536; ++i) if (symbols[i][0]!=0) used_symbols.push_back(i); - saveSymbols(); } - - const int getNumSymbols() - { - return used_symbols.size(); - } - - const uint16_t getSymbolAddress(const int pos) - { - return used_symbols[pos]; - } - - } diff --git a/source/6502dis.h b/source/6502dis.h index f8293ee..ee77e04 100644 --- a/source/6502dis.h +++ b/source/6502dis.h @@ -4,14 +4,19 @@ namespace m6502dis { - void loadSymbols(); - void saveSymbols(); const char *getAsm(const uint16_t pos); const char *getOpcode(const uint16_t pos); const int getOpcodeSize(const uint16_t pos); - const char *getSymbol(const uint16_t pos); - void setSymbol(const uint16_t pos, const char *sym); - const int getNumSymbols(); - const uint16_t getSymbolAddress(const int pos); + namespace symbols + { + void load(); + void save(); + + const char *get(const uint16_t pos); + void set(const uint16_t pos, const char *sym); + + const int count(); + const uint16_t address(const int pos); + } } diff --git a/source/main.cpp b/source/main.cpp index c308eeb..c30276c 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -14,7 +14,7 @@ int main(int argc, char *argv[]) { } else { rom::load("combat.bin"); } - m6502dis::loadSymbols(); + m6502dis::symbols::load(); atari2600::init(); atari2600::pause(); m6502debugger::show(); @@ -34,6 +34,7 @@ int main(int argc, char *argv[]) { if (atari2600::is_paused()) { switch (e.key.scancode) { case SDL_SCANCODE_F10: atari2600::step(); m6502debugger::refresh(); break; + case SDL_SCANCODE_F11: m6502debugger::next(); break; default: break; } } diff --git a/source/pia.cpp b/source/pia.cpp index fcb0300..90d4232 100644 --- a/source/pia.cpp +++ b/source/pia.cpp @@ -130,7 +130,7 @@ namespace pia if (address & 0x200) { return {"PIA", mdtRegister, address}; } else { - return {"RAM", mdtRAM, address & 0xff}; + return {"RAM", mdtRAM, uint16_t(address & 0xff)}; } } } diff --git a/source/rom.cpp b/source/rom.cpp index 200f4e9..93766e6 100644 --- a/source/rom.cpp +++ b/source/rom.cpp @@ -41,7 +41,7 @@ namespace rom { const memDebugInfo getInfo(uint16_t address) { - return {"ROM", mdtROM, 0x1000 | (address & mask)}; + return {"ROM", mdtROM, uint16_t(0x1000 | (address & mask))}; } } }