sh-dis/python/sh2.py

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)