app/mpg/2.2/src/NEC P-9 2-15.HD.GCONF

Raw file
Back to index

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;