-- PDInterpOutputPanasonicImpl.mesa
-- Copyright (C) 1984, Xerox Corporation. All rights reserved.
-- Michael Plass, 20-Sep-84 12:34:40
-- Tim Diebert, 4-Oct-85 16:07:13
--
DIRECTORY Environment, GPIB, Inline, PDFileFormat, PDInterpBasic, PDInterpOutput, PDInterpBitmap, PDInterpSysCalls, PDQueue, Process, String;
PDInterpOutputPanasonicImpl: PROGRAM
IMPORTS GPIB, Inline, PDInterpBitmap, PDInterpSysCalls, PDQueue, Process, String
EXPORTS PDInterpOutput
= BEGIN
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: CARDINAL ← 0;
feed: BOOL ← FALSE;
strip: BOOL ← FALSE;
deviceAddr: GPIB.DeviceAddr ← 16;
bandsSent: CARDINAL ← 0;
bandsToSend: CARDINAL ← 0;
zeros: PDInterpBitmap.BitmapDesc ← [sOrigin: 0, fOrigin: 0, sMin: 0, fMin: 0, sSize: 0, fSize: 0, pointer: NIL, rast: 0, lines: 0];
zerosWordsAllocated: CARDINAL ← 0;
quadWordCnt: CARDINAL ← 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, request: PDQueue.Request]
RETURNS [PDInterpBitmap.BitmapDesc] = {
rast: NAT = (herald.imageFSize+bitsPerWord-1)/bitsPerWord;
words: CARDINAL = rast * herald.bandSSize; -- In the band.
bytes: CARDINAL ← rast * 2;
command: LONG STRING ← [200];
linesToSend: CARDINAL ← MIN[herald.imageSSize, 5500];
bandsToSend ← MIN[herald.imageSSize/herald.bandSSize, 110];
command.length ← 0;
currentHerald ← herald;
currentStartImage ← startImage;
currentBandNumber ← 0;
feed ← startImage.feed;
strip ← startImage.strip;
quadWordCnt ← words/4;
IF words > bandWordsAllocated OR bandWordsAllocated = 0 THEN {
IF band.pointer # NIL THEN PDInterpSysCalls.FreeSpace[band.pointer];
band.pointer ← PDInterpSysCalls.AllocateSpace[words];
bandWordsAllocated ← words;
};
IF words > zerosWordsAllocated OR zerosWordsAllocated = 0 THEN {
IF zeros.pointer # NIL THEN PDInterpSysCalls.FreeSpace[zeros.pointer];
zeros.pointer ← PDInterpSysCalls.AllocateSpace[words];
zerosWordsAllocated ← words;
};
zeros.sOrigin ← 0;
zeros.fOrigin ← 0;
zeros.sMin ← 0; zeros.fMin ← 0; zeros.sSize ← herald.bandSSize;
zeros.fSize ← rast*bitsPerWord; zeros.rast ← rast; zeros.lines ← herald.bandSSize;
PDInterpBitmap.Clear[zeros];
IF feed THEN BEGIN
numbers: LONG STRING ← [120];
GPIB.DevicesClear[];
String.AppendNumber[s: numbers, n: bytes];
String.AppendChar[s: numbers, c: ',];
String.AppendNumber[s: numbers, n: linesToSend];
String.AppendString[to: numbers, from: ",0,0\n\l"];
GPIB.SelectedDeviceClear[deviceAddr];
String.AppendString[to: command, from: "AY"];
String.AppendString[to: command, from: numbers];
GPIB.WriteDevice[deviceAddr, command];
command.length ← 0;
String.AppendString[to: command, from: "AM"];
String.AppendString[to: command, from: numbers];
GPIB.WriteDevice[deviceAddr, command];
command.length ← 0;
String.AppendString[to: command, from: "AC"];
String.AppendString[to: command, from: numbers];
GPIB.WriteDevice[deviceAddr, command];
command.length ← 0;
String.AppendString[to: command, from: "AK"];
String.AppendString[to: command, from: numbers];
GPIB.WriteDevice[deviceAddr, command];
command.length ← 0;
GPIB.WriteDevice[deviceAddr, "PL\n\l"];
GPIB.WriteDevice[deviceAddr, "C\n\l"];
GPIB.WriteDevice[deviceAddr, "O900\n\l"];
GPIB.WriteDeviceInitial[deviceAddr, "T\n\l"];
END;
FOR i: CARDINAL IN [0 .. startImage.passBands) DO
GPIB.WriteDeviceBlock[deviceAddr, zeros.pointer, quadWordCnt, FALSE];
Process.Yield[];
ENDLOOP;
bandsSent ← startImage.passBands;
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] = {
GPIB.WriteDeviceBlock[deviceAddr, band.pointer, quadWordCnt, FALSE];
Process.Yield[];
bandsSent ← bandsSent + 1;
currentBandNumber ← currentBandNumber + 1;
RETURN [CurrentBandDesc[]]
};
EndImage: PUBLIC PROC [request: PDQueue.Request] = {
FOR i: CARDINAL IN [bandsSent .. bandsToSend) DO
GPIB.WriteDeviceBlock[deviceAddr, zeros.pointer, quadWordCnt, FALSE];
ENDLOOP;
IF strip THEN Process.Pause[Process.SecondsToTicks[15]];
};
ReprintLastPage: PUBLIC PROC [copies: CARDINAL] = {
IF currentHerald.password # PDFileFormat.passwordValue THEN RETURN;
currentHerald.copies ← copies;
-- PrintPage[];
};
currentHerald.password ← 0;
END.