home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / dirutl / synonym3.lbr / SYNONYM3.AQM / SYNONYM3.ASM
Assembly Source File  |  1985-06-16  |  12KB  |  450 lines

  1.     TITLE    'SYNONYM Vers 3.0 Oct81'
  2. ;*------------------------------------------------------*
  3. ;*                            *
  4. ;*    SYNONYM vers 1.0   by Bill allen - Feb81    *
  5. ;*                            *
  6. ;*     Version 1.1 Jun81  by Bill Allen         *
  7. ;*    Version 1.2 Aug81  by Roy Lipscomb        *
  8. ;*    Version 2.0 Sep81  by Bill Allen        *
  9. ;*    Version 2.1 Oct81  by Roy Lipscomb        *
  10. ;*    Version 2.2 Oct81  by Roy Lipscomb        *
  11. ;*    Version 3.0 Oct81  by Roy Lipscomb        *
  12. ;*                            *
  13. ;*    This program will create a  synonym for any    *
  14. ;*  CP/M  command.  A fixed paramater string may be    *
  15. ;*  entered as a part of the synonym and any paramaters    *
  16. ;*  given on the command line that invokes the synonym    *
  17. ;*  will be appended to the fixed string.        *
  18. ;*                            *
  19. ;*    The program is self-modifying. It will create    *
  20. ;*  a .COM file with the "newname" given in the synonym    *
  21. ;*  command. This newname.COM when invoked will modify    *
  22. ;*  the CCP buffer using the "oldname" (see HELP) and    *
  23. ;*  then jump to the CCP to invoke the comand..        *
  24. ;*                            *
  25. ;*      Help with the format of the synonym command    *
  26. ;*  may be obtained by typing:                *
  27. ;*        "SYNONYM <cr>"  or  "SYNONYM ?<cr>"    *
  28. ;*                            *
  29. ;*  MODIFICATIONS:                    *
  30. ;*                            *
  31. ;*    10/26/81 - Version 3.0  (RJL)            *
  32. ;*    1)  Allows imbedded as well as appended parms.    *
  33. ;*    2)  Allows assembly-time option of having    *
  34. ;*    synonyms visible in directory.  (For CPM 2.X)    *
  35. ;*    3)  Aborts if proposed "newname" already    *
  36. ;*    present on directory--this safeguards the old    *
  37. ;*    command file from being overlaid if you inad-    *
  38. ;*    vertently omit the "newname" parameter.  (This    *
  39. ;*    check is not performed if "newname" begins    *
  40. ;*    with "X", for "experimental.")            *
  41. ;*    4)  Set for cleaner viewing of newname file    *
  42. ;*    contents with ccp command:   TYPE newname.COM    *
  43. ;*    5)  Null endmark not counted in command length.    *
  44. ;*    6)  Computes (vs. assumes) CCP buffptr location.*
  45. ;*    (To facilitate use with non-standard CCP's.    *
  46. ;*    Note:  this version bypasses version 2.3,    *
  47. ;*    which had a different way of setting buffptr.)    *
  48. ;*                            *
  49. ;*    10/20/81 - Version 2.2 - Made version 2.1    *
  50. ;*    compatible with CPM1.x.  (RJL)            *
  51. ;*                            *
  52. ;*    10/17/81 - Version 2.2 - Changed CCP-locator    *
  53. ;*    method to work even when CCP is protected,    *
  54. ;*    instead of hanging the system.  New method    *
  55. ;*    uses address at 0h instead of 5h.  (RJL)    *
  56. ;*                            *
  57. ;*    09/01/81 - Version 2.0 - Simplified syntax so    *
  58. ;*    command may always have a variable paramater    *
  59. ;*    string and the fixed paramater does not have    *
  60. ;*    to use underlines to represent blanks. The    *
  61. ;*    combined fixed and variable data can now be    *
  62. ;*    up to 128 bytes. (WEA)                *
  63. ;*                            *
  64. ;*    08/12/81 - fixed bug that caused program to    *
  65. ;*    abort if command line was moderately long.    *
  66. ;*    (RJL)                        *
  67. ;*                            *
  68. ;*    06/01/81 - Added the ability to have both a    *
  69. ;*    fixed and variable paramater string. The fix-    *
  70. ;*    ed string is entered by typing the underline    *
  71. ;*    (_) following the oldname. they will be re-    *
  72. ;*    placed by blanks in the command. (WEA)        *
  73. ;*                            *
  74. ;*    06/01/81 - Modify to set $SYS indicator only    *
  75. ;*    when running under CP/M 2.X. (WEA)        *
  76. ;*                            *
  77. ;*------------------------------------------------------*
  78.  
  79.  
  80. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  81. ;change these characters if desired
  82. BASE    EQU    0
  83. BLNKSUB    EQU    '_'    ;says "replace this char with blank"
  84. TRAPCHR    EQU    '#'    ;says "replace this char with rparm"
  85.  
  86. HIDE    EQU    0    ;1 = hide filename as $SYS file,
  87.             ;0 = leave visible on directory
  88.             ;(Used only by CPM 2.x and later versions)
  89. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  90.  
  91.  
  92.     ORG    100H+BASE
  93. BEGADR    JMP    CONFIG        ;altered to JMP BEGIN by CONFIG
  94.  
  95. ;command as built by CONFIG
  96. ;(set here for easy viewing with ccp command:  TYPE newname.COM)
  97.     DB    CR
  98. NEWBUF    DS    127
  99.     DB    0
  100.  
  101. ;insert parms into command
  102. BEGIN    LXI    H,NEWBUF    ;point to stored command
  103.     LXI    D,NEWCOM    ;point to temporary build-area
  104.     PUSH    D        ;save now (for XCTL)
  105.     CALL    BLDCOM        ;create new command
  106.     XRA    A
  107.     STAX    D        ;insure null at end
  108.  
  109. ;execute command (fall through to subroutine XCTL)
  110.  
  111.     PAGE
  112. ;*------------------------------------------------------*
  113. ;*                            *
  114. ;*    This routine will setup the CCP with a        *
  115. ;*    command passed by the calling program.        *
  116. ;*                            *
  117. ;*    ENTRY CONDITIONS:                *
  118. ;*                            *
  119. ;*        (SP)->A variable area containing    *
  120. ;*              the command to be placed in    *
  121. ;*              the CCP. The area MUST be        *
  122. ;*              terminated by a one-byte 00H.    *
  123. ;*                            *
  124. ;*------------------------------------------------------*
  125. ;
  126. CCPCMD    EQU    08H        ;offset to CCP command buffer
  127. CCPLTH    EQU    07H        ;offset to CCP command length
  128. CCPBMAX    EQU    CCPLTH-1    ;offset to CCP max bufflen (code
  129.                 ;as it stands requires this)
  130. CURDRV    EQU    0004H+BASE    ;current drive in pg zero
  131.  
  132. CPMEP    EQU    0001H+BASE    ;CP/M wboot entry point addr
  133. ;
  134. ;address ccp
  135. XCTL    LHLD    CPMEP        ;get addr of CP/M BIOS+3
  136.     MVI    L,0        ;point to BIOS
  137. DISPLC    LXI    D,-0800H-0D00H    ;lgth of CCP plus CPM1.x BDOS
  138.                 ;(will be changed if CPM2.x)
  139.     DAD    D        ;compute CBASE
  140.     XCHG            ;move CBASE to DE
  141.  
  142. ;move command to ccp
  143.     LXI    H,CCPCMD    ;offset of CCP command buffer...
  144.     DAD    D        ;...+ CBASE
  145.     XCHG            ;DE=>CCP command buffer, HL=> CBASE
  146.     XTHL            ;HL=> pointer to new command,
  147.                 ;SP=> CBASE
  148.     MVI    B,0        ;init byte ctr
  149.     CALL    VARMOV        ;move command to CCP
  150.  
  151. ;set ccp command length
  152.     POP    D        ;restore CBASE
  153.     LXI    H,CCPLTH    ;offset of CCP bufr lgth
  154.     DAD    D
  155.     MOV    M,B        ;put lgth in CCP
  156.  
  157. ;set ccp buffer pointer
  158.     DCX    H        ;point to maxbuff value (CCPBMAX)
  159.     MOV    A,M        ;add adjustment to find buffend+1
  160.     ADI    CCPCMD+1    ;(result is assumed <256)
  161.     MOV    L,A        ;find actual address
  162.     MVI    M,CCPCMD    ;reset to point to start of buff
  163.  
  164. ;set ccp drive select, and execute ccp
  165.     LDA    CURDRV
  166.     MOV    C,A        ;select current drive
  167.     XCHG            ;HL=>CBASE
  168.     PCHL            ;go exec command
  169. ;
  170.     PAGE
  171. ;*------------------------------------------------------*
  172. ;*                            *
  173. ;*    Parsing subroutines                *
  174. ;*                            *
  175. ;*------------------------------------------------------*
  176.  
  177. ;
  178. ;    Build command using stored command and runtime parms.
  179. ;
  180.  
  181. TBSAV    DW    CPMBUF+2        ;point to first runtime parm
  182.  
  183. ;trapchar found:  move parm instead (stop at true blank)
  184. MOVPARM    PUSH    H
  185.     LHLD    TBSAV            ;point to next parm in tbuff
  186.  
  187.     CALL    IFRPARM            ;insert runtime parm, if any
  188.  
  189.     SHLD    TBSAV            ;save pointer to next parm
  190.     POP    H            ;restore new-command pointer
  191.  
  192. ;get char, test if trapchar
  193. BLDCOM    MOV    A,M
  194.     INX    H
  195.     CPI    TRAPCHR            ;if not trapchar, repeat
  196.     JZ    MOVPARM            ;if trapchr, move parm instead
  197.  
  198. ;move character to ccp command buffer
  199. BLDCOM1    STAX    D
  200.     INX    D
  201.     ORA    A            ;repeat until null moved
  202.     JNZ    BLDCOM
  203.  
  204. ;main command done:  now append any leftover runtime parms to command
  205.     DCX    D            ;point to end null
  206.  
  207.     MVI    A,NOP        ;set to move everything, even blanks
  208.     STA    BLNKTST
  209.  
  210.     LHLD    TBSAV            ;point to what's left of parms
  211.  
  212. ;if runtime parms were passed, move one (if end, move all)
  213. IFRPARM    LDA    FCB1+1            ;if default fcb1 is not blank,
  214.     CPI    BLANK
  215.     RZ                ;no parms, so return
  216.                     ;else fall through to WRDMOV
  217.  
  218. ;*------------------------------------------------------*
  219. ;
  220. ;    Move from (HL) to (DE) until (HL)=(ZERO or BLANK)
  221. ;
  222. WRDMOV    EQU    $
  223.     MOV    A,M
  224.     ORA    A
  225.     RZ                ;if end, don't incr hl
  226.     INX    H
  227.     CPI    BLANK
  228. BLNKTST    RZ                ;NOP if moving leftovers
  229.  
  230.     CPI    BLNKSUB            ;blank substitute?
  231.     JNZ    WMOV2
  232.     MVI    A,BLANK            ;yes, substitute a blank
  233.  
  234. WMOV2    STAX    D
  235.     INX    D
  236.     JMP    WRDMOV
  237.  
  238.  
  239. ;*------------------------------------------------------*
  240. ;
  241. ;    Move from (HL) to (DE) until ZERO has been moved.
  242. ;
  243. VARMOV    EQU    $
  244.     MOV    A,M
  245.     STAX    D
  246.     INX    H
  247.     INX    D
  248.     ORA    A
  249.     RZ
  250.     INR    B        ;increment length count
  251.     JMP    VARMOV
  252.  
  253. ;*------------------------------------------------------*
  254. ;*                            *
  255. ;*    NOTE:    All code above this address must     *
  256. ;*        assemble at 01FFH or lower.        *
  257. ;*                            *
  258. ;*------------------------------------------------------*
  259. ;
  260. ;    Incr HL to point to next non-BLANK.
  261. ;
  262. NONBLK    EQU    $
  263.     MOV    A,M
  264.     CPI    BLANK
  265.     RNZ
  266.     INX    H
  267.     JMP    NONBLK
  268. ;*------------------------------------------------------*
  269. ;
  270. ;    Incr HL to point to next BLANK or ZERO.
  271. ;
  272. FNDBLK    EQU    $
  273.     MOV    A,M
  274.     ORA    A
  275.     RZ
  276.     CPI    BLANK
  277.     RZ
  278.     INX    H
  279.     JMP    FNDBLK
  280.     PAGE
  281. ;
  282. ;
  283. ;*------------------------------------------------------*
  284. ;*                            *
  285. ;*    Save old command name [and parm string]        *
  286. ;*    Save as a .COM file.                 *
  287. ;*                            *
  288. ;*------------------------------------------------------*
  289. CONFIG    EQU    $
  290.     MVI    C,PRTSTR
  291.     LXI    D,SGNMSG
  292.     CALL    SYSTEM        ;print sign msg
  293.  
  294. ;goto help if no parms or if "?"
  295.     LDA    FCB1+1
  296.     CPI    BLANK        ;nothing entered?
  297.     JZ    HELP        ;yes->
  298.     CPI    '?'        ;asking for help?
  299.     JZ    HELP        ;yes->
  300.  
  301. ;if CPM2.x or higher, reset variables
  302.     MVI    C,GETVER
  303.     CALL    SYSTEM        ;get CP/M verson
  304.     MOV    A,L
  305.     ORA    A        ;CP/M 2.x ?
  306.     JZ    CONFI1        ;no->
  307.  
  308.     MVI    A,'O'+(HIDE SHL 7)    ;set $DIR or $SYS indicator
  309.     STA    TYPSYS
  310.     LXI    H,-800H-0E00H    ;BDOS LENGTH FOR CPM2.2 IS 0E00H
  311.     SHLD    DISPLC+1    ;CHANGE DEFAULT VALUE
  312.  
  313. ;turn off entry to CONFIG
  314. CONFI1    EQU    $
  315.     LXI    H,BEGIN
  316.     SHLD    BEGADR+1    ;modify program EP
  317.  
  318. ;get name of command
  319.     LXI    H,CPMBUF+1
  320.     CALL    NONBLK        ;HL==>newname
  321.     LXI    D,SAVNAM
  322.     CALL    WRDMOV        ;move newname to SAVE command
  323.     CALL    NONBLK        ;HL==>oldname
  324.     PUSH    H
  325.     LXI    H,TYPCOM    ;HL==>".COM"
  326.     CALL    VARMOV        ;move typ to SAVE command
  327.     POP    H        ;HL==>oldname and parm string if any
  328.  
  329. ;store command in page that will be saved to disk
  330.     LXI    D,NEWBUF    ;buffer to build cmd for XCTL
  331.     CALL    VARMOV        ;move real command and parms
  332.     MVI    A,1AH        ;append ctl-z (will end TYPE command,
  333.     STAX    D        ;when used to view newname.com file)
  334.  
  335. ;don't allow reusing old name (unless starts with "X") as synonym:
  336. ; it's too easy to type (eg) SYNONYM PIP CON:=   , and wipe out PIP!
  337.     LDA    FCB1+1        ;get initial of proposed synonym
  338.     CPI    'X'        ;"experimental" synonym?
  339.     JZ    CONFEND        ;it's ok to overlay this file:  skip
  340.  
  341.     LXI    H,'C?'
  342.     SHLD    FCB1+9
  343.     MVI    A,'M'        ;find even if hidden
  344.     STA    FCB1+11
  345.  
  346.     LXI    D,FCB1        ;do only after everything else, since
  347.     MVI    C,SEARCHF    ;search wipes out tbuff (80h-ffh)
  348.     CALL    SYSTEM        ;see if name already in use
  349.     INR    A
  350.     JNZ    NAMEUSD        ;if found, abort
  351.  
  352. ;save command to disk
  353. CONFEND    CALL    XCTL        ;issue SAVE command
  354.  
  355.     DB    'SAVE 1 '    ;one page 0100H -- 01FFH
  356. SAVNAM    DW    0,0,0,0,0,0,0,0    ;synonym name
  357. TYPCOM    DB    '.C'
  358. TYPSYS    DB    'OM',0
  359.  
  360. ;*------------------------------------------------------*
  361. NAMEUSD    EQU    $
  362.     LXI    D,ERR1MSG
  363.     JMP    PRINT
  364.  
  365. DASHES    MVI    B,63
  366.     MVI    C,CHAROUT
  367. DASH2    MVI    E,'-'
  368.     PUSH    B
  369.     CALL    SYSTEM
  370.     POP    B
  371.     DCR    B
  372.     JNZ    DASH2
  373.     RET
  374.  
  375. HELP    EQU    $
  376.     LXI    D,HLPMSG1
  377.     CALL    PRINT
  378.     CALL    DASHES
  379.  
  380.     LXI    D,HLPMSG2
  381.     CALL    PRINT
  382.     CALL    DASHES
  383.  
  384.     LXI    D,HLPMSG3
  385.  
  386. PRINT    MVI    C,PRTSTR
  387.     CALL    SYSTEM
  388.     RET
  389.  
  390.  
  391. ERR1MSG    DB CR,LF,LF,'Abort:  name already in use.'
  392.     DB CR,LF,EOM
  393.  
  394. SGNMSG    DB CR,LF
  395.     DB 'SYNONYM 3.0  Oct81'
  396.     DB EOM
  397.  
  398. HLPMSG1    DB '     (To view newname.COM:  TYPE newname.COM)'
  399.     DB CR,LF,EOM
  400. HLPMSG2    DB CR,LF
  401.     DB 'SYNONYM format:   SYNONYM  newname  oldname [parm string]'
  402.     DB CR,LF,LF
  403.     DB '   newname        proposed synonym for command.'
  404.     DB CR,LF,LF
  405.     DB '   oldname        standard name of command.  (May '
  406.     DB 'give drive.)'
  407.     DB CR,LF,LF
  408.     DB '   parm string    optional string, appended '
  409.     DB 'when newname is run.'
  410.     DB CR,LF,LF,EOM
  411.  
  412. HLPMSG3    DB CR,LF
  413.     DB 'To execute newname:   newname [rparm1 rparm2 ...]'
  414.     DB CR,LF,LF
  415.     DB '   rparmx ...     optional runtime parameters'
  416.     DB CR,LF,LF
  417.     DB '   Any '
  418.     DB '"',TRAPCHR,'"s'
  419.     DB ' in "parm string" '
  420.     DB 'will be replaced by an rparm.'
  421.     DB CR,LF
  422.     DB '   Any leftover rparms will be appended to '
  423.     DB '"parm string".'
  424.     DB CR,LF,LF
  425.     DB '   Rparms are separated by a SINGLE blank; '
  426.     DB 'two consecutive'
  427.     DB CR,LF
  428.     DB '   blanks indicate a null parm.  '
  429.     DB '(To pass an rparm with an'
  430.     DB CR,LF
  431.     DB '   imbedded '
  432.     DB 'blank, use a "',BLNKSUB,'" instead of a blank.)'
  433.     DB EOM
  434. ;
  435. BLANK    EQU    20H
  436. FCB1    EQU    005CH+BASE
  437. CPMBUF    EQU    0080H+BASE
  438. CHAROUT    EQU    2
  439. PRTSTR    EQU    9
  440. GETVER    EQU    12
  441. SEARCHF    EQU    17
  442. CR    EQU    13
  443. LF    EQU    10
  444. EOM    EQU    '$'
  445. SYSTEM    EQU    0005H+BASE
  446.  
  447. NEWCOM    EQU    $        ;128-byte buffer in uninitialized ram
  448.  
  449.     END
  450.