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)