home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1991 / 05 / readme.pas < prev   
Encoding:
Pascal/Delphi Source File  |  1991-03-27  |  9.3 KB  |  373 lines

  1. (* ------------------------------------------------------ *)
  2. (*                     README.PAS                         *)
  3. (*                 Turbo Pascal ab 5.0                    *)
  4. (*                  (c) 1991 TOOLBOX                      *)
  5. (* ------------------------------------------------------ *)
  6. PROGRAM Readme;
  7. {$A+,B-,D-,E-,F-,I-,L-,N-,O-,R-,S-,V-}
  8. {$M 4092,100000,655360}
  9.  
  10. USES Crt, Dos;
  11.  
  12. CONST
  13.   FileName = 'READ.ME';
  14.   MaxLines = 2000;
  15.   LOX = 3;
  16.   LOY = 10;
  17.   RUX = 78;
  18.   RUY = 24;
  19.   LinesOnScreen = RUY - LOY + 1;
  20.   MaxLaenge = RUX - LOX + 8;
  21.   MaxHotKeys = 50;
  22.  
  23. TYPE
  24.   ZeilenString = STRING[MaxLaenge];
  25.   StringZeiger = ^ZeilenString;
  26.   FarbTyp = (Texte, HighLight, DiskLabel, Frame, Header,
  27.              toolbox, Diskette, Invers);
  28.   ScreenRecord = RECORD
  29.                    Ch:  CHAR;
  30.                    Att: BYTE;
  31.                  END;
  32.   ScreenArray = ARRAY [1..25, 1..80] OF ScreenRecord;
  33.   HotKeyRecord = RECORD
  34.                    ch: CHAR;
  35.                    Line: WORD;
  36.                  END;
  37. VAR
  38.   HotKey: ARRAY[1..MaxHotKeys] OF HotKeyRecord;
  39.   ColorScreen: ScreenArray ABSOLUTE $B800:0000;
  40.   MonoScreen:  ScreenArray ABSOLUTE $B000:0000;
  41.   Inhalt: ARRAY[1..MaxLines] OF StringZeiger;
  42.   Label1, Label2: STRING;
  43.   Datei: TEXT;
  44.   AnzLines: WORD;
  45.   Color: BOOLEAN;
  46.  
  47. CONST
  48.   Farben: ARRAY[FALSE..TRUE, Texte..Invers] OF BYTE =
  49. { Mono }  ((7,                           { Texte }
  50.             15,                          { HighLight }
  51.             112,                         { DiskLabel }
  52.             7,                           { Frame }
  53.             7,                           { Header }
  54.             15,                          { toolbox }
  55.             15,                          { Diskette }
  56.             112),                        { Invers }
  57. { Color }  (LightGreen,                  { Texte }
  58.             White,                       { HighLight }
  59.             Magenta SHL 4 OR White,      { DiskLabel }
  60.             Blue,                        { Frame }
  61.             Blue,                        { Header }
  62.             Yellow,                      { toolbox }
  63.             White,                       { Diskette }
  64.             Blue SHL 4));                { Invers }
  65.  
  66. PROCEDURE SchalteCursor(An: BOOLEAN);
  67. VAR
  68.   Reg: REGISTERS;
  69. BEGIN
  70.   WITH Reg DO
  71.   BEGIN
  72.     IF An THEN
  73.       CX:=$A0B
  74.     ELSE
  75.       CX:=$FFFF;
  76.     BX:=0;
  77.     AX:=$0100
  78.   END;
  79.   Intr($10,Reg)
  80. END;
  81.  
  82. PROCEDURE SetColor(Farbe: FarbTyp);
  83. BEGIN
  84.   TextAttr:=Farben[Color, Farbe];
  85. END;
  86.  
  87. PROCEDURE StartUp;
  88. VAR
  89.   R: Registers;
  90. BEGIN
  91.   R.AH:=$0F;
  92.   Intr($10, R);
  93.   Color:=R.AL<>7;
  94.   IF Color THEN
  95.     TextMode(CO80)
  96.   ELSE
  97.     TextMode(BW80);
  98. END;
  99.  
  100. PROCEDURE Effekt;
  101. CONST
  102.   Hoehe = 8;
  103.   LabelX = 67;
  104.   LabelY = 2;
  105.   LabelLength = 9;
  106.   Logo: ARRAY[1..Hoehe] OF STRING[80] =
  107.     ('▓▓▓▓██▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓███▓▓▓███▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┌───────────┐▓▓▓',
  108.      '▓▓▓████▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓██░▓▓▓██░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓│           │░▓▓',
  109.      '▓▓▓▓██░░▓▓▓█████▓▓▓▓█████▓▓▓▓██░▓▓▓██████▓▓▓▓█████▓▓▓██▓▓▓▓██▓▓▓│           │░▓▓',
  110.      '▓▓▓▓██░▓▓▓██░░░██▓▓██░░░██▓▓▓██░▓▓▓██░░░██▓▓██░░░██▓▓▓██▓▓██░░▓▓│     O     │░▓▓',
  111.      '▓▓▓▓██░▓▓▓██░▓▓██░▓██░▓▓██░▓▓██░▓▓▓██░▓▓██░▓██░▓▓██░▓▓▓▓██▓░░▓▓▓│     ║     │░▓▓',
  112.      '▓▓▓▓██░▓▓▓██░▓▓██░▓██░▓▓██░▓▓██░▓▓▓██░▓▓██░▓██░▓▓██░▓▓██▓░██▓▓▓▓│     ║     │░▓▓',
  113.      '▓▓▓▓████▓▓▓█████░░▓▓█████░▓▓████▓▓███████░░▓▓█████░▓▓██░░▓▓██▓▓▓└───────────┘░▓▓',
  114.      '▓▓▓▓▓░░░░▓▓▓░░░░░▓▓▓▓░░░░░▓▓▓░░░░▓▓░░░░░░░▓▓▓▓░░░░░▓▓▓░░▓▓▓▓░░▓▓▓░░░░░░░░░░░░░▓▓');
  115.   Del = 4;
  116. VAR
  117.   x, y, Att: BYTE;
  118.   n, m, o: WORD;
  119.   s: STRING[LabelLength];
  120.   Zeichen: CHAR;
  121.   Reihe: ARRAY[0..Hoehe*80-1] OF WORD;
  122. BEGIN
  123.   ClrScr;
  124.   SetColor(Invers);
  125.   FOR n:=0 TO Hoehe*80-1 DO
  126.     Reihe[n]:=n;
  127.   FOR n:=Hoehe*80-1 DOWNTO 1 DO
  128.   BEGIN
  129.     m:=Random(n)+1;
  130.     o:=Reihe[n];
  131.     Reihe[n]:=Reihe[m];
  132.     Reihe[m]:=o;
  133.   END;
  134.   FOR n:=0 TO Hoehe*80-1 DO
  135.   BEGIN
  136.     x:=Reihe[n] MOD 80+1;
  137.     y:=Reihe[n] DIV 80+1;
  138.     GotoXY(x, y);
  139.     Write(Logo[y][x]);
  140.     Delay(Del);
  141.   END;
  142.   Delay(300);
  143.  
  144.   FOR x:=1 TO 80 DO
  145.   BEGIN
  146.     FOR Y:=1 TO Hoehe DO
  147.     BEGIN
  148.       IF Color THEN
  149.         Zeichen:=ColorScreen[y, x].Ch
  150.       ELSE
  151.         Zeichen:=MonoScreen[y, x].Ch;
  152.       CASE Zeichen OF
  153.         '█': Att:=Farben[Color, toolbox];
  154.         '┐'..'─', '│', '┘', '┌', '║', 'O':
  155.              Att:=Farben[Color, Diskette];
  156.       ELSE
  157.         Att:=Farben[Color, Header];
  158.       END;
  159.       IF Color THEN
  160.         ColorScreen[y, x].Att:=Att
  161.       ELSE
  162.         MonoScreen[y, x].Att:=Att;
  163.     END;
  164.     Delay(2*Del);
  165.   END;
  166.  
  167.   SetColor(DiskLabel);
  168.   FillChar(s, LabelLength+1, #32);
  169.   s[0]:=Chr(LabelLength);
  170.   GotoXY(LabelX, LabelY);
  171.   Write(s);
  172.   GotoXY(LabelX, LabelY);
  173.   Write(Label1);
  174.   GotoXY(LabelX, LabelY+1);
  175.   Write(s);
  176.   GotoXY(LabelX, LabelY+1);
  177.   Write(Label2);
  178.  
  179.   Att:=Farben[Color, Frame];
  180.   FOR n:=Hoehe+1 TO 25 DO
  181.   BEGIN
  182.     FOR x:=1 TO 80 DO
  183.     BEGIN
  184.       IF Odd(x) THEN
  185.         y:=n
  186.       ELSE
  187.         y:=26-n+Hoehe;
  188.       IF Color THEN
  189.         ColorScreen[y, x].ch:=#178
  190.       ELSE
  191.         MonoScreen[y, x].ch:=#178;
  192.       IF Color THEN
  193.         ColorScreen[y, x].Att:=Att
  194.       ELSE
  195.         MonoScreen[y, x].Att:=Att;
  196.     END;
  197.     Delay(Del*8);
  198.   END;
  199. END;
  200.  
  201. PROCEDURE ReadFile;
  202. VAR
  203.   Hot, n: WORD;
  204.   Zeile: STRING[MaxLaenge];
  205. BEGIN
  206.   FOR n:=1 TO MaxHotKeys DO
  207.   BEGIN
  208.     HotKey[n].ch:=#255;
  209.     HotKey[n].Line:=1;
  210.   END;
  211. {$I-}
  212.   Assign(Datei, FileName);
  213.   Reset(Datei);
  214.   IF IOResult<>0 THEN
  215.   BEGIN
  216.     Writeln(^G, 'Konnte die Datei ', FileName,
  217.             ' nicht öffnen - Programmabbruch!');
  218.     Halt;
  219.   END;
  220.   ReadLn(Datei, Label1);
  221.   ReadLn(Datei, Label2);
  222.   n:=1;
  223.   Hot:=1;
  224.   WHILE NOT EOF(Datei) AND (n<=MaxLines) DO
  225.   BEGIN
  226.     New(Inhalt[n]);
  227.     ReadLn(Datei, Zeile);
  228.     IF Copy(Zeile, 1, 2)<>',,' THEN
  229.     BEGIN                       { Hotkey! }
  230.       Inhalt[n]^:=Zeile;
  231.       Inc(n);
  232.     END
  233.     ELSE
  234.     BEGIN
  235.       HotKey[Hot].ch:=UpCase(Zeile[3]);
  236.       HotKey[Hot].Line:=n;
  237.       Inc(Hot);
  238.     END;
  239.   END;
  240.   AnzLines:=Pred(n);
  241.   Close(Datei);
  242. {$I+}
  243. END;
  244.  
  245. PROCEDURE ShowText;
  246. VAR
  247.   Line: INTEGER;
  248.   n, Hot: WORD;
  249.   ch: CHAR;
  250. CONST
  251.   HighLightOn = '⌐';  { ALT 169 }
  252.   HighLightOff = '¬'; { ALT 170 }
  253.  
  254.   PROCEDURE WriteLine(n: BYTE);
  255.   VAR
  256.     i       : BYTE;
  257.     Zeichen : CHAR;
  258.   BEGIN
  259.     TextAttr:=Farben[Color, Texte];
  260.     GotoXY(2, n);
  261.     IF Line + n > AnzLines THEN BEGIN   { Zeile gibt's nicht mehr }
  262.       ClrEol;
  263.       Exit;
  264.     END;
  265.     FOR i := 1 TO Length(Inhalt[Pred(Line + n)]^) DO
  266.     BEGIN
  267.       Zeichen := Inhalt[Pred(Line + n)]^[i];
  268.       CASE Zeichen OF
  269.         HighLightOn:  BEGIN
  270.                         TextAttr := Farben[Color, HighLight];
  271.                       END;
  272.         HighLightOff: BEGIN
  273.                         TextAttr := Farben[Color, Texte];
  274.                       END;
  275.       ELSE
  276.         Write(Zeichen);
  277.       END;
  278.     END;
  279.     ClrEol;
  280.   END;
  281.  
  282.   PROCEDURE TextOnScreen;
  283.   VAR
  284.     n: BYTE;
  285.   BEGIN
  286.     FOR n := 1 TO LinesOnScreen DO
  287.       WriteLine(n);
  288.   END;
  289.  
  290. BEGIN
  291.   Line:=1;
  292.   Window(LOX, LOY, RUX, RUY);
  293.   SetColor(Texte);
  294.   ClrScr;
  295.   TextOnScreen;
  296.   REPEAT
  297.     WHILE KeyPressed DO
  298.       ch := ReadKey;
  299.     ch := ReadKey;
  300.     CASE ch OF
  301.       #0: CASE ReadKey OF
  302.             #72: IF Line > 1 THEN BEGIN
  303.                    GotoXY(1, 1);
  304.                    InsLine;
  305.                    Dec(Line);
  306.                    WriteLine(1);
  307.                    ClrEol;
  308.                  END;
  309.             #80: IF Line < AnzLines - LinesOnScreen + 1 THEN
  310.                  BEGIN
  311.                    GotoXY(1, 1);
  312.                    DelLine;
  313.                    GotoXY(1, LinesOnScreen);
  314.                    Inc(Line);
  315.                    WriteLine(LinesOnScreen);
  316.                    ClrEol;
  317.                  END;
  318.             #73: BEGIN
  319.                    Dec(Line, LinesOnScreen);
  320.                    IF Line < 1 THEN
  321.                      Line := 1;
  322.                    TextOnScreen;
  323.                  END;
  324.             #81: BEGIN
  325.                    Inc(Line, LinesOnScreen);
  326.                    IF Line > AnzLines - LinesOnScreen + 1 THEN
  327.                      Line := AnzLines - LinesOnScreen + 1;
  328.                    TextOnScreen;
  329.                  END;
  330.             #71: BEGIN
  331.                    Line := 1;
  332.                    TextOnScreen;
  333.                  END;
  334.             #79: BEGIN
  335.                    Line := AnzLines - LinesOnScreen + 1;
  336.                    TextOnScreen;
  337.                  END;
  338.           END;
  339.       #27:BEGIN
  340.             Window(1, 1, 80, 25);
  341.             TextMode(LastMode);
  342.             ClrScr;
  343.             SchalteCursor(TRUE);
  344.             Halt;
  345.           END;
  346.     ELSE             { Hotkey gedrückt ? }
  347.       ch:=UpCase(ch);
  348.       Hot:=0;
  349.       REPEAT
  350.         Inc(Hot);
  351.       UNTIL (HotKey[Hot].ch=#255) OR
  352.             (Hot > MaxHotKeys) OR (UpCase(ch) = Hotkey[Hot].ch);
  353.       IF ch = HotKey[Hot].ch THEN BEGIN
  354.         Line := HotKey[Hot].Line;
  355.         TextOnScreen;
  356.       END;
  357.     END;
  358.   UNTIL FALSE;
  359. END;
  360.  
  361. BEGIN
  362.   ClrScr;
  363.   StartUp;
  364.   WriteLn('Lese Datei READ.ME - bitte warten...');
  365.   SchalteCursor(FALSE);
  366.   ReadFile;
  367.   Effekt;
  368.   ShowText;
  369. END.
  370. (* ------------------------------------------------------ *)
  371. (*                Ende von README.PAS                     *)
  372.  
  373.