home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1989 / 08 / grdlagen / speedkey.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1989-05-24  |  6.0 KB  |  157 lines

  1. (* ------------------------------------------------------ *)
  2. (*                    SPEEDKEY.PAS                        *)
  3. (*    Einstellung von Repeatrate und Verzögerungszeit     *)
  4. (*                   bei AT-Tastaturen                    *)
  5. (*        (c) 1989 TOOLBOX & Karsten Gieselmann           *)
  6. (* ------------------------------------------------------ *)
  7. {$R-,S-,I-,V-,B-,N-}    (* größtmögliche Geschwindigkeit! *)
  8. {$M 5120,0,0}                  (* wenig Stack, kein Heap! *)
  9.  
  10. PROGRAM SpeedKey;
  11.  
  12. USES
  13.   TSR, Crt, Dos;
  14.  
  15. CONST
  16.   Version    = 'SPEEDKEY 1.0';
  17.   Hotkey     = $1F00;             (* Code der Aufruftaste *)
  18.   HotkeyName = '<Alt>-S';     (* Aufruftasten-Bezeichnung *)
  19.   RepeatCode : BYTE = 10;     (* globale Variablen für    *)
  20.   DelayCode  : BYTE =  1;     (* Tastatureinstellung      *)
  21.  
  22. VAR
  23.   Regs         : Registers;
  24.   VideoSegment : WORD;
  25.  
  26.   PROCEDURE SetSpeed(DelayCode, RepeatCode : BYTE);
  27.   (* programmiert die Tastatur mit den Werten DelayCode   *)
  28.   (* und RepeatCode                                       *)
  29.   VAR
  30.     Regs : Registers;
  31.   BEGIN
  32.     WITH Regs DO BEGIN
  33.       AH := $03;
  34.       AL := $05;
  35.       BH := DelayCode;
  36.       BL := RepeatCode;
  37.       Intr($16, Regs);
  38.     END;
  39.   END;
  40.  
  41. {$F+}
  42.   PROCEDURE SpeedChoice;
  43.   (* Pop-Up im großen Speichermodell compilieren!         *)
  44. {$F-}
  45.  
  46.   TYPE
  47.     ScreenType  = ARRAY[1..25,1..80] OF WORD;
  48.     DelayRange  = 0.. 3;       (* mögliche Daten-Bereiche *)
  49.     RepeatRange = 0..31;
  50.   CONST
  51.     XPos = 25;  YPos =  9;
  52.                 (* linke obere Ecke des Programm-Fensters *)
  53.     FrameColor  = $0F;         (* Farbe für Fensterrahmen *)
  54.     HeaderColor = $5F;              (* Fensterüberschrift *)
  55.     WindowColor = $07;                    (* Fenstergrund *)
  56.     PickColor   = $0F;               (* Anfangsbuchstaben *)
  57.     DataColor   = $71;                    (* Datenfenster *)
  58.     MenuColor   = $1F;                       (* Menüzeile *)
  59.  
  60.     Frame : ARRAY[1..8] OF STRING[26] = (
  61.            '╒════╡              ╞════╕',
  62.            '│                        │',
  63.            '│                        │',
  64.            '│                        │',
  65.            '│                        │',
  66.            '│                        │',
  67.            '│                        │',
  68.            '╘════════════════════════╛');
  69.  
  70.     DelayStr  : ARRAY[DelayRange] OF STRING[4] = (
  71.              ' 250',' 500',' 750','1000');
  72.  
  73.     RepeatStr : ARRAY[RepeatRange] OF STRING[4] = (
  74.               '30.0','26.7','24.0','21.8','20.0','18.5',
  75.               '17.1','16.0','15.0','13.3','12.0','10.9',
  76.               '10.0',' 9.2',' 8.6',' 8.0',' 7.5',' 6.7',
  77.               ' 6.0',' 5.5',' 5.0',' 4.6',' 4.3',' 4.0',
  78.               ' 3.7',' 3.3',' 3.0',
  79.               ' 2.7',' 2.5',' 2.3',' 2.1',' 2.0');
  80.   VAR
  81.     Screen     : ^ScreenType;
  82.                          (* Zeiger auf Bildschirmspeicher *)
  83.     Buffer     : ScreenType;
  84.                         (* Puffer zur Bildschirmsicherung *)
  85.     PageOffset : WORD ABSOLUTE $0040:$004E;
  86.                        (* Offset der aktuellen Videoseite *)
  87.     k          : BYTE;
  88.     Ch         : CHAR;
  89.  
  90.     PROCEDURE WriteString(Col, Row : BYTE; S : String;
  91.                                            Attr : BYTE);
  92.     (* Ausgabe der Zeichenkette "S" bei (XPos,YPos) in    *)
  93.     (* der Farbe "Attr"                                   *)
  94.     VAR
  95.       Index : BYTE;
  96.     BEGIN
  97.       FOR Index:=1 TO Length(S) DO
  98.         Screen^[Row,Succ(Col)+Index] := Ord(S[Index]) +
  99.                                                  Attr SHL 8;
  100.     END;
  101.  
  102.   BEGIN
  103.     Screen := Ptr(VideoSegment + PageOffset SHR 4, 0);
  104.                                   (* Adresse berechnen... *)
  105.     Move(Screen^, Buffer, SizeOf(Buffer));
  106.                              (* ...und Bildschirm sichern *)
  107.     FOR k:=1 TO 8 DO
  108.       WriteString(XPos, YPos+Pred(k), Frame[k], FrameColor);
  109.     WriteString(XPos+6, YPos, ' '+Version+' ', HeaderColor);
  110.     FOR k:=1 TO 5 DO
  111.       WriteString(XPos+1,YPos+k, '                      ',
  112.                                                WindowColor);
  113.     WriteString(XPos+ 1, YPos+6, '  Dec: d,r   Inc: D,R   ',
  114.                                                  MenuColor);
  115.     WriteString(XPos+ 4, YPos+2, 'D', PickColor);
  116.     WriteString(XPos+ 5, YPos+2, 'elay', WindowColor);
  117.     WriteString(XPos+19, YPos+2, 'ms', WindowColor);
  118.     WriteString(XPos+ 4, YPos+4, 'R', PickColor);
  119.     WriteString(XPos+ 5, YPos+4, 'epeat', WindowColor);
  120.     WriteString(XPos+19, YPos+4, 'cps', WindowColor);
  121.     REPEAT
  122.       SetSpeed(DelayCode, RepeatCode);
  123.       WriteString(XPos+12, YPos+2, ' '+DelayStr[DelayCode]+
  124.                                             ' ', DataColor);
  125.       WriteString(XPos+12, YPos+4, ' '+
  126.                       RepeatStr[RepeatCode]+' ', DataColor);
  127.       Ch := ReadKey;
  128.       CASE CH OF                     (* neue Werte wählen *)
  129.         'd': IF DelayCode  >  0 THEN Dec(DelayCode);
  130.         'D': IF DelayCode  <  3 THEN Inc(DelayCode);
  131.         'r': IF RepeatCode < 31 THEN Inc(RepeatCode);
  132.         'R': IF RepeatCode >  0 THEN Dec(RepeatCode);
  133.       END;
  134.     UNTIL NOT (Ch IN ['d','D','r','R']);
  135.     Move(Buffer, Screen^, SizeOf(Buffer));
  136.                                (* Bildschirm restaurieren *)
  137.   END;
  138.  
  139. BEGIN
  140.   WriteLn(^M^J, Version,
  141.           ^M^J' (c) 1989  TOOLBOX & Karsten Gieselmann'^M^J,
  142.           ^M^J'Programm installiert, aktivieren mit ',
  143.                                             HotkeyName,'.');
  144.   WITH Regs DO BEGIN
  145.     AH := $0F;
  146.     Intr($10, Regs);             (* Bildschirmmodus holen *)
  147.     IF AL = 7 THEN
  148.       VideoSegment := $B000       (* Monochrome, Hercules *)
  149.     ELSE
  150.       VideoSegment := $B800;                (* Farbgrafik *)
  151.   END;
  152.   SetSpeed(DelayCode, RepeatCode);
  153.                                (* Tastatur initialisieren *)
  154.   MakeResident(@SpeedChoice, Hotkey);
  155. END.
  156. (* ------------------------------------------------------ *)
  157. (*                Ende von SPEEDKEY.PAS                   *)