home *** CD-ROM | disk | FTP | other *** search
- PROGRAM DUMP;
-
- { A Turbo Pascal V4.0 Program to dump files in hexadecimal and ASCII
- form.
-
- Active Keys:
-
- Home: Go to the first block of the file.
- End: Go to the last block of the file.
- Up Arrow: Go to the previous block.
- Pg Up: Go to the previous block.
- Space: Go to the next block.
- Dn Arrow: Go to the next block.
- Pg Dn: Go to the next block.
- ^C: Quit.
- Esc: Quit.
-
- Program by Harry M. Murphy, 3 December 1986.
- Updated to Turbo Pascal Version 4.0 by H.M.M. on 29 Nov 1987.
- Keypad processing updated by H.M.M. on 28 Sep 1988. }
-
- USES
- CRT;
-
- TYPE
- BLOCK = ARRAY [0..255] OF BYTE;
- TWOBYTE = ARRAY [1..2] OF CHAR;
-
- CONST
- HEX : ARRAY [0..255] OF TWOBYTE =
- ('00','01','02','03','04','05','06','07','08','09','0A','0B',
- '0C','0D','0E','0F','10','11','12','13','14','15','16','17',
- '18','19','1A','1B','1C','1D','1E','1F','20','21','22','23',
- '24','25','26','27','28','29','2A','2B','2C','2D','2E','2F',
- '30','31','32','33','34','35','36','37','38','39','3A','3B',
- '3C','3D','3E','3F','40','41','42','43','44','45','46','47',
- '48','49','4A','4B','4C','4D','4E','4F','50','51','52','53',
- '54','55','56','57','58','59','5A','5B','5C','5D','5E','5F',
- '60','61','62','63','64','65','66','67','68','69','6A','6B',
- '6C','6D','6E','6F','70','71','72','73','74','75','76','77',
- '78','79','7A','7B','7C','7D','7E','7F','80','81','82','83',
- '84','85','86','87','88','89','8A','8B','8C','8D','8E','8F',
- '90','91','92','93','94','95','96','97','98','99','9A','9B',
- '9C','9D','9E','9F','A0','A1','A2','A3','A4','A5','A6','A7',
- 'A8','A9','AA','AB','AC','AD','AE','AF','B0','B1','B2','B3',
- 'B4','B5','B6','B7','B8','B9','BA','BB','BC','BD','BE','BF',
- 'C0','C1','C2','C3','C4','C5','C6','C7','C8','C9','CA','CB',
- 'CC','CD','CE','CF','D0','D1','D2','D3','D4','D5','D6','D7',
- 'D8','D9','DA','DB','DC','DD','DE','DF','E0','E1','E2','E3',
- 'E4','E5','E6','E7','E8','E9','EA','EB','EC','ED','EE','EF',
- 'F0','F1','F2','F3','F4','F5','F6','F7','F8','F9','FA','FB',
- 'FC','FD','FE','FF');
-
- HILIGHT = $0F;
- NORMAL = $07;
- REVERSE = $70;
- SP = ' ';
-
- VAR
- BLK : BLOCK;
- CH : CHAR;
- CHORD : 0..255;
- I : 0..255;
- INP : FILE OF BYTE;
- INPNAME : STRING[65];
- J : 0..255;
- K : 0..255;
- KEYPAD : BOOLEAN;
- NBL : WORD;
- NBLP : WORD;
- NBLKS : WORD;
- PARA : WORD;
- TEXTSAVE: BYTE;
-
- { -------------------------------- }
-
- PROCEDURE BEEP(FREQ, DUR: INTEGER);
-
- BEGIN
- SOUND(FREQ);
- DELAY(DUR);
- NOSOUND
- END { Procedure BEEP };
-
- { -------------------------------- }
-
- PROCEDURE GETINPFIL;
-
- { This procedure gets an input file, either as the first parameter
- on the command line or by requesting it from the user.
-
- Procedure by Harry M. Murphy, 22 February 1986. }
-
- VAR
- L: INTEGER;
-
- BEGIN
- IF PARAMCOUNT = 0
- THEN
- BEGIN
- CLRSCR;
- WRITE('File to be dumped: ');
- BEEP(512,50);
- READLN(INPNAME)
- END
- ELSE
- INPNAME := PARAMSTR(1);
- FOR L:=1 TO LENGTH(INPNAME) DO INPNAME[L] := UPCASE(INPNAME[L]);
- ASSIGN(INP,INPNAME);
- {$I-} RESET(INP) {$I+};
- IF IORESULT <> 0
- THEN
- BEGIN
- WRITELN('ERROR! Can''t open file ',INPNAME,'!');
- HALT
- END
- END {Procedure GETINPFIL};
-
- { -------------------------------- }
-
- PROCEDURE READBLK(VAR NBL: WORD; VAR BLK: BLOCK);
-
- VAR
- BYTPOS : LONGINT;
- I : 0..256;
-
- BEGIN
- BYTPOS := PRED(NBL)*256;
- SEEK(INP,BYTPOS);
- I := 0;
- WHILE (NOT EOF(INP)) AND (I < 256) DO
- BEGIN
- READ(INP,BLK[I]);
- I := SUCC(I)
- END;
- WHILE I < 256 DO
- BEGIN
- BLK[I] := 0;
- I := SUCC(I)
- END
- END { Procedure READBLK };
-
- { -------------------------------- }
-
- BEGIN { Program DUMP }
- TEXTSAVE := TEXTATTR;
- GETINPFIL;
- NBLKS := (FILESIZE(INP)+255) DIV 256;
- CHECKBREAK := FALSE;
- CLRSCR;
- TEXTATTR := HILIGHT;
- WRITELN(' Dump of ',INPNAME,':');
- TEXTATTR := NORMAL;
- WRITELN;
- WRITELN('Para 0 1 2 3 4 5 6 7 8 9 A B C D E F');
- GOTOXY(1,25);
- TEXTATTR := REVERSE;
- WRITE('Active Keys: Home, End, '#24', PgUp or Space, '#25' or PgDn. Esc or ^C to Quit.');
- TEXTATTR := NORMAL;
- WINDOW(1,4,80,24);
- NBL := 1;
- NBLP := 0;
- REPEAT
- IF NBL <> NBLP
- THEN
- BEGIN
- NBLP := NBL;
- READBLK(NBL,BLK);
- CLRSCR;
- PARA := 256*PRED(NBL);
- FOR I := 0 TO 15 DO
- BEGIN
- J := HI(PARA);
- K := LO(PARA);
- WRITE(HEX[J],HEX[K],SP);
- K := 16*I;
- FOR J := 0 TO 15 DO WRITE(SP,HEX[BLK[J+K]]);
- WRITE(' ');
- FOR J := 0 TO 15 DO
- IF BLK[J+K] IN [32..126]
- THEN
- WRITE(CHR(BLK[J+K]))
- ELSE
- WRITE('.');
- WRITELN;
- PARA := PARA+16
- END;
- WRITELN;
- WRITELN(' Block number ',NBL,' of ',NBLKS,' blocks.');
- IF NBL < NBLKS
- THEN
- IF NBL = 1
- THEN
- BEEP(1024,50)
- ELSE
- BEEP(512,50)
- ELSE
- BEGIN
- TEXTATTR := HILIGHT;
- WRITELN(' <<<<<<< END OF FILE >>>>>>>');
- TEXTATTR := NORMAL;
- BEEP(256,100)
- END
- END
- ELSE
- IF NBL = 1
- THEN
- BEEP(1024,25)
- ELSE
- BEEP(256,25);
- REPEAT
- WHILE NOT KEYPRESSED DO;
- CHORD := ORD(READKEY);
- IF KEYPRESSED THEN CHORD := ORD(READKEY);
- KEYPAD := CHORD IN [32,71,72,73,79,80,81];
- IF KEYPAD
- THEN
- CASE CHORD OF
- {Home}
- 71: NBL := 1;
-
- {UpAr,
- PgUp}
- 72,73: IF NBL > 1 THEN NBL := PRED(NBL);
-
- {End}
- 79: NBL := NBLKS;
-
- {Space,
- DnAr,
- PgDn}
- 32,80,81: IF NBL < NBLKS THEN NBL := SUCC(NBL)
-
- END { CASE }
- UNTIL KEYPAD OR (CHORD IN [3,27])
- UNTIL NOT KEYPAD;
- CLOSE(INP);
- TEXTATTR := TEXTSAVE;
- WINDOW(1,1,80,25);
- GOTOXY(1,25);
- CLREOL;
- GOTOXY(1,22)
- END.