PDInterpOutputImpl.mesa
Michael Plass, March 1, 1984 10:46:13 am PST
DIRECTORY Environment, PDFileFormat, PDInterpBasic, PDInterpOutput, PDInterpBitmap, RavenSlotDriver, OthelloDefs, PDInterpSysCalls, Process, ProcessorFace;
PDInterpOutputImpl:
PROGRAM
IMPORTS PDInterpBitmap, RavenSlotDriver, PDInterpSysCalls, OthelloDefs -- , Process, ProcessorFace
EXPORTS PDInterpOutput
bitsPerWord: NAT = Environment.bitsPerWord;
currentHerald: PDFileFormat.Herald;
currentStartImage: PDFileFormat.StartImage;
currentBandNumber: NAT ← 0;
bandWords: INT ← 0;
band: PDInterpBitmap.BitmapDesc ← [sOrigin: 0, fOrigin: 0, sMin: 0, fMin: 0, sSize: 0, fSize: 0, pointer: NIL, rast: 0, lines: 0];
bandWordsAllocated:
INT ← 0;
CurrentBandDesc:
PROC
RETURNS [PDInterpBitmap.BitmapDesc] = {
band.sOrigin ← currentHerald.bandSSize*(currentBandNumber+currentStartImage.passBands);
PDInterpBitmap.Clear[band];
RETURN [band]
};
StartImage:
PUBLIC
PROC [herald: PDFileFormat.Herald, startImage: PDFileFormat.StartImage]
RETURNS [PDInterpBitmap.BitmapDesc] = {
rast: NAT = (startImage.fSizePage+bitsPerWord-1)/bitsPerWord;
lines: INT = herald.bandSSize;
words: INT = rast*lines;
currentHerald ← herald;
currentStartImage ← startImage;
currentBandNumber ← 0;
IF words > bandWordsAllocated
THEN {
IF band.pointer # NIL THEN PDInterpSysCalls.FreeSpace[band.pointer];
band.pointer ← PDInterpSysCalls.AllocateSpace[words];
bandWordsAllocated ← words;
};
band.sOrigin ← 0;
band.fOrigin ← startImage.fMinPage;
band.sMin ← 0;
band.fMin ← 0;
band.sSize ← herald.bandSSize;
band.fSize ← rast*bitsPerWord;
band.rast ← rast;
band.lines ← herald.bandSSize;
bandWords ← words;
RETURN [CurrentBandDesc[]]
};
EndBand:
PUBLIC
PROC
RETURNS [PDInterpBitmap.BitmapDesc] = {
RavenSlotDriver.HyperStore[
sourcePtr: band.pointer,
destOffset: bandWords*currentBandNumber,
wordCount: bandWords
];
currentBandNumber ← currentBandNumber + 1;
RETURN [CurrentBandDesc[]]
};
EndImage:
PUBLIC
PROC = {
successCode: RavenSlotDriver.SuccessCode;
slowMargin: CARDINAL ← currentHerald.bandSSize*currentStartImage.passBands;
fastMargin: CARDINAL ← band.fOrigin;
numberOfLines: CARDINAL ← currentHerald.bandSSize*currentStartImage.nBands;
scanLineLength: CARDINAL ← band.fSize;
FOR copyNum:
CARDINAL
IN [0..currentHerald.copies)
DO
DO
s:RavenSlotDriver.PrinterStatus;
successCode ← RavenSlotDriver.PrintPage[
slowMargin: slowMargin,
fastMargin: fastMargin,
numberOfLines: numberOfLines,
scanLineLength: scanLineLength,
paperSource: top,
paperStacking: aligned
];
SELECT successCode
FROM
warning => EXIT;
error => {
WHILE (s←RavenSlotDriver.GetStatus[])#standBy
DO
RavenSlotDriver.DisplayBadStatusInMP[s];
SELECT s
FROM
registrationJam => OthelloDefs.WriteLine[" - Registration jam"];
fuserJam => OthelloDefs.WriteLine[" - Fuser jam"];
warming => OthelloDefs.WriteLine[" - Warming up"];
feederFault => OthelloDefs.WriteLine[" - Out of paper"];
interlockOpen => OthelloDefs.WriteLine[" - Door open"];
fuserCold => OthelloDefs.WriteLine[" - Fuser cold"];
parityError => OthelloDefs.WriteLine[" - Parity Error"];
offLine => OthelloDefs.WriteLine[" - Offline"];
ENDCASE => OthelloDefs.WriteLine[" - Can't feed page"];
ENDLOOP
};
ENDCASE => EXIT; -- ok
ENDLOOP;
ENDLOOP;
};
END.