User:Ashmanskas/p364/sasm.py
From LaPET electronics
< User:Ashmanskas | p364
sasm.py
# # sasm.py # coded 2010-11-11 by Bill Ashmanskas, ashmansk@hep.upenn.edu # simple assembler for instruction set of simple_cpu.v # import sys, string def main(): ptext = [] addr = 0x00 labeladdr = {} for l in open(sys.argv[1]): l = l.strip() if "#" in l: l = l.split("#")[0] w = l.strip().split() if len(w)==0: continue if w[0][-1]==":": label = w[0][:-1] labeladdr[label] = addr p = w[1:] else: p = w[:] if len(p)>0: p = ["%02x"%(addr)]+p ptext.append(p) addr += 1 addrlabel = dict([(labeladdr[k],k) for k in labeladdr]) nulllabel = " "*(2+max([len(k) for k in labeladdr])) for p in ptext: addr = int(p[0],16) mnemonic = p[1].lower() if len(p)>2: argument = p[2] else: argument = "0" if argument in labeladdr: harg = labeladdr[argument] else: harg = int(argument,16) hbyte = harg & 0xff instrs = "load store jump jumpz jumpn add sub mul out".split() if mnemonic==".data": instr = harg elif mnemonic in instrs: instr = instrs.index(mnemonic)*0x0100 + hbyte else: raise ValueError, "unknown mnemonic "+mnemonic label = nulllabel if addr in addrlabel: label = addrlabel[addr]+": "+nulllabel label = label[:len(nulllabel)] print " mem['h%02x] = 'h%04x; // %s %-5s"%( \ addr, instr, label, p[1]), \ " ".join(p[2:]) if __name__=="__main__": main()