// PupTestInit.bcpl // Copyright Xerox Corporation 1979, 1982 // Last modified February 15, 1982 5:18 PM by Boggs get "Pup0.decl" get "Pup1.decl" get "PupTest.decl" get "Streams.d" get "AltoDefs.d" external [ // outgoing procedures InitPupTest // incoming procedures CreateDisplayStream; ShowDisplayStream CharWidth; InvertLine; GetLinePos; SetBitPos MyFrame; Usc; LoadRam; InitBcplRuntime; StartIO; Zero PupChecksum; UPupChecksum; BlockEq; UBlockEq InitializeZone; AddToZone; Allocate; Idle InitPupLevel1; Enqueue; InitializeContext; Block DefaultOtherPupProc; OtherSpigot; InitStatServ BSPReceive; EFTPReceive; EchoServer; PupTestParams Command; RemoteControl; OtherSpigotProcess PutTemplate; Ws; Wss; Confirm // outgoing statics sendPort; tp; checkBuffer savedFinish; spigotQ; ctxQ; bootFlag spyBuffer; sysZone; dsp // incoming statics PupTestFinish; maxPupDataBytes lvUserFinishProc; sysFont; PupTestEIAMc; PupTestCPMc eiaMcLoaded; etherMcLoaded; cpMcLoaded ] manifest [ stkLim = #335 black = -1 white = 0 ] static [ lastShownStream; savedSwatCP spyBuffer; sysZone; dsp sendPort; tp; checkBuffer savedFinish; spigotQ; ctxQ; bootFlag ] structure Byte↑0,0 byte //---------------------------------------------------------------------------- let InitPupTest() be //---------------------------------------------------------------------------- [ bootFlag = PupTestParams eq 0 //hack...should be done in a cleaner way let versionText = "PupTest of February 15, 1982" let freeBegin = @stkLim @stkLim = MyFrame() -1000 let length = @stkLim - freeBegin let lenInit = length ls 0? #77777, length sysZone = InitializeZone(freeBegin, lenInit) freeBegin = freeBegin + lenInit length = length - lenInit if length gr 10 then AddToZone(sysZone, freeBegin, length) //This ugly patch of code discovers whether an EIA or ComProc // (or both) is present, and therefore what microcode to load. //If both are present, the user must choose one. //The boot version loads the EIA version to get the Extra Ether code. let eiaPresent, cpPresent = true, false unless bootFlag do [ @177700b = 140000b //@eiaControl = swi eiaPresent = @177704b ne 0 //read status for line = 0 to 15 do [ @(177300b + 4*line) = 1 if @(177300b + 4*line) eq 1 then [ cpPresent = true; break ] ] if cpPresent & eiaPresent then [ Ws("This machine has both an EIA and a ComProc.") Ws("*NI can use one or the other but not both.") test Confirm("*NShall I use the ComProc?") ifso eiaPresent = false ifnot cpPresent = false ] ] //Flip the Memory Refresh Task into the ram only if // this is an Alto II XM. //The boot locus vector is in ramImage!0. let ramImage = eiaPresent? PupTestEIAMc, PupTestCPMc structure Vers: [ eng bit 4; blank bit 12 ] if (table [ #61014; #1401 ])()<<Vers.eng ne 3 then ramImage!0 = ramImage!0 % 400b //Now load the microcode if LoadRam(ramImage, true) eq 0 then [ InitBcplRuntime() PupChecksum = UPupChecksum BlockEq = UBlockEq etherMcLoaded = 3 //two extra ethers, tasks 1 and 2 eiaMcLoaded = eiaPresent cpMcLoaded = cpPresent ] //Set up the display lastShownStream = MakeBar(white, 24) ShowDisplayStream(lastShownStream, DSalone) ShowDisplayStream(MakeBar(white, 1), DSbelow, lastShownStream) let lenDS = lDCB + 38*((sysFont!-2 +1) & -2) +1 let title = CreateDisplayStream(1,Allocate(sysZone,lenDS),lenDS,sysFont) Wss(title, versionText) SetBitPos(title, 450) PutTemplate(title, "Alto $UO#", StartIO(0) & #377) InvertLine(title, GetLinePos(title)) GCShowDisplayStream(MakeBar(black, 2)) GCShowDisplayStream(title) GCShowDisplayStream(MakeBar(black, 1)) dsp = CreateDisplayStream(20, Allocate(sysZone, 7000), 7000, sysFont) GCShowDisplayStream(dsp) GCShowDisplayStream(MakeBar(black, 1)) //more initialization! savedFinish = @lvUserFinishProc @lvUserFinishProc = PupTestFinish spyBuffer = Allocate(sysZone, 1000) sendPort = Allocate(sysZone, lenPort) ctxQ = Allocate(sysZone, 2); ctxQ!0 = 0 Idle = Block spigotQ = Allocate(sysZone, 2); spigotQ!0 = 0 DefaultOtherPupProc = OtherSpigot InitPupLevel1(sysZone, ctxQ, 0) InitStatServ(sysZone, ctxQ) unless bootFlag do PupTestParams() tp = Allocate(sysZone, lenTP) checkBuffer = Allocate(sysZone, (maxPupDataBytes+1)/2) for i = 0 to maxPupDataBytes-1 do checkBuffer>>Byte↑i = i Enqueue(ctxQ,InitializeContext(Allocate(sysZone, (alto? 400, 300)), (alto? 400, 300), Command)) Enqueue(ctxQ,InitializeContext(Allocate(sysZone, (alto? 200, 150)), (alto? 200, 150), RemoteControl)) Enqueue(ctxQ,InitializeContext(Allocate(sysZone, (alto? 200, 150)), (alto? 200, 150), EchoServer)) Enqueue(ctxQ,InitializeContext(Allocate(sysZone, (alto? 200, 100)), (alto? 200, 100), OtherSpigotProcess)) Enqueue(ctxQ,InitializeContext(Allocate(sysZone, (alto? 400, 300)), (alto? 400, 300), BSPReceive)) Enqueue(ctxQ,InitializeContext(Allocate(sysZone, (alto? 400, 300)), (alto? 400, 300), EFTPReceive)) ] //--------------------------------------------------------------------------- and GCShowDisplayStream(st) be //--------------------------------------------------------------------------- [ ShowDisplayStream(st, DSbelow, lastShownStream) lastShownStream = st ] //--------------------------------------------------------------------------- and MakeBar(background, nLines) = valof //--------------------------------------------------------------------------- [ structure Bar: [ fdcb word; ldcb word; @DCB ] manifest lenBar = size Bar/16 let bar = Allocate(sysZone, lenBar, false, true) Zero(bar, lenBar) bar>>Bar.fdcb = lv bar>>Bar.next bar>>Bar.ldcb = lv bar>>Bar.next bar>>Bar.background = background bar>>Bar.width = 0 bar>>Bar.height = nLines resultis bar ]