Skip to content

Instantly share code, notes, and snippets.

@Demindiro
Created November 27, 2021 23:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Demindiro/87f5382c16b5f46ba592e214645fcd78 to your computer and use it in GitHub Desktop.
Save Demindiro/87f5382c16b5f46ba592e214645fcd78 to your computer and use it in GitHub Desktop.
Simple assembler for 12-bit data, 13-bit insrtuction ISA
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