116 lines
2.1 KiB
Python
Executable file
116 lines
2.1 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
|
|
import ctypes, sys, struct
|
|
|
|
memory = [0]*65536
|
|
here = 0
|
|
pointers = {}
|
|
|
|
|
|
def extract_code(code):
|
|
ret = ''
|
|
comment = True
|
|
for i in code.split('\n'):
|
|
if i == '~~~':
|
|
comment = comment == False
|
|
elif not comment:
|
|
ret += i+'\n'
|
|
return ret
|
|
|
|
|
|
ops = [ '..', 'li', 'du', 'dr', 'sw', 'pu',
|
|
'po', 'ju', 'ca', 'cc', 'cj', 're',
|
|
'eq', 'ne', 'lt', 'gt', 'fe', 'st',
|
|
'ad', 'su', 'mu', 'di', 'an', 'or',
|
|
'xo', 'sl', 'sr', 'cp', 'cy', 'io' ]
|
|
|
|
def comment(a):
|
|
pass
|
|
|
|
def origin(a):
|
|
global here
|
|
here = int(a)
|
|
|
|
def intw(a):
|
|
global memory, here
|
|
memory[here] = int(ctypes.c_int32(int(a)).value)
|
|
here += 1
|
|
|
|
def bundle(a):
|
|
A = ops.index(a[0:2])
|
|
B = ops.index(a[2:4])
|
|
C = ops.index(a[4:6])
|
|
D = ops.index(a[6:8])
|
|
intw((D<<24)+(C<<16)+(B<<8)+A)
|
|
|
|
def spacer(a):
|
|
global here
|
|
here += int(a)
|
|
|
|
def sstr(a):
|
|
intw(len(a))
|
|
for c in a:
|
|
intw(ord(c))
|
|
|
|
def zstr(a):
|
|
for c in a:
|
|
intw(ord(c))
|
|
intw(0)
|
|
|
|
def ref(a):
|
|
if a in pointers:
|
|
intw(pointers[a])
|
|
else:
|
|
intw(0)
|
|
|
|
def iref(a):
|
|
if a in pointers:
|
|
intw(-1 * pointers[a])
|
|
else:
|
|
intw(0)
|
|
|
|
def label(a):
|
|
global pointers
|
|
pointers[a] = here
|
|
|
|
def rc(code):
|
|
global here
|
|
here = 0
|
|
ops = {
|
|
'c': comment,
|
|
'o': origin,
|
|
'i': bundle,
|
|
'd': intw,
|
|
'*': spacer,
|
|
's': sstr,
|
|
'z': zstr,
|
|
'r': ref,
|
|
'R': iref,
|
|
'-': ref,
|
|
':': label
|
|
}
|
|
for line in code.split('\n'):
|
|
if ' ' in line.lstrip():
|
|
op,a = line.lstrip().split(' ', 1)
|
|
ops[op](a)
|
|
|
|
def save_image():
|
|
with open("ilo.rom", "wb") as f:
|
|
f.write(struct.pack('65536i', *memory[:65536]))
|
|
|
|
def pali(code):
|
|
code = extract_code(code)
|
|
rc(code) #pre processing
|
|
rc(code) #post processing
|
|
print('{} words ({} bytes) used'.format(here, here*4))
|
|
|
|
if __name__ == '__main__':
|
|
a = sys.argv
|
|
if len(a) > 1:
|
|
with open(a[1], 'r') as code:
|
|
pali(code.read())
|
|
save_image()
|
|
else:
|
|
with open('pali.output', 'w') as f:
|
|
pali(input('paste in Pali code:\n'))
|
|
save_image()
|