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