home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
1991
/
02
/
ldm
/
spion.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1990-11-12
|
27KB
|
835 lines
(* ------------------------------------------------------ *)
(* SPION.PAS *)
(* Residenter Speichermonitor *)
(* Turbo Pascal 5.5 *)
(* (c) 1991 Achim Stindt & toolbox *)
(* ------------------------------------------------------ *)
{$R-,S-,I-,V-,B-,N-,D-,F+,L-}
{$M 16384, 0, 655360}
PROGRAM Spy;
USES
Crt, Dos, TSR;
CONST
Name = 'Spion';
SpyID = 22;
HotKey = $6800;
HotKeyName = 'Alt-F1';
PROCEDURE Monitor; { Hauptprozedur Speichermonitor }
CONST
Title : ARRAY[0 .. 5, 0 .. 5] OF STRING[10] = { Menüs }
((' Ende ', ' Zurück ', '',
'', '', ''),
(' Edit ', ' Hex-Edit ', ' Asc-Edit ',
'', '', ''),
(' Adresse ', ' Segment ', ' Offset ',
'', '', ''),
(' Rechnen ', ' Dez->Hex ', ' Hex->Dez ',
' Addieren ', ' Subtrah. ', ''),
(' Finden ', ' Such Hex ', ' Such Asc ',
'', '', ''),
(' Diskette ', ' Laden ', ' Sichern ',
'', '', ''));
YellowOnRed = 256 * (Red * 16 + Yellow);
BlueOnWhite = 256 * (LightGray * 16 + Blue);
GrayOnBlack = 256 * LightGray;
TYPE
ScreenType = ARRAY[0 .. 24, 0 .. 79] OF WORD;
StMax = STRING[255]; { längstmöglicher String }
VAR
LastX, LastY, i, j, x, y, MenuX, MenuY : INTEGER;
DeIn, UpDa, InEd, NewKey, NoRead, Ende : BOOLEAN;
Key : CHAR;
Segment, Offset : WORD;
p : ARRAY[0..15, 0..15] OF BYTE;
Search : StMax;
Buffer : ARRAY[0..24, 0..79] OF WORD;
MenuBuffer : ARRAY[0..4, 0..79] OF WORD;
ColorScreen : BYTE ABSOLUTE $B800:$0000;
MonoScreen : BYTE ABSOLUTE $B000:$0000;
Regs : Registers;
Screen : ^ScreenType;
FUNCTION GetKey : CHAR; { Taste lesen }
BEGIN
IF NewKey THEN GetKey := ReadKey
ELSE BEGIN
GetKey := Key; NewKey := TRUE;
END;
END; { GetKey }
PROCEDURE WriteAsc(x, y, Value : WORD);
BEGIN { ASCII-Zeichen auf Screen }
IF (Value >= 32) AND (Value <= 127) THEN
Screen^[y, x] := Value + YellowOnRed { darstellbar }
ELSE
Screen^[y, x] := Ord('.') + YellowOnRed; { Punkt }
GotoXY(x + 2, y + 1);
END; { WriteAsc }
PROCEDURE WriteHex(x, y, Value, dgt : WORD);
VAR { Hex-Zahlen umrechnen und anzeigen }
mdl, Digit : WORD;
BEGIN
Digit := dgt;
WHILE Digit > 0 DO BEGIN
mdl := Value MOD 16;
IF mdl < 10 THEN
Screen^[y, x + Digit - 1] :=
mdl + Ord('0') + YellowOnRed
ELSE
Screen^[y, x + Digit - 1] :=
mdl - 10 + Ord('A') + YellowOnRed;
Value := Value DIV 16;
Dec(Digit);
END;
GotoXY(x + dgt + 1, y + 1);
END; { WriteHex }
FUNCTION ReadHex(x, y, dgt : INTEGER) : WORD;
VAR { Tastatureingabe einer Hexadezimalzahl }
Value, Digit : WORD;
Key : CHAR;
BEGIN
FOR Digit := 0 TO dgt - 1 DO
WriteAsc(x + Digit, y, Ord('-'));
GotoXY(x + 1 , y + 1);
Digit := dgt;
Value := 0;
IF NOT NoRead THEN REPEAT
Key := UpCase(GetKey);
CASE Key OF
#13 : BEGIN { <Return> }
WriteHex(x, y, Value, dgt);
Digit := 0;
END;
'0'..'9' : BEGIN { Ziffern }
Screen^[y, x + dgt - Digit] :=
Ord(Key) + YellowOnRed;
Value :=
Value * 16 + Ord(Key) - Ord('0');
Dec(Digit);
GotoXY(x + dgt - Digit + 1, y + 1);
END;
'A'..'F' : BEGIN { <A> bis <F> }
Screen^[y, x + dgt - Digit] :=
Ord(Key) + YellowOnRed;
Value := Value * 16 + Ord(Key) - 55;
Dec(Digit);
GotoXY(x + dgt - Digit + 1, y + 1);
END;
#8 : IF Digit < dgt THEN BEGIN
Inc(Digit); { <BackSpace> }
Screen^[y, x + dgt - Digit] :=
Ord('-') + YellowOnRed;
GotoXY(x + dgt - Digit + 1, y + 1);
Value := Value DIV 16;
END;
#27 : BEGIN { <Escape> }
NoRead := TRUE; Digit := 0;
END;
END; { CASE }
UNTIL Digit = 0;
ReadHex := Value;
END; { ReadHex }
PROCEDURE ClrTri; { Infofenster löschen }
VAR
i, j : INTEGER;
BEGIN
FOR i := 20 TO 22 DO
FOR j := 2 TO 77 DO Screen^[i, j] := 32 + YellowOnRed;
END; { ClrTri }
PROCEDURE Page; { Speicherseite auf Bildschirm ausgeben }
VAR
y, x, i, j : INTEGER;
BEGIN
TextColor(Yellow); TextBackground(Red);
FOR y := 0 TO 15 DO BEGIN
WriteHex(2, 2 + y, Segment, 4);
WriteAsc(6, 2 + y, Ord(':'));
WriteHex(7, 2 + y, Offset + y * 16, 4);
WriteAsc(11, 2 + y, 32);
WriteAsc(12, 2 + y, 32);
WriteAsc(61, 2 + y, 32);
FOR x := 0 TO 15 DO BEGIN { Speicher auslesen }
p[y, x] := Mem[Segment : Offset + y * 16 + x];
WriteHex(13 + 3 * x, 2 + y, p[y, x], 2);
WriteAsc(13 + 3 * x + 2, 2 + y, 32);
WriteAsc(62 + x, 2 + y, p[y, x]);
END;
END;
IF NOT InEd THEN BEGIN
TextColor(Black); TextBackground(LightGray);
FOR i := 2 TO 4 DO
FOR j := 0 TO 79 DO
MenuBuffer[i, j] := Screen^[i, j];
FOR i := 2 TO 4 DO BEGIN
FOR j := 0 TO 79 DO
MenuBuffer[i, j] := Screen^[i, j];
GotoXY(10 * MenuX + 1, 1 + i);
IF Title[MenuX, i] <> '' THEN
Write(Title[MenuX, i]);
END;
END;
END; { Page }
FUNCTION Change : BOOLEAN;
VAR { Änderungen in Speicher schreiben }
x, y : WORD;
OK : BOOLEAN;
c : CHAR;
BEGIN
IF NOT UpDa THEN BEGIN
ClrTri;
GotoXY(25, 21);
Write('Soll geänderter Text wirklich ');
GotoXY(25, 22);
Write('geschrieben werden ? (J/N)');
REPEAT
c := ReadKey
UNTIL UpCase(c) IN ['J', 'N', 'Y', #13];
ClrTri;
IF UpCase(c) <> 'N' THEN BEGIN
OK := TRUE;
FOR y := 0 TO 15 DO BEGIN { Puffer in Speicher }
FOR x := 0 TO 15 DO BEGIN { schreiben }
Mem[Segment : Offset + y * 16 + x] := p[y, x];
IF Mem[Segment : Offset + y * 16 + x] <>
p[y, x] THEN
OK := FALSE;
END;
END;
IF NOT OK THEN BEGIN
ClrTri;
GotoXY(20, 22);
Write('Achtung! Geänderter Text läßt ');
Write('sich nicht zurückschreiben!');
END;
Change := OK;
END ELSE
OK := FALSE;
IF NOT OK THEN BEGIN
FOR y := 0 TO 15 DO BEGIN
FOR x := 0 TO 15 DO BEGIN
p[y, x] := Mem[Segment : Offset + y * 16 + x];
END;
END;
Page;
END;
UpDa := TRUE;
END;
END; { Change }
PROCEDURE Edit(Hex : BOOLEAN); { Speicher editieren }
VAR
i, j, Value : INTEGER;
Accept : BOOLEAN;
BEGIN
InEd := TRUE;
FOR i := 0 TO 4 DO
FOR j := 0 TO 79 DO Screen^[i, j] := MenuBuffer[i, j];
REPEAT
IF Hex THEN BEGIN
Screen^[2 + y, 13 + x * 3] :=
(Screen^[2 + y, 13 + x * 3] AND $FF) + BlueOnWhite;
Screen^[2 + y, 13 + x * 3 + 1] :=
(Screen^[2 + y, 13 + x * 3 + 1] AND $FF)
+ BlueOnWhite;
GotoXY(13 + 3 * x + 1, 2 + y + 1);
END ELSE BEGIN
Screen^[2 + y, 62 + x] :=
(Screen^[2 + y, 62 + x] AND $FF) + BlueOnWhite;
GotoXY(62 + x + 1, 2 + y + 1);
END;
REPEAT UNTIL KeyPressed;
IF Hex THEN BEGIN
Screen^[2 + y, 13 + x * 3] :=
(Screen^[2 + y, 13 + x * 3] AND $FF) +
YellowOnRed;
Screen^[2 + y, 13 + x * 3 + 1] :=
(Screen^[2 + y, 13 + x * 3 + 1] AND $FF) +
YellowOnRed;
END ELSE
Screen^[2 + y, 62 + x] :=
(Screen^[2 + y, 62 + x] AND $FF) + YellowOnRed;
NoRead := FALSE;
Key := GetKey;
IF Key = #0 THEN BEGIN
Key := GetKey;
CASE Key OF
#72 : IF y > 0 THEN Dec(y) { <hoch> }
ELSE BEGIN
IF Change THEN BEGIN
IF Offset > 16 THEN Dec(Offset, 16)
ELSE Offset := 0;
Page;
END;
END;
#73 : IF Change THEN BEGIN { <PgUp> }
IF Offset >= 256 THEN
Dec(Offset, 256)
ELSE BEGIN
Offset := 0; x := 0; y := 0;
END;
Page;
END;
#75 : IF x > 0 THEN Dec(x) { <links> }
ELSE BEGIN
x := 15;
IF y > 0 THEN Dec(y)
ELSE
IF Change THEN BEGIN
IF Offset >= 16 THEN Dec(Offset, 16)
ELSE Offset := 0;
Page;
END;
END;
#77 : IF x < 15 THEN Inc(x) { <rechts> }
ELSE BEGIN
x := 0;
IF y < 15 THEN Inc(y)
ELSE
IF Change THEN BEGIN
IF Offset <= $FF00 - 16 THEN
Inc(Offset, 16)
ELSE
Offset := $FF00;
Page;
END;
END;
#80 : IF y < 15 THEN Inc(y) { <runter> }
ELSE
IF Change THEN BEGIN
IF Offset <= $FF00 - 16 THEN
Inc(Offset, 16)
ELSE
Offset := $FF00;
Page;
END;
#81 : IF Change THEN BEGIN { <PgDn> }
IF Offset <= $FF00 - 256 THEN
Inc(Offset, 256)
ELSE BEGIN
Offset := $FF00;
x := 0; y := 0;
END;
Page;
END;
END; { CASE }
END ELSE BEGIN
Accept := FALSE;
IF Hex THEN BEGIN
IF UpCase(Key) IN ['0'..'9', 'A'..'F'] THEN BEGIN
NewKey := FALSE;
Value := ReadHex(13 + 3 * x, 2 + y, 2);
Accept := TRUE;
END
END ELSE
IF Key IN [#32..#255] THEN BEGIN
NewKey := FALSE;
Value := Ord(GetKey);
Accept := TRUE;
END;
IF Accept THEN BEGIN
UpDa := FALSE;
p[y, x] := Value;
WriteHex(13 + 3 * x, 2 + y, p[y, x], 2);
WriteAsc(62 + x, 2 + y, p[y, x]);
IF x < 15 THEN Inc(x)
ELSE BEGIN
x := 0;
IF y < 15 THEN Inc(y)
ELSE
IF Change THEN BEGIN
IF Offset <= $FF00 - 16 THEN Inc(Offset, 16)
ELSE Offset := $FF00;
Page;
END;
END;
END;
IF Key = #9 THEN Hex := NOT Hex;
IF Key = #13 THEN BEGIN
x := 0;
IF y < 15 THEN Inc(y) ELSE
IF Change THEN BEGIN
IF Offset <= $FF00 -16 THEN Inc(Offset, 16)
ELSE Offset := $FF00;
Page;
END;
END;
END;
UNTIL Key = #27;
TextColor(Black);
TextBackground(LightGray);
FOR i := 0 TO 4 DO BEGIN
FOR j := 0 TO 79 DO
MenuBuffer[i, j] := Screen^[i, j];
GotoXY(10 * MenuX + 1, 1 + i);
IF Title[MenuX, i] <> '' THEN
Write(Title[MenuX, i]);
END;
InEd := FALSE;
END; { Edit }
PROCEDURE ReadString(VAR s : StMax;
x, y, Width : INTEGER);
VAR { Stringeingabe mit Tastatur }
c : CHAR;
BEGIN
i := 0;
s := '';
REPEAT
GotoXY(x + 1, y + 1); Write('"' + s + '" ');
GotoXY(x + Ord(s[0]) + 2, y + 1);
c := ReadKey;
IF (c IN [#32 .. #127]) AND (i < Width) THEN BEGIN
s[Ord(s[0]) + 1] := c;
Inc(s[0]);
END;
IF c = #8 THEN
IF s[0] > #0 THEN Dec(s[0]);
IF c = #27 THEN BEGIN
s := ''; c := #13;
END;
UNTIL c = #13;
END; { ReadString }
PROCEDURE Adress(Segm : BOOLEAN); { Adresseingabe }
BEGIN
TextColor(Yellow);
TextBackground(Red);
NoRead := FALSE;
IF Segm THEN Segment := ReadHex(2, 2, 4)
ELSE Offset := ReadHex(7, 2, 4);
Page;
END; { Adress }
PROCEDURE Rechnen(Conv, Foo : BOOLEAN); { Berechnungen }
VAR
o, s, s1, o1, s2, o2, a, i : WORD;
l : LONGINT;
c : CHAR;
BEGIN
NoRead := FALSE;
ClrTri;
IF Conv THEN BEGIN
IF Foo THEN BEGIN
GotoXY(35, 22); Write('-----d = ----h');
i := 5; a := 0;
WHILE (i > 0) DO BEGIN
GotoXY(35 + 5 - i, 22);
c := ReadKey;
CASE c OF
'0' .. '9' : BEGIN { Ziffern }
a := 10 * a + Ord(c) - Ord('0');
Write(c);
Dec(i);
END;
#13 : BEGIN { <Return> }
GotoXY(35, 22); Write(a:5);
i := 0;
END;
#8 : IF i > 0 THEN BEGIN { <BackSpace> }
a := a DIV 10;
Inc(i);
GotoXY(35 + 5 - i, 22);
Write('-');
END;
#27 : BEGIN { <Escape> }
NoRead := TRUE;
i := 0;
END;
END; { CASE }
END;
WriteHex(43, 21, a, 4);
END ELSE BEGIN
GotoXY(35, 22);
Write('----h = -----d');
a := ReadHex(34, 21, 4);
IF NOT NoRead THEN BEGIN
GotoXY(43, 22); Write(a:5);
END;
END;
END ELSE BEGIN
GotoXY(35, 21); Write(' ----:---- ');
GotoXY(34, 22);
IF Foo THEN Write('+')
ELSE Write('-');
Write(' ----:---- ');
GotoXY(35, 23); Write(' ----:---- ');
s1 := ReadHex(35, 20, 4); o1 := ReadHex(40, 20, 4);
s2 := ReadHex(35, 21, 4); o2 := ReadHex(40, 21, 4);
IF Foo THEN BEGIN
s := s1 + s2;
l := LONGINT(o1) + LONGINT(o2);
IF l > $FFFF THEN
s := s + $1000;
o := l;
END ELSE BEGIN
s := s1 - s2; l := o1 - o2;
IF o1 < o2 THEN
s := s - $1000;
END;
WriteHex(35, 20, s1, 4);
WriteHex(40, 20, o1, 4);
WriteHex(35, 21, s2, 4);
WriteHex(40, 21, o2, 4);
WriteHex(35, 22, s, 4);
WriteHex(40, 22, o, 4);
END;
IF NoRead THEN BEGIN
NoRead := FALSE;
ClrTri;
END;
END; { Rechnen }
PROCEDURE Finden(Hex : BOOLEAN); { Suchen }
VAR
d : CHAR;
s : StMax;
ex0, ex1 : BOOLEAN;
ss, so : WORD;
i, l, j, x, z : INTEGER;
BEGIN
NoRead := FALSE;
ClrTri;
IF Hex = TRUE THEN BEGIN
GotoXY(28, 21); Write('Bitte Hex-String eingeben');
GotoXY(20, 22);
i := 0;
ex0 := FALSE;
REPEAT
d := UpCase(ReadKey);
IF (d IN ['0'..'9','A'..'F']) AND (i < 250) THEN
BEGIN
s[i + 2] := d;
Inc(i);
END;
IF (d = #8) AND (i > 0) THEN BEGIN
Dec(i);
GotoXY(20, 22); Write(' ':40);
END;
GotoXY(20, 22);
IF i < 26 THEN BEGIN
x := 0; z := i;
END ELSE BEGIN
x := i - 24; z := x + 24;
Write('>> ');
END;
FOR l := x TO z - 1 DO BEGIN
Write(s[l + 2]);
IF l MOD 2 = 1 THEN
Write(#32);
END;
IF d = #27 THEN BEGIN
NoRead := TRUE;
ClrTri;
END;
UNTIL ((d = #13) AND (i MOD 2 = 0)) OR NoRead;
s[0] := Chr(i DIV 2);
FOR l := 0 TO i DO BEGIN
IF s[l + 2] <= '9' THEN
d := Chr (Ord(s[l + 2]) - Ord('0'))
ELSE
d := Chr(Ord(s[l + 2]) - 55);
s[l DIV 2 + 1] := Chr(((Ord(s[l DIV 2 + 1]) SHL 4)
AND $F0) + Ord(d));
END;
END ELSE BEGIN
GotoXY(27, 21); Write(' Bitte ASCII-String eingeben');
GotoXY(20, 22);
i := 0;
REPEAT
d := ReadKey;
IF d IN [#32..#255] THEN BEGIN
Inc(i);
s[i] := d;
END;
IF (d = #8) AND (i > 0) THEN BEGIN
Dec(i);
GotoXY(20, 22); Write(' ':40);
END;
GotoXY(24, 22);
IF i < 32 THEN BEGIN
FOR l := 1 TO i DO Write(s[l])
END ELSE BEGIN
Write('>> ');
FOR l := i - 28 TO i DO Write(s[l]);
END;
IF d = #27 THEN BEGIN
NoRead := TRUE;
ClrTri;
END;
UNTIL (d = #13) OR NoRead;
s[0] := Chr(i);
END;
IF NOT NoRead THEN BEGIN
FOR i := 1 TO Ord(s[0]) DO Inc(s[i]);
IF s = '' THEN s := Search
ELSE Search := s;
l := Ord(s[0]);
GotoXY(20, 22); Write(' ':40);
IF s[0] < #20 THEN i := Ord(s[0])
ELSE i := 20;
x := 40 - (26 + i) DIV 2;
GotoXY(x, 21); Write('Suche ab ----:---- nach "');
FOR i := 1 TO i DO
IF s[i] > #32 THEN Write(Pred(s[i]))
ELSE Write('.');
IF s[0] > #20 THEN Write(' >>');
Write('"');
ss := Segment; so := Offset + 1;
i := 0;
ex0 := FALSE; ex1 := TRUE;
REPEAT
IF i = 0 THEN BEGIN
WriteHex(x + 8, 20, ss, 4);
WriteHex(x + 13, 20, so, 4);
i := 1024;
END;
i := Pred(i);
ex0 := TRUE;
FOR j := 0 TO Pred(l) DO
CASE Hex OF
TRUE : IF Pred(s [Succ(j)]) <>
Chr(Mem[ss : so + j]) THEN BEGIN
ex0 := FALSE;
j := Pred(l);
END;
FALSE : IF UpCase(Pred(s[Succ(j)])) <>
UpCase(Chr(Mem[ss : so + j])) THEN
BEGIN
ex0 := FALSE;
j := Pred(l);
END;
END; { CASE }
IF NOT ex0 THEN
IF so < $8040 THEN so := Succ(so)
ELSE BEGIN
ss := ss + $800; so := 0;
END;
UNTIL ex0 OR KeyPressed;
IF KeyPressed THEN d := ReadKey;
IF ex0 THEN BEGIN
Segment := ss; Offset := so;
ClrTri;
GotoXY(30, 23); Write('Gefunden an ----:----');
WriteHex(41, 22, ss, 4); WriteHex(46, 22, so, 4);
END;
Page;
END;
END; { Finden }
PROCEDURE Disk(Save : BOOLEAN);
VAR { Diskettenein- und Ausgabe }
Fn : StMax;
Lock : FILE OF BYTE;
j : INTEGER;
Of1, Of2 : WORD;
b : BYTE;
BEGIN
NoRead := FALSE;
ClrTri;
REPEAT
GotoXY(28, 21);
IF Save = TRUE THEN Write('Sichern ab ----:----')
ELSE Write(' Laden an ----:----');
GotoXY(36, 22); Write('bis ----:----');
GotoXY(28, 23); Write('mit Namen ""');
WriteHex(40, 20, Segment, 4);
WriteHex(40, 21, Segment, 4);
Of1 := ReadHex(45, 20, 4); Of2 := ReadHex(45, 21, 4);
UNTIL (Of1 <= Of2) OR NoRead;
IF NOT NoRead THEN BEGIN
ReadString(Fn, 37, 22, 20);
IF Fn <> '' THEN BEGIN
Assign(Lock, Fn);
IF Save THEN ReWrite(Lock)
ELSE Reset(Lock);
IF IOResult = 0 THEN BEGIN
IF Save THEN BEGIN
FOR j := Of1 TO Of2 DO
Write(Lock, Mem[Segment : j]);
Close(Lock);
GotoXY(60, 23); Write('gesichert');
END ELSE BEGIN
Read(Lock, b);
j := Of1;
WHILE (NOT EoF(Lock)) AND (j <= Of2) DO BEGIN
Mem[Segment:j] := b;
Inc(j);
Read(Lock, b);
END;
Page;
GotoXY(60, 23); Write('geladen');
IF (NOT EoF(Lock)) AND (j = Of2) THEN BEGIN
GotoXY(60, 22); Write('Datei zu lang');
END;
END;
END ELSE BEGIN
ClrTri;
GotoXY(30, 21); Write('Unzulässiger Dateiname');
END;
END ELSE
ClrTri;
END;
IF NoRead THEN BEGIN
NoRead := FALSE; ClrTri;
END;
END; { Disk }
PROCEDURE Horizon(Right : BOOLEAN); { Menüleiste }
VAR
i, j : INTEGER;
BEGIN
TextColor(Black); TextBackground(LightGray);
FOR i := 0 TO 4 DO
FOR j := 0 TO 79 DO Screen^[i, j] := MenuBuffer[i, j];
IF Right THEN BEGIN { rechts }
Inc(MenuX);
IF MenuX = 6 THEN MenuX := 0;
END ELSE BEGIN { links }
IF MenuX = 0 THEN MenuX := 6;
Dec(MenuX);
END;
MenuY := 0;
FOR i := 0 TO 4 DO BEGIN
FOR j := 0 TO 79 DO
MenuBuffer[i, j] := Screen^[i, j];
GotoXY(10 * MenuX + 1, 1 + i);
Write(Title[MenuX, i]);
END;
END; { Horizon }
PROCEDURE CursorOn;
BEGIN
INLINE($B4/$01/$B9/$13/$12/$CD/$10);
END;
PROCEDURE CursorOff;
BEGIN
INLINE($B4/$01/$B9/$FF/$FF/$CD/$10);
END;
BEGIN { Monitor }
IF LastMode = Mono THEN Screen := @MonoScreen
ELSE Screen := @ColorScreen;
LastX := WhereX; LastY := WhereY; { Cursorpos. merken }
FOR i := 0 TO 24 DO
FOR j := 0 TO 79 DO Buffer[i, j] := Screen^[i, j];
TextMode(CO80);
FOR i := 0 TO 24 DO
FOR j := 0 TO 79 DO Screen^[i, j] := 178 + GrayOnBlack;
GotoXY(1, 1);
TextColor(Black); TextBackground(LightGray);
FOR i := 0 TO 5 DO Write(Title[i, 0]);
Write(' ':20);
MenuX := 0; MenuY := 0;
InEd := TRUE;
Offset := 0; Segment := 0;
Page;
ClrTri;
IF LastMode <> Mono THEN BEGIN
FOR i := 3 TO 78 DO Screen^[18, i] := 32 + Black;
FOR i := 3 TO 17 DO Screen^[i, 78] := 32 + Black;
FOR i := 3 TO 78 DO Screen^[23, i] := 32 + Black;
FOR i := 21 TO 22 DO Screen^[i, 78] := 32 + Black;
END;
FOR i := 0 TO 4 DO
FOR j := 0 TO 79 DO MenuBuffer[i, j] := Screen^[i, j];
MenuX := 0; MenuY := 0;
TextColor(Yellow); TextBackground(Blue);
GotoXY(1, 1); Write(Title[0, 0]);
TextColor(Black); TextBackground(LightGray);
GotoXY(1, 2); Write(Title[0, 1]);
GotoXY(1, 3); Write(Title[0, 2]);
x := 0; y := 0;
Ende := FALSE; NewKey := TRUE;
NoRead := FALSE; InEd := FALSE; UpDa := TRUE;
Search := '@@@@@';
REPEAT
CursorOff;
REPEAT UNTIL KeyPressed;
GotoXY(10 * MenuX + 1, 1 + MenuY);
TextColor(Black); TextBackground(LightGray);
Write(Title[MenuX, MenuY]);
TextColor(Yellow); TextBackground(Red);
CursorOn;
Key := GetKey;
IF Key = #0 THEN Key := GetKey;
CASE Key OF
#32, #9, #77 : Horizon(TRUE);
#8, #75 : Horizon(FALSE);
#72 : IF MenuY > 0 THEN Dec(MenuY);
#80 : IF Title[MenuX, MenuY + 1] <> '' THEN
Inc(MenuY);
#13 : BEGIN
IF (MenuX = 0) AND (MenuY = 1) THEN
BEGIN { Ende }
Ende := TRUE; DeIn := FALSE;
END;
IF (MenuX = 1) AND (MenuY = 1) THEN
Edit(TRUE); { Hex-Edit }
IF (MenuX = 1) AND (MenuY = 2) THEN
Edit(FALSE); { ASCII-Edit }
IF (MenuX = 2) AND (MenuY = 1) THEN
Adress(TRUE); { Segment-Adresse }
IF (MenuX = 2) AND (MenuY = 2) THEN
Adress(FALSE); { Offset-Adresse }
IF (MenuX = 3) AND (MenuY = 1) THEN
Rechnen(TRUE, TRUE); { Dez->Hex }
IF (MenuX = 3) AND (MenuY = 2) THEN
Rechnen(TRUE, FALSE); { Hex->Dez }
IF (MenuX = 3) AND (MenuY = 3) THEN
Rechnen(FALSE, TRUE); { Addieren }
IF (MenuX = 3) AND (MenuY = 4) THEN
Rechnen(FALSE, FALSE); { Subtr. }
IF (MenuX = 4) AND (MenuY = 1) THEN
Finden(TRUE); { Suche Hex }
IF (MenuX = 4) AND (MenuY = 2) THEN
Finden(FALSE); { Suche ASCII }
IF (MenuX = 5) AND (MenuY = 1) THEN
Disk(FALSE); { Disk Load }
IF (MenuX = 5) AND (MenuY = 2) THEN
Disk(TRUE); { Disk Save }
END;
END; { CASE }
GotoXY(10 * MenuX + 1, 1 + MenuY);
TextColor(Yellow); TextBackground(Blue);
Write(Title[MenuX, MenuY]);
GotoXY(10 * MenuX + 2, 1 + MenuY);
UNTIL Ende = TRUE;
TextMode(LastMode);
FOR i := 0 TO 24 DO { Screen restaurieren }
FOR j := 0 TO 79 DO Screen^[i, j] := Buffer[i, j];
GotoXY(LastX, LastY); { Cursorposition restaurieren }
IF Screen = @ColorScreen THEN BEGIN
Regs.AX := $1003;
Regs.BL := $00;
Intr($10, Regs);
END;
END;
BEGIN
IF AlreadyLoaded(SpyID) THEN
WriteLn(#13#10, Name, ' ist bereits geladen')
ELSE BEGIN
IF PopUpInstalled(@Monitor, HotKey, 250) THEN BEGIN
WriteLn(#13#10, Name, ' installiert');
WriteLn('Aktivieren mit ', HotKeyName);
MakeResident(SpyID);
END ELSE BEGIN
WriteLn(#13#10, Name, ' nicht installiert,');
WriteLn('vielleicht nicht genug Speicher?');
END;
END;
END.
(* ------------------------------------------------------ *)
(* Ende von SPION.PAS *)