def getDisas(self): extended = flagmap[EXTENDED] if isExtendedInstr(self.instr) else ' ' immidiate = flagmap[IMMIDIATE] if isImidiateInstr(self.instr) else '' sic = flagmap[SIC] if isSicInstr(self.instr) else '' inDirect = flagmap[INDIRECT] if isIndirectInstr(self.instr) else '' index = flagmap[INDEX] if isIndexedInstr(self.instr) else '' base = flagmap[BASE] if isBaseInstr(self.instr) else '' pc = flagmap[PC] if isPcInstr(self.instr) else '' operand = self.signedDisp() # getDisp(self.instr) sign = '-' if operand < 0 else '' nixpbe = nixbpeToStringInstr(self.instr) p = INT(self.loc + len(self.instr), 24, False) ta = getTargetAddress(self.instr, p, register.B, register.X, self.cu.mem, isDisas=True) out = nixpbe + ' ' + self.form.format( self.getSymbol(self.loc, toTA=False), extended, self.mnemonic, self.getSymbol(ta.dec, sic, inDirect, immidiate, index, toTA=True), sic, immidiate, inDirect, sign, abs(operand), pc, base, index) f = ' ' * (70 - len(out)) return out + f + ' = ' + self.ta(ta)
from util import INT, SICXE_SIZE_BIT_EXPONENT, SICXE_SIZE_BIT_MANTISSA, SICXE_SIZE_BIT_WORD from util.num import FLOAT from random import randint SICXE_NUM_REGISTER_A = 0 SICXE_NUM_REGISTER_X = 1 SICXE_NUM_REGISTER_L = 2 SICXE_NUM_REGISTER_PC = 8 SICXE_NUM_REGISTER_SW = 9 SICXE_NUM_REGISTER_B = 3 SICXE_NUM_REGISTER_S = 4 SICXE_NUM_REGISTER_T = 5 SICXE_NUM_REGISTER_F = 6 A = INT(randint(0,(1<<24) - 1), SICXE_SIZE_BIT_WORD, True) X = INT(randint(0,(1<<24) - 1), SICXE_SIZE_BIT_WORD, False) L = INT(randint(0,(1<<24) - 1), SICXE_SIZE_BIT_WORD, False) PC = INT(randint(0,(1<<20) - 1), SICXE_SIZE_BIT_WORD, False) SW = INT(randint(0,(1<<24) - 1), SICXE_SIZE_BIT_WORD, False) B = INT(randint(0,(1<<24) - 1), SICXE_SIZE_BIT_WORD, False) S = INT(randint(0,(1<<24) - 1), SICXE_SIZE_BIT_WORD, False) T = INT(randint(0,(1<<24) - 1), SICXE_SIZE_BIT_WORD, False) F = FLOAT(randint(0,(1<<48) - 1), SICXE_SIZE_BIT_EXPONENT, SICXE_SIZE_BIT_MANTISSA, False) registers = {0: A, 1: X, 2: L, 3: B, 4: S, 5: T, 6: F, 8: PC, 9: SW} def registerToString(num: int): r = "AXLBSTF?PW" if num in registers: return r[num]
def addrm(register: INT, mem: MEMORY, addr, isImmediate=False): operand = addr if isImmediate else mem.getword(addr, True) register.add(operand, setSelf=True)
def compfrm(register: FLOAT, sw: INT, mem: MEMORY, addr, isImmediate=False): operand = addr if isImmediate else mem.getfloat(addr) cc = SICXE_CC_GT if register > operand else SICXE_CC_LT if register < operand else SICXE_CC_EQ sw.setbits(cc, (6, 8), BIG)
def comprr(register1: INT, register2: INT, sw: INT): cc = SICXE_CC_GT if register1 > register2 else SICXE_CC_LT if register1 < register2 else SICXE_CC_EQ sw.setbits(cc, (6, 8), BIG)
def stch(register: INT, mem: MEMORY, addr): mem.setbyte(addr, register.getbits((0, 8), False, LITTLE))
def ldch(register: INT, mem: MEMORY, addr, isImmediate=False): operand = addr if isImmediate else mem.getbyte(addr) if operand < 0 or operand > 0xff: raise Exception('cannot be longer the a byte') register.setbits(operand, (0, 8), LITTLE)
def ld(register: INT, mem: MEMORY, addr, isImmediate=False): operand = addr if isImmediate else mem.getword(addr, False) register.set(operand)