- [NEW] 6502dis i 6502debugger implementats

- [FIX] font.bmp afegit
- [NEW] Afegides regles de comprobació de memòria en la versió debug de compilació en el lagueirtofile
- [FIX] la rom ha de carregar abans de atari2600::init()
- [NEW] Implementació bàsica del PIA completada.
- [FIX] El framebuffer intern en el mòdul TIA era incorrecte.
- [NEW] Afegits accesors als registres del 6502
- [NEW] m6502::reset()
- [FIX] [6502m] Corregits opcodes amb direccionament implicit: CLC, SEC, PHA, CLI, PLA, SEI, DEY, TXA, TYA, TXS, TAY, TAX, CLV, TSX, INY, DEX, CLD, INX, NOP i SED). Augmentaven el PC una posició de més.
This commit is contained in:
raimon@prometeo
2026-09-17 17:43:33 +02:00
parent fb5097733d
commit e245410c0a
14 changed files with 381 additions and 446 deletions
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

+2 -2
View File
@@ -7,8 +7,8 @@ buildpath = build
exclude = z80* exclude = z80*
[linux_debug] default [linux_debug] default
cppflags = -D DEBUG -g -std=c++20 -Isource cppflags = -D DEBUG -g -std=c++20 -O0 -fsanitize=address -fno-omit-frame-pointer -Isource
libs = -lSDL3 libs = -lSDL3 -fsanitize=address -fno-omit-frame-pointer
executable = atari2600_debug executable = atari2600_debug
sourcepath = source+ sourcepath = source+
buildpath = build buildpath = build
+109 -161
View File
@@ -1,14 +1,14 @@
#include "z80debugger.h" #include "6502debugger.h"
#include <SDL3/SDL.h> #include <SDL3/SDL.h>
#include <stdio.h> #include <stdio.h>
#include "msx.h" #include "atari2600.h"
#include "mem.h" #include "mem.h"
#include "z80.h" #include "6502m.h"
#include "z80dis.h" #include "6502dis.h"
#include "display.h" #include "display.h"
#include "ui.h" #include "ui.h"
#include "ui_window.h" #include "ui_window.h"
#include "cassette.h" #include "rom.h"
#define RESIZING_NONE 0 #define RESIZING_NONE 0
#define RESIZING_MEMORY 1 #define RESIZING_MEMORY 1
@@ -16,7 +16,7 @@
#define RESIZING_SYMBOLS 3 #define RESIZING_SYMBOLS 3
#define RESIZING_X 4 #define RESIZING_X 4
namespace z80debugger namespace m6502debugger
{ {
int midx = 58; int midx = 58;
int mem_y = 20; int mem_y = 20;
@@ -37,8 +37,8 @@ namespace z80debugger
uint8_t pos=0; uint8_t pos=0;
} }
uint16_t oAF, oBC, oDE, oHL, oAF2, oBC2, oDE2, oHL2, oIX, oIY, oSP, oPC; uint16_t oPC;
uint8_t oI, oR; uint8_t oA, oX, oY, oS, oP;
bool mem_modified[65536]; //[CHECK] bool mem_modified[65536]; //[CHECK]
@@ -61,7 +61,7 @@ namespace z80debugger
uint16_t cursor = 0; uint16_t cursor = 0;
uint8_t use[7][256]; uint8_t use[256];
uint16_t line_address[256]; uint16_t line_address[256];
uint16_t line_breakpoint_address[256]; uint16_t line_breakpoint_address[256];
@@ -95,7 +95,7 @@ namespace z80debugger
if (e->type == SDL_EVENT_MOUSE_MOTION) { if (e->type == SDL_EVENT_MOUSE_MOTION) {
SDL_ShowCursor(); SDL_ShowCursor();
} }
if (msx::is_paused()) { if (atari2600::is_paused()) {
if ((e->type==SDL_EVENT_WINDOW_SHOWN) || (e->type==SDL_EVENT_WINDOW_EXPOSED)) { if ((e->type==SDL_EVENT_WINDOW_SHOWN) || (e->type==SDL_EVENT_WINDOW_EXPOSED)) {
int w; int h; int w; int h;
SDL_GetWindowSize(win, &w, &h); SDL_GetWindowSize(win, &w, &h);
@@ -187,7 +187,7 @@ namespace z80debugger
// Si pasa per damunt dels bytes que formen el opcode en el desensamblador // Si pasa per damunt dels bytes que formen el opcode en el desensamblador
} else if ((chrx>=19) && (chrx<30) && (chry<mem_y-1) && (chry>0)) { } else if ((chrx>=19) && (chrx<30) && (chry<mem_y-1) && (chry>0)) {
const uint16_t address = line_address[chry-1]; const uint16_t address = line_address[chry-1];
const int opcodesize = z80dis::getOpcodeSize(address); const int opcodesize = m6502dis::getOpcodeSize(address);
const int byte = (chrx-19)/3; const int byte = (chrx-19)/3;
if (byte < opcodesize) { if (byte < opcodesize) {
inspected_value = mem::read(address+byte); inspected_value = mem::read(address+byte);
@@ -203,26 +203,12 @@ namespace z80debugger
inspected_value = mem::read(address); inspected_value = mem::read(address);
refresh(); refresh();
// Si pasa per damunt d'un registre // Si pasa per damunt d'un registre
} else if ((chrx>=midx+4) && (chrx<midx+8) && (chry==1)) { inspected_value = z80::getAF(); refresh(); } else if ((chrx>=midx+3) && (chrx<midx+5) && (chry==1)) { inspected_value = m6502::getA(); refresh();
} else if ((chrx>=midx+4) && (chrx<midx+8) && (chry==2)) { inspected_value = z80::getBC(); refresh(); } else if ((chrx>=midx+3) && (chrx<midx+5) && (chry==2)) { inspected_value = m6502::getX(); refresh();
} else if ((chrx>=midx+4) && (chrx<midx+8) && (chry==3)) { inspected_value = z80::getDE(); refresh(); } else if ((chrx>=midx+3) && (chrx<midx+5) && (chry==3)) { inspected_value = m6502::getY(); refresh();
} else if ((chrx>=midx+4) && (chrx<midx+8) && (chry==4)) { inspected_value = z80::getHL(); refresh(); } else if ((chrx>=midx+3) && (chrx<midx+5) && (chry==4)) { inspected_value = m6502::getS(); refresh();
} else if ((chrx>=midx+12) && (chrx<midx+16) && (chry==1)) { inspected_value = z80::getAF(true); refresh(); } else if ((chrx>=midx+3) && (chrx<midx+5) && (chry==5)) { inspected_value = m6502::getP(); refresh();
} else if ((chrx>=midx+12) && (chrx<midx+16) && (chry==2)) { inspected_value = z80::getBC(true); refresh(); } else if ((chrx>=midx+20) && (chrx<midx+24) && (chry==1)) { inspected_value = m6502::getPC(); refresh();
} else if ((chrx>=midx+12) && (chrx<midx+16) && (chry==3)) { inspected_value = z80::getDE(true); refresh();
} else if ((chrx>=midx+12) && (chrx<midx+16) && (chry==4)) { inspected_value = z80::getHL(true); refresh();
} else if ((chrx>=midx+20) && (chrx<midx+24) && (chry==1)) { inspected_value = z80::getIX(); refresh();
} else if ((chrx>=midx+20) && (chrx<midx+24) && (chry==2)) { inspected_value = z80::getIY(); refresh();
} else if ((chrx>=midx+20) && (chrx<midx+24) && (chry==3)) { inspected_value = z80::getSP(); refresh();
} else if ((chrx>=midx+20) && (chrx<midx+24) && (chry==4)) { inspected_value = z80::getPC(); refresh();
} else if ((chrx>=midx+6) && (chrx<midx+8) && (chry==5)) { inspected_value = mem::read(z80::getBC()); refresh();
} else if ((chrx>=midx+14) && (chrx<midx+16) && (chry==5)) { inspected_value = mem::read(z80::getDE()); refresh();
} else if ((chrx>=midx+22) && (chrx<midx+24) && (chry==5)) { inspected_value = mem::read(z80::getHL()); refresh();
} else if ((chrx>=midx+17) && (chrx<midx+19) && (chry==6)) { inspected_value = z80::getI(); refresh();
} else if ((chrx>=midx+22) && (chrx<midx+24) && (chry==6)) { inspected_value = z80::getR(); refresh();
} }
} else { } else {
@@ -282,8 +268,8 @@ namespace z80debugger
if (chrx>=midx+2 && chry>=sym_y+1) { if (chrx>=midx+2 && chry>=sym_y+1) {
const int line = chry-(sym_y+1); const int line = chry-(sym_y+1);
if (line<z80dis::getNumSymbols()) { if (line<m6502dis::getNumSymbols()) {
cursor = z80dis::getSymbolAddress(line); cursor = m6502dis::getSymbolAddress(line);
refresh(); refresh();
} }
} }
@@ -323,7 +309,7 @@ namespace z80debugger
if ( !(tag & MEMTAG_IGNORE) ) tag |= MEMTAG_INST; if ( !(tag & MEMTAG_IGNORE) ) tag |= MEMTAG_INST;
tag |= (!(tag&MEMTAG_TOUCHED) ? MEMTAG_TREPEAT : MEMTAG_TINST); tag |= (!(tag&MEMTAG_TOUCHED) ? MEMTAG_TREPEAT : MEMTAG_TINST);
setcursor(z80::getPC()); setcursor(m6502::getPC());
history::store(); history::store();
} }
@@ -373,7 +359,7 @@ namespace z80debugger
void show() void show()
{ {
if (!win) { if (!win) {
win = SDL_CreateWindow("Z80 Debugger", 98*CHR_W, 44*CHR_H, 0/*SDL_WINDOW_RESIZABLE*/); win = SDL_CreateWindow("6502 Debugger", 98*CHR_W, 44*CHR_H, 0/*SDL_WINDOW_RESIZABLE*/);
ren = SDL_CreateRenderer(win, 0); ren = SDL_CreateRenderer(win, 0);
ui::window::registerWindow(SDL_GetWindowID(win), eventHandler); ui::window::registerWindow(SDL_GetWindowID(win), eventHandler);
tex = ui::createtexture(ren); tex = ui::createtexture(ren);
@@ -406,7 +392,7 @@ namespace z80debugger
{ {
//speaker::disable(); //speaker::disable();
//is_paused = true; //is_paused = true;
breakpoints[z80::getPC()] &= ~8; breakpoints[m6502::getPC()] &= ~8;
} }
void stop() void stop()
@@ -447,7 +433,7 @@ namespace z80debugger
if ( !(tag & (MEMTAG_TINST | MEMTAG_TREPEAT)) ) colors[3]=COLOR_GRAY; if ( !(tag & (MEMTAG_TINST | MEMTAG_TREPEAT)) ) colors[3]=COLOR_GRAY;
if ( !(tag & MEMTAG_TOUCHED) ) colors[1]=COLOR_GRAY; if ( !(tag & MEMTAG_TOUCHED) ) colors[1]=COLOR_GRAY;
if (msx::is_paused() && (address == z80::getPC())) { if (atari2600::is_paused() && (address == m6502::getPC())) {
for (int i=0; i<4;++i) colors[i]=COLOR_YELLOW; for (int i=0; i<4;++i) colors[i]=COLOR_YELLOW;
ui::printrect(0,line, midx-2,1, COLOR_BLUE); ui::printrect(0,line, midx-2,1, COLOR_BLUE);
} }
@@ -456,18 +442,18 @@ namespace z80debugger
ui::printtxt(1,line,tohex(address,4), colors[1]); ui::printtxt(1,line,tohex(address,4), colors[1]);
if ( (tag & MEMTAG_INST) || heuristics ) { if ( (tag & MEMTAG_INST) || heuristics ) {
const char *sym = z80dis::getSymbol(address); const char *sym = m6502dis::getSymbol(address);
if (sym[0]!=0) ui::printtxt(7,line, sym, COLOR_YELLOW); if (sym[0]!=0) ui::printtxt(7,line, sym, COLOR_YELLOW);
const int opcodesize = z80dis::getOpcodeSize(address); const int opcodesize = m6502dis::getOpcodeSize(address);
for (int i=0; i<opcodesize; ++i) { for (int i=0; i<opcodesize; ++i) {
const uint8_t tag = tags[address+i]; const uint8_t tag = tags[address+i];
const uint32_t color = !(tag & MEMTAG_KNOWN) ? COLOR_GRAY : (tag & MEMTAG_DATA) ? ( (tag & (MEMTAG_CODE|MEMTAG_INST)) ? COLOR_MAGENTA : COLOR_BLUE ) : COLOR_GREEN; const uint32_t color = !(tag & MEMTAG_KNOWN) ? COLOR_GRAY : (tag & MEMTAG_DATA) ? ( (tag & (MEMTAG_CODE|MEMTAG_INST)) ? COLOR_MAGENTA : COLOR_BLUE ) : COLOR_GREEN;
ui::printrect(19+i*3,line,2,1,color); ui::printrect(19+i*3,line,2,1,color);
} }
ui::printtxt(19,line, z80dis::getOpcode(address), colors[2]); ui::printtxt(19,line, m6502dis::getOpcode(address), colors[2]);
ui::printtxt(31,line, z80dis::getAsm(address), colors[3]); ui::printtxt(31,line, m6502dis::getAsm(address), colors[3]);
} else { } else {
ui::printrect(19,line,2,1,COLOR_GRAY); ui::printrect(19,line,2,1,COLOR_GRAY);
ui::printtxt(19,line, tohex(mem::read(address),2), COLOR_WHITE); ui::printtxt(19,line, tohex(mem::read(address),2), COLOR_WHITE);
@@ -500,7 +486,7 @@ namespace z80debugger
printDissasemblerLine(pc, (num_lines/2)-1, true); printDissasemblerLine(pc, (num_lines/2)-1, true);
for (int i=num_lines/2;i<num_lines;++i) { for (int i=num_lines/2;i<num_lines;++i) {
pos += z80dis::getOpcodeSize(pos); pos += m6502dis::getOpcodeSize(pos);
line_address[i] = pos; line_address[i] = pos;
printDissasemblerLine(pos, i, true); printDissasemblerLine(pos, i, true);
} }
@@ -521,42 +507,29 @@ namespace z80debugger
ui::printtxt(midx+3,0, "REGISTERS:", COLOR_WHITE); ui::printtxt(midx+3,0, "REGISTERS:", COLOR_WHITE);
ui::setoffset(midx+1, 1); ui::setoffset(midx+1, 1);
ui::printtxt(0,0, "AF AF' IX ", COLOR_WHITE); ui::printtxt(0,0, "A ", COLOR_WHITE);
ui::printtxt(0,1, "BC BC' IY ", COLOR_WHITE); ui::printtxt(0,1, "X ", COLOR_WHITE);
ui::printtxt(0,2, "DE DE' SP ", COLOR_WHITE); ui::printtxt(0,2, "Y ", COLOR_WHITE);
ui::printtxt(0,3, "HL HL' PC ", COLOR_WHITE); ui::printtxt(0,3, "S ", COLOR_WHITE);
ui::printtxt(0,4, "(BC) (DE) (HL) ", COLOR_WHITE); ui::printtxt(0,4, "P ", COLOR_WHITE);
ui::printtxt(0,5, " I R ", COLOR_WHITE); ui::printtxt(0,5, " ", COLOR_WHITE);
ui::printtxt(3,0, tohex(z80::getAF(), 4), oAF != z80::getAF() ? COLOR_RED : COLOR_GRAY); ui::printtxt(3,0, tohex(m6502::getA(), 2), oA != m6502::getA() ? COLOR_RED : COLOR_GRAY);
ui::printtxt(11,0, tohex(z80::getAF(true), 4), oAF2 != z80::getAF(true) ? COLOR_RED : COLOR_GRAY); ui::printtxt(19,0, tohex(m6502::getPC(), 4), oPC != m6502::getPC() ? COLOR_RED : COLOR_GRAY);
ui::printtxt(19,0, tohex(z80::getIX(), 4), oIX != z80::getIX() ? COLOR_RED : COLOR_GRAY); ui::printtxt(3,1, tohex(m6502::getX(), 4), oX != m6502::getX() ? COLOR_RED : COLOR_GRAY);
ui::printtxt(3,1, tohex(z80::getBC(), 4), oBC != z80::getBC() ? COLOR_RED : COLOR_GRAY); ui::printtxt(3,2, tohex(m6502::getY(), 4), oY != m6502::getY() ? COLOR_RED : COLOR_GRAY);
ui::printtxt(11,1, tohex(z80::getBC(true), 4), oBC2 != z80::getBC(true) ? COLOR_RED : COLOR_GRAY); ui::printtxt(3,3, tohex(m6502::getS(), 4), oS != m6502::getS() ? COLOR_RED : COLOR_GRAY);
ui::printtxt(19,1, tohex(z80::getIY(), 4), oIY != z80::getIY() ? COLOR_RED : COLOR_GRAY); ui::printtxt(3,4, tohex(m6502::getP(), 4), oP != m6502::getP() ? COLOR_RED : COLOR_GRAY);
ui::printtxt(3,2, tohex(z80::getDE(), 4), oDE != z80::getDE() ? COLOR_RED : COLOR_GRAY);
ui::printtxt(11,2, tohex(z80::getDE(true), 4), oDE2 != z80::getDE(true) ? COLOR_RED : COLOR_GRAY);
ui::printtxt(19,2, tohex(z80::getSP(), 4), oSP != z80::getSP() ? COLOR_RED : COLOR_GRAY);
ui::printtxt(3,3, tohex(z80::getHL(), 4), oHL != z80::getHL() ? COLOR_RED : COLOR_GRAY);
ui::printtxt(11,3, tohex(z80::getHL(true), 4), oHL2 != z80::getHL(true) ? COLOR_RED : COLOR_GRAY);
ui::printtxt(19,3, tohex(z80::getPC(), 4), oPC != z80::getPC() ? COLOR_RED : COLOR_GRAY);
ui::printtxt(16,5, tohex(z80::getI(), 2), oI != z80::getI() ? COLOR_RED : COLOR_GRAY); const uint8_t flags = m6502::getP();
ui::printtxt(21,5, tohex(z80::getR(), 2), oR != z80::getR() ? COLOR_RED : COLOR_GRAY); const uint8_t mod_flags = flags ^ oP;
ui::printtxt(0,5,"N", flags&0x80 ? (mod_flags&0x80 ? COLOR_RED : COLOR_WHITE) : (mod_flags&0x80 ? COLOR_BROWN : COLOR_GRAY) );
ui::printtxt(5,4, tohex(mem::read(z80::getBC()), 2), COLOR_GRAY); ui::printtxt(1,5,"V", flags&0x40 ? (mod_flags&0x40 ? COLOR_RED : COLOR_WHITE) : (mod_flags&0x40 ? COLOR_BROWN : COLOR_GRAY) );
ui::printtxt(13,4, tohex(mem::read(z80::getDE()), 2), COLOR_GRAY); ui::printtxt(2,5,"-", flags&0x20 ? (mod_flags&0x20 ? COLOR_RED : COLOR_WHITE) : (mod_flags&0x20 ? COLOR_BROWN : COLOR_GRAY) );
ui::printtxt(21,4, tohex(mem::read(z80::getHL()), 2), COLOR_GRAY); ui::printtxt(3,5,"B", flags&0x10 ? (mod_flags&0x10 ? COLOR_RED : COLOR_WHITE) : (mod_flags&0x10 ? COLOR_BROWN : COLOR_GRAY) );
ui::printtxt(4,5,"D", flags&0x08 ? (mod_flags&0x08 ? COLOR_RED : COLOR_WHITE) : (mod_flags&0x08 ? COLOR_BROWN : COLOR_GRAY) );
const uint8_t flags = (z80::getAF() & 0xFF); ui::printtxt(5,5,"I", flags&0x04 ? (mod_flags&0x04 ? COLOR_RED : COLOR_WHITE) : (mod_flags&0x04 ? COLOR_BROWN : COLOR_GRAY) );
const uint8_t mod_flags = flags ^ (oAF & 0xFF); ui::printtxt(6,5,"Z", flags&0x02 ? (mod_flags&0x02 ? COLOR_RED : COLOR_WHITE) : (mod_flags&0x02 ? COLOR_BROWN : COLOR_GRAY) );
ui::printtxt(0,5,"S", flags&0x80 ? (mod_flags&0x80 ? COLOR_RED : COLOR_WHITE) : (mod_flags&0x80 ? COLOR_BROWN : COLOR_GRAY) );
ui::printtxt(1,5,"Z", flags&0x40 ? (mod_flags&0x40 ? COLOR_RED : COLOR_WHITE) : (mod_flags&0x40 ? COLOR_BROWN : COLOR_GRAY) );
ui::printtxt(2,5,"X", flags&0x20 ? (mod_flags&0x20 ? COLOR_RED : COLOR_WHITE) : (mod_flags&0x20 ? COLOR_BROWN : COLOR_GRAY) );
ui::printtxt(3,5,"H", flags&0x10 ? (mod_flags&0x10 ? COLOR_RED : COLOR_WHITE) : (mod_flags&0x10 ? COLOR_BROWN : COLOR_GRAY) );
ui::printtxt(4,5,"Y", flags&0x08 ? (mod_flags&0x08 ? COLOR_RED : COLOR_WHITE) : (mod_flags&0x08 ? COLOR_BROWN : COLOR_GRAY) );
ui::printtxt(5,5,"P", flags&0x04 ? (mod_flags&0x04 ? COLOR_RED : COLOR_WHITE) : (mod_flags&0x04 ? COLOR_BROWN : COLOR_GRAY) );
ui::printtxt(6,5,"N", flags&0x02 ? (mod_flags&0x02 ? COLOR_RED : COLOR_WHITE) : (mod_flags&0x02 ? COLOR_BROWN : COLOR_GRAY) );
ui::printtxt(7,5,"C", flags&0x01 ? (mod_flags&0x01 ? COLOR_RED : COLOR_WHITE) : (mod_flags&0x01 ? COLOR_BROWN : COLOR_GRAY) ); ui::printtxt(7,5,"C", flags&0x01 ? (mod_flags&0x01 ? COLOR_RED : COLOR_WHITE) : (mod_flags&0x01 ? COLOR_BROWN : COLOR_GRAY) );
@@ -567,10 +540,10 @@ namespace z80debugger
ui::printrect(midx+2,8, 8,1, COLOR_DARK); ui::printrect(midx+2,8, 8,1, COLOR_DARK);
ui::printtxt(midx+3,8, "STACK:", COLOR_WHITE); ui::printtxt(midx+3,8, "STACK:", COLOR_WHITE);
ui::setoffset(midx+1, 9); ui::setoffset(midx+1, 9);
uint16_t sp = z80::getSP();//-(((sym_y-12)>>1)<<1); uint16_t sp = 0x0100 | m6502::getS();//-(((sym_y-12)>>1)<<1);
for (int i=0; i<10; ++i) { for (int i=0; i<10; ++i) {
uint8_t c1=COLOR_CYAN, c2=COLOR_GRAY; uint8_t c1=COLOR_CYAN, c2=COLOR_GRAY;
if (sp == z80::getSP()) { if ((sp & 0xff) == m6502::getS()) {
ui::printrect(0,i,9,1,COLOR_BLUE); ui::printrect(0,i,9,1,COLOR_BLUE);
c1 = c2 = COLOR_YELLOW; c1 = c2 = COLOR_YELLOW;
} }
@@ -692,21 +665,21 @@ namespace z80debugger
ui::printtxt(midx+3,sym_y, "SYMBOLS:", COLOR_WHITE); ui::printtxt(midx+3,sym_y, "SYMBOLS:", COLOR_WHITE);
ui::setoffset(midx+1, sym_y+1); ui::setoffset(midx+1, sym_y+1);
const int num_symbols = z80dis::getNumSymbols(); const int num_symbols = m6502dis::getNumSymbols();
for (int i=0;i<num_symbols;++i) { for (int i=0;i<num_symbols;++i) {
uint8_t colors[2] = {COLOR_GRAY, COLOR_WHITE}; uint8_t colors[2] = {COLOR_GRAY, COLOR_WHITE};
const uint16_t address = z80dis::getSymbolAddress(i); const uint16_t address = m6502dis::getSymbolAddress(i);
if (address==cursor) { if (address==cursor) {
ui::printrect(0,line,23,1,COLOR_BLUE); ui::printrect(0,line,23,1,COLOR_BLUE);
colors[0]=colors[1]=COLOR_YELLOW; colors[0]=colors[1]=COLOR_YELLOW;
} }
ui::printtxt(1, i, tohex(address,4), colors[0]); ui::printtxt(1, i, tohex(address,4), colors[0]);
ui::printtxt(6, i, z80dis::getSymbol(address), colors[1]); ui::printtxt(6, i, m6502dis::getSymbol(address), colors[1]);
} }
if (!msx::is_paused()) { if (!atari2600::is_paused()) {
SDL_SetRenderDrawBlendMode(ren, SDL_BLENDMODE_BLEND); SDL_SetRenderDrawBlendMode(ren, SDL_BLENDMODE_BLEND);
SDL_SetRenderDrawColor(ren, 0, 0, 0, 128); SDL_SetRenderDrawColor(ren, 0, 0, 0, 128);
int w, h; int w, h;
@@ -719,10 +692,12 @@ namespace z80debugger
for (int i=0; i<65536; ++i) mem_modified[i] = false; for (int i=0; i<65536; ++i) mem_modified[i] = false;
oAF = z80::getAF(); oBC = z80::getBC(); oDE = z80::getDE(); oHL = z80::getHL(); oA = m6502::getA();
oAF2 = z80::getAF(true); oBC2 = z80::getBC(true); oDE2 = z80::getDE(true); oHL2 = z80::getHL(true); oX = m6502::getX();
oIX = z80::getIX(); oIY = z80::getIY(); oSP = z80::getSP(); oPC = z80::getPC(); oY = m6502::getY();
oI = z80::getI(); oR = z80::getR(); oS = m6502::getS();
oP = m6502::getP();
oPC = m6502::getPC();
} }
void sendToConsole(const char* text) void sendToConsole(const char* text)
@@ -817,17 +792,17 @@ namespace z80debugger
getcmd(); getcmd();
if (strcmp(cmd, "s")==0 || strcmp(cmd, "step")==0){ if (strcmp(cmd, "s")==0 || strcmp(cmd, "step")==0){
msx::step(); atari2600::step();
display::redraw(); display::redraw();
} else if (strcmp(cmd, "c")==0 || strcmp(cmd, "cont")==0) { } else if (strcmp(cmd, "c")==0 || strcmp(cmd, "cont")==0) {
msx::resume(); atari2600::resume();
} else if (strcmp(cmd, "r")==0 || strcmp(cmd, "reset")==0) { } else if (strcmp(cmd, "r")==0 || strcmp(cmd, "reset")==0) {
msx::init(); atari2600::init();
history::reset(); history::reset();
} else if (strcmp(cmd, "b")==0 || strcmp(cmd, "break")==0) { } else if (strcmp(cmd, "b")==0 || strcmp(cmd, "break")==0) {
getcmd(); getcmd();
if (cmd[0] == 0) { breakpoints[z80::getPC()]=1; return; } if (cmd[0] == 0) { breakpoints[m6502::getPC()]=1; return; }
if (cmd[0] == 'i') { z80::setOption(Z80_OPTION_BREAK_ON_INTERRUPT, !z80::getOption(Z80_OPTION_BREAK_ON_INTERRUPT)); sendToConsoleLog("Break on interrupt."); return; } //if (cmd[0] == 'i') { z80::setOption(Z80_OPTION_BREAK_ON_INTERRUPT, !z80::getOption(Z80_OPTION_BREAK_ON_INTERRUPT)); sendToConsoleLog("Break on interrupt."); return; }
int address = getnum(cmd); int address = getnum(cmd);
if (address<0 || address>65536) { sendToConsoleLog("Illegal break address"); return; } if (address<0 || address>65536) { sendToConsoleLog("Illegal break address"); return; }
getcmd(); getcmd();
@@ -848,7 +823,7 @@ namespace z80debugger
} else if (strcmp(cmd, "d")==0 || strcmp(cmd, "delete")==0) { } else if (strcmp(cmd, "d")==0 || strcmp(cmd, "delete")==0) {
getcmd(); getcmd();
if (strcmp(cmd, "all")==0) { for (int i=0;i<65536;++i) breakpoints[i]=0; return; } if (strcmp(cmd, "all")==0) { for (int i=0;i<65536;++i) breakpoints[i]=0; return; }
if (cmd[0] == 0) { breakpoints[z80::getPC()]=0; return; } if (cmd[0] == 0) { breakpoints[m6502::getPC()]=0; return; }
int address = getnum(cmd); int address = getnum(cmd);
if (address<0 || address>65536) { sendToConsoleLog("Illegal address"); return; } if (address<0 || address>65536) { sendToConsoleLog("Illegal address"); return; }
getcmd(); getcmd();
@@ -881,23 +856,15 @@ namespace z80debugger
char filename[256]; char filename[256];
strcpy(filename, cmd); strcpy(filename, cmd);
loadstate(filename); loadstate(filename);
} else if (strcmp(cmd, "t")==0 || strcmp(cmd, "tape")==0) { } else if (strcmp(cmd, "rom")==0) {
getcmd(); getcmd();
if (strcmp(cmd, "load")==0) { if (strcmp(cmd, "load")==0) {
getcmd(); getcmd();
char filename[256]; char filename[256];
strcpy(filename, cmd); strcpy(filename, cmd);
cassette::load_cas_file(filename); rom::load(filename);
} else if (strcmp(cmd, "play")==0) { atari2600::init();
//zx_tape::play(); history::reset();
}
} else if (strcmp(cmd, "disk")==0) {
getcmd();
if (strcmp(cmd, "load")==0) {
getcmd();
char filename[256];
strcpy(filename, cmd);
//zx_disk::load(filename);
} }
} else if (strcmp(cmd, "poke")==0) { } else if (strcmp(cmd, "poke")==0) {
getcmd(); getcmd();
@@ -911,18 +878,15 @@ namespace z80debugger
int value = mem::read(address); int value = mem::read(address);
char tmp[10]; char tmp[10];
sendToConsoleLog(SDL_itoa(value, tmp, 10)); sendToConsoleLog(SDL_itoa(value, tmp, 10));
} else if (strcmp(cmd, "reg")==0) { // } else if (strcmp(cmd, "reg")==0) {
getcmd(); // getcmd();
if (strcmp(cmd, "f")==0) { getcmd(); int value = getnum(cmd); z80::getRegs()[0] = value; } // if (strcmp(cmd, "a")==0) { getcmd(); int value = getnum(cmd); m6502::getRegs()[0] = value; }
else if (strcmp(cmd, "a")==0) { getcmd(); int value = getnum(cmd); z80::getRegs()[1] = value; } // else if (strcmp(cmd, "x")==0) { getcmd(); int value = getnum(cmd); m6502::getRegs()[1] = value; }
else if (strcmp(cmd, "c")==0) { getcmd(); int value = getnum(cmd); z80::getRegs()[2] = value; } // else if (strcmp(cmd, "y")==0) { getcmd(); int value = getnum(cmd); m6502::getRegs()[2] = value; }
else if (strcmp(cmd, "b")==0) { getcmd(); int value = getnum(cmd); z80::getRegs()[3] = value; } // else if (strcmp(cmd, "s")==0) { getcmd(); int value = getnum(cmd); m6502::getRegs()[3] = value; }
else if (strcmp(cmd, "e")==0) { getcmd(); int value = getnum(cmd); z80::getRegs()[4] = value; } // else if (strcmp(cmd, "p")==0) { getcmd(); int value = getnum(cmd); m6502::getRegs()[4] = value; }
else if (strcmp(cmd, "d")==0) { getcmd(); int value = getnum(cmd); z80::getRegs()[5] = value; } // else if (strcmp(cmd, "pc")==0) { getcmd(); int value = getnum(cmd); m6502::getRegs()[24] = value&0xff; z80::getRegs()[25] = (value>>8)&0xff; }
else if (strcmp(cmd, "l")==0) { getcmd(); int value = getnum(cmd); z80::getRegs()[6] = value; } // else { sendToConsoleLog("Syntax error: invalid register"); return; }
else if (strcmp(cmd, "h")==0) { getcmd(); int value = getnum(cmd); z80::getRegs()[7] = value; }
else if (strcmp(cmd, "pc")==0) { getcmd(); int value = getnum(cmd); z80::getRegs()[24] = value&0xff; z80::getRegs()[25] = (value>>8)&0xff; }
else { sendToConsoleLog("Syntax error: invalid register"); return; }
} else if (strcmp(cmd, "g")==0 || strcmp(cmd, "goto")==0) { } else if (strcmp(cmd, "g")==0 || strcmp(cmd, "goto")==0) {
getcmd(); getcmd();
int address = getnum(cmd); int address = getnum(cmd);
@@ -936,19 +900,19 @@ namespace z80debugger
char tmp[12]; strcpy(tmp, cmd); char tmp[12]; strcpy(tmp, cmd);
getcmd(); getcmd();
if (cmd[0]==0) { if (cmd[0]==0) {
z80dis::setSymbol(z80::getPC(), tmp); m6502dis::setSymbol(m6502::getPC(), tmp);
} else { } else {
int value = getnum(cmd); int value = getnum(cmd);
z80dis::setSymbol(value, tmp); m6502dis::setSymbol(value, tmp);
} }
sendToConsoleLog("Symbol added"); sendToConsoleLog("Symbol added");
} else if (strcmp(cmd, "del")==0) { } else if (strcmp(cmd, "del")==0) {
getcmd(); getcmd();
if (cmd[0]==0) { if (cmd[0]==0) {
z80dis::setSymbol(z80::getPC(), NULL); m6502dis::setSymbol(m6502::getPC(), NULL);
} else { } else {
int value = getnum(cmd); int value = getnum(cmd);
z80dis::setSymbol(value, NULL); m6502dis::setSymbol(value, NULL);
} }
sendToConsoleLog("Symbol removed"); sendToConsoleLog("Symbol removed");
} }
@@ -1006,18 +970,18 @@ namespace z80debugger
uint32_t next() uint32_t next()
{ {
breakpoints[z80::getPC()+z80dis::getOpcodeSize(z80::getPC())] |= 8; breakpoints[m6502::getPC()+m6502dis::getOpcodeSize(m6502::getPC())] |= 8;
const uint32_t t = z80::step(); //const uint32_t t = m6502::step();
cont(); cont();
return t; return 0; //t;
} }
uint32_t stepout() uint32_t stepout()
{ {
z80::setOption(Z80_OPTION_BREAK_ON_RET, true); //z80::setOption(Z80_OPTION_BREAK_ON_RET, true);
const uint32_t t = z80::step(); //const uint32_t t = z80::step();
cont(); //cont();
return t; //return t;
} }
void setmemmodified(const uint16_t addr) void setmemmodified(const uint16_t addr)
@@ -1075,7 +1039,7 @@ namespace z80debugger
void cursorfwd() void cursorfwd()
{ {
cursor += z80dis::getOpcodeSize(cursor); cursor += m6502dis::getOpcodeSize(cursor);
} }
void cursorback() void cursorback()
@@ -1085,53 +1049,37 @@ namespace z80debugger
void useOpcode(const uint8_t opcode, const uint8_t base) void useOpcode(const uint8_t opcode, const uint8_t base)
{ {
if (use[base][opcode]<255) use[base][opcode]++; if (use[opcode]<255) use[opcode]++;
} }
void clearUsedOpcodes() void clearUsedOpcodes()
{ {
for (int i=0; i<7; ++i) { for (int i=0; i<256; ++i) {
for (int j=0; j<256; ++j) { use[i]=0;
use[i][j]=0;
}
} }
} }
void markUsedOpcodes() void markUsedOpcodes()
{ {
for (int i=0; i<7; ++i) { for (int i=0; i<256; ++i) {
for (int j=0; j<256; ++j) { if (use[i]==1) use[i]++;
if (use[i][j]==1) use[i][j]++;
}
} }
} }
const int getNumOpcodesUsed() const int getNumOpcodesUsed()
{ {
int count = 0; int count = 0;
for (int i=0; i<7; ++i) { for (int i=0; i<256; ++i) {
for (int j=0; j<256; ++j) { if (use[i]==1) count++;
if (use[i][j]==1) count++;
}
} }
return count; return count;
} }
void printOpcodesUsed() void printOpcodesUsed()
{ {
for (int i=0; i<7; ++i) { for (int i=0; i<256; ++i) {
for (int j=0; j<256; ++j) { if (use[i]==1) {
if (use[i][j]==1) { printf("%2X\n",i);
switch (i) {
case 1: printf("ED "); break;
case 2: printf("CB "); break;
case 3: printf("DD "); break;
case 4: printf("DD CB "); break;
case 5: printf("FD "); break;
case 6: printf("FD CB "); break;
}
printf("%2X\n",j);
}
} }
} }
} }
@@ -1182,29 +1130,29 @@ namespace z80debugger
void store() void store()
{ {
buffer[++top] = z80::getPC(); buffer[++top] = m6502::getPC();
pos=top; pos=top;
} }
void gototop() void gototop()
{ {
pos = top; pos = top;
z80::setPC(buffer[pos]); //m6502::setPC(buffer[pos]);
cursor = z80::getPC(); cursor = m6502::getPC();
} }
void goforward() void goforward()
{ {
if (pos == top) return; if (pos == top) return;
z80::setPC(buffer[++pos]); //m6502::setPC(buffer[++pos]);
cursor = z80::getPC(); cursor = m6502::getPC();
} }
void goback() void goback()
{ {
if (uint8_t(pos-1) == top) return; if (uint8_t(pos-1) == top) return;
z80::setPC(buffer[--pos]); //m6502::setPC(buffer[--pos]);
cursor = z80::getPC(); cursor = m6502::getPC();
} }
} }
+1 -1
View File
@@ -1,7 +1,7 @@
#pragma once #pragma once
#include <stdint.h> #include <stdint.h>
namespace z80debugger namespace m6502debugger
{ {
#define MEMTAG_NONE 0x00 #define MEMTAG_NONE 0x00
#define MEMTAG_DATA 0x01 #define MEMTAG_DATA 0x01
+171
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -2,7 +2,7 @@
#include <stdint.h> #include <stdint.h>
namespace z80dis namespace m6502dis
{ {
void loadSymbols(); void loadSymbols();
void saveSymbols(); void saveSymbols();
+33 -21
View File
@@ -36,6 +36,11 @@ namespace m6502
uint16_t exec_PC; uint16_t exec_PC;
uint16_t getPC() { return exec_PC; } uint16_t getPC() { return exec_PC; }
uint8_t getA() { return rA; }
uint8_t getX() { return rX; }
uint8_t getY() { return rY; }
uint8_t getS() { return rS; }
uint8_t getP() { return rP; }
// Explicit 16-bit accessors prevent UB and stay host-endian safe // Explicit 16-bit accessors prevent UB and stay host-endian safe
inline uint16_t get_PC() { return (uint16_t)rPC_lo | ((uint16_t)rPC_hi << 8); } inline uint16_t get_PC() { return (uint16_t)rPC_lo | ((uint16_t)rPC_hi << 8); }
@@ -114,7 +119,7 @@ namespace m6502
/* 0x15 ORA zpg,X */ { miFetchOperandLo, miIndexX, miReadAddress, miFetchOpcode }, /* 0x15 ORA zpg,X */ { miFetchOperandLo, miIndexX, miReadAddress, miFetchOpcode },
/* 0x16 ASL zpg,X */ { miFetchOperandLo, miIndexX, miReadAddress, miWriteAddress, miWriteAddress, miFetchOpcode }, /* 0x16 ASL zpg,X */ { miFetchOperandLo, miIndexX, miReadAddress, miWriteAddress, miWriteAddress, miFetchOpcode },
/* 0x17 --- */ { miFetchOpcode }, /* 0x17 --- */ { miFetchOpcode },
/* 0x18 CLC */ { miFetchOperandLo, miFetchOpcode }, /* 0x18 CLC */ { miFakeFetchOperand, miFetchOpcode },
/* 0x19 ORA abs,Y */ { miFetchOperandLo, miFetchOperandHiAndIndexY, miReadAddressAndSkip, miReadAddress, miFetchOpcode }, /* 0x19 ORA abs,Y */ { miFetchOperandLo, miFetchOperandHiAndIndexY, miReadAddressAndSkip, miReadAddress, miFetchOpcode },
/* 0x1A --- */ { miFetchOpcode }, /* 0x1A --- */ { miFetchOpcode },
/* 0x1B --- */ { miFetchOpcode }, /* 0x1B --- */ { miFetchOpcode },
@@ -148,7 +153,7 @@ namespace m6502
/* 0x35 AND zpg,X */ { miFetchOperandLo, miIndexX, miReadAddress, miFetchOpcode }, /* 0x35 AND zpg,X */ { miFetchOperandLo, miIndexX, miReadAddress, miFetchOpcode },
/* 0x36 ROL zpg,X */ { miFetchOperandLo, miIndexX, miReadAddress, miWriteAddress, miWriteAddress, miFetchOpcode }, /* 0x36 ROL zpg,X */ { miFetchOperandLo, miIndexX, miReadAddress, miWriteAddress, miWriteAddress, miFetchOpcode },
/* 0x37 --- */ { miFetchOpcode }, /* 0x37 --- */ { miFetchOpcode },
/* 0x38 SEC */ { miFetchOperandLo, miFetchOpcode }, /* 0x38 SEC */ { miFakeFetchOperand, miFetchOpcode },
/* 0x39 AND abs,Y */ { miFetchOperandLo, miFetchOperandHiAndIndexY, miReadAddressAndSkip, miReadAddress, miFetchOpcode }, /* 0x39 AND abs,Y */ { miFetchOperandLo, miFetchOperandHiAndIndexY, miReadAddressAndSkip, miReadAddress, miFetchOpcode },
/* 0x3A --- */ { miFetchOpcode }, /* 0x3A --- */ { miFetchOpcode },
/* 0x3B --- */ { miFetchOpcode }, /* 0x3B --- */ { miFetchOpcode },
@@ -165,7 +170,7 @@ namespace m6502
/* 0x45 EOR zpg */ { miFetchOperandLo, miReadAddress, miFetchOpcode }, /* 0x45 EOR zpg */ { miFetchOperandLo, miReadAddress, miFetchOpcode },
/* 0x46 LSR zpg */ { miFetchOperandLo, miReadAddress, miWriteAddress, miWriteAddress, miFetchOpcode }, /* 0x46 LSR zpg */ { miFetchOperandLo, miReadAddress, miWriteAddress, miWriteAddress, miFetchOpcode },
/* 0x47 --- */ { miFetchOpcode }, /* 0x47 --- */ { miFetchOpcode },
/* 0x48 PHA */ { miFetchOperandLo, miPushA, miFetchOpcode }, /* 0x48 PHA */ { miFakeFetchOperand, miPushA, miFetchOpcode },
/* 0x49 EOR imm */ { miFetchOperandLo, miFetchOpcode }, /* 0x49 EOR imm */ { miFetchOperandLo, miFetchOpcode },
/* 0x4A LSR A */ { miFakeFetchOperand, miFetchOpcode }, /* 0x4A LSR A */ { miFakeFetchOperand, miFetchOpcode },
/* 0x4B --- */ { miFetchOpcode }, /* 0x4B --- */ { miFetchOpcode },
@@ -182,7 +187,7 @@ namespace m6502
/* 0x55 EOR zpg,X */ { miFetchOperandLo, miIndexX, miReadAddress, miFetchOpcode }, /* 0x55 EOR zpg,X */ { miFetchOperandLo, miIndexX, miReadAddress, miFetchOpcode },
/* 0x56 LSR zpg,X */ { miFetchOperandLo, miIndexX, miReadAddress, miWriteAddress, miWriteAddress, miFetchOpcode }, /* 0x56 LSR zpg,X */ { miFetchOperandLo, miIndexX, miReadAddress, miWriteAddress, miWriteAddress, miFetchOpcode },
/* 0x57 --- */ { miFetchOpcode }, /* 0x57 --- */ { miFetchOpcode },
/* 0x58 CLI */ { miFetchOperandLo, miFetchOpcode }, /* 0x58 CLI */ { miFakeFetchOperand, miFetchOpcode },
/* 0x59 EOR abs,Y */ { miFetchOperandLo, miFetchOperandHiAndIndexY, miReadAddressAndSkip, miReadAddress, miFetchOpcode }, /* 0x59 EOR abs,Y */ { miFetchOperandLo, miFetchOperandHiAndIndexY, miReadAddressAndSkip, miReadAddress, miFetchOpcode },
/* 0x5A --- */ { miFetchOpcode }, /* 0x5A --- */ { miFetchOpcode },
/* 0x5B --- */ { miFetchOpcode }, /* 0x5B --- */ { miFetchOpcode },
@@ -199,7 +204,7 @@ namespace m6502
/* 0x65 ADC zpg */ { miFetchOperandLo, miReadAddress, miFetchOpcode }, /* 0x65 ADC zpg */ { miFetchOperandLo, miReadAddress, miFetchOpcode },
/* 0x66 ROR zpg */ { miFetchOperandLo, miReadAddress, miWriteAddress, miWriteAddress, miFetchOpcode }, /* 0x66 ROR zpg */ { miFetchOperandLo, miReadAddress, miWriteAddress, miWriteAddress, miFetchOpcode },
/* 0x67 --- */ { miFetchOpcode }, /* 0x67 --- */ { miFetchOpcode },
/* 0x68 PLA */ { miFetchOperandLo, miFakeFetchOperand, miPullA, miFetchOpcode }, /* 0x68 PLA */ { miFakeFetchOperand, miFakeFetchOperand, miPullA, miFetchOpcode },
/* 0x69 ADC imm */ { miFetchOperandLo, miFetchOpcode }, /* 0x69 ADC imm */ { miFetchOperandLo, miFetchOpcode },
/* 0x6A ROR A */ { miFakeFetchOperand, miFetchOpcode }, /* 0x6A ROR A */ { miFakeFetchOperand, miFetchOpcode },
/* 0x6B --- */ { miFetchOpcode }, /* 0x6B --- */ { miFetchOpcode },
@@ -216,7 +221,7 @@ namespace m6502
/* 0x75 ADC zpg,X */ { miFetchOperandLo, miIndexX, miReadAddress, miFetchOpcode }, /* 0x75 ADC zpg,X */ { miFetchOperandLo, miIndexX, miReadAddress, miFetchOpcode },
/* 0x76 ROR zpg,X */ { miFetchOperandLo, miIndexX, miReadAddress, miWriteAddress, miWriteAddress, miFetchOpcode }, /* 0x76 ROR zpg,X */ { miFetchOperandLo, miIndexX, miReadAddress, miWriteAddress, miWriteAddress, miFetchOpcode },
/* 0x77 --- */ { miFetchOpcode }, /* 0x77 --- */ { miFetchOpcode },
/* 0x78 SEI */ { miFetchOperandLo, miFetchOpcode }, /* 0x78 SEI */ { miFakeFetchOperand, miFetchOpcode },
/* 0x79 ADC abs,Y */ { miFetchOperandLo, miFetchOperandHiAndIndexY, miReadAddressAndSkip, miReadAddress, miFetchOpcode }, /* 0x79 ADC abs,Y */ { miFetchOperandLo, miFetchOperandHiAndIndexY, miReadAddressAndSkip, miReadAddress, miFetchOpcode },
/* 0x7A --- */ { miFetchOpcode }, /* 0x7A --- */ { miFetchOpcode },
/* 0x7B --- */ { miFetchOpcode }, /* 0x7B --- */ { miFetchOpcode },
@@ -233,9 +238,9 @@ namespace m6502
/* 0x85 STA zpg */ { miFetchOperandLo, miWriteRegister, miFetchOpcode }, /* 0x85 STA zpg */ { miFetchOperandLo, miWriteRegister, miFetchOpcode },
/* 0x86 STX zpg */ { miFetchOperandLo, miWriteRegister, miFetchOpcode }, /* 0x86 STX zpg */ { miFetchOperandLo, miWriteRegister, miFetchOpcode },
/* 0x87 --- */ { miFetchOpcode }, /* 0x87 --- */ { miFetchOpcode },
/* 0x88 DEY */ { miFetchOperandLo, miFetchOpcode }, /* 0x88 DEY */ { miFakeFetchOperand, miFetchOpcode },
/* 0x89 --- */ { miFetchOpcode }, /* 0x89 --- */ { miFetchOpcode },
/* 0x8A TXA */ { miFetchOperandLo, miFetchOpcode }, /* 0x8A TXA */ { miFakeFetchOperand, miFetchOpcode },
/* 0x8B --- */ { miFetchOpcode }, /* 0x8B --- */ { miFetchOpcode },
/* 0x8C STY abs */ { miFetchOperandLo, miFetchOperandHi, miWriteRegister, miFetchOpcode }, /* 0x8C STY abs */ { miFetchOperandLo, miFetchOperandHi, miWriteRegister, miFetchOpcode },
/* 0x8D STA abs */ { miFetchOperandLo, miFetchOperandHi, miWriteRegister, miFetchOpcode }, /* 0x8D STA abs */ { miFetchOperandLo, miFetchOperandHi, miWriteRegister, miFetchOpcode },
@@ -250,9 +255,9 @@ namespace m6502
/* 0x95 STA zpg,X */ { miFetchOperandLo, miIndexX, miWriteRegister, miFetchOpcode }, /* 0x95 STA zpg,X */ { miFetchOperandLo, miIndexX, miWriteRegister, miFetchOpcode },
/* 0x96 STX zpg,X */ { miFetchOperandLo, miIndexX, miWriteRegister, miFetchOpcode }, /* 0x96 STX zpg,X */ { miFetchOperandLo, miIndexX, miWriteRegister, miFetchOpcode },
/* 0x97 --- */ { miFetchOpcode }, /* 0x97 --- */ { miFetchOpcode },
/* 0x98 TYA */ { miFetchOperandLo, miFetchOpcode }, /* 0x98 TYA */ { miFakeFetchOperand, miFetchOpcode },
/* 0x99 STA abs,Y */ { miFetchOperandLo, miFetchOperandHiAndIndexY, miReadAddress, miWriteRegister, miFetchOpcode }, /* 0x99 STA abs,Y */ { miFetchOperandLo, miFetchOperandHiAndIndexY, miReadAddress, miWriteRegister, miFetchOpcode },
/* 0x9A TXS */ { miFetchOperandLo, miFetchOpcode }, /* 0x9A TXS */ { miFakeFetchOperand, miFetchOpcode },
/* 0x9B --- */ { miFetchOpcode }, /* 0x9B --- */ { miFetchOpcode },
/* 0x9C --- */ { miFetchOpcode }, /* 0x9C --- */ { miFetchOpcode },
/* 0x9D STA abs,X */ { miFetchOperandLo, miFetchOperandHiAndIndexX, miReadAddress, miWriteRegister, miFetchOpcode }, /* 0x9D STA abs,X */ { miFetchOperandLo, miFetchOperandHiAndIndexX, miReadAddress, miWriteRegister, miFetchOpcode },
@@ -267,9 +272,9 @@ namespace m6502
/* 0xA5 LDA zpg */ { miFetchOperandLo, miReadAddress, miFetchOpcode }, /* 0xA5 LDA zpg */ { miFetchOperandLo, miReadAddress, miFetchOpcode },
/* 0xA6 LDX zpg */ { miFetchOperandLo, miReadAddress, miFetchOpcode }, /* 0xA6 LDX zpg */ { miFetchOperandLo, miReadAddress, miFetchOpcode },
/* 0xA7 --- */ { miFetchOpcode }, /* 0xA7 --- */ { miFetchOpcode },
/* 0xA8 TAY */ { miFetchOperandLo, miFetchOpcode }, /* 0xA8 TAY */ { miFakeFetchOperand, miFetchOpcode },
/* 0xA9 LDA imm */ { miFetchOperandLo, miFetchOpcode }, /* 0xA9 LDA imm */ { miFetchOperandLo, miFetchOpcode },
/* 0xAA TAX */ { miFetchOperandLo, miFetchOpcode }, /* 0xAA TAX */ { miFakeFetchOperand, miFetchOpcode },
/* 0xAB --- */ { miFetchOpcode }, /* 0xAB --- */ { miFetchOpcode },
/* 0xAC LDY abs */ { miFetchOperandLo, miFetchOperandHi, miReadAddress, miFetchOpcode }, /* 0xAC LDY abs */ { miFetchOperandLo, miFetchOperandHi, miReadAddress, miFetchOpcode },
/* 0xAD LDA abs */ { miFetchOperandLo, miFetchOperandHi, miReadAddress, miFetchOpcode }, /* 0xAD LDA abs */ { miFetchOperandLo, miFetchOperandHi, miReadAddress, miFetchOpcode },
@@ -284,9 +289,9 @@ namespace m6502
/* 0xB5 LDA zpg,X */ { miFetchOperandLo, miIndexX, miReadAddress, miFetchOpcode }, /* 0xB5 LDA zpg,X */ { miFetchOperandLo, miIndexX, miReadAddress, miFetchOpcode },
/* 0xB6 LDX zpg,Y */ { miFetchOperandLo, miIndexY, miReadAddress, miFetchOpcode }, /* 0xB6 LDX zpg,Y */ { miFetchOperandLo, miIndexY, miReadAddress, miFetchOpcode },
/* 0xB7 --- */ { miFetchOpcode }, /* 0xB7 --- */ { miFetchOpcode },
/* 0xB8 CLV */ { miFetchOperandLo, miFetchOpcode }, /* 0xB8 CLV */ { miFakeFetchOperand, miFetchOpcode },
/* 0xB9 LDA abs,Y */ { miFetchOperandLo, miFetchOperandHiAndIndexY, miReadAddressAndSkip, miReadAddress, miFetchOpcode }, /* 0xB9 LDA abs,Y */ { miFetchOperandLo, miFetchOperandHiAndIndexY, miReadAddressAndSkip, miReadAddress, miFetchOpcode },
/* 0xBA TSX */ { miFetchOperandLo, miFetchOpcode }, /* 0xBA TSX */ { miFakeFetchOperand, miFetchOpcode },
/* 0xBB --- */ { miFetchOpcode }, /* 0xBB --- */ { miFetchOpcode },
/* 0xBC LDY abs,X */ { miFetchOperandLo, miFetchOperandHiAndIndexX, miReadAddressAndSkip, miReadAddress, miFetchOpcode }, /* 0xBC LDY abs,X */ { miFetchOperandLo, miFetchOperandHiAndIndexX, miReadAddressAndSkip, miReadAddress, miFetchOpcode },
/* 0xBD LDA abs,X */ { miFetchOperandLo, miFetchOperandHiAndIndexX, miReadAddressAndSkip, miReadAddress, miFetchOpcode }, /* 0xBD LDA abs,X */ { miFetchOperandLo, miFetchOperandHiAndIndexX, miReadAddressAndSkip, miReadAddress, miFetchOpcode },
@@ -301,9 +306,9 @@ namespace m6502
/* 0xC5 CMP zpg */ { miFetchOperandLo, miReadAddress, miFetchOpcode }, /* 0xC5 CMP zpg */ { miFetchOperandLo, miReadAddress, miFetchOpcode },
/* 0xC6 DEC zpg */ { miFetchOperandLo, miReadAddress, miWriteAddress, miWriteAddress, miFetchOpcode }, /* 0xC6 DEC zpg */ { miFetchOperandLo, miReadAddress, miWriteAddress, miWriteAddress, miFetchOpcode },
/* 0xC7 --- */ { miFetchOpcode }, /* 0xC7 --- */ { miFetchOpcode },
/* 0xC8 INY */ { miFetchOperandLo, miFetchOpcode }, /* 0xC8 INY */ { miFakeFetchOperand, miFetchOpcode },
/* 0xC9 CMP imm */ { miFetchOperandLo, miFetchOpcode }, /* 0xC9 CMP imm */ { miFetchOperandLo, miFetchOpcode },
/* 0xCA DEX */ { miFetchOperandLo, miFetchOpcode }, /* 0xCA DEX */ { miFakeFetchOperand, miFetchOpcode },
/* 0xCB --- */ { miFetchOpcode }, /* 0xCB --- */ { miFetchOpcode },
/* 0xCC CPY abs */ { miFetchOperandLo, miFetchOperandHi, miReadAddress, miFetchOpcode }, /* 0xCC CPY abs */ { miFetchOperandLo, miFetchOperandHi, miReadAddress, miFetchOpcode },
/* 0xCD CMP abs */ { miFetchOperandLo, miFetchOperandHi, miReadAddress, miFetchOpcode }, /* 0xCD CMP abs */ { miFetchOperandLo, miFetchOperandHi, miReadAddress, miFetchOpcode },
@@ -318,7 +323,7 @@ namespace m6502
/* 0xD5 CMP zpg,X */ { miFetchOperandLo, miIndexX, miReadAddress, miFetchOpcode }, /* 0xD5 CMP zpg,X */ { miFetchOperandLo, miIndexX, miReadAddress, miFetchOpcode },
/* 0xD6 DEC zpg,X */ { miFetchOperandLo, miIndexX, miReadAddress, miWriteAddress, miWriteAddress, miFetchOpcode }, /* 0xD6 DEC zpg,X */ { miFetchOperandLo, miIndexX, miReadAddress, miWriteAddress, miWriteAddress, miFetchOpcode },
/* 0xD7 --- */ { miFetchOpcode }, /* 0xD7 --- */ { miFetchOpcode },
/* 0xD8 CLD */ { miFetchOperandLo, miFetchOpcode }, /* 0xD8 CLD */ { miFakeFetchOperand, miFetchOpcode },
/* 0xD9 CMP abs,Y */ { miFetchOperandLo, miFetchOperandHiAndIndexY, miReadAddressAndSkip, miReadAddress, miFetchOpcode }, /* 0xD9 CMP abs,Y */ { miFetchOperandLo, miFetchOperandHiAndIndexY, miReadAddressAndSkip, miReadAddress, miFetchOpcode },
/* 0xDA --- */ { miFetchOpcode }, /* 0xDA --- */ { miFetchOpcode },
/* 0xDB --- */ { miFetchOpcode }, /* 0xDB --- */ { miFetchOpcode },
@@ -335,9 +340,9 @@ namespace m6502
/* 0xE5 SBC zpg */ { miFetchOperandLo, miReadAddress, miFetchOpcode }, /* 0xE5 SBC zpg */ { miFetchOperandLo, miReadAddress, miFetchOpcode },
/* 0xE6 INC zpg */ { miFetchOperandLo, miReadAddress, miWriteAddress, miWriteAddress, miFetchOpcode }, /* 0xE6 INC zpg */ { miFetchOperandLo, miReadAddress, miWriteAddress, miWriteAddress, miFetchOpcode },
/* 0xE7 --- */ { miFetchOpcode }, /* 0xE7 --- */ { miFetchOpcode },
/* 0xE8 INX */ { miFetchOperandLo, miFetchOpcode }, /* 0xE8 INX */ { miFakeFetchOperand, miFetchOpcode },
/* 0xE9 SBC imm */ { miFetchOperandLo, miFetchOpcode }, /* 0xE9 SBC imm */ { miFetchOperandLo, miFetchOpcode },
/* 0xEA NOP */ { miFetchOpcode }, /* 0xEA NOP */ { miFakeFetchOperand },
/* 0xEB --- */ { miFetchOpcode }, /* 0xEB --- */ { miFetchOpcode },
/* 0xEC CPX abs */ { miFetchOperandLo, miFetchOperandHi, miReadAddress, miFetchOpcode }, /* 0xEC CPX abs */ { miFetchOperandLo, miFetchOperandHi, miReadAddress, miFetchOpcode },
/* 0xED SBC abs */ { miFetchOperandLo, miFetchOperandHi, miReadAddress, miFetchOpcode }, /* 0xED SBC abs */ { miFetchOperandLo, miFetchOperandHi, miReadAddress, miFetchOpcode },
@@ -352,7 +357,7 @@ namespace m6502
/* 0xF5 SBC zpg,X */ { miFetchOperandLo, miIndexX, miReadAddress, miFetchOpcode }, /* 0xF5 SBC zpg,X */ { miFetchOperandLo, miIndexX, miReadAddress, miFetchOpcode },
/* 0xF6 INC zpg,X */ { miFetchOperandLo, miIndexX, miReadAddress, miWriteAddress, miWriteAddress, miFetchOpcode }, /* 0xF6 INC zpg,X */ { miFetchOperandLo, miIndexX, miReadAddress, miWriteAddress, miWriteAddress, miFetchOpcode },
/* 0xF7 --- */ { miFetchOpcode }, /* 0xF7 --- */ { miFetchOpcode },
/* 0xF8 SED */ { miFetchOperandLo, miFetchOpcode }, /* 0xF8 SED */ { miFakeFetchOperand, miFetchOpcode },
/* 0xF9 SBC abs,Y */ { miFetchOperandLo, miFetchOperandHiAndIndexY, miReadAddressAndSkip, miReadAddress, miFetchOpcode }, /* 0xF9 SBC abs,Y */ { miFetchOperandLo, miFetchOperandHiAndIndexY, miReadAddressAndSkip, miReadAddress, miFetchOpcode },
/* 0xFA --- */ { miFetchOpcode }, /* 0xFA --- */ { miFetchOpcode },
/* 0xFB --- */ { miFetchOpcode }, /* 0xFB --- */ { miFetchOpcode },
@@ -598,7 +603,14 @@ namespace m6502
void reset() void reset()
{ {
rPC_lo = mem::read(0xfffc);
rPC_hi = mem::read(0xfffd);
exec_PC = get_PC();
rS = 0xfd;
rP = 0x34;
rA = 0;
rX = 0;
rY = 0;
} }
void interrupt(uint8_t type) void interrupt(uint8_t type)
+5
View File
@@ -7,5 +7,10 @@ namespace m6502
void interrupt(uint8_t type); void interrupt(uint8_t type);
bool tick(); bool tick();
uint8_t getA();
uint8_t getX();
uint8_t getY();
uint8_t getS();
uint8_t getP();
uint16_t getPC(); uint16_t getPC();
} }
+5 -4
View File
@@ -6,7 +6,7 @@
#include "display.h" #include "display.h"
#include "speaker.h" #include "speaker.h"
//#include "keyboard.h" //#include "keyboard.h"
//#include "z80debugger.h" #include "6502debugger.h"
#define NTSC_CLOCK 1193182.0f #define NTSC_CLOCK 1193182.0f
#define PAL_CLOCK 1182298.0f #define PAL_CLOCK 1182298.0f
@@ -30,7 +30,6 @@ namespace atari2600
speaker::init(NTSC_CLOCK); speaker::init(NTSC_CLOCK);
speaker::register_source(tia::audio::get_sample0); speaker::register_source(tia::audio::get_sample0);
speaker::register_source(tia::audio::get_sample1); speaker::register_source(tia::audio::get_sample1);
//speaker::register_source(keyboard::get_sample);
} }
void quit() void quit()
@@ -38,11 +37,13 @@ namespace atari2600
should_exit = true; should_exit = true;
} }
int ppc = 0;
void step() void step()
{ {
//uint8_t t_states; //uint8_t t_states;
//uint16_t pc = m6502::getPC(); uint16_t pc = m6502::getPC();
ppc += pc;
m6502debugger::onInstructionExecute(pc);
// if (z80debugger::isbreak(pc, 9)) { // if (z80debugger::isbreak(pc, 9)) {
// msx::pause(); // msx::pause();
// z80debugger::show(); // z80debugger::show();
+2 -2
View File
@@ -3,7 +3,7 @@
#include "tia.h" #include "tia.h"
#include "atari2600.h" #include "atari2600.h"
#include "ui_window.h" #include "ui_window.h"
//#include "z80debugger.h" #include "6502debugger.h"
#include "ui.h" #include "ui.h"
namespace display namespace display
@@ -68,7 +68,7 @@ namespace display
if (e->type == SDL_EVENT_KEY_DOWN) { if (e->type == SDL_EVENT_KEY_DOWN) {
const SDL_Scancode &key = e->key.scancode; const SDL_Scancode &key = e->key.scancode;
switch (key) { switch (key) {
case SDL_SCANCODE_F8: atari2600::pause(); /*z80debugger::show();*/ break; case SDL_SCANCODE_F8: atari2600::pause(); m6502debugger::show(); break;
case SDL_SCANCODE_F12: if (atari2600::is_paused()) atari2600::resume(); else atari2600::pause(); break; case SDL_SCANCODE_F12: if (atari2600::is_paused()) atari2600::resume(); else atari2600::pause(); break;
case SDL_SCANCODE_Q: if (e->key.mod & SDL_KMOD_CTRL) { return false; break; } case SDL_SCANCODE_Q: if (e->key.mod & SDL_KMOD_CTRL) { return false; break; }
default: break; default: break;
+6 -5
View File
@@ -3,20 +3,21 @@
#include "rom.h" #include "rom.h"
#include "ui.h" #include "ui.h"
#include "ui_window.h" #include "ui_window.h"
#include "6502debugger.h"
//#include "z80debugger.h"
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO); SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO);
atari2600::init();
if (argc > 1) { if (argc > 1) {
rom::load(argv[1]); rom::load(argv[1]);
} else { } else {
rom::load("combat.bin"); rom::load("combat.bin");
} }
atari2600::init();
atari2600::pause();
m6502debugger::show();
int wait = 16; int wait = 16;
SDL_Event e; SDL_Event e;
while (!atari2600::is_quitting()) { while (!atari2600::is_quitting()) {
@@ -31,7 +32,7 @@ int main(int argc, char *argv[]) {
if (e.type == SDL_EVENT_KEY_DOWN) { if (e.type == SDL_EVENT_KEY_DOWN) {
if (atari2600::is_paused()) { if (atari2600::is_paused()) {
switch (e.key.scancode) { switch (e.key.scancode) {
case SDL_SCANCODE_F10: atari2600::step(); /*z80debugger::refresh();*/ break; case SDL_SCANCODE_F10: atari2600::step(); m6502debugger::refresh(); break;
} }
} }
} }
+45 -7
View File
@@ -3,8 +3,11 @@
namespace pia namespace pia
{ {
uint8_t ram[128]; uint8_t ram[128];
uint8_t INTIM; bool timer_interrupt = false;
uint8_t TIMINT; uint8_t timer_value = 0;
uint16_t prescaler = 0;
uint16_t divider = 0;
bool timer_underflow = false;
void reset() void reset()
{ {
@@ -13,7 +16,22 @@ namespace pia
void tick() void tick()
{ {
prescaler++;
if (!timer_underflow) {
if (prescaler >= divider) {
prescaler = 0;
if (timer_value == 0) {
timer_underflow = true;
timer_interrupt = true;
timer_value = 0xff;
} else {
timer_value--;
}
}
} else {
timer_value--;
}
} }
uint8_t read(uint16_t address) uint8_t read(uint16_t address)
@@ -22,21 +40,21 @@ namespace pia
if ( (address & 0x04) ) { if ( (address & 0x04) ) {
// Timer functions // Timer functions
if (address & 0x01) { if (address & 0x01) {
uint8_t flags = TIMINT; uint8_t flags = timer_interrupt ? 0x80 : 0x00;
TIMINT &= ~0x80; // resetejem el flag timer_interrupt = false;
return flags; return flags;
} else { } else {
return INTIM; return timer_value;
} }
} else { } else {
// I/O Ports // I/O Ports
switch( address & 0x03) { switch( address & 0x03) {
case 0x00: // [TODO] SWCHA case 0x00: // [TODO] SWCHA
return 0x00; return 0xff;
case 0x01: // [TODO] DDRA case 0x01: // [TODO] DDRA
return 0x00; return 0x00;
case 0x02: // [TODO] SWCHB case 0x02: // [TODO] SWCHB
return 0x00; return 0x03;
case 0x03: // [TODO] DDRB case 0x03: // [TODO] DDRB
return 0x00; return 0x00;
default: default:
@@ -56,12 +74,32 @@ namespace pia
// Timer functions // Timer functions
switch( address & 0x03) { switch( address & 0x03) {
case 0x00: // [TODO] TIM1T case 0x00: // [TODO] TIM1T
divider = 1;
timer_value = value;
prescaler = 0;
timer_underflow = false;
timer_interrupt = false;
break; break;
case 0x01: // [TODO] TIM8T case 0x01: // [TODO] TIM8T
divider = 8;
timer_value = value;
prescaler = 0;
timer_underflow = false;
timer_interrupt = false;
break; break;
case 0x02: // [TODO] TIM64T case 0x02: // [TODO] TIM64T
divider = 64;
timer_value = value;
prescaler = 0;
timer_underflow = false;
timer_interrupt = false;
break; break;
case 0x03: // [TODO] TIM1024T case 0x03: // [TODO] TIM1024T
divider = 1024;
timer_value = value;
prescaler = 0;
timer_underflow = false;
timer_interrupt = false;
break; break;
} }
} else { } else {
+1 -1
View File
@@ -99,7 +99,7 @@ namespace tia
uint16_t current_scanline = 0; uint16_t current_scanline = 0;
bool rdy_low = false; bool rdy_low = false;
uint8_t framebuffer[160][192]; uint8_t framebuffer[192][160];
void reset() void reset()
{ {
-241
View File
File diff suppressed because one or more lines are too long