PACKET hp laserjet printer
(**************************************************************************)
(* Stand : 03.02.88 *)
(* HP 2686A LaserJet / LaserJet+ Verison : 4 *)
(* Autor : Rudolf Ruland *)
(**************************************************************************)
DEFINES open,
close,
execute,
paper size,
printer type :
LET
(* underline = 1,
bold = 2,
italics = 4,
reverse = 8,
underline linetype = 1, *)
c document = 1,
c page = 2,
c write text = 1,
c write cmd = 2,
c carriage return = 3,
c move = 4,
c draw = 5,
c on = 6,
c off = 7,
c type = 8;
INT VAR abs x pos
REAL VAR x size, y size;
BOOL VAR is laser jet plus, is landscape;
(*********************************************************************)
paper size (21.0, 29.7);
printer type ("LaserJet");
PROC paper size (REAL CONST x, y) :
x size := x;
y size := y;
END PROC paper size;
PROC paper size :
line;
putline ("Papierbreite = " + text (x size, 5, 2) + " cm = " + text (x size / 2.54, 5, 2) + " Zoll");
putline ("Papierlaenge = " + text (y size, 5, 2) + " cm = " + text (y size / 2.54, 5, 2) + " Zoll");
END PROC paper size;
PROC printer type (TEXT CONST type) :
is laser jet plus := pos (type, "+") <> 0
END PROC printer type;
TEXT PROC printer type :
IF is laser jet plus
THEN "LaserJet+"
ELSE "LaserJet"
FI
END PROC printer type;
(*********************************************************************)
PROC open (INT CONST op code, INT VAR param1, param2) :
SELECT op code OF
CASE c document : open document
CASE c page : open page
END SELECT;
. x steps : param1
. y steps : param2
.
open document :
out (""27"E"); (* Reset des Druckers *)
out (""27"&s1C"); (* 'end of line wrap' aus *)
out (""27"&l0L"); (* 'perforation skip' aus *)
out (""27"&l1X"); (* eine Kopie *)
out (""27"&l1H"); (* upper tray *)
IF pos (material, "landscape") > 0 OR pos (material, "quer") > 0
THEN is landscape := TRUE;
x steps := x step conversion ( y size );
y steps := y step conversion ( x size );
out (""27"&l1O");
ELSE is landscape := FALSE;
x steps := x step conversion ( x size );
y steps := y step conversion ( y size );
FI;
. x start : param1
. y start : param2
.
open page :
IF is landscape
THEN x start := x step conversion (0.508); (* 0.200*2.54 *)
y start := y step conversion (1.693333); (* 0.500*2.54 + 2.54/6.0 *)
ELSE x start := x step conversion (0.39878); (* 0.157*2.54 *)
y start := y step conversion (1.693333); (* 0.500*2.54 + 2.54/6.0 *)
FI;
IF pos (material, "lower tray") > 0 COR pos (material, "lowertray") > 0
THEN out (""27"&l4H");
ELIF pos (material, "tray") > 0 COR pos (material, "upper tray") > 0 COR pos (material, "uppertray") > 0
THEN out (""27"&l1H");
ELIF pos (material, "manual") > 0
THEN out (""27"&l2H");
ELIF pos (material, "envelope") > 0
THEN out (""27"&l3H");
FI;
IF material contains a number
THEN out (""27"&l" + text (number) + "X");
FI;
out (""13"");
. material contains a number :
INT VAR number := pos (material, "0", "9", 1);
IF number = 0
THEN FALSE
ELSE number := max (1, int (subtext (material, number, number + 1)));
TRUE
FI
END PROC open;
PROC close (INT CONST op code, INT CONST param1) :
SELECT op code OF
CASE c document : close document
CASE c page : close page
OTHERWISE : put (param1)
END SELECT;
.
close document :
(*. remaining y steps : param1*)
.
close page :
out (""12"")
END PROC close;
PROC execute (INT CONST op code, TEXT CONST string, INT CONST param1, param2) :
SELECT op code OF
CASE c write text : write text
CASE c write cmd : write cmd
CASE c carriage return : carriage return
CASE c move : move
CASE c draw : draw
CASE c on : on
CASE c off : off
CASE c type : type
END SELECT
. from : param1
. to : param2
.
write text :
out subtext (string, from, to)
.
write cmd :
out subtext (string, from, to)
(*. x steps to left margin : param1*)
.
carriage return :
out (""13"")
. x steps : param1
. y steps : param2
.
move :
IF x steps <> 0
THEN x move
ELIF y steps > 0
THEN out (""27"&a+" + text (y steps) + "V");
ELIF y steps < 0
THEN out (""27"&a" + text (y steps) + "V");
FI;
. x move :
IF is laser jet plus
THEN laser jet plus x move
ELSE laser jet x move
FI;
. laser jet plus x move :
IF x steps >= 0
THEN out (""27"*p+" + text (x steps) + "X");
ELSE out (""27"*p" + text (x steps) + "X");
FI;
. laser jet x move :
abs x pos := x pos;
IF abs x pos >= 0
THEN out (""27"&a");
out (text ((abs x pos DIV 5) * 12 + ((abs x pos MOD 5) * 12 + 4) DIV 5));
out ("H");
ELSE stop
FI;
.
draw :
stop
. modification : param1
.
on :
IF on string (modification) <> ""
THEN out (on string (modification))
ELSE stop
FI
.
off :
IF off string (modification) <> ""
THEN out (off string (modification))
ELSE stop
FI
. font nr : param1
.
type :
out (font string (font nr));
END PROC execute;
END PACKET hp laserjet printer;
#page#
(******************************************************************)
(*** ***)
(*** Generierung des Printers ***)
(*** ***)
(******************************************************************)
LET printer name = "printer.hp.laserjet",
up = ""3""13""5"";
TEXT VAR fonttab name := "fonttab.hp.laserjet";
BOOL CONST multi user := (pcb (9) AND 255) <> 1;
INT VAR pr channel;
TEXT VAR buffer;
command dialogue (TRUE);
IF NOT multi user
THEN errorstop ("Dieser Treiber arbeitet nur mit Multi-Tasking-EUMEL")
FI;
ask for print channel;
ask for printer type;
load font table;
forget (printer name, quiet);
IF multi user THEN generate printer spool FI;
check on;
.
ask for print channel :
line;
put ("gib Druckerkanal:");
get (pr channel);
do ("serverchannel(" + text (pr channel) + ")" ) ;
line;
.
ask for printer type :
printer type (laser jet);
. laser jet :
line;
REP out (up);
IF yes ("Druckertyp : HP LaserJet")
THEN LEAVE laser jet WITH "LaserJet" FI;
out (up);
IF yes ("Druckertyp : HP LaserJet+")
THEN LEAVE laser jet WITH "LaserJet+" FI;
PER;
""
.
load font table :
line (2);
write (""13""4"");
putline ("Die Fonttabelle """ + fonttab name +
""" enthält die Schrifttypen der");
putline ("Font Cartriges:");
putline (" 92286A Courier 1");
putline (" 92286C International 1");
putline (" 92286D Prestige Elite");
putline (" 92286E Letter Gothic");
putline (" 92286F TMS Proportional 2");
putline (" 92286L Courier P&L");
putline (" 92286M Prestige Elite P&L");
putline (" 92286N Letter Gothic P&L");
putline (" 92286P TMS RMN P&L");
putline (" 92286Q Memo 1");
line;
putline ("Für ein korrektes Druckbild dürfen immer nur die Schrifttypen angesprochen");
putline ("werden, deren Cartrige eingeschoben ist!");
IF printer type = "LaserJet"
THEN line;
putline ("ELAN-Listings können nur gedruckt werden, wenn ein Cartrige mit dem");
putline ("Schrifttyp 'LINE PRINTER' eingeschoben ist!");
FI;
line (2);
putline ("Weiter nach Eingabe einer Taste");
pause;
IF NOT exists (fonttab name)
THEN command dialogue (TRUE);
REP line (2);
putline ("Bitte Archiv mit der Fonttabelle """ +
fonttab name + """ einlegen!");
line;
UNTIL yes ("Archiv eingelegt") PER;
reserve archive;
fetch (fonttab name, archive);
release (archive);
FI;
font table (fonttab name);
IF multi user
THEN command dialogue (FALSE);
do ("save(""" + font tab name + """,task(""configurator""))")
FI;
forget (fonttab name, quiet);
. reserve archive :
INT VAR p1, p2;
archive (" "31" ");
disable stop;
list (archive);
IF is error
THEN buffer := errormessage;
p1 := pos (buffer, """", 1 ) + 1;
p2 := pos (buffer, """", p1) - 1;
IF p1 > 0 AND p2 > 0
THEN clear error;
buffer := subtext (buffer, p1, p2);
archive (buffer);
FI;
FI;
enable stop;
. generate printer spool :
eumel must advertise;
cursor (1, 12);
putline ("In allen bestehenden Tasks - insbesondere in der Task ""PUBLIC"" - muß");
putline ("die Fonttabelle mit dem Kommando");
line;
putline (" font table (""" + font tab name + """)");
line;
putline ("eingestellt werden!!!");
line (4);
putline ("Generierung beendet, weiter mit 'SV'");
generate printer server;
do (buffer);
. generate printer server :
buffer := "break (quiet);";
buffer CAT "spool manager (PROC printer);";
buffer CAT "INT VAR reply; DATASPACE VAR ds; FILE VAR file;";
buffer CAT "PROC printer:";
buffer CAT " disable stop;";
buffer CAT " continue (server channel);";
buffer CAT " check error (error message);";
buffer CAT " ds := nilspace;";
buffer CAT " REP forget (ds);";
buffer CAT " execute print;";
buffer CAT " IF is error AND online";
buffer CAT " THEN out (""""27""(8U""27""(s0p10h12v0s0b3T"");";
buffer CAT " put error; clear error; out (""""12"""");";
buffer CAT " FI;";
buffer CAT " PER;";
buffer CAT "END PROC printer;";
buffer CAT "PROC execute print:";
buffer CAT " LET ack = 0, fetch code = 11, file type = 1003;";
buffer CAT " enable stop;";
buffer CAT " ds := nilspace;";
buffer CAT " call (father, fetch code, ds, reply);";
buffer CAT " IF reply = ack CAND type (ds) = file type";
buffer CAT " THEN file := sequential file (input, ds);";
buffer CAT " print (file,";
buffer CAT " PROC (INT CONST, INT VAR, INT VAR) open,";
buffer CAT " PROC (INT CONST, INT CONST) close,";
buffer CAT " PROC (INT CONST, TEXT CONST, INT CONST, INT CONST) execute);";
buffer CAT " FI;";
buffer CAT "END PROC execute print;";
buffer CAT "PROC check error(TEXT CONST message):";
buffer CAT " IF is error";
buffer CAT " THEN clear error; rename myself (message);";
buffer CAT " IF is error THEN end(myself) FI;";
buffer CAT " pause (9000); end(myself);";
buffer CAT " FI;";
buffer CAT "END PROC check error;";