|
@ -348,6 +348,9 @@ class AND_A_HL(Insn): |
|
|
cpu.set_reg8(R8.A, a) |
|
|
cpu.set_reg8(R8.A, a) |
|
|
cpu.carry = 0 |
|
|
cpu.carry = 0 |
|
|
|
|
|
|
|
|
|
|
|
def pretty(self) -> str: |
|
|
|
|
|
return "AND A, (HL)" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass |
|
|
@dataclass |
|
|
class CP_A_R(Insn): |
|
|
class CP_A_R(Insn): |
|
@ -356,6 +359,9 @@ class CP_A_R(Insn): |
|
|
def exec(self, cpu: CPU) -> None: |
|
|
def exec(self, cpu: CPU) -> None: |
|
|
cpu.carry = 1 if cpu.get_reg8(R8.A) < cpu.get_reg8(self.r) else 0 |
|
|
cpu.carry = 1 if cpu.get_reg8(R8.A) < cpu.get_reg8(self.r) else 0 |
|
|
|
|
|
|
|
|
|
|
|
def pretty(self) -> str: |
|
|
|
|
|
return f"CP A, {self.r.value}" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass |
|
|
@dataclass |
|
|
class CP_A_N(Insn): |
|
|
class CP_A_N(Insn): |
|
@ -364,12 +370,18 @@ class CP_A_N(Insn): |
|
|
def exec(self, cpu: CPU) -> None: |
|
|
def exec(self, cpu: CPU) -> None: |
|
|
cpu.carry = 1 if cpu.get_reg8(R8.A) < self.n else 0 |
|
|
cpu.carry = 1 if cpu.get_reg8(R8.A) < self.n else 0 |
|
|
|
|
|
|
|
|
|
|
|
def pretty(self) -> str: |
|
|
|
|
|
return f"CP A, {hex(self.n)}" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass |
|
|
@dataclass |
|
|
class CP_A_HL(Insn): |
|
|
class CP_A_HL(Insn): |
|
|
def exec(self, cpu: CPU) -> None: |
|
|
def exec(self, cpu: CPU) -> None: |
|
|
cpu.carry = 1 if cpu.get_reg8(R8.A) < cpu.get_mem8(cpu.get_reg16(R16.HL)) else 0 |
|
|
cpu.carry = 1 if cpu.get_reg8(R8.A) < cpu.get_mem8(cpu.get_reg16(R16.HL)) else 0 |
|
|
|
|
|
|
|
|
|
|
|
def pretty(self) -> str: |
|
|
|
|
|
return "CP A, (HL)" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass |
|
|
@dataclass |
|
|
class INC_R(Insn): |
|
|
class INC_R(Insn): |
|
@ -378,6 +390,9 @@ class INC_R(Insn): |
|
|
def exec(self, cpu: CPU) -> None: |
|
|
def exec(self, cpu: CPU) -> None: |
|
|
cpu.set_reg8(self.r, cpu.get_reg8(self.r) + 1) |
|
|
cpu.set_reg8(self.r, cpu.get_reg8(self.r) + 1) |
|
|
|
|
|
|
|
|
|
|
|
def pretty(self) -> str: |
|
|
|
|
|
return f"INC {self.r.value}" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass |
|
|
@dataclass |
|
|
class INC_HL(Insn): |
|
|
class INC_HL(Insn): |
|
@ -387,6 +402,9 @@ class INC_HL(Insn): |
|
|
hl = cpu.get_reg16(R16.HL) |
|
|
hl = cpu.get_reg16(R16.HL) |
|
|
cpu.set_mem8(hl, cpu.get_mem8(hl) + 1) |
|
|
cpu.set_mem8(hl, cpu.get_mem8(hl) + 1) |
|
|
|
|
|
|
|
|
|
|
|
def pretty(self) -> str: |
|
|
|
|
|
return "INC (HL)" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass |
|
|
@dataclass |
|
|
class DEC_R(Insn): |
|
|
class DEC_R(Insn): |
|
@ -395,6 +413,9 @@ class DEC_R(Insn): |
|
|
def exec(self, cpu: CPU) -> None: |
|
|
def exec(self, cpu: CPU) -> None: |
|
|
cpu.set_reg8(self.r, cpu.get_reg8(self.r) - 1) |
|
|
cpu.set_reg8(self.r, cpu.get_reg8(self.r) - 1) |
|
|
|
|
|
|
|
|
|
|
|
def pretty(self) -> str: |
|
|
|
|
|
return f"DEC {self.r.value}" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass |
|
|
@dataclass |
|
|
class DEC_HL(Insn): |
|
|
class DEC_HL(Insn): |
|
@ -404,6 +425,9 @@ class DEC_HL(Insn): |
|
|
hl = cpu.get_reg16(R16.HL) |
|
|
hl = cpu.get_reg16(R16.HL) |
|
|
cpu.set_mem8(hl, cpu.get_mem8(hl) - 1) |
|
|
cpu.set_mem8(hl, cpu.get_mem8(hl) - 1) |
|
|
|
|
|
|
|
|
|
|
|
def pretty(self) -> str: |
|
|
|
|
|
return "DEC (HL)" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass |
|
|
@dataclass |
|
|
class CPL(Insn): |
|
|
class CPL(Insn): |
|
@ -420,6 +444,9 @@ class ADD_HL_RR(Insn): |
|
|
cpu.carry = 1 if hl > 0xFFFF else 0 |
|
|
cpu.carry = 1 if hl > 0xFFFF else 0 |
|
|
cpu.set_reg16(R16.HL, hl) |
|
|
cpu.set_reg16(R16.HL, hl) |
|
|
|
|
|
|
|
|
|
|
|
def pretty(self) -> str: |
|
|
|
|
|
return f"ADD HL, {self.rr.value}" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass |
|
|
@dataclass |
|
|
class INC_RR(Insn): |
|
|
class INC_RR(Insn): |
|
@ -452,6 +479,9 @@ class ADD_SP_DD(Insn): |
|
|
cpu.carry = 1 if sp > 0xFFFF or sp < 0 else 0 |
|
|
cpu.carry = 1 if sp > 0xFFFF or sp < 0 else 0 |
|
|
cpu.set_reg16(R16.SP, sp) |
|
|
cpu.set_reg16(R16.SP, sp) |
|
|
|
|
|
|
|
|
|
|
|
def pretty(self) -> str: |
|
|
|
|
|
return f"ADD SP, {self.dd}" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass |
|
|
@dataclass |
|
|
class LD_HL_SP_DD(Insn): |
|
|
class LD_HL_SP_DD(Insn): |
|
@ -462,8 +492,10 @@ class LD_HL_SP_DD(Insn): |
|
|
cpu.carry = 1 if sp > 0xFFFF or sp < 0 else 0 |
|
|
cpu.carry = 1 if sp > 0xFFFF or sp < 0 else 0 |
|
|
cpu.set_reg16(R16.HL, sp) |
|
|
cpu.set_reg16(R16.HL, sp) |
|
|
|
|
|
|
|
|
|
|
|
def pretty(self) -> str: |
|
|
|
|
|
return f"LD HL, SP + {self.dd}" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# TODO: Rotate and shift instructions |
|
|
|
|
|
@dataclass |
|
|
@dataclass |
|
|
class RLCA(Insn): |
|
|
class RLCA(Insn): |
|
|
def exec(self, cpu: CPU) -> None: |
|
|
def exec(self, cpu: CPU) -> None: |
|
@ -510,6 +542,9 @@ class RRA(Insn): |
|
|
return "RRA" |
|
|
return "RRA" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# TODO: Remaining rotate and shift instructions |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass |
|
|
@dataclass |
|
|
class SET_N_R(Insn): |
|
|
class SET_N_R(Insn): |
|
|
n: int |
|
|
n: int |
|
|