98 lines
2.4 KiB
Lua
98 lines
2.4 KiB
Lua
AddCSLuaFile()
|
|
DEFINE_BASECLASS( "base_wire_entity" )
|
|
ENT.PrintName = "Wire Address Bus"
|
|
ENT.WireDebugName = "AddressBus"
|
|
|
|
if CLIENT then return end -- No more client
|
|
|
|
function ENT:Initialize()
|
|
self:PhysicsInit(SOLID_VPHYSICS)
|
|
self:SetMoveType(MOVETYPE_VPHYSICS)
|
|
self:SetSolid(SOLID_VPHYSICS)
|
|
self:SetUseType(SIMPLE_USE)
|
|
self.Outputs = Wire_CreateOutputs(self, {"Memory"})
|
|
self.Inputs = Wire_CreateInputs(self,{"Memory1","Memory2","Memory3","Memory4"})
|
|
self.DataRate = 0
|
|
self.DataBytes = 0
|
|
|
|
self.Memory = {}
|
|
self.MemStart = {}
|
|
self.MemEnd = {}
|
|
for i = 1,4 do
|
|
self.Memory[i] = nil
|
|
self.MemStart[i] = 0
|
|
self.MemEnd[i] = 0
|
|
end
|
|
self:SetOverlayText("Data rate: 0 bps")
|
|
end
|
|
|
|
function ENT:Setup(Mem1st, Mem2st, Mem3st, Mem4st, Mem1sz, Mem2sz, Mem3sz, Mem4sz)
|
|
local starts = {Mem1st,Mem2st,Mem3st,Mem4st}
|
|
local sizes = {Mem1sz,Mem2sz,Mem3sz,Mem4sz}
|
|
for i = 1,4 do
|
|
starts[i] = tonumber(starts[i]) or 0
|
|
sizes[i] = tonumber(sizes[i]) or 0
|
|
|
|
self.MemStart[i] = starts[i]
|
|
self.MemEnd[i] = starts[i] + sizes[i] - 1
|
|
self["Mem"..i.."st"] = starts[i]
|
|
self["Mem"..i.."sz"] = sizes[i]
|
|
end
|
|
end
|
|
|
|
function ENT:Think()
|
|
BaseClass.Think(self)
|
|
|
|
self.DataRate = self.DataBytes
|
|
self.DataBytes = 0
|
|
|
|
Wire_TriggerOutput(self, "Memory", self.DataRate)
|
|
self:SetOverlayText("Data rate: "..math.floor(self.DataRate*2).." bps")
|
|
self:NextThink(CurTime()+0.5)
|
|
return true
|
|
end
|
|
|
|
function ENT:ReadCell(Address)
|
|
Address = math.floor(Address)
|
|
for i = 1,4 do
|
|
if (Address >= self.MemStart[i]) and (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])
|
|
return val or 0
|
|
end
|
|
else
|
|
return 0
|
|
end
|
|
end
|
|
end
|
|
return nil
|
|
end
|
|
|
|
function ENT:WriteCell(Address, value)
|
|
Address = math.floor(Address)
|
|
local res = false
|
|
for i = 1,4 do
|
|
if (Address >= self.MemStart[i]) and (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)
|
|
for i = 1,4 do
|
|
if iname == "Memory"..i then
|
|
self.Memory[i] = self.Inputs["Memory"..i].Src
|
|
end
|
|
end
|
|
end
|
|
|
|
duplicator.RegisterEntityClass("gmod_wire_addressbus", WireLib.MakeWireEnt, "Data", "Mem1st", "Mem2st", "Mem3st", "Mem4st", "Mem1sz", "Mem2sz", "Mem3sz", "Mem4sz")
|