{--------------------------------------------------------------} { HEXDUMP } { } { Hex dump program for all disk files } { } { by Jeff Duntemann } { Turbo Pascal V2.0 } { Last update 12/11/84 } { } { (c) 1984 by Jeff Duntemann } { ALL RIGHTS RESERVED } {--------------------------------------------------------------} PROGRAM HEXDUMP; {$V-} { Relaxes string length type checking on VAR paramaters } CONST UP = TRUE; DOWN = FALSE; TYPE STRING255 = STRING[255]; STRING128 = STRING[128]; STRING80 = STRING[80]; STRING40 = STRING[40]; PARM_ARRAY = ARRAY[1..10] OF STRING40; { Command line } { parms are stored here } BLOCK = ARRAY[0..127] OF BYTE; { One disk sector } BLOCK_ARRAY = ARRAY[0..15] OF BLOCK; { BLOCKREAD reads } { 16 blocks at once } VAR I,J,K : INTEGER; PARMS : PARM_ARRAY; CH : CHAR; DUMPFILE : FILE; XBLOCK : BLOCK; DISKDATA : BLOCK_ARRAY; IOCODE : INTEGER; BLOCKS : INTEGER; { Counts blocks within } { BLOCK_ARRAY } BLOCK_COUNT : INTEGER; { Tallies total # blocks read } BUFFERS : INTEGER; REMAINS : INTEGER; DEVICE : TEXT; { Will be either LST: or CON: } {<<<>>>} {Only ONE of the following two declarations applies to any } {given version of Turbo Pascal. Choose the one that } {matches your operating system and un-comment it. Then } {comment out the other one! } RAM_TAIL : STRING128 ABSOLUTE CSEG : $80; { MS/PC DOS } {RAM_TAIL : STRING128 ABSOLUTE $80;} { CP/M } {$I FRCECASE.SRC } { Contains FORCE_CASE } {$I STRIPWHT.SRC } { Contains STRIP_WHITE } {$I PARSTAIL.SRC } { Contains PARSE_TAIL } {$I YES.SRC } { Contains YES } {>>>>WRITE_HEX<<<<} PROCEDURE WRITE_HEX(VAR DEVICE : TEXT; BT : BYTE); CONST HEXDIGITS : ARRAY[0..15] OF CHAR = '0123456789ABCDEF'; VAR BZ : BYTE; BEGIN BZ := BT AND $0F; BT := BT SHR 4; WRITE(DEVICE,HEXDIGITS[BT],HEXDIGITS[BZ]) END; {>>>>DUMPBLOCK<<<<} PROCEDURE DUMPBLOCK(XBLOCK : BLOCK; VAR DEVICE : TEXT); VAR I,J,K : INTEGER; CH : CHAR; BEGIN FOR I:=0 TO 7 DO { Do a hexdump of 8 lines of 16 chars } BEGIN FOR J:=0 TO 15 DO { Show hex values } BEGIN WRITE_HEX(DEVICE,ORD(XBLOCK[(I*16)+J])); WRITE(DEVICE,' ') END; WRITE(DEVICE,' |'); { Bar to separate hex & ASCII } FOR J:=0 TO 15 DO { Show printable chars or '.' } BEGIN CH:=CHR(XBLOCK[(I*16)+J]); IF ((ORD(CH)<127) AND (ORD(CH)>31)) THEN WRITE(DEVICE,CH) ELSE WRITE(DEVICE,'.') END; WRITELN(DEVICE,'|') END; FOR I:=0 TO 1 DO WRITELN(DEVICE,'') END; { DUMPBLOCK } {<<<>>>} PROCEDURE SHOW_HELP(HELPNAME : STRING80); VAR HELPFILE : TEXT; HELPLINE : STRING80; I : INTEGER; BEGIN WRITELN; ASSIGN(HELPFILE,HELPNAME); {$I-} RESET(HELPFILE); {$I+} IF IORESULT = 0 THEN FOR I := 1 TO 20 DO BEGIN READLN(HELPFILE,HELPLINE); WRITELN(HELPLINE) END; CLOSE(HELPFILE) END; BEGIN CLRSCR; { Clear the CRT } PARSE_TAIL(I,PARMS); { Parse the command tail } { Caps lock printer parameter } IF I > 1 THEN PARMS[2] := FORCE_CASE(UP,PARMS[2]); IF I < 1 THEN { Error - no parms given } BEGIN WRITELN('<> You must enter a filename after invoking'); WRITE (' HEXDUMP.COM. Display help screen? (Y/N): '); IF YES THEN SHOW_HELP('DUMPHELP.TXT') END ELSE BEGIN ASSIGN(DUMPFILE,PARMS[1]); { Attempt to open the file } {$I-} RESET(DUMPFILE); {$I+} IF IORESULT <> 0 THEN { Error if file won't open } BEGIN WRITELN('<> File ',PARMS[1],' does not exist.'); WRITE (' Display help screen? (Y/N): '); IF YES THEN SHOW_HELP('DUMPHELP.TXT'); END ELSE BEGIN { See if print parm was entered; } { and select output device } IF (POS('PRINT',PARMS[2]) = 1) OR (POS('P',PARMS[2]) = 1) THEN ASSIGN(DEVICE,'LST:') ELSE ASSIGN(DEVICE,'CON:'); RESET(DEVICE); BLOCK_COUNT := FILESIZE(DUMPFILE); { Filesize in 128-byte blocks } IF BLOCK_COUNT = 0 THEN WRITELN('File ',PARMS[1],' is empty.') ELSE BEGIN BUFFERS := BLOCK_COUNT DIV 16; { # of 16-block buffers } REMAINS := BLOCK_COUNT MOD 16; { # of blocks in last buffer } FOR I := 1 TO BUFFERS DO { Dump full 16-block buffers } BEGIN BLOCKREAD(DUMPFILE,DISKDATA,16); { Read 16 disk blocks } FOR J := 0 TO 15 DO DUMPBLOCK(DISKDATA[J],DEVICE) { Dump 'em... } END; IF REMAINS > 0 THEN { If fractional buffer remains, dump it } BEGIN BLOCKREAD(DUMPFILE,DISKDATA,REMAINS); { Read last buffer } FOR I := 0 TO REMAINS-1 DO DUMPBLOCK(DISKDATA[I],DEVICE) { Dump it } END END; CLOSE(DUMPFILE) END END END.