commit 284c1f2521b58d779b0c407f014a724a907a5262 Author: Raimon Zamora Date: Tue Mar 12 13:59:22 2024 +0100 - First Commit diff --git a/.hgignore b/.hgignore new file mode 100644 index 0000000..30d74d2 --- /dev/null +++ b/.hgignore @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/48.rom b/48.rom new file mode 100644 index 0000000..4d6895e Binary files /dev/null and b/48.rom differ diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..c5d77d5 --- /dev/null +++ b/main.cpp @@ -0,0 +1,14 @@ +#include +#include +#include + +uint8_t memory[65536]; + +int main(int argc, char *argv[]) +{ + FILE* f = fopen("48.rom", "rb"); + fread(memory, 1024, 48, f); + fclose(f); + + set_memory(memory); +} \ No newline at end of file diff --git a/z80.cpp b/z80.cpp new file mode 100644 index 0000000..ed704e0 --- /dev/null +++ b/z80.cpp @@ -0,0 +1,256 @@ +#include "z80.h" + +namespace z80 +{ + static uint8_t *memory = nullptr; + static uint32_t t_states = 0; + + #define fC 0b00000001 + #define fN 0b00000010 + #define fP 0b00000100 + #define fV 0b00000100 + #define fX 0b00001000 + #define fH 0b00010000 + #define fY 0b00100000 + #define fZ 0b01000000 + #define fS 0b10000000 + + #define cNO -1 + #define cNZ 0 + #define cZ 1 + #define cNC 2 + #define cC 3 + #define cPO 4 + #define cPE 5 + #define cP 6 + #define cM 7 + + uint8_t regs[28]; + + uint8_t *_rF = ®s[0]; + uint8_t *_rA = ®s[1]; + uint8_t *_rC = ®s[2]; + uint8_t *_rB = ®s[3]; + uint8_t *_rE = ®s[4]; + uint8_t *_rD = ®s[5]; + uint8_t *_rL = ®s[6]; + uint8_t *_rH = ®s[7]; + + uint16_t *_rAF = (uint16_t*)®s[0]; + uint16_t *_rBC = (uint16_t*)®s[2]; + uint16_t *_rDE = (uint16_t*)®s[4]; + uint16_t *_rHL = (uint16_t*)®s[6]; + + uint8_t *_rF2 = ®s[8]; + uint8_t *_rA2 = ®s[9]; + uint8_t *_rC2 = ®s[10]; + uint8_t *_rB2 = ®s[11]; + uint8_t *_rE2 = ®s[12]; + uint8_t *_rD2 = ®s[13]; + uint8_t *_rL2 = ®s[14]; + uint8_t *_rH2 = ®s[15]; + + uint16_t *_rAF2 = (uint16_t*)®s[8]; + uint16_t *_rBC2 = (uint16_t*)®s[10]; + uint16_t *_rDE2 = (uint16_t*)®s[12]; + uint16_t *_rHL2 = (uint16_t*)®s[14]; + + uint16_t *_rIX = (uint16_t*)®s[16]; + uint16_t *_rIY = (uint16_t*)®s[18]; + uint16_t *_rSP = (uint16_t*)®s[20]; + + uint8_t *_rI = ®s[22]; + uint8_t *_rR = ®s[23]; + + uint16_t *_rPC = (uint16_t*)®s[24]; + + uint16_t *_rWZ = (uint16_t*)®s[26]; + uint8_t *_rZ = (uint8_t*)®s[26]; + uint8_t *_rW = (uint8_t*)®s[27]; + + #define rA (*_rA) + #define rF (*_rF) + #define rB (*_rB) + #define rC (*_rC) + #define rD (*_rD) + #define rE (*_rE) + #define rH (*_rH) + #define rL (*_rL) + #define rW (*_rW) + #define rZ (*_rZ) + + #define rAF (*_rAF) + #define rBC (*_rBC) + #define rDE (*_rDE) + #define rHL (*_rHL) + #define rWZ (*_rWZ) + + #define rA2 (*_rA2) + #define rF2 (*_rF2) + #define rB2 (*_rB2) + #define rC2 (*_rC2) + #define rD2 (*_rD2) + #define rE2 (*_rE2) + #define rH2 (*_rH2) + #define rL2 (*_rL2) + + #define rAF2 (*_rAF2) + #define rBC2 (*_rBC2) + #define rDE2 (*_rDE2) + #define rHL2 (*_rHL2) + + #define rIX (*_rIX) + #define rIY (*_rIY) + #define rSP (*_rSP) + + #define rI (*_rI) + #define rR (*_rR) + + #define rPC (*_rPC) + + #define SWAP(a,b) {auto temp=a;a=b;b=temp;} + + uint16_t LD16() + { + return memory[rPC++] + memory[rPC++] << 8; + } + + uint16_t LD8() + { + return memory[rPC++]; + } + + void INC16(uint16_t *reg) + { + reg++; + } + + void DEC16(uint16_t *reg) + { + reg--; + } + + void INC8(uint8_t *reg) + { + reg++; + } + + void DEC8(uint8_t *reg) + { + reg--; + } + + void RLCA() + { + // [TODO] + } + + void RRCA() + { + // [TODO] + } + + void RLA() + { + // [TODO] + } + + void RRA() + { + // [TODO] + } + + void DAA() + { + // [TODO] + } + + void CPL() + { + // [TODO] + } + + void ADD16(uint16_t* a, uint16_t b) + { + *a = *a + b; + } + + void DJNZ() + { + // [TODO] + } + + void JR(uint8_t cond, int8_t disp) + { + // [TODO] + } + + void reset(uint8_t* mem) + { + memory = mem; + rPC = 0; + t_states = 0; + } + + void step() + { + const uint8_t opcode = memory[rPC++]; + t_states+=4; + uint16_t tmp; + + switch (opcode) + { + case 0x00: /* NOP */ break; + case 0x01: rBC = LD16(); break; + case 0x02: memory[rBC] = rA; break; + case 0x03: INC16(_rBC); break; + case 0x04: INC8(_rB); break; + case 0x05: DEC8(_rB); break; + case 0x06: rB = LD8(); break; + case 0x07: RLCA(); break; + case 0x08: SWAP(rAF, rAF2); break; + case 0x09: ADD16(_rHL, rBC); break; + case 0x0A: rA = memory[rBC]; break; + case 0x0B: DEC16(_rBC); break; + case 0x0C: INC8(_rC); break; + case 0x0D: DEC8(_rC); break; + case 0x0E: rC = LD8(); break; + case 0x0F: RRCA(); break; + + case 0x10: DJNZ(); break; + case 0x11: rDE = LD16(); break; + case 0x12: memory[rDE] = rA; break; + case 0x13: INC16(_rDE); break; + case 0x14: INC8(_rD); break; + case 0x15: DEC8(_rD); break; + case 0x16: rD = LD8(); break; + case 0x17: RLA(); break; + case 0x18: JR(cNO, int8_t(rD)); break; + case 0x19: ADD16(_rHL, rDE); break; + case 0x1A: rA = memory[rDE]; break; + case 0x1B: DEC16(_rDE); break; + case 0x1C: INC8(_rE); break; + case 0x1D: DEC8(_rE); break; + case 0x1E: rE = LD8(); break; + case 0x1F: RRA(); break; + + case 0x20: JR(cNZ, int8_t(rD)); break; + case 0x21: rHL = LD16(); break; + case 0x22: tmp=LD16(); memory[tmp] = rL; memory[tmp+1] = rH; break; + case 0x23: INC16(_rHL); break; + case 0x24: INC8(_rH); break; + case 0x25: DEC8(_rH); break; + case 0x26: rH = LD8(); break; + case 0x27: DAA(); break; + case 0x28: JR(cZ, int8_t(rD)); break; + case 0x29: ADD16(_rHL, rHL); break; + case 0x2A: tmp=LD16(); rL = memory[tmp]; rH = memory[tmp+1]; break; + case 0x2B: DEC16(_rHL); break; + case 0x2C: INC8(_rL); break; + case 0x2D: DEC8(_rL); break; + case 0x2E: rL = LD8(); break; + case 0x2F: CPL(); break; + + } + } +} \ No newline at end of file diff --git a/z80.h b/z80.h new file mode 100644 index 0000000..ad0f3d5 --- /dev/null +++ b/z80.h @@ -0,0 +1,9 @@ +#pragma once + +#include + +namespace z80 +{ + void reset(uint8_t* mem); + void step(); +} \ No newline at end of file