60 lines
1.5 KiB
Text
60 lines
1.5 KiB
Text
integer id = 0, ipr = 1, ipc = 1
|
|
|
|
procedure step()
|
|
if and_bits(id,1) == 0 then
|
|
ipc += 1 - and_bits(id,2)
|
|
else
|
|
ipr += 1 - and_bits(id,2)
|
|
end if
|
|
end procedure
|
|
|
|
procedure snusp(integer dlen, string s)
|
|
sequence ds = repeat(0,dlen) -- data store
|
|
integer dp = 1 -- data pointer
|
|
|
|
-- remove leading '\n' from string if present
|
|
s = trim_head(s,'\n')
|
|
|
|
-- make 2 dimensional instruction store and set instruction pointers
|
|
sequence cs = split(s,'\n')
|
|
ipr = 1
|
|
ipc = 1
|
|
|
|
-- look for starting instruction
|
|
for i=1 to length(cs) do
|
|
ipc = find('$',cs[i])
|
|
if ipc then
|
|
ipr = i
|
|
exit
|
|
end if
|
|
end for
|
|
|
|
id = 0
|
|
|
|
-- execute
|
|
while ipr>=1 and ipr<=length(cs)
|
|
and ipc>=1 and ipc<=length(cs[ipr]) do
|
|
integer op = cs[ipr][ipc]
|
|
switch op do
|
|
case '>' : dp += 1
|
|
case '<' : dp -= 1
|
|
case '+' : ds[dp] += 1
|
|
case '-' : ds[dp] -= 1
|
|
case '.' : puts(1,ds[dp])
|
|
case ',' : ds[dp] = getc(0)
|
|
case '/' : id = not_bits(id)
|
|
case '\\': id = xor_bits(id,1)
|
|
case '!' : step()
|
|
case '?' : if ds[dp]=0 then step() end if
|
|
end switch
|
|
step()
|
|
end while
|
|
end procedure
|
|
|
|
constant hw = """
|
|
/++++!/===========?\>++.>+.+++++++..+++\
|
|
\+++\ | /+>+++++++>/ /++++++++++<<.++>./
|
|
$+++/ | \+++++++++>\ \+++++.>.+++.-----\
|
|
\==-<<<<+>+++/ /=.>.+>.--------.-/"""
|
|
|
|
snusp(5, hw)
|