- [FIX] RLCA(), RLA(), RRCA() i RRA() calculaven mal el carry i m'estaven tornant loco

This commit is contained in:
2024-04-19 11:00:45 +02:00
parent 0b798189bc
commit 18869a09ee
3 changed files with 52 additions and 24 deletions

14
z80.cpp
View File

@@ -166,6 +166,8 @@ namespace z80
t+=3;
if (addr>=0x4000) memory[addr] = value;
if (z80debug::isbreak(addr, 4)) z80debug::stop();
//if (z80debug::debugging())
z80debug::setmemmodified(addr);
return value;
}
@@ -427,30 +429,38 @@ namespace z80
void RLCA()
{
const bool should_carry = rA & 0x80;
rA = (rA>>7) | (rA<<1);
KEEP_FLAGS(fS | fZ | fP);
SET_FLAGS(rA & (fX | fY | fC));
if (should_carry) SET_FLAGS(fC);
}
void RRCA()
{
const bool should_carry = rA & 0x01;
rA = (rA<<7) | (rA>>1);
KEEP_FLAGS(fS | fZ | fP);
SET_FLAGS(rA & (fX | fY | fC));
if (should_carry) SET_FLAGS(fC);
}
void RLA()
{
const bool should_carry = rA & 0x80;
rA = (rA<<1) | (rF&fC);
KEEP_FLAGS(fS | fZ | fP);
SET_FLAGS(rA & (fX | fY | fC));
SET_FLAGS(rA & (fX | fY));
if (should_carry) SET_FLAGS(fC);
}
void RRA()
{
const bool should_carry = rA & 0x01;
rA = ((rF&fC)<<7) | (rA>>1);
KEEP_FLAGS(fS | fZ | fP);
SET_FLAGS(rA & (fX | fY | fC));
SET_FLAGS(rA & (fX | fY));
if (should_carry) SET_FLAGS(fC);
}
void RRD()

View File

@@ -44,6 +44,10 @@ namespace z80debug
{255,255,255},
};
uint16_t oAF, oBC, oDE, oHL, oAF2, oBC2, oDE2, oHL2, oIX, oIY, oSP, oPC;
bool mem_modified[65536];
uint8_t offset_x = 0;
uint8_t offset_y = 0;
@@ -195,32 +199,33 @@ namespace z80debug
printtxt(0,3, "HL HL' PC ", COLOR_WHITE);
printtxt(0,4, "(BC) (DE) (HL) ", COLOR_WHITE);
printtxt(3,0, tohex(z80::getAF(), 4), COLOR_GRAY);
printtxt(11,0, tohex(z80::getAF(true), 4), COLOR_GRAY);
printtxt(19,0, tohex(z80::getIX(), 4), COLOR_GRAY);
printtxt(3,1, tohex(z80::getBC(), 4), COLOR_GRAY);
printtxt(11,1, tohex(z80::getBC(true), 4), COLOR_GRAY);
printtxt(19,1, tohex(z80::getIY(), 4), COLOR_GRAY);
printtxt(3,2, tohex(z80::getDE(), 4), COLOR_GRAY);
printtxt(11,2, tohex(z80::getDE(true), 4), COLOR_GRAY);
printtxt(19,2, tohex(z80::getSP(), 4), COLOR_GRAY);
printtxt(3,3, tohex(z80::getHL(), 4), COLOR_GRAY);
printtxt(11,3, tohex(z80::getHL(true), 4), COLOR_GRAY);
printtxt(19,3, tohex(z80::getPC(), 4), COLOR_GRAY);
printtxt(3,0, tohex(z80::getAF(), 4), oAF != z80::getAF() ? COLOR_RED : COLOR_GRAY);
printtxt(11,0, tohex(z80::getAF(true), 4), oAF2 != z80::getAF(true) ? COLOR_RED : COLOR_GRAY);
printtxt(19,0, tohex(z80::getIX(), 4), oIX != z80::getIX() ? COLOR_RED : COLOR_GRAY);
printtxt(3,1, tohex(z80::getBC(), 4), oBC != z80::getBC() ? COLOR_RED : COLOR_GRAY);
printtxt(11,1, tohex(z80::getBC(true), 4), oBC2 != z80::getBC(true) ? COLOR_RED : COLOR_GRAY);
printtxt(19,1, tohex(z80::getIY(), 4), oIY != z80::getIY() ? COLOR_RED : COLOR_GRAY);
printtxt(3,2, tohex(z80::getDE(), 4), oDE != z80::getDE() ? COLOR_RED : COLOR_GRAY);
printtxt(11,2, tohex(z80::getDE(true), 4), oDE2 != z80::getDE(true) ? COLOR_RED : COLOR_GRAY);
printtxt(19,2, tohex(z80::getSP(), 4), oSP != z80::getSP() ? COLOR_RED : COLOR_GRAY);
printtxt(3,3, tohex(z80::getHL(), 4), oHL != z80::getHL() ? COLOR_RED : COLOR_GRAY);
printtxt(11,3, tohex(z80::getHL(true), 4), oHL2 != z80::getHL(true) ? COLOR_RED : COLOR_GRAY);
printtxt(19,3, tohex(z80::getPC(), 4), oPC != z80::getPC() ? COLOR_RED : COLOR_GRAY);
printtxt(5,4, tohex(memory[z80::getBC()], 2), COLOR_GRAY);
printtxt(13,4, tohex(memory[z80::getDE()], 2), COLOR_GRAY);
printtxt(21,4, tohex(memory[z80::getHL()], 2), COLOR_GRAY);
const uint8_t flags = (z80::getAF() & 0xFF);
printtxt(0,5,"S", flags&0x80?COLOR_WHITE:COLOR_GRAY);
printtxt(1,5,"Z", flags&0x40?COLOR_WHITE:COLOR_GRAY);
printtxt(2,5,"X", flags&0x20?COLOR_WHITE:COLOR_GRAY);
printtxt(3,5,"H", flags&0x10?COLOR_WHITE:COLOR_GRAY);
printtxt(4,5,"Y", flags&0x08?COLOR_WHITE:COLOR_GRAY);
printtxt(5,5,"P", flags&0x04?COLOR_WHITE:COLOR_GRAY);
printtxt(6,5,"N", flags&0x02?COLOR_WHITE:COLOR_GRAY);
printtxt(7,5,"C", flags&0x01?COLOR_WHITE:COLOR_GRAY);
const uint8_t mod_flags = flags ^ (oAF & 0xFF);
printtxt(0,5,"S", flags&0x80 ? (mod_flags&0x80 ? COLOR_RED : COLOR_WHITE) : (mod_flags&0x80 ? COLOR_BROWN : COLOR_GRAY) );
printtxt(1,5,"Z", flags&0x40 ? (mod_flags&0x40 ? COLOR_RED : COLOR_WHITE) : (mod_flags&0x40 ? COLOR_BROWN : COLOR_GRAY) );
printtxt(2,5,"X", flags&0x20 ? (mod_flags&0x20 ? COLOR_RED : COLOR_WHITE) : (mod_flags&0x20 ? COLOR_BROWN : COLOR_GRAY) );
printtxt(3,5,"H", flags&0x10 ? (mod_flags&0x10 ? COLOR_RED : COLOR_WHITE) : (mod_flags&0x10 ? COLOR_BROWN : COLOR_GRAY) );
printtxt(4,5,"Y", flags&0x08 ? (mod_flags&0x08 ? COLOR_RED : COLOR_WHITE) : (mod_flags&0x08 ? COLOR_BROWN : COLOR_GRAY) );
printtxt(5,5,"P", flags&0x04 ? (mod_flags&0x04 ? COLOR_RED : COLOR_WHITE) : (mod_flags&0x04 ? COLOR_BROWN : COLOR_GRAY) );
printtxt(6,5,"N", flags&0x02 ? (mod_flags&0x02 ? COLOR_RED : COLOR_WHITE) : (mod_flags&0x02 ? COLOR_BROWN : COLOR_GRAY) );
printtxt(7,5,"C", flags&0x01 ? (mod_flags&0x01 ? COLOR_RED : COLOR_WHITE) : (mod_flags&0x01 ? COLOR_BROWN : COLOR_GRAY) );
offset_x = offset_y = 0;
box(46,8,11,12,COLOR_WHITE);
@@ -268,8 +273,9 @@ namespace z80debug
for (int i=0; i<6; ++i) {
printtxt(0,i, tohex(mem_viewer_cursor, 4), COLOR_CYAN);
for (int j=0; j<16; ++j) {
printtxt(5+j*3, i, tohex(memory[mem_viewer_cursor++],2), COLOR_WHITE);
printchar(53+j, i, memory[mem_viewer_cursor], COLOR_GRAY);
printtxt(5+j*3, i, tohex(memory[mem_viewer_cursor],2), mem_modified[mem_viewer_cursor] ? COLOR_RED : COLOR_WHITE);
printchar(53+j, i, memory[mem_viewer_cursor], mem_modified[mem_viewer_cursor] ? COLOR_BROWN : COLOR_GRAY);
mem_viewer_cursor++;
}
//printtxt(5,0, "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", COLOR_WHITE);
//printtxt(53,0, "0123456789AB\tDEF", COLOR_GRAY);
@@ -287,6 +293,12 @@ namespace z80debug
printtxt(1,1, console_error, COLOR_RED);
SDL_RenderPresent(ren);
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();
}
void sendToConsole(const char* text)
@@ -424,4 +436,9 @@ namespace z80debug
cont();
return t;
}
void setmemmodified(const uint16_t addr)
{
mem_modified[addr] = true;
}
}

View File

@@ -8,6 +8,7 @@ namespace z80debug
void stop();
void cont();
const bool debugging();
void setmemmodified(const uint16_t addr);
void refresh();
void sendToConsole(const char* text);