add python implementation of pali (thanks arland!)
This commit is contained in:
parent
c66e6979df
commit
75615c8755
1 changed files with 116 additions and 0 deletions
116
pali.py
Executable file
116
pali.py
Executable file
|
@ -0,0 +1,116 @@
|
|||
#!/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()
|
Loading…
Reference in a new issue