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 / ZSYS / SIMTEL20 / ZCPR3 / CMD.MAC < prev    next >
Text File  |  2000-06-30  |  5KB  |  267 lines

  1. ;  PROGRAM:  CMD
  2. ;  VERSION:  1.0
  3. ;  DATE:  19 July 84
  4. ;  AUTHOR:  Richard Conn
  5. ;  PREVIOUS VERSIONS:  None
  6. ;
  7. z3env    equ    0f400h
  8. VERS    EQU    10        ;version number
  9.  
  10. ; CMD is copyright (c) 1984 by Richard Conn
  11. ; All Rights Reserved
  12. ; CMD may be used freely by the ZCPR3 Community
  13.  
  14. ;
  15. ;    CMD is used to define and run a command line.  It either accepts
  16. ; the command line (including semicolons) which follow the verb CMD onto
  17. ; the command line buffer or, if no input is provided, it prompts the
  18. ; user for input and then places this into the command line buffer.
  19. ;
  20. ; Syntax:
  21. ;    CMD cmd1;cmd2;...
  22. ; or    CMD
  23. ;
  24. ; The sequence of commands "cmd1;cmd2;..." becomes the command line.
  25. ;
  26.  
  27. ;
  28. ;  SYSLIB, Z3LIB, and VLIB References
  29. ;
  30.     ext    z3init
  31.     ext    getcl1,getcl2,puter2,putzex,dutdir
  32.     ext    eprint,pafdc,cout,bline
  33.     ext    retud
  34.     ext    codend
  35.  
  36. ;
  37. ;  Basic Definitions
  38. ;
  39. TRUE     EQU    0FFH        ;define true and..
  40. FALSE     EQU    0           ;..false.
  41.  
  42. ;
  43. ; System Addresses
  44. ;
  45. OS$BASE EQU    000H        ;system base..
  46. BDOS    EQU    OS$BASE+05H
  47. FCB    EQU    OS$BASE+5CH
  48. FCB2    EQU    OS$BASE+6CH
  49. TBUFF    EQU    OS$BASE+80H
  50. TPA    EQU    OS$BASE+100H
  51.  
  52. ;
  53. ;  ASCII Chars
  54. ;
  55. LF    EQU    0AH        ;..linefeed..
  56. CR    EQU    0DH        ;..carriage return..
  57.  
  58. ;
  59. ; Environment Definition
  60. ;
  61.     if    z3env ne 0
  62. ;
  63. ; External ZCPR3 Environment Descriptor
  64. ;
  65.     jmp    start
  66.     db    'Z3ENV'    ;This is a ZCPR3 Utility
  67.     db    1    ;External Environment Descriptor
  68. z3eadr:
  69.     dw    z3env
  70. start:
  71.     lhld    z3eadr    ;pt to ZCPR3 environment
  72. ;
  73.     else
  74. ;
  75. ; Internal ZCPR3 Environment Descriptor
  76. ;
  77.     MACLIB    Z3BASE.LIB
  78.     MACLIB    SYSENV.LIB
  79. z3eadr:
  80.     jmp    start
  81.     SYSENV
  82. start:
  83.     lxi    h,z3eadr    ;pt to ZCPR3 environment
  84.     endif
  85.  
  86. ;
  87. ; Mainline
  88. ;
  89.     call    z3init        ;initialize the ZCPR3 Env
  90.  
  91. ;
  92. ; Check for Help or Prompt
  93. ;
  94.     lda    fcb+1        ;check for help request
  95.     cpi    ' '        ;prompted input?
  96.     jz    prompt
  97.     cpi    '/'        ;help?
  98.     jnz    cinit
  99. ;
  100. ; Print Help Message
  101. ;
  102. help:
  103.     call    eprint
  104.     db    'CMD, Version '
  105.     db    (VERS/10)+'0','.',(VERS MOD 10)+'0'
  106.     db    cr,lf,' Syntax:  CMD cmd1;cmd2;... or CMD (prompted input)'
  107.     db    cr,lf,' CMD defines the command line in the CL buffer'
  108.     db    0
  109.     ret
  110. ;
  111. ; Initialize Command Line
  112. ;
  113. cinit:
  114.     call    getcl1        ;check for command line buffer
  115.     jz    nocl
  116. ;
  117. ; HL now points to the command line buffer
  118. ;
  119.     call    codend        ;pt to free area
  120.     inx    h        ;skip 2 bytes
  121.     inx    h
  122.     xchg            ;... in DE
  123.     lxi    h,tbuff+2    ;pt to option input
  124.     call    copystr        ;copy string
  125.     mvi    c,1        ;set not empty
  126. ;
  127. ; Entry point to build rest of command line, where DE=next address
  128. ;   and C=empty line flag (C=0 means line was empty)
  129. ;
  130. checkcl:
  131.     mov    a,c        ;get empty flag
  132.     call    puter2        ;set error flag
  133.     call    getcl2        ;get address of command line
  134.     jz    setsh        ;set shell command
  135.     call    copystr        ;copy string
  136. setsh:
  137.     call    getcl1        ;pt to command line buffer
  138.     xchg            ;... in DE
  139.     lxi    h,4        ;pt to first char position
  140.     dad    d
  141.     shld    lstart        ;save start address in case of abort
  142.     xchg
  143.     mov    m,e        ;store pointer
  144.     inx    h
  145.     mov    m,d
  146.     inx    h        ;pt to buffer size
  147.     mov    b,m        ;get it in B
  148.     call    codend        ;pt to string
  149.     inx    h        ;skip 2 bytes
  150.     inx    h
  151. clcopy:
  152.     mov    a,m        ;get char
  153.     stax    d        ;put char
  154.     inx    h        ;pt to next
  155.     inx    d
  156.     ora    a        ;done?
  157.     rz
  158.     dcr    b        ;count down
  159.     jnz    clcopy
  160. ;
  161. ; Command Line Too Long
  162. ;
  163.     lhld    lstart        ;zero command line
  164.     mvi    m,0
  165.     call    eprint
  166.     db    ' Command Line too Long for Buffer',0
  167.     ret
  168.  
  169. ;
  170. ; Print no command line buffer message and exit
  171. ;
  172. nocl:
  173.     call    eprint
  174.     db    ' No Command Line Buffer',0
  175.     ret
  176.  
  177. ;
  178. ; Copy string from HL to DE
  179. ;   Store ending 0 and leave pointer in DE to it
  180. ;
  181. copystr:
  182.     mov    a,m        ;get char
  183.     stax    d        ;store it
  184.     ora    a        ;done?
  185.     rz
  186.     inx    h        ;pt to next
  187.     inx    d
  188.     jmp    copystr
  189.  
  190. ;
  191. ; Prompt User for Input
  192. ;
  193. prompt:
  194.     call    eprint
  195.     db    'CMD ',0
  196.     call    retud        ;get DU
  197. ;
  198. ; Print DU
  199. ;
  200.     mov    a,b        ;output disk
  201.     adi    'A'
  202.     call    cout
  203.     mov    a,c        ;output user
  204.     call    pafdc
  205.     mvi    a,':'        ;separator
  206.     call    cout
  207. ;
  208. ; Print DIR
  209. ;
  210.     call    dutdir        ;convert to name
  211.     jz    prompt2        ;no name input
  212. ;
  213. ; DIR is defined
  214. ;
  215.     mvi    b,8        ;8 chars max
  216. prompt1:
  217.     mov    a,m        ;get char
  218.     cpi    ' '        ;done if space
  219.     jz    promptx
  220.     call    cout        ;echo it
  221.     inx    h        ;pt to next
  222.     dcr    b        ;count down
  223.     jnz    prompt1
  224.     jmp    promptx
  225. ;
  226. ; DIR is not defined
  227. ;
  228. prompt2:
  229.     call    eprint        ;name not found
  230.     db    'Noname',0
  231. ;
  232. ; Complete prompt and get user input
  233. ;
  234. promptx:
  235.     call    eprint
  236.     db    '> ',0
  237.     mvi    a,1        ;tell ZEX that it is prompted
  238.     call    putzex
  239.     call    codend        ;use buffer area
  240.     mvi    m,254        ;set large line size
  241.     mvi    a,0        ;no caps
  242.     call    bline        ;get input line
  243.     xra    a        ;no more prompt
  244.     call    putzex
  245.     call    codend        ;skip to EOL
  246.     inx    h
  247.     inx    h
  248.     xchg            ;ptr in DE
  249.     ldax    d        ;get first char
  250.     mov    c,a        ;save flag
  251. ;
  252. ; Skip to end of input line
  253. ;
  254. findeol:
  255.     ldax    d        ;get char
  256.     ora    a        ;done?
  257.     jz    checkcl
  258.     inx    d        ;pt to next
  259.     jmp    findeol
  260. ;
  261. ; Buffers
  262. ;
  263. lstart:
  264.     ds    2        ;start of command line
  265.  
  266.     end
  267.