home *** CD-ROM | disk | FTP | other *** search
- (* ----------------------------------------------------- *)
- (* ASCII.PAS (v1.0) *)
- (* *)
- (* Eingabe von beliebigen ASCII-Zeichen durch *)
- (* Cursortasten-Anwahl. *)
- (* TSR-Routine unter Turbo Pascal 4.0 *)
- (* *)
- (* (c) 1988 Karsten Gieselmann & PASCAL International *)
- (* *)
- (* ----------------------------------------------------- *)
-
- {$R-,S-,I-,V-,B-} (* größtmögliche Geschwindigkeit! *)
- {$M 1024,0,0} (* wenig Stack, kein Heap! *)
-
- Uses TSR, Crt; (* benötigte Units *)
-
- Type ScreenType = Array [1..25,1..80] of Word;
-
- Const Version = 'ASCII v1.0';
- Hotkey = $6D00;
- (* Aktivierungstaste hier: Alt-F6 *)
- HotkeyName = 'Alt-F6';
- MaxRow = 22; (* Ausmaße der ASCII-Tabelle *)
- MaxCol = 35;
- (* Farbe für.... *)
- Normal = $07; (* ....normale Zeichen *)
- Select = $DF; (* ....das gewählte Zeichen *)
- Help = $1F; (* ....die beiden Infozeilen *)
- Frame = $0F; (* ....den Fensterrahmen *)
-
- Var Code :Byte;
- Table :Array [1..MaxRow,1..MaxCol] of Word;
- Screen :^ScreenType;
- SaveScreen :ScreenType;
- VideoMode :Byte absolute $0040:$0049;
- (* aktueller Videomodus *)
-
-
- (* - baut die ASCII-Tabelle im WORD-ARRAY "Table" auf -- *)
-
- Procedure BuildTable;
-
- Const UpperLeft = #218; Horizontal = #196;
- UpperRight = #191; LowerLeft = #192;
- Vertical = #179; LowerRight = #217;
-
- Upper :String[33] =
- ' Anwahl mit Cursortasten ';
- Lower :String[33] =
- ' Übernahme mit (Ctrl-)Return ';
-
- Var Row,Col :Byte; (* Schleifenvariablen *)
-
-
- Procedure SetTable (Col,Row,Attr :Byte; Code :Char);
-
- (* besetzt die Position <Col,Row> von des WORD-ARRAYs *)
- (* "Table" mit dem Zeichen "Code" in der Hintergrund/ *)
- (* Vordergrundfarbe "Attr" *)
-
- Begin
- Table [Row,Col] := Word(Attr)*256 + Ord(Code)
- End;
-
- Begin (* Rahmen aufbauen *)
- SetTable ( 1, 1, Frame, UpperLeft);
- SetTable (MaxCol, 1, Frame, UpperRight);
- SetTable ( 1,MaxRow, Frame, LowerLeft);
- SetTable (MaxCol,MaxRow, Frame, LowerRight);
- For Col:=2 to MaxCol-1 do Begin
- SetTable (Col, 1, Frame, Horizontal);
- SetTable (Col,MaxRow, Frame, Horizontal);
- SetTable (Col, 2, Help, Upper[Col-1]);
- (* Hilfstexte *)
- SetTable (Col,MaxRow-1, Help, Lower[Col-1]);
- End;
- For Row:=2 to MaxRow-1 do Begin
- SetTable ( 1,Row, Frame, Vertical);
- SetTable (MaxCol,Row, Frame, Vertical);
- End;
- For Row:=3 to MaxRow-2 do (* Tabelleninneres löschen *)
- For Col:=2 to MaxCol-1 do
- SetTable (Col,Row, Normal, ' ');
- For Row:=0 to 15 do (* ASCII-Zeichen eintragen *)
- For Col:=0 to 15 do
- SetTable (Col*2+3, Row+4, Normal, Chr(Row*16+Col));
- End;
-
-
- (* das PopUp-Programm... *)
- (* ... muß im FAR-Modell compiliert werden! ------------ *)
-
- {$F+}
-
- Procedure ASCII_Table;
-
- Const XWin = 46;
- YWin = 1;
- (* linke obere Ecke der ASCII-Tabelle *)
-
- Left = #$CB; Right = #$CD; Up = #$C8;
- Down = #$D0; Home = #$C7; End_ = #$CF;
- PgUp = #$C9; PgDn = #$D1; Return = #$0D;
- CtrlRet = #$0A; Esc = #$1B;
-
- Var Row,Col,Save :Byte;
- Command :Char;
-
- Procedure WriteToKbdBuffer (ScanCode :Word);
-
- (* legt "ScanCode" im DOS-Tastaturpuffer ab *)
-
- Var KbdHead :Word absolute $0040:$001A;
- KbdTail :Word absolute $0040:$001C;
- KbdBuffer :Array [$1E..$3C] of
- Byte absolute $0040:$001E;
-
- Begin
- KbdBuffer[KbdTail] := Lo(ScanCode);
- KbdBuffer[KbdTail+1] := Hi(ScanCode);
- Inc (KbdTail, 2);
- If KbdTail > $003C then
- KbdTail := $001E
- End;
-
- Procedure GetKey (Var Key :Char);
-
- (* holt Tastencode; bei erweiterten Tasten (z.B. *)
- (* Funktions- oder Cursortasten, erster Code ist Null- *)
- (* zeichen) wird das 8.Bit im Code gesetzt; *)
- (* für Turbo 3.0 weicht der Programmtext etwas von dem *)
- (* unteren ab:
-
- Read (Kbd, Key);
- If (Key = Esc) and KeyPressed then
- Begin
- Read (Kbd, Key);
- Key := Chr (Ord(Key) or $80)
- End *)
-
- Begin
- Key := ReadKey;
- If Key = #0 then (* erweiterter Code? *)
- Key := Chr (Ord(ReadKey) or $80)
- End;
-
- Begin (* Bildschirm sichern *)
- Move (Screen^, SaveScreen, SizeOf(ScreenType));
- For Row:=1 to MaxRow do
- Move (Table[Row], Screen^[YWin+Row-1,XWin], MaxCol*2);
- Save := 0;
- Repeat
- Col := XWin + (Code mod 16 + 1)*2;
- Row := YWin + (Code shr 4 + 3);
- Screen^[Row,Col] := Word(Select)*256 + Code;
- (* Zeichen markieren *)
- Save := Code;
- GetKey (Command); (* auf Kommando warten... *)
- Case Command of
- Left: Dec (Code);
- Right: Inc (Code);
- Up: Dec (Code, 16);
- Down: Inc (Code, 16);
- Home: Code := (Code shr 4) shl 4;
- End_: Code := (Code shr 4) shl 4 + 15;
- PgUp: Code := Code mod 16;
- PgDn: Code := Code mod 16 + 240;
- End;
- Screen^[Row,Col] := Word(Normal)*256 + Save;
- until Command in [Esc,Return,CtrlRet];
- If Command = CtrlRet then Begin
- WriteToKbdBuffer (Word (Code));
- WriteToKbdBuffer (Hotkey); End
- else
- If Command = Return then
- WriteToKbdBuffer (Word (Code));
- Move (SaveScreen, Screen^, SizeOf(ScreenType));
- (* Schirm restaurieren *)
- End;
-
- {$F-}
-
- (* --------- der Installationsteil von ASCII ----------- *)
-
- Begin
- If VideoMode = 7 then
- Screen := Ptr ($B000,$0000) (* Monochrome, Hercules *)
- else
- Screen := Ptr ($B800,$0000); (* Farbgrafik-Adapter *)
- BuildTable;
- Code := 224; (* erstes markiertes Zeichen *)
- WriteLn (^M^J, Version, ' installiert,',
- ^M^J'aktivieren mit ', HotKeyName, '.');
- MakeResident (@Ascii_Table , Hotkey)
- End.
- (* ----------------------------------------------------- *)
- (* Ende von ASCII.PAS *)