Updated emulator with ISA changes
This commit is contained in:
parent
f9773d8c6b
commit
ba0529e608
|
@ -78,9 +78,12 @@ class Computer:
|
||||||
_running: bool
|
_running: bool
|
||||||
_halted: bool
|
_halted: bool
|
||||||
|
|
||||||
_zero_flag: bool
|
|
||||||
_interrupt_flag: list[int]
|
_interrupt_flag: list[int]
|
||||||
|
|
||||||
|
_pc_last: int
|
||||||
|
_zero_flag: bool
|
||||||
|
_interruptable: bool
|
||||||
|
|
||||||
_pc: int
|
_pc: int
|
||||||
_sp: int
|
_sp: int
|
||||||
_pt: int
|
_pt: int
|
||||||
|
@ -89,16 +92,17 @@ class Computer:
|
||||||
_d2: int
|
_d2: int
|
||||||
_d3: int
|
_d3: int
|
||||||
|
|
||||||
_interrupt_map: list[int]
|
|
||||||
|
|
||||||
def __init__(self, mem: Memory):
|
def __init__(self, mem: Memory):
|
||||||
self._mem = mem
|
self._mem = mem
|
||||||
|
|
||||||
self._running = True
|
self._running = True
|
||||||
self._halted = False
|
self._halted = False
|
||||||
self._zero_flag = False
|
|
||||||
self._interrupt_flag = []
|
self._interrupt_flag = []
|
||||||
|
|
||||||
|
self._pc_last = 0
|
||||||
|
self._zero_flag = False
|
||||||
|
self._interruptable = False
|
||||||
|
|
||||||
self._pc = 0
|
self._pc = 0
|
||||||
self._sp = 0
|
self._sp = 0
|
||||||
self._pt = 0
|
self._pt = 0
|
||||||
|
@ -107,8 +111,6 @@ class Computer:
|
||||||
self._d2 = 0
|
self._d2 = 0
|
||||||
self._d3 = 0
|
self._d3 = 0
|
||||||
|
|
||||||
self._interrupt_map = [0] * MAX_INT
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def running(self) -> bool: return self._running
|
def running(self) -> bool: return self._running
|
||||||
@property
|
@property
|
||||||
|
@ -122,7 +124,9 @@ class Computer:
|
||||||
@property
|
@property
|
||||||
def program_counter(self) -> int: return self._pc
|
def program_counter(self) -> int: return self._pc
|
||||||
@program_counter.setter
|
@program_counter.setter
|
||||||
def program_counter(self, value: int): self._pc = value % MAX_INT
|
def program_counter(self, value: int):
|
||||||
|
self._pc_last = self._pc
|
||||||
|
self._pc = value % MAX_INT
|
||||||
@property
|
@property
|
||||||
def stack_pointer(self) -> int: return self._sp
|
def stack_pointer(self) -> int: return self._sp
|
||||||
@stack_pointer.setter
|
@stack_pointer.setter
|
||||||
|
@ -202,8 +206,10 @@ class Computer:
|
||||||
elif instruction == 1: self.HLT()
|
elif instruction == 1: self.HLT()
|
||||||
elif instruction == 2: self.INT()
|
elif instruction == 2: self.INT()
|
||||||
elif instruction == 3: self.BNZ()
|
elif instruction == 3: self.BNZ()
|
||||||
elif instruction & 0xFF8 == 0x10: self.GET(instruction & 0x7)
|
elif instruction == 4: self.BLK()
|
||||||
elif instruction & 0xFF8 == 0x18: self.SET(instruction & 0x7)
|
elif instruction == 5: self.ENB()
|
||||||
|
elif instruction & 0xFF8 == 0x10: self.GLA(instruction & 0x7)
|
||||||
|
elif instruction & 0xFF8 == 0x18: self.GET(instruction & 0x7)
|
||||||
elif instruction & 0xFF8 == 0x20: self.LOD(instruction & 0x7)
|
elif instruction & 0xFF8 == 0x20: self.LOD(instruction & 0x7)
|
||||||
elif instruction & 0xFF8 == 0x28: self.STR(instruction & 0x7)
|
elif instruction & 0xFF8 == 0x28: self.STR(instruction & 0x7)
|
||||||
elif instruction & 0xFF8 == 0x30: self.PSH(instruction & 0x7)
|
elif instruction & 0xFF8 == 0x30: self.PSH(instruction & 0x7)
|
||||||
|
@ -251,12 +257,21 @@ class Computer:
|
||||||
self.program_counter = self.pointer
|
self.program_counter = self.pointer
|
||||||
self.program_counter += 1
|
self.program_counter += 1
|
||||||
|
|
||||||
def GET(self, REG: int):
|
def BLK(self):
|
||||||
self.set_reg(REG, self._interrupt_map[self.pointer])
|
self._interruptable = False
|
||||||
self.program_counter += 1
|
self.program_counter += 1
|
||||||
|
|
||||||
def SET(self, REG: int):
|
def ENB(self):
|
||||||
self._interrupt_map[self.pointer] = self.get_reg(REG)
|
self._interruptable = True
|
||||||
|
self.program_counter += 1
|
||||||
|
|
||||||
|
def GLA(self, REG: int):
|
||||||
|
self.set_reg(REG, self._pc_last)
|
||||||
|
self.program_counter += 1
|
||||||
|
|
||||||
|
def GET(self, REG: int):
|
||||||
|
if self._interrupt_flag: self.set_reg(REG, self._interrupt_flag.pop())
|
||||||
|
else: self.set_reg(REG, 0)
|
||||||
self.program_counter += 1
|
self.program_counter += 1
|
||||||
|
|
||||||
def LOD(self, REG: int):
|
def LOD(self, REG: int):
|
||||||
|
@ -355,3 +370,4 @@ class Computer:
|
||||||
self._zero_flag = result == 0
|
self._zero_flag = result == 0
|
||||||
self.set_reg(REG_D, result)
|
self.set_reg(REG_D, result)
|
||||||
self.program_counter += 1
|
self.program_counter += 1
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue