30 lines
658 B
Plaintext
30 lines
658 B
Plaintext
opcode=: {{
|
|
(m+{.y),}.y
|
|
:
|
|
x,m opcode y
|
|
}}
|
|
|
|
({{((x)=: y opcode)0}}&>32*i.@#);:'NOP LDA STA ADD SUB BRZ JMP STP'
|
|
|
|
exec1=: {{
|
|
'cod val'=. 0 32#:pc{mem
|
|
pc=: 32|pc+1
|
|
select. cod
|
|
case. 0 do. NB. NOP
|
|
case. 1 do. acc=: val{mem NB. LDA
|
|
case. 2 do. mem=: acc val} mem NB. STA
|
|
case. 3 do. acc=: 256|acc+val{mem NB. ADD
|
|
case. 4 do. acc=: 256|acc-val{mem NB. SUB
|
|
case. 5 do. pc=: 32|pc[^:(*acc) val NB. BRZ
|
|
case. 6 do. pc=: 32|val NB. JMP
|
|
case. 7 do. pc=: __ NB. STP
|
|
end.
|
|
}}
|
|
|
|
exec=: {{
|
|
mem=: 32{.y
|
|
pc=: acc=: 0
|
|
while. 0<:pc do. exec1'' end.
|
|
acc
|
|
}}
|