critical breakthrough fix emulator works!!!!!

This commit is contained in:
scawful
2025-10-06 19:25:03 -04:00
parent deb14c17a9
commit bdd585dae1
2 changed files with 34 additions and 9 deletions

View File

@@ -45,8 +45,21 @@ void Spc700::MOVSX(uint16_t address) {
void Spc700::MOVSY(uint16_t address) { void Spc700::MOVSY(uint16_t address) {
switch (bstep) { switch (bstep) {
case 0: this->adr = address; read(this->adr); bstep++; break; case 0:
case 1: write(this->adr, Y); bstep = 0; break; this->adr = address;
read(this->adr);
bstep++;
if (this->adr == 0x00F4) {
LOG_INFO("SPC", "MOVSY bstep=0: Will write Y=$%02X to F4 at PC=$%04X", Y, PC);
}
break;
case 1:
write(this->adr, Y);
if (this->adr == 0x00F4) {
LOG_INFO("SPC", "MOVSY bstep=1: Wrote Y=$%02X to F4 at PC=$%04X", Y, PC);
}
bstep = 0;
break;
} }
} }

View File

@@ -57,17 +57,19 @@ void Spc700::RunOpcode() {
// Debug: Comprehensive IPL ROM tracing for transfer protocol debugging // Debug: Comprehensive IPL ROM tracing for transfer protocol debugging
static int spc_exec_count = 0; static int spc_exec_count = 0;
bool in_critical_range = (PC >= 0xFFCF && PC <= 0xFFFF); bool in_critical_range = (PC >= 0xFFCF && PC <= 0xFFFF);
bool is_transfer_loop = (PC >= 0xFFDB && PC <= 0xFFEB); bool is_transfer_loop = (PC >= 0xFFD6 && PC <= 0xFFED);
if (in_critical_range && spc_exec_count++ < 10) { // Increased logging limits to capture full transfer (112 bytes)
if (in_critical_range && spc_exec_count++ < 200) {
LOG_INFO("SPC", "Execute: PC=$%04X step=0 bstep=%d Y=%02X A=%02X", PC, bstep, Y, A); LOG_INFO("SPC", "Execute: PC=$%04X step=0 bstep=%d Y=%02X A=%02X", PC, bstep, Y, A);
} }
if (is_transfer_loop && spc_exec_count < 20) { if (is_transfer_loop && spc_exec_count < 300) {
// Read ports to log transfer state // Read ports and RAM[$00] to track transfer state
uint8_t f4_val = callbacks_.read(0xF4); uint8_t f4_val = callbacks_.read(0xF4);
uint8_t f5_val = callbacks_.read(0xF5); uint8_t f5_val = callbacks_.read(0xF5);
LOG_INFO("SPC", "TRANSFER LOOP: PC=$%04X Y=%02X F4=%02X F5=%02X", uint8_t ram0_val = callbacks_.read(0x00);
PC, Y, f4_val, f5_val); LOG_INFO("SPC", "TRANSFER LOOP: PC=$%04X Y=%02X A=%02X F4=%02X F5=%02X RAM0=%02X bstep=%d",
PC, Y, A, f4_val, f5_val, ram0_val, bstep);
} }
// Only read new opcode if previous instruction is complete // Only read new opcode if previous instruction is complete
@@ -1171,7 +1173,11 @@ void Spc700::ExecuteInstructions(uint8_t opcode) {
break; break;
} }
case 0xd7: { // movs idy case 0xd7: { // movs idy
MOVS(idy()); // CRITICAL: Only call idy() once in bstep=0, reuse saved address in bstep=1
if (bstep == 0) {
adr = idy(); // Save address for bstep=1
}
MOVS(adr); // Use saved address
break; break;
} }
case 0xd8: { // movsx dp case 0xd8: { // movsx dp
@@ -1336,10 +1342,16 @@ void Spc700::ExecuteInstructions(uint8_t opcode) {
break; break;
} }
case 0xfc: { // incy imp case 0xfc: { // incy imp
uint8_t old_y = Y;
read(PC); read(PC);
Y++; Y++;
PSW.Z = (Y == 0); PSW.Z = (Y == 0);
PSW.N = (Y & 0x80); PSW.N = (Y & 0x80);
// Critical: Log Y increment in transfer loop (FFE4 is INC Y in IPL ROM)
if (PC >= 0xFFE4 && PC <= 0xFFE6) {
LOG_INFO("SPC", "INC Y executed at PC=$%04X: Y changed from $%02X to $%02X (Z=%d N=%d)",
PC - 1, old_y, Y, PSW.Z, PSW.N);
}
break; break;
} }
case 0xfd: { // movya imp case 0xfd: { // movya imp