home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / TURBOPAS / TP-UTIL.ARK / HEXDUMP.PAS < prev    next >
Pascal/Delphi Source File  |  1986-01-06  |  6KB  |  183 lines

  1. {--------------------------------------------------------------}
  2. {                          HEXDUMP                             }
  3. {                                                              }
  4. {            Hex dump program for all disk files               }
  5. {                                                              }
  6. {                             by Jeff Duntemann                }
  7. {                             Turbo Pascal V2.0                }
  8. {                             Last update 12/11/84             }
  9. {                                                              }
  10. {                 (c) 1984 by Jeff Duntemann                   }
  11. {                     ALL RIGHTS RESERVED                      }
  12. {--------------------------------------------------------------}
  13.  
  14. PROGRAM HEXDUMP;
  15.  
  16. {$V-}  { Relaxes string length type checking on VAR paramaters }
  17.  
  18. CONST UP   = TRUE;
  19.       DOWN = FALSE;
  20.  
  21. TYPE STRING255   = STRING[255];
  22.      STRING128   = STRING[128];
  23.      STRING80    = STRING[80];
  24.      STRING40    = STRING[40];
  25.      PARM_ARRAY  = ARRAY[1..10] OF STRING40;  { Command line   }
  26.                                    { parms are stored here     }
  27.      BLOCK       = ARRAY[0..127] OF BYTE;  { One disk sector   }
  28.      BLOCK_ARRAY = ARRAY[0..15] OF BLOCK;  { BLOCKREAD reads   }
  29.                                            { 16 blocks at once }
  30.  
  31.  
  32. VAR I,J,K       : INTEGER;
  33.     PARMS       : PARM_ARRAY;
  34.     CH          : CHAR;
  35.     DUMPFILE    : FILE;
  36.     XBLOCK      : BLOCK;
  37.     DISKDATA    : BLOCK_ARRAY;
  38.     IOCODE      : INTEGER;
  39.     BLOCKS      : INTEGER;        { Counts blocks within }
  40.                                   { BLOCK_ARRAY }
  41.     BLOCK_COUNT : INTEGER;        { Tallies total # blocks read }
  42.     BUFFERS     : INTEGER;
  43.     REMAINS     : INTEGER;
  44.     DEVICE      : TEXT;           { Will be either LST: or CON: }
  45.  
  46.  
  47.            {<<<<LOCATION OF THE COMMAND LINE TAIL>>>>}
  48.  
  49.     {Only ONE of the following two declarations applies to any }
  50.     {given version of Turbo Pascal.  Choose the one that       }
  51.     {matches your operating system and un-comment it.  Then    }
  52.     {comment out the other one!                                }
  53.  
  54.      RAM_TAIL : STRING128 ABSOLUTE CSEG : $80;   { MS/PC DOS }
  55.     {RAM_TAIL : STRING128 ABSOLUTE $80;}         { CP/M }
  56.  
  57.  
  58. {$I FRCECASE.SRC }   { Contains FORCE_CASE }
  59.  
  60. {$I STRIPWHT.SRC }   { Contains STRIP_WHITE }
  61.  
  62. {$I PARSTAIL.SRC }   { Contains PARSE_TAIL }
  63.  
  64. {$I YES.SRC }        { Contains YES }
  65.  
  66.  
  67. {>>>>WRITE_HEX<<<<}
  68.  
  69. PROCEDURE WRITE_HEX(VAR DEVICE : TEXT; BT : BYTE);
  70.  
  71. CONST HEXDIGITS : ARRAY[0..15] OF CHAR = '0123456789ABCDEF';
  72.  
  73. VAR BZ : BYTE;
  74.  
  75. BEGIN
  76.   BZ := BT AND $0F;
  77.   BT := BT SHR 4;
  78.   WRITE(DEVICE,HEXDIGITS[BT],HEXDIGITS[BZ])
  79. END;
  80.  
  81.  
  82. {>>>>DUMPBLOCK<<<<}
  83.  
  84. PROCEDURE DUMPBLOCK(XBLOCK : BLOCK; VAR DEVICE : TEXT);
  85.  
  86. VAR I,J,K : INTEGER;
  87.     CH    : CHAR;
  88.  
  89. BEGIN
  90.   FOR I:=0 TO 7 DO        { Do a hexdump of 8 lines of 16 chars }
  91.     BEGIN
  92.       FOR J:=0 TO 15 DO   { Show hex values }
  93.         BEGIN
  94.           WRITE_HEX(DEVICE,ORD(XBLOCK[(I*16)+J]));
  95.           WRITE(DEVICE,' ')
  96.         END;
  97.       WRITE(DEVICE,'   |');    { Bar to separate hex & ASCII }
  98.       FOR J:=0 TO 15 DO        { Show printable chars or '.' }
  99.         BEGIN
  100.           CH:=CHR(XBLOCK[(I*16)+J]);
  101.           IF ((ORD(CH)<127) AND (ORD(CH)>31))
  102.           THEN WRITE(DEVICE,CH) ELSE WRITE(DEVICE,'.')
  103.         END;
  104.       WRITELN(DEVICE,'|')
  105.     END;
  106.   FOR I:=0 TO 1 DO WRITELN(DEVICE,'')
  107. END;  { DUMPBLOCK }
  108.  
  109.  
  110. {<<<<SHOW_HELP>>>>}
  111.  
  112. PROCEDURE SHOW_HELP(HELPNAME : STRING80);
  113.  
  114. VAR HELPFILE : TEXT;
  115.     HELPLINE : STRING80;
  116.     I        : INTEGER;
  117.  
  118. BEGIN
  119.   WRITELN;
  120.   ASSIGN(HELPFILE,HELPNAME);
  121.   {$I-} RESET(HELPFILE); {$I+}
  122.   IF IORESULT = 0 THEN
  123.     FOR I := 1 TO 20 DO
  124.       BEGIN
  125.         READLN(HELPFILE,HELPLINE);
  126.         WRITELN(HELPLINE)
  127.       END;
  128.   CLOSE(HELPFILE)
  129. END;
  130.  
  131.  
  132. BEGIN
  133.   CLRSCR;                            { Clear the CRT }
  134.   PARSE_TAIL(I,PARMS);               { Parse the command tail }
  135.                                 { Caps lock printer parameter }
  136.   IF I > 1 THEN PARMS[2] := FORCE_CASE(UP,PARMS[2]);
  137.   IF I < 1 THEN                      { Error - no parms given }
  138.     BEGIN
  139.       WRITELN('<<Error!>> You must enter a filename after invoking');
  140.       WRITE  ('           HEXDUMP.COM.  Display help screen? (Y/N): ');
  141.       IF YES THEN SHOW_HELP('DUMPHELP.TXT')
  142.     END
  143.   ELSE
  144.     BEGIN
  145.       ASSIGN(DUMPFILE,PARMS[1]);  { Attempt to open the file }
  146.       {$I-} RESET(DUMPFILE); {$I+}
  147.       IF IORESULT <> 0 THEN       { Error if file won't open }
  148.         BEGIN
  149.           WRITELN('<<Error!>> File ',PARMS[1],' does not exist.');
  150.           WRITE  ('           Display help screen? (Y/N): ');
  151.           IF YES THEN SHOW_HELP('DUMPHELP.TXT');
  152.         END
  153.       ELSE
  154.         BEGIN                     { See if print parm was entered; }
  155.                                   { and select output device }
  156.           IF (POS('PRINT',PARMS[2]) = 1) OR (POS('P',PARMS[2]) = 1) THEN
  157.             ASSIGN(DEVICE,'LST:') ELSE ASSIGN(DEVICE,'CON:');
  158.           RESET(DEVICE);
  159.           BLOCK_COUNT := FILESIZE(DUMPFILE);  { Filesize in 128-byte blocks }
  160.           IF BLOCK_COUNT = 0 THEN
  161.             WRITELN('File ',PARMS[1],' is empty.')
  162.           ELSE
  163.             BEGIN
  164.               BUFFERS := BLOCK_COUNT DIV 16;  { # of 16-block buffers }
  165.               REMAINS := BLOCK_COUNT MOD 16;  { # of blocks in last buffer }
  166.               FOR I := 1 TO BUFFERS DO        { Dump full 16-block buffers }
  167.                 BEGIN
  168.                   BLOCKREAD(DUMPFILE,DISKDATA,16); { Read 16 disk blocks }
  169.                   FOR J := 0 TO 15 DO
  170.                     DUMPBLOCK(DISKDATA[J],DEVICE)  { Dump 'em... }
  171.                 END;
  172.               IF REMAINS > 0 THEN  { If fractional buffer remains, dump it }
  173.                 BEGIN
  174.                   BLOCKREAD(DUMPFILE,DISKDATA,REMAINS); { Read last buffer }
  175.                   FOR I := 0 TO REMAINS-1 DO
  176.                     DUMPBLOCK(DISKDATA[I],DEVICE)       { Dump it }
  177.                 END
  178.             END;
  179.           CLOSE(DUMPFILE)
  180.         END
  181.     END
  182. END.
  183. ZIFIXASTQKSNCAEXJECZUKCTGTYRWPOLBCJKBHNTQQQPCOUUUMZIX