//RunMesa.bcpl - BCPL setup for Mesa Emulator - R. Johnsson //last modified by Johnsson: September 30, 1980 12:22 PM //Bldr RunMesa/S RunMesa Run Template MBoot Mesa-Nova1 Mesa-Nova2 MesaImage XMesaImage XMesaOverflow Configuration ReadPram GP TimeConvA TimeConvB TimeIO //files MesaImage and later may not be used after FindSpace() [in Run] //incompatible microcode with version 15a; February 3, 1977 //ROM compatible microcode with version 16a; February 18, 1977 //incompatible microcode with version 18a; May 18, 1977 //incompatible microcode with version 19a; May 27, 1977 //new version numbering at 23.3 //check file format at version 29; March 1978 //support Alto XM; July 27, 1978 //major reorganization at 32.0; November 1978 //merge Mesa and XMesa microcode; support 3K RAM; November 1979 manifest [ MajorVersion = 35; MinorVersion = 9 ] manifest [ ImageVersionID = 01040 ] manifest [ printversion = true ] get "SysDefs.d" get "Streams.d" get "AltoFileSys.d" get "RunMesa.d" external [ SetupReadParam; ReadParam ] //gp external [ ReadPackedRAM; LoadPackedRAM ] //readpram external [ PutTemplate ] //template external [ UNPACKDT; WRITEUDT ] //ctime let RunMesa(layout,up,cfa) be [Mesa let imageStream = 0 until up!0 eq 0 do [ if up>>UPE.type eq openStreams then imageStream = up!1 if up>>UPE.type eq mesaMemoryMask then memoryBanks = up!1 up = up + up>>UPE.length ] DetermineConfiguration() if printversion then WriteVersion() let giveImageVersion = false if imageStream eq 0 then imageStream = SetupParams(lv giveImageVersion) let header = vec lImagePrefix-1 ReadBlock(imageStream,header,lImagePrefix) if giveImageVersion then [ WriteStamp(lv header>>ImagePrefix.version) Ws(", creator ") WriteStamp(lv header>>ImagePrefix.creator) KeyboardWait() ] if header>>ImagePrefix.versionident ne ImageVersionID then AbortMsg("*NIncorrect image file format.") let imageCfa = vec lCFA-1 GetCompleteFa(imageStream, imageCfa) if header>>ImagePrefix.type eq checkfile & header>>ImagePrefix.leaderDA ne imageCfa>>CFA.fp.leaderVirtualDa then AbortMsg("*NThis CheckPoint file has been tampered with.") LoadInternalMicrocode() Run(imageStream,header) ]Mesa and SetupParams(lvVersionSwitch) = valof [ let iFileName = vec 20; iFileName!0 = 0 //Get switches from command line let argument=vec 100 let switches=vec 100 let bootfile = false let comcm = OpenFile("Com.Cm", ksTypeReadOnly, charItem, verLatest, fpComCm); SetupReadParam(argument,switches,comcm,switches) let done = false let usename = false test ImageFile(argument) ifso usename=true ifnot if (switches!0 ne 0) then for I=1 to switches!0 do [GlobalSwitchLoop switchon (switches!I) & #137 into [SwitchCases case $V: // print version info [V if not printversion then WriteVersion() @lvVersionSwitch = true endcase ]V case $M: // load microcode only [M test LoadInternalMicrocode() ifso [ Ws( "*NMicrocode loaded"); finish ] ifnot AbortMsg("*NCan't load microcode") endcase ]M case $S: // go into Swat before starting image [S @SwatFlag=#77400 endcase ]S case $Q: case $G: // end of commands [C done=true endcase ]C case $B: [B bootfile=true endcase ]B default: [Huh Ws("*NBad switch encountered. ") endcase ]Huh ]SwitchCases ]GlobalSwitchLoop let rewritecomcm = not usename // read the parameters test usename ifso AppendString(iFileName,argument) ifnot until done do [paramloop let p = ReadParam($P,0,0,0,true) if (p eq 0)%(p eq -1) then break test switches!0 eq 0 ifso if iFileName!0 eq 0 then [ AppendString(iFileName,p); break ] ifnot [localswitches for I=1 to switches!0 do switchon (switches!I) & #137 into [ case $C: // end of commands [ if iFileName!0 eq 0 then AppendString(iFileName,p); done = true; endcase ] case $I: // image file name [ AppendString(iFileName,p); endcase ] case $M: // microcode (pram) file [ let c = nil test I ls switches!0 ifso [ c = switches!(I+1); I=I+1 ] ifnot c = $0 if c ge $0 & c le $2 then LoadRamBank(p, c-$0) endcase ] case $B: // restrict banks (bit mask) [ RestrictMemoryBanks(Octal(p)); endcase ] case $X: // restrict banks (bank numbers) [ RestrictMemoryBanks(BankMask(p)); endcase ] default: [ PutTemplate(dsp, "*NBad switch '$C', item will be ignored.", switches!I) KeyboardWait() ] ] ]localswitches ]paramloop if bootfile then [ DefaultName(iFileName,"MESA","SV") LoadInternalMicrocode() let message = vec lInLdMessage let fp = vec lFP let cfa = vec lCFA let file = OpenFile(iFileName,ksTypeReadOnly,wordItem) if file eq 0 then [ PutTemplate(dsp,"*NFile '$S' not found.",iFileName) AbortMsg() ] GetCompleteFa(file,cfa); MoveBlock(fp, lv cfa>>CFA.fp, lFP) let realda = 0 RealDiskDA(sysDisk, cfa>>CFA.fa.da, lv realda) fp>>FP.leaderVirtualDa = realda message!1 = #377 // level = -1, reason = proceed InLd(fp,message) ] DefaultName(iFileName,"Mesa","image") // maybe rewrite comcm here test rewritecomcm ifso [ let newcomcm = OpenFile("Com.Cm", ksTypeWriteOnly, charItem, verLatest, fpComCm) for i=1 to iFileName>>STRING.length do Puts(newcomcm,iFileName>>STRING.char^i) test Endofs(comcm) ifso Puts(newcomcm,$*N) ifnot Puts(newcomcm,$*S) until Endofs(comcm) do Puts(newcomcm,Gets(comcm)); Closes(comcm); Closes(newcomcm); ] ifnot Closes(comcm) let image=OpenFile(iFileName,ksTypeReadOnly) if image eq 0 then [ PutTemplate(dsp,"*NImage file '$S' not found.",iFileName) AbortMsg() ] resultis image ] // end SetupParams and ImageFile(name) = valof [ let cap(c) = ((c ge $a) & (c le $z)) ? c+$A-$a, c let s = vec 40 s>>STRING.length = name!0 for i = 1 to s>>STRING.length do s>>STRING.char^i = name!i MoveBlock(name,s,name!0) s=".IMAGE" let ofs = name>>STRING.length-s>>STRING.length if ofs ls 0 then resultis false for i = 1 to s>>STRING.length do if cap(name>>STRING.char^(ofs+i)) ne s>>STRING.char^i then resultis false resultis true ] and Octal(s) = valof [Octal // s is octal bit mask of banks to be ignored let n = 0 for i = 1 to s>>STRING.length do n = 8*n + (s>>STRING.char^i-$0) resultis n ]Octal and BankMask(s) = valof [BankMask // s is string of bank numbers (sep by ,) to be ignored let n = 0 let mask = 0 for i = 1 to s>>STRING.length do [ let c = s>>STRING.char^i test c ge $0 & c le $9 ifso n = n*10 + c-$0 ifnot [ mask = mask % (100000b rshift n); n = 0 ] ] mask = mask % (100000b rshift n) resultis (not mask) ]BankMask and RestrictMemoryBanks(mask) be [RestrictMemoryBanks HardwareConfiguration>>HardwareInfo.banks = HardwareConfiguration>>HardwareInfo.banks & mask if HardwareConfiguration>>HardwareInfo.banks eq 100000b then HardwareConfiguration>>HardwareInfo.useXM = false ]RestrictMemoryBanks and LoadRamBank(name, bank) be [LoadRamBank DefaultName(name, "Mesa", "pram") let mFile=OpenFile(name,ksTypeReadOnly,wordItem) if mFile eq 0 then [ PutTemplate(dsp,"*N$S not found.",name) AbortMsg() ] let ramver = 0 let trouble=ReadPackedRAM(mFile, lv ramver, bank) PutTemplate(dsp,"$S loaded in bank $D; version = $D*N", name, bank, ramver) if trouble ne 0 then KeyboardWait() microcodeLoaded = microcodeLoaded % (1 lshift bank) ]LoadRamBank and DefaultName(name,defname,defext) be [DefaultName if name!0 eq 0 then [ AppendString(name,defname,".",defext) return ] for I=1 to name>>STRING.length do [ if name>>STRING.char^I eq $. then return ] AppendString(name,".",defext) ]DefaultName and AppendString(s,s1,s2,s3,s4,s5,s6,s7,s8,s9; numargs na) be [AppendString let p = lv s1 for i = 0 to na-2 do [ let t = p!i for k = 1 to t>>STRING.length do [ let l = s>>STRING.length+1 s>>STRING.length = l s>>STRING.char^l = t>>STRING.char^k ] ] ]AppendString and WriteVersion() be [WriteVersion PutTemplate(dsp,"*NRunMesa $D.$D, ", MajorVersion, MinorVersion) GiveMicrocodeVersion() if HardwareConfiguration>>HardwareInfo.ControlStore eq RAMandROM then PutTemplate(dsp,"; ROM1 microcode $D", HardwareConfiguration>>HardwareInfo.mesaMicrocodeVersion) if HardwareConfiguration>>HardwareInfo.ControlStore eq RAM3K then Ws("; 3K RAM") if HardwareConfiguration>>HardwareInfo.useXM then [ let m = 0 let b = memoryBanks until b eq 0 do [ if b ls 0 then m = m + 64; b = b lshift 1 ] PutTemplate(dsp,"; $DK memory", m) ] Puts(dsp,$*N) ]WriteVersion and WriteStamp(v) be [WriteStamp let uv = vec 6 let dv = vec 1 dv!0, dv!1 = v>>VersionStamp.time.high, v>>VersionStamp.time.low // reverse UNPACKDT(dv, uv) WRITEUDT(dsp,uv) PutTemplate(dsp," $O#$O#",v>>VersionStamp.net,v>>VersionStamp.host) ]WriteStamp