// GatewayInit.bcpl -- initialization for Gateway.bcpl
// Last modified February 9, 1979 4:04 PM by Boggs
get "Streams.d"
external
[
// outgoing procedures
GatewayInit
// incoming procedures
CreateMiscServ; CreateEchoServ; InitPupLevel1
CreateGateConServ; CreateStatServ; ReadGateParam
InitEFTPPackage; InitNovaAlto
InitializeZone; AddToZone; Allocate; Zero
InitializeContext; Block; MyFrame; Enqueue
EnterDebugger; DosBreak; BreakLoc; CallDos; MakeDosString
OpenFile; Gets; Closes; Endofs; CallSwat
Puts; Ws; Wss; Wns
// outgoing statics
ctxQ; preserveDebugger
// incoming statics
sysZone; dosAc; dsp
]
static
[
ctxQ
sawCR = false
preserveDebugger = false
]
manifest
[
stackEnd = 335b
exec = 63400b
pchar = 70000b
gatewayQuitCode = 12345 //Dos ".ertn" code to signal normal Quit
]
//----------------------------------------------------------------------------
let GatewayInit(blv) be
//----------------------------------------------------------------------------
[
dsp = lv DosDspPuts - offset ST.puts/16
if @406b ne -1 & @BreakLoc eq 401b then
[
Ws("No breakpoint*N*Lto make a break file type:*N*L ")
Wns(dsp, BreakLoc, 1, 8); Ws("$B*N*L ")
Wns(dsp, DosBreak, 1, 8); Ws("$R*N*L")
Ws("Then type: SAVE GATEWAY <CR>*N*LEntering debugger...")
@404b = blv!29 //reset NMAX to top of code
EnterDebugger()
]
let codeEnd = blv!29
let freeEnd = @stackEnd
let freeBegin = MyFrame() +200
@stackEnd = freeBegin
sysZone = InitializeZone(freeBegin, freeEnd-freeBegin)
ctxQ = Allocate(sysZone, 2); ctxQ!0 = 0
// If /I global switch is present, then we are the "inferior"
// gateway program and we should go ahead and run. If /I is not
// present, then we should write a COM.CM with /I set and overlay
// the gateway program recursively.
// If /D global switch is present, set the preserveDebugger flag.
let str = OpenFile("COM.CM", ksTypeReadOnly, charItem)
until Gets(str) eq 0 loop //skip over subsystem name
if (Gets(str) & #20) ne 0 then preserveDebugger = true // test /D
let inferiorGateway = (Gets(str) & #200) ne 0 // test /I
Closes(str)
unless inferiorGateway do
[ //we are the "superior". Do recursive overlay
Ws("*n*l**** Gateway restarting *****n*l")
str = OpenFile("COM.CM", ksTypeWriteOnly, charItem)
Wss(str, "GATEWAY*000")
Puts(str, (preserveDebugger? #20, 0)) // set /D if appropriate
Wss(str, "*200*000*000*377") // set /I, terminate COM.CM
Closes(str)
let s = vec 5
s = MakeDosString("GATEWAY.SV", s)
CallDos(exec, s, 0, -1)
if dosAc!2 eq gatewayQuitCode finish //normal "Quit"
] repeat //crash or forced restart
// GatewayInit (cont'd)
InitNovaAlto(sysZone)
InitPupLevel1(sysZone, ctxQ, 0)
InitEFTPPackage(sysZone)
CreateEchoServ(sysZone, ctxQ)
CreateMiscServ(sysZone, ctxQ)
CreateStatServ(sysZone, ctxQ)
CreateGateConServ()
ReadGateParam() // must FOLLOW server initialization
unless preserveDebugger % @406b eq -1 do
[
//flush the debugger.
//We know that @406b is a pointer to the first word of
//the debugger, that BUTIL is the next thing loaded after
//it, and that the load vector is the first thing in BUTIL.
AddToZone(sysZone, @406b, blv-@406b)
@406b = -1
]
]
//----------------------------------------------------------------------------
and DosDspPuts(nil, char) be
//----------------------------------------------------------------------------
[
if sawCR & char ne $*L then CallDos(pchar, $*L)
CallDos(pchar, char)
sawCR = char eq $*N
]