home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1991 / 07_08 / tricks / readme.pas < prev    next >
Pascal/Delphi Source File  |  1990-08-07  |  9KB  |  361 lines

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