home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / MBUG / MBUG123.ARC / ZCPRHLP.LBR / ZCPR.DZC / ZCPR.DOC
Text File  |  1979-12-31  |  45KB  |  1,521 lines

  1.              ZCPR - A Z80 Replacement for the CP/M CCP
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.      Documentation on ZCPR - A Z80 Replacement for the CP/M CCP
  9.  
  10.  
  11.  
  12.  
  13.               ZCPR is a Group Project By the CCP-GROUP:
  14.             RLC - Richard Conn            FJW - Frank Wancho
  15.             KBP - Keith Peterson          RGF - Ron Fowler
  16.  
  17.  
  18.                       ZCPR Documentation By RLC
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  
  25.  
  26.                           Table of Contents
  27.                           ----- -- --------
  28.  
  29.        Introduction                                       2
  30.  
  31.        Part A: Installation Instructions                  4
  32.             ZCPR Integration Example                      5
  33.             Setting the ZCPR Inline Options               8
  34.               REL, BASE, CPRLOC, RAS, SUBA, CLEVEL3       8
  35.             Customization Symbols                         8
  36.               NLINES, WIDE, PGDFLT                        8
  37.               PGDFLG, MAXUSR, SYSFLG, SOFLG, SUPRES,
  38.                 DEFUSR, SPRMPT, CPRMPT, NUMBASE,          9
  39.                 SECTFLG, FENCE                           10
  40.             Patching SUBMIT.COM                          10
  41.  
  42.        Part B: Usage Instructions and Explanation of
  43.                Commands                                  11
  44.             The ZCPR Command Hierarchy Search            11
  45.             The ZCPR-Resident Commands                   14
  46.               DIR, ERA                                   14
  47.               LIST, TYPE, SAVE                           15
  48.               REN, USER, DFU                             16è              JUMP, GO, GET                              17
  49.             ZCPR Error Messages                          18
  50.  
  51.        Part C: ZCPR Command Levels and How to Use Them   19
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.                                                 Page 1
  61.  
  62.  
  63.  
  64.  
  65.  
  66.              ZCPR - A Z80 Replacement for the CP/M CCP
  67.  
  68.  
  69.  
  70.      Documentation on ZCPR - A Z80 Replacement for the CP/M CCP
  71.  
  72.  
  73.  
  74.  
  75.        ZCPR is a replacement for the CP/M Console Command Processor 
  76.   (CCP)  which  is  designed to run as part of  CP/M  on  Z80-based 
  77.   microcomputers.   In most cases it is upward-compatible with  the 
  78.   original CP/M Version 2.2 CCP.
  79.  
  80.        ZCPR,  however,  provides  many extensions to the CP/M  CCP.  
  81.   Included in these extensions are the following features:
  82.  
  83.             . The TYPE function can be made to page or not page its 
  84.   output at the user's discretion
  85.  
  86.             .  A LIST function is available which sends its  output 
  87.   to the CP/M LST: Device and does NOT page
  88.  
  89.             .  The  DIR command has been extended to allow the dis-
  90.   play of the system files or all files
  91.  
  92.             . The ERA command now prints out the names of the files 
  93.   it is erasing
  94.  
  95.             .  The  current user number may be included as part  of è  the command prompt;  if the user is under a number other than  0, 
  96.   the prompt is of the form 'du>' (like 'A2>' or 'B10>'),  and,  if 
  97.   the  user is under 0,  the prompt may be 'd>' or 'd0>' as per his 
  98.   choice
  99.  
  100.             .  The  SUBMIT facility has been changed in  two  basic 
  101.   ways:
  102.                  - the  prompt  changes to 'du$' or 'd$'  when  the 
  103.   SUBMIT command is printed
  104.                  - the $$$.SUB is executed from drive A: (note that 
  105.   the  original  SUBMIT  problem now exists,  but the  new  SUB.COM 
  106.   facility  corrects it);  the CCP-GROUP definition of an  Indirect 
  107.   Command  File  now  applies,  and this  definition  is  that  any 
  108.   sequence of commands which may be issued from the console is also 
  109.   a  valid  sequence  of commands for execution  from  an  Indirect 
  110.   Command File; hence, the sequence:
  111.  
  112.                       DIR
  113.                       B:
  114.                       DIR
  115.                       A:
  116.  
  117.   may  be  issued  from either the console or an  Indirect  Command 
  118.   File,  and the results of the execution of this sequence are  the 
  119.   same.   Basically,  this  says  that Indirect Command  Files  are 
  120.   upward-compatible  to the console input (but not necessarily that 
  121.   the  contents  of an Indirect Command File may be issued  at  the 
  122.   console without modification).
  123.  
  124.  
  125.                                                 Page 2
  126.  
  127.  
  128.  
  129.  
  130.  
  131.              ZCPR - A Z80 Replacement for the CP/M CCP
  132.  
  133.  
  134.  
  135.             .  A command-search hierarchy is now implemented  which 
  136.   is executed roughly as follows:
  137.                  - the  user's command is checked against the  CPR-
  138.   resident commands and executed immediately if a match is found
  139.                  - failing  that,  the  current user number on  the 
  140.   current disk is scanned for the COM file;  the COM file is loaded 
  141.   and executed if found
  142.                  - failing that, a default user number (initially 0 è  but  can be reset with the DFU CPR-resident command) on the  cur-
  143.   rent disk is scanned for the COM file; the COM file is loaded and 
  144.   executed if found
  145.                  - finally,  failing that,  the default user number 
  146.   on disk A:  is scanned for the COM file;  the COM file is  loaded 
  147.   and executed if found or an error message (COMMAND?, when COMMAND 
  148.   was the user's command name) is printed
  149.  
  150.             .   The  numeric  argument for the SAVE command can  be 
  151.   specified  in hexadecimal so that the user may employ the  values 
  152.   presented by tools such as DDT exactly as they are given
  153.  
  154.             .  A  GET  command which loads a file  at  a  specified 
  155.   memory address and a JUMP command which "calls" the subroutine at 
  156.   a  specified memory address have been added;  a GO command  which 
  157.   "calls"  the  subroutine at 100H (subset of the JUMP  capability) 
  158.   has also been added
  159.  
  160.  
  161.        This  document provides the user of ZCPR with the  following 
  162.   information:
  163.  
  164.             Part A:  Installation Instructions
  165.             Part B:  Usage Instructions and Explanation of Commands
  166.             Part C:  ZCPR Command Levels and How to Use Them
  167.  
  168.  
  169.  
  170.  
  171.  
  172.  
  173.  
  174.  
  175.  
  176.  
  177.  
  178.  
  179.  
  180.  
  181.  
  182.  
  183.  
  184.  
  185.  
  186.  
  187.  
  188.  
  189. è                                                Page 3
  190.  
  191.  
  192.  
  193.  
  194.  
  195.              ZCPR - A Z80 Replacement for the CP/M CCP
  196.  
  197.  
  198.  
  199.                                Part A
  200.                       Installation Instructions
  201.  
  202.        In  order to install ZCPR on a target microcomputer (must be 
  203.   currently running CP/M 2.2), the user must know two basic things:
  204.  
  205.             1)  Where his CCP is currently running in memory
  206.             2)  Where his CCP is located in the SYSGEN  image,  or, 
  207.   for systems which don't support SYSGEN (such as P&T CP/M 2.2  for 
  208.   the TRS-80 Model II), where his CCP is located on disk and how to 
  209.   place the new ZCPR on top of it
  210.  
  211.        The  first question is answered relatively easily.   A  pro-
  212.   gram,  known  as either BDOSLOC or BDLOC (for BDOS  Locator),  is 
  213.   provided  with ZCPR.   You should assemble this program for  your 
  214.   particular  computer (change the base ORG if you are running non-
  215.   ORG-0 CP/M) and execute it.   Upon execution, it will provide you 
  216.   with  the base address of (1) the BDOS and (2) the CCP  for  your 
  217.   particular system.   BDOSLOC has worked correctly for all systems 
  218.   tested so far,  but there is always a chance that it may NOT work 
  219.   for some non-tested system.   For the time being,  assume that it 
  220.   works correctly and record the starting base page address of your 
  221.   CCP.
  222.  
  223.        The  second question is not answered nearly so  easily.   If 
  224.   you  have  the ability to SYSGEN your system,  it is much  easier 
  225.   (commonly) than if you do not.   You must,  after assembling  the 
  226.   ZCPR  properly,  integrate it into the sysgen (or disk) image  of 
  227.   CP/M.   This  can  be  done by obtaining a SYSGEN image  of  your 
  228.   system, scanning it via a debugger such as DDT to find the offset 
  229.   for the CCP,  reading the new CPR in on top of the old  one,  and 
  230.   finally  running  SYSGEN again to place the resultant  system  on 
  231.   disk.   If  you  DO NOT have SYSGEN capability,  a  Disk  Utility 
  232.   program  is required to locate the CCP on disk and then write the 
  233.   new  ZCPR  on  top  of the old  one.   The  net  result  of  this 
  234.   integration  is  the placement of the new ZCPR onto disk  in  the 
  235.   proper  place so that it will be loaded with the rest of CP/M  on 
  236.   cold boot and executed properly.è       To find the original CCP, you typically have to locate it by 
  237.   its appearance.   It is probably stored continuously on disk, so, 
  238.   once it is found, a sequential overwrite is all that is required.  
  239.   Probability  is extremely high that it is stored continuously  in 
  240.   the SYSGEN image.   The CCP starts with two (2) and ONLY TWO jump 
  241.   instructions  followed  by a buffer area (possibly containing  an 
  242.   initial  command and/or the Digital Research  copyright  notice).  
  243.   The  Digital  Research manuals show the CCP to reside at  address 
  244.   980H  in the SYSGEN image,  but this may vary  with  system.   To 
  245.   find  this image,  use DDT or some other such debugger,  load the 
  246.   SYSGEN image you can get via SYSGEN,  and examine memory starting 
  247.   at around 900H for the two (and ONLY two) jumps described  above.  
  248.   If  you find an area with more than two jumps (a group of  them), 
  249.   you  are probably looking at the BIOS and should go lower for the 
  250.   CCP.   The  CCP will probably start on an even page or  half-page 
  251.   address (like 900H, 980H, 1100H, etc).
  252.  
  253.  
  254.                                                 Page 4
  255.  
  256.  
  257.  
  258.  
  259.  
  260.              ZCPR - A Z80 Replacement for the CP/M CCP
  261.  
  262.  
  263.  
  264.        Now that the location of the CCP has been found, record this 
  265.   address for later.  You are now ready for the integration of ZCPR 
  266.   into your system.   To do this, perform the following steps using 
  267.   the  information  of the page address of the CCP  (obtained  from 
  268.   BDOSLOC  and  called  CPRLOC within ZCPR) and  the  SYSGEN  image 
  269.   address of the CCP (called IMAGE for reference in this document).
  270.  
  271.             1.  Edit  ZCPR  and set the CPRLOC equate to the  value 
  272.   obtained from above.  Also set any flags and values as you desire 
  273.   (see the section on ZCPR Customization below).   When  satisfied, 
  274.   end the edit session.
  275.  
  276.             2.   Assemble  ZCPR  with MAC  (or  equivalent).   This 
  277.   assembler  is  required  because of the MACROs  used.   Only  the 
  278.   resultant HEX file is required.
  279.  
  280.             3.   Assuming that you can use SYSGEN,  obtain a SYSGEN 
  281.   image of your current CP/M system and save it on disk.
  282.  
  283.             4.   Load  the  SYSGEN image into memory with  DDT  (or è  equivalent).  Once loaded, verify that the original CCP is at the 
  284.   IMAGE  address  found above and compute  the  integration  offset 
  285.   using the DDT H command:
  286.                  H<IMAGE adr>,<CPRLOC adr>
  287.   The  second number displayed gives you the OFFSET value  required 
  288.   for step 5.
  289.  
  290.             5.   Integrate  ZCPR into your SYSGEN image via DDT's I 
  291.   and ROFFSET commands.  Use IZCPR.HEX (or the name of your version 
  292.   of  ZCPR) to load the FCB and ROFFSET (where OFFSET was  computed 
  293.   in  step 4) to load the ZCPR.HEX file into memory at  the  proper 
  294.   location.   Check  to see that ZCPR is indeed properly loaded  by 
  295.   examining the SYSGEN IMAGE area.
  296.  
  297.             6.   Place the new system on disk by running SYSGEN and 
  298.   NOT loading the system from disk (use the memory image).
  299.  
  300.        For   further  clarification  of  the  above  process,   the 
  301.   following  is a sample terminal session which outlines the  steps 
  302.   taken.
  303.  
  304.                       ZCPR Integration Example
  305.  
  306.  
  307.   B>; Sample terminal session for integrating ZCPR
  308.   B>sysgen
  309.   SYSGEN VER 2.2
  310.   SOURCE DRIVE NAME (OR RETURN TO SKIP)b
  311.   SOURCE ON B, THEN TYPE RETURN  <-- I hit the RETURN key here
  312.   FUNCTION COMPLETE                                /
  313.   DESTINATION DRIVE NAME (OR RETURN TO REBOOT)  <-- and here
  314.   B>save 44 cpm56.com      <-- We now have a SYSGEN image of CP/M
  315.                                 to work with
  316.  
  317.  
  318.  
  319.                                                 Page 5
  320.  
  321.  
  322.  
  323.  
  324.  
  325.              ZCPR - A Z80 Replacement for the CP/M CCP
  326.  
  327.  
  328.   B>xdir
  329.   XDIR   Version 2.6  User Number:   0,  Double Density
  330.   File Attributes:  Non-System  è
  331.   Filename.Typ Size K   Filename.Typ Size K   Filename.Typ Size K
  332.   -------- --- ------   -------- --- ------   -------- --- ------
  333.   !TEXTWRK.-12      0   CPR     .DOC      8   EE687   .TXT      4
  334.   CPR     .AQM     34   TFS     .HLP      6   EE687PRE.TXT      4
  335.   CPR     .ASM     50   CONTENTS.T01      6   SW1     .TXT     10
  336.   CPR     .BAK      4   CONTENTS.T02      4   SW2     .TXT      2
  337.   CPM56   .COM     12   CONTENTS.T03      4
  338.   B:  30 Entries &   22 Files --    338K Bytes Remaining
  339.   File Data:         14 Files --    154K Bytes Displayed
  340.   B>bdosloc      <-- Now to locate the CCP's address
  341.   The Base Page Address of this system's BDOS is C5
  342.   The Base Page Address of this system's CCP is  BD <-- This is it
  343.   B>ddt cpm56.com     <-- Now to find the CCP in the SYSGEN image
  344.   DDT VERS 2.0
  345.   NEXT  PC
  346.   2D00 0100
  347.   -d900,90f      <-- Start looking around here
  348.   0900 31 80 E7 3E 06 3C 3C FE 1B CA 00 C2 DA 11 E7 D6 1..>.<<.........
  349.   -da00,a0f
  350.   0A00 31 00 01 01 01 0C C5 CD 0F E4 21 00 BE 11 00 04 1.........!.....
  351.   -db00,b0f
  352.   0B00 31 00 01 01 01 11 C5 CD 0F E4 21 00 C0 11 00 02 1.........!.....
  353.   -db80,b8f
  354.   0B80 31 00 01 01 09 01 CD A8 00 21 00 D2 11 00 C2 0E 1........!......
  355.           -- Detail Left Out --
  356.   -d1100         <-- I found it at 1100H; note the 2 JMP's
  357.   1100 C3 FF BD C3 FB BD 50 10 20 20 20 20 20 20 20 20 ......P.        
  358.   1110 20 20 20 20 20 20 20 20 00 00 00 00 00 00 00 00         ........
  359.   1120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
  360.           -- Detail Left Out --
  361.   -^C            <-- Return to CP/M; I know that CPRLOC will be
  362.                       BD00H and the IMAGE offset is 1100H
  363.  
  364.   B>ed cpr.asm {edit ZCPR here and place CPRLOC=BD00H}#  
  365.           -- Detail Left Out --
  366.  
  367.   B>mac cpr $pz sz         <-- Now to assemble the CPR
  368.   CP/M MACRO ASSEM 2.0
  369.   C4F0                     <-- Note that CPR MUST end before BDOS
  370.                                 begins!
  371.   014H USE FACTOR
  372.   END OF ASSEMBLY
  373.  
  374.  
  375.  
  376.  
  377. è
  378.  
  379.  
  380.  
  381.  
  382.  
  383.                                                 Page 6
  384.  
  385.  
  386.  
  387.  
  388.  
  389.              ZCPR - A Z80 Replacement for the CP/M CCP
  390.  
  391.  
  392.  
  393.  
  394.   B>ddt cpm56.com          <-- Now to integrate!
  395.   DDT VERS 2.0
  396.   NEXT  PC
  397.   2D00 0100
  398.   -h1100,bd00              <-- Compute offset for new CPR
  399.   CE00 5400                <-- Offset is 5400H
  400.   -icpr.hex                <-- Init FCB
  401.   -r5400                   <-- Read in new CPR with offset
  402.   NEXT  PC
  403.   2D00 0000
  404.   -^C                      <-- Done!
  405.   B>sysgen                 <-- Now to SYSGEN onto disk
  406.   SYSGEN VER 2.2
  407.   SOURCE DRIVE NAME (OR RETURN TO SKIP)   <-- Use memory image
  408.   DESTINATION DRIVE NAME (OR RETURN TO REBOOT)b     <-- onto B:
  409.   DESTINATION ON B, THEN TYPE RETURN
  410.   FUNCTION COMPLETE
  411.   DESTINATION DRIVE NAME (OR RETURN TO REBOOT) <-- Done for now
  412.  
  413.   B>
  414.  
  415.  
  416.  
  417.  
  418.  
  419.  
  420.  
  421.  
  422.  
  423.  
  424. è
  425.  
  426.  
  427.  
  428.  
  429.  
  430.  
  431.  
  432.  
  433.  
  434.  
  435.  
  436.  
  437.  
  438.  
  439.  
  440.  
  441.  
  442.  
  443.  
  444.  
  445.  
  446.  
  447.  
  448.                                                 Page 7
  449.  
  450.  
  451.  
  452.  
  453.  
  454.              ZCPR - A Z80 Replacement for the CP/M CCP
  455.  
  456.  
  457.  
  458.                    Setting the ZCPR Inline Options
  459.  
  460.        The  following  are the four basic options available to  the 
  461.   user under ZCPR for customization of his package.
  462.  
  463.   Option Name    Function
  464.  
  465.      REL         Configures CPRLOC (CPRLOC equ 0) for integration
  466.                  via MOVCPM rather than the DDT/SYSGEN technique
  467.                  outlined above; set to TRUE for MOVCPM integra-
  468.                  tion or FALSE for DDT/SYSGEN integration
  469.  
  470.      BASE        Base address of your CP/M system; standard CP/M
  471.                  has a base of 0, but some CP/M systems (such asè                 for the TRS-80 Model I and Heath/Zenith H89/Z89)
  472.                  start physical RAM memory at a higher address;
  473.                  equate BASE to the starting RAM memory address of
  474.                  your system
  475.  
  476.      CPRLOC      This is the starting address of ZCPR; set the
  477.                  second CPRLOC equate to the address you obtain
  478.                  from BDOSLOC
  479.  
  480.      RAS         This is Sorry for this problem!  The ERASE command (to 
  481.   be  given  to SIG/M by RLC in the near future) is a  solution  to 
  482.   this problem.
  483.  
  484. è
  485.  
  486.  
  487.  
  488.  
  489.  
  490.                                                 Page 14
  491.  
  492.  
  493.  
  494.  
  495.  
  496.              ZCPR - A Z80 Replacement for the CP/M CCP
  497.  
  498.  
  499.  
  500.  
  501.   Command: LIST
  502.   Function:  To Print the specified file on the CP/M LST: device
  503.   Forms:
  504.        LIST <ufn>          <-- Print the file (no paging)
  505.   Customization Variables:
  506.        -None-
  507.   Examples:
  508.        LIST TEST.TXT       <-- Print TEST.TXT on LST:
  509.   Notes:
  510.        If  the file has a $SYS attribute,  it will be found as well 
  511.   as those with $DIR attributes.
  512.  
  513.  
  514.   Command: TYPE
  515.   Function:  To Print the specified file on the CP/M CON: device
  516.   Forms:
  517.        TYPE <ufn>          <-- Print the file with the paging deflt
  518.        TYPE <ufn> P        <-- Print the file with the paging deflt
  519.                                 negated
  520.   Customization Variables:
  521.        NLINES    PGDFLT    PGDFLG
  522.   Examples:
  523.        TYPE TEST.TXT
  524.        TYPE TEST.TXT P
  525.   Notes:
  526.        When  the  display pauses during paging,  type any  char  to 
  527.   continue or ^C to abort.  ^S also works.
  528.  
  529.  
  530.   Command: SAVE
  531.   Function:  To Copy the TPA starting at 100H to diskè  Forms:
  532.        SAVE <Number of Pages> <ufn>  <-- <Number of Pages> in DEC
  533.        SAVE <Number of Pages>H <ufn> <-- <Number of Pages> in HEX
  534.        SAVE <Number of Sectors> <ufn> S  <-- Number of sectors
  535.        SAVE <Number of Sectors>H <ufn> S <-- Number of sectors
  536.   Customization Variables:
  537.        NUMBASE   RAS
  538.   Examples:
  539.        SAVE 15 MYFILE.TXT        <-- 15 pages saved
  540.        SAVE FH MYFILE.TXT        <-- 15 pages saved
  541.        SAVE 10H MYFILE.TXT S     <-- 16 sectors (8 pages) saved
  542.   Notes:
  543.        If the file name to be saved already exists,  then SAVE will 
  544.   exit with the message 'Delete File?'; if the user REALLY wants to 
  545.   save  under  this name,  he may then type Y or y and the  current 
  546.   file will be deleted and then recreated containing the  specified 
  547.   part of the TPA.
  548.  
  549.  
  550.  
  551.  
  552.  
  553.  
  554.  
  555.                                                 Page 15
  556.  
  557.  
  558.  
  559.  
  560.  
  561.              ZCPR - A Z80 Replacement for the CP/M CCP
  562.  
  563.  
  564.  
  565.  
  566.  
  567.   Command: REN
  568.   Function:  To Change the name of a disk file
  569.   Forms:
  570.        REN <ufn new>=<ufn old>
  571.   Customization Variables:
  572.        RAS
  573.   Examples:
  574.        REN NEWFILE.TXT=OLDFILE.TXT
  575.   Notes:
  576.        If <ufn new> already exists, the message 'Delete File?' will 
  577.   be  printed  and the user may respond with Y or y to  delete  the 
  578.   current <ufn new> and then rename <ufn old> to <ufn new>.è
  579.   Command: USER
  580.   Function:  To Change the current user number
  581.   Forms:
  582.        USER <User Number>       <-- <User Number> in DEC
  583.        USER <User Number>H      <-- <User Number> in HEX
  584.   Customization Variables:
  585.        -None-
  586.   Examples:
  587.        USER 15        USER FH        USER 0
  588.        USER      <-- Same as USER 0
  589.   Notes:
  590.        -None-
  591.  
  592.  
  593.   Command: DFU
  594.   Function:  To Temporarily Change the default user number for the
  595.              command hierarchy search
  596.   Forms:
  597.        DFU <User Number>        <-- <User Number> in DEC
  598.        DFU <User Number>H       <-- <User Number> in HEX
  599.   Customization Variables:
  600.        -None-
  601.   Examples:
  602.        DFU 15         DFU FH         DFU 0
  603.        DFU       <-- Same as DFU 0
  604.   Notes:
  605.        See above for explanation.
  606.  
  607.  
  608.  
  609.  
  610.  
  611.  
  612.  
  613.  
  614.  
  615.  
  616.  
  617.  
  618.  
  619.  
  620.                                                 Page 16
  621.  
  622.  
  623.  
  624.  
  625. è             ZCPR - A Z80 Replacement for the CP/M CCP
  626.  
  627.  
  628.  
  629.  
  630.  
  631.   Command: JUMP
  632.   Function:  To "call" the subroutine at the specified page address
  633.   Forms:
  634.        JUMP <Address> <Cmd Parms> <-- <Address> in HEX
  635.   Customization Variables:
  636.        NUMBASE   RAS
  637.   Examples:
  638.        JUMP E000 or JUMP E000H  <-- Jump to E000H
  639.        JUMP                     <-- Jump to 000H
  640.        JUMP 0                   <-- Jump to 000H
  641.   Notes:
  642.        JUMP performs a subroutine "call", so the called routine may 
  643.   return to the ZCPR by either a RET or a Warm Boot.
  644.  
  645.  
  646.   Command: GO
  647.   Function:  To "call" the subroutine starting at 100H
  648.   Forms:
  649.        GO <Cmd Parms>           <-- Execute reentrant at 100H
  650.   Customization Variables:
  651.        RAS
  652.   Examples:
  653.        GO *.ASM                 <-- Assuming XDIR is loaded,
  654.                                      gives directory of *.ASM
  655.   Notes:
  656.        This  command is identical in function to JUMP  100H;  JUMP, 
  657.   however, leaves the address as the first entry in CP/M BASE + 80H 
  658.   (the input line buffer), while GO has no such address.
  659.  
  660.  
  661.   Command: GET
  662.   Function:  To load a file from disk into memory starting at the
  663.              specified page
  664.   Forms:
  665.        GET <Address> <ufn>      <-- <Address> in HEX
  666.   Customization Variables:
  667.        NUMBASE   RAS
  668.   Examples:
  669.        GET 8000 TEST.80         <-- Load TEST.80 starting at 8000H
  670.        GET 100 TEST.80 or GET 100H TEST.80 <-- Load TEST.80      
  671.                                      starting at 100H
  672.        GET 0 TEST.80            <-- Load TEST.80 starting at 000Hè  Notes:
  673.        GET  searches for the specified file according to  the  same 
  674.   command  hierarchy  search employed by the ZCPR command  scanner.  
  675.   Hence,  if the user is on B:/10 and the file is on A:/0 with  the 
  676.   current  default user number at 0,  GET will search from B:/10 to 
  677.   B:/0 to A:/0 in looking for the file.
  678.  
  679.  
  680.  
  681.  
  682.  
  683.  
  684.                                                 Page 17
  685.  
  686.  
  687.  
  688.  
  689.  
  690.              ZCPR - A Z80 Replacement for the CP/M CCP
  691.  
  692.  
  693.  
  694.                          ZCPR Error Messages
  695.  
  696.        The  following  are the error messages issued  by  ZCPR  and 
  697.   their meanings.
  698.  
  699.   Message   Meaning
  700.  
  701.   ?         Printed after a command or an argument means that such
  702.               was invalid
  703.  
  704.   No File   From DIR, this means that DIR did not locate any files
  705.             Also from ERA with the same meaning
  706.  
  707.   All?      Issued in response ERA *.*, asks the user is he really
  708.               wants to erase all the files.  Unlike under the
  709.               original CP/M 2.2 CCP, single character input is
  710.               required (Y or y for yes and anything else for no)
  711.               with NO <CR> to end the line
  712.  
  713.   Full      From SAVE, means that there is not enough space on
  714.               disk
  715.             From GET or command load by CPR, means that there
  716.               is not enough space in memory
  717.  
  718.   Delete File?
  719.             From REN or SAVE, means that the file specified already è              exists on disk and the user may type Y or y to delete 
  720.               it and proceed with the REN or SAVE function
  721.  
  722.  
  723.  
  724.  
  725.  
  726.  
  727.  
  728.  
  729.  
  730.  
  731.  
  732.  
  733.  
  734.  
  735.  
  736.  
  737.  
  738.  
  739.  
  740.  
  741.  
  742.  
  743.  
  744.  
  745.  
  746.  
  747.  
  748.  
  749.                                                 Page 18
  750.  
  751.  
  752.  
  753.  
  754.  
  755.              ZCPR - A Z80 Replacement for the CP/M CCP
  756.  
  757.  
  758.  
  759.  
  760.                                Part C
  761.                ZCPR Command Levels and How to Use Them
  762.  
  763.  
  764.        ZCPR  Version 1.0 and beyond supports three distinct command 
  765.   levels in its implementation.  Each level constitutes a different 
  766.   way to issue a command for ZCPR to process.è
  767.        Command Levels 1 and 2 are common to all implementations  of 
  768.   CP/M  and CP/ZM from CP/M Version 1.4.   Command Level 1 is  that 
  769.   command level in which the command is issued by the user from his 
  770.   console  terminal.   The  prompt  'd>' or 'du>'  appears  on  the 
  771.   terminal,  and  the  user  is allowed to enter the  command  with 
  772.   editing from the terminal.  Command Level 2 is that command level 
  773.   in which the command is entered from an executing $$$.SUB file.
  774.  
  775.        In  both cases,  the command is stored in the internal  ZCPR 
  776.   buffer called CIBUFF (Command Input BUFFer).   Under both Command 
  777.   Levels  1  and 2,  the command is placed into  this  buffer,  the 
  778.   characters of the command line are capitalized, a character count 
  779.   which  indicates the number of characters in the command line  is 
  780.   stored in CBUFF (the byte before CIBUFF),  an ending binary 0  is 
  781.   placed  after  the last character in the command  line,  and  the 
  782.   internal  pointer CIBPTR (Command Input Buffer PoinTeR) is set to 
  783.   point to CIBUFF (the first character of the command line).
  784.  
  785.        Command  Level 3 is an extended concept to Command Levels  1 
  786.   and  2  which is specifically supported by ZCPR Version  1.0  and 
  787.   beyond.  This command level allows a transient program to place a 
  788.   command  line into CIBUFF and the character count into CBUFF  and 
  789.   have this command line executed by ZCPR.   Once control is trans-
  790.   ferred to ZCPR to execute the command line, the transient program 
  791.   which  placed  the command line loses control and the command  is 
  792.   executed  exactly as though it had been typed by the user at  his 
  793.   console terminal.
  794.  
  795.        In  order  for  a transient program to utilize  the  Command 
  796.   Level 3 facility, this program MUST do the following:
  797.  
  798.             1.  Locate the ZCPR.  Since the ZCPR is ALWAYS 2K bytes 
  799.   in  size and located directly under the BDOS,  the transient  can 
  800.   locate  the  ZCPR  by examining the BDOS entry  page  address  at 
  801.   location  7  and  subtracting 8 from this number (8  pages  =  2K 
  802.   bytes).  The resulting number is the base page address of ZCPR.
  803.  
  804.             2.   Store the command line in CIBUFF and the character 
  805.   count  in  CBUFF.   Knowing the base page address  of  ZCPR,  the 
  806.   following information is useful in doing this:
  807.  
  808.  
  809.  
  810.  
  811.  
  812.  
  813. è                                                Page 19
  814.  
  815.  
  816.  
  817.  
  818.  
  819.              ZCPR - A Z80 Replacement for the CP/M CCP
  820.  
  821.  
  822.  
  823.  
  824.                  ORG  CPRLOC    ;Base Address of ZCPR
  825.                  JMP  CPR       ;Enter ZCPR and Execute Default Cmd
  826.                  JMP  CPR1      ;Enter ZCPR and Don't Execute
  827.        MBUFF:    DB   BUFLEN    ;Size of CIBUFF in bytes
  828.        CBUFF:    DS   1         ;Number of Bytes in Command Line
  829.        CIBUFF:   DS   BUFLEN    ;Buffer for Command Line
  830.                  DS   1         ;Buffer for Ending 0 (set by ZCPR)
  831.        CIBPTR:   DS   2         ;Address of CIBUFF (set by ZCPR)
  832.  
  833.  
  834.             3.   Obtain  the User/Disk Flag.   Location 4  contains 
  835.   this number,  but the user may select a flag of his choice.  This 
  836.   flag  is  one  byte  long,  and the high-order  nibble  (4  bits) 
  837.   contains  the user number and the low-order nibble  contains  the 
  838.   disk  number to process the command from.   The User/Disk Flag is 
  839.   to be passed to ZCPR in the C Register.
  840.  
  841.             4.  When ready, transfer control to ZCPR to process the 
  842.   command by JMPing to the base address of ZCPR.   The first JMP in 
  843.   the JMP Table given above is at this address.  At this time, ZCPR 
  844.   will  log in the user and disk in the User/Disk Flag and  process 
  845.   the Command Level 3 Command Line.
  846.  
  847.  
  848.  
  849.  
  850.  
  851.  
  852.  
  853.  
  854.  
  855.  
  856.  
  857.  
  858.  
  859.  
  860. è
  861.  
  862.  
  863.  
  864.  
  865.  
  866.  
  867.  
  868.  
  869.  
  870.  
  871.  
  872.  
  873.  
  874.  
  875.  
  876.  
  877.  
  878.                                                 Page 20
  879.  
  880.  
  881.  
  882.  
  883.  
  884.              ZCPR - A Z80 Replacement for the CP/M CCP
  885.  
  886.  
  887.  
  888.  
  889.        The  following  is a sample program  which  illustrates  the 
  890.   steps outlined above:
  891.  
  892.   ;
  893.   ;  Demonstration of Command Level 3 Facility by RLC
  894.   ;
  895.   udflag  equ     4       ;Address of User/Disk Flag
  896.   bdos    equ     5       ;Address of BDOS Entry Point
  897.  
  898.           org     100h
  899.  
  900.           lxi     d,prmpt ;Print User Prompt
  901.           mvi     c,9     ;PRINT function
  902.           call    bdos
  903.  
  904.           lhld    bdos+1  ;Get address of BDOS
  905.           mov     a,h     ;High-Order Address in A
  906.           sui     8       ;A=High-Order Address of CPR
  907.           mov     h,a     ;HL=Address of CPRè          mvi     l,0
  908.           shld    cpr     ;Save address in buffer
  909.  
  910.           lxi     d,6     ;Point to command line buffer
  911.           dad     d       ;HL points to command line buffer
  912.           xchg            ;DE points to command line buffer
  913.           mvi     c,10    ;READLN into this buffer
  914.           call    bdos
  915.  
  916.           lhld    cpr     ;Get Address of CPR
  917.           lda     udflag  ;Get User/Disk Flag
  918.           mov     c,a     ; ... in C
  919.           pchl            ;Run Command Line
  920.  
  921.   cpr:    ds      2       ;CPR Address buffer
  922.   prmpt:  db      'User Command? $'
  923.  
  924.  
  925.  
  926.  
  927.  
  928.  
  929.        Enjoy using ZCPR!
  930.                                 -- RLC
  931.  
  932.  
  933.  
  934.  
  935.  
  936.  
  937.  
  938.  
  939.  
  940.  
  941.  
  942.  
  943.                                                 Page 21
  944.  
  945.  
  946.  
  947.  
  948.  
  949.        lhld    cpr     ;Get Address of CPR
  950.           lda     udflag  ;Get User/Disk Flag
  951.           mov     c,a     ; ... in C
  952.           pchl            ;Run Command Line
  953.  
  954.   cpr:    ds      2       ;CPR Address buffer
  955.   prmpt:  db      'User Command? nds  are 
  956.   issued from the console (or Indirect Command File):
  957.  
  958.   B10>WM TEST2.TXT
  959.    \   \    \__ File to be edited
  960.     \   \__ Invoke the WM.COM file (Word Master editor)
  961.      \__ User is on Drive B: in User Area 10
  962. è       Results:
  963.             ZCPR searches B:  User 10, B: User 0, and A: User 0 for 
  964.   WM.COM;  it finds WM.COM in A:  User 0,  loads it,  logs the user 
  965.   back into B: User 10, and executes it.
  966.  
  967.   B10>MBASIC
  968.    \    \__ Invoke the MBASIC.COM file (MBASIC Interpreter)
  969.     \__ User is on Drive B: in User Area 10
  970.  
  971.        Results:
  972.             ZCPR searches B:  User 10 and B: User 0 for MBASIC.COM; 
  973.   it finds MBASIC.COM in B: User 0, so it doesn't bother to look on 
  974.   A:  User 0.   MBASIC.COM is then loaded and executed as described 
  975.   in the previous example.
  976.  
  977.   B10>TEST
  978.     \   \__ Invoke the TEST.COM file (TEST program)
  979.      \__ User is on Drive B: in User Area 10
  980.  
  981.        Results:
  982.             ZCPR  searches  B:  User  10  for  TEST.COM;  it  finds 
  983.   TEST.COM in B:  User 0,  so it doesn't bother to look further (if 
  984.   it had,  it would have found TEST.COM in B: User 0).  TEST.COM is 
  985.   then loaded and executed as described above.
  986.  
  987.   B10>TEST2
  988.     \    \__ Invoke the TEST2.COM file (TEST2 program)
  989.      \__ User is on Drive B: in User Area 10
  990.  
  991.        Results:
  992.             ZCPR searches B:  User 10, B: User 0, and A: User 0 for 
  993.   TEST2.COM;  it  doesn't find it,  so it issues the error  message 
  994.   'TEST2?', which says it couldn't find TEST2.COM.
  995.  
  996.  
  997.  
  998.                                                 Page 13
  999.  
  1000.  
  1001.  
  1002.  
  1003.  
  1004.              ZCPR - A Z80 Replacement for the CP/M CCP
  1005.  
  1006.  
  1007.  
  1008.  
  1009. è                     The ZCPR-Resident Commands
  1010.  
  1011.        The  following  pages describe the  ZCPR-Resident  Commands.  
  1012.   These  are commands located within ZCPR itself which are executed 
  1013.   from within ZCPR.  The phrases <afn> and <ufn> refer to ambiguous 
  1014.   file name and unambigous file name as per the CP/M convention.
  1015.  
  1016.   Command: DIR
  1017.   Function:  To Display a listing of the names of the files on disk
  1018.   Forms:
  1019.        DIR <afn>           <-- Displays $DIR files
  1020.        DIR <afn> S         <-- Displays $SYS files
  1021.        DIR <afn> A         <-- Displays both $DIR and $SYS files
  1022.   Customization Variables:
  1023.        WIDE      SYSFLG    SOFLG     FENCE
  1024.   Examples:
  1025.        DIR *.ASM           <-- All $DIR .ASM files
  1026.        DIR *.COM S         <-- All $SYS .COM files
  1027.        DIR *.COM A         <-- All .COM files
  1028.   Notes:
  1029.        If  a  file is scanned for and no such name exists on  disk, 
  1030.   the  'No  Files' message will appear.   However,  if  a  file  is 
  1031.   scanned for and the name exists as a $SYS file and $DIR files are 
  1032.   being  scanned for,  no file name is displayed but the 'No Files' 
  1033.   message does NOT appear.  For example, if TEST.COM is a $SYS file 
  1034.   and  'DIR  TEST.COM' is issued,  no  message  appears.   If  'DIR 
  1035.   TEXT.COM' is issued and TEXT.COM does not exist on disk,  the 'No 
  1036.   Files' message is displayed.
  1037.  
  1038.  
  1039.   Command: ERA
  1040.   Function:  To Erase the specified $R/W files from disk
  1041.   Forms:
  1042.        ERA <afn>           <-- Erase both $DIR and $SYS files
  1043.   Customization Variables:
  1044.        WIDE      FENCE
  1045.   Examples:
  1046.        ERA *.ASM           <-- Erase all .ASM files
  1047.        ERA *.*             <-- Erase all files
  1048.   Notes:
  1049.        If a $R/O file is encountered,  a BDOS error message will be 
  1050.   displayed  and the procedure is stopped.   The user is unsure  at 
  1051.   this  time as to which files have been erased and which have  not 
  1052.   and should check.  Sorry for this problem!  The ERASE command (to 
  1053.   be  given  to SIG/M by RLC in the near future) is a  solution  to 
  1054.   this problem.
  1055.  
  1056. è
  1057.  
  1058.  
  1059.  
  1060.  
  1061.  
  1062.                                                 Page 14
  1063.  
  1064.  
  1065.  
  1066.  
  1067.  
  1068.              ZCPR - A Z80 Replacement for the CP/M CCP
  1069.  
  1070.  
  1071.  
  1072.  
  1073.   Command: LIST
  1074.   Function:  To Print the specified file on the CP/M LST: device
  1075.   Forms:
  1076.        LIST <ufn>          <-- Print the file (no paging)
  1077.   Customization Variables:
  1078.        -None-
  1079.   Examples:
  1080.        LIST TEST.TXT       <-- Print TEST.TXT on LST:
  1081.   Notes:
  1082.        If  the file has a $SYS attribute,  it will be found as well 
  1083.   as those with $DIR attributes.
  1084.  
  1085.  
  1086.   Command: TYPE
  1087.   Function:  To Print the specified file on the CP/M CON: device
  1088.   Forms:
  1089.        TYPE <ufn>          <-- Print the file with the paging deflt
  1090.        TYPE <ufn> P        <-- Print the file with the paging deflt
  1091.                                 negated
  1092.   Customization Variables:
  1093.        NLINES    PGDFLT    PGDFLG
  1094.   Examples:
  1095.        TYPE TEST.TXT
  1096.        TYPE TEST.TXT P
  1097.   Notes:
  1098.        When  the  display pauses during paging,  type any  char  to 
  1099.   continue or ^C to abort.  ^S also works.
  1100.  
  1101.  
  1102.   Command: SAVE
  1103.   Function:  To Copy the TPA starting at 100H to diskè  Forms:
  1104.        SAVE <Number of Pages> <ufn>  <-- <Number of Pages> in DEC
  1105.        SAVE <Number of Pages>H <ufn> <-- <Number of Pages> in HEX
  1106.        SAVE <Number of Sectors> <ufn> S  <-- Number of sectors
  1107.        SAVE <Number of Sectors>H <ufn> S <-- Number of sectors
  1108.   Customization Variables:
  1109.        NUMBASE   RAS
  1110.   Examples:
  1111.        SAVE 15 MYFILE.TXT        <-- 15 pages saved
  1112.        SAVE FH MYFILE.TXT        <-- 15 pages saved
  1113.        SAVE 10H MYFILE.TXT S     <-- 16 sectors (8 pages) saved
  1114.   Notes:
  1115.        If the file name to be saved already exists,  then SAVE will 
  1116.   exit with the message 'Delete File?'; if the user REALLY wants to 
  1117.   save  under  this name,  he may then type Y or y and the  current 
  1118.   file will be deleted and then recreated containing the  specified 
  1119.   part of the TPA.
  1120.  
  1121.  
  1122.  
  1123.  
  1124.  
  1125.  
  1126.  
  1127.                                                 Page 15
  1128.  
  1129.  
  1130.  
  1131.  
  1132.  
  1133.              ZCPR - A Z80 Replacement for the CP/M CCP
  1134.  
  1135.  
  1136.  
  1137.  
  1138.  
  1139.   Command: REN
  1140.   Function:  To Change the name of a disk file
  1141.   Forms:
  1142.        REN <ufn new>=<ufn old>
  1143.   Customization Variables:
  1144.        RAS
  1145.   Examples:
  1146.        REN NEWFILE.TXT=OLDFILE.TXT
  1147.   Notes:
  1148.        If <ufn new> already exists, the message 'Delete File?' will 
  1149.   be  printed  and the user may respond with Y or y to  delete  the 
  1150.   current <ufn new> and then rename <ufn old> to <ufn new>.è
  1151.   Command: USER
  1152.   Function:  To Change the current user number
  1153.   Forms:
  1154.        USER <User Number>       <-- <User Number> in DEC
  1155.        USER <User Number>H      <-- <User Number> in HEX
  1156.   Customization Variables:
  1157.        -None-
  1158.   Examples:
  1159.        USER 15        USER FH        USER 0
  1160.        USER      <-- Same as USER 0
  1161.   Notes:
  1162.        -None-
  1163.  
  1164.  
  1165.   Command: DFU
  1166.   Function:  To Temporarily Change the default user number for the
  1167.              command hierarchy search
  1168.   Forms:
  1169.        DFU <User Number>        <-- <User Number> in DEC
  1170.        DFU <User Number>H       <-- <User Number> in HEX
  1171.   Customization Variables:
  1172.        -None-
  1173.   Examples:
  1174.        DFU 15         DFU FH         DFU 0
  1175.        DFU       <-- Same as DFU 0
  1176.   Notes:
  1177.        See above for explanation.
  1178.  
  1179.  
  1180.  
  1181.  
  1182.  
  1183.  
  1184.  
  1185.  
  1186.  
  1187.  
  1188.  
  1189.  
  1190.  
  1191.  
  1192.                                                 Page 16
  1193.  
  1194.  
  1195.  
  1196.  
  1197. è             ZCPR - A Z80 Replacement for the CP/M CCP
  1198.  
  1199.  
  1200.  
  1201.  
  1202.  
  1203.   Command: JUMP
  1204.   Function:  To "call" the subroutine at the specified page address
  1205.   Forms:
  1206.        JUMP <Address> <Cmd Parms> <-- <Address> in HEX
  1207.   Customization Variables:
  1208.        NUMBASE   RAS
  1209.   Examples:
  1210.        JUMP E000 or JUMP E000H  <-- Jump to E000H
  1211.        JUMP                     <-- Jump to 000H
  1212.        JUMP 0                   <-- Jump to 000H
  1213.   Notes:
  1214.        JUMP performs a subroutine "call", so the called routine may 
  1215.   return to the ZCPR by either a RET or a Warm Boot.
  1216.  
  1217.  
  1218.   Command: GO
  1219.   Function:  To "call" the subroutine starting at 100H
  1220.   Forms:
  1221.        GO <Cmd Parms>           <-- Execute reentrant at 100H
  1222.   Customization Variables:
  1223.        RAS
  1224.   Examples:
  1225.        GO *.ASM                 <-- Assuming XDIR is loaded,
  1226.                                      gives directory of *.ASM
  1227.   Notes:
  1228.        This  command is identical in function to JUMP  100H;  JUMP, 
  1229.   however, leaves the address as the first entry in CP/M BASE + 80H 
  1230.   (the input line buffer), while GO has no such address.
  1231.  
  1232.  
  1233.   Command: GET
  1234.   Function:  To load a file from disk into memory starting at the
  1235.              specified page
  1236.   Forms:
  1237.        GET <Address> <ufn>      <-- <Address> in HEX
  1238.   Customization Variables:
  1239.        NUMBASE   RAS
  1240.   Examples:
  1241.        GET 8000 TEST.80         <-- Load TEST.80 starting at 8000H
  1242.        GET 100 TEST.80 or GET 100H TEST.80 <-- Load TEST.80      
  1243.                                      starting at 100H
  1244.        GET 0 TEST.80            <-- Load TEST.80 starting at 000Hè  Notes:
  1245.        GET  searches for the specified file according to  the  same 
  1246.   command  hierarchy  search employed by the ZCPR command  scanner.  
  1247.   Hence,  if the user is on B:/10 and the file is on A:/0 with  the 
  1248.   current  default user number at 0,  GET will search from B:/10 to 
  1249.   B:/0 to A:/0 in looking for the file.
  1250.  
  1251.  
  1252.  
  1253.  
  1254.  
  1255.  
  1256.                                                 Page 17
  1257.  
  1258.  
  1259.  
  1260.  
  1261.  
  1262.              ZCPR - A Z80 Replacement for the CP/M CCP
  1263.  
  1264.  
  1265.  
  1266.                          ZCPR Error Messages
  1267.  
  1268.        The  following  are the error messages issued  by  ZCPR  and 
  1269.   their meanings.
  1270.  
  1271.   Message   Meaning
  1272.  
  1273.   ?         Printed after a command or an argument means that such
  1274.               was invalid
  1275.  
  1276.   No File   From DIR, this means that DIR did not locate any files
  1277.             Also from ERA with the same meaning
  1278.  
  1279.   All?      Issued in response ERA *.*, asks the user is he really
  1280.               wants to erase all the files.  Unlike under the
  1281.               original CP/M 2.2 CCP, single character input is
  1282.               required (Y or y for yes and anything else for no)
  1283.               with NO <CR> to end the line
  1284.  
  1285.   Full      From SAVE, means that there is not enough space on
  1286.               disk
  1287.             From GET or command load by CPR, means that there
  1288.               is not enough space in memory
  1289.  
  1290.   Delete File?
  1291.             From REN or SAVE, means that the file specified already è              exists on disk and the user may type Y or y to delete 
  1292.               it and proceed with the REN or SAVE function
  1293.  
  1294.  
  1295.  
  1296.  
  1297.  
  1298.  
  1299.  
  1300.  
  1301.  
  1302.  
  1303.  
  1304.  
  1305.  
  1306.  
  1307.  
  1308.  
  1309.  
  1310.  
  1311.  
  1312.  
  1313.  
  1314.  
  1315.  
  1316.  
  1317.  
  1318.  
  1319.  
  1320.  
  1321.                                                 Page 18
  1322.  
  1323.  
  1324.  
  1325.  
  1326.  
  1327.              ZCPR - A Z80 Replacement for the CP/M CCP
  1328.  
  1329.  
  1330.  
  1331.  
  1332.                                Part C
  1333.                ZCPR Command Levels and How to Use Them
  1334.  
  1335.  
  1336.        ZCPR  Version 1.0 and beyond supports three distinct command 
  1337.   levels in its implementation.  Each level constitutes a different 
  1338.   way to issue a command for ZCPR to process.è
  1339.        Command Levels 1 and 2 are common to all implementations  of 
  1340.   CP/M  and CP/ZM from CP/M Version 1.4.   Command Level 1 is  that 
  1341.   command level in which the command is issued by the user from his 
  1342.   console  terminal.   The  prompt  'd>' or 'du>'  appears  on  the 
  1343.   terminal,  and  the  user  is allowed to enter the  command  with 
  1344.   editing from the terminal.  Command Level 2 is that command level 
  1345.   in which the command is entered from an executing $$$.SUB file.
  1346.  
  1347.        In  both cases,  the command is stored in the internal  ZCPR 
  1348.   buffer called CIBUFF (Command Input BUFFer).   Under both Command 
  1349.   Levels  1  and 2,  the command is placed into  this  buffer,  the 
  1350.   characters of the command line are capitalized, a character count 
  1351.   which  indicates the number of characters in the command line  is 
  1352.   stored in CBUFF (the byte before CIBUFF),  an ending binary 0  is 
  1353.   placed  after  the last character in the command  line,  and  the 
  1354.   internal  pointer CIBPTR (Command Input Buffer PoinTeR) is set to 
  1355.   point to CIBUFF (the first character of the command line).
  1356.  
  1357.        Command  Level 3 is an extended concept to Command Levels  1 
  1358.   and  2  which is specifically supported by ZCPR Version  1.0  and 
  1359.   beyond.  This command level allows a transient program to place a 
  1360.   command  line into CIBUFF and the character count into CBUFF  and 
  1361.   have this command line executed by ZCPR.   Once control is trans-
  1362.   ferred to ZCPR to execute the command line, the transient program 
  1363.   which  placed  the command line loses control and the command  is 
  1364.   executed  exactly as though it had been typed by the user at  his 
  1365.   console terminal.
  1366.  
  1367.        In  order  for  a transient program to utilize  the  Command 
  1368.   Level 3 facility, this program MUST do the following:
  1369.  
  1370.             1.  Locate the ZCPR.  Since the ZCPR is ALWAYS 2K bytes 
  1371.   in  size and located directly under the BDOS,  the transient  can 
  1372.   locate  the  ZCPR  by examining the BDOS entry  page  address  at 
  1373.   location  7  and  subtracting 8 from this number (8  pages  =  2K 
  1374.   bytes).  The resulting number is the base page address of ZCPR.
  1375.  
  1376.             2.   Store the command line in CIBUFF and the character 
  1377.   count  in  CBUFF.   Knowing the base page address  of  ZCPR,  the 
  1378.   following information is useful in doing this:
  1379.  
  1380.  
  1381.  
  1382.  
  1383.  
  1384.  
  1385. è                                                Page 19
  1386.  
  1387.  
  1388.  
  1389.  
  1390.  
  1391.              ZCPR - A Z80 Replacement for the CP/M CCP
  1392.  
  1393.  
  1394.  
  1395.  
  1396.                  ORG  CPRLOC    ;Base Address of ZCPR
  1397.                  JMP  CPR       ;Enter ZCPR and Execute Default Cmd
  1398.                  JMP  CPR1      ;Enter ZCPR and Don't Execute
  1399.        MBUFF:    DB   BUFLEN    ;Size of CIBUFF in bytes
  1400.        CBUFF:    DS   1         ;Number of Bytes in Command Line
  1401.        CIBUFF:   DS   BUFLEN    ;Buffer for Command Line
  1402.                  DS   1         ;Buffer for Ending 0 (set by ZCPR)
  1403.        CIBPTR:   DS   2         ;Address of CIBUFF (set by ZCPR)
  1404.  
  1405.  
  1406.             3.   Obtain  the User/Disk Flag.   Location 4  contains 
  1407.   this number,  but the user may select a flag of his choice.  This 
  1408.   flag  is  one  byte  long,  and the high-order  nibble  (4  bits) 
  1409.   contains  the user number and the low-order nibble  contains  the 
  1410.   disk  number to process the command from.   The User/Disk Flag is 
  1411.   to be passed to ZCPR in the C Register.
  1412.  
  1413.             4.  When ready, transfer control to ZCPR to process the 
  1414.   command by JMPing to the base address of ZCPR.   The first JMP in 
  1415.   the JMP Table given above is at this address.  At this time, ZCPR 
  1416.   will  log in the user and disk in the User/Disk Flag and  process 
  1417.   the Command Level 3 Command Line.
  1418.  
  1419.  
  1420.  
  1421.  
  1422.  
  1423.  
  1424.  
  1425.  
  1426.  
  1427.  
  1428.  
  1429.  
  1430.  
  1431.  
  1432. è
  1433.  
  1434.  
  1435.  
  1436.  
  1437.  
  1438.  
  1439.  
  1440.  
  1441.  
  1442.  
  1443.  
  1444.  
  1445.  
  1446.  
  1447.  
  1448.  
  1449.  
  1450.                                                 Page 20
  1451.  
  1452.  
  1453.  
  1454.  
  1455.  
  1456.              ZCPR - A Z80 Replacement for the CP/M CCP
  1457.  
  1458.  
  1459.  
  1460.  
  1461.        The  following  is a sample program  which  illustrates  the 
  1462.   steps outlined above:
  1463.  
  1464.   ;
  1465.   ;  Demonstration of Command Level 3 Facility by RLC
  1466.   ;
  1467.   udflag  equ     4       ;Address of User/Disk Flag
  1468.   bdos    equ     5       ;Address of BDOS Entry Point
  1469.  
  1470.           org     100h
  1471.  
  1472.           lxi     d,prmpt ;Print User Prompt
  1473.           mvi     c,9     ;PRINT function
  1474.           call    bdos
  1475.  
  1476.           lhld    bdos+1  ;Get address of BDOS
  1477.           mov     a,h     ;High-Order Address in A
  1478.           sui     8       ;A=High-Order Address of CPR
  1479.           mov     h,a     ;HL=Address of CPRè          mvi     l,0
  1480.           shld    cpr     ;Save address in buffer
  1481.  
  1482.           lxi     d,6     ;Point to command line buffer
  1483.           dad     d       ;HL points to command line buffer
  1484.           xchg            ;DE points to command line buffer
  1485.           mvi     c,10    ;READLN into this buffer
  1486.           call    bdos
  1487.  
  1488.           lhld    cpr     ;Get Address of CPR
  1489.           lda     udflag  ;Get User/Disk Flag
  1490.           mov     c,a     ; ... in C
  1491.           pchl            ;Run Command Line
  1492.  
  1493.   cpr:    ds      2       ;CPR Address buffer
  1494.   prmpt:  db      'User Command? $'
  1495.  
  1496.  
  1497.  
  1498.  
  1499.  
  1500.  
  1501.        Enjoy using ZCPR!
  1502.                                 -- RLC
  1503.  
  1504.  
  1505.  
  1506.  
  1507.  
  1508.  
  1509.  
  1510.  
  1511.  
  1512.  
  1513.  
  1514.  
  1515.                                                 Page 21
  1516.  
  1517.  
  1518.  
  1519.  
  1520.  
  1521.