PROCEDURE VARDUMP(VAR DEVICE : TEXT; VAR TARGET; ITSIZE : INTEGER); CONST PRINTABLES : SET OF CHAR = [' '..'}']; VAR I,J : INTEGER; FULL,LEFT : INTEGER; DUMPIT : ARRAY[0..MAXINT] OF BYTE ABSOLUTE TARGET; PROCEDURE DUMP_LINE(OFFSET,BYTE_COUNT : INTEGER); VAR I : INTEGER; BEGIN FOR I := 0 TO BYTE_COUNT-1 DO { Hex dump the data } BEGIN WRITE_HEX(DEVICE,DUMPIT[(OFFSET*16)+I]); WRITE(DEVICE,' ') END; FOR I := 0 TO 56 - (BYTE_COUNT*3) DO WRITE(DEVICE,' '); { Space interval } WRITE(DEVICE,'|'); { Show first boundary bar } FOR I := 0 TO BYTE_COUNT-1 DO { Show printable equivalents } IF CHR(DUMPIT[(OFFSET*16)+I]) IN PRINTABLES THEN WRITE(DEVICE,CHR(DUMPIT[(OFFSET*16)+I])) ELSE WRITE(DEVICE,'.'); WRITELN(DEVICE,'|') { Final boundary bar } END; BEGIN FULL := ITSIZE DIV 16; { Number of 16-byte chunks in TARGET } LEFT := ITSIZE MOD 16; { 'Leftover' bytes after last 16-byte chunk } FOR I := 0 TO FULL-1 DO { Not executed if less than 16 bytes in TARGET } DUMP_LINE(I,16); IF LEFT > 0 THEN { Not executed if size of TARGET divides by 16 } DUMP_LINE(FULL,LEFT); WRITELN(DEVICE) { Space down one line after dump } END; { VARDUMP }