home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------------------------- *)
- (* HYPERKEY.UTL *)
- (* Diverse in HYPERKEY benoetigte Utility-Routinen *)
- (* ------------------------------------------------------------------------- *)
- (* String ins HYPERKEY-Fenster schreiben (direkt ins Video-RAM): *)
- PROCEDURE WriteString (XPos,YPos: BYTE; s: StringType);
- VAR Count :BYTE; Offset,Attr :INTEGER;
- VideoAttribute :BYTE ABSOLUTE DSeg:$0008;
- BEGIN
- Offset := Pred(XPos+XWin) SHL 1 + 160 * Pred(YPos+YWin);
- Attr := VideoAttribute SHL 8;
- FOR Count := 1 TO Length(s) DO BEGIN
- MemW [VideoBuffer:Offset] := Attr + Ord(s[Count]);
- Offset := Succ(Succ(Offset))
- END
- END;
- (* Cursor im Arbeitsfenster positionieren: *)
- PROCEDURE SetCursor (XPos,YPos: BYTE);
- BEGIN GotoXY (XWin+XPos, YWin+YPos) END;
- (* Cursorgroesse veraendern: *)
- PROCEDURE CursorShape (Shape :ShapeType);
- VAR Regs :Regs8088_; EGA :BOOLEAN;
- CONST Mask :ARRAY [0..1,ShapeType] OF INTEGER = (($0007,$0407,$0607),
- ($000D,$070D,$0C0D));
- BEGIN
- WITH Regs DO BEGIN
- AH := $11; AL := $30; BL := $00; CX := $FFFF; Intr (Video, Regs);
- EGA := (CX <> $FFFF); (* ist der Grafikadapter eine EGA-Karte? *)
- AH := $01; CX := Mask [Ord(ScreenMode=Monochrom) + Ord(EGA), Shape];
- Intr (Video, Regs)
- END
- END;
- (* Cursor an/ausschalten, Cursorgroesse bleibt unveraendert: *)
- PROCEDURE Cursor (Mode :CursorMode);
- VAR Regs :Regs8088_;
- BEGIN
- WITH Regs DO BEGIN
- AH := $03; Intr (Video, Regs); (* Cursor-Informationen holen *)
- CASE Mode OF
- on : CH := CH AND $EF; (* Bit 7 loeschen *)
- off: CH := CH OR $10 (* Bit 7 setzen *)
- END;
- AH := $01; Intr (Video, Regs) (* Cursorform wieder wegschreiben *)
- END
- END;
- (* liefert Leerzeichen-String der Laenge "n": *)
- FUNCTION Space (n :BYTE) :StringType;
- VAR s :StringType;
- BEGIN FillChar (s[1], n, 32); s[0] := Chr (n); Space := s END;
- (* liefert "Number" rechtsbuendig als String in einem "Width" breiten Feld: *)
- FUNCTION NumStr (Number :INTEGER; Width :BYTE) :StringType;
- VAR s :StringType;
- BEGIN Str (Number:Width,s); NumStr := s END;
- (* neue Farbkombination bestimmen: *)
- PROCEDURE SetColors (Pen, Paper :INTEGER);
- BEGIN TextColor (Pen); TextBackGround (Paper) END;
- (* Ist ScrollLock aktiv? *)
- FUNCTION ScrollLock :BOOLEAN;
- VAR Regs :Regs8088_;
- BEGIN
- WITH Regs DO BEGIN
- AH := $02; Intr (Old_Kbd, Regs); (* Shift-Status holen *)
- ScrollLock := AL AND $10 <> 0 (* Bit 4 gesetzt? *)
- END
- END;
- (* Tastatur auf internen Code abfragen: *)
- PROCEDURE GetKey (VAR Key :INTEGER);
- VAR Regs :Regs8088_;
- BEGIN
- SetColors (FrameColor, WindowBack);
- WITH Regs DO BEGIN
- REPEAT
- IF ScrollLock THEN WriteString (2,1,'S')
- ELSE WriteString (2,1,' ');
- AH := $01; Intr (Old_Kbd, Regs); (* Puffer-Zustand abfragen *)
- UNTIL Flags AND $40 = 0; (* bis Zeichen vorliegt *)
- AH := $00; Intr (Old_Kbd, Regs); Key := AX (* Zeichen abholen *)
- END
- END;
- (* belegt die durch KeyCode charakterisierte Taste mit dem String "Macro": *)
- PROCEDURE SetKey (KeyCode :INTEGER; Macro :StringType);
- CONST LeadIn = ^['['; (* ANSI-Einleitungs-Sequenz *)
- VAR CodeStr :STRING[6]; Regs :Regs8088_;
- BEGIN
- IF Length(Macro) > 0 THEN BEGIN
- IF Lo(KeyCode) = 0 THEN BEGIN (* erweiterter Code? *)
- Str (Hi(KeyCode), CodeStr); CodeStr := '0;' + CodeStr
- END
- ELSE Str (KeyCode, CodeStr);
- Macro := Concat (LeadIn, CodeStr, ';"', Macro, '"p$');
- WITH Regs DO BEGIN
- AH := $09; DS := Seg (Macro); DX := Succ (Ofs(Macro));
- MsDos (Regs) (* String ueber DOS an ANSI *)
- END
- END
- END;
- (* Umrechnung eines Dezimalbytes nach Hexadezimal: *)
- FUNCTION HexByte (b :BYTE) :StringType;
- CONST HexDigit :ARRAY [0..15] OF CHAR = '0123456789ABCDEF';
- BEGIN HexByte := HexDigit[b SHR 4] + HexDigit[b AND $0F] END;
- (* Umrechnung einer Dezimaladresse nach Hexadezimal: *)
- FUNCTION HexWord (w :INTEGER) :StringType;
- BEGIN HexWord := HexByte (w SHR 8) + HexByte (w AND $FF) END;
- (* gibt die Zeichenkette "s" in der HYPERKEY-Menuezeile aus: *)
- PROCEDURE MenuLine (s :StringType);
- BEGIN
- SetColors (MenuFore, MenuBack); WriteString (1, 12, Space(64));
- WriteString (5, 12, s); SetCursor (5+Length(s), 12)
- END;
- (* Ausgabe einer Fehlermeldung in der Menuezeile: *)
- PROCEDURE ErrorMsg (ErrorNr :BYTE);
- CONST Msg :ARRAY [1..5] OF STRING[52] = (
- 'Nicht mehr genuegend Speicherplatz vorhanden!',
- 'Taste ist schon belegt, bitte andere Taste waehlen!',
- 'HYPERKEY-Aktivierungstaste darf nicht belegt werden!',
- 'Datei befindet sich nicht im aktuellen Verzeichnis!',
- 'Datei existiert bereits, ueberschreiben (J/N) ? ');
- VAR i :BYTE;
- BEGIN
- MenuLine (Msg[ErrorNr]);
- FOR i:=1 TO 3 DO BEGIN
- Sound ( 600); Delay (40); Sound ( 400); Delay (40);
- Sound (1000); Delay (40); Sound ( 400); Delay (40);
- Sound (1200); Delay (40); NoSound; Delay (5)
- END;
- Delay (300)
- END;
- (* ------------------------------------------------------------------------- *)
- (* HYPERKEY.UTL *)