home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1991 / 01 / tricks / screens.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1990-10-22  |  9.6 KB  |  346 lines

  1. (* ------------------------------------------------------ *)
  2. (*                      SCREENS.PAS                       *)
  3. (*   Verwaltung und Animation von Bildschirmseiten der    *)
  4. (*         CGA/EGA/VGA Karten im 80x25-Textmodus          *)
  5. (*                  Turbo Pascal 5.5                      *)
  6. (*             (c) 1990 H. Zenz & TOOLBOX                 *)
  7. (* ------------------------------------------------------ *)
  8. UNIT Screens;
  9.  
  10. INTERFACE
  11.  
  12. PROCEDURE SetPage(Page: BYTE);           { zeigt Bildseite }
  13. PROCEDURE SetCursor(Page, x, y: BYTE);      { setzt Cursor }
  14. FUNCTION  CursorX(Page: BYTE) : BYTE;      { ermittelt die }
  15. FUNCTION  CursorY(Page: BYTE) : BYTE;     { Cursorposition }
  16. PROCEDURE Cls(Page, Farbe: BYTE);         { Screen löschen }
  17. PROCEDURE WriteStrXY(x, y, Page: BYTE; stg : STRING);
  18.                                  { gibt String an x, y aus }
  19. PROCEDURE WriteIntXY(x, y, Page: BYTE;
  20.                      i: INTEGER; len: BYTE);
  21.                                 { gibt Integer an x, y aus }
  22. PROCEDURE WriteRealXY(x, y, Page: BYTE;
  23.                       r: REAL; len, dezi: BYTE);
  24.                                 { gibt Integer an x, y aus }
  25. PROCEDURE CopyScreen(Source, Dest: BYTE; Wait, Art: WORD);
  26.                       { animiertes Kopieren von Bildseiten }
  27.  
  28. IMPLEMENTATION
  29.  
  30. USES Dos, Crt;
  31.  
  32. CONST ScreenSegment    = $B800;{ Bildschirmspeichersegment }
  33.       PageLen          = 4096 DIV 16;
  34.                               { Seitenlänge in Paragraphen }
  35. VAR   Wait             : WORD;
  36.       ScrSeg1, ScrSeg2 : WORD; { Startsegmente von Quell-  }
  37.                                { und Zielseite             }
  38.  
  39. PROCEDURE SetPage(Page: BYTE);
  40. VAR R: Registers;
  41. BEGIN
  42.   R.ah := 5;
  43.   R.al := Page;
  44.   Intr($10, R);
  45. END;
  46.  
  47. PROCEDURE SetCursor(Page, x, y: BYTE);
  48. VAR R: Registers;
  49. BEGIN
  50.   R.ah := 2;
  51.   R.bh := Page;
  52.   R.dh := y;
  53.   R.dl := x;
  54.   Intr($10, R);
  55. END;
  56.  
  57. FUNCTION CursorX(Page: BYTE): BYTE;
  58. VAR r: Registers;
  59. BEGIN
  60.   R.ah := 3;
  61.   R.bh := Page;
  62.   Intr($10, R);
  63.   CursorX := R.dl;
  64. END;
  65.  
  66. FUNCTION CursorY(Page: BYTE): BYTE;
  67. VAR R: Registers;
  68. BEGIN
  69.   R.ah := 3;
  70.   R.bh := Page;
  71.   Intr($10, R);
  72.   CursorY := R.dh;
  73. END;
  74.  
  75. PROCEDURE Cls(Page, Farbe: BYTE);
  76. VAR Feld          : RECORD CASE BOOLEAN OF
  77.                       TRUE : (h, l: BYTE);
  78.                       FALSE: (w:    WORD);
  79.                     END;
  80.     ScrOfs, ScrSeg: WORD;
  81.     i             : INTEGER;
  82.     Fill          : WORD;
  83. BEGIN
  84.   ScrSeg := Page * PageLen + ScreenSegment;
  85.   ScrOfs := 0;
  86.   Feld.h := 32;                              { Leerzeichen }
  87.   Feld.l := Farbe * 16;
  88.   FOR i := 0 TO 2000 DO BEGIN
  89.     Move(Feld.w, Mem[ScrSeg:ScrOfs], 2);
  90.     Inc(ScrOfs, 2);
  91.   END;
  92.   SetCursor(Page, 0, 0);
  93. END;
  94.  
  95. PROCEDURE WriteStrXY(x, y, Page: BYTE; stg: STRING);
  96. VAR ScrSeg, ScrOfs: WORD;
  97.     i             : BYTE;
  98. BEGIN
  99.   ScrSeg := Page * PageLen + ScreenSegment;
  100.   ScrOfs := x * 2 + y * 160;
  101.   FOR i := 1 TO Ord(stg[0]) DO BEGIN
  102.     Move(stg[i], Mem[ScrSeg:ScrOfs], 1);
  103.     Inc(ScrOfs);
  104.     Move(TextAttr, Mem[ScrSeg:ScrOfs], 1);
  105.     Inc(ScrOfs);
  106.   END;
  107.   SetCursor(Page, x + Ord(stg[0]), y);
  108. END;
  109.  
  110. PROCEDURE WriteIntXY(x, y, Page: BYTE;
  111.                      i: INTEGER; len: BYTE);
  112. VAR stg: STRING;
  113. BEGIN
  114.   Str(i:len, stg);
  115.   WriteStrXY(x, y, Page, stg);
  116. END;
  117.  
  118. PROCEDURE WriteRealXY(x, y, Page: BYTE;
  119.                       r: REAL; len, dezi: BYTE);
  120. VAR stg: STRING;
  121. BEGIN
  122.   Str(r:len:dezi, stg);
  123.   WriteStrXY(x, y, Page, stg);
  124. END;
  125.  
  126. PROCEDURE CopyScreen(Source, Dest: BYTE; Wait, Art: WORD);
  127. VAR
  128.   ScrSeg1, ScrSeg2: WORD;       { StArtsegmente von Quell- }
  129.                                 { und Zielseite            }
  130.  
  131.   PROCEDURE Art0;                    { auf einmal anzeigen }
  132.   BEGIN
  133.     Move(Mem[ScrSeg1:0], Mem[ScrSeg2:0], 4096);
  134.   END;
  135.  
  136.   PROCEDURE Art1;                  { spiralförmig anzeigen }
  137.   VAR ScrOfs : WORD;
  138.       i, Step: BYTE;
  139.   BEGIN
  140.     ScrOfs := 1996;
  141.     Move(Mem[ScrSeg1:ScrOfs], Mem[ScrSeg2:ScrOfs], 6);
  142.     Delay(Wait);
  143.     Step := 2;
  144.     REPEAT
  145.       Dec(ScrOfs, 160);
  146.       Move(Mem[ScrSeg1:ScrOfs], Mem[ScrSeg2:ScrOfs], 6);
  147.       Delay(Wait*2 DIV Step);
  148.       FOR i := 1 TO Step - 1 DO BEGIN
  149.         Inc(ScrOfs, 6);
  150.         Move(Mem[ScrSeg1:ScrOfs], Mem[ScrSeg2:ScrOfs], 6);
  151.         Delay(Wait*2 DIV Step);
  152.       END;
  153.       FOR i := 1 TO Step DO BEGIN
  154.         Inc(ScrOfs, 160);
  155.         Move(Mem[ScrSeg1:ScrOfs], Mem[ScrSeg2:ScrOfs], 6);
  156.         Delay(Wait*2 DIV Step);
  157.       END;
  158.       FOR i := 1 TO Step DO BEGIN
  159.         Dec(ScrOfs, 6);
  160.         Move(Mem[ScrSeg1:ScrOfs], Mem[ScrSeg2:ScrOfs], 6);
  161.         Delay(Wait*2 DIV Step);
  162.       END;
  163.       FOR i := 1 TO Step DO BEGIN
  164.         Dec(ScrOfs, 160);
  165.         Move(Mem[ScrSeg1:ScrOfs], Mem[ScrSeg2:ScrOfs], 6);
  166.         Delay(Wait*2 DIV Step);
  167.       END;
  168.       Inc(Step, 2);
  169.     UNTIL Step > 24;
  170.     ScrOfs := 3840;
  171.     FOR i := 0 TO 24 DO BEGIN
  172.       Move(Mem[ScrSeg1:ScrOfs], Mem[ScrSeg2:ScrOfs], 4);
  173.       Delay(Wait*2 DIV Step);
  174.       Dec(ScrOfs, 160);
  175.     END;
  176.     ScrOfs := 154;
  177.     FOR i := 0 TO 24 DO BEGIN
  178.       Move(Mem[ScrSeg1:ScrOfs], Mem[ScrSeg2:ScrOfs], 6);
  179.       Delay(Wait*2 DIV Step);
  180.       Inc(ScrOfs, 160);
  181.     END;
  182.   END;
  183.  
  184.   PROCEDURE Art2;                        { fallende Balken }
  185.   VAR ScrOfs, StArtOfs: WORD;
  186.       Buffer, Old     : ARRAY [0..79] OF WORD;
  187.       y               : BYTE;
  188.   BEGIN
  189.     FOR y := 24 DOWNTO 0 DO BEGIN
  190.       ScrOfs := y * 160;
  191.       Move(Mem[ScrSeg1:ScrOfs], buffer, 160);
  192.       stArtofs := 0;
  193.       Move(Mem[ScrSeg2:stArtofs], old, 160);
  194.       Move(buffer, Mem[ScrSeg2:stArtofs], 160);
  195.       Delay(Wait*16 DIV (y+1));
  196.       WHILE stArtofs < ScrOfs DO BEGIN
  197.         Move(old, Mem[ScrSeg2:stArtofs], 160);
  198.         Inc(stArtofs, 160);
  199.         Move(Mem[ScrSeg2:stArtofs], old, 160);
  200.         Move(buffer, Mem[ScrSeg2:stArtofs], 160);
  201.         Delay(Wait*16 DIV (y+1));
  202.       END;
  203.     END;
  204.   END;
  205.  
  206.   PROCEDURE Art3;                         { runterschieben }
  207.   VAR y: BYTE;
  208.   BEGIN
  209.     FOR y := 24 DOWNTO 0 DO BEGIN
  210.       Move(Mem[ScrSeg1:y*160], Mem[ScrSeg2:0], (25-y)*160);
  211.       Delay(Wait*4);
  212.     END;
  213.   END;
  214.  
  215.   PROCEDURE Art4;                        { schräg aufbauen }
  216.   VAR y, x, Step: BYTE;
  217.       ScrOfs    : WORD;
  218.   BEGIN
  219.     FOR x := 0 TO 79 DO BEGIN
  220.       IF x < 24 THEN Step := x
  221.       ELSE Step := 24;
  222.       FOR y := 0 TO Step DO BEGIN
  223.         ScrOfs := (x - y) * 2 + y * 160;
  224.         Move(Mem[ScrSeg1:ScrOfs], Mem[ScrSeg2:ScrOfs], 2);
  225.       END;
  226.       Delay(Wait);
  227.     END;
  228.     FOR y := 1 TO 24 DO BEGIN
  229.       FOR x := y TO 24 DO BEGIN
  230.         ScrOfs := x * 160 + (79 - x + y) * 2;
  231.         Move(Mem[ScrSeg1:ScrOfs], Mem[ScrSeg2:ScrOfs], 2);
  232.       END;
  233.       Delay(Wait);
  234.     END;
  235.   END;
  236.  
  237.   PROCEDURE Art5;                                { Vorhang }
  238.   VAR y, x, Step      : BYTE;
  239.       ScrOfs1, ScrOfs2: WORD;
  240.   BEGIN
  241.     FOR x := 0 TO 39 DO BEGIN
  242.       ScrOfs1 := (39 - x) * 2;
  243.       ScrOfs2 := 80;
  244.       FOR y := 0 TO 24 DO BEGIN
  245.         Move(Mem[ScrSeg1:ScrOfs1+y*160],
  246.              Mem[ScrSeg2:y*160], (x+1)*2);
  247.         Move(Mem[ScrSeg1:ScrOfs2+y*160],
  248.              Mem[ScrSeg2:158-x*2+y*160], (x+1)*2);
  249.       END;
  250.       Delay(Wait*2);
  251.     END;
  252.   END;
  253.  
  254.   PROCEDURE Art6;                           { Querstreifen }
  255.   VAR y, x, Step      : WORD;
  256.       ScrOfs1, ScrOfs2: WORD;
  257.   BEGIN
  258.     FOR y := 0 TO 24 DO BEGIN
  259.       FOR x := 0 TO 79 DO BEGIN
  260.        ScrOfs1 := x*2+((x+y) MOD 25) * 160;
  261.        Move(Mem[ScrSeg1:ScrOfs1], Mem[ScrSeg2:ScrOfs1], 2);
  262.       END;
  263.       Delay(Wait*4);
  264.     END;
  265.   END;
  266.  
  267.   PROCEDURE Art7;                                 { Zufall }
  268.   VAR y, x, t: BYTE;
  269.       ScrOfs : WORD;
  270.       tst    : ARRAY [0..79] OF SET OF BYTE;
  271.   BEGIN
  272.     FOR y := 0 TO 24 DO BEGIN
  273.       t := 0;
  274.       FOR x := 0 TO 79 DO BEGIN
  275.         IF y = 0 THEN
  276.           tst[x] := [];
  277.         REPEAT
  278.           t := Random(25);
  279.         UNTIL NOT (t IN tst[x]);
  280.         tst[x] := tst[x] + [t];
  281.         ScrOfs := x*2 + t*160;
  282.         Move(Mem[ScrSeg1:ScrOfs], Mem[ScrSeg2:ScrOfs], 2);
  283.       END;
  284.       Delay(Wait*2);
  285.     END;
  286.   END;
  287.  
  288.   PROCEDURE Art8;                          { schräg ziehen }
  289.   VAR y, x            : BYTE;
  290.       ScrOfs1, ScrOfs2: WORD;
  291.   BEGIN
  292.     FOR y := 24 DOWNTO 0 DO BEGIN
  293.       ScrOfs2 := (80-(25-y)*3)*2;
  294.       ScrOfs1 := 0;
  295.       FOR x := y TO 24 DO BEGIN
  296.         Move(Mem[ScrSeg1:ScrOfs1],
  297.              Mem[ScrSeg2:ScrOfs2+(x*160)], (25-y)*6);
  298.         Inc(ScrOfs1, 160);
  299.       END;
  300.       Delay(Wait*4);
  301.     END;
  302.     Move(Mem[ScrSeg1:0], Mem[ScrSeg2:0], 4096);
  303.   END;
  304.  
  305.   PROCEDURE Art9;                      { Gitter horizontal }
  306.   VAR y, x  : BYTE;
  307.       Buffer: ARRAY[0..79] OF WORD;
  308.   BEGIN
  309.     FOR x := 0 TO 79 DO BEGIN
  310.       FOR y := 0 TO 24 DO BEGIN
  311.         IF Odd(y) THEN BEGIN
  312.           Move(Mem[ScrSeg2:y*160],
  313.                Mem[ScrSeg2:y*160+2], 158);
  314.           Move(Mem[ScrSeg1:y*160+158-2*x],
  315.                Mem[ScrSeg2:y*160], 2);
  316.         END ELSE BEGIN
  317.           Move(Mem[ScrSeg2:y*160+2],
  318.                Mem[ScrSeg2:y*160], 158);
  319.           Move(Mem[ScrSeg1:y*160+2*x],
  320.                Mem[ScrSeg2:y*160+158], 2);
  321.         END;
  322.       END;
  323.       Delay(Wait DIV 2);
  324.     END;
  325.   END;
  326.  
  327. BEGIN                                         { CopyScreen }
  328.   ScrSeg1 := Source * PageLen + ScreenSegment;  { Quellseg }
  329.   ScrSeg2 := Dest * PageLen + ScreenSegment;     { Zielseg }
  330.   CASE Art OF
  331.     0: Art0;
  332.     1: Art1;
  333.     2: Art2;
  334.     3: Art3;
  335.     4: Art4;
  336.     5: Art5;
  337.     6: Art6;
  338.     7: Art7;
  339.     8: Art8;
  340.     9: Art9;
  341.   END;
  342. END;
  343. END.
  344. (* ------------------------------------------------------ *)
  345. (*                   Ende von SCREENS.PAS                 *)
  346.