// PDInstall.bcpl -- PDPrint installation routines // derived from PressInstall.bcpl 2/7/83 // errors 250 //last InstallPrompt index used: 19 get "PDInternals.d" get "AltoFileSys.d" get "Disks.d" get "Streams.d" get "SysDefs.d" get "BcplFiles.D" // outgoing procedures external [ PDInstall ] // incoming procedures external [ //PDINSTALLUTILS IndexFile GetFileStatic SetupDrive1 CloseDrive1 //PDPRINT PDError //PDML DoubleAdd Ugt MulDiv //Used for initialization of files, etc. -- removed by Junta OpenFile DeleteFile Closes Gets Puts Endofs ReadBlock WriteBlock FileLength Resets PositionPage SetFilePos //WINDOW WindowInit WindowClose WindowWriteBlock //SCANSTRINGS TypeForm ReadNumber //FLOAT FLDI; FDV; FML; FTR; FAD; FSB; //ALLOC InitializeZone Allocate //OS MoveBlock Zero //TFS TFSInit TFSClose TFSCreateDDMgr TFSDiskModel ] // incoming statics external [ MeterFile BitsFile tridentUsed tridentVec printerDevice rosDevice nPrinterColors useStandardQueue ResolutionS ResolutionB PaperDimensionS PaperDimensionB PaperSpeedInches BitMarginAdjust ScanMarginAdjust VersatecFF SLOTScanLength SLOTDouble SLOTTimeOut DPzero BESizes DoFileMeter DoMeter Debug UseXM OverlayTable OverlayReloc sysDisk PDZone ] // internal statics static [ defaultVec ] // File-wide structure and manifest declarations. manifest nDefaults=40 //Only need change in this file!! structure STR[ length byte char↑1,255 byte ] // Procedures //---------------------------------------------------------------------------- let PDInstall(cfa, hintState) be //---------------------------------------------------------------------------- [ Zero(hintState, lFP) let st=OpenFile("PDPrint.State",0,0,0,hintState) hintState!lFP=@#430 //Get real time clock bits //First thing in the file is the "time stamp": Puts(st, hintState!lFP) //Second thing in the state file is a list of default values of various things, // up to nDefaults of them. Read into defaults vector: let defaults=vec nDefaults+1 Zero(defaults, nDefaults+1) defaultVec=defaults+1 //defaultVec!-1=true if defaults valid test Endofs(st) then [ Puts(st, nDefaults); WriteBlock(st, defaults, nDefaults) ] or [ Gets(st); ReadBlock(st, defaultVec, nDefaults); defaultVec!-1=true ] //Various statics DoMeter=InstallPrompt("General installation parameters:*n Record metering information",0) DoFileMeter=InstallPrompt(" Meter each page transfer",1) UseXM=InstallPrompt(" Normally use extended memory",2) SaveStatic(st, lv DoMeter) SaveStatic(st, lv DoFileMeter) SaveStatic(st, lv UseXM) // Set output device stuff. Printer codes are defined in PDInternals.df printerDevice=InstallPrompt("Printer parameters:*n Output device (Dover,Sequoia,Pimlico,Puffin,Slot,Versatec,Hg)",3,3) ResolutionB = InstallPrompt(" Resolution in bits/inch", 4, 1); ResolutionS = InstallPrompt(" Resolution in scans/inch", 5, 1); nPrinterColors=1 rosDevice=printerDevice if printerDevice le printerOrbitLast then PaperSpeedInches=InstallPrompt(" Paper speed (inches/second)",6,2) if (printerDevice eq printerPimlico)% (printerDevice eq printerPuffin)% (printerDevice eq printerSlot) do nPrinterColors=InstallPrompt(" Number of printer colors",7,1) if (printerDevice eq printerPimlico)% (printerDevice eq printerPuffin) then [ useStandardQueue=InstallPrompt(" Use standard n-color printing queue",8) if printerDevice eq printerPuffin & InstallPrompt(" Does the machine use a Pimlico ROS",9) then rosDevice=printerPimlico ] if printerDevice eq printerSlot % printerDevice le printerOrbitLast then [ SLOTScanLength=InstallPrompt(" Scan line length in bits (for bit clock)",10,1) ScanMarginAdjust=InstallPrompt(" Scan margin adjustment",11,1) BitMarginAdjust=InstallPrompt(" Bit margin adjustment",12,1) SLOTTimeOut=InstallPrompt(" How many seconds before timing out printer",13,1) if printerDevice eq printerSlot then SLOTDouble=InstallPrompt(" Do you want scan-lines doubled",14) ] if printerDevice eq printerVersatec then [ let ffBefore=InstallPrompt(" Number of form-feeds prior to printing",15,1) let ffAfter=InstallPrompt(" Number of form-feeds after printing",16,1) VersatecFF=256*ffBefore+ffAfter ] SaveStatic(st, lv printerDevice) SaveStatic(st, lv rosDevice) SaveStatic(st, lv nPrinterColors) SaveStatic(st, lv useStandardQueue) SaveStatic(st, lv PaperSpeedInches) SaveStatic(st, lv ResolutionB) SaveStatic(st, lv ResolutionS) SaveStatic(st, lv ScanMarginAdjust) SaveStatic(st, lv BitMarginAdjust) SaveStatic(st, lv SLOTScanLength) SaveStatic(st, lv SLOTDouble) SaveStatic(st, lv SLOTTimeOut) SaveStatic(st, lv VersatecFF) //Paper sizes. PaperDimensionB=InstallPrompt("Paper parameters:*n Scan dimension",17,2) PaperDimensionS=InstallPrompt(" Transport dimension",18,2) SaveStatic(st, lv PaperDimensionB) SaveStatic(st, lv PaperDimensionS) //See what disks he wants: let z=vec 3000 PDZone=InitializeZone(z, 3000) let tv=vec NTridentDrives*NPartitions;tridentVec=tv Zero(tridentVec,NTridentDrives*NPartitions) tridentUsed=InstallPrompt("Disk information:*n Do you want to use Trident disk(s)",19) if tridentUsed then [ //there are Trident drive nos 0-7, each with up to 3 file systems //allow user to grab any or all let ddmgr=TFSCreateDDMgr(PDZone) let noTrident=true for t=0 to NTridentDrives*NPartitions-1 do [ tridentVec!t= TFSInit(PDZone,true,(NPartitions-1-(t rem NPartitions))*#400 + (NTridentDrives-1-(t/NPartitions)),ddmgr) if tridentVec!t ne 0 then noTrident=false ] if noTrident then TypeForm("Cannot operate any Trident disk!*n") ] if InstallPrompt(" Do you want to use drive 1 of the Model 31",20) then if SetupDrive1() eq 0 then TypeForm("Cannot operate the second drive!*n") //Now initialize all the known files: let p=vec 3000 for f=0 to FILEInitMax do [ let len=IndexFile(p, f) if len eq 0 then PDError(250) let a=GetFileStatic(f) if a eq lv BitsFile then //test for T80 or T300 [ let disk=p>>F.Device if disk ge DISKT80 then tridentUsed = (TFSDiskModel(tridentVec!(disk-2)) eq 80)?5,19 //nHeads ] @a=p SaveStatic(st, a, len) if f eq FILEMeter then [ //Meter file needs initializing let a=WindowInit(MeterFile) WindowWriteBlock(a, (table [ 0;2 ] ),2) //Current length WindowClose(a) ] ] SaveStatic(st, lv tridentUsed) CloseDrive1() if tridentUsed then for t=0 to NTridentDrives*NPartitions-1 do if tridentVec!t ne 0 then TFSClose(tridentVec!t,true) //Now go down the PDPrint.Run file and find all the overlays (page numbers) let ovTab=vec 20 let ovNum=0 let s=OpenFile("PDPrint.Run", ksTypeReadWrite) let pn=cfa>>CFA.fa.pageNumber [ PositionPage(s, pn) if Endofs(s) then break let v=vec 15 ReadBlock(s, v, 16) if v!2 ne 1 % v!5 ne pn-1 then PDError(251) ovTab!ovNum=pn ovNum=ovNum+1 pn=pn+(v!4 + 255)/256 ] repeat OverlayTable=ovTab SaveStatic(st, lv OverlayTable, ovNum) //Now ramble down PDPrint.Run and plug in the hintState Resets(s) let v=vec (size BLV/16)+(size SV.H/16) ReadBlock(s, v, (size BLV/16)+(size SV.H/16)) let ns=(size BLV/16)+(size SV.H/16)+#300 ns=ns+v>>SV.BLV.endOfStatics-v>>SV.BLV.startOfStatics+1 ns=ns+hintState-v>>SV.BLV.startOfCode SetFilePos(s, 0, ns*2) WriteBlock(s, hintState, lFP+1) //Write in the magic fp. Closes(s) OverlayReloc=v>>SV.BLV.relPairTable SaveStatic(st, lv OverlayReloc) //Save sysDisk, because it will be Junta'ed away SaveStatic(st, lv sysDisk, (size DSK/16)+lKDHeader) //Any other state to be saved goes here..... Puts(st, 0) //Termination SetFilePos(st, 0, 1*2) Puts(st, nDefaults) WriteBlock(st, defaultVec, nDefaults) Closes(st) finish ] //InstallPrompt(string, defaultIndex, type) // type=0 (default) Yes/No // type=1 simple cardinal (up to 65,000) // type=2 number*10 // type=3 lookup a string and return its index //---------------------------------------------------------------------------- and InstallPrompt(str, defaultIndex, type; numargs n) = valof //---------------------------------------------------------------------------- [ let GetInstallString(i) = selecton i into [ case printerDover: "Dover" case printerSequoia: "Sequoia" case printerPimlico: "Pimlico" case printerPenguin: "Penguin" case printerPuffin: "Puffin" case printerSlot: "Slot" case printerVersatec: "Versatec" case printerHg: "Hg" ] if n eq 2 then type=0 if defaultIndex ge nDefaults then PDError(253) let defVal=defaultVec!defaultIndex TypeForm(str); if defaultVec!-1 then //Defaults valid [ TypeForm($(); switchon type into [ case 0: TypeForm((defVal? "Yes","No")) endcase case 1: TypeForm(10, defVal) endcase case 2: FLDI(1, defVal) FLDI(2,10); FDV(1,2) TypeForm(2,1) endcase case 3: TypeForm(GetInstallString(defVal)) ] TypeForm($)) ] let ans=vec 20 TypeForm((type eq 0? $?, $:),1,ans) if ans>>STR.length eq 0 then resultis defVal let res=nil switchon type into [ case 0: [ let c=ans>>STR.char↑1 res=( c eq $y % c eq $Y) endcase ] case 3: [ let match=nil [ for i=0 to 9 do [ let s=GetInstallString(i) match=true for j=1 to ans>>STR.length do [ if ((ans>>STR.char↑j xor s>>STR.char↑j)&(not #40)) ne 0 then match=false ] if match then [ res=i; break ] ] if match then break TypeForm("Invalid response, try again: ",1,ans) ] repeat endcase ] default: [ res=ReadNumber(ans) if type eq 2 then [ FLDI(2,20); FML(1,2); FLDI(2,1); FAD(1,2); FLDI(2,2); FDV(1,2) //Round res=FTR(1) ] endcase ] ] defaultVec!defaultIndex=res resultis res ] // State saving and restoring for static values (and vectors) //---------------------------------------------------------------------------- and SaveStatic(stream, staticAdr, len; numargs n) be //---------------------------------------------------------------------------- [ if n ne 3 then len=0 Puts(stream, staticAdr) Puts(stream, len) test len eq 0 then Puts(stream, staticAdr!0) or WriteBlock(stream, staticAdr!0, len) ]