home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* SPY.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 = 'Spy';
- 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 SPY.PAS *)