Created
November 27, 2021 23:21
-
-
Save Demindiro/87f5382c16b5f46ba592e214645fcd78 to your computer and use it in GitHub Desktop.
Simple assembler for 12-bit data, 13-bit insrtuction ISA
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
una_ops = { | |
'not': 0b0001, | |
'inv': 0b0010, | |
'sll': 0b0011, | |
'srl': 0b0100, | |
'sla': 0b0101, | |
'sra': 0b0110, | |
'cp' : 0b0110, | |
} | |
duo_ops = { | |
'or' : 0b0001, | |
'and': 0b0010, | |
'add': 0b0011, | |
'sub': 0b0100, | |
'lt' : 0b0101, | |
'gt' : 0b0110, | |
'eq' : 0b0111, | |
'neq': 0b1000, | |
} | |
def enc_op(op, rd, rs, rt): | |
return op << 9 | rd << 6 | rs << 3 | rt | |
def dec_reg(reg: str): | |
if reg[0] != 'r': | |
raise Exception('not a register: ' + reg) | |
return int(reg[1:]) | |
def dec_mnem_args(mnem: str, args: [str]): | |
if mnem == 'zero': | |
o, d, s, t = 0, dec_reg(args[0]), 0, 0 | |
elif mnem in una_ops: | |
o, d, s, t = 0, dec_reg(args[0]), dec_reg(args[1]), una_ops[mnem] | |
elif mnem in duo_ops: | |
o, d, s, t = duo_ops[mnem], dec_reg(args[0]), dec_reg(args[1]), dec_reg(args[2]) | |
elif mnem in ('lw', 'sw'): | |
o = 0b1001 if mnem == 'lw' else 0b1010 | |
d, s, t = dec_reg(args[0]), dec_reg(args[1]), int(args[2]) | |
else: | |
raise Exception('unknown mnemonic: ' + mnem) | |
return enc_op(o, d, s, t) | |
def assemble(line): | |
line = line.split() | |
return dec_mnem_args(line[0], line[1:]) | |
if __name__ == '__main__': | |
try: | |
while True: | |
line = input() | |
if line != '' and not line.isspace(): | |
print(hex(assemble(line))[2:].rjust(4, '0')) | |
except EOFError: | |
pass |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment