// PressInstall.bcpl // last modified by Ramshaw, November 29, 1983 10:18 AM // - Add RavenPowerOnFlag as InstallPrompt #28. // - PressInstall, put query for landscape mode (back?) in Versatec install - 4/6/81 // - PressInstall, have 15 extended rectangle BESizes - 10/15 // - SLOTScanLength and printerMaxBitsPerScan, make unsigned - 10/13 // - ResolutionB, ResolutionS, 1X instead of 10X - 10/13/80 // errors 250 // // PRESS INSTALLATION // //last InstallPrompt index used: 28 get "PressInternals.df" get "PressParams.df" get "AltoFileSys.d" get "Disks.d" get "Streams.d" get "SysDefs.d" get "BcplFiles.D" // outgoing procedures external [ PressInstall ] // outgoing statics external [ tridentVec ] static [ tridentVec ] // incoming procedures external [ //PRESSINITUTILS GetFileName GetFileStatic IndexFile SetupDrive1 CloseDrive1 //PRESS PressError //PRESSML 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 //SCAN 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 PaperSpeedInches printerDevice RavenPowerOnFlag printerForward portrait ResolutionS ResolutionB PaperDimensionS PaperDimensionB VersatecMsSl VersatecFF printerMaxBitsPerScan nPrinterColors DPzero BESizes DoFileMeter DoFaultMeter DoMeter Debug SoftScan //true if no ORbit use blockBitsFile UseMicroCode DoEtherReport OverlayTable OverlayReloc sysDisk PressZone ScreenModulus ScreenMagnitude ScreenAngle SLOTScanLength ScanLengthInches SLOTBitMarginAdjust SLOTScanMarginAdjust SLOTDouble SLOTTimeOut ] // 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 PressInstall(cfa, hintState) be [ Zero(hintState, lFP) let st=OpenFile("Press.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 file transfer",1) DoFaultMeter=InstallPrompt(" Meter each character fault",2) UseMicroCode=InstallPrompt(" Normally use microcode",3) DoEtherReport=InstallPrompt(" Log statistics on MAXC",4) SaveStatic(st, lv DoMeter) SaveStatic(st, lv DoFileMeter) SaveStatic(st, lv DoFaultMeter) SaveStatic(st, lv UseMicroCode) SaveStatic(st, lv DoEtherReport) // Set output device stuff. Printer codes are defined in PressInternals.df printerDevice=InstallPrompt("Printer parameters:*n Output device (Dover,Sequoia,Pimlico,Penguin,Puffin,Durango,Slot,Versatec,Hg)",5,3) if printerDevice eq printerSlot then RavenPowerOnFlag=InstallPrompt(" Is Slot really a Raven", 28) ResolutionB = InstallPrompt(" Resolution in bits/inch", 6, 1); ResolutionS = InstallPrompt(" Resolution in scans/inch", 7, 1); printerForward=true portrait=true blockBitsFile=false printerMaxBitsPerScan=10000 SoftScan=printerDevice ge printerDurango //true if no ORbit SaveStatic(st,lv SoftScan) nPrinterColors=1 switchon printerDevice into [ case printerPimlico: case printerSequoia: case printerDover: case printerPuffin: PaperSpeedInches=InstallPrompt(" Paper speed (inches/second)",26,2) case printerSlot: [ if (printerDevice eq printerPimlico)% (printerDevice eq printerPuffin)% (printerDevice eq printerSlot) do nPrinterColors=InstallPrompt(" Number of printer colors",27,1) blockBitsFile=true printerForward=InstallPrompt(" Does the first page printed emerge at the top of a stack",8) portrait=InstallPrompt(" Does the Slot run in portrait mode",9) SLOTScanLength=InstallPrompt(" Scan line length in bits (for Slot)",10,1) if SLOTScanLength eq 0 then // overflowed? [ FLDI(2, #77777); FSB(1,2); SLOTScanLength = FTR(1); if SLOTScanLength eq 0 then PressError(254); // too long! SLOTScanLength = SLOTScanLength + #77777; ] printerMaxBitsPerScan=SLOTScanLength SLOTScanMarginAdjust=InstallPrompt(" Scan margin adjustment",11,1) SLOTBitMarginAdjust=InstallPrompt(" Bit margin adjustment",12,1) if printerDevice ne printerSlot then endcase SLOTDouble=InstallPrompt(" Do you want scan-lines doubled",13) SLOTTimeOut=InstallPrompt(" How many seconds before timing out printer (10 secs suggested)",25,1) endcase ] case printerVersatec: [ portrait=InstallPrompt(" Should top of Press page emerge first (as opposed to left edge)",9) printerMaxBitsPerScan=InstallPrompt(" Total number of bits per scan-line",22,1) let ffBefore=InstallPrompt(" Number of form-feeds prior to printing",23,1) let ffAfter=InstallPrompt(" Number of form-feeds after printing",24,1) VersatecFF=256*ffBefore+ffAfter endcase ] ] SaveStatic(st, lv nPrinterColors) SaveStatic(st, lv PaperSpeedInches) SaveStatic(st, lv printerDevice) SaveStatic(st, lv RavenPowerOnFlag) SaveStatic(st, lv ResolutionB) SaveStatic(st, lv ResolutionS) SaveStatic(st, lv printerForward) SaveStatic(st, lv portrait) SaveStatic(st, lv SLOTScanLength) SaveStatic(st, lv SLOTScanMarginAdjust) SaveStatic(st, lv SLOTBitMarginAdjust) SaveStatic(st, lv SLOTDouble) SaveStatic(st, lv SLOTTimeOut) SaveStatic(st, lv VersatecMsSl) SaveStatic(st, lv VersatecFF) SaveStatic(st, lv blockBitsFile) SaveStatic(st, lv printerMaxBitsPerScan) //Paper sizes. Will have to exchange if portrait mode. PaperDimensionB=InstallPrompt("Paper parameters:*n Long dimension",14,2) PaperDimensionS=InstallPrompt(" Short dimension",15,2) if portrait then [ let t=PaperDimensionB; PaperDimensionB=PaperDimensionS; PaperDimensionS=t ] ScanLengthInches = MulDiv(SLOTScanLength, 10, ResolutionB); SaveStatic(st, lv PaperDimensionB) SaveStatic(st, lv PaperDimensionS) SaveStatic(st, lv ScanLengthInches) //Halftone parameters ScreenModulus= InstallPrompt("Halftone parameters:*n Screen frequency <lines per inch>",16,1) ScreenMagnitude=InstallPrompt(" Screen amplitude <% of dynamic range>",17,1) ScreenAngle=InstallPrompt(" Screen angle",18,1) SaveStatic(st, lv ScreenModulus) SaveStatic(st, lv ScreenMagnitude) SaveStatic(st, lv ScreenAngle) //See what disks he wants: let z=vec 3000 PressZone=InitializeZone(z, 3000) let tv=vec 8*3;tridentVec=tv Zero(tridentVec,8*3) 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(PressZone) let noTrident=true for t=0 to 8*3-1 do [ tridentVec!t= TFSInit(PressZone,true,(2-(t rem 3))*#400 + (7-(t/3)),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",21) 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 7 do [ let len=IndexFile(p, f, GetFileName(f)) if len eq 0 then PressError(250) let a=GetFileStatic(f) if a eq lv BitsFile then //test for T80 or T300 [ let disk=p>>F.Device if disk ge 2 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 8*3-1 do if tridentVec!t ne 0 then TFSClose(tridentVec!t,true) //Set up table that gives sizes of all BE entries: BESizes=p BESizes!BESyncH=size BESync/16 BESizes!BECopyH=size BECopy/16 BESizes!BERectangleH=size BERectangle/16 BESizes!BELineH=size BELine/16 BESizes!BESplineH=size BESpline/16 BESizes!BEEndObjectH=size BEEndObject/16 BESizes!BEDotsH=size BEDots/16 BESizes!BEEndH=size BEEnd/16 for i = BEExtendedRectangleH to BELastRectangleH do BESizes!i = size BERectangle / 16; SaveStatic(st, lv BESizes, BEMaxH+1) //Now go down the Press.Run file and find all the overlays (page numbers) let ovTab=vec 20 let ovNum=0 let s=OpenFile("Press.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 PressError(251) ovTab!ovNum=pn ovNum=ovNum+1 pn=pn+(v!4 + 255)/256 ] repeat OverlayTable=ovTab SaveStatic(st, lv OverlayTable, ovNum) //Now ramble down Press.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 number // 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 printerDurango: "Durango" case printerSlot: "Slot" case printerVersatec: "Versatec" case printerHg: "Hg" ] if n eq 2 then type=0 if defaultIndex ge nDefaults then PressError(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) res=(FTR(1)+1)/2 //Round ] 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) ]