// Gateway.bcpl
// Last modified March 10, 1979 3:30 PM by Boggs
get "Pup0.decl"
get "Pup1.decl"
external
[
// outgoing procedures
Gateway; GatewayFinish
// incoming procedures
GatewayInit; CallContextList; Enqueue; SetAllocation
AddToZone; Allocate; Free; CallDos; ResetTimeServ
Ws; Endofs; Gets; HaltGateway; SetTimer; TimerHasExpired
// outgoing statics
versionText
// incoming statics
pbiFreeQ; lenPBI; ndbQ; socketQ; dPSIB; numNets
userFinishProc; sysZone; ctxQ; keys
]
static versionText
manifest
[
// Dos commands
reset = 65000b
ertn = 66400b
]
//----------------------------------------------------------------------------
let Gateway(blv) be
//----------------------------------------------------------------------------
[
versionText = "Nova Gateway of March 10, 1979"
GatewayInit(blv)
// throw away initialization code, add space to zone,
AddToZone(sysZone, GatewayInit, blv!29-GatewayInit-1)
// turn all remaining storage into pbis except for a small chunk
let pbiCount = 0
let freeSlop = Allocate(sysZone, 400)
[
let pbi = Allocate(sysZone, lenPBI, true)
if pbi eq 0 break
Enqueue(pbiFreeQ, pbi)
pbiCount = pbiCount+1
] repeat
Free(sysZone, freeSlop)
// fix allocations to reflect real number of pbis
pbiCount = pbiCount-numNets
let fakeSoc = dPSIB - offset PupSoc.psib/16
SetAllocation(fakeSoc, pbiCount, pbiCount-1, pbiCount-1)
let soc = socketQ!0
while soc ne 0 do
[ //update allocations in all sockets
SetAllocation(soc, pbiCount, pbiCount-1, pbiCount-1)
soc = soc!0
]
let ndb = ndbQ!0
while ndb ne 0 do
[ //update gateway allocations in ndbs
ndb>>NDB.numGPBI = pbiCount rshift 1
ndb = ndb!0
]
ResetTimeServ()
Ws("**** Gateway in operation *****N*L")
let quitTimer = 0
[
if quitTimer ne 0 & TimerHasExpired(lv quitTimer) then quitTimer = 0
unless Endofs(keys) switchon Gets(keys) into
[
case $Q: case $q:
[
Ws("*NQuit [Confirm] ")
SetTimer(lv quitTimer, 1000)
endcase
]
case $*177: case $N: case $n:
if quitTimer ne 0 then
[ Ws("No.*N"); quitTimer = 0; endcase ]
case $*N: case $Y: case $y:
if quitTimer ne 0 then
[ Ws("Yes.*N"); HaltGateway(); quitTimer = 0; endcase ]
default:
[ Ws("*N? - There is only one command: QUIT"); endcase ]
]
CallContextList(ctxQ!0)
] repeat
]
//----------------------------------------------------------------------------
and GatewayFinish(code) be
//----------------------------------------------------------------------------
[
Ws("**** Shutdown complete *****N*L") // well, not quite, but close enough
while userFinishProc ne 0 do userFinishProc()
CallDos(reset)
CallDos(ertn, nil, nil, code)
]