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 / BEEHIVE / ZSUS / ZSUS009.LBR / MDU11.LBR / MDU11.MZC / MDU11.MAC
Text File  |  1990-06-22  |  8KB  |  270 lines

  1. ; MDU.MAC -- sets maximum drive and user in ZCPR3 environment
  2. ;
  3. Vers    equ    11        ; version number
  4. SubVers    equ    ' '        ; modification level
  5. ;
  6. ; USAGE:
  7. ;
  8. ;    MDU {d}{u}{:}
  9. ;
  10. ; Set maximum drive and/or user in environment descriptor to the given
  11. ; value (A-P, 0-31).  If no parameters are given, MDU displays current
  12. ; maximum drive and user.  A following colon is optional.
  13. ;
  14. ; If the quiet flag is set, the current maximum DU will be displayed if
  15. ; MDU is called with no parameters; otherwise, only error messages will
  16. ; be displayed.  If wheel byte is off, MAXDU will not be changed.
  17. ;
  18. ; If an out-of-range drive or user is given, the program error flag will
  19. ; be set to 2 (invalid directory).  If the command line is invalid, the
  20. ; error flag will be set to 4 (unknown error).  In either case the error
  21. ; handler will be invoked.
  22. ;
  23. ; Version 1.1 -- June 22, 1990 -- Gene Pizzetta
  24. ;    Fixed bug that caused error handler to be invoked when quiet
  25. ;    flag was set.  (Thanks to Howard Goldstein.)  Added wheel byte
  26. ;    support.  If wheel byte is reset, displays current maximum
  27. ;    drive/user, but changes nothing.
  28. ;
  29. ; Version 1.0 -- June 17, 1990 -- Gene Pizzetta
  30. ;    Original release.
  31. ;
  32. ; For bug reports and comments:
  33. ;    Gene Pizzetta
  34. ;    481 Revere St.
  35. ;    Revere, MA 02151
  36. ;    Voice:  (617) 284-0891
  37. ;    Newton Centre Z-Node:  (617) 965-7259
  38. ;    GEnie:  E.PIZZETTA
  39. ;
  40. Bdos    equ    05h
  41. CpmDma    equ    80h
  42. LF    equ    0Ah        ; linefeed
  43. CR    equ    0Dh        ; carriage return
  44. ;
  45.     MACLIB    Z80        ; extended Intel mnemonics
  46. ;
  47. ; Following routines are from Z3LIB and SYSLIB, Version 4
  48. ;
  49.     ext    epstr,pafdc,phl4hc,cout,isalpha,isdigit,eval10
  50.     ext    z3init,getquiet,gzmtop,getmdisk,getmuser,getwhl
  51.     ext    putmdisk,putmuser,puter2,inverror,getefcb
  52. ;
  53. ; TYP3HDR.MAC, Version 1.1  --  Extended Intel Mnemonics
  54. ; This code has been modified as suggested by Charles Irvine so that it will
  55. ; function correctly with interrupts enabled.  Extended Intel mnemonics by
  56. ; Gene Pizzetta, April 30, 1989.
  57. ;
  58. ; This is header code that can be used at the beginning of a type-3-environment
  59. ; program so that it will abort with an error message when not loaded to the
  60. ; correct address (such as when a user tries to run it under CP/M or Z30).
  61. ;
  62. entry:    jr    start0        ; Must use relative jump
  63.     db    0        ; Filler
  64.     db    'Z3ENV',3    ; Type-3 environment
  65. z3env:    dw    0        ; Filled in by Z33
  66.     dw    entry        ; Intended load address
  67. ;
  68. start0:    lxi    h,0        ; Point to warmboot entry
  69.     mov    a,m        ; Save the byte there
  70.     di            ; Protect against interrupts
  71.     mvi    m,0c9h        ; Replace warmboot with a return opcode
  72.     rst    0        ; Call address 0, pushing RETADDR onto stack
  73. retaddr:
  74.     mov    m,a        ; Restore byte at 0
  75.     dcx    sp        ; Get stack pointer to point
  76.     dcx    sp        ; ..to the value of RETADDR
  77.     pop    h        ; Get it into HL and restore stack
  78.     ei            ; We can allow interrupts again
  79.     lxi    d,retaddr    ; This is where we should be
  80.     xra    a        ; Clear carry flag
  81.     push    h        ; Save address again
  82.     dsbc    de        ; Subtract -- we should have 0 now
  83.     pop    h        ; Restore value of RETADDR
  84.     jz    start        ; If addresses matched, begin real code
  85. ;
  86.     lxi    d,notz33msg-retaddr ; Offset to message
  87.     dad    d
  88.     xchg            ; Switch pointer to message into DE
  89.     mvi    c,9
  90.     jmp    0005h        ; Return via BDOS print string function
  91. ;
  92. notz33msg:
  93.     db    'Not Z33+$'    ; Abort message if not Z33-compatible
  94. ;
  95. ; Messages . . .
  96. ;
  97. MsgUse:    db    'MDU    Version '
  98.     db    Vers/10+'0','.',Vers mod 10+'0',SubVers
  99.     db    '   (loaded at ',0
  100. MsgUs1:    db    'h)',CR,LF
  101.     db    'Usage:',CR,LF,'   ',0
  102. MsgNam:    db    'MDU',0
  103. MsgUs2:    db    ' {d}{u}{:}',CR,LF
  104.     db    'Maximum drive and/or user are set to given values.',CR,LF
  105.     db    'If no parameters are given, current maximum drive',CR,LF
  106.     db    'and user are displayed.',0
  107. MsgUs3:    db    CR,LF
  108.     db    'Displays current maximum drive and user.',0
  109. MsgMDU:    db    'Maximum Drive and User:  ',0
  110. MsgIDr:    db    '  Invalid drive.',0
  111. MsgIUr:    db    '  Invalid user.',0
  112. MsgICL:    db    '  Invalid command line.',0
  113. ;
  114. Start:    lhld    z3env        ; set up environment
  115.     call    z3init
  116.     sspd    OldStk        ; save old stack pointer
  117.     call    gzmtop        ; get top of memory
  118.     sphl            ; ..and setup new stack
  119. ;
  120.     xra    a        ; initialize data area
  121.     sta    Drive
  122.     sta    User
  123.     lxi    h,CpmDma    ; point to command tail
  124.     mov    a,m        ; get byte count
  125.     ora    a        ; is there a tail?
  126.     jrz    ShowDU        ; (no, so show current status)
  127.     mov    b,a
  128.     inx    h
  129.     call    EatSpc        ; get past any spaces
  130.     ora    a        ; at the end?
  131.     jrz    ShowDU        ; (yes, so show current status)
  132.     ani    7Fh
  133.     cpi    '/'        ; request for help?
  134.     jz    Usage        ; (yes)
  135.     mov    b,a        ; save character
  136.     call    getwhl        ; check wheel byte
  137.     mov    a,b        ; get back character
  138.     jrz    QShwDU        ; (it's reset, so don't do anything)
  139. ;
  140.     call    isalpha        ; alphabetic character?
  141.     jrnz    GetNum        ; (no, so check for digit)
  142.     cpi    'Q'        ; A-P?
  143.     jrnc    InvDrv        ; (no, invalid drive)
  144.     sta    Drive        ; store valid drive
  145.     inx    h        ; advance pointer
  146.     call    EatSpc
  147. ;
  148. GetNum:    ora    a        ; end of tail?
  149.     jrz    SetDrv        ; (yes)
  150.     cpi    ':'        ; colon?
  151.     jrz    SetDrv        ; (yes)
  152.     call    isdigit        ; is it a digit?
  153.     jrnz    InvCL        ; (no, invalid command line)
  154.     call    eval10        ; evaluate number
  155.     mov    a,d        ; check high byte
  156.     ora    a
  157.     jrnz    InvUsr        ; (it's non-zero)
  158.     mov    a,e        ; check low byte
  159.     cpi    32        ; more than 31?
  160.     jrnc    InvUsr        ; (yep)
  161.     inr    a        ; add 1 to user
  162.     sta    User        ; ..and store it
  163.     mov    a,m        ; check next character
  164.     cpi    0        ; null?
  165.     jrz    SetDrv        ; (yes, end of tail)
  166.     cpi    ':'        ; colon?
  167.     jrz    SetDrv        ; (yes, it's okay)
  168.     cpi    ' '        ; trailing space?
  169.     jrz    SetDrv        ; (yes, that's okay too)
  170. InvCL:    mvi    a,4        ; set error code
  171.     lxi    h,MsgICL    ; say command line is bad
  172.     jmp    ErExit
  173. ;
  174. SetDrv:    lda    Drive        ; get drive letter
  175.     ora    a        ; do we have one?
  176.     jrz    SetUsr        ; (no, so skip it)
  177.     sui    '@'        ; make it binary
  178.     call    putmdisk    ; ..and set maximum drive
  179. ;
  180. SetUsr:    lda    User        ; get user (plus 1)
  181.     ora    a        ; do we have one?
  182.     jrz    QShwDU        ; (no, so skip it)
  183.     dcr    a        ; decrement it
  184.     call    putmuser    ; ..and set maximum user
  185. ;
  186. QShwDU:    call    getquiet    ; check quiet flag
  187.     jnz    Finish        ; (it's set)
  188. ShowDU:    lxi    h,MsgMDU
  189.     call    epstr
  190.     call    getmdisk    ; get maximum drive
  191.     adi    '@'        ; make it printable
  192.     call    cout        ; ..and print it
  193.     call    getmuser    ; get maximum user
  194.     call    pafdc        ; ..and print it
  195. Finish:    mvi    a,0        ; set error code to zero
  196.     jr    Exit
  197. ;
  198. InvDrv:    lxi    h,MsgIDr    ; say it's an invalid drive
  199.     mvi    a,2        ; set error code
  200.     jr    ErExit
  201. ;
  202. InvUsr:    lxi    h,MsgIUr    ; say it's an invalid user number
  203.     mvi    a,2        ; set error code
  204. ;
  205. ErExit:    call    epstr        ; print message
  206. Exit:    call    puter2        ; set error code
  207.     mov    b,a        ; put error code in B
  208.     ora    a
  209.     cnz    inverror    ; call error handler
  210.     lspd    OldStk        ; restore old stack pointer
  211.     ret            ; ..and return to CCP
  212. ;
  213. ; Subroutines . . .
  214. ;
  215. ; EatSpc -- gobbles up spaces
  216. ;
  217. EatSpc:    mov    a,m
  218.     cpi    ' '        ; is it a space?
  219.     inx    h
  220.     jrz    EatSpc        ; (yes)
  221.     dcx    h
  222.     ret
  223. ;
  224. ; Print usage message
  225. ;
  226. Usage:    lxi    h,MsgUse    ; print usage message
  227.     call    epstr
  228.     lxi    h,entry
  229.     call    phl4hc
  230.     lxi    h,MsgUs1
  231.     call    epstr
  232.     call    ComNam        ; print name we're called by, if possible
  233.     call    getwhl        ; check wheel
  234.     jrz    Usage1
  235.     lxi    h,MsgUs2    ; wheel byte set
  236.     call    epstr
  237.     jmp    Finish
  238. ;
  239. Usage1:    lxi    h,MsgUs3    ; wheel byte reset
  240.     call    epstr
  241.     jmp    Finish
  242. ;
  243. ; ComNam -- Print actual name by which this program was called, if available
  244. ; from external file control block.  Otherwise, use "MDU".
  245. ;
  246. ComNam:    call    getefcb
  247.     jrz    NoEFcb        ; (no external fcb)
  248.     mvi    b,8        ; print filename
  249. ComNLp:    inx    hl
  250.     mov    a,m
  251.     ani    7Fh
  252.     cpi    ' '
  253.     cnz    cout
  254.     djnz    ComNLp
  255.     ret
  256. ;
  257. NoEFcb:    lxi    h,MsgNam    ; print default name
  258.     call    epstr
  259.     ret
  260. ;
  261.     DSEG
  262. ;
  263. ; Uninitialized storage . . .
  264. ;
  265. Drive:    ds    1        ; new maximum drive
  266. User:    ds    1        ; new maximum user
  267. OldStk:    ds    2        ; old stack pointer
  268. ;
  269.     end
  270.