(phixonline)-->
with javascript_semantics
constant NOP = 0b000_00000, -- no operation
LDA = 0b001_00000, -- load accumulator, a := memory [xxxxx]
STA = 0b010_00000, -- store accumulator, memory [xxxxx] := a
ADD = 0b011_00000, -- add, a := a + memory [xxxxx]
SUB = 0b100_00000, -- subtract, a := a – memory [xxxxx]
BRZ = 0b101_00000, -- branch on zero, if a = 0 then goto xxxxx
JMP = 0b110_00000, -- jump, goto xxxxx
STP = 0b111_00000, -- stop
OP = 0b111_00000, -- operator mask
ARG = 0b000_11111 -- memory location (0 based)
procedure execute(string name, sequence program)
sequence memory = deep_copy(program)
integer pc = 1, a = 0
while true do
integer ppc = memory[pc],
op = and_bitsu(ppc,OP),
arg = and_bits(ppc,ARG)+1
pc += 1
switch op do
case NOP: break
case LDA: a = memory[arg]
case STA: memory[arg] = a
case ADD: a = and_bitsu(a+memory[arg],#FF)
case SUB: a = and_bitsu(a-memory[arg],#FF)
case BRZ: if a=0 then pc = arg end if
case JMP: pc = arg
case STP: printf(1,"%12s: %3d\n",{name,a})
return
end switch
end while
end procedure
execute("2+2",{LDA+3, ADD+4, STP, 2,2})
execute("7*8",{LDA+12, ADD+10, STA+12, LDA+11, SUB+13, STA+11, BRZ+8, JMP+0,
LDA+12, STP, 8,7,0,1})
execute("fibonacci",{LDA+14, STA+15, ADD+13, STA+14, LDA+15, STA+13, LDA+16,
SUB+17, BRZ+11, STA+16, JMP+0, LDA+14, STP, 1,1,0,8,1})
execute("linkedList",{LDA+13, ADD+15, STA+5, ADD+16, STA+7, NOP, STA+14, NOP,
BRZ+11, STA+15, JMP+0, LDA+14, STP, LDA+0, 0,28,1,0,0,
0,6,0,2,26,5,20,3,30,1,22,4,24})
execute("prisoner",{NOP, NOP, STP, 0, LDA+3, SUB+29, BRZ+18, LDA+3, STA+29,
BRZ+14, LDA+1, ADD+31, STA+1, JMP+2, LDA+0, ADD+31, STA+0,
JMP+2, LDA+3, STA+29, LDA+1, ADD+30, ADD+3, STA+1, LDA+0,
ADD+30, ADD+3, STA+0, JMP+2, 0, 1, 3})
-- subtractions yielding negative results
execute("0-255",{LDA+3,SUB+4,STP, 0,255})
execute("0-1",{LDA+3, SUB+4, STP, 0,1})
-- overflow on addition
execute("1+255",{LDA+3, ADD+4, STP, 1, 255})