90 lines
2.6 KiB
Python
90 lines
2.6 KiB
Python
import array
|
|
from dataclasses import dataclass
|
|
|
|
from decode import decode_instruction
|
|
|
|
class RegisterFile:
|
|
def __init__(self):
|
|
object.__setattr__(self, "_reg", [0] * 16)
|
|
|
|
def __getitem__(self, key):
|
|
return self._reg[key]
|
|
|
|
def __setitem__(self, key, value):
|
|
assert value >= 0 and value <= 0xffff_ffff, value
|
|
self._reg[key] = value
|
|
|
|
def __setattr__(self, name, value):
|
|
raise AttributeError(name)
|
|
|
|
class StatusRegister:
|
|
def __init__(self):
|
|
self.m = 0
|
|
self.q = 0
|
|
self.i = 0b1111
|
|
self.s = 0
|
|
self.t = 0
|
|
|
|
def get_value(self):
|
|
return (0
|
|
| (self.m & 0b1 ) << 9
|
|
| (self.q & 0b1 ) << 8
|
|
| (self.i & 0b1111) << 4
|
|
| (self.s & 0b1 ) << 1
|
|
| (self.t & 0b1 ) << 0
|
|
)
|
|
|
|
def set_value(self, value):
|
|
self.m = (value >> 9) & 0b1
|
|
self.q = (value >> 8) & 0b1
|
|
self.i = (value >> 4) & 0b1111
|
|
self.s = (value >> 1) & 0b1
|
|
self.t = (value >> 0) & 0b1
|
|
|
|
def __setattr__(self, name, value):
|
|
assert type(value) == int, (name, value)
|
|
if name in {'m', 'q', 's', 't'}:
|
|
assert value in {0, 1}, (name, value)
|
|
object.__setattr__(self, name, value)
|
|
elif name == 'i':
|
|
assert value >= 0 and value <= 15, (name, value)
|
|
object.__setattr__(self, name, value)
|
|
else:
|
|
raise AttributeError(name)
|
|
|
|
@dataclass
|
|
class SH2:
|
|
def __init__(self):
|
|
self.reg = RegisterFile()
|
|
self.sr = StatusRegister()
|
|
self.gbr = 0
|
|
self.vbr = 0
|
|
self.mach = 0
|
|
self.macl = 0
|
|
self.pr = 0
|
|
self.pr1 = 0
|
|
self.pr2 = self.pr
|
|
self.pc = 0
|
|
self.pc1 = 0
|
|
self.pc2 = self.pc + 2
|
|
self.is_delay_slot = False
|
|
|
|
def __setattr__(self, name, value):
|
|
if name in {'gbr', 'vbr', 'mach', 'macl',
|
|
'pr' , 'pr1', 'pr2',
|
|
'pc' , 'pc1', 'pc2'}:
|
|
assert type(value) is int, value
|
|
assert value >= 0 and value <= 0xffff_ffff, value
|
|
object.__setattr__(self, name, value)
|
|
elif name == 'reg':
|
|
assert type(value) == RegisterFile
|
|
object.__setattr__(self, name, value)
|
|
elif name == 'sr':
|
|
assert type(value) == StatusRegister
|
|
object.__setattr__(self, name, value)
|
|
elif name == 'is_delay_slot':
|
|
assert type(value) == bool
|
|
object.__setattr__(self, name, value)
|
|
else:
|
|
raise AttributeError(name)
|