// A L T O E X E C U T I V E // Initialization Module - ExecInit.bcpl // Copyright Xerox Corporation 1979 // Ed McCreight // last edited by R. Johnsson, May 21, 1980 10:40 PM get "AltoFileSys.d" get "Streams.d" get "BCPLFiles.d" get "COMSTRUCT.BCPL" external [ // exported to OnceOnly ClockWrong DiskInfo DiskName ExecSysErr InCaseOfDemise NetNumber OldUserFinishProc OverlayArea OverlayAreaSize ShowDiskInfo SpaceAbove SpaceBelow // imported from OnceOnly OnceOnlyInitCode ] static [ BLVptr ExecCFA OverlayArea OverlayAreaSize DiskInfo // stream for disk info DiskName DiskStatus = #522 NetNumber = 0 OldSysErr OldUserFinishProc SpaceAbove SpaceBelow ClockWrong = false ] let Initialize(CFA, blv) = valof [ BLVptr = blv; ExecCFA = CFA let BQ = OnceOnlyInitCode(CFA) // add the space after the overlay area to // the zone SetEndCode(OverlayArea+OverlayAreaSize) let FreeBlockSize = FixedLeft()-StackNeeds AddToZone(CZ, GetFixed(FreeBlockSize), FreeBlockSize) if ClockWrong then [ SetTime(); MAKETIMELINE() ] resultis BQ ] and RememberData(lvData) be [ let exec = OpenFile(0,ksTypeReadOnly,wordItem,0,lv ExecCFA>>CFA.fp) let dataPos = ((offset SV.statics)/16 + lvData-BLVptr>>BLV.startOfStatics)*2 let leader = vec 255 ReadLeaderPage(exec,leader) SetFilePos(exec,0,dataPos) let old = Gets(exec) Closes(exec) if old eq @lvData then return exec = OpenFile(0,ksTypeReadWrite,wordItem,0,lv ExecCFA>>CFA.fp) SetFilePos(exec,0,dataPos) Puts(exec,@lvData) WriteLeaderPage(exec,leader) Closes(exec) ] and SetNetNumber(n) be [ if NetNumber eq n then return NetNumber = n ShowDiskInfo(DiskInfo) if NetNumber eq 0 then return RememberData(lv NetNumber) ] and ShowDiskInfo(Stream) be [ let space = BitWidth(Stream,$*S) WriteChars(FORMATN( "*n--- OS Version <D>/<D> --- Alto <OCT>#<OCT># --- *300<S>*301 --- *300", OsVersion, OsVersionCompatible, NetNumber, SerialNumberŹ, UserName), 0, Stream) until FitsThisLine(Stream,DiskName,space) do [ let len = DiskName>>STRING.length if len eq 0 then break DiskName>>STRING.length = len-1 ] WriteChars(FORMATN("<S>*301 ", DiskName), 0, Stream) while FitsThisLine(Stream, $-) do Puts(Stream, $-) ] // the following code must sit around all the time in case // someone "asynchronously" calls it. and UserReadOverlay(od) = valof [ let ReleaseIt(od) be [ unless ReleaseOverlay(od, true) do CallSwat("Executive overlay problems") ] LockPendingCode() GeneratePresentOverlays(ReleaseIt) ReadOverlay(OverlayFirstPn(od), OverlayArea, OverlayNpages(od)) resultis OverlayArea ] and ExecSysErr(p1, errCode, p2, p3, p4, p5, p6, p7, p8, p9, p10; numargs na) = valof [ // One should probably check the error code // here, but at least two codes were found which resulted // from disk not ready (1101 and 1503) and there // might well be more. if (@DiskStatus() ne 0 // current disk not rdy then EtherBoot(0) @lvSysErr = OldSysErr let Result = CallWithNArgs(lv OldSysErr, na, p1, errCode, p2, p3, p4, p5, p6, p7, p8, p9, p10) @lvSysErr = ExecSysErr resultis Result ] and InCaseOfDemise(FinishCode) be [ @lvSysErr = OldSysErr @lvUserFinishProc = OldUserFinishProc SetKeyboardProc() Closes(USERSTR) Closes(DiskInfo) Closes(TIMESTR1) Closes(TIMESTR2) ShowDisplayStream(SpaceAbove,DSdelete) ShowDisplayStream(SpaceBelow,DSdelete) while @lvUserFinishProc ne 0 do [ let FinishProc = @lvUserFinishProc @lvUserFinishProc = 0 FinishProc(FinishCode) ] ] and SwappedOut() be [ CallSwat("Executive overlay error. OK to proceed.") MiniExec() ] and STORAGEGONE(X1, X2, X3, X4) be [ Wss(dsp, "*NFree storage gone (sometimes caused by ill-formed directory)!") if RemCm ne 0 then [ Resets(RemCm) TruncateDiskStream(RemCm) Closes(RemCm) RemCm = 0 ] MiniExec() ] and MiniExec() be [ Wss(dsp, "*NEmergency Exec -- Type subsystem name: ") let UPS = vec 300 ReadString(UPS) let SubSysName = vec 129 EvalParam(UPS, $P, 0, SubSysName) Wss(dsp, "*NType command line: ") ReadString(UPS) let ComCm = OpenFile("Com.Cm", ksTypeWriteOnly, charItem) for i=1 to UPS!0 do Puts(ComCm, UPS!i) Puts(ComCm, $*N) Closes(ComCm) let SubSys = OpenFile(SubSysName, ksTypeReadOnly, wordItem) userParamsVec!0 = 0 (@lvUserFinishProc)(0) CallSubsys(SubSys, false, false, userParamsVec) ]