// Lisp0.bcpl Inital entry point is StartLisp
// Last change December 16, 1982 10:34 PM by Bill van Melle
// Last change October 6, 1982 6:12 PM by Bill van Melle
// Last change July 20, 1982 10:42 PM by Bill van Melle
// Last change March 23, 1982 9:30 PM by Bill van Melle
// Last change September 27, 1981 10:56 PM by Bill van Melle
// Tone change March 17, 1981 4:56 PM by Beau Sheil
// Last change February 24, 1981 1:55 PM by Beau Sheil
// Phrase change November 24, 1980 12:13 PM by Beau Sheil
get "LispBcpl.decl"
get "SysDefs.D"
external [
SavedUFP; SavedSCP; @ContextQ; TopLevelFrame
@lvNIL; @lvKT; @lvVPtr; @VPtr0; @VPtr1; @RMSK // useful values
BcplDisplay; MkSmallPos; RemapMemory // procedures used
Iresume; RAIDCode; CloseStats; Serial
AllocVec; MainInit; ShortStack // from maininit.bcpl
AllocPtr // allocater static
StartPup // Lisp Pup
Enqueue; Max; MyFrame; Junta; Block // OS procs
InitializeContext; CallContextList
lvUserFinishProc // Statics used
lvAbortFlag
@SubrArgsOffset; SubrArgsVector; @uPCTraceAddr
insideRaid; callRaid
// statics defined
LispStackLength
PupZoneLength
LispStackStart
PupZoneStart
lispStarted
LispFinishProc; LispCleanup; SysErr // procedures defined
]
static [
@TopLevelFrame; @ContextQ; SubrArgsVector
@lvNIL; @lvKT; @lvVPtr; @VPtr0; @VPtr1; @RMSK = #377
lispStarted = false
LispStackLength
PupZoneLength
LispStackStart
PupZoneStart
]
manifest ScreenScanLines = 808 // vertical screen size
let StartLisp() be Junta(levStreams,InitLisp) // main entry
and InitLisp() be
[
// EventualEndOfStack is an estimate of how much stack space we will need
// after the call to MainInit. MainInit assigns the rest (including its
// own stack) to the display, which we turn on.
[ let EventualEndOfStack=ShortStack(256)
MainInit(EventualEndOfStack)
@StackEnd=EventualEndOfStack // sets end of stack
]
BcplDisplay(ScreenScanLines-15) // give Bcpl dsp all the screen space
// save a few lines to protect against overscan
StartPup(PupZoneStart, PupZoneLength)
// Start the Pup world if there is a 3mb ethernet
// Init the TopLevel context and put it on ContextQ
Enqueue(ContextQ,
InitializeContext(LispStackStart,LispStackLength,TopLevel))
CallContextList(ContextQ!0) repeat // Start the contexts running
]
and TopLevel() be
[
TopLevelFrame = MyFrame()
lispStarted = true
insideRaid = false
@lvAbortFlag = 1 // disable shift-swat
if callRaid
then RAIDCode("Starting Lisp", lvNIL)
SubrArgsOffset = (SubrArgsVector-1)-TopLevelFrame // -1 adjusts indx orig
Iresume(lvKT) // never returns; T=>startup
]
and SysErr(p1, eCode) be
RAIDCode(selecton eCode into
[ case 1101: "Hard disk error"
case 1102: "Disk full"
case 1103: case 1104: "Bad disk command"
default: "SysErr" ],
MkSmallPos(eCode))
and LispCleanup() be
[
// if (SavedSCP+1) then @lvSwatContextProc = SavedSCP // restore Swat proc
if (SavedUFP+1) then @lvUserFinishProc = SavedUFP // restore finish proc
// if uPCTraceAddr then uPCTracing(false) // turn off any uPc logging
CloseStats() // turn off stats
BcplDisplay(0) // turn off any displays
RemapMemory() // restore map
]
and LispFinishProc() be
[
LispCleanup()
finish
]