mirror of
https://github.com/rzzzwilson/pymlac.git
synced 2025-06-10 09:32:41 +00:00
142 lines
5.9 KiB
Python
Executable File
142 lines
5.9 KiB
Python
Executable File
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
|
This module disassembles one imlac machine word into a main processor
|
|
instruction string. If the word isn't a legal instruction, return DATA.
|
|
"""
|
|
|
|
|
|
def disasmm(word):
|
|
result = ("", "")
|
|
opcode = word & 0174000
|
|
if opcode == 0000000: result = doGrpZero(word)
|
|
elif opcode == 0004000: result = ("LAW", "%05o" % (word & 03777))
|
|
elif opcode == 0104000: result = ("LWC", "%05o" % (word & 03777))
|
|
elif opcode == 0010000: result = ("JMP", "%05o" % (word & 03777))
|
|
elif opcode == 0110000: result = ("JMP", "*%05o" % (word & 03777))
|
|
elif opcode == 0020000: result = ("DAC", "%05o" % (word & 03777))
|
|
elif opcode == 0120000: result = ("DAC", "*%05o" % (word & 03777))
|
|
elif opcode == 0024000: result = ("XAM", "%05o" % (word & 03777))
|
|
elif opcode == 0124000: result = ("XAM", "*%05o" % (word & 03777))
|
|
elif opcode == 0030000: result = ("ISZ", "%05o" % (word & 03777))
|
|
elif opcode == 0130000: result = ("ISZ", "*%05o" % (word & 03777))
|
|
elif opcode == 0034000: result = ("JMS", "%05o" % (word & 03777))
|
|
elif opcode == 0134000: result = ("JMS", "*%05o" % (word & 03777))
|
|
elif opcode == 0044000: result = ("AND", "%05o" % (word & 03777))
|
|
elif opcode == 0144000: result = ("AND", "*%05o" % (word & 03777))
|
|
elif opcode == 0050000: result = ("IOR", "%05o" % (word & 03777))
|
|
elif opcode == 0150000: result = ("IOR", "*%05o" % (word & 03777))
|
|
elif opcode == 0054000: result = ("XOR", "%05o" % (word & 03777))
|
|
elif opcode == 0154000: result = ("XOR", "*%05o" % (word & 03777))
|
|
elif opcode == 0060000: result = ("LAC", "%05o" % (word & 03777))
|
|
elif opcode == 0160000: result = ("LAC", "*%05o" % (word & 03777))
|
|
elif opcode == 0064000: result = ("ADD", "%05o" % (word & 03777))
|
|
elif opcode == 0164000: result = ("ADD", "*%05o" % (word & 03777))
|
|
elif opcode == 0070000: result = ("SUB", "%05o" % (word & 03777))
|
|
elif opcode == 0170000: result = ("SUB", "*%05o" % (word & 03777))
|
|
elif opcode == 0074000: result = ("SAM", "%05o" % (word & 03777))
|
|
elif opcode == 0174000: result = ("SAM", "*%05o" % (word & 03777))
|
|
elif opcode == 0100000: result = doMicroCode(word)
|
|
else: result = ("DATA", "%07o" % word)
|
|
|
|
return result
|
|
|
|
def doGrpZero(word):
|
|
opcode = word & 0177000
|
|
if opcode == 0000000:
|
|
if word > 0:
|
|
return ("HLT", "%d" % word)
|
|
return ("HLT", "")
|
|
elif opcode == 0003000: return doShRot(word)
|
|
elif opcode == 0002000: return doSkipFlag(word)
|
|
elif opcode == 0001000: return doIOT(word)
|
|
else: print "DEFAULT"; return ("DATA", "%06o" % word)
|
|
|
|
|
|
def doShRot(word):
|
|
opcode = word & 0177770
|
|
if opcode == 0003040: return ("SAL", "%d" % (word & 07))
|
|
elif opcode == 0003060: return ("SAR", "%d" % (word & 07))
|
|
elif opcode == 0003100: return ("DON", "")
|
|
elif opcode == 0003000: return ("RAL", "%d" % (word & 07))
|
|
elif opcode == 0003020: return ("RAR", "%d" % (word & 07))
|
|
else: return ("DATA", "%06o" % word)
|
|
return None
|
|
|
|
def doSkipFlag(word):
|
|
if word == 002001: return ("ASZ", "")
|
|
elif word == 002002: return ("ASP", "")
|
|
elif word == 002004: return ("LSZ", "")
|
|
elif word == 002010: return ("DSF", "")
|
|
elif word == 002020: return ("KSF", "")
|
|
elif word == 002040: return ("RSF", "")
|
|
elif word == 002100: return ("TSF", "")
|
|
elif word == 002200: return ("SSF", "")
|
|
elif word == 002400: return ("HSF", "")
|
|
else: return ("DATA", "%06o" % word)
|
|
return None
|
|
|
|
def doIOT(word):
|
|
if word == 001003: return ("DLA", "")
|
|
elif word == 001011: return ("CTB", "")
|
|
elif word == 001012: return ("DOF", "")
|
|
elif word == 001021: return ("KRB", "")
|
|
elif word == 001022: return ("KCF", "")
|
|
elif word == 001023: return ("KRC", "")
|
|
elif word == 001031: return ("RRB", "")
|
|
elif word == 001032: return ("RCF", "")
|
|
elif word == 001033: return ("RRC", "")
|
|
elif word == 001041: return ("TPR", "")
|
|
elif word == 001042: return ("TCF", "")
|
|
elif word == 001043: return ("TPC", "")
|
|
elif word == 001051: return ("HRB", "")
|
|
elif word == 001052: return ("HOF", "")
|
|
elif word == 001061: return ("HON", "")
|
|
elif word == 001062: return ("STB", "")
|
|
elif word == 001071: return ("SCF", "")
|
|
elif word == 001072: return ("IOS", "")
|
|
elif word == 001274: return ("PSF", "")
|
|
elif word == 001271: return ("PPC", "")
|
|
elif word == 001101: return ("IOT", "0101")
|
|
elif word == 001141: return ("IOT", "0141")
|
|
elif word == 001161: return ("IOT", "0161")
|
|
elif word == 001162: return ("IOT", "0162")
|
|
elif word == 001131: return ("IOT", "0131")
|
|
elif word == 001132: return ("IOT", "0132")
|
|
elif word == 001134: return ("IOT", "0134")
|
|
else: return ("DATA", "%06o" % word)
|
|
return None
|
|
|
|
def doMicroCode(word):
|
|
if word == 0100000: return ("NOP", "")
|
|
elif word == 0100001: return ("CLA", "")
|
|
elif word == 0100002: return ("CMA", "")
|
|
elif word == 0100003: return ("STA", "")
|
|
elif word == 0100004: return ("IAC", "")
|
|
elif word == 0100005: return ("COA", "")
|
|
elif word == 0100006: return ("CIA", "")
|
|
elif word == 0100010: return ("CLL", "")
|
|
elif word == 0100020: return ("CML", "")
|
|
elif word == 0100011: return ("CAL", "")
|
|
elif word == 0100030: return ("STL", "")
|
|
elif word == 0100040: return ("ODA", "")
|
|
elif word == 0100041: return ("LDA", "")
|
|
elif word == 0102001: return ("ASN", "")
|
|
elif word == 0102002: return ("ASM", "")
|
|
elif word == 0102004: return ("LSN", "")
|
|
elif word == 0102010: return ("DSN", "")
|
|
elif word == 0102020: return ("KSN", "")
|
|
elif word == 0102040: return ("RSN", "")
|
|
elif word == 0102100: return ("TSN", "")
|
|
elif word == 0102200: return ("SSN", "")
|
|
elif word == 0102400: return ("HSN", "")
|
|
else: return ("DATA", "%06o" % word)
|
|
return None
|
|
|
|
|
|
if __name__ == "__main__":
|
|
for word in xrange(0177777 + 1):
|
|
(op, fld) = disasmm(word)
|
|
print "%07o: %s %s" % (word, op, fld)
|