diff --git a/sim/compiled_sim.c b/sim/compiled_sim.c index 09b28bd..800e3f6 100644 --- a/sim/compiled_sim.c +++ b/sim/compiled_sim.c @@ -144,8 +144,10 @@ void sim_gate_set_port(struct Gate* gate, int port, int state) { } int sim_gate_get_data(struct Gate* gate, int addr) { + assert(addr>=0 && addrdata_size); return gate->data[addr]; } void sim_gate_set_data(struct Gate* gate, int addr, int val) { + assert(addr>=0 && addrdata_size); gate->data[addr] = val; } diff --git a/sim/compiled_sim.dll b/sim/compiled_sim.dll index 2da4b15..cfdeab1 100644 Binary files a/sim/compiled_sim.dll and b/sim/compiled_sim.dll differ diff --git a/sim/compiled_sim_gates.c b/sim/compiled_sim_gates.c index f7a7213..9a47598 100644 --- a/sim/compiled_sim_gates.c +++ b/sim/compiled_sim_gates.c @@ -10,8 +10,8 @@ GATEFUNC(Not) { enum GateFuncs { GateFunc_None, - GateFunc_Diode, - GateFunc_Not, + GateFunc_Diode = 1, + GateFunc_Not = 2, }; GateFunc sim_logic_functions[] = { diff --git a/sim/gatedef.lua b/sim/gatedef.lua index 203ea99..198a486 100644 --- a/sim/gatedef.lua +++ b/sim/gatedef.lua @@ -7,7 +7,7 @@ GateDefinition = { input = function(gate, argv) end } -function GateDefinition.new(objref, name, description, init, logic, input, global, ports) +function GateDefinition.new(objref, name, description, init, logic, input, global, ports, datasize, logicfuncc) name = collapseescape(name) init = collapseescape(init) @@ -23,8 +23,8 @@ function GateDefinition.new(objref, name, description, init, logic, input, globa ports = ports or {}, num_in_ports = 0, num_out_ports = 0, - data_size_c = 0, -- todo - logic_function_c = 0, -- todo + data_size_c = datasize, + logic_function_c = logicfuncc, } local initfunc = loadstring(tostring(init)) diff --git a/sim/network.lua b/sim/network.lua index 55411a0..a70ed54 100644 --- a/sim/network.lua +++ b/sim/network.lua @@ -75,10 +75,13 @@ function network_update() local logic = data[i+5] local input = data[i+6] local global = data[i+7] - local numports = tonumber(data[i+8]) + local datasize = tonumber(data[i+8]) + local logicfuncc = tonumber(data[i+9]) + local numports = tonumber(data[i+10]) local ports = {} + i = i + 10 - for a = i+9, numports*5+i+8, 5 do + for a = i+1, numports*5+i, 5 do local portd = { type = tonumber(data[a]), position = vectotable(data[a+1]), @@ -91,10 +94,10 @@ function network_update() if not portd.direction then print(line) end end - local definition = GateDefinition.new(objref, name, desc, init, logic, input, global, ports) + local definition = GateDefinition.new(objref, name, desc, init, logic, input, global, ports, datasize, logicfuncc) Simulation.addgatedefinition(sim, definition) - i = i + 8 + numports*5 + i = i + numports*5 elseif data[i] == "SL" then local wire = Simulation.getwirebyref(sim, tonumber(data[i+1])) if wire ~= nil then