1
0
mirror of https://github.com/rzzzwilson/pymlac.git synced 2025-06-10 09:32:41 +00:00
rzzzwilson.pymlac/idasm/processdisplay.py
2016-01-31 15:53:49 +07:00

110 lines
2.8 KiB
Python
Executable File

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
This module takes a memory dictionary of the form:
{ <memstr>: ( <type>, <wordvalue> ), ...}
and a start address and returns a processed dictionary, where the <type>
is changed to one of "main", "mainref", "disp", "dispref" or "ref".
"""
import mem
import disasmd
dispQ = []
def dequeDisp():
result = None
if len(dispQ) > 0:
result = dispQ[0]
del dispQ[0]
return result
def effAddress(addr, offset):
return (addr & 0174000) + offset
def enqueDisp(address):
dispQ.append(address)
def getTargetAddress(code):
return code & 07777
def isDHLT(code):
return code == 0000000
def isDEIM(code):
opcode = code & 0070000
return opcode == 0030000
def isDEIMExit(code):
hibyte = (code >> 8) & 0377
lobyte = code & 0377
return isDEIMExitByte(hibyte) or isDEIMExitByte(lobyte)
def isDEIMReturn(code):
hibyte = (code >> 8) & 0377
lobyte = code & 0377
return isDEIMReturnByte(hibyte) or isDEIMReturnByte(lobyte)
def isDEIMExitByte(byte):
return (byte & 0300) == 0100
def isDEIMReturnByte(byte):
return (byte & 0240) == 0040
def isDJMP(code):
opcode = code & 0070000
return opcode == 0060000
def isDJMS(code):
opcode = code & 0070000
return opcode == 0050000
def isDRJM(code):
return code == 0004040
def process(mem, addrlist, newcycle):
mode = "normal"
for addr in addrlist:
enqueDisp(addr)
while len(dispQ) > 0:
address = dequeDisp()
while True:
if mem.getCycle(address) == newcycle: # seen it already
break
mem.putCycle(address, newcycle)
code = mem.getCode(address)
(op, fld) = disasmd.disasmd(code)
mem.putOp(address, op)
mem.putFld(address, fld)
if mode == "deim":
if isDEIMExit(code):
mode = "normal"
if isDEIMReturn(code):
break
else:
if mem.getRef(address):
mem.decLab(getTargetAddress(code))
if isDJMP(code):
memref = effAddress(address, getTargetAddress(code))
mem.setRef(address)
mem.incLab(memref)
enqueDisp(memref)
break
elif isDRJM(code):
break
elif isDJMS(code):
memref = effAddress(address, getTargetAddress(code))
mem.setRef(address)
mem.incLab(memref)
enqueDisp(memref)
elif isDEIM(code):
mode = "deim"
elif isDHLT(code):
break
address = address + 1