home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / sonderh1 / gplotsys.pas < prev    next >
Pascal/Delphi Source File  |  1987-03-13  |  8KB  |  255 lines

  1. (***************************************************************************)
  2. (*                            GPLOTSYS.PAS                                 *)
  3. (*                                                                         *)
  4. (*     MODULE GPlotter : Simulation eines Plotters mittels eines           *)
  5. (*                       Matrixdruckers   (hier: QUEN DATA DMP 1180)       *)
  6. (***************************************************************************)
  7.  
  8. (* enthaltene Funktionen:
  9.     GPinit, GPexit, GPloescheBlatt, GPinvertiereBlatt, GPdruckeBlatt,
  10.     Point_System u. Point (so benannt wg. 'Vom Punkt...' und den dortigen
  11.     Algorithmen), GPholePunkt.
  12.  
  13.    Voraussetzungen an Pascal-Implementation:
  14.     Direktzugriffsdateien, bitweises AND, OR, XOR                          *)
  15.  
  16. (*-------------------------------------------------------------------------*)
  17. (*                  Speichere aktuelle Zeile in Puffer:                    *)
  18.  
  19. PROCEDURE GPsichereZeile;
  20.  
  21. BEGIN
  22.   Seek(GPpufferFile, GPgeladeneZeile);
  23.   Write(GPpufferFile, GPpufferZeile);          (* ev. mit 'Put' ersetzen ! *)
  24. END;
  25.  
  26. (*-------------------------------------------------------------------------*)
  27. (*                   benoetigte Zeile aus Puffer laden:                    *)
  28.  
  29. PROCEDURE GPladeZeile (zeile: INTEGER);
  30.  
  31. BEGIN
  32.   Seek(GPpufferFile, zeile);
  33.   Read(GPpufferFile, GPpufferZeile);           (* ev. mit 'Get' ersetzen ! *)
  34.   GPgeladeneZeile := zeile;
  35.   GPuntergrenze   := zeile * 16;
  36.   GPobergrenze    := GPuntergrenze + 15;
  37. END;
  38.  
  39. (*-------------------------------------------------------------------------*)
  40. (*     Sichere alte Zeile in Puffer und hole neue Zeile aus Puffer:        *)
  41.  
  42. PROCEDURE GPzeilenwechsel (y: INTEGER);
  43.  
  44. BEGIN
  45.   IF (y < GPuntergrenze) OR (GPobergrenze < y) THEN
  46.   BEGIN                 (* Wechsel notwendig, wenn y ausserhalb akt. Zeile *)
  47.     GPsichereZeile;
  48.     GPladeZeile(y DIV 16);
  49.   END;
  50. END;
  51.  
  52. (*-------------------------------------------------------------------------*)
  53. (*  pruefen, ob (x,y) im Zeichenbereich. Wenn ja, Zeilenwechsel durchf.:   *)
  54.  
  55. FUNCTION GPaufBlatt (x, y: INTEGER): BOOLEAN;
  56.  
  57. BEGIN
  58.   IF (x >= 0) AND (x <= GPXmax_Sys) AND (y >= 0) AND (y <= GPYmax_Sys) THEN
  59.     BEGIN
  60.       GPzeilenwechsel(y);
  61.       GPaufBlatt := TRUE;
  62.     END
  63.   ELSE
  64.     GPaufBlatt := FALSE;
  65. END;
  66.  
  67. (*-------------------------------------------------------------------------*)
  68. (*                gesamten Grafikpuffer loeschen:                          *)
  69.  
  70. PROCEDURE GPloescheBlatt;
  71.  
  72. VAR  i: INTEGER;
  73.  
  74. BEGIN
  75. (*$I-*)            (* I/O-Fehlerbehandlung des Laufzeitsystems ausschalten *)
  76.   ReWrite(GPpufferFile);
  77. (*$I+*)                                        (* ...und wieder aktivieren *)
  78.   IF IOResult = 0 THEN          (* kein I/O-Fehler bei ReWrite aufgetreten *)
  79.     BEGIN
  80.       FOR i := 0 TO GPXmax_Sys DO
  81.         GPpufferZeile[i].BS := 0;
  82.       FOR i := 1 TO GPanzPufferZeilen DO
  83.         Write(GPpufferFile, GPpufferZeile);
  84.       Close(GPpufferFile);
  85.       ReSet(GPpufferFile);
  86.       GPladeZeile(GPgeladeneZeile);
  87.     END
  88.   ELSE
  89.     Halt;                                            (* Programm abbrechen *)
  90. END;
  91.  
  92. (*-------------------------------------------------------------------------*)
  93. (*                gesamten Grafikpuffer invertieren:                       *)
  94.  
  95. PROCEDURE GPinvertiereBlatt;
  96.  
  97. VAR  i, j: INTEGER;
  98.  
  99. BEGIN
  100.   GPsichereZeile;
  101.   FOR i := 0 TO Pred(GPanzPufferZeilen) DO
  102.   BEGIN
  103.     GPladeZeile(i);
  104.     FOR j := 0 TO GPXmax_Sys DO
  105.       GPpufferZeile[j].bs := GPpufferZeile[j].bs XOR $FFFF;
  106.     GPsichereZeile;
  107.   END;
  108. END;
  109.  
  110. (*-------------------------------------------------------------------------*)
  111. (*                    gesamte Grafik ausdrucken:                           *)
  112. (* 'lst' ist in Turbo-Pascal vordefinerte Datei fuer Druckerausgabe.       *)
  113.  
  114. PROCEDURE GPdruckeBlatt;
  115.  
  116. CONST esc = 27;
  117.       doub_dens = 'L';
  118.       form_feed = 12;
  119.       l7_72     = '1';
  120.       l1_6      = '2';
  121.  
  122. VAR  i, j, k: INTEGER;
  123.  
  124. BEGIN
  125.   GPsichereZeile ;
  126.   WriteLn(Lst, Chr(esc), l7_72);
  127.                                           (* 7/72 Zeilenabstand einstellen *)
  128.   FOR i := Pred(GPanzPufferZeilen) DOWNTO 0 DO
  129.   BEGIN
  130.     GPladeZeile(i);
  131.     FOR j := 1 DOWNTO 0 DO                           (* eine Zeile drucken *)
  132.     BEGIN
  133.       Write(Lst, Chr(esc), doub_dens, Chr(Succ(GPXmax_Sys) MOD 256),
  134.                                       Chr(Succ(GPXmax_Sys) DIV 256));
  135.       FOR k := 0 TO GPXmax_Sys DO
  136.         Write(Lst,GPpufferZeile[k].cc[j]);
  137.       WriteLn(Lst);
  138.     END;
  139.   END;
  140.   WriteLn(Lst, Chr(esc), l1_6, Chr(form_feed));
  141.                                       (* 1/6 Zeilenabstand und neues Blatt *)
  142. END;
  143.  
  144. (*-------------------------------------------------------------------------*)
  145. (*                       Zeichenmodus setzen:                              *)
  146.  
  147. PROCEDURE GPsetzeMode (mode: GPModes);
  148.  
  149. BEGIN
  150.   GPMode := mode;
  151. END;
  152.  
  153. (*-------------------------------------------------------------------------*)
  154. (*                Punkt gemaess Zeichenmodus setzen:                       *)
  155.  
  156. PROCEDURE Point_System (x, y: INTEGER);
  157.  
  158. BEGIN
  159.   IF GPaufBlatt(x,y) THEN
  160.     CASE GPMode OF
  161.       Setzen      : GPpufferZeile[x].bs := GPpufferZeile[x].bs OR
  162.                                            GPbits[y MOD 16];
  163.       Loeschen    : GPpufferZeile[x].bs := GPpufferZeile[x].bs AND
  164.                                            (GPbits[y MOD 16] XOR $FFFF);
  165.       Invertieren : GPpufferZeile[x].bs := GPpufferZeile[x].bs XOR
  166.                                            GPbits[y MOD 16];
  167.     END;
  168. END;
  169.  
  170. (*-------------------------------------------------------------------------*)
  171. (*                nur aus oben beschriebenem Grund:                        *)
  172.  
  173. PROCEDURE Point (x, y: INTEGER);
  174.  
  175. BEGIN
  176.   Point_System(x, y);
  177.   Pen_Xpos := x;  Pen_Ypos := y;
  178. END;
  179.  
  180. (*-------------------------------------------------------------------------*)
  181. (*                        Punkt abfragen:                                  *)
  182.  
  183. FUNCTION GPholePunkt (x, y: INTEGER): BOOLEAN;
  184.  
  185. BEGIN
  186.   IF GPaufBlatt(x,y) THEN
  187.     GPholePunkt := (GPbits[y MOD 16] AND GPpufferZeile[x].bs) <> 0
  188.   ELSE
  189.     GPholePunkt := FALSE;
  190. END;
  191.  
  192. (*-------------------------------------------------------------------------*)
  193. (* Point-SWAP aus der Graphikserie. Vertauscht die Koord. zweier Punkte    *)
  194. (* fuer den Integer-DDA des gleichen Artikels. Wurde hier noch'mal auf-    *)
  195. (* genommen, um unnoetiges Nachdenken seitens des Lesers zu verhindern!    *)
  196.  
  197. PROCEDURE point_swap (VAR x1, y1, x2, y2: INTEGER);
  198.  
  199. VAR hilf: INTEGER;
  200.  
  201. BEGIN
  202.   hilf := x1;  x1 := x2;  x2 := hilf;
  203.   hilf := y1;  y1 := y2;  y2 := hilf;
  204. END;
  205.  
  206. (*-------------------------------------------------------------------------*)
  207. (*                   Initialisierung des Plottersimulators:                *)
  208. (* Die Turbo-Anweisungen 'Assign(filevar, filename)' und 'ReSet(filevar)'
  209.    sind bei anderen Implementationen u.U. mit 'ReSet(filevar, filename)' zu
  210.    ersetzen. Entsprechendes ist bei 'ReWrite(filevar)' zu beachten.        *)
  211.  
  212. PROCEDURE GPinit (GPpuffername: GPfName; clr: BOOLEAN);
  213.  
  214. VAR i: INTEGER;
  215.  
  216. BEGIN
  217.   GPanzPufferZeilen := Succ(GPYmax_Sys) DIV 16;
  218.   IF (Succ(GPYmax_Sys) MOD 16) <> 0 THEN
  219.     GPanzPufferZeilen := Succ(GPanzPufferZeilen);
  220.   GPgeladeneZeile := 0;
  221.   Assign(GPpufferFile, GPpuffername);
  222. (*$I-*)
  223.   ReSet(GPpufferFile);                   (* Puffer-Datei schon vorhanden ? *)
  224. (*$I+*)
  225.   IF (IOResult = 0) THEN                 (* ja...                          *)
  226.     BEGIN
  227.       IF clr THEN
  228.         BEGIN
  229.           GPloescheBlatt;
  230.         END;
  231.     END
  232.   ELSE
  233.     GPloescheBlatt;
  234.   GPbits[0] := 1;                             (* Bit-Masken initialisieren *)
  235.   FOR i := 1 TO 14 DO
  236.     GPbits[i] := 2*GPbits[Pred(i)];
  237.   GPbits[15] := $8000;
  238.   GPladeZeile(0);
  239.   GPsetzeMode(Setzen);
  240.   Pen_Xpos := 0;  Pen_Ypos := 0;
  241. END;
  242.  
  243. (*-------------------------------------------------------------------------*)
  244. (*                   Beenden des Plottersimulators:                        *)
  245.  
  246. PROCEDURE GPexit;
  247.  
  248. BEGIN
  249.   GPsichereZeile;
  250.   Close(GPpufferFile);
  251. END;
  252.  
  253. (*-------------------------------------------------------------------------*)
  254. (*                        Ende von GPLOTSYS.PAS                            *)
  255.