PROGRAM dump; { ***************************************************************** * * * Hex-Ascii file dump utility * * * * Written by: Bob Longoria * * 1024 Lawrence Dr. N.E. * * Albuquerque, New Mexico 87123 * * (505)-298-7231 * * * * Description: * * This program is a slightly improved dump utility * * over the standard dump program which comes with CP/M * * distribution. When dumping, the program will dump * * both in hex (as done by dump.com) and in ascii and * * at a standard CP/M sector (128 bytes) at a time. Also * * each sector is numbered beginning with sector 1. * * Output of the dump can be directed to any desired * * file or output device. For example: * * zdump foo.rel - dumps to the console * * zdump foo.rel con: - also dumps to console * * zdump foo.rel lst: - dumps to listing device * * zdump foo.rel dumb.dmp - dumps to a file * * called dump.dmp * * * ***************************************************************** } CONST MAXARGS = 4; { Maximum command line arguments } TYPE byte = 0..255; buffer = array[1..8,1..16] of 0..255; ch2 = packed array[1..2] of char; args = array[1..MAXARGS] of string 14; VAR i : integer; { General purpose index variable } infile : file of buffer; { The input file to be dumped } outfile : text; { The output file to receive the dump } inbuf : buffer; { Buffer which holds a standard sector } reccount : integer; { The current sector being processed } argc : integer; { The number of command line arguments } argv : args; { The command line argument array } FUNCTION tohex(x : byte) : char; { Description: receives a byte within the hex range (0-15) and returns the hex character equivalent. } BEGIN case x of 0,1,2,3,4,5,6,7,8,9 : tohex := chr(x+ord('0')); { If it is in this range, must be a letter character of A-F } 10,11,12,13,14,15: tohex := chr(x+ord('A')-10); end end; FUNCTION cnvrthex(operand : byte) : ch2; { DESCRIPTION: This function takes a byte and converts it into it's two equivalent hex characters. } VAR remain : byte; BEGIN remain := operand-(operand div 16)*16; cnvrthex[2] := tohex(remain); { First hex character } operand := operand div 16; remain := operand-(operand div 16)*16; cnvrthex[1] := tohex(remain) { Second hex character } END; PROCEDURE display(recno : integer; inbuf : buffer); { DESCRIPTION: This routine takes care of displaying in both hex and ascii the input buffer (128 byte record). } VAR i, j : integer; hexchar : ch2; BEGIN { Begin by labeling the record number } write(outfile,recno:3,': '); { This buffer is processed into 8 lines of output } for i := 1 to 8 do begin { Each line has 16 bytes to process } { Begin by writing out the hexidecimal equivalents of each of the bytes } for j := 1 to 16 do begin hexchar := cnvrthex(inbuf[i,j]); write(outfile,hexchar,' ') end; { Now convert the same 16 bytes into their ascii eqivalents } write(outfile,' '); for j := 1 to 16 do begin { If the byte is a non-printing character, sub- stitute an ascii "." in its place } if (inbuf[i,j] < 32) or (inbuf[i,j] > 126) then write(outfile,'.') { Otherwise print the actual ascii equivalent } else write(outfile,chr(inbuf[i,j])) end; writeln(outfile); write(outfile,' ') end; writeln(outfile) END; PROCEDURE cmdline(var count : integer; var token : args); { DESCRIPTION This routine performs several functions. It reads the CP/M command tail if any and breaks the command tail into tokens. A token is any string of characters delimited by either the beginning of the command tail, the end of the command tail, or a space. The routine returns the token count and all tokens found. } VAR cmd_line : packed array[1..80] of char; i, j : integer; BEGIN { cmdline } { Make sure the command line is clean } for i := 1 to 80 do cmd_line[i] := ' '; count := 0; { if the following is true there is a command tail, otherwise leave the count set to 0 and do not parse the command line } if not eoln(0) then begin readln(cmd_line); i := 0; repeat i := i+1; if cmd_line[i] <> ' ' then begin count := count+1; j := 1; token[count,j] := cmd_line[i]; while cmd_line[i+1] <> ' ' do begin i := i+1; j := j+1; token[count,j] := cmd_line[i] end { while } end { if } until i = 80 end { if not eoln } END; { cmdline } BEGIN { MAIN CODE } writeln; { Make sure command line arguments are clean } for i := 1 to MAXARGS do argv[i] := ' '; reccount := 1; { Begin numbering records at 1 } cmdline(argc,argv); { Get and parse the command line } if argc = 0 then writeln('No INPUT file specified') else if argc > 2 then writeln('Too many command line arguments') else begin { Default output goes to the console } if argc = 1 then argv[2] := 'CON:'; reset(argv[1],infile); rewrite(argv[2],outfile); writeln(outfile,' Hex-Ascii file dump -- Vers. 1.1'); writeln(outfile); { Process until EOF detected on input file } while not(eof(infile)) do begin read(infile,inbuf); display(reccount,inbuf); reccount := reccount+1 end end END. .