home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / 22rsx / 22rsx-20.ark / 22RSX.DOC < prev    next >
Text File  |  1984-10-13  |  16KB  |  313 lines

  1.  
  2.             22RSX: a Resident System Extension facility for CP/M 2.x
  3.  
  4.                      Copyright (C) 1984 by James H. Whorton
  5.                                All rights reserved
  6.  
  7.         *****************************************************************
  8.         *  This  documentation  and all files included in this  system  *
  9.         *  (see list in Introduction) may be freely exchanged provided  *
  10.         *  that such exchange is non-commercial and that the copyright  *
  11.         *  notice  is  wholly  retained.  No commercial  use  of  this  *
  12.         *  document  or any of the files listed is  permitted  without  *
  13.         *  the express written permission of the author.                *
  14.         *  Anyone  wishing to modify this system for re-release should  *
  15.         *  contact the author before doing so.                          *
  16.         *****************************************************************
  17.  
  18.  
  19.         The  author may be contacted by one of the following methods...
  20.  
  21.              Mail:  James H. Whorton
  22.                     PSC #1  Box 36
  23.                     Offutt AFB, NE  68113
  24.  
  25.              Modem: OBBS Remote CP/M Facility
  26.                     (402) 346-4206
  27.                     Leave message or comment to SYSOP.
  28.  
  29.                     QX-10 Remote System
  30.                     (402) 393-5246
  31.                     Leave message addressed to James Whorton
  32.  
  33.  
  34.  
  35.         1. Introduction
  36.  
  37.         22RSX  is  a  facility to allow the installation and  removal  of 
  38.         Resident System Extensions.  Briefly, an extension is an addition 
  39.         to BDOS that can monitor,  trap,  alter or process any BDOS  call 
  40.         made  from an applications program.  This came about after I  had 
  41.         worked  a bit with CP/M 3.0.  It's RSX facility impressed me with 
  42.         the fact that it made it relatively easy to 'patch' the operating 
  43.         system  to add things such as remote  consoles,  print  spoolers, 
  44.         etc.  Since I had some experience with CP/M, I decided to write a 
  45.         similar system for CP/M 2.2.
  46.         Note:  I  realize  that  there is an RSX manager written  by  Jim 
  47.         Lopushinsky for CP/M 2.2.  I have never used it,  but from what I 
  48.         have  seen and read,  it seems to require a fair amount  of  work 
  49.         with DDT, M80, etc. This system, on the other hand, takes care of 
  50.         all installation. All you have to do is write a module, insert it 
  51.         in the driver,  assemble, load and run! And your finished product 
  52.         will,  assuming  that it uses standard CP/M calls and procedures, 
  53.         run on any other CP/M system without modification.
  54.  
  55.         This system, as distributed, consists of the following files:
  56.  
  57.         22RSX.OBJ    -------> The RSX manager module.
  58.         22INSTA.ASM  -------> The main driver file.
  59.         22INSTB.ASM  -------> The second driver file.
  60.         22REMOVE.OBJ -------> The module removal program.
  61.         22RSX.DOC    -------> Documentation.
  62.         LASM.OBJ     -------> Linking assembler needed by system.
  63.         EXPTABS.ASM  -------> A demonstration module.
  64.         CONSOLE.ASM  -------> Another demonstration module.
  65.         CONSTAT.ASM  -------> The companion access program for CONSOLE.ASM.
  66.         MAKE.SUB     -------> Submit file for assembling RSX modules.
  67.         22RSX.NOT    -------> Short version of this file list.
  68.  
  69.  
  70.  
  71.         2. Theory of operation
  72.  
  73.         When  22RSX  is  run,  assuming that it has not  been  previously 
  74.         installed,  it  loads  itself  into  high  memory,  storing  some 
  75.         addresses  and pacthing itself in.  The manager remains  resident 
  76.         for  as long as any RSX modules are  present,  intercepting  warm 
  77.         boots and doing other housekeeping chores. More on it's functions 
  78.         later.
  79.         Let's  say  that you have assembled an RSX module  following  the 
  80.         directions  given in section 4.  You now run the assembled  file. 
  81.         The  driver code checks to see if the manager is present.  If so, 
  82.         it proceeds to add the RSX to the environment.  First the  module 
  83.         is  relocated  to  a  point just underneath the  last  module  or 
  84.         manager. This is done a byte at a time. When the code is moved, a 
  85.         second  routine goes through it and checks  for  addresses.  Each 
  86.         address  that  falls  within  the  module  code  is  adjusted  to 
  87.         compensate  for  the relocation.  Once that is  done,  there  are 
  88.         several  addresses that must be patched.  First the PREV field of 
  89.         the  module last installed (before this one) is loaded  with  the 
  90.         address  of  our new module.  Then the NEXT field of the  current 
  91.         module  is loaded with the address of the next  module.  Now  the 
  92.         BDOS  vector  at  location 0005 is patched with  the  new  module 
  93.         address,  making it the first in line.  WMLOC, the address in the 
  94.         warm boot routine that we found earlier,  is patched with the new 
  95.         module  address to our new BDOS vector from being overwritten  by 
  96.         the  next warm boot.  Now that the patches are finished,  a brief 
  97.         summary of what has occured is printed,  then the program returns 
  98.         to CP/M.
  99.  
  100.         Modules  may  be removed by using the  22REMOVE  program,  or  by 
  101.         utilizing the manager call (see section 3 for details.)
  102.         The  22REMOVE  program may selectively remove modules  one  at  a 
  103.         time, or it may remove the manager and all modules, restoring the 
  104.         system to the condition that we found it in.  When it removes one 
  105.         module,  if  the  module was the last to be installed  (first  in 
  106.         line)  then  when  the BDOS and WMLOC addresses are  patched  the 
  107.         portion of the TPA previously used by the now deleted module will 
  108.         be freed up for user programs.  The BDOS vector is simply changed 
  109.         to the address of the NEXT module and everything is fine.
  110.         If  the  module is inside the chain (not top or bottom) then  the 
  111.         previous module NEXT field is loaded with the current module NEXT 
  112.         address and the next module PREV field is loaded with the current 
  113.         module PREV address.  The module is now effectively deleted  from 
  114.         the chain.  Note that the TPA used by the module is not reclaimed 
  115.         until  all modules preceeding it have also been removed,  or  the 
  116.         entire environment (manager and modules) have been deleted.
  117.  
  118.  
  119.  
  120.         3. RSX modules
  121.  
  122.         This  section deals with how to write an RSX module for use  with 
  123.         this  system.  A  section on using Manager calls follows the  RSX 
  124.         formulation discussion.  An RSX must follow a specified format in 
  125.         order to work properly. Each RSX consists of two(2) major parts.
  126.  
  127.  
  128.         Prefix
  129.  
  130.           This  system accepts RSX's written in the standard DRI  format, 
  131.           which  includes the prefix.  This header MUST preface every RSX 
  132.           module. The format is as follows:
  133.  
  134.  
  135.           serial:   db   0,0,0,0,0,0  ;Space for CP/M 3.0 serial # (not
  136.                                       ;used by this system.)
  137.           start:    jmp  rsxstrt      ;This is the jump to the beginning 
  138.                                       ;of the module itself (skips past 
  139.                                       ;the rest of the prefix.
  140.           next:     jmp  $-$          ;This address is patched by the 
  141.                                       ;loader and points to another RSX 
  142.                                       ;or the BDOS jump table.
  143.           prev:     dw   0            ;The loader will patch in the address
  144.                                       ;of the previous module or BDOS.
  145.           remove:   db   0            ;Remove flag (0=remain resident,
  146.                                       ;0FFh=remove at next warm boot.)
  147.           nonbank:  db   0            ;Flag for CP/M 3.0 (not used).
  148.           name:     db   'RSXNAME '   ;This is the name of the RSX
  149.                                       ;module. It MUST be 8 characters in 
  150.                                       ;length. Pad with spaces as needed.
  151.           loader:   db   0            ;Flag for CP/M 3.0 (not used).
  152.                     db   0,0          ;Reserved for system use.
  153.  
  154.  
  155.  
  156.         Code
  157.  
  158.           The module code comes next.  At present the loader routine will 
  159.           only  recognize  8080  instructions,  so your  module  must  be 
  160.           written in 8080 code.  Generally the first thing you will  want 
  161.           to  do  on entry is to check <c> for whatever  function(s)  you 
  162.           wish to work with.  If the function being called is not one you 
  163.           are  interested in,  you can simply pass the call along with  a 
  164.           JMP NEXT.
  165.  
  166.           If you didn't pass out of the routine then the function must be 
  167.           one  you're  looking for.  Before doing any processing it is  a 
  168.           good  idea  to save the stack pointer and  registers  <bc>  and 
  169.           <de>. A illustration of this is shown below.
  170.  
  171.                   lxi  h,0
  172.                   dad  sp
  173.                   shld userstk             ;save stack pointer
  174.                   push d                   ;save regs.
  175.                   push b
  176.  
  177.           Now  do  whatever processing you wish to.  The  most  important 
  178.           thing  to  remember  is to use NEXT to access BDOS  calls  from 
  179.           inside the module. Example (outputs char to the console):
  180.  
  181.                   mvi  e,'X'          ;load regs
  182.                   mvi  c,02
  183.                   call next
  184.  
  185.           If  you  call location 05 (the BDOS vector) instead of  calling 
  186.           NEXT  your  call  will  be intercepted  again  and...
  187.           There  are  several  ways to exit a module.  If  you  wish  the 
  188.           trapped  function  call  to execute,  then  restore  the  stack 
  189.           pointer, <bc> and <de> and do a JMP NEXT. Example:
  190.  
  191.                   lhld userstk        ;restore stack
  192.                   sphl
  193.                   pop  b              ;resore regs
  194.                   pop  d
  195.                   jmp  next           ;continue with the call
  196.  
  197.           If  you  have  provided alternate processing in  place  of  the 
  198.           function  and  wish to return directly to where you came  from, 
  199.           restore  the stack and regs as above,  set the result  regs  as 
  200.           desired and do a RET instead of a JMP NEXT.
  201.  
  202.           Still  not  sure  about something?  Check out  the  two  sample 
  203.           modules  included with this package.  They should provide  some 
  204.           helpful ideas.
  205.  
  206.         Manager Calls
  207.  
  208.           Version 2.0 offers four(4) manager functions that may be called 
  209.           from an application or RSX module.  To use the calls,  load <c> 
  210.           with  59,  Call  RSX Manager,  then load <de> according to  the 
  211.           following specifications:
  212.  
  213.           -->>DE=0       Remove inactive RSX's, that is, those whose
  214.                          REMOVE flags have been set to 0FFh. See next
  215.                          function description to see how to do this. (This
  216.                          functions the same as CP/M 3.0. It is called
  217.                          automatically called on every warm boot.)
  218.  
  219.           -->>DE=1     This request causes the manager to place WMLOC
  220.                          in DE and return it to the user. (The install-
  221.                          ation driver uses this.) This function should be
  222.                          used to check to see if the manager is resident.
  223.  
  224.           -->>DE=(address) Set the remove flag of the RSX whose name is
  225.                          pointed to by DE. DE must be an 8-byte block
  226.                          corresponding to the NAME field of the RSX mod-
  227.                          ule. If found, the remove flag will be set to
  228.                          0FFh causing the RSX to be removed at the next
  229.                          warm boot. (Note: 22RSX, which is the name
  230.              reserved for the RSX manager, may not be used.)
  231.  
  232.           -->>DE=0FFFFh  This signals the manager to remove itself and
  233.                          any RSX's installed, restoring the system to 
  234.                          the condition it was found in.
  235.  
  236.  
  237.           Now execute a normal CALL BDOS(0005).  On entry,  <a> should be 
  238.           set  to zero.  The result code for the called function is  then 
  239.           returned  in  <a>.   A  value  of  0FFh  signals  a  successful 
  240.           operation, while a value of 00h indicates an error has occurred 
  241.           or that the manager has not been installed.
  242.  
  243.  
  244.  
  245.         4. Implementation
  246.  
  247.         Software needed:
  248.  
  249.           -> A text editor.
  250.           -> LASM.COM (supplied)
  251.           -> LOAD.COM
  252.           -> SUBMIT.COM
  253.           -> MAKE.SUB (supplied)
  254.           -> 22INSTA.ASM, 22INSTB.ASM (supplied)
  255.           -> An RSX source code module.
  256.  
  257.         The  procedure to implement a properly written module  is  fairly 
  258.         simple.
  259.  
  260.             a.  Using an editor, such as WORDSTAR, call up the RSX module 
  261.             file.  Go  to the end of the file.  Now type in a  line  that 
  262.             reads...
  263.  
  264.             LINK    '22INSTB'
  265.  
  266.             This  line MUST be the last line in the module  file.  Ensure 
  267.             that there is not an END statement there. If so, delete it or 
  268.             comment(;) it out. Now save the file and exit.
  269.  
  270.             b.  Ensure that the .SUB file and all source files are on the 
  271.             proper drive.  (The .SUB file as configured specifies A. This 
  272.             may be adjusted as desired.) Now run the MAKE.SUB file, which 
  273.             will automate the process somewhat. The syntax is...
  274.  
  275.             SUBMIT MAKE module-name
  276.  
  277.             You should now have a .COM file ready to run.
  278.  
  279.             c.  First run 22RSX to install the RSX manager,  then run the 
  280.             file. It will anounce itself, install the RSX into the system 
  281.             and  present a few vital statistics.  The RSX is now part  of 
  282.             the  system  environment and will remain so until removed.
  283.  
  284.         And that's all there is to it,  folks.  You don't have to know  a 
  285.         thing  about  your particular CP/M setup  (CCPLOC,  BDOS  vector, 
  286.         size) unless you want to do something in the module that requires 
  287.         a certain parameter.
  288.  
  289.  
  290.         5. Thoughts
  291.  
  292.         For those of you who are unfamiliar with the RSX concept and want 
  293.         to learn more, I recommend the following articles:
  294.  
  295.                "Resident System Extensions Under CP/M Plus"
  296.                Gary M. Silvey
  297.                Dr. Dobbs Journal  #93 July '84
  298.  
  299.                "Resident System Extensions (RSX)"
  300.                Ronald G. Fowler
  301.                Microsystems  Vol. 5/# 2  February '84
  302.  
  303.         Please  direct  any  bug  reports to me via one  of  the  methods 
  304.         mentioned  on the title page.  And if you write any  modules  and 
  305.         release  them I'd appreciate it if you could upload a copy.  That 
  306.         way I can keep an up-to-date library for downloading.
  307.         I hope that you enjoy using this system. I feel that it is useful 
  308.         and should provide a conveinent way to add utilities and features 
  309.         to any CP/M system.
  310.  
  311.         James H. Whorton
  312.         October 13, 1984
  313.