home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / library / dos / murutil / dump.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1988-09-29  |  6.5 KB  |  244 lines

  1. PROGRAM DUMP;
  2.  
  3. {  A Turbo Pascal V4.0 Program to dump files in hexadecimal and ASCII
  4.    form.
  5.  
  6.    Active Keys:
  7.  
  8.       Home:      Go to the first block of the file.
  9.       End:       Go to the last  block of the file.
  10.       Up Arrow:  Go to the previous block.
  11.       Pg Up:     Go to the previous block.
  12.       Space:     Go to the next block.
  13.       Dn Arrow:  Go to the next block.
  14.       Pg Dn:     Go to the next block.
  15.       ^C:        Quit.
  16.       Esc:       Quit.
  17.  
  18.    Program by Harry M. Murphy,  3 December 1986.
  19.    Updated to Turbo Pascal Version 4.0 by H.M.M. on 29 Nov 1987.
  20.    Keypad processing updated by H.M.M. on 28 Sep 1988.  }
  21.  
  22. USES
  23.      CRT;
  24.  
  25. TYPE
  26.      BLOCK   = ARRAY [0..255] OF BYTE;
  27.      TWOBYTE = ARRAY [1..2] OF CHAR;
  28.  
  29. CONST
  30.   HEX : ARRAY [0..255] OF TWOBYTE =
  31.         ('00','01','02','03','04','05','06','07','08','09','0A','0B',
  32.          '0C','0D','0E','0F','10','11','12','13','14','15','16','17',
  33.          '18','19','1A','1B','1C','1D','1E','1F','20','21','22','23',
  34.          '24','25','26','27','28','29','2A','2B','2C','2D','2E','2F',
  35.          '30','31','32','33','34','35','36','37','38','39','3A','3B',
  36.          '3C','3D','3E','3F','40','41','42','43','44','45','46','47',
  37.          '48','49','4A','4B','4C','4D','4E','4F','50','51','52','53',
  38.          '54','55','56','57','58','59','5A','5B','5C','5D','5E','5F',
  39.          '60','61','62','63','64','65','66','67','68','69','6A','6B',
  40.          '6C','6D','6E','6F','70','71','72','73','74','75','76','77',
  41.          '78','79','7A','7B','7C','7D','7E','7F','80','81','82','83',
  42.          '84','85','86','87','88','89','8A','8B','8C','8D','8E','8F',
  43.          '90','91','92','93','94','95','96','97','98','99','9A','9B',
  44.          '9C','9D','9E','9F','A0','A1','A2','A3','A4','A5','A6','A7',
  45.          'A8','A9','AA','AB','AC','AD','AE','AF','B0','B1','B2','B3',
  46.          'B4','B5','B6','B7','B8','B9','BA','BB','BC','BD','BE','BF',
  47.          'C0','C1','C2','C3','C4','C5','C6','C7','C8','C9','CA','CB',
  48.          'CC','CD','CE','CF','D0','D1','D2','D3','D4','D5','D6','D7',
  49.          'D8','D9','DA','DB','DC','DD','DE','DF','E0','E1','E2','E3',
  50.          'E4','E5','E6','E7','E8','E9','EA','EB','EC','ED','EE','EF',
  51.          'F0','F1','F2','F3','F4','F5','F6','F7','F8','F9','FA','FB',
  52.          'FC','FD','FE','FF');
  53.  
  54.   HILIGHT = $0F;
  55.   NORMAL  = $07;
  56.   REVERSE = $70;
  57.   SP      = ' ';
  58.  
  59. VAR
  60.     BLK     : BLOCK;
  61.     CH      : CHAR;
  62.     CHORD   : 0..255;
  63.     I       : 0..255;
  64.     INP     : FILE OF BYTE;
  65.     INPNAME : STRING[65];
  66.     J       : 0..255;
  67.     K       : 0..255;
  68.     KEYPAD  : BOOLEAN;
  69.     NBL     : WORD;
  70.     NBLP    : WORD;
  71.     NBLKS   : WORD;
  72.     PARA    : WORD;
  73.     TEXTSAVE: BYTE;
  74.  
  75. { -------------------------------- }
  76.  
  77. PROCEDURE BEEP(FREQ, DUR: INTEGER);
  78.  
  79. BEGIN
  80.   SOUND(FREQ);
  81.   DELAY(DUR);
  82.   NOSOUND
  83. END { Procedure BEEP };
  84.  
  85. { -------------------------------- }
  86.  
  87. PROCEDURE GETINPFIL;
  88.  
  89. {  This procedure gets an input file, either as the first parameter
  90.    on the command line or by requesting it from the user.
  91.  
  92.    Procedure by Harry M. Murphy,  22 February 1986.  }
  93.  
  94.   VAR
  95.       L: INTEGER;
  96.  
  97.   BEGIN
  98.     IF PARAMCOUNT = 0
  99.       THEN
  100.         BEGIN
  101.           CLRSCR;
  102.           WRITE('File to be dumped: ');
  103.           BEEP(512,50);
  104.           READLN(INPNAME)
  105.         END
  106.       ELSE
  107.         INPNAME := PARAMSTR(1);
  108.     FOR L:=1 TO LENGTH(INPNAME) DO INPNAME[L] := UPCASE(INPNAME[L]);
  109.     ASSIGN(INP,INPNAME);
  110.     {$I-} RESET(INP) {$I+};
  111.     IF IORESULT <> 0
  112.       THEN
  113.         BEGIN
  114.           WRITELN('ERROR!  Can''t open file ',INPNAME,'!');
  115.           HALT
  116.         END
  117.   END {Procedure GETINPFIL};
  118.  
  119. { -------------------------------- }
  120.  
  121. PROCEDURE READBLK(VAR NBL: WORD; VAR BLK: BLOCK);
  122.  
  123. VAR
  124.   BYTPOS : LONGINT;
  125.   I      : 0..256;
  126.  
  127. BEGIN
  128.   BYTPOS := PRED(NBL)*256;
  129.   SEEK(INP,BYTPOS);
  130.   I := 0;
  131.   WHILE (NOT EOF(INP)) AND (I < 256) DO
  132.     BEGIN
  133.       READ(INP,BLK[I]);
  134.       I := SUCC(I)
  135.     END;
  136.   WHILE I < 256 DO
  137.     BEGIN
  138.       BLK[I] := 0;
  139.       I := SUCC(I)
  140.     END
  141. END { Procedure READBLK };
  142.  
  143. { -------------------------------- }
  144.  
  145. BEGIN { Program DUMP }
  146.   TEXTSAVE := TEXTATTR;
  147.   GETINPFIL;
  148.   NBLKS := (FILESIZE(INP)+255) DIV 256;
  149.   CHECKBREAK := FALSE;
  150.   CLRSCR;
  151.   TEXTATTR := HILIGHT;
  152.   WRITELN('      Dump of ',INPNAME,':');
  153.   TEXTATTR := NORMAL;
  154.   WRITELN;
  155.   WRITELN('Para   0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F');
  156.   GOTOXY(1,25);
  157.   TEXTATTR := REVERSE;
  158.   WRITE('Active Keys:  Home, End,  '#24', PgUp or Space, '#25' or PgDn.  Esc or ^C to Quit.');
  159.   TEXTATTR := NORMAL;
  160.   WINDOW(1,4,80,24);
  161.   NBL := 1;
  162.   NBLP := 0;
  163.   REPEAT
  164.     IF NBL <> NBLP
  165.     THEN
  166.       BEGIN
  167.         NBLP := NBL;
  168.         READBLK(NBL,BLK);
  169.         CLRSCR;
  170.         PARA := 256*PRED(NBL);
  171.         FOR I := 0 TO 15 DO
  172.           BEGIN
  173.             J := HI(PARA);
  174.             K := LO(PARA);
  175.             WRITE(HEX[J],HEX[K],SP);
  176.             K := 16*I;
  177.             FOR J := 0 TO 15 DO WRITE(SP,HEX[BLK[J+K]]);
  178.             WRITE('  ');
  179.             FOR J := 0 TO 15 DO
  180.               IF BLK[J+K] IN [32..126]
  181.                 THEN
  182.                   WRITE(CHR(BLK[J+K]))
  183.                 ELSE
  184.                   WRITE('.');
  185.             WRITELN;
  186.             PARA := PARA+16
  187.           END;
  188.         WRITELN;
  189.         WRITELN('      Block number ',NBL,' of ',NBLKS,' blocks.');
  190.         IF NBL < NBLKS
  191.           THEN
  192.             IF NBL = 1
  193.               THEN
  194.                 BEEP(1024,50)
  195.               ELSE
  196.                 BEEP(512,50)
  197.           ELSE
  198.             BEGIN
  199.               TEXTATTR := HILIGHT;
  200.               WRITELN('      <<<<<<<  END OF FILE  >>>>>>>');
  201.               TEXTATTR := NORMAL;
  202.               BEEP(256,100)
  203.             END
  204.        END
  205.      ELSE
  206.        IF NBL = 1
  207.          THEN
  208.            BEEP(1024,25)
  209.          ELSE
  210.            BEEP(256,25);
  211.     REPEAT
  212.       WHILE NOT KEYPRESSED DO;
  213.       CHORD := ORD(READKEY);
  214.       IF KEYPRESSED THEN CHORD := ORD(READKEY);
  215.       KEYPAD := CHORD IN [32,71,72,73,79,80,81];
  216.       IF KEYPAD
  217.         THEN
  218.           CASE CHORD OF
  219.             {Home}
  220.                71: NBL := 1;
  221.  
  222.             {UpAr,
  223.              PgUp}
  224.             72,73: IF NBL > 1 THEN NBL := PRED(NBL);
  225.  
  226.              {End}
  227.                79: NBL := NBLKS;
  228.  
  229.            {Space,
  230.              DnAr,
  231.              PgDn}
  232.           32,80,81: IF NBL < NBLKS THEN NBL := SUCC(NBL)
  233.  
  234.           END { CASE }
  235.     UNTIL KEYPAD OR (CHORD IN [3,27])
  236.   UNTIL NOT KEYPAD;
  237.   CLOSE(INP);
  238.   TEXTATTR := TEXTSAVE;
  239.   WINDOW(1,1,80,25);
  240.   GOTOXY(1,25);
  241.   CLREOL;
  242.   GOTOXY(1,22)
  243. END.
  244.