- [FIX] Quan RDY està actiu, passar cicles fins que la CPU desperte. Comptador de stall per si de cas.

- [FIX] arreglat el càlcul de adreces en opcodes que usen zero page
- [FIX] Arreglat el càlcul de flags en opcodes incrementadors, decrementadors i transfers
- [FIX] Si ja havem identificat una adreça de memòria com a instrucció, usar eixe tag al desensamblar cap enrere
- [NEW] Càrrega de simbols al principi
This commit is contained in:
Raimon @ quifisraimon committed 2026-09-18 13:34:26 +02:00
1 parent a25c070b07
commit c3503a7a4b
6 files changed
+46 -19

No files matched your search

+3
View File
@@ -420,6 +420,9 @@ namespace m6502debugger
uint16_t find_previous_opcode(uint16_t pc)
{
if ( tags[pc-1] & MEMTAG_INST ) return pc-1;
if ( tags[pc-2] & MEMTAG_INST ) return pc-2;
if (m6502dis::getOpcodeSize(uint16_t(pc-3))==3) return uint16_t(pc-3);
if (m6502dis::getOpcodeSize(uint16_t(pc-2))==2) return uint16_t(pc-2);
return uint16_t(pc-1);
+1
View File
@@ -32,6 +32,7 @@ namespace m6502dis
used_symbols.clear();
for (int i=0; i<65536; ++i) symbols[i][0] = 0;
FILE *f = fopen("symbols.txt", "r");
if (f==NULL) return;
while (true) {
uint16_t address;
char tmp[15];
+36 -17
View File
@@ -433,17 +433,17 @@ namespace m6502
void DoOpcodeWork()
{
if (rI==0xCA) { rX--; rB = rX; SetFlags(fN|fZ); return; } /* DEX */
if (rI==0x88) { rY--; rB = rY; SetFlags(fN|fZ); return; } /* DEY */
if (rI==0xE8) { rX++; rB = rX; SetFlags(fN|fZ); return; } /* INX */
if (rI==0xC8) { rY++; rB = rY; SetFlags(fN|fZ); return; } /* INY */
if (rI==0xCA) { rX--; rTEMP_lo = rB = rX; SetFlags(fN|fZ); return; } /* DEX */
if (rI==0x88) { rY--; rTEMP_lo = rB = rY; SetFlags(fN|fZ); return; } /* DEY */
if (rI==0xE8) { rX++; rTEMP_lo = rB = rX; SetFlags(fN|fZ); return; } /* INX */
if (rI==0xC8) { rY++; rTEMP_lo = rB = rY; SetFlags(fN|fZ); return; } /* INY */
if (rI==0xA8) { rY = rA; rB = rY; SetFlags(fN|fZ); return; } /* TAY */
if (rI==0x98) { rA = rY; rB = rA; SetFlags(fN|fZ); return; } /* TYA */
if (rI==0xAA) { rX = rA; rB = rX; SetFlags(fN|fZ); return; } /* TAX */
if (rI==0x8A) { rA = rX; rB = rA; SetFlags(fN|fZ); return; } /* TXA */
if (rI==0xBA) { rX = rS; rB = rX; SetFlags(fN|fZ); return; } /* TSX */
if (rI==0x9A) { rS = rX; rB = rS; SetFlags(fN|fZ); return; } /* TXS */
if (rI==0xA8) { rY = rA; rTEMP_lo = rB = rY; SetFlags(fN|fZ); return; } /* TAY */
if (rI==0x98) { rA = rY; rTEMP_lo = rB = rA; SetFlags(fN|fZ); return; } /* TYA */
if (rI==0xAA) { rX = rA; rTEMP_lo = rB = rX; SetFlags(fN|fZ); return; } /* TAX */
if (rI==0x8A) { rA = rX; rTEMP_lo = rB = rA; SetFlags(fN|fZ); return; } /* TXA */
if (rI==0xBA) { rX = rS; rTEMP_lo = rB = rX; SetFlags(fN|fZ); return; } /* TSX */
if (rI==0x9A) { rS = rX; rTEMP_lo = rB = rS; SetFlags(fN|fZ); return; } /* TXS */
switch (rI&0x03) {
case 0: /* Clear/set flags*/
@@ -537,7 +537,12 @@ namespace m6502
}
void FakeFetchOperand() { uint8_t dummy = mem::read(get_PC()); (void)dummy; }
void FetchOperandLo() { rAD_lo = rB = mem::read(get_PC()); inc_PC(); set_TEMP(rB); }
void FetchOperandLo() {
rAD_lo = rB = mem::read(get_PC());
rAD_hi = 0x00;
inc_PC();
set_TEMP(rB);
}
void FetchOperandHi() { rAD_hi = mem::read(get_PC()); inc_PC(); }
void FetchOperandHiToPC() { rAD_hi = mem::read(get_PC()); set_PC(get_AD()); }
void FetchOperandHiAndIndexX() { rAD_hi = mem::read(get_PC()); inc_PC(); set_TEMP(rAD_lo + rX); rAD_lo = rTEMP_lo; }
@@ -549,14 +554,19 @@ namespace m6502
void PCLoInt() { rPC_lo = mem::read(0xff00+interrupt_vector); }
void PCHiInt() { rPC_hi = mem::read(0xff00+interrupt_vector+1); }
void IndexX() { rB = mem::read(get_AD()); rAD_lo += rX; }
void IndexX() {
rB = mem::read(get_AD());
rAD_lo = (rAD_lo + rX) & 0xff;
}
void FetchAddressLo() { rT = mem::read(get_AD()); inc_AD(); }
void FetchAddressHi() { rAD_hi = mem::read(get_AD()); rAD_lo = rT; }
void FetchAddressHiAndIndex() { rAD_hi = mem::read(get_AD()); set_TEMP(rAD_lo + rY); rAD_lo = rTEMP_lo; }
void ReadAddress() { rB = mem::read(get_AD()); rAD_hi += rTEMP_hi; }
void ReadAddressAndSkip() { rB = mem::read(get_AD()); rAD_hi += rTEMP_hi; if (rTEMP_hi) InsertFetchOpcode(); }
void WriteRegister() { mem::write(get_AD(), (rI&3)==1 ? rA : (rI&3)==2 ? rX : rY ); }
void WriteRegister() {
mem::write(get_AD(), (rI&3)==1 ? rA : (rI&3)==2 ? rX : rY );
}
void WriteAddress() { mem::write(get_AD(), rB); DoRMW(); }
void PushA() { mem::write(0x0100+(rS--), rA); }
void FetchOperandAndCheckBranch() {
@@ -577,13 +587,22 @@ namespace m6502
int8_t offset = (int8_t)rB;
if (offset >= 0 && rTEMP_hi != 0) {
rPC_hi++;
} else if (offset < 0 && rTEMP_hi == 0) {
rPC_hi--;
if (rTEMP_hi != 0) {
if (offset > 0) {
rPC_hi--;
} else {
rPC_hi++;
}
} else {
InsertFetchOpcode();
}
// if (offset >= 0 && rTEMP_hi != 0) {
// rPC_hi++;
// } else if (offset < 0 && rTEMP_hi == 0) {
// rPC_hi--;
// } else {
// InsertFetchOpcode();
// }
}
void PullPCHi() { rPC_hi = mem::read(0x0100+(++rS)); }
+3 -1
View File
@@ -45,12 +45,14 @@ namespace atari2600
// z80debugger::show();
// return;
// } else {
uint8_t stall_counter = 100;
bool instruction_done = false;
while (!instruction_done) {
if (!tia::is_rdy_low()) {
instruction_done = m6502::tick();
} else {
instruction_done = true;
stall_counter--;
if (stall_counter==0) instruction_done = true;
}
tia::tick();
tia::tick();
+2 -1
View File
@@ -4,6 +4,7 @@
#include "ui.h"
#include "ui_window.h"
#include "6502debugger.h"
#include "6502dis.h"
int main(int argc, char *argv[]) {
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO);
@@ -13,7 +14,7 @@ int main(int argc, char *argv[]) {
} else {
rom::load("combat.bin");
}
m6502dis::loadSymbols();
atari2600::init();
atari2600::pause();
m6502debugger::show();
+1
View File
@@ -0,0 +1 @@
0x283 SWBCNT