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.
98 lines
3.5 KiB
Python
98 lines
3.5 KiB
Python
# def ADDI0 = M"001110-----00000----------------" // 67 ra=0
|
|
# def ADDIa = M"001110-----1--------------------" // 67
|
|
# def ADDIb = M"001110------1-------------------" // 67
|
|
# def ADDIc = M"001110-------1------------------" // 67
|
|
# def ADDId = M"001110--------1-----------------" // 67
|
|
# def ADDIe = M"001110---------1----------------" // 67
|
|
# def ADDIS0 = M"001111-----00000----------------" // 67 ra=0
|
|
# def ADDISa = M"001111-----1--------------------" // 67
|
|
# def ADDISb = M"001111------1-------------------" // 67
|
|
# def ADDISc = M"001111-------1------------------" // 67
|
|
# def ADDISd = M"001111--------1-----------------" // 67
|
|
# def ADDISe = M"001111---------1----------------" // 67
|
|
# def ADDPCIS = M"010011--------------------00010-" // 68
|
|
# def ADD = M"011111----------------100001010-" // 69 add,add.,addo,addo.
|
|
# def ADDIC = M"001100--------------------------" // 69
|
|
# def ADDICR = M"001101--------------------------" // 69 addic.
|
|
# def ADDC = M"011111----------------000001010-" // 70 addc,addc.,addco,addco.
|
|
# def ADDE = M"011111----------------010001010-" // 71 adde,adde.,addeo,addeo.
|
|
# def ADDME = M"011111----------------011101010-" // 71 addme,addme.,addmeo,addmeo.
|
|
# def ADDZE = M"011111----------------011001010-" // 72 addze,addze.,addzeo,addzeo.
|
|
|
|
from arch import Op
|
|
|
|
# not sure this is really needed
|
|
from ctypes import c_uint32
|
|
|
|
class Addi(Op):
|
|
|
|
def __init__(self, facs):
|
|
self.name = 'addi'
|
|
self.facs = facs
|
|
|
|
def do(self, rt, ra, v):
|
|
gpr = self.facs.gpr
|
|
cia = self.facs.cia
|
|
self.rt = rt
|
|
self.ra = ra
|
|
self.imm = v
|
|
v = self.se16(v)
|
|
if ra == 'r0':
|
|
res = c_uint32(v).value
|
|
else:
|
|
res = c_uint32(c_uint32(gpr[ra].value).value + v).value
|
|
gpr[ra].ref = True
|
|
gpr[rt].value = res
|
|
gpr[rt].chg = True
|
|
self.cia = cia.value
|
|
cia.value += 4
|
|
self.nia = cia.value
|
|
cia.chg = True
|
|
self.op = f'{self.name:10s} {self.rt},{self.ra},{self.imm}'
|
|
self.res = [(gpr[rt].rname, gpr[rt].value, gpr[rt].comment()),(cia.rname, self.nia, cia.comment())]
|
|
return self
|
|
|
|
class Add(Op):
|
|
|
|
def __init__(self, facs, rc=False):
|
|
self.rc = rc
|
|
if rc:
|
|
self.name = 'add.'
|
|
else:
|
|
self.name = 'add'
|
|
self.facs = facs
|
|
|
|
def do(self, rt, ra, rb):
|
|
gpr = self.facs.gpr
|
|
cia = self.facs.cia
|
|
cr = self.facs.cr
|
|
xer = self.facs.xer
|
|
self.rt = rt
|
|
self.ra = ra
|
|
self.rb = rb
|
|
res = c_uint32(c_uint32(gpr[ra].value).value + c_uint32(gpr[rb].value).value).value
|
|
gpr[rt].value = res
|
|
gpr[ra].ref = True
|
|
gpr[rb].ref = True
|
|
gpr[rt].chg = True
|
|
if self.rc:
|
|
if res == 0:
|
|
cr0 = 0x2
|
|
elif res >= 2**31:
|
|
cr0 = 0x8
|
|
else:
|
|
cr0 = 0x4
|
|
cr0 = cr0 | xer.so()
|
|
cr.value = (cr.value & 0x00FFFFFF) | (cr0 << 28)
|
|
cr.chg = True
|
|
self.cia = cia.value
|
|
cia.value += 4
|
|
self.nia = cia.value
|
|
cia.chg = True
|
|
self.op = f'{self.name:10s} {self.rt},{self.ra},{self.rb}'
|
|
self.res = [(gpr[rt].rname, gpr[rt].value, gpr[rt].comment())]
|
|
if self.rc:
|
|
self.res.append((cr.rname, cr.value, cr.comment()))
|
|
self.res.append((cia.rname, self.nia, cia.comment()))
|
|
return self
|