- Working on Misc Table

This commit is contained in:
2024-03-13 13:57:43 +01:00
parent 66d9d0286f
commit 95e5a1d128
2 changed files with 110 additions and 2 deletions

View File

@@ -10,5 +10,5 @@ int main(int argc, char *argv[])
fread(memory, 1024, 48, f);
fclose(f);
set_memory(memory);
z80::reset(memory);
}

110
z80.cpp
View File

@@ -161,6 +161,20 @@ namespace z80
*a = *a + b;
}
void ADC16(uint16_t* a, uint16_t b)
{
// [TODO] operadors mes grans, per a no perdre el carry_out
*a = *a + b;
if (rF & fC) *a++;
}
void SBC16(uint16_t* a, uint16_t b)
{
// [TODO] operadors mes grans, per a no perdre el carry_out
*a = *a + b;
if (rF & fC) *a--;
}
void INC8(uint8_t *reg)
{
reg++;
@@ -197,6 +211,11 @@ namespace z80
if (rF & fC) *a--;
}
void NEG()
{
rA = ~rA;
}
void AND(uint8_t b)
{
rA = rA & b;
@@ -237,6 +256,16 @@ namespace z80
// [TODO]
}
void RRD()
{
// [TODO]
}
void RLD()
{
// [TODO]
}
void DAA()
{
// [TODO]
@@ -282,12 +311,27 @@ namespace z80
// [TODO]
}
void RETN()
{
// [TODO]
}
void RETI()
{
// [TODO]
}
void RST(uint8_t vec)
{
// [TODO]
}
void IN(uint8_t *dir, uint8_t val)
void IM(uint8_t mode)
{
// [TODO]
}
void IN(uint8_t *reg, uint8_t dir)
{
// [TODO]
}
@@ -1448,4 +1492,68 @@ namespace z80
case 0xFF: SET(7, &memory[rIX+LD8()], _rA); break;
}
}
void MISC_INSTRUCTIONS()
{
const uint8_t opcode = memory[rPC++];
t_states+=4;
uint16_t tmp;
switch (opcode)
{
case 0x40: IN(_rB, rC); break;
case 0x41: OUT(rC, rB); break;
case 0x42: SBC16(_rHL, rBC); break;
case 0x43: rM16(LD16()) = rBC; break;
case 0x44: NEG(); break;
case 0x45: RETN(); break;
case 0x46: IM(0); break;
case 0x47: rI = rA; break;
case 0x48: IN(_rC, rC); break;
case 0x49: OUT(rC, rC); break;
case 0x4A: ADC16(_rHL, rBC); break;
case 0x4B: rBC = rM16(LD16()); break;
case 0x4D: RETI(); break;
case 0x4F: rR = rA; break;
case 0x50: IN(_rD, rC); break;
case 0x51: OUT(rC, rD); break;
case 0x52: SBC16(_rHL, rDE); break;
case 0x53: rM16(LD16()) = rDE; break;
case 0x56: IM(1); break;
case 0x57: rA = rI; break;
case 0x58: IN(_rE, rC); break;
case 0x59: OUT(rC, rE); break;
case 0x5A: ADC16(_rHL, rDE); break;
case 0x5B: rDE = rM16(LD16()); break;
case 0x5E: IM(2); break;
case 0x5F: rA = rR; break;
case 0x60: IN(_rH, rC); break;
case 0x61: OUT(rC, rH); break;
case 0x62: SBC16(_rHL, rHL); break;
case 0x63: rM16(LD16()) = rHL; break;
case 0x67: RRD(); break;
case 0x68: IN(_rL, rC); break;
case 0x69: OUT(rC, rL); break;
case 0x6A: ADC16(_rHL, rHL); break;
case 0x6B: rHL = rM16(LD16()); break;
case 0x6F: RLD(); break;
case 0x70: IN(_rF, rC); break;
case 0x71: OUT(rC, 0); break;
case 0x72: SBC16(_rHL, rSP); break;
case 0x73: rM16(LD16()) = rSP; break;
case 0x78: IN(_rA, rC); break;
case 0x79: OUT(rC, rA); break;
case 0x7A: ADC16(_rHL, rSP); break;
case 0x7B: rSP = rM16(LD16()); break;
// CONT...
default: INVALID(); break;
}
}
}