home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------- *)
- (* DUMP.PAS *)
- (* Ausgabe von Dateien als Hexdump *)
- (* (c) H.Tennert & DMV-Verlag *)
- (* ------------------------------------------------- *)
- PROGRAM Dump;
-
- USES Dos;
-
- VAR
- f : FILE;
- t : TEXT;
- s : STRING;
- i, j, k : INTEGER;
- Line, Page : INTEGER;
- Segm, Offs : WORD;
- Buffer : ARRAY [1..16] OF BYTE;
-
- FUNCTION DosVersion : WORD;
- BEGIN
- DosVersion := Swap(Dos.DosVersion);
- END;
-
- FUNCTION ThisProgram : STRING;
- BEGIN
- IF DosVersion >= $0300 THEN
- ThisProgram := ParamStr(0)
- ELSE
- ThisProgram := '';
- END;
-
- PROCEDURE Usage;
- BEGIN
- WriteLn;
- WriteLn(ThisProgram, 'erzeugt einen Hexdump der '+
- 'angegebenen Datei.');
- WriteLn('Der Dump erhält die Erweiterung ».DMP«.');
- WriteLn;
- Halt(1);
- END;
-
- FUNCTION Hex(l : BYTE; x : WORD) : STRING;
- VAR
- a : WORD;
- s : STRING;
- BEGIN
- s := '';
- a := x DIV 4096;
- IF a <= 9 THEN s := Chr($30 + a)
- ELSE s := Chr( 55 + a);
- x := x MOD 4096;
- a := x DIV 256;
- IF a <= 9 THEN s := s + Chr($30 + a)
- ELSE s := s + Chr( 55 + a);
- x := x MOD 256;
- a := x DIV 16;
- IF a<=9 THEN s := s + Chr($30 + a)
- ELSE s := s + Chr( 55 + a);
- x := x MOD 16;
- IF x <= 9 THEN s := s + Chr($30 + x)
- ELSE s := s + Chr( 55 + x);
- s := '0000' + s;
- WHILE Length(s) > l DO Delete (s, 1, 1);
- Hex := s;
- END;
-
- PROCEDURE PrintHeader;
- BEGIN
- WriteLn(t, 'Hexdump von ', ParamStr(1),
- ' Länge: ',
- FileSize(f), '(',
- Hex(5, FileSize(f)),
- 'H) Bytes Seite ', page:2);
- INC(Line);
- WriteLn(t);
- END;
-
- BEGIN
- IF ParamCount <> 1 THEN Usage;
- s := ParamStr(1);
- Assign(f, s);
- {$I-}
- Reset(f, 1);
- {$I+}
- IF IOResult <> 0 THEN BEGIN
- WriteLn(ThisProgram, ':');
- WriteLn('Datei ', s, ' nicht gefunden! ');
- Halt(1);
- END;
- WHILE Pos('.', s) <> 0 DO
- Delete(s, Length(s), 1);
- s := s + '.DMP';
- Assign(t, s);
- Rewrite(t);
- Segm := 0; Offs := 0;
- Page := 1; Line := 1;
- WriteLn;
- WriteLn(ThisProgram, ': Bei der Arbeit...');
- WHILE (FileSize(f)-FilePos(f)) > 16 DO BEGIN
- IF Line = 1 THEN PrintHeader;
- BlockRead(f, Buffer, 16);
- Write(t, Hex(4, Segm), ':', Hex(4, Offs), ' ');
- FOR i := 1 TO 8 DO
- Write (t, ' ', Hex(2, Buffer[i]));
- Write(t, ' !');
- FOR i := 9 TO 16 DO
- Write(t, ' ', Hex(2, Buffer[i]));
- Write(t, ' # ');
- FOR i := 1 TO 16 DO
- IF Buffer[i] < 32 THEN
- Write(t, '.')
- ELSE
- Write(t, Chr(Buffer[i]));
- WriteLn (t);
- INC(Line);
- INC(Offs, 16);
- IF Offs = 0 THEN INC(Segm, 1);
- IF Line = 63 THEN BEGIN
- WriteLn(t, ^L);
- Line := 1;
- INC(Page);
- END;
- END;
- IF Line = 1 THEN PrintHeader;
- j := FileSize(f) - FilePos(f);
- BlockRead(f, Buffer, j);
- Write(t, Hex(4, Segm), ':', Hex(4, Offs), ' ');
- IF j >= 8 THEN
- FOR i := 1 TO 8 DO
- Write(t, ' ', Hex(2, Buffer[i]))
- ELSE
- FOR i := 1 TO j DO
- Write(t, ' ', Hex(2, Buffer[i]));
- IF j < 8 THEN
- FOR i := Succ(j) TO 8 DO Write(t, ' '); (* 3 *)
- Write(t, ' !');
- IF j > 8 THEN BEGIN
- FOR i := 9 TO j DO
- Write(t, ' ', Hex(2, Buffer[i]));
- FOR i := Succ(j) TO 16 DO Write (t, ' '); (* 3 *)
- END ELSE
- Write(t, ' '); (* 24 *)
- Write(t, ' # ');
- FOR i := 1 TO j DO
- IF Buffer[i] < 32 THEN
- Write(t, '.')
- ELSE
- Write(t, Chr(Buffer[i]));
- WriteLn(t);
- WriteLn(t, #13);
- Close(f);
- Close(t);
- END.
- (* ------------------------------------------------- *)
- (* Ende von DUMP.PAS *)
-
-