wiremod-svn-archive/wire/lua/entities/gmod_wire_addressbus/init.lua
BlackPhoenix 0b43bac3b5 [FIXED] Added proper hispeed support for RAM gates (and gates in general)
[FIXED] Removed obsolete code from some hispeed devices
[FIXED] Misc ZASM error
[ADDED] "Connected" outputs to data socket and data plug
[FIXED] Added a neater error display in GPU
[FIXED] Added small fix for when other player removes your keyboard and you cant get out
2008-10-25 12:10:59 +00:00

90 lines
2.2 KiB
Lua

AddCSLuaFile( "cl_init.lua" )
AddCSLuaFile( "shared.lua" )
include('shared.lua')
ENT.WireDebugName = "AddressBus"
ENT.OverlayDelay = 0
function ENT:Initialize()
self.Entity:PhysicsInit( SOLID_VPHYSICS )
self.Entity:SetMoveType( MOVETYPE_VPHYSICS )
self.Entity:SetSolid( SOLID_VPHYSICS )
self.Entity:SetUseType( SIMPLE_USE )
self.Outputs = Wire_CreateOutputs(self.Entity, {"Memory"})
self.Inputs = Wire_CreateInputs(self.Entity,{"Memory1","Memory2","Memory3","Memory4"})
self.Memory = {}
self.MemStart = {}
self.MemEnd = {}
self.DataRate = 0
self.DataBytes = 0
for i = 1,4 do
self.Memory[i] = nil
self.MemStart[i] = 0
self.MemEnd[i] = 0
end
self:SetOverlayText( "Address bus\nData rate: 0 bps" )
end
function ENT:Think()
self.BaseClass.Think(self)
self.DataRate = (self.DataRate*1.2 + self.DataBytes * 4 * 0.8) / 2
self.DataBytes = 0
Wire_TriggerOutput(self.Entity, "Memory", self.DataRate)
self:SetOverlayText("Address bus\nData rate: "..math.floor(self.DataRate).." bps")
self.Entity:NextThink(CurTime()+0.25)
end
function ENT:ReadCell( Address )
for i = 1,4 do
if (Address >= self.MemStart[i]) && (Address <= self.MemEnd[i]) then
if (self.Memory[i]) then
if (self.Memory[i].ReadCell) then
self.DataBytes = self.DataBytes + 1
local val = self.Memory[i]:ReadCell( Address - self.MemStart[i] )
if (val) then
return val
else
return 0
end
end
else
return 0
end
end
end
return nil
end
function ENT:WriteCell( Address, value )
local res = false
for i = 1,4 do
if (Address >= self.MemStart[i]) && (Address <= self.MemEnd[i]) then
if (self.Memory[i]) then
if (self.Memory[i].WriteCell) then
self.Memory[i]:WriteCell( Address - self.MemStart[i], value )
end
end
self.DataBytes = self.DataBytes + 1
res = true
end
end
return res
end
function ENT:TriggerInput(iname, value)
if (iname == "Memory1") then
self.Memory[1] = self.Inputs.Memory1.Src
elseif (iname == "Memory2") then
self.Memory[2] = self.Inputs.Memory2.Src
elseif (iname == "Memory3") then
self.Memory[3] = self.Inputs.Memory3.Src
elseif (iname == "Memory4") then
self.Memory[4] = self.Inputs.Memory4.Src
end
end