- [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*
[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
+109 -161
View File
@@ -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 -1
View File
@@ -1,7 +1,7 @@
#pragma once
#include <stdint.h>
namespace z80debugger
namespace m6502debugger
{
#define MEMTAG_NONE 0x00
#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>
namespace z80dis
namespace m6502dis
{
void loadSymbols();
void saveSymbols();
+33 -21
View File
@@ -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)
+5
View File
@@ -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();
}
+5 -4
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
File diff suppressed because one or more lines are too long