RosettaCodeData/Task/Execute-Computer-Zero/J/execute-computer-zero-1.j

46 lines
788 B
Plaintext

OPS=: 'nop lda sta add sub brz jmp stp'
assemble1=: {{
y=. tolower y
ins=. {.;:y-.":i.10
cod=. 8|(;:OPS) i. ins
val=. {.0".y-.OPS
if. *cod do.
assert. 32>val
val+32*cod
else.
assert. 256>val
val
end.
}}
assemble=: {{
if. 0=L. y do.
delim=. {.((tolower y)-.(":i.10),;OPS),LF
y=. delim cut y
end.
code=. assemble1@> y
mem=: code (i.#code)} 32#0
}}
exec1=: {{
'cod val'=. 0 32#:pc{mem
pc=: 32|pc+1
select. cod
case. 0 do.
case. 1 do. acc=: val{mem
case. 2 do. mem=: acc val} mem
case. 3 do. acc=: 256|acc+val{mem
case. 4 do. acc=: 256|acc-val{mem
case. 5 do. pc=: 32|pc[^:(*acc) val
case. 6 do. pc=: 32|val
case. 7 do. pc=: __
end.
}}
exec=: {{
pc=: acc=: 0
while. 0<:pc do. exec1'' end.
acc
}}