2000
Summary of the New Features of ZCPR
The ZCPR Command Hierarchy Search
ZCPR-Resident Command DIR
ZCPR-Resident Command ERA
ZCPR-Resident Command LIST
ZCPR-Resident Command TYPE
ZCPR-Resident Command SAVE
ZCPR-Resident Command REN
ZCPR-Resident Command USER
ZCPR-Resident Command DFU
ZCPR-Resident Command JUMP
ZCPR-Resident Command GO
ZCPR-Resident Command GET
ZCPR Error Messages
:Summary of the New Features of ZCPR
     ZCPR (Z80 Command Processor Replacement) is a replacement of 
the  CP/M  CCP which is designed to run as part of CP/M  on  Z80-
based microcomputers.   In most cases it is upward-compatible  to 
the original CP/M Version 2.2 CCP.

     ZCPR,  however,  provides many extensions over the CP/M CCP.  
Included in these extensions are:

          . The TYPE function can be made to page or not page its 
output at the user's discretion

          .  A LIST function is available which sends its  output 
to the CP/M LST: Device and does NOT page

          .  The  DIR command has been extended to allow the dis-
play of the system files or all files

          . The ERA command now prints out the names of the files 
it is erasing


          .  The  current user number may be included as part  of 
the command prompt;  if the user is under a number other than  0, 
the prompt is of the form 'du>' (like 'A2>' or 'B10>'),  and,  if 
the  user is under 0,  the prompt may be 'd>' or 'd0>' as per his 
choice

          .  The  SUBMIT facility has been changed in  two  basic 
ways:
               - the  prompt  changes to 'du$' or 'd$'  when  the 
SUBMIT command is printed
               - the $$$.SUB is executed from drive A: only (note 
that the original SUBMIT problem now exists,  but the new SUB.COM 
facility  corrects  it);   Indirect  Command  Files  now  perform 
according to the basic philosophy that any command sequence  that 
can  be input from the console may be used in an Indirect Command 
File  as well;  the ZCPR.DOC file also gives details as to how to 
patch SUBMIT.COM if SUB.COM is not available


          .  A command-search hierarchy is now implemented  which 
is executed as follows:
               - the  user's command is checked against the  CPR-
resident commands and executed immediately if a match is found
               - failing  that,  the  current user number on  the 
current disk is scanned for the COM file;  the COM file is loaded 
and executed if found
               - failing that, a default user number (initially 0 
but  can be reset with the DFU CPR-resident command) on the  cur-
rent disk is scanned for the COM file; the COM file is loaded and 
executed if found
               - finally,  failing that,  the default user number 
on disk A:  is scanned for the COM file;  the COM file is  loaded 
and executed if found or an error message (COMMAND?, when COMMAND 
was the user's command name) is printed


          .  The  numeric argument for the SAVE CPR-resident com-
mand  (viz the number of 256-byte pages to save) can be input  in 
HEX rather than decimal

          .  A  GET  command which loads a file  at  a  specified 
memory address and a JUMP command which "calls" the subroutine at 
a  specified memory address have been added;  a GO command  which 
"calls"  the  subroutine starting at 100H is also added (this  is 
redundant with JUMP 100H)


:The ZCPR Command Hierarchy Search
     The first,  and most basic thing, to learn about ZCPR is the 
order in which it searches for a COM file for execution or a file 
specified  by the GET command.   Under the CP/M 2.2 CCP,  if  the 
specified  COM file command was not found on the current drive in 
the  current user area,  the CCP aborted with an  error  message.  
ZCPR,  however,  continues searching from this point a maximum of 
two  more  levels.   This command hierarchy search  was  outlined 
above and is described here in further detail.

          1.   If  the command is of the form 'COMMAND'  and  NOT 
'd:COMMAND',  the  CPR-resident  command list is searched  for  a 
match.   If  the  match  is found,  the CPR-resident  command  is 
immediately processed.   If the match is not found or the command 
is of the form 'd:COMMAND',  the next step is taken.   Note  that 
the  'd:COMMAND' form is good for executing a COM file which  has 
the same name as a CPR-resident command (such as SAVE or DIR).


          2.   If  the command is of the form  'd:COMMAND',  disk 
drive  'd:'  is  temporarily logged in for  the  purpose  of  the 
command  search.   Otherwise,  the  currently logged-in drive  is 
used.

          3.  Now the file named COMMAND.COM is searched for.  If 
found,  it  is loaded into memory starting at 100H and  executed.  
If not, proceed to step 4.

          4.   Now  that  the first search  for  COMMAND.COM  has 
failed,  the  CPR checks to see if the user is under the  current 
Default User Number.   The Default User Number may be that set by 
the  DEFUSR equate in the CPR or that set by the user via the DFU 
command.   DEFUSR  is in effect if DFU has not been issued  since 
the last Warm or Cold Boot, and DFU is in effect if it was issued 
since the last Warm or Cold Boot.   If the user is NOT under  the 
current  Default User Number,  ZCPR temporarily logs him into  it 
and  searches  the directory.   If COMMAND.COM is  found,  it  is 
loaded as described above and executed.  If not, ZCPR proceeds to 
the next step.

          5.   The user is now in the Default User Number, and at 
this  point,  ZCPR checks to see if the user is on disk drive A:.  
If not, it temporarily logs into A: and searches the default user 
number  of  A:  for  COMMAND.COM.   If found,  it  is  loaded  as 
described above and executed.   If not,  ZCPR prints the  command 
name  as  an  error message and returns to  command  input  mode, 
aborting the SUBMIT file if COMMAND came from it.

     In  all cases of the search above,  if COMMAND.COM is found, 
after  it  is loaded into memory,  ZCPR resets the  user  to  his 
original disk drive and user number.  Hence, the files referenced 
by the user by default are obtained from this environment.


     To  illustrate this command hierarchy search,  consider  the 
following examples:

Example 1:  DEFUSR equ 0 {default user number is 0}

B10>           <-- User is on Drive B:, User Number 10
B10>ASM TEST.BBZ    <-- User wishes to assemble TEST.ASM in
                         Drive B:, User 10
     <-- At this point, ZCPR looks on B:/10 for ASM.COM, fails,
          looks on B:/0, fails, and finally looks on A:/0; it
          finds ASM.COM here and goes back to B:/10 for the file




Example 2:  DEFUSR equ 0 and DFU issued

B10>           <-- User is on Drive B:, User Number 10
B10>DFU 5      <-- User Selects User 5 as default
B10>ASM TEST.BBZ    <-- As above
     <-- At this point, ZCPR looks on B:/10 for ASM.COM, fails,
          look on B:/5, fails, and finally looks on A:/5; it
          fails here also and prints ASM? as an error message

Example 3:  DEFUSR equ 0

B>             <-- User is on Drive B:, User Number 0
B>ASM TEST.BBZ      <-- As above
     <-- At this point, ZCPR looks on B:/0 for ASM.COM, fails,
          looks on A:/0, fails, and prints error message



Example 4:  DEFUSR equ 0

A10>           <-- User is on Drive A:, User Number 10
A10>ASM TEST.AAZ    <-- As above, but file on A:
     <-- At this point, ZCPR looks on A:/10 for ASM.COM, fails,
          looks on A:/0, fails, and prints error message

:ZCPR-Resident Command DIR
Command: DIR
Function:  To Display a listing of the names of the files on disk
Forms:
     DIR <afn>           <-- Displays $DIR files
     DIR <afn> S         <-- Displays $SYS files
     DIR <afn> A         <-- Displays both $DIR and $SYS files
Examples:
     DIR *.ASM           <-- All $DIR .ASM files
     DIR *.COM S         <-- All $SYS .COM files
     DIR *.COM A         <-- All .COM files
Notes:
     If  a  file is scanned for and no such name exists on  disk, 
the  'No  Files'
194a
 message will appear.   However,  if  a  file  is 
scanned for and the name exists as a $SYS file and $DIR files are 
being  scanned for,  no file name is displayed but the 'No Files' 
message does NOT appear.  For example, if TEST.COM is a $SYS file 
and  'DIR  TEST.COM' is issued,  no  message  appears.   If  'DIR 
TEXT.COM' is issued and TEXT.COM does not exist on disk,  the 'No 
Files' message is displayed.
:ZCPR-Resident Command ERA
Command: ERA
Function:  To Erase the specified $R/W files from disk
Forms:
     ERA <afn>           <-- Erase both $DIR and $SYS files
Examples:
     ERA *.ASM           <-- Erase all .ASM files
     ERA *.*             <-- Erase all files
Notes:
     If a $R/O file is encountered,  a BDOS error message will be 
displayed  and the procedure is stopped.   The user is unsure  at 
this  time as to which files have been erased and which have  not 
and should check.  Sorry for this problem!  The ERASE command (to 
be  given  to SIG/M by RLC in the near future) is a  solution  to 
this problem.
:ZCPR-Resident Command LIST
Command: LIST
Function:  To Print the specified file on the CP/M LST: device
Forms:
     LIST <ufn>          <-- Print the file (no paging)
Examples:
     LIST TEST.TXT       <-- Print TEST.TXT on LST:
Notes:
     If  the file has a $SYS attribute,  it will be found as well 
as those with $DIR attributes.
:ZCPR-Resident Command TYPE
Command: TYPE
Function:  To Print the specified file on the CP/M CON: device
Forms:
     TYPE <ufn>          <-- Print the file with the paging deflt
     TYPE <ufn> P        <-- Print the file with the paging deflt
                              negated
Examples:
     TYPE TEST.TXT
     TYPE TEST.TXT P
Notes:
     When  the  display pauses during paging,  type any  char  to 
continue or ^C to abort.  ^S also works.
:ZCPR-Resident Command SAVE
Command: SAVE
Function:  To Copy the TPA starting at 100H to disk
Forms:
     SAVE <Number of Pages> <ufn>  <-- <Number of Pages> in DEC
     SAVE <Number of Pages>H <ufn> <-- <Number of Pages> in HEX
     SAVE <Number of Sectors> <ufn> S  <-- <Number of Sectors>
                                          in DEC
     SAVE <Number of Sectors>H <ufn> S <-- <Number of Sectors>
                                          in HEX
Examples:
     SAVE FH MYFILE.TXT      <-- 15 pages saved
     SAVE 15 MYFILE.TXT      <-- 15 pages saved
     SAVE 10H MYFILE.TXT S   <-- 16 sectors (8 pages) saved
Notes:
     The error message 'Delete File?' is printed if <ufn> already 
exists.   To go ahead and SAVE, type Y or y to erase the file and 
proceed with the SAVE.

:ZCPR-Resident Command REN
Command: REN
Function:  To Change the name of a disk file
Forms:
     REN <ufn new>=<ufn old>
Examples:
     REN NEWFILE.TXT=OLDFILE.TXT
Notes:
     The error message 'Delete File?' is printed if the <ufn new> 
already exists.  To go ahead and complete the REN, type Y or y to 
erase  the  current  <ufn new> file and then <ufn  old>  will  be 
renamed to <ufn new>.

:ZCPR-Resident Command USER
Command: USER
Function:  To Change the current user number
Forms:
     USER <User Number>       <-- <User Number> in DEC
     USER <User Number>H      <-- <User Number> in HEX
Examples:
     USER 15
     USER FH
     USER 0
     USER      <-- Same as USER 0
Notes:
     -None-
:ZCPR-Resident Command DFU
Command: DFU
Function:  To Temporarily Change the default user number for the
           command hierarchy search
Forms:
     DFU <User Number>        <-- <User Number> in DEC
     DFU <User Number>H       <-- <User Number> in HEX
Examples:
     DFU 15
     DFU 0
     DFU FH
     DFU       <-- Same as DFU 0
Notes:
     -None-
:ZCPR-Resident Command JUMP
Command: JUMP
Function:  To "call" the subroutine at the specified page address
Forms:
     JUMP <Address> <Cmd Parms>  <-- <Address> in HEX
Examples:
     JUMP E000 or JUMP E000H  <-- Jump to E000H
     JUMP 100                 <-- Jump to 100H
     JUMP 0                   <-- Jump to 000H
     JUMP                     <-- Same as JUMP 0
Notes:
     JUMP performs a subroutine "call", so the called routine may 
return to the ZCPR by either a RET or a Warm Boot.
:ZCPR-Resident Command GO
Command: GO
Function:  To "call" the subroutine at address 100H
Forms:
     GO <Cmd Parms>           <-- Routine at 100H
Examples:
     GO *.ASM                 <-- Execute TPA-resident prog
                                   with *.ASM passed
Notes:
     This is identical in function to JUMP 100H.
:ZCPR-Resident Command GET
Command: GET
Function:  To load a file from disk into memory starting at the
           specified page
Forms:
     GET <Address> <ufn>      <-- <Address> in HEX
Examples:
     GET 8000 TEST.80         <-- Load TEST.80 starting at 8000H
     GET 100 TEST.80 or GET 100H TEST.80 <-- Load TEST.80 start-
                                   ing at 100H
     GET 0 TEST.80            <-- Load TEST.80 starting at 000H
Notes:
     GET  searches for the specified file according to  the  same 
command  hierarchy  search employed by the ZCPR command  scanner.  
Hence,  if the user is on B:/10 and the file is on A:/0 with  the 
current  default user number at 0,  GET will search from B:/10 to 
B:/0 to A:/0 in looking for the file.
:ZCPR Error Messages
     The  following  are the error messages issued  by  ZCPR  and 
their meanings.

Message   Meaning

?         Printed after a command or an argument means that such
            was invalid

No File   From DIR, this means that DIR did not locate any files
          Also from ERA with the same meaning

All?      Issued in response ERA *.*, asks the user is he really
            wants to erase all the files.  Unlike under the
            original CP/M 2.2 CCP, single character input is
            required (Y or y for yes and anything else for no)
            with NO <CR> to end the line


Message   Meaning

Full      From SAVE, means that there is not enough space on
            disk
          From GET or command load by CPR, means that there
            is not enough space in memory

Delete File?
          From REN or SAVE, means that the file specified already 
            exists  on disk and the user may type Y or y to erase 
            it  and  continue  with the procedure  or  any  other 
            character to abort


0

