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

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