home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1988 / 10_11 / tricks / textmodi.inc < prev    next >
Encoding:
Text File  |  1988-06-23  |  8.3 KB  |  352 lines

  1. (* ------------------------------------------------------ *)
  2. (*                      TEXTMODI.INC                      *)
  3. (*   Include zur Steuerung der AGA-Karte in den Modi mt,  *)
  4. (*     m25, m44 globale Deklarationen in TEXTMODI.VAR     *)
  5. (*         (c) 1988 by Addi NĂ¼chel und TOOLBOX            *)
  6. (* ------------------------------------------------------ *)
  7.  
  8. PROCEDURE gehezuXY(x,y:BYTE);           { Analog zu GotoXY }
  9. BEGIN
  10.   wox := x;
  11.   woy := y;
  12. END;
  13.  
  14. PROCEDURE scrollauf(a,b:BYTE);
  15. VAR i : BYTE;
  16. BEGIN
  17.   CASE textmodus OF
  18.     mt       : BEGIN
  19.                  FOR i := a TO Pred(b) DO
  20.                  bildschirm_80[i] := bildschirm_80[i+1];
  21.                  bildschirm_80[b] := leerzeile_80;
  22.                END;
  23.     m25, m44 : BEGIN
  24.                  FOR i := a TO Pred(b) DO
  25.                  bildschirm_132[i] := bildschirm_132[i+1];
  26.                  bildschirm_132[b] := leerzeile_132;
  27.                END;
  28.   END;
  29. END;
  30.  
  31. PROCEDURE scrollab(a,b:BYTE);
  32. VAR i : BYTE;
  33. BEGIN
  34.   CASE textmodus OF
  35.     mt       : BEGIN
  36.                  FOR i := b DOWNTO Succ(a) DO
  37.                  bildschirm_80[i] := bildschirm_80[i-1];
  38.                  bildschirm_80[a] := leerzeile_80;
  39.                END;
  40.     m25, m44 : BEGIN
  41.                  FOR i := b DOWNTO Succ(a) DO
  42.                  bildschirm_132[i] := bildschirm_132[i-1];
  43.                  bildschirm_132[a] := leerzeile_132;
  44.                END;
  45.   END;
  46. END;
  47.  
  48. PROCEDURE scrollup;
  49. BEGIN
  50.   IF textmodus = m44 THEN scrollauf(1,44)
  51.   ELSE scrollauf(1,25);
  52. END;
  53.  
  54. PROCEDURE scrolldown;
  55. BEGIN
  56.   IF textmodus = m44 THEN scrollab(1,44)
  57.   ELSE scrollab(1,25);
  58. END;
  59.  
  60. PROCEDURE delzeile;                    { Analog zu DelLine }
  61. BEGIN
  62.   IF textmodus = m44 THEN scrollauf(woy,44)
  63.   ELSE scrollauf(woy,25);
  64. END;
  65.  
  66. PROCEDURE inszeile;                    { Analog zu InsLine }
  67. BEGIN
  68.   IF textmodus = m44 THEN scrollab(woy,44)
  69.   ELSE scrollab(woy,25);
  70. END;
  71.  
  72. PROCEDURE schreib(lstring:longstring);
  73. VAR neu:BYTE;
  74. BEGIN
  75.   CASE textmodus OF
  76.     mt : BEGIN
  77.            FOR neu:=1 TO Length(lstring) DO BEGIN
  78.              Mem[$B000:(woy-1) *160 +(wox-1)*2] :=
  79.                                    Ord(Copy(lstring,neu,1));
  80.              Mem[$B000:(woy-1) *160 +(wox-1)*2+1] := attr;
  81.              wox := Succ(wox);
  82.              IF wox = 81 THEN BEGIN
  83.                wox := 1;
  84.                woy := Succ(woy);
  85.                IF woy = 26 THEN BEGIN
  86.                  scrollup;
  87.                  woy := 25;
  88.                END;
  89.              END;
  90.            END;
  91.          END;
  92.     m25: BEGIN
  93.            FOR neu:=1 TO Length(lstring) DO BEGIN
  94.              Mem[$B000:(woy-1) *264 +(wox-1)*2] :=
  95.                                    Ord(Copy(lstring,neu,1));
  96.              Mem[$B000:(woy-1) *264 +(wox-1)*2+1] := attr;
  97.              wox := Succ(wox);
  98.              IF wox = 133 THEN BEGIN
  99.                wox := 1;
  100.                woy := Succ(woy);
  101.                IF woy = 26 THEN BEGIN
  102.                  scrollup;
  103.                  woy := 25;
  104.                END;
  105.              END;
  106.            END;
  107.          END;
  108.     m44: BEGIN
  109.            FOR neu:=1 TO Length(lstring) DO BEGIN
  110.              Mem[$B000:(woy-1) *264 +(wox-1)*2] :=
  111.                                    Ord(Copy(lstring,neu,1));
  112.              Mem[$B000:(woy-1) *264 +(wox-1)*2+1] := attr;
  113.              wox := Succ(wox);
  114.              IF wox = 133 THEN BEGIN
  115.                wox := 1;
  116.                woy := Succ(woy);
  117.                IF woy = 45 THEN BEGIN
  118.                  scrollup;
  119.                  woy := 44;
  120.                END;
  121.              END;
  122.            END;
  123.          END;
  124.   END;
  125. END;
  126.  
  127. PROCEDURE schreibln(lstring:longstring);
  128. BEGIN
  129.   schreib(lstring);
  130.   wox := 1;
  131.   woy := Succ(woy);
  132.   CASE textmodus OF
  133.     mt, m25 : IF woy = 26 THEN BEGIN
  134.                 scrollup;
  135.                 woy := 25;
  136.               END;
  137.     m44     : IF woy = 45 THEN BEGIN
  138.                 scrollup;
  139.                 woy := 44;
  140.               END;
  141.   END;
  142. END;
  143.  
  144. PROCEDURE cls;
  145. BEGIN
  146.   CASE textmodus OF
  147.     mt : ClrScr;
  148.     m25: FillChar(bildschirm_132,6600,#32);
  149.     m44: FillChar(bildschirm_132,11616,#32);
  150.   END;
  151.   wox := 1; woy := 1;
  152.   attr := 7;
  153.   invers := FALSE;
  154.   hell := FALSE;
  155.   blink := FALSE;
  156. END;
  157.  
  158. PROCEDURE leere_zeilen(a,b:BYTE);
  159. VAR i : BYTE;
  160. BEGIN
  161.   CASE textmodus OF
  162.     mt       : FOR i := a TO b DO
  163.                  bildschirm_80[i] := leerzeile_80;
  164.     m25, m44 : FOR i := a TO b DO
  165.                  bildschirm_132[i] := leerzeile_132;
  166.   END;
  167. END;
  168.  
  169. PROCEDURE clreoz;
  170. VAR i : INTEGER;
  171. BEGIN
  172.   CASE textmodus OF
  173.     mt       : FOR i := Succ(2*Pred(wox)) TO 160 DO
  174.                  bildschirm_80[woy][i] := leerzeile_80[i];
  175.     m25, m44 : FOR i := Succ(2*Pred(wox)) TO 264 DO
  176.                  bildschirm_132[woy][i] := leerzeile_132[i];
  177.   END;
  178. END;
  179.  
  180. PROCEDURE CursorOff;
  181. VAR Regs : RECORD
  182.              ax,bx,cx,dx,bp,si,di,ds,es,flags : INTEGER
  183.            END;
  184. BEGIN
  185.   Regs.ax:=$0100;
  186.   Regs.cx:=$0F00;
  187.   intr($10,Regs);
  188. END;
  189.  
  190. PROCEDURE CursorOn;
  191. VAR Regs : RECORD
  192.              ax,bx,cx,dx,bp,si,di,ds,es,flags : INTEGER
  193.            END;
  194.     Bildschirmmodus : BYTE ABSOLUTE $40:$49;
  195. BEGIN
  196.   Regs.ax:=$0100;
  197.   IF Bildschirmmodus=7 THEN Regs.cx:=$0B0C
  198.   ELSE Regs.cx:=$0607;
  199.   intr($10,Regs);
  200. END;
  201.  
  202. PROCEDURE vset(typ: textmodustyp);
  203.                                { Einstellen der Videokarte }
  204. CONST p949 : ARRAY[mt..m44,0..13] OF BYTE =
  205.  
  206. (($61,$50,$52,$0F,$19,$06,$19,$19,$02,$0D,$0b,$0C,$00,$00),
  207.  ($9a,$84,$8a,$0F,$19,$06,$19,$19,$02,$0D,$06,$07,$00,$00),
  208.  ($9a,$84,$8a,$0F,$2D,$02,$2C,$2C,$02,$07,$06,$07,$00,$00));
  209.  
  210.  { vergleiche PC 10 Advanced Graphics Adapter, Seite 32/33 }
  211.  
  212.       p954 : ARRAY[mt..m44] OF BYTE = (64,8,8);
  213.  
  214. VAR  i : BYTE;
  215.  
  216. BEGIN
  217.   textmodus := typ;
  218.   FOR i := 0 TO 13 DO BEGIN
  219.     Port[948] := i;
  220.     Port[949] := p949[typ,i];
  221.   END;
  222.   Port[954] := p954[typ];
  223.   cls;
  224.   CursorOff;
  225. END;
  226.  
  227. PROCEDURE Init;
  228. VAR i : INTEGER;
  229. BEGIN
  230.   FOR i := 1 TO 159 DO BEGIN
  231.     leerzeile_80[i] := 32;
  232.     i := Succ(i);
  233.     leerzeile_80[i] := 7;
  234.   END;
  235.   FOR i := 1 TO 263 DO BEGIN
  236.     leerzeile_132[i] := 32;
  237.     i := Succ(i);
  238.     leerzeile_132[i] := 7;
  239.   END;
  240.   vset(mt);
  241. END;
  242.  
  243. PROCEDURE normal;
  244. BEGIN
  245.   attr := 7;
  246.   blink := FALSE;
  247.   invers := FALSE;
  248.   hell := FALSE;
  249. END;
  250.  
  251. PROCEDURE inversan;
  252. BEGIN
  253.   IF NOT invers THEN attr := attr+105;
  254.   invers := TRUE;
  255. END;
  256.  
  257. PROCEDURE inversaus;
  258. BEGIN
  259.   IF invers THEN attr := attr-105;
  260.   invers := FALSE;
  261. END;
  262.  
  263. PROCEDURE blinkan;
  264. BEGIN
  265.   IF NOT blink THEN attr := attr+128;
  266.   blink := TRUE;
  267. END;
  268.  
  269. PROCEDURE blinkaus;
  270. BEGIN
  271.   IF blink THEN attr := attr-128;
  272.   blink := FALSE;
  273. END;
  274.  
  275. PROCEDURE hellan;
  276. BEGIN
  277.   IF NOT hell THEN attr := attr+8;
  278.   hell := TRUE;
  279. END;
  280.  
  281. PROCEDURE hellaus;
  282. BEGIN
  283.   IF hell THEN attr := attr-8;
  284.   hell := FALSE;
  285. END;
  286.  
  287. PROCEDURE lies( VAR lstring : longstring;max:BYTE);
  288. VAR ch: CHAR;
  289.     zeichen : SET OF CHAR;
  290.     x : BYTE;
  291.  
  292. BEGIN
  293.   zeichen := [#32..#255];
  294.   lstring:='';
  295.   x := 0;
  296.   CASE textmodus OF
  297.     mt       : IF wox + max > 80 THEN max := 80 - wox;
  298.     m25, m44 : IF wox + max > 132 THEN max := 132 - wox;
  299.   END;
  300.   REPEAT
  301.     IF x < max THEN BEGIN
  302.       blinkan;
  303.       schreib('_');
  304.       wox := wox-1;
  305.       blinkaus;
  306.     END;
  307.     Read(Kbd,ch);
  308.     IF ch IN zeichen THEN BEGIN
  309.       IF x=max THEN Write(#7)
  310.       ELSE BEGIN
  311.         schreib(ch);
  312.         lstring:=lstring+ch;
  313.         x := Succ(x);
  314.       END;
  315.     END;
  316.     IF (ch=^H) THEN BEGIN
  317.       IF x>0 THEN BEGIN
  318.         IF x<max THEN BEGIN
  319.           schreib(' ');
  320.           wox := Pred(wox);
  321.         END;
  322.         x := Pred(x);
  323.         wox := Pred(wox);
  324.         lstring:=Copy(lstring,1,Length(lstring)-1); END
  325.       ELSE Write(#7);
  326.     END;
  327.   UNTIL ch=^M;
  328.   IF x<max THEN BEGIN
  329.     schreib(' ');
  330.     wox := Pred(wox);
  331.   END;
  332. END;
  333.  
  334. PROCEDURE liesln(VAR lstring:longstring; max :BYTE);
  335. BEGIN
  336.   lies(lstring,max);
  337.   wox := 1;
  338.   woy := Succ(woy);
  339.   CASE textmodus OF
  340.     mt, m25 : IF woy = 26 THEN BEGIN
  341.                 scrollup;
  342.                 woy := 25;
  343.               END;
  344.     m44     : IF woy = 45 THEN BEGIN
  345.                 scrollup;
  346.                 woy := 44;
  347.               END;
  348.   END;
  349. END;
  350. (* ------------------------------------------------------ *)
  351. (*                Ende von TEXTMODI.INC                   *)
  352.