46 lines
788 B
Plaintext
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
|
|
}}
|