- [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*
|
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
|
||||||
|
|||||||
@@ -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,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
|
||||||
File diff suppressed because one or more lines are too long
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
namespace z80dis
|
namespace m6502dis
|
||||||
{
|
{
|
||||||
void loadSymbols();
|
void loadSymbols();
|
||||||
void saveSymbols();
|
void saveSymbols();
|
||||||
+33
-21
@@ -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)
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user