from typing import Optional
|
|
|
|
from gbso.cpu.regs import R16_HI, R16_LO, R8, R16
|
|
from gbso.cpu.state import CPUState
|
|
|
|
|
|
class CPU:
|
|
state: CPUState
|
|
|
|
def __init__(self, state: Optional[CPUState] = None) -> None:
|
|
if state is None:
|
|
state = CPUState()
|
|
self.state = state
|
|
|
|
def get_reg8(self, r: R8) -> int:
|
|
return self.state.reg8[r]
|
|
|
|
def get_reg16(self, rr: R16) -> int:
|
|
if rr == R16.SP:
|
|
return self.state.sp
|
|
|
|
return (self.state.reg8[R16_HI[rr]] << 8) | self.state.reg8[R16_LO[rr]]
|
|
|
|
def set_reg8(self, r: R8, n: int) -> None:
|
|
self.state.reg8[r] = n & 0xFF
|
|
|
|
def set_reg16(self, rr: R16, nn: int) -> None:
|
|
if rr == R16.SP:
|
|
self.state.sp = nn & 0xFFFF
|
|
return
|
|
|
|
self.state.reg8[R16_HI[rr]] = (nn >> 8) & 0xFF
|
|
self.state.reg8[R16_LO[rr]] = nn & 0xFF
|
|
|
|
def get_mem8(self, nn: int) -> int:
|
|
return self.state.memory[nn & 0xFFFF]
|
|
|
|
def get_mem16(self, nn: int) -> int:
|
|
hi = self.state.memory[nn & 0xFFFF]
|
|
lo = self.state.memory[(nn + 1) & 0xFFFF]
|
|
return (hi << 8) | lo
|
|
|
|
def set_mem8(self, nn: int, n: int) -> None:
|
|
self.state.memory[nn & 0xFFFF] = n & 0xFF
|
|
|
|
def set_mem16(self, nn: int, nn1: int) -> None:
|
|
self.state.memory[nn & 0xFFFF] = (nn1 >> 8) & 0xFF
|
|
self.state.memory[(nn + 1) & 0xFFFF] = nn1 & 0xFF
|
|
|
|
@property
|
|
def hl(self) -> int:
|
|
return self.get_mem8(self.get_reg16(R16.HL))
|
|
|
|
@hl.setter
|
|
def hl(self, n: int) -> None:
|
|
self.set_mem8(self.get_reg16(R16.HL), n)
|