After reading the source code, I think blr
and blg
op codes need more than one operation in one tick. Currently, if blr
and blg
condition is satisfied, the compiler will return nil
to microcontroller. In microcontroller.tick
callback, this just add the program counter by 1. As pulse signals have only 1 tick lifetime, in next microcontroller.tick
call, there will be no signal on the wire. This might be why I got that error.
So I suggest adding a new result type: do_more_tick. Here is my implement suggestion.
Add result type in Compiler.lua, line 542:
blr = function(_) -- BLR M/I -- Block until there are at least [a] red signals.
assert_in(_)
local _in = _[1]
assert_in_mem_or_val(_in)
local count = memcount_or_val(_in)
if wires.red.signals == nil or #wires.red.signals < count then
return {type = "block"}
else -- Kiritow EDIT
return {type = "do_more_tick" }
end
end,
blg = function(_) -- BLG M/I -- Block until there are at least [a] green signals.
assert_in(_)
local _in = _[1]
assert_in_mem_or_val(_in)
local count = memcount_or_val(_in)
if wires.green.signals == nil or #wires.green.signals < count then
return {type = "block"}
else -- Kiritow EDIT
return {type = "do_more_tick" }
end
end,
Add result handler for do_more_tick in microcontroller.lua, line 110:
elseif result then
if result.type == 'halt' then
microcontroller.halt(mc, state)
elseif result.type == 'sleep' then
state.program_state = PSTATE_SLEEPING
state.sleep_time = result.val
elseif result.type == 'jump' then
microcontroller.set_program_counter(mc, state, result.val)
elseif result.type == 'skip' then
microcontroller.set_program_counter(mc, state, state.program_counter + 2)
elseif result.type == 'sync' then
state.program_state = PSTATE_SYNC
elseif result.type == 'do_more_tick' then -- Kiritow EDIT
state.program_counter = state.program_counter + 1
if state.program_counter > #state.program_ast then
microcontroller.halt(mc, state)
end
microcontroller.tick(mc,state)
return
elseif result.type == 'block' then
-- Do nothing, keeping the program_counter the same.
end
else