home *** CD-ROM | disk | FTP | other *** search
- PROGRAM EDISK (INPUT,OUTPUT,DISKFILE);
- { ***************************************************************************
- EDISK.PAS
- File examination and editing utility.
-
- Copyright (c) 1985 Future Communications, Atlanta, Georgia and published
- in the Public Domain for non-commercial use.
-
- SOURCE: Turbo Pascal
- Version compiled under: 3.0
- O/S: MSDOS 2.1, PCDOS 2.1, CP/M80 2.2
-
- To compile, edit EDISK.PAS to:
- (1) Select 24 or 25 line display
- (2) Select include files for operating system:
- MSDOS/PCDOS CP/M80
- ----------- -----------
- EDISK.PAS EDISK.PAS
- CMDLINE.MSD CMDLINE.CPM
- DISPLAY.INC DISPLAY.INC
- EDIT.INC EDIT.INC
-
- PURPOSE:
-
- Diskfile debugger in ASCII or hex.
-
- PARAMETERS
-
- Parameters are passed by Command Line
-
- DESCRIPTION:
-
- A>EDISK [filename]
-
- There are two modes in which this program operates, REVIEW
- and EDIT. The REVIEW mode is to view the file 128 bytes at
- a time and supports the following functions from the
- "Command:" prompt:
- ^X Display the previous block (decrement the block
- number).
- ^E Display the next block (increment the block
- number).
- S Set the block number.
- Z Position the file at the last block in the file.
- B Position the file at the first block in the file.
- E Enter edit mode.
- Q Exit the program.
- ? Display a list of commands (automatic when the
- program first starts up).
- P Print the displayed block on the printer.
- D Dump the entire file to the printer.
-
- When the EDIT mode has been entered, the cursor is posi-
- tioned at the first byte in the block in the hex region of
- the display. You may modify the block a nybble at a time in
- the hex region by entering any valid hex digit (case is
- ignored). In the ASCII region, you may enter any printable
- character into the block. The following control codes are
- valid in the EDIT mode:
- ^W Write the edited buffer out to the disk (this
- command must be invoked to modify the disk file).
- You are returned to the REVIEW mode when the
- buffer is written out.
- ^Q Quit the EDIT mode WITHOUT writing the buffer to
- the disk. You are returned to the REVIEW mode.
- ^O Swap ASCII and hex regions. The cursor will move
- to the byte being edited in the corresponding
- region.
- ^X Cursor down (+16 bytes in the buffer).
- ^E Cursor up (-16 bytes in the buffer).
- ^S Cursor left (one nybble in hex region and one byte
- in ASCII region).
- ^D Cursor right (one nybble in hex region and one
- byte in ASCII region).
-
- ***************************************************************************
- }
- CONST
- { YBASE will have one of the following definitions }
- { according to the system on which EDISK is to be run }
- { comment out the definitions that don't apply to }
- { your console. }
- YBASE = 16; { 24 line display }
- { YBASE = 17; } { 25 line display (including IBMPC) }
- RECSIZE = 128; { displayable block size }
- REVISION = '1.7'; { current revision }
- UPKEY = ^E; { cursor up }
- DOWNKEY = ^X; { cursor down }
- LEFTKEY = ^S; { cursor left }
- RIGHTKEY = ^D; { cursor right }
- WRITEKEY = ^W; { write current block to disk }
- EXITKEY = ^Q; { quit the edit mode }
- SWAPKEY = ^O; { swap hex/ASCII mode }
- PRINTKEY = 'P'; { print current block }
- ENDKEY = 'Z'; { display last block }
- BEGINKEY = 'B'; { display beginning block }
- HELPKEY = '?'; { display menu }
- EDITKEY = 'E'; { enter edit mode }
- SETKEY = 'S'; { set block number }
- DUMPKEY = 'D'; { dump entire file }
- QUITKEY = 'Q'; { exit program }
- MISTAKE = #0; { NULL }
- XHOME = 1; { x-coordinate, cursor home }
- YHOME = 24; { y-coordinate, cursor home }
- XHEXBASE = 7; { x-coordinate, hex field offset }
- XASCBASE = 59; { x-coordinate, ASCII field offset }
- CR = #$0D; { ASCII carriage return }
-
- TYPE
- STRING4 = STRING [4];
- STRING2 = STRING [2];
- STRING35 = STRING [35];
- STRING80 = STRING [80];
- STRING255 = STRING [255];
- BUFFTYPE = ARRAY [0..127] OF BYTE;
-
- VAR
- BUFF : BUFFTYPE; { file sector buffer }
- DISKFILE : FILE; { un-typed file }
- FILENAME : STRING [32]; { file specification }
- POINT : INTEGER; { always points to current block }
- CH : CHAR; { global user input character }
- I, { control varaible for main program }
- TEMPNUM : INTEGER;
- SENDFF : BOOLEAN; { send form-feed on program termination }
-
- {$I CMDLINE.msd} { MSDOS CMDLINE function }
- (* {$I CMDLINE.CPM} *) { CP/M80 CMDLINE function }
- {$I FUNCS.INC} { miscellaneous functions }
- {$I DISPLAY.INC} { screen display routines }
-
- PROCEDURE DISPLAYBLOCK (PDEV : BOOLEAN);
- { ***************************************************************************
- Display one block - send to LST if PDEV is TRUE, otherwise send to CON
- ***************************************************************************
- }
- BEGIN
- IF PDEV THEN WRITELN (LST,'File: ',FILENAME,' Current Block=',POINT:5,
- ' Ending Block=',(FILESIZE(DISKFILE)-1):5)
- ELSE
- BEGIN
- WRITELN;
- WRITELN;
- LOWVIDEO; { display heading }
- WRITE ('File:');
- HIGHVIDEO;
- WRITE (FILENAME);
- LOWVIDEO;
- WRITE (' Current Block=');
- HIGHVIDEO;
- WRITE (POINT:5);
- LOWVIDEO;
- WRITE (' Ending Block=');
- HIGHVIDEO;
- WRITE ((FILESIZE(DISKFILE)-1):5);
- END;
-
- IF PDEV THEN
- BEGIN { display body of block }
- DISPLAY ('LST:',BUFF,POINT*RECSIZE);
- WRITELN (LST);
- END
- ELSE
- BEGIN
- WRITELN;
- DISPLAY ('CON:',BUFF,POINT*RECSIZE);
- END;
- END; { DISPLAYBLOCK }
-
- {$I EDIT.INC} { screen editing routines }
-
- PROCEDURE COMMANDS;
- { ***************************************************************************
- Display the menu of commands
- ***************************************************************************
- }
- BEGIN
- LOWVIDEO;
- WRITELN (REPLICATE(79,'-'));
- HIGHVIDEO;
- WRITELN (REPLICATE(CENTER('REVIEW MODE',80),' '),'REVIEW MODE');
- WRITE ('^',CHR(ORD(DOWNKEY) + $40),' ');
- LOWVIDEO;
- WRITE ('Previous Block ');
- HIGHVIDEO;
- WRITE ('^',CHR(ORD(UPKEY) + $40),' ');
- LOWVIDEO;
- WRITE ('Next Block ');
- HIGHVIDEO;
- WRITE (' ',SETKEY,' ');
- LOWVIDEO;
- WRITE ('Set Block Number ');
- HIGHVIDEO;
- WRITE (' ',ENDKEY,' ');
- LOWVIDEO;
- WRITE ('Set Last Block ');
- WRITELN;
- HIGHVIDEO;
- WRITE (' ',BEGINKEY,' ');
- LOWVIDEO;
- WRITE ('Set First Block ');
- HIGHVIDEO;
- WRITE (' ',EDITKEY,' ');
- LOWVIDEO;
- WRITE ('Edit ');
- HIGHVIDEO;
- WRITE (' ',QUITKEY,' ');
- LOWVIDEO;
- WRITE ('Quit ');
- HIGHVIDEO;
- WRITE (' ',HELPKEY,' ');
- LOWVIDEO;
- WRITELN ('Commands');
- HIGHVIDEO;
- WRITE (' ',PRINTKEY,' ');
- LOWVIDEO;
- WRITE ('Print Block ');
- HIGHVIDEO;
- WRITE (' ',DUMPKEY,' ');
- LOWVIDEO;
- WRITE ('Dump Entire File');
- WRITELN;
- HIGHVIDEO;
- WRITELN (REPLICATE(CENTER('EDIT MODE',80),' '),'EDIT MODE');
- WRITE ('^',CHR(ORD(WRITEKEY) + $40),' ');
- LOWVIDEO;
- WRITE ('Write Buffer ');
- HIGHVIDEO;
- WRITE ('^',CHR(ORD(EXITKEY) + $40),' ');
- LOWVIDEO;
- WRITE ('Quit Edit ');
- HIGHVIDEO;
- WRITE ('^',CHR(ORD(SWAPKEY) + $40),' ');
- LOWVIDEO;
- WRITE ('Swap Hex/ASCII ');
- HIGHVIDEO;
- WRITE ('^',CHR(ORD(DOWNKEY) + $40),' ');
- LOWVIDEO;
- WRITE ('Cursor Down ');
- WRITELN;
- HIGHVIDEO;
- WRITE ('^',CHR(ORD(UPKEY) + $40),' ');
- LOWVIDEO;
- WRITE ('Cursor Up ');
- HIGHVIDEO;
- WRITE ('^',CHR(ORD(LEFTKEY) + $40),' ');
- LOWVIDEO;
- WRITE ('Cursor Left ');
- HIGHVIDEO;
- WRITE ('^',CHR(ORD(RIGHTKEY) + $40),' ');
- LOWVIDEO;
- WRITE ('Cursor Right ');
- WRITELN;
- LOWVIDEO;
- WRITELN (REPLICATE(79,'-'));
- END; { COMMANDS }
-
- { ***************************************************************************
- }
-
- BEGIN { EDISK }
- FILENAME := CMDLINE; { get the filespec from command line }
- IF LENGTH (FILENAME) > 0 THEN { file was specified }
- BEGIN
- ASSIGN (DISKFILE,FILENAME);
- {$I-}
- RESET (DISKFILE);
- {$I+}
- IF IORESULT = 0 THEN { file does exist }
- BEGIN
- FOR I := 1 TO 24 DO WRITELN; { go to bottom of screen }
- WRITELN (REPLICATE(15,' '),
- ' EDISK -- Rev ',REVISION);
- WRITELN (REPLICATE(15,' '),
- 'Copyright (c) 1985 by Future Communications');
- POINT := 0; { points to current block }
- CH := QUITKEY; { initialize variables }
- SENDFF := FALSE;
- COMMANDS; { display menu }
- REPEAT { review mode input loop }
- IF NOT (CH IN [MISTAKE,DUMPKEY,PRINTKEY]) THEN
- BEGIN { display current block }
- SEEK (DISKFILE,POINT);
- BLOCKREAD (DISKFILE,BUFF,1);
- DISPLAYBLOCK (FALSE);
- END; { IF }
- LOWVIDEO;
- WRITE ('Command:');
- HIGHVIDEO;
- READ (KBD,CH); { get user input }
- WRITE (CR);
- CLREOL;
- CH := UPCASE (CH);
- CASE CH OF
- DOWNKEY : BEGIN { display previous block }
- POINT := PRED (POINT);
- IF POINT < 0 THEN POINT := 0;
- END;
- UPKEY : BEGIN { display next block }
- POINT := SUCC (POINT);
- IF POINT > FILESIZE (DISKFILE) - 1 THEN
- POINT := FILESIZE (DISKFILE) - 1;
- END;
- HELPKEY : BEGIN
- WRITELN;
- WRITELN;
- COMMANDS; { display menu }
- END;
- SETKEY : BEGIN { set block number }
- LOWVIDEO;
- WRITE ('Enter Block Number:');
- HIGHVIDEO;
- READLN (TEMPNUM);
- IF (TEMPNUM >= 0) AND
- (TEMPNUM < FILESIZE (DISKFILE))
- THEN POINT := TEMPNUM;
- END;
- ENDKEY : POINT := FILESIZE (DISKFILE) - 1; { last block }
- BEGINKEY : POINT := 0; { first block }
- QUITKEY : WRITELN; { exit review mode }
- EDITKEY : EDIT; { enter edit mode }
- PRINTKEY : BEGIN { print current block }
- SENDFF := TRUE; { send form feed on exit }
- LOWVIDEO;
- WRITE (#13,'Printing ....');
- HIGHVIDEO;
- DISPLAYBLOCK (TRUE);
- WRITE (#13);
- CLREOL;
- END;
- DUMPKEY : BEGIN { dump entire file }
- I := POINT;
- LOWVIDEO;
- WRITE (#13,'Printing ....');
- HIGHVIDEO;
- POINT := 0;
- REPEAT
- SEEK (DISKFILE,POINT);
- BLOCKREAD (DISKFILE,BUFF,1);
- DISPLAYBLOCK (TRUE);
- POINT := SUCC (POINT);
- UNTIL POINT = FILESIZE (DISKFILE);
- WRITE (LST,^L);
- POINT := I; { restore location }
- SEEK (DISKFILE,POINT);
- BLOCKREAD (DISKFILE,BUFF,1);
- WRITE (#13);
- CLREOL;
- END;
- ELSE
- BEGIN
- WRITE (#7); { invalid command }
- CH := MISTAKE;
- END;
- END; { CASE }
- UNTIL CH = QUITKEY;
- CLOSE (DISKFILE);
- IF SENDFF THEN WRITE (LST,^L);
- END { IF FILES EXISTS }
- ELSE
- BEGIN
- WRITELN (#7,'? ',FILENAME,' does not exist');
- END; { ELSE }
- WRITELN ('> End EDISK <');
- END
- ELSE WRITELN (#7,'Usage: A>EDISK [filename]');
- END. { EDISK }
-
- { ***************************************************************************
- End EDISK.PAS
- ***************************************************************************
- }
-