PACKET epson mx printer
(**************************************************************************)
(* Stand : 29.07.86 *)
(* EPSON MX-80 TYPE III Version : 4 *)
(* Autor : Rudolf Ruland *)
(**************************************************************************)
DEFINES open,
close,
execute,
paper size,
std speed :
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 blankbreite, x rest, y rest, high, low, small;
BOOL VAR is underline, is bold, is condensed, is small, is slow;
REAL VAR x size, y size;
TEXT VAR std speed name;
(*********************************************************************)
paper size (8.0 * 2.54, 12.0 * 2.54);
std speed ("slow");
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 std speed (TEXT CONST speed) :
IF speed = "fast" OR speed = "slow"
THEN std speed name := speed;
ELSE errorstop ("unzulaessige Geschwindigkeit")
FI;
END PROC std speed;
TEXT PROC std speed : std speed name END PROC std speed;
(*********************************************************************)
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 :
IF pos (material, "slow") <> 0
THEN is slow := TRUE;
ELIF pos (material, "fast") <> 0
THEN is slow := FALSE;
ELSE is slow := std speed name = "slow"
FI;
is underline := FALSE;
is bold := FALSE;
x steps := x step conversion ( x size );
y steps := y step conversion ( y size );
y steps := (y steps DIV 36) * 36;
out (""27"R"0""27""64""); (* Reset des Druckers *)
out (""27"R"0""); (* Amerikanischer Zeichensatz *)
out (""27"C" + code (y steps DIV 36)); (* Formularlaenge *)
. x start : param1
. y start : param2
.
open page :
x start := 0;
y start := 0;
x rest := 0;
y rest := 0;
small := 0;
out (""13"");
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
END SELECT;
.
close document :
. remaining y steps : param1
.
close page :
IF remaining y steps > 0 THEN out (""12"") FI
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 :
y rest INCR small;
x rest := 0;
small := 0;
out (""13"");
. x steps : param1
. y steps : param2
.
move :
IF x steps < 0 OR y steps < 0
THEN stop
ELIF x steps > 0
THEN x move
ELIF y steps > 0
THEN y move
FI;
. x move :
high := (x steps + x rest) DIV blankbreite;
low := (x steps + x rest) MOD blankbreite;
IF high > 0 THEN high TIMESOUT " " FI;
IF low > 0 AND is slow
THEN IF is underline THEN out ("_"8"") FI;
IF is condensed
THEN high := low;
low := 0;
out (""27"L"+ code (high) + ""0"");
ELSE high := low DIV 2;
low := low MOD 2;
out (""27"K"+ code (high) + ""0"");
FI;
high TIMESOUT ""0"";
IF is small
THEN out (""27"S"1"");
small DECR 1;
FI;
FI;
x rest := low;
. y move :
y rest INCR y steps;
IF y rest > 0
THEN high := y rest DIV 255;
low := y rest MOD 255;
IF high > 0 THEN high TIMESOUT ""27"J"255"" FI;
IF low > 0 THEN out (""27"J"); out (code (low)) FI;
y rest := 0;
FI;
.
draw :
IF x steps < 0 OR y steps <> 0 OR linetype <> underline linetype
THEN stop
ELIF x steps > 0
THEN x draw
FI;
. x draw :
high := x steps DIV 256;
low := x steps MOD 256;
out (""27"L");
out (code (low));
out (code (high));
x steps TIMESOUT ""1"";
IF is small THEN out (""27"S"1"") FI;
. modification : param1
.
on :
IF on string (modification) <> ""
THEN out (on string (modification));
IF modification = underline THEN is underline := TRUE FI;
IF modification = bold THEN is bold := TRUE FI;
ELSE stop
FI;
.
off :
IF off string (modification) <> ""
THEN out (off string (modification));
IF modification = underline THEN is underline := FALSE FI;
IF modification = bold THEN is bold := FALSE FI;
ELSE stop
FI;
. font nr : param1
.
type :
blankbreite := char pitch (font nr, " ");
is condensed := pos (font string (font nr), ""15"") <> 0;
IF pos (font string (font nr), ""27"S") <> 0
THEN small DECR 1;
is small := TRUE;
ELSE is small := FALSE;
FI;
out (font string (font nr));
IF is bold THEN out (on string (bold)) FI;
END PROC execute;
END PACKET epson mx printer;
PACKET print cmd for single user (* Autor : Rudolf Ruland *)
(* Stand : 19.02.86 *)
DEFINES print,
print channel :
INT VAR pr channel;
TEXT VAR buffer;
FILE VAR print file;
BOOL CONST multi user := (pcb (9) AND 255) <> 1;
PROC print channel (INT CONST channel) :
IF multi user THEN do ("serverchannel(" + text (channel) + ")" ) FI;
pr channel := channel;
END PROC print channel;
INT PROC print channel : pr channel END PROC print channel;
PROC print :
print (last param)
ENDPROC print ;
PROC print (TEXT CONST file name) :
INT CONST myself channel := channel (myself);
last param (file name) ;
print file := sequential file (input, file name) ;
continue (print channel) ;
disable stop ;
execute print ;
remember error message if neccessary;
IF multi user THEN do ("break (quiet)") FI;
continue (myself channel);
clear error;
put error message if neccessary;
. remember error message if neccessary :
IF is error
THEN buffer := error message;
clear error;
ELSE buffer := "";
FI;
. put error message if neccessary :
IF buffer <> "" THEN errorstop (buffer) FI;
ENDPROC print ;
PROC execute print :
enable stop ;
print (print file,
PROC (INT CONST, INT VAR, INT VAR) open,
PROC (INT CONST, INT CONST) close,
PROC (INT CONST, TEXT CONST, INT CONST, INT CONST) execute);
ENDPROC execute print ;
ENDPACKET print cmd for single user;
#page#
(******************************************************************)
(*** ***)
(*** Generierung des Printers ***)
(*** ***)
(******************************************************************)
LET printer name = "printer.epson.mx",
up = ""3""13""5"";
TEXT VAR fonttab name := "fonttab.epson.mx";
BOOL CONST multi user := (pcb (9) AND 255) <> 1;
INT VAR pr channel;
TEXT VAR buffer;
command dialogue (TRUE);
ask for print channel;
ask for paper format;
ask for positioning;
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);
print channel (pr channel);
line;
.
ask for paper format :
SELECT paper format OF
CASE 1 : papersize ( 8.0 * 2.54, 12.0 * 2.54)
CASE 2 : papersize (13.2 * 2.54, 12.0 * 2.54)
CASE 3 : papersize (21.0, 29.7)
END SELECT
. paper format :
line;
REP out (up);
IF yes ("Papierformat : endlos, 8 Zoll breit")
THEN LEAVE paper format WITH 1 FI;
out (up);
IF yes ("Papierformat : endlos, 13.2 Zoll breit")
THEN LEAVE paper format WITH 2 FI;
out (up);
IF yes ("Papierformat : DINA 4")
THEN LEAVE paper format WITH 3 FI;
PER;
0
.
ask for positioning :
line;
std speed (positioning);
. positioning :
REP out (up);
IF yes ("x - Positionierung : in Mikroschritten (genauer, aber langsamer)")
THEN LEAVE positioning WITH "slow" FI;
out (up);
IF yes ("x - Positionierung : in Blanks (schneller, aber ungenauer)")
THEN LEAVE positioning WITH "fast" FI;
PER;
""
.
load font table :
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 THEN put error; clear error; 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;";