<> <> <> <> <> <> <> <> <> <<>> DIRECTORY PrincOps USING [wordsPerPage], VM USING [Interval]; RavenFace: DEFINITIONS = BEGIN MaxBands:CARDINAL = 8; BandBufferCount: TYPE = CARDINAL (FIRST[CARDINAL]..MaxBands]; Index: TYPE [1]; BandPointer: TYPE = LONG POINTER; ResolutionPair: TYPE = ARRAY {fast, slow} OF CARDINAL; resolution: READONLY ResolutionPair; SizePair: TYPE = ARRAY {fast, slow} OF CARDINAL; size: READONLY SizePair; <> DozeOff: PROC; WakeUp: PROC; <> AllocateBands: PROC [bandVM: VM.Interval, nBands: (0..MaxBands], sizeEachBand: CARDINAL]; <> <> <> <> <> InitializeCleanUp: PROC; SetInterruptMasks: PROC [control, status, data: WORD]; DeallocateBands: PROC; <> ConsoleCharacter: TYPE = MACHINE DEPENDENT{ (0), F(57B), zero(60B), one, two, three, four, five, six, seven, eight(70B), nine, A, L, C, D, E, blank(77B)}; Display: PROC [char: ConsoleCharacter]; <> PaperSource: TYPE = MACHINE DEPENDENT{bottom(0), top(1)}; PaperStacking: TYPE = MACHINE DEPENDENT{aligned(0), offset(1)}; Feed: PROC [paperSource: PaperSource, paperStacking: PaperStacking]; <> PrinterStatus: TYPE = MACHINE DEPENDENT{ noStatus(0B), key0(60B), key1(61B), key2(62B), key3(63B), key4(64B), key5(65B), key6(66B), key7(67B), key8(70B), key9(71B), keyClear(72B), keyTest(73B), keyOnLine(74B), keyOffLine(75B), (76B), (77B), warming(100B), standBy(101B), feederFault(102B), registrationJam(104B), fuserJam(105B), noExit(106B), interlockOpen(110B), fuserCold(111B), feeding(112B), readyToFeed(113B), displayAcknowledge(114B), parityError(115B), illegalCharacter(116B), illegalSequence(117B), (120B), noPaper(121B), pageSync(122B), pageAtOutputTray(123B), tonerLow(124B), goingOffLine(125B), offLine(126B), onLine(127B), outputTrayFull(130B), aboutToDozeOff(131B), (174B), statusError(176B), statusOverRun(177B)}; SolicitStatus: PROC RETURNS [status: PrinterStatus]; ReadStatus: PROC RETURNS [status: PrinterStatus]; <> <> <> <> <> <> SetScanLineLength: PROC [activeWordsEachScanline: (0..PrincOps.wordsPerPage]]; <> SetPageOffsets: PROC [linesFromLeft: CARDINAL, wordTabFromBottom: CARDINAL]; <> ResetBands: PROC RETURNS [firstBand: Index, firstBandAddress: BandPointer]; StartImage: PROC [firstBand: Index];-- start imaging BandOverrun: PROC RETURNS [BOOLEAN];-- imaging got ahead of filling. AdvanceBand: PROC [currentBand: Index] RETURNS [nextBand: Index, nextBandAddress: BandPointer]; <> <> BandFull: PROC [band: Index] RETURNS [bandBusy: BOOLEAN]; <> LastBand: PROC [Index];-- indicate last band is filled <> PutCommand: PROCEDURE [CARDINAL [0B..200B)]; END....