- [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
+45 -18

No files matched your search

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