You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
144 lines
3.7 KiB
Python
144 lines
3.7 KiB
Python
|
|
from types import MethodType
|
|
|
|
class Object(dict):
|
|
__getattr__ = dict.get
|
|
__setattr__ = dict.__setitem__
|
|
__delattr__ = dict.__delitem__
|
|
|
|
class Facs(Object):
|
|
|
|
def __init__(self):
|
|
|
|
self.facs = Object()
|
|
|
|
self.addFac('cia', 0x120000, spr=True, rname='CIA')
|
|
|
|
def commentCR(self):
|
|
c = '* '
|
|
x = f'{self.value:08X}'
|
|
for i in range(8):
|
|
c += f'F{i}:{x[i]} '
|
|
return c
|
|
self.addFac('cr', 0, spr=True, rname='CR')
|
|
self.cr.comment = MethodType(commentCR, self.cr)
|
|
|
|
def xerSO(self):
|
|
return (self.value & 0x80000000) >> 31
|
|
self.addFac('xer', 0, spr=True, rname='XER')
|
|
self.xer.so = MethodType(xerSO, self.xer)
|
|
|
|
self.addFac('ctr', 0xF0000000, spr=True, rname='CTR')
|
|
self.addFac('lr', 0, spr=True, rname='LR')
|
|
self.addFac('tar', 0, spr=True, rname='TAR')
|
|
|
|
#self.srr0 = Fac('SRR0', 0, spr=True)
|
|
#self.srr1 = Fac('SRR1', 0, spr=True)
|
|
#self.dar = Fac('DAR', 0, spr=True)
|
|
#self.dsisr = Fac('DSISR',0, spr=True)
|
|
|
|
self.gpr = {}
|
|
self.r0 = 'r0'
|
|
self.r1 = 'r1'
|
|
self.r2 = 'r2'
|
|
self.r3 = 'r3'
|
|
self.r4 = 'r4'
|
|
self.r5 = 'r5'
|
|
self.r6 = 'r6'
|
|
self.r7 = 'r7'
|
|
self.r8 = 'r8'
|
|
self.r9 = 'r9'
|
|
self.r10 = 'r10'
|
|
self.r11 = 'r11'
|
|
self.r12 = 'r12'
|
|
self.r13 = 'r13'
|
|
self.r14 = 'r14'
|
|
self.r15 = 'r15'
|
|
self.r16 = 'r16'
|
|
self.r17 = 'r17'
|
|
self.r18 = 'r18'
|
|
self.r19 = 'r19'
|
|
self.r20 = 'r20'
|
|
self.r21 = 'r21'
|
|
self.r22 = 'r22'
|
|
self.r23 = 'r23'
|
|
self.r24 = 'r24'
|
|
self.r25 = 'r25'
|
|
self.r26 = 'r26'
|
|
self.r27 = 'r27'
|
|
self.r28 = 'r28'
|
|
self.r29 = 'r29'
|
|
self.r30 = 'r30'
|
|
self.r31 = 'r31'
|
|
|
|
def commentGPR(self):
|
|
if self.value >= 2**31:
|
|
neg = -((self.value ^ 0xFFFFFFFF) + 1)
|
|
return f'* {self.value:10} {neg:10}'
|
|
else:
|
|
return f'* {self.value:10}'
|
|
|
|
for i in range(32):
|
|
#name = f'R{i:02}'
|
|
name = f'r{i}'
|
|
self.gpr[name] = Fac(name, 0, gpr=True, rname=f'R{i:02}')
|
|
self.gpr[name].comment = MethodType(commentGPR, self.gpr[name])
|
|
|
|
def addFac(self, name, value=None, spr=False, gpr=False, fpr=False, vsr=False, rname=None):
|
|
self[name] = Fac(name, value, spr, gpr, fpr, vsr, rname)
|
|
self.facs[name] = self[name]
|
|
|
|
def all(self):
|
|
return self.facs.items()
|
|
|
|
class Fac:
|
|
|
|
def __init__(self, name, value=None, spr=False, gpr=False, fpr=False, vsr=False, rname=None):
|
|
self.name = name
|
|
self.rname = name if rname is None else rname
|
|
self.init = value
|
|
self.value = value
|
|
self.spr = spr
|
|
self.gpr = gpr
|
|
self.fpr = fpr
|
|
self.vsr = vsr
|
|
self.ref = False
|
|
self.chg = False
|
|
self.undefined = False # if allowed to generate, then if true needs to propagate to destination of succeeding ops
|
|
|
|
def comment(self):
|
|
return ''
|
|
|
|
def print(self, lines):
|
|
lines.append(f'R {self.rname:6} {self.value:08X}')
|
|
return self
|
|
|
|
|
|
class Op:
|
|
|
|
def __init__(self, name):
|
|
self.name = name
|
|
ops[name] = self
|
|
|
|
def fmt(self, val):
|
|
return f'{val:08X}'
|
|
|
|
def se16(self, v):
|
|
v = v & 0xFFFF
|
|
if v > 0x7FFF:
|
|
v = 0xFFFF0000 + v
|
|
return v
|
|
|
|
# has to also keep addresses since tst can be sparse when branching (to gen'd label)
|
|
def addToStream(self, ops):
|
|
ops.append(self.op)
|
|
return self
|
|
|
|
def print(self, lines):
|
|
lines.append(f'I {self.cia:08X} {self.op}')
|
|
for i in range(len(self.res)):
|
|
lines.append(f'R {self.res[i][0]:6} {self.res[i][1]:08X} {self.res[i][2]}')
|
|
lines.append('')
|
|
return self
|
|
|