INCLUDE "std primitives";
INCLUDE "matrix printer";
PLOTTER "NEC P9 HD",2,15,2880,2880,20.32,20.32;
COLORS "000999";
(* Version vom 21.10.87 BJ *)
(* Globale Daten fuer NEC P9 *)
LET hd p9 graf = ""27"*"40"", (* Nec P9 in 24-Nadel 360 Pixel/zoll Modus *)
hd p9 feed = ""28"3", (* Zeilenabstand in 360 Pixel/Zoll setzen *)
hd p9 nlq = ""27"x"1"", (* NLQ Modus waehlen *)
hd p9 pos = ""27"\"; (* in 1/180 Zoll-Schritten rel Positionieren *)
LET hd p9 x max = 2879,
hd p9 y max = 2879,
hd p9 y lines = 90, (* y pixel / 16 (Punkte pro INT) / 2 (Maps) *)
hd p9 x per ds= 1440, (* Maximale x pixel pro Dataspace ( Darf *)
(* Nicht mehr als 256 K sein !!! *)
(* x per ds = 256 * 1024 / p9 y lines / 4 *)
hd p9 x lines = 2; (* x pixel / hd p9 x per ds *)
LET HDPYLINE = ROW hd p9 x per ds INT,
HDPSMAP = ROW hd p9 y lines HDPYLINE,
HDPMAP = ROW hd p9 x lines ROW 2 BOUND HDPSMAP;
HDPMAP VAR hd p9 map;
ROW hd p9 x lines ROW 2 DATASPACE VAR hd p9 ds;
INT VAR hd p9 x pos, hd p9 y pos;
(* Globale Daten Ende *)
PROC prepare:
REP
call (29, "", printer); (* wait for halt *)
IF task(channel(plotter)) = niltask (* Es koennte der MD worker dran sein *)
THEN continue (channel (plotter)) (* Der startet den PRINTER wieder ! *)
ELSE pause(300) (* folge : Kanal belegt -> dead *)
FI
UNTIL channel(myself) = channel(plotter) PER
END PROC prepare;
PROC initplot:
INT VAR hd p9 i,hd p9 j;
FOR hd p9 i FROM 1 UPTO hd p9 x lines REP
FOR hd p9 j FROM 1 UPTO 2 REP
hd p9 ds[hd p9 i][hd p9 j] := nilspace;
hd p9 map[hd p9 i][hd p9 j] := hd p9 ds[hd p9 i][hd p9 j]
PER
PER
END PROC initplot;
PROC endplot:
hd p9 put map;
break(quiet);
call (26, "", printer); (* start spool *)
enable stop
END PROC endplot;
PROC hd p9 put map:
open graf;
put map;
close graf;
forget dataspaces.
open graf:
out(hd p9 nlq). (* NLQ Modus waehlen, damit Positionierung in 1/180 *)
(* Schritten geht (sonst 1/120) *)
close graf:
out(""12""). (* Form Feed ! Drucker muss auf richtige Seitenlaenge *)
(* eingestellt sein (EUMEL-DR macht kein FF) *)
forget dataspaces:
INT VAR i;
FOR i FROM 1 UPTO hd p9 x lines REP
FOR j FROM 1 UPTO 2 REP
forget(hd p9 ds[i][j])
PER
PER.
put map:
INT VAR j,half;
FOR j FROM 1 UPTO hd p9 y lines REP
FOR half FROM 1 UPTO 2 REP
open line;
put half line;
close line
PER
PER.
open line:
INT VAR actual pos :: 0, (* aktuelle x-pos 0..x max *)
last pos.
close line:
out(hd p9 feed);
IF half = 1
THEN out (""1"") (* LF 1/360 Zoll *)
ELSE out (""31"")
FI;
line.
put half line:
WHILE actual pos <= hd p9 x max REP
put blank cols;
put nonblank cols
PER.
put blank cols:
last pos := actual pos;
WHILE actual pos <= hd p9 x max CAND actual col is blank REP
actual pos INCR 1
PER;
IF actual pos > last pos AND actual pos <= hd p9 x max
THEN out blank cols
FI.
put nonblank cols:
last pos := actual pos;
WHILE actual pos <= hd p9 x max CAND NOT actual col is blank REP
actual pos INCR 1
PER;
IF actual pos > last pos
THEN out nonblank cols
FI.
out blank cols:
IF actual pos - last pos > 1
THEN TEXT VAR t :: " ";
replace(t, 1, (actual pos - last pos) DIV 2);
out (hd p9 pos + t)
FI;
IF (actual pos - last pos) MOD 2 = 1
THEN out (hd p9 graf + ""1""0"" + 3 * ""0"")
FI.
out nonblank cols:
t := " ";
replace (t,1, actual pos - last pos);
out(hd p9 graf + t);
INT VAR k;
FOR k FROM last pos UPTO actual pos - 1 REP
INT VAR word :: hd p9 map [(k DIV hd p9 x per ds) + 1][half][j]
[(k MOD hd p9 x per ds) + 1],
first byte :: word;
rotate (word, 8);
out (code (word));
out (code (first byte));
out (""0"")
PER.
actual col is blank:
hd p9 map [(actual pos DIV hd p9 x per ds) + 1][half][j]
[(actual pos MOD hd p9 x per ds) + 1] = 0
END PROC hd p9 put map;
PROC clear:
hd p9 clear
END PROC clear;
PROC hd p9 clear:
create initline;
initialize all lines.
create initline:
HDPYLINE VAR initline;
INT VAR i;
FOR i FROM 1 UPTO hd p9 x per ds REP
initline[i] := 0
PER.
initialize all lines:
INT VAR j,k;
FOR i FROM 1 UPTO hd p9 x lines REP
FOR j FROM 1 UPTO 2 REP
FOR k FROM 1 UPTO hd p9 y lines REP
hd p9 map[i][j][k] := initline
PER
PER
PER
END PROC hd p9 clear;
PROC home:
move to (0,0)
END PROC home;
PROC moveto (INT CONST x,y):
hd p9 x pos := x;
hd p9 y pos := y
END PROC moveto;
PROC drawto (INT CONST x,y):
printer line (hd p9 x pos,hd p9 y max - hd p9 y pos,
x, hd p9 y max - y,
PROC (INT CONST, INT CONST) hd p9 set pixel);
hd p9 x pos := x;
hd p9 y pos := y
END PROC drawto;
PROC setpixel (INT CONST x,y):
hd p9 set pixel (x, hd p9 y max - x)
END PROC setpixel;
PROC hd p9 set pixel (INT CONST x,y):
setbit (hd p9 map [(x DIV hd p9 x per ds) + 1][(y AND 1) + 1][(y DIV 32) + 1]
[(x MOD hd p9 x per ds) + 1],15 - ((y DIV 2) AND 15))
END PROC hd p9 set pixel;
BOOL PROC hd p9 is pixel (INT CONST x,y):
bit (hd p9 map [(x DIV hd p9 x per ds) + 1][(y AND 1) + 1][(y DIV 32) + 1]
[(x MOD hd p9 x per ds) + 1],15 - ((y DIV 2) AND 15))
END PROC hd p9 is pixel;
PROC foreground (INT VAR type):
type := 1
END PROC foreground;
PROC background (INT VAR type):
type := 0
END PROC background;
PROC setpalette:
END PROC setpalette;
PROC circle (INT CONST x,y,rad,from,to):
std circle (x,y,rad,from,to)
END PROC circle;
PROC box (INT CONST x1,y1,x2,y2,pattern):
std box (x1, y1, x2, y2, pattern)
END PROC box;
PROC fill (INT CONST x,y,pattern):
printer fill (x,x, hd p9 y max - y, 1,
BOOL PROC (INT CONST, INT CONST) hd p9 is pixel,
PROC (INT CONST, INT CONST) hd p9 set pixel)
END PROC fill;