EDFILE UTILITY USAGE
                         Jan 10, 1984

by Mike Mosko, K3RL

EDFILE  is  a  public  domain utility which  allows  display  and
editing of data in files.  It has been tested and run under CP/M-
80  version   2.2 and TurboDOS 1.2 and should run in any  CP/M-80
type environment.

EDFILE  is  approximately  11k  in size.  EDFILE  may  be  freely
distributed  to whomever desires it.  The date of  this  document
should  agree  with  the version date in  EDFILE.

FEATURES:
========

    - Hex and ASCII display of record data.
    - Screen editing of selected record.
    - Hex or ASCII input when editing file records.
    - Fully programmable cursor control.
    - Powerful file search capabilities.
    - Forward and backward record scrolling.
    - Address and/or record number referencing.
    - Decimal or Hex number inputs.
    - Disk reset on input (prevents Disk R/O error).
    - Full online abbreviated help AND expanded help menus.


INSTALLATION:
============

The  following  information  will aid the  user  when  installing
EDFILE  on a different terminal.

The EDFILE original distribution program is originally configured
for  an  ADM-3A  type  terminal or equivalent (I  use  a  Digilog
S1500).  The  terminal must be able to display 80 columns  by  24
rows.  The only absolutely necessary function required for proper
use   is  the  cursor  positioning  function.   Other   functions
that  can be added merely for visual purposes are the cursor  on,
cursor  off and clear to end-of-line functions.  If the clear  to
end-of-line  function is not preprogrammed,  it is  performed  in
software.  These  functions  are not implemented in the  original
distribution version of EDFILE.  For ADM-3A type  terminals,  the
following  commands can be patched in EDFILE if these  attributes
are desired:

    Clear to end-of-line .... ESC 'Q' (1B,51)
    Enable Cursor ........... ESC 'X' (1B,58)
    Disable Cursor .......... ESC 'Y' (1B,59)

For example, to add the clear to end-of-line function, patch a 02
for  the string length (2 bytes for the sequence) at address 146.
Then patch a 1B in location 147 and a 51 in location 148.

Certain  functions  are programmable for the type of terminal  in
use.  Five bytes are reserved for each terminal function  (string
sequence).  The  first  byte represents the length of the  string
sequence.  For example: the initial cursor positioning string for
an  ADM-3A  terminal is 'ESC ='.  This is two  bytes  in  length.
Therefore,  the  values  inserted  into  the  cursor  positioning
sequence  area  are (in hex):  02,1B,3D.  To complete the  cursor
positioning sequence for the terminal, the row and column must be
issued  as  well.  The ADM-3A requires an  adjustment  value  (or
offset)  of  32 decimal (20 hex) be added to the row and  column.
For terminals that require a different offset,  this value can be
changed  as  well.

The row is usually sent before the column,  but if your  terminal
is different, i.e., the column must be issued first, then set the
high order bit of the cursor offset value.  This flags the cursor
positioning  routine  to  send the column before  the  row.   The
following  addresses  detail  the  location  of  the   modifiable
parameters for the terminal.

Address   Default (hex)    Function
-------   -------------    --------
140       02,1B,3D,00,00  *Initial cursor positioning string sequence
145       20              *Row/column adjustment (set high bit for column/row)
146       00,00,00,00,00   Clear to end-of-line string sequence
14B       00,00,00,00,00   Enable cursor (cursor on) string sequence
150       00,00,00,00,00   Disable cursor (cursor off) string sequence
155       08               Cursor left (normally CTRL-H)
156       0C               Cursor right (normally CTRL-L)
157       0B               Cursor up (normally CTRL-K)
158       0A               Cursor down (normally CTRL-J)
159       00..........00   Terminal initialization string (35 bytes)

* - Must be implemented.

If  your  terminal requires some sort of  initialization  string,
either to preset it or to program a function key pad, this can be
inserted  into the terminal initialization string area  provided.
The  first byte represents the length of the string to be  issued
to   the  terminal.   There  are  35  bytes  available   for   an
initialization string.  Why so many? The Digilog S1500 computer I
use allows reprogramming of the numeric keypad.  This requires 28
bytes.

The  actual  control  sequences for positioning the  cursor  (up,
down,  left  and  right) can be changed.  This  is  provided  for
terminals  that have cursor positioning keypads which don't issue
the  same ones programmed here.  For example:  usually  a  CTRL-L
moves the cursor one space to the right.  However, if your cursor
pad issues some other control character,  like a CTRL-D (WordStar
type),  then patch a 04 (hex equivalent of CTRL-D) for the cursor
right value.  Note, the help menus will still display the default
values for up, down, left and right cursor movements. You'll have
to make a note about this or, better yet, use EDFILE to patch the
help menus.

All of the above modifications (patches) can be made easily  with
EDFILE itself.  Of course, if it won't run at all, you'll have to
resort  to  some sort of debugger  such  as  DDT,  SID,  MONITOR,
etc...,  or  better  yet,  use  someone  elses  computer  with  a
(working) version of EDFILE to modify it for your terminal.

EDFILE  should work on virtually all terminals currently in  use.
There  may be some real strange ones out there that I don't  know
about, but that's life.


OPERATION:
=========
EDFILE  is simple to use especially with the online  help  menus.
Therefore, just a few tidbits of information is provided here for
operation.  To invoke EDFILE,  simply type EDFILE followed by the
name of the file you wish to dump and/or edit.  Example:

         EDFILE EDFILE.COM

The display should look similar to the following:

-------------------------------------------------------------------------------
Vers: 01-10-84; by: J.C.Kaltwasser & M.J.Mosko, K3RL

File: EDFILE.COM  Record: 00000 (0000H)   LOF: 00086 (0056H)
       00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F       0123456789ABCDEF
       -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --       ----------------
0100  - 31 EA 01 C3 EA 01 0D 0A 56 65 72 73 3A 20 30 31      >1j.Cj...Vers: 01<
0110  - 2D 31 30 2D 38 34 3B 20 62 79 3A 20 4A 2E 43 2E      >-10-84; by: J.C.<
0120  - 4B 61 6C 74 77 61 73 73 65 72 20 26 20 4D 2E 4A      >Kaltwasser & M.J<
0130  - 2E 4D 6F 73 6B 6F 2C 20 4B 33 52 4C 0D 0A 24 1A      >.Mosko, K3RL..$.<
0140  - 02 1B 3D 00 00 20 00 00 00 00 00 00 00 00 00 00      >..=.............<
0150  - 00 00 00 00 00 08 0C 0B 0A 00 00 00 00 00 00 00      >................<
0160  - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      >................<
0170  - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      >................<
?
-------------------------------------------------------------------------------

EDFILE  performs  an  automatic disk reset  (^C)  when  executed.
Therefore,  don't  panic  if you suddenly realized you forgot  to
perform a Control-C after making some changes.  This prevents the
infamous (and frustrating) Bdos Err on A:  R/O from occuring when
writing records.

The  LOF  means the Length-Of-File which is the total  number  of
records  in  the  file.  Record  numbers begin  at  0;  the  last
displayable record number is actually the LOF - 1.

If  you don't specify a file on the command line,  you'll get  an
error:  "No File Specified."; or if the file is not found, you'll
get an error telling you this: "<filename> Not Found." Simple.

At the ? prompt, type 'H'. The brief help menu will be displayed:

-------------------------------------------------------------------------------
Read/Edit File Utility Functions:
A - Address to dump         B - Dump at beginning       C - Continue Search
E - Enter Edit Mode         H - This help list          M - Expanded Help list
O - Set address offset      Q - Quit this program       R - Read & dump record
S - Search for string       Z - Dump at end of file     CR - (+/=) - Adv record
(-/_) - Decr record

Edit Mode Functions:
^E - Toggle data fields     ^W - Write buffer out       ^X - Abort Edit Mode
^J - Cursor Down            ^K - Cursor Up              ^H - Cursor Left
^L - Cursor Right
-------------------------------------------------------------------------------

Again at the ? prompt, type 'M'. This will display the expanded help menu.

-------------------------------------------------------------------------------
Read/Edit File Utility Functions:
   A - Enter relative address to dump
   B - Set record to beginning of file and dump data
   C - Continue search. Restarts search on last entered search string.
   E - Enter Edit mode on current record
   H - Brief description of the functions
   M - This help description
   O - Enter offset address relative to start of file (.COM = 100h)
   Q - Quit program
   R - Enter record number to dump
   S - Search for hex or ASCII string in file (starts at current record)
           '\' = ASCII string delimiters (ex: \Test\)
           ',' = hex and/or ASCII delimiters (ex: 41,\Test\,4A
           ';' = select search options
                   A - Start search from beginning of file
                   B - Search Backwards
                   M - Search on certain bits set; use mask xx
                   O - Stop on xx occurrence of string
                   U - Translate lower case characters to upper case
                   Z - Search recognition on least significant 7 bits only

   Z - Set record to end of file and dump data
   CR - carriage return (or +/= key) - advances record and dumps the data
   -/_ key - decrements record and dumps the data
Edit mode: ('^' refers to the Control key)
   ^[ - (ESC) Accept next char into edit field even if a control char
   ^E - Toggle between ASCII and hex data fields
   ^W - Flush record to disk
   ^X - Abort edit mode without updating record

   ^J - Cursor down            ^K - Cursor up
   ^H - Cursor left            ^L - Cursor right
Input integers are decimal. Use 'h' suffix for hexadecimal entries.
-------------------------------------------------------------------------------

Use  the '=' key (which has the '+') or the RETURN key to advance
the record. You don't have to use the shift key with the '=' key.
EDFILE will wrap around to the start of the file when  attempting
to advance beyond the end of the file.

The  following  paragraphs  expand on the features  available  in
EDFILE.  Most  of the options are self-explanatory from the  help
menus.  However,  some  require additional explanations  and  are
provided below.

ADDRESS/OFFSET OPTIONS
----------------------
The  address option allows you to specify an address  within  the
file. This is useful for patching COM files and the like when the
address  of  the patch is known.  Note that when  EDFILE'ing  COM
files,  EDFILE automatically sets the offset to 0100h. The offset
can  be  changed by typing 'O' at the command level and  entering
the  desired  offset.  The  headings  will be  adjusted  for  the
different   offset  automatically.   The  address  option  always
references  the starting offset so that locations within programs
which don't begin at 0100h (overlays,  for example) can be easily
referenced  once  the offset has been  properly  programmed.  The
Address option also has a wrap-around feature so that  references
below the current offset will be readjusted.  This feature can be
quite  handy  when tinkering around with COM files.  You have  to
experiment a little to pickup the usefulness of these options.

SEARCH OPTION
-------------
The  'search'  option is the most involved because it  offers  so
many different possibilites. The description provided here should
provide enough information to effectively use it.

String  searches  normally  start  from the  current  record  and
proceed  until the end of the file (EOF) is encountered.  Certain
suboptions can alter this sequence.  If a match is not found, the
program  will indicate this and restore the screen to the  record
last  displayed.  The search can be aborted at any time by simply
striking a key.

If a string match occurs across records,  the search will stop on
the  last  record  read into its' local buffer and  position  the
cursor  at  the end of the found string.  It  just  wasn't  worth
putting in the extra code to handle this wierd situation.

When  using the Occurrence ('O') and Mask ('M')  suboptions,  the
program will prompt for the occurrence number and/or search  mask
to  be  used.  The suboptions are inserted after a  semicolon  to
delimit them from the search string entered.  No spaces should be
inserted   between  the  suboptions.   Upper  or  lower  case  is
acceptable. Example:

    ?Search String = \This is great\;auo
    Stop on string occurrence = 3

 This  means to search for the string 'This is  great'  starting
 from    the  beginning of the file,  ignoring the case  of  the
 string  (i.e.,  translate lower to upper case) and stopping  on
 the third occurrence of the string.

ASCII  strings  must  be delimitted  by  backslashes  ('\').  The
limitation  here,  of  course,  is  that  you  can't  search  for
backslashes in the file.  So use the hex equivalent if necessary:
5C.

The  'U'  suboption  (translate lower case to  upper  case)  will
translate the search string to upper case automatically,  as well
as  converting all lower case characters read from the file.  So,
you  don't  have to input the search string in  upper  case  when
using the 'U' suboption.

When  inputting hexidecimal values as part of a search key,  they
MUST be two-digit HEX (not decimal) numbers. An invalid hex digit
entry will cause an error and the string entry must be reentered.
Two  digits  must be supplied for each hex number  otherwise  the
search  won't  work  properly.   Upper  or  lower  case  for  the
hexidecimal letters is acceptable. Example:

    ?Search String = 40,FE,e5,05

You  can  mix hex entries with string entries within  the  search
key. Example:

    ?Search String = 40,FE,\help me\,E5,05

The  Backward search suboption (B) will start the search from the
current  record and continue towards the start of  the  file.  It
DOES  NOT reverse the search string key,  that is,  if you  enter
\HELP\ for a search string key,  it will not search backwards for
\PLEH\.  It only refers to the direction the records will be read
while  searching  for a matching string.  Also,  each  record  is
searched from the start of the record.  The search stops when the
start of the file (SOF) is encountered.

The  Mask suboption is for those cases where bytes in a file  use
certain  bits for special meanings.  The input mask is  logically
AND'd  with  each  byte in the file before comparing  it  to  the
search string.  Therefore,  some bytes could pass the search test
but still may not be exactly what your looking for.

    ?Search String = 03;M
    Enter string search mask = 0Fh

 This  will  mask all upper nibbles (upper 4 bits of each  byte)
 and  then compare it to a 3.  Therefore,  any data bytes  which
 have a 3 in the lower nibble will cause a match with the search
 key.

When  the  search  string is found in the  file,  the  search  is
temporarily  terminated and the cursor is positioned at the start
of the found string.  Note,  that the program is NOT in the  edit
mode,  so  the next key entered is a command not an edit  control
key.  Hit  a space (or any unrecognizable command) to redump  the
record and place the cursor on the command line. Hit an 'E' to go
into  the  edit mode.  The cur
sor will remain positioned  at  the
start of the found string.

CONTINUE SEARCH OPTION
----------------------
Hitting  a 'C' at the command level will restart the search  from
the  current record and cursor position (if previously  defined).
The search facility will then look for the NEXT occurrence of the
entered  string sequence.  The 'O' suboption is affective only on
the  initial  start  of the search.  The  Continue  ('C')  option
effectively disables the occurrence value previously entered. The
default  string  occurrence  is 1,  i.e.,  the  first  (or  next)
occurrence.  The Continue option can be invoked at any time after
a search string key has been entered. All other suboptions are in
affect when continuing the search.


RECORD EDITING
--------------
Record  editing is accomplished by typing an 'E' at  the  command
level. When in the edit mode, there are two modes of editing. You
can  edit  the HEXIDECIMAL field area of the record or the  ASCII
field  area.  When  entering  the edit mode the  cursor  will  be
positioned at the upper left corner in the HEX data field of  the
current record.  To switch to the ASCII data field of the record,
simply  enter a CTRL-E.  This will toggle the cursor between  the
two  fields.  The  HEX field area will  only  accept  hexidecimal
digits  for  inputs.  The ASCII field will accept all key  inputs
including control key inputs if they are preceeded by an ESC key.
For  example:  to input a CTRL-K into the record at  the  current
cursor position,  hit the ESC key followed by a CTRL-K.  The  ESC
key  simply  means 'put the next input character into the  record
even if its' a control character'.  This is only affective in the
ASCII  field area.  Non-control characters (i.e.,  regular ASCII)
can be typed in directly.

To make the record changes permanently to the file,  they must be
flushed to the disk by typing a CTRL-W. Typing a CTRL-X will exit
the edit mode without updating the file.

BUGS:
====
There  are  currenly  no  know  bugs.  However,  inputs  are  not
completely  validated,  therefore,  some conditions  could  cause
different results.  None, however, are know to cause file crashes
or  anything catastrophic.  Any reports of bugs will be noted and
appreciated.

USE UNDER TURBODOS:
==================
EDFILE  is especially useful under TurboDOS.  Using the  filename
$.DSK  or  $.DIR upon entering EDFILE allows editing of the  disk
and/or directory.  I use EDFILE in every case when I need to look
at the disk directory and make changes to it. The search facility
makes this task a breeze.

BACKGROUND INFO:
===============
EDFILE   was   written  in  a  language   called   SIL   (Systems
Implementation  Language)  which was obtained from DDJ  and  then
enhanced and improved at Digilog,  Inc for use in writing systems
programs  and  utilities.  SIL is very similar to 'C' but  allows
true  inline 8080/Z80 assembly language coding (very useful)  and
compiles to actual assembly mnemonics. The output of the compiler
is  passed to Digital Research Inc's Relocatable Assembler (RMAC)
and then to DRI's Linker (LINK).  No special tricks were used  in
this program; that is, no system specific calls or locations were
referenced,  therefore,  it should run on any CP/M or  equivalent
system.  Of course,  Murphy is lurking around, so don't depend on
that assumption.

FUTURE VERSIONS:
===============
On  the wish list is to add the capability to read and  edit  the
data  off of the disk on a track/sector basis.   Any other  ideas
will be seriously considered in future versions of EDFILE.
Thanks and good EDFILE'ing.

Problems,  suggestions  or  questions  can be sent to  me  on  my
CompuServe number (#72345,1540) or via my home address:
    Mike Mosko
    519 E. Station Ave.
    Coopersburg, PA 18036