// PrintOrbitInit.bcpl // last modified by Butterfield, October 13, 1980 3:49 PM // - ResolutionB, ResolutionS, 1X instead of 10X - 10/13/80 // errors 1100 // get "Orbit.D" get "PressInternals.DF" get "PressParams.DF" // outgoing procedures external [ OrbitInit ] // outgoing statics //external // [ // ] //static // [ // ] // incoming procedures external [ PressError //FLOAT FLDI FTR; FCM; FLD; FML; FDV //PRESSML MulDiv //OS Zero MoveBlock StartIO CallSwat ] //outgoing statics external [ nLeadingBands nVisibleBands nTrailingBands FA PaperSpeedInches ScanLengthInches BitClock BitScale MotorSpeed MotorScale LineSyncDelay PageSyncDelay VideoGate Tadapter ] static [ nLeadingBands nVisibleBands nTrailingBands FA=0 //set to zero so non-orbit devices will do CoordsConvert correctly PaperSpeedInches ScanLengthInches BitClock BitScale MotorSpeed MotorScale LineSyncDelay PageSyncDelay VideoGate Tadapter ] // incoming statics external [ ResolutionS ResolutionB PaperDimensionB PaperDimensionS SLOTScanMarginAdjust SLOTBitMarginAdjust signalBand Debug printerDevice ] // internal statics // File-wide structure and manifest declarations. manifest RTC=430b // Procedures // PrintInit // directive=0 ... standard // directive=1 ... power on // directive=2 ... power off let OrbitInit(directive) be [ //TEST:first reset statics appropriately for "Spruce-style" values signalBand=8588 if printerDevice eq printerPuffin then PaperDimensionS=PaperDimensionS*2 //scan line doubling //compute information for image-generation (nVisibleBands,FA) let nBitsPerScan = MulDiv(ResolutionB, PaperDimensionB, 10); nBitsPerScan=(nBitsPerScan+63)&(-64) //make multiple of 64 if nBitsPerScan gr 4096 then nBitsPerScan=4096 //condition report needed.... FA=(4096-nBitsPerScan)/16 let nScanLines = MulDiv(ResolutionS, PaperDimensionS, 10); nVisibleBands=(nScanLines+BANDWidth-1)/BANDWidth // Parameters of printer mentioned in Orbit writeup: // Paper speed: PaperSpeedInches (inches/second * 10) // Duty cycle: d (percent) // ScanLength: ScanLengthInches (inches*10) // Facets: f // (Code assumes 24 clocks/polygon revolution) let d,f,r=nil,nil,nil let t = selecton printerDevice into //d;f;r [ case printerDover: table [ 90; 32; 24 ] case printerDurango: table [ 95; 32; 12 ] case printerSequoia: table [ 90; 36; 24 ] case printerPuffin: table [ 99; 22; 24 ] case printerPimlico: table [ 87; 12; 24 ] default: valof [ CallSwat("Impossible") ] ] MoveBlock(lv d, t, 3) let printerSimple = printerDevice eq printerSequoia // Decide which adapter we are using: Tadapter=true if printerDevice eq printerDurango then Tadapter=false // Parameters of the adapter mentioned in the writeup. // bcMax: MHz // crystalClock: 250 or 125 (units of 100 KHz) let bcMax,crystalClock=20,125 unless Tadapter then bcMax,crystalClock=60,250 // Parameters relating to choice of band position on page: nLeadingBands=selecton printerDevice into [ case printerDurango: 0 default: 4 ] nTrailingBands=selecton printerDevice into [ case printerDurango: 0 case printerPuffin: (384+192)/16+2 default: 2 ] // Now do some calculations: FLDI(1, ResolutionS); FLDI(2, 10); FML(1, 2); FLDI(2, PaperSpeedInches) FML(1, 2) FLDI(2, f) FDV(1, 2) Op10(1, -2) //AC1=MotorRPS FLDI(2, crystalClock) Op10(2, 5) FDV(2, 1) FLDI(3, r*256) //r * 2**8 FDV(2, 3) //AC2= (4096-MotorSpeed)/Scale(MotorScale) MotorScale=7 [ FLDI(3, 1 lshift MotorScale) FML(3, 2) FLDI(4, 4096) if FCM(3, 4) ls 0 then break MotorScale=MotorScale-1 ] repeat MotorSpeed=4096-FTR(3) //BitClock calculation FLDI(3, ResolutionB); FLDI(2, 10); FML(3, 2); FLDI(2, ScanLengthInches) FML(2, 3) //AC2 = Bh*100 FLD(3, 2) FLDI(4, 4) FDV(3, 4) Op10(3, -2) BitClock=4096-FTR(3) //Now for BitRate (in MHz) FLDI(3, d) FDV(2, 3) FML(2, 1) FLDI(3, f) FML(2, 3) Op10(2, -6) //AC2 = BitRate (MHz) FLDI(3, 10); FML(3, 2) if FTR(3) gr 230 then CallSwat("SpruceCondition(1100,ECFileTerminate)") BitScale=7 [ FLDI(3, 1 lshift BitScale) FLDI(4, bcMax) FML(3, 4) FDV(3, 2) let a=FTR(3) if a ls 256 then break BitScale=BitScale-1 ] repeat LineSyncDelay=4096-SLOTBitMarginAdjust/4 PageSyncDelay=4096-SLOTScanMarginAdjust/4 let nBands=nVisibleBands+nLeadingBands+nTrailingBands VideoGate=4096-(nBands*4) // Widen the gate a bit if printerDevice ge printerPimlicoAlt then VideoGate = VideoGate-2 // Now calculate, for Dover, the band number in which CountH // should be tested and/or StartPrint for next page sent. First, find // number of scan-lines in 900 ms. (Note that on Dover now, this // is a VERY PRECISE NUMBER, even though it doesn't look it. As // nearly as I can tell, CountH is on for less than 20 ms.) if printerDevice eq printerDover then [ FLDI(1, PaperSpeedInches) FLDI(2, 90); FML(1, 2); FLDI(2, 1000); FDV(1, 2); //Inches in 900 ms. FLDI(2, ResolutionS) FML(1, 2) //Scan-lines in 920ms. let sl=FTR(1) sl=sl-4*(4096-PageSyncDelay) //sl now relative to bands sl=(nBands-sl/16) if sl ls 0 then [ CallSwat("SpruceCondition(1101, ECFileTerminate)"); sl=0 ] signalBand=sl ] // Calculate, for Sequoia, the band number in which to issue // StartPrint (or StopPrint) for the next page if printerSimple then [ signalBand=(3*nBands)/4 ] // Do power-up and down stuff if necessary: if directive ne 0 & printerDevice eq printerDurango then Durango(directive) ] and Durango(directive) be [ let OnTable=table [ //Power up sequence #00000; 10; //adapter buffer reset #47760; 10; //line sync delay #57750; 100; //page sync delay #74000; 100; //turn on polygon #76000; 100; //A/O modulator on #77000; 100; //HeCd laser #77400; 100; //HeNe laser #77600; 100; //PMT #77640; 100; //Fans #77650; 100; //Motor Out #77651; 1000; //turn on 9200 #77650; 10; //turn off the on relay #63004; 10; //reset controller #61002; 10; //9200 full sorter // Enter Dipole mode #63004; 10; //reset controller #61004; 10; //set dipole mode #63020; 100; //clear all #63440; 100; //push aux tray button #63400; 10; //release aux tray button #63420; 100; //push sorter sets button #63400; 10; //release sorter sets button #77660; 8000; //Mirror motor in -1; //terminate ] let OffTable=table [ // Enter copy mode #00000; 10; //buffer reset #77650; 8000; //retract mirror motor #63004; 10; //reset controller #63020; 10; //clear all #61002; 10; //9200 full sorter // Power down Durango #70010; 10; #63600; 10; -1; ] ChangeState((directive eq 1? OnTable, OffTable)) ] and ChangeState(tab) be [ if tab!0 eq -1 then break AdCommand(tab!0) let done=@RTC+MulDiv(tab!1, 27, 1000) while (@RTC-done) le 0 do loop tab=tab+2 ] repeat and AdCommand(x) be IFunc(fROSCommand, x) and IFunc(f, x) be [ if Debug then return let tab=vec 10 tab=(tab+1)&(-2) tab!0=f tab!1=x // Get microcode to see command: @#720=tab StartIO(#4) // Wait for microcode to complete while @#720 ne 0 do loop ] and Op10(ac, n) be [ FLDI(0, 10) test n ge 0 then for i=1 to n do FML(ac, 0) or for i=1 to -n do FDV(ac, 0) ] // DCS, September 19, 1977 11:25 PM, add printerPimlico and printerPimlicoAlt // September 22, 1977 10:32 AM, correct Pimlico parameters // September 30, 1977 9:39 PM, Widen Video Gate (for Pimlico) // October 28, 1977 8:34 AM, Pimlico // JTM, May 1, 1979 9:48 AM,Puffin