home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / INFO / TURBOPAS / EDISK.ZIP / EDISK.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1985-12-22  |  14.1 KB  |  374 lines

  1. PROGRAM EDISK (INPUT,OUTPUT,DISKFILE);
  2. {  ***************************************************************************
  3.                                    EDISK.PAS
  4.                       File examination and editing utility.
  5.  
  6.    Copyright (c) 1985 Future Communications, Atlanta, Georgia and published
  7.    in the Public Domain for non-commercial use.
  8.  
  9.    SOURCE:                  Turbo Pascal
  10.    Version compiled under:  3.0
  11.    O/S:                     MSDOS 2.1, PCDOS 2.1, CP/M80 2.2
  12.  
  13.    To compile, edit EDISK.PAS to:
  14.       (1)  Select 24 or 25 line display
  15.       (2)  Select include files for operating system:
  16.            MSDOS/PCDOS              CP/M80
  17.            -----------              -----------
  18.            EDISK.PAS                EDISK.PAS
  19.            CMDLINE.MSD              CMDLINE.CPM
  20.            DISPLAY.INC              DISPLAY.INC
  21.            EDIT.INC                 EDIT.INC
  22.  
  23.    PURPOSE:
  24.  
  25.       Diskfile debugger in ASCII or hex.
  26.  
  27.    PARAMETERS
  28.  
  29.       Parameters are passed by Command Line
  30.  
  31.    DESCRIPTION:
  32.  
  33.       A>EDISK [filename]
  34.  
  35.       There are two modes in which this program  operates,  REVIEW
  36.       and EDIT.   The REVIEW mode is to view the file 128 bytes at
  37.       a  time  and  supports  the  following  functions  from  the
  38.       "Command:" prompt:
  39.            ^X   Display  the  previous block (decrement the  block
  40.                 number).
  41.            ^E   Display  the  next  block  (increment  the   block
  42.                 number).
  43.            S    Set the block number.
  44.            Z    Position the file at the last block in the file.
  45.            B    Position the file at the first block in the file.
  46.            E    Enter edit mode.
  47.            Q    Exit the program.
  48.            ?    Display  a  list of commands (automatic  when  the
  49.                 program first starts up).
  50.            P    Print the displayed block on the printer.
  51.            D    Dump the entire file to the printer.
  52.  
  53.       When  the  EDIT mode has been entered,  the cursor is  posi-
  54.       tioned  at the first byte in the block in the hex region  of
  55.       the display.  You may modify the block a nybble at a time in
  56.       the  hex  region by entering any valid hex  digit  (case  is
  57.       ignored).   In the ASCII region, you may enter any printable
  58.       character  into the block.   The following control codes are
  59.       valid in the EDIT mode:
  60.            ^W   Write  the  edited buffer out to  the  disk  (this
  61.                 command  must be invoked to modify the disk file).
  62.                 You  are  returned  to the REVIEW  mode  when  the
  63.                 buffer is written out.
  64.            ^Q   Quit  the EDIT mode WITHOUT writing the buffer  to
  65.                 the disk.  You are returned to the REVIEW mode.
  66.            ^O   Swap ASCII and hex regions.   The cursor will move
  67.                 to  the  byte being edited  in  the  corresponding
  68.                 region.
  69.            ^X   Cursor down (+16 bytes in the buffer).
  70.            ^E   Cursor up (-16 bytes in the buffer).
  71.            ^S   Cursor left (one nybble in hex region and one byte
  72.                 in ASCII region).
  73.            ^D   Cursor  right  (one nybble in hex region  and  one
  74.                 byte in ASCII region).
  75.  
  76.    ***************************************************************************
  77. }
  78. CONST
  79.              { YBASE will have one of the following definitions    }
  80.              { according to the system on which EDISK is to be run }
  81.              { comment out the definitions that don't apply to     }
  82.              { your console.                                       }
  83.    YBASE      = 16;           { 24 line display }
  84.  { YBASE      = 17; }         { 25 line display (including IBMPC) }
  85.    RECSIZE    = 128;          { displayable block size }
  86.    REVISION   = '1.7';        { current revision }
  87.    UPKEY      = ^E;           { cursor up }
  88.    DOWNKEY    = ^X;           { cursor down }
  89.    LEFTKEY    = ^S;           { cursor left }
  90.    RIGHTKEY   = ^D;           { cursor right }
  91.    WRITEKEY   = ^W;           { write current block to disk }
  92.    EXITKEY    = ^Q;           { quit the edit mode }
  93.    SWAPKEY    = ^O;           { swap hex/ASCII mode }
  94.    PRINTKEY   = 'P';          { print current block }
  95.    ENDKEY     = 'Z';          { display last block }
  96.    BEGINKEY   = 'B';          { display beginning block }
  97.    HELPKEY    = '?';          { display menu }
  98.    EDITKEY    = 'E';          { enter edit mode }
  99.    SETKEY     = 'S';          { set block number }
  100.    DUMPKEY    = 'D';          { dump entire file }
  101.    QUITKEY    = 'Q';          { exit program }
  102.    MISTAKE    = #0;           { NULL }
  103.    XHOME      = 1;            { x-coordinate, cursor home }
  104.    YHOME      = 24;           { y-coordinate, cursor home }
  105.    XHEXBASE   = 7;            { x-coordinate, hex field offset }
  106.    XASCBASE   = 59;           { x-coordinate, ASCII field offset }
  107.    CR         = #$0D;         { ASCII carriage return }
  108.  
  109. TYPE
  110.    STRING4    = STRING [4];
  111.    STRING2    = STRING [2];
  112.    STRING35   = STRING [35];
  113.    STRING80   = STRING [80];
  114.    STRING255  = STRING [255];
  115.    BUFFTYPE   = ARRAY [0..127] OF BYTE;
  116.  
  117. VAR
  118.    BUFF       : BUFFTYPE;     { file sector buffer }
  119.    DISKFILE   : FILE;         { un-typed file }
  120.    FILENAME   : STRING [32];  { file specification }
  121.    POINT      : INTEGER;      { always points to current block }
  122.    CH         : CHAR;         { global user input character }
  123.    I,                         { control varaible for main program }
  124.    TEMPNUM    : INTEGER;
  125.    SENDFF     : BOOLEAN;      { send form-feed on program termination }
  126.  
  127. {$I CMDLINE.msd}              { MSDOS CMDLINE function }
  128. (* {$I CMDLINE.CPM} *)        { CP/M80 CMDLINE function }
  129. {$I FUNCS.INC}                { miscellaneous functions }
  130. {$I DISPLAY.INC}              { screen display routines }
  131.  
  132. PROCEDURE DISPLAYBLOCK (PDEV : BOOLEAN);
  133. {  ***************************************************************************
  134.    Display one block - send to LST if PDEV is TRUE, otherwise send to CON
  135.    ***************************************************************************
  136. }
  137. BEGIN
  138.    IF PDEV THEN WRITELN (LST,'File: ',FILENAME,'  Current Block=',POINT:5,
  139.       '  Ending Block=',(FILESIZE(DISKFILE)-1):5)
  140.    ELSE
  141.    BEGIN
  142.       WRITELN;
  143.       WRITELN;
  144.       LOWVIDEO;                               { display heading }
  145.       WRITE ('File:');
  146.       HIGHVIDEO;
  147.       WRITE (FILENAME);
  148.       LOWVIDEO;
  149.       WRITE ('  Current Block=');
  150.       HIGHVIDEO;
  151.       WRITE (POINT:5);
  152.       LOWVIDEO;
  153.       WRITE ('  Ending Block=');
  154.       HIGHVIDEO;
  155.       WRITE ((FILESIZE(DISKFILE)-1):5);
  156.    END;
  157.  
  158.    IF PDEV THEN
  159.    BEGIN                                   { display body of block }
  160.       DISPLAY ('LST:',BUFF,POINT*RECSIZE);
  161.       WRITELN (LST);
  162.    END
  163.    ELSE
  164.    BEGIN
  165.       WRITELN;
  166.       DISPLAY ('CON:',BUFF,POINT*RECSIZE);
  167.    END;
  168. END; { DISPLAYBLOCK }
  169.  
  170. {$I EDIT.INC}                    { screen editing routines }
  171.  
  172. PROCEDURE COMMANDS;
  173. {  ***************************************************************************
  174.    Display the menu of commands
  175.    ***************************************************************************
  176. }
  177. BEGIN
  178.    LOWVIDEO;
  179.    WRITELN (REPLICATE(79,'-'));
  180.    HIGHVIDEO;
  181.    WRITELN (REPLICATE(CENTER('REVIEW MODE',80),' '),'REVIEW MODE');
  182.    WRITE ('^',CHR(ORD(DOWNKEY) + $40),' ');
  183.    LOWVIDEO;
  184.    WRITE ('Previous Block   ');
  185.    HIGHVIDEO;
  186.    WRITE ('^',CHR(ORD(UPKEY) + $40),' ');
  187.    LOWVIDEO;
  188.    WRITE ('Next Block       ');
  189.    HIGHVIDEO;
  190.    WRITE (' ',SETKEY,' ');
  191.    LOWVIDEO;
  192.    WRITE ('Set Block Number ');
  193.    HIGHVIDEO;
  194.    WRITE (' ',ENDKEY,' ');
  195.    LOWVIDEO;
  196.    WRITE ('Set Last Block  ');
  197.    WRITELN;
  198.    HIGHVIDEO;
  199.    WRITE (' ',BEGINKEY,' ');
  200.    LOWVIDEO;
  201.    WRITE ('Set First Block  ');
  202.    HIGHVIDEO;
  203.    WRITE (' ',EDITKEY,' ');
  204.    LOWVIDEO;
  205.    WRITE ('Edit             ');
  206.    HIGHVIDEO;
  207.    WRITE (' ',QUITKEY,' ');
  208.    LOWVIDEO;
  209.    WRITE ('Quit             ');
  210.    HIGHVIDEO;
  211.    WRITE (' ',HELPKEY,' ');
  212.    LOWVIDEO;
  213.    WRITELN ('Commands');
  214.    HIGHVIDEO;
  215.    WRITE (' ',PRINTKEY,' ');
  216.    LOWVIDEO;
  217.    WRITE ('Print Block      ');
  218.    HIGHVIDEO;
  219.    WRITE (' ',DUMPKEY,' ');
  220.    LOWVIDEO;
  221.    WRITE ('Dump Entire File');
  222.    WRITELN;
  223.    HIGHVIDEO;
  224.    WRITELN (REPLICATE(CENTER('EDIT MODE',80),' '),'EDIT MODE');
  225.    WRITE ('^',CHR(ORD(WRITEKEY) + $40),' ');
  226.    LOWVIDEO;
  227.    WRITE ('Write Buffer     ');
  228.    HIGHVIDEO;
  229.    WRITE ('^',CHR(ORD(EXITKEY) + $40),' ');
  230.    LOWVIDEO;
  231.    WRITE ('Quit Edit        ');
  232.    HIGHVIDEO;
  233.    WRITE ('^',CHR(ORD(SWAPKEY) + $40),' ');
  234.    LOWVIDEO;
  235.    WRITE ('Swap Hex/ASCII   ');
  236.    HIGHVIDEO;
  237.    WRITE ('^',CHR(ORD(DOWNKEY) + $40),' ');
  238.    LOWVIDEO;
  239.    WRITE ('Cursor Down     ');
  240.    WRITELN;
  241.    HIGHVIDEO;
  242.    WRITE ('^',CHR(ORD(UPKEY) + $40),' ');
  243.    LOWVIDEO;
  244.    WRITE ('Cursor Up        ');
  245.    HIGHVIDEO;
  246.    WRITE ('^',CHR(ORD(LEFTKEY) + $40),' ');
  247.    LOWVIDEO;
  248.    WRITE ('Cursor Left      ');
  249.    HIGHVIDEO;
  250.    WRITE ('^',CHR(ORD(RIGHTKEY) + $40),' ');
  251.    LOWVIDEO;
  252.    WRITE ('Cursor Right     ');
  253.    WRITELN;
  254.    LOWVIDEO;
  255.    WRITELN (REPLICATE(79,'-'));
  256. END; { COMMANDS }
  257.  
  258. {  ***************************************************************************
  259. }
  260.  
  261. BEGIN  { EDISK }
  262.    FILENAME := CMDLINE;                  { get the filespec from command line }
  263.    IF LENGTH (FILENAME) > 0 THEN         { file was specified }
  264.    BEGIN
  265.       ASSIGN (DISKFILE,FILENAME);
  266.       {$I-}
  267.       RESET (DISKFILE);
  268.       {$I+}
  269.       IF IORESULT = 0 THEN               { file does exist }
  270.       BEGIN
  271.          FOR I := 1 TO 24 DO WRITELN;            { go to bottom of screen }
  272.          WRITELN (REPLICATE(15,' '),
  273.             ' EDISK -- Rev ',REVISION);
  274.          WRITELN (REPLICATE(15,' '),
  275.             'Copyright (c) 1985 by Future Communications');
  276.          POINT := 0;                             { points to current block }
  277.          CH := QUITKEY;                          { initialize variables }
  278.          SENDFF := FALSE;
  279.          COMMANDS;                               { display menu }
  280.          REPEAT                                  { review mode input loop }
  281.             IF NOT (CH IN [MISTAKE,DUMPKEY,PRINTKEY]) THEN
  282.             BEGIN                                { display current block }
  283.                SEEK (DISKFILE,POINT);
  284.                BLOCKREAD (DISKFILE,BUFF,1);
  285.                DISPLAYBLOCK (FALSE);
  286.             END; { IF }
  287.             LOWVIDEO;
  288.             WRITE ('Command:');
  289.             HIGHVIDEO;
  290.             READ (KBD,CH);                       { get user input }
  291.             WRITE (CR);
  292.             CLREOL;
  293.             CH := UPCASE (CH);
  294.             CASE CH OF
  295.                DOWNKEY  : BEGIN                  { display previous block }
  296.                              POINT := PRED (POINT);
  297.                              IF POINT < 0 THEN POINT := 0;
  298.                           END;
  299.                UPKEY    : BEGIN                  { display next block }
  300.                              POINT := SUCC (POINT);
  301.                              IF POINT > FILESIZE (DISKFILE) - 1 THEN
  302.                                 POINT := FILESIZE (DISKFILE) - 1;
  303.                           END;
  304.                HELPKEY  : BEGIN
  305.                              WRITELN;
  306.                              WRITELN;
  307.                              COMMANDS;              { display menu }
  308.                           END;
  309.                SETKEY   : BEGIN                  { set block number }
  310.                              LOWVIDEO;
  311.                              WRITE ('Enter Block Number:');
  312.                              HIGHVIDEO;
  313.                              READLN (TEMPNUM);
  314.                              IF (TEMPNUM >= 0) AND
  315.                                 (TEMPNUM < FILESIZE (DISKFILE))
  316.                                 THEN POINT := TEMPNUM;
  317.                           END;
  318.                ENDKEY   : POINT := FILESIZE (DISKFILE) - 1;  { last block }
  319.                BEGINKEY : POINT := 0;             { first block }
  320.                QUITKEY  : WRITELN;                { exit review mode }
  321.                EDITKEY  : EDIT;                   { enter edit mode }
  322.                PRINTKEY : BEGIN                  { print current block }
  323.                              SENDFF := TRUE;     { send form feed on exit }
  324.                              LOWVIDEO;
  325.                              WRITE (#13,'Printing ....');
  326.                              HIGHVIDEO;
  327.                              DISPLAYBLOCK (TRUE);
  328.                              WRITE (#13);
  329.                              CLREOL;
  330.                           END;
  331.                DUMPKEY  : BEGIN                   { dump entire file }
  332.                              I := POINT;
  333.                              LOWVIDEO;
  334.                              WRITE (#13,'Printing ....');
  335.                              HIGHVIDEO;
  336.                              POINT := 0;
  337.                              REPEAT
  338.                                 SEEK (DISKFILE,POINT);
  339.                                 BLOCKREAD (DISKFILE,BUFF,1);
  340.                                 DISPLAYBLOCK (TRUE);
  341.                                 POINT := SUCC (POINT);
  342.                              UNTIL POINT = FILESIZE (DISKFILE);
  343.                              WRITE (LST,^L);
  344.                              POINT := I;         { restore location }
  345.                              SEEK (DISKFILE,POINT);
  346.                              BLOCKREAD (DISKFILE,BUFF,1);
  347.                              WRITE (#13);
  348.                              CLREOL;
  349.                           END;
  350.             ELSE
  351.             BEGIN
  352.                WRITE (#7);                      { invalid command }
  353.                CH := MISTAKE;
  354.             END;
  355.             END; { CASE }
  356.          UNTIL CH = QUITKEY;
  357.          CLOSE (DISKFILE);
  358.          IF SENDFF THEN WRITE (LST,^L);
  359.       END  { IF FILES EXISTS }
  360.       ELSE
  361.       BEGIN
  362.          WRITELN (#7,'? ',FILENAME,' does not exist');
  363.       END; { ELSE }
  364.       WRITELN ('> End EDISK <');
  365.    END
  366.    ELSE WRITELN (#7,'Usage:  A>EDISK [filename]');
  367. END.  { EDISK }
  368.  
  369. {  ***************************************************************************
  370.    End EDISK.PAS
  371.    ***************************************************************************
  372. }
  373.  
  374.