From 95e5a1d128b81e2d11ef7c74f834065a0493bc6d Mon Sep 17 00:00:00 2001 From: Raimon Zamora Date: Wed, 13 Mar 2024 13:57:43 +0100 Subject: [PATCH] - Working on Misc Table --- main.cpp | 2 +- z80.cpp | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 110 insertions(+), 2 deletions(-) diff --git a/main.cpp b/main.cpp index c5d77d5..e7e505a 100644 --- a/main.cpp +++ b/main.cpp @@ -10,5 +10,5 @@ int main(int argc, char *argv[]) fread(memory, 1024, 48, f); fclose(f); - set_memory(memory); + z80::reset(memory); } \ No newline at end of file diff --git a/z80.cpp b/z80.cpp index bcc32cc..9e73702 100644 --- a/z80.cpp +++ b/z80.cpp @@ -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; + } + + } + } \ No newline at end of file