home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / mex / mex2z12.lbr / MEX+2Z12.ZZ0 / MEX+2Z12.Z80
Text File  |  1989-02-09  |  13KB  |  418 lines

  1. ; Program: MEX+2Z
  2. ; Author: Bruce Morgen and Jay Sage
  3. ; Version: 1.2
  4. ; Date: 9 Feb 89
  5. ; Previous Versions: 1.1 (8 Dec 86)
  6.  
  7. ;           * * *   IMPORTANT NOTE   * * *
  8. ;
  9. ; This program is copyrighted 1989 by NAOG/ZSIG.  It may be copied and
  10. ; modified freely for personal use but may not be sold or distributed
  11. ; for a fee.  Modified versions must be submitted to and approved by
  12. ; NAOG/ZSIG before they may be distributed.  See the file ZSIGPOL1.DOC
  13. ; on Z-Nodes for the ZSIG policy on signing out and modifying programs.
  14. ;
  15. ;______________________________________________________________________
  16. ;
  17. ; MEX+2Z: MEX-to-ZCPR3 Chaining Program
  18. ;
  19. ; This program was derived from Bruce Morgen's MEX2Z and can be assembled
  20. ; to work with either MEX114 or Mex-Plus.  The functions supported are
  21. ; slightly different -- hence the different name.  NOTE: There are some
  22. ; significant differences from version 1.1.  Please read carefully.  This
  23. ; version must be assembled and run as a type-3 program.  It inspects the
  24. ; byte at location 107H in the MEX that was running to determine the current
  25. ; data rate.  It then restores that rate when it chains back to MEX.
  26. ;
  27. ; This program gives the MEX command 'CPM' a shell capability like that in
  28. ; the 16-bit version's SHELL command.  The equates below must be set up for
  29. ; the appropriate version of MEX.  MEX+2Z is used as follows:
  30. ;
  31. ; 1) Set the real MEX.COM file so that it will not be invoked by a command
  32. ;    of the form "MEX".  This can be done by renaming it (e.g., to REALMEX)
  33. ;    or by putting it in a directory that is not along the search path.
  34. ; 2) Create a stand-alone or ARUNZ alias called MEX with scripts such as
  35. ;    the following and invoke MEX using the alias:
  36. ;
  37. ;    for renamed MEX:        for MEX in non-path directory DIR:    
  38. ;        REALMEX $*            DIR:MEX $*
  39. ;        MEX+2Z                MEX+2Z
  40. ;
  41. ; 3) Create a stand-alone or ARUNZ alias called MEXRR with scripts such as
  42. ;    the following:
  43. ;
  44. ;    for renamed MEX:        for MEX in non-path directory DIR:    
  45. ;        GET 100 REALMEX.COM        GET 100 DIR:MEX.COM
  46. ;        POKE 107 $1            POKE 107 $1
  47. ;        GO                GO
  48. ;        MEX+2Z                MEX2Z
  49. ;
  50. ; On exit from MEX, MEX+2Z runs and looks for the MEX command line left in
  51. ; memory.  It scans for the command "CPM", takes anything in the command after
  52. ; that, and puts it into the ZCPR3 command line with ";MEXRR" after it so that
  53. ; the MEX alias will be run again after the other commands are finished.  With
  54. ; version 1.2, the baud rate constant will be passed to MEXRR as a parameter so
  55. ; that it can poke it into place so that MEX will come back at its old rate.
  56. ; If you leave MEX with the command "CPM CRUNCH FN.FT", the file will be
  57. ; crunched and then you will return to MEX.
  58. ;
  59.  
  60. ;=============================================================================
  61. ;
  62. ;            R E V I S I O N    H I S T O R Y
  63. ;
  64. ;=============================================================================
  65.  
  66. VERSION    EQU    12
  67.  
  68. ; Version 1.2    February 9, 1989, Jay Sage
  69. ;    I have set this up now as a type-3 program.  By loading at 200H, it
  70. ;    can save MEX's current baud rate and restore it when it chains back
  71. ;    to MEX.
  72. ;
  73. ;    If you do not want this feature, go back to version 1.1.  This version
  74. ;    must run as a type-3 program (recommended at an address of 200H).
  75.  
  76. ; VERSION    EQU    11
  77.  
  78. ; Version 1.1    December 11, 1986, Jay Sage
  79. ;    Improved processing of the MEX command line to make it more reliable
  80. ;    and make it work with multiple commands in MEX-PLUS.  The code makes
  81. ;    use of the way MEX-PLUS maintains the command line.  With MEX114 the
  82. ;    command line length is not stored at the beginning of the command
  83. ;    line; a value of zero is stored there.  Bruce's original technique of
  84. ;    scanning for the terminating carriage return must be used.  The MEXPLUS
  85. ;    equate takes care of this.
  86.  
  87. ; Version 1.0    December 8. 1986, Bruce Morgen
  88. ;    Original version for MEX114.
  89.  
  90. ;=============================================================================
  91. ;
  92. ;        C O N F I  G U R A T I O N    S E C T I O N
  93. ;
  94. ;=============================================================================
  95.  
  96. NO    EQU    0
  97. YES    EQU    NOT NO
  98.  
  99. BIHELP    EQU    YES        ; YES to include built-in help facility
  100.  
  101. .ACCEPT    'Set up for CMDRUN (YES/NO)? ',CMDRUN
  102. ;CMDRUN    EQU    YES        ; YES if using an ARUNZ alias called by CMDRUN,
  103.                 ; ..NO otherwise or for standalone alias
  104. ECP    EQU    YES        ; YES to invoke CMDRUN as ECP ('/' prefix)
  105.  
  106. .ACCEPT    'Set up for MEX-Plus (YES/NO)? ',MEXPLUS
  107. ;MEXPLUS    EQU    YES        ; YES for MEX-PLUS 1.65, NO for MEX114
  108.  
  109.      IF    MEXPLUS
  110.  
  111. MEXCL    EQU    2295H        ; Mex-Plus 1.65 command buffer address
  112. MEXPTR    EQU    2214H        ; Address of pointer to command buffer
  113. MEXVER    MACRO            ; Macro with MEX version name
  114.     DB    'MEX-PLUS Version 1.65'
  115.     ENDM
  116.  
  117.      ELSE    ; MEX114
  118.  
  119. MEXCL    EQU    5A39H        ; Mex 1.14 command buffer address
  120. MEXPTR    EQU    5390H        ; Address of pointer to command buffer
  121. MEXVER    MACRO            ; Macro with MEX version name
  122.     DB    'MEX Version 1.14'
  123.     ENDM
  124.  
  125.      ENDIF    ; MEXPLUS
  126.  
  127. CR    EQU    0DH        ; ASCII characters
  128. LF    EQU    0AH
  129. TAB    EQU    9
  130. BELL    EQU    7
  131.  
  132. PRINTF    EQU    9        ; BDOS print string function
  133. BDOS    EQU    0005        ; BDOS entry point
  134. TBUFF    EQU    80H        ; Command tail buffer
  135.  
  136. ;=============================================================================
  137. ;
  138. ;        E X T E R N A L    R E F E R E N C E S
  139. ;
  140. ;=============================================================================
  141.  
  142.     EXTRN    PSTR,CAPS,Z3INIT,PUTCL,$MEMRY
  143.  
  144.      IF    NOT MEXPLUS
  145.     EXTRN    SUBHD
  146.      ENDIF
  147.  
  148. ;=============================================================================
  149. ;
  150. ;            C O D E
  151. ;
  152. ;=============================================================================
  153.  
  154. ; TYP3HDR.Z80, Version 1.1
  155.  
  156. ; This code has been modified as suggested by Charles Irvine so that it will
  157. ; function correctly with interrupts enabled.
  158.  
  159. ; This is header code that can be used at the beginning of a type-3-environment
  160. ; program so that it will abort with an error message when not loaded to the
  161. ; correct address (such as when a user tries to run it under CP/M or Z30).
  162.  
  163. entry:
  164.     jr    start0        ; Must use relative jump
  165.     defb    0        ; Filler
  166.     db    'Z3ENV',3    ; Type-3 environment
  167. z3env:    dw    0        ; Filled in by Z33
  168.     dw    entry        ; Intended load address
  169.  
  170. start0:
  171.     ld    hl,0        ; Point to warmboot entry
  172.     ld    a,(hl)        ; Save the byte there
  173.     di            ; Protect against interrupts
  174.     ld    (hl),0c9h    ; Replace warmboot with a return opcode
  175.     rst    0        ; Call address 0, pushing RETADDR onto stack
  176. retaddr:
  177.     ld    (hl),a        ; Restore byte at 0
  178.     dec    sp        ; Get stack pointer to point
  179.     dec    sp        ; ..to the value of RETADDR
  180.     pop    hl        ; Get it into HL and restore stack
  181.     ei            ; We can allow interrupts again
  182.     ld    de,retaddr    ; This is where we should be
  183.     xor    a        ; Clear carry flag
  184.     push    hl        ; Save address again
  185.     sbc    hl,de        ; Subtract -- we should have 0 now
  186.     pop    hl        ; Restore value of RETADDR
  187.     jr    z,start        ; If addresses matched, begin real code
  188.  
  189.     ld    de,notz33msg-retaddr ; Offset to message
  190.     add    hl,de
  191.     ex    de,hl        ; Switch pointer to message into DE
  192.     ld    c,9
  193.     jp    0005h        ; Return via BDOS print string function
  194.  
  195. notz33msg:
  196.     defb    'Not Z33+$'    ; Abort message if not Z33-compatible
  197.  
  198. ; ---------------------------------------------------------------------------
  199.  
  200. MEXNAM:    DB    ';'            ; Separator
  201.      IF    CMDRUN            ; If using ARUNZ (CMDRUN) alias
  202.       IF    ECP
  203.     DB    '/'            ; Force ECP invocation
  204.       ELSE
  205.     DB    'CMDRUN '        ; Explicit CMDRUN invocation
  206.       ENDIF    ; ECP
  207.      ENDIF    ; CMDRUN
  208.  
  209.     DB    'MEXRR '        ; Alias to rerun MEX
  210. BAUDPAT:
  211.     DB    '5'            ; This will be filled in by program
  212.     DB    0,0,0,0,0,0,0,0,0,0,0    ; Room for patching (begin with space)
  213. NAMELEN    EQU    $ - MEXNAM
  214.  
  215. START:
  216.     LD    (STACK),SP
  217.     LD    SP,$MEMRY+64    ; Establish stack (so we can be sloppy later)
  218.  
  219.     LD    HL,(Z3ENV)
  220.     CALL    Z3INIT        ; Initialize Z3LIB.
  221.  
  222. ; ------------------------- Display built-in help if anything in command tail
  223.  
  224.      IF    BIHELP        ; Built-in help enabled
  225.     LD    A,(TBUFF)    ; Get count of characters in tail
  226.     OR    A        ; If nonzero, display built-in help
  227.     JP    NZ,HELP
  228.      ENDIF    ; BIHELP
  229.  
  230. ; ------------------------- Get current baud rate from address 107H
  231.  
  232.     LD    A,(107H)
  233.     ADD    A,'0'        ; Convert to character for POKE command
  234.     CP    '9'+1        ; Check for value bigger than 9
  235.     JR    C,SETBAUD
  236.     ADD    A,'A'-'0'-10
  237. SETBAUD:
  238.     LD    (BAUDPAT),A    ; Save in command string
  239.  
  240. ; ------------------------- Check for MEX command line in memory
  241.  
  242.     LD    HL,(MEXPTR)    ; Get pointer to command line
  243.     LD    BC,MEXCL    ; Correct value of pointer
  244.     LD    DE,MEXERR1    ; Point to possible error message
  245.     LD    A,B        ; Check for agreement
  246.     CP    H
  247.     JR    NZ,ENDIT    ; Error message if different
  248.     LD    A,C
  249.     CP    L
  250.     JR    NZ,ENDIT
  251.  
  252. ; ------------------------- Scan for exit command in the MEX command line
  253.  
  254.      IF    NOT MEXPLUS    ; Fill in character count
  255.     LD    BC,126        ; Maximum command line length
  256.     LD    A,CR        ; Search for terminating carriage return
  257.     PUSH    HL        ; Save pointer to start of command buffer
  258.     CPIR            ; Scan for the carriage return
  259.     LD    DE,MEXERR2    ; Prepare for possible error message
  260.     JR    NZ,ENDIT    ; If CPIR failed, quit with error message
  261.     POP    DE        ; Get buffer start address back to DE
  262.     CALL    SUBHD        ; Get number of characters in command line
  263.     DEC    HL        ; Correct by 2
  264.     DEC    HL
  265.     EX    DE,HL
  266.     LD    (HL),E        ; Put count into place in buffer
  267.      ENDIF    ; NOT MEXPLUS
  268.  
  269.     LD    B,(HL)        ; Put character count into B
  270.     INC    HL        ; Point to first character of command line
  271.     LD    DE,EXITCMD    ; Point to exit command to scan for
  272.     EX    DE,HL
  273.  
  274.                 ; Outer loop: look for initial character
  275.  
  276. SCAN1:    LD    A,(DE)        ; Get character from command line
  277.     CALL    CAPS        ; Capitalize it
  278.     CP    (HL)        ; See if it matches exit command first char
  279.     JR    Z,SCAN3        ; Go to check for rest of characters
  280. SCAN2:    INC    DE        ; Point to next character in command line
  281.     DJNZ    SCAN1        ; Continue scan
  282.     JR    DONE        ; If not found, we are done
  283.  
  284.                 ; Inner loop: check rest of characters
  285.  
  286. SCAN3:    PUSH    HL        ; Save registers
  287.     PUSH    DE
  288.     PUSH    BC
  289.     LD    B,EXITLEN-2    ; Characters in exit command less one
  290.  
  291. SCAN4:    INC    HL        ; Bump pointers
  292.     INC    DE
  293.     LD    A,(DE)        
  294.     CALL    CAPS
  295.     CP    (HL)
  296.     JR    NZ,SCAN5    ; Commands do not match
  297.     DJNZ    SCAN4
  298.     JR    FOUND        ; Exit command found
  299.     
  300. SCAN5:    POP    BC        ; Restore the registers
  301.     POP    DE
  302.     POP    HL
  303.     JR    SCAN2        ; Resume outer scan loop
  304.  
  305. FOUND:
  306.     EX    DE,HL        ; Get pointer to start of command into HL
  307.  
  308.  
  309. ; ------------------------- Build ZCPR3 command line
  310.  
  311.                 ; Skip to any tail after exit command
  312.  
  313. SETPTR:
  314.     INC    HL        ; Point to next character
  315.     LD    A,(HL)        ; Get it
  316.     CP    CR        ; If CR, we are at end of line
  317.     JR    Z,DONE        ; Nothing for ZCPR3 to run
  318.     CP    ' '+1        ; Skip over any other control characters
  319.     JR    C,SETPTR    
  320.  
  321.     PUSH    HL        ; Save pointer for PUTCL call
  322.     LD    HL,MEXCL    ; Point to command line again
  323.     LD    C,(HL)        ; Get length into BC
  324.     LD    B,0
  325.     INC    HL        ; Point to first character in command line
  326.     ADD    HL,BC        ; Increment to termininating CR
  327.     LD    A,(HL)        ; Verify it
  328.     CP    CR
  329.     LD    DE,MEXERR2    ; Prepare for possible error message
  330.     JR    NZ,ENDIT    ; Report error
  331.  
  332.         ; Add MEX reinvocation command to end of existing
  333.         ; command in MEX command buffer
  334.  
  335.     EX    DE,HL        ; To DE as destination pointer.
  336.     LD    HL,MEXNAM    ; Source pointer to HL.
  337.     LD    BC,NAMELEN    ; Length of line as counter to BC.
  338.     LDIR            ; Move 'em out.
  339.     POP    HL        ; Get back command line start.
  340.     CALL    PUTCL        ; Stuff command line via Z3LIB.
  341.     JR    NZ,DONE        ; Trap command line failures.
  342.  
  343.     LD    DE,MCLERR    ; Point at cmd line error msg.
  344.  
  345. ; -------------------------
  346.  
  347. ENDIT:    EX    DE,HL        ; Switch string pointer into HL
  348.     CALL    PSTR        ; Print string pointed to by HL
  349.  
  350. DONE:    LD    SP,(STACK)    ; Restore incoming stack pointer.
  351.     RET            ; All done, go to Z3.
  352.  
  353.      IF    BIHELP        ; Built-in help enabled
  354. HELP:    LD    DE,HELPMSG    ; Point to help message
  355.     JR    ENDIT
  356.      ENDIF    ; BIHELP
  357.  
  358. ; ------------------------- Messages
  359.  
  360. EXITCMD:
  361.     DB    'CPM',0
  362. EXITLEN    EQU    $ - EXITCMD
  363.  
  364. MEXERR1:
  365.     DB    LF
  366.     MEXVER            ; Mex version name macro
  367.     DB    ' image not found in memory!'
  368.     DB    cr,lf,bell,0
  369.  
  370. MEXERR2:
  371.     DB    LF
  372.     DB    'Defect in MEX command line!'
  373.     DB    cr,lf,bell,0
  374.  
  375. MCLERR:    DB    'ZCPR3 command line error!',cr,lf,bell,0
  376.  
  377.      IF    BIHELP        ; Built-in help enabled
  378. HELPMSG:
  379.     DB    LF
  380.     DB    TAB,'MEX+2Z Version '
  381.     DB    VERSION/10+'0','.',VERSION MOD 10 +'0'
  382.     DB    '  [ZSIG]'
  383.     DB    CR,LF,LF
  384.     DB    'For '
  385.     MEXVER
  386.     DB    ' gives a virtual shell capability'
  387.     DB    CR,LF
  388.     DB    'to the exit command CPM.'
  389.     DB    CR,LF,LF
  390.     DB    'Any tail after the MEX command "CPM" will be detected by'
  391.     DB    CR,LF
  392.     DB    'MEX+2Z and run as a command by ZCPR3.  Then MEX will be'
  393.     DB    CR,LF
  394.     DB    'reinvoked at its current baud rate.'
  395.     DB    CR,LF,LF
  396.     DB    'To use MEX+2Z you must make an alias named MEX with a script'
  397.     DB    CR,LF
  398.     DB    'such as "REALMEX;MEX+2Z", where the real MEX.COM file has'
  399.     DB    CR,LF
  400.     DB    'been renamed (e.g., to REALMEX) or kept off the path and'
  401.     DB    CR,LF
  402.     DB    'invoked with an explicit DIR: prefix.  You must also make'
  403.     DB    CR,LF
  404.     DB    'an alias MEXRR that loads MEX.COM to address 100, pokes the'
  405.     DB    CR,LF
  406.     DB    'parameter passed to the alias to address 107H, runs MEX using'
  407.     DB    CR,LF
  408.     DB    'the GO command, and then reinvokes MEX+2Z.  An example script'
  409.     DB    CR,LF
  410.     DB    'is: "GET 100 REALMEX.COM;POKE 107 $1;GO;MEX+2Z".'
  411.     DB    CR,LF
  412.     DB    0
  413.      ENDIF    ; BIHELP
  414.  
  415. STACK:    DS    2
  416.  
  417.     END
  418.