home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / nubye / nucd.lbr / NUCD.MQC / NUCD.MAC
Text File  |  1986-09-01  |  10KB  |  438 lines

  1. ;
  2. ; M80 =NUCD
  3. ;
  4. ; L80 NUCD,SYSLIB,CD/N/E
  5. ;
  6.     ASEG
  7. ;
  8. ;  Program:  NUCD
  9. ;  
  10. ;    This version of CD has been modified to obtain the address of the
  11. ;    entry point of ZCPR2 directly from a patched address, so that the
  12. ;    program will not fail while running under NUBYE.  Original program
  13. ;    calculated the ZCPR2 entry point from the BDOS vector, which has
  14. ;    been modified if NUBYE is running.
  15. ;
  16. ;    With this version of the program you absolutely MUST patch in at
  17. ;    label ZCPADR the address of the beginning of the area where ZCPR2
  18. ;    runs on your system.                 Joe Earls
  19. ;
  20. ;  Program:  CD
  21. ;  Version:  2.3
  22. ;  Author:  Richard Conn
  23. ;  Date:  6 Jan 83
  24. ;  Previous Versions:  2.2 (19 Dec 82), 2.1 (7 Dec 82)
  25. ;  Derivation:  CD.MAC was derived in concept from CD.C, Version 1.2
  26. ;
  27. vers    equ    23
  28. ;
  29. ;    This program is Copyright (c) 1982, 1983 by Richard Conn
  30. ;    All Rights Reserved
  31. ;
  32. ;    ZCPR2 and its utilities, including this one, are released
  33. ; to the public domain.  Anyone who wishes to USE them may do so with
  34. ; no strings attached.  The author assumes no responsibility or
  35. ; liability for the use of ZCPR2 and its utilities.
  36. ;
  37. ;    The author, Richard Conn, has sole rights to this program.
  38. ; ZCPR2 and its utilities may not be sold without the express,
  39. ; written permission of the author.
  40. ;
  41.  
  42. ;
  43. ;    CD is designed to allow the user to quickly change to another
  44. ; working directory (CD=Change Directory).
  45. ;     Intended to be small in size, CD accepts a command of the
  46. ; following forms:
  47. ;
  48. ;        CD //            <-- Print Help Message
  49. ;        CD dir or CD dir:    <-- Log Into Directory
  50. ;
  51.  
  52. ;
  53. ;  CP/M Constants
  54. ;
  55. cpm    equ    0    ; Warm Boot Address
  56. entry    equ    cpm+5    ; BDOS Entry Point
  57. fcb    equ    5ch    ; Location of Default FCB
  58. tbuff    equ    80h    ; Temporary Input Line Buffer
  59. cr    equ    0dh
  60. lf    equ    0ah
  61.  
  62. ;
  63. ;  Externals
  64. ;
  65.     ext    zgpins    ; init ZCPR2 buffers
  66.     ext    zdnfind    ; used to determine directory user/disk
  67.     ext    zmcptr    ; MC buffer ptr
  68.     ext    logud    ; log in user/disk
  69.     ext    retud    ; return current user/disk
  70.     ext    initfcb    ; init FCB
  71.     ext    f$exist    ; file exist test
  72.     ext    print    ; print routine
  73.     ext    cout    ; char output
  74.     ext    crlf    ; new line
  75.     ext    inline    ; input line editor, external buffer
  76.     ext    cin    ; char input
  77.     ext    codend    ; end of code
  78.  
  79. ;
  80. ;  Branch to Start of Program
  81. ;
  82.  
  83.     org    0100H
  84.     jmp    start
  85.  
  86. ;
  87. ;******************************************************************
  88. ;
  89. ;  SINSFORM -- ZCPR2 Utility Standard General Purpose Initialization Format
  90. ;
  91. ;    This data block precisely defines the data format for
  92. ; initial features of a ZCPR2 system which are required for proper
  93. ; initialization of the ZCPR2-Specific Routines in SYSLIB.
  94. ;
  95.  
  96. ;
  97. ;  EXTERNAL PATH DATA
  98. ;
  99. EPAVAIL:
  100.     DB    0FFH    ; IS EXTERNAL PATH AVAILABLE? (0=NO, 0FFH=YES)
  101. EPADR:
  102.     DW    40H    ; ADDRESS OF EXTERNAL PATH IF AVAILABLE
  103.  
  104. ;
  105. ;  INTERNAL PATH DATA
  106. ;
  107. INTPATH:
  108.     DB    0,0    ; DISK, USER FOR FIRST PATH ELEMENT
  109.             ; DISK = 1 FOR A, '$' FOR CURRENT
  110.             ; USER = NUMBER, '$' FOR CURRENT
  111.     DB    0,0
  112.     DB    0,0
  113.     DB    0,0
  114.     DB    0,0
  115.     DB    0,0
  116.     DB    0,0
  117.     DB    0,0    ; DISK, USER FOR 8TH PATH ELEMENT
  118.     DB    0    ; END OF PATH
  119.  
  120. ;
  121. ;  MULTIPLE COMMAND LINE BUFFER DATA
  122. ;
  123. MCAVAIL:
  124.     DB    0FFH    ; IS MULTIPLE COMMAND LINE BUFFER AVAILABLE?
  125. MCADR:
  126.     DW    0FF00H    ; ADDRESS OF MULTIPLE COMMAND LINE BUFFER IF AVAILABLE
  127.  
  128. ;
  129. ;  DISK/USER LIMITS
  130. ;
  131. MDISK:
  132.     DB    4    ; MAXIMUM NUMBER OF DISKS
  133. MUSER:
  134.     DB    31    ; MAXIMUM USER NUMBER
  135.  
  136. ;
  137. ;  FLAGS TO PERMIT LOG IN FOR DIFFERENT USER AREA OR DISK
  138. ;
  139. DOK:
  140.     DB    0FFH    ; ALLOW DISK CHANGE? (0=NO, 0FFH=YES)
  141. UOK:
  142.     DB    0FFH    ; ALLOW USER CHANGE? (0=NO, 0FFH=YES)
  143.  
  144. ;
  145. ;  PRIVILEGED USER DATA
  146. ;
  147. PUSER:
  148.     DB    10    ; BEGINNING OF PRIVILEGED USER AREAS
  149. PPASS:
  150.     DB    'chdir',0    ; PASSWORD FOR MOVING INTO PRIV USER AREAS
  151.     DS    41-($-PPASS)    ; 40 CHARS MAX IN BUFFER + 1 for ending NULL
  152.  
  153. ;
  154. ;  CURRENT USER/DISK INDICATOR
  155. ;
  156. CINDIC:
  157.     DB    '$'    ; USUAL VALUE (FOR PATH EXPRESSIONS)
  158.  
  159. ;
  160. ;  DMA ADDRESS FOR DISK TRANSFERS
  161. ;
  162. DMADR:
  163.     DW    80H    ; TBUFF AREA
  164.  
  165. ;
  166. ;  NAMED DIRECTORY INFORMATION
  167. ;
  168. NDRADR:
  169.     DW    00000H    ; ADDRESS OF MEMORY-RESIDENT NAMED DIRECTORY
  170. NDNAMES:
  171.     DB    64    ; MAX NUMBER OF DIRECTORY NAMES
  172. DNFILE:
  173.     DB    'NAMES   '    ; NAME OF DISK NAME FILE
  174.     DB    'DIR'        ; TYPE OF DISK NAME FILE
  175.  
  176. ;
  177. ;  REQUIREMENTS FLAGS
  178. ;
  179. EPREQD:
  180.     DB    0FFH    ; EXTERNAL PATH?
  181. MCREQD:
  182.     DB    0FFH    ; MULTIPLE COMMAND LINE?
  183. MXREQD:
  184.     DB    0FFH    ; MAX USER/DISK?
  185. UDREQD:
  186.     DB    0FFH    ; ALLOW USER/DISK CHANGE?
  187. PUREQD:
  188.     DB    0FFH    ; PRIVILEGED USER?
  189. CDREQD:
  190.     DB    0FFH    ; CURRENT INDIC AND DMA?
  191. NDREQD:
  192.     DB    0FFH    ; NAMED DIRECTORIES?
  193. Z2CLASS:
  194.     DB    0    ; CLASS 0
  195.     DB    'ZCPR2'
  196.     DS    10    ; RESERVED
  197.  
  198. ;
  199. ;  END OF SINSFORM -- STANDARD DEFAULT PARAMETER DATA
  200. ;
  201. ;******************************************************************
  202. ;
  203. stfile:
  204.     db    0
  205.     db    'ST      '    ; file name
  206.     db    'COM'        ; file type
  207.     ds    4
  208.     ds    16
  209.     ds    4        ; 36 bytes total
  210. ;
  211. ;  Start of Program
  212. ;
  213. start:
  214.     call    zgpins    ; install ZCPR2 variables
  215.  
  216.     call    print    ; print banner
  217.     db    'NUCD, Version '
  218.     db    vers/10+'0','.',(vers mod 10)+'0',0
  219.     jmp    start2
  220.  
  221. zcpadr:
  222.     dw    0D400H    ; where ZCPR2 is located
  223. start2:
  224.  
  225.     lxi    h,tbuff    ; pt to input line
  226.     mov    a,m    ; get input line size
  227.     inx    h    ; pt to first char
  228.     push    h    ; save ptr to first char
  229.     add    l    ; pt to after last char
  230.     mov    l,a
  231.     mov    a,h
  232.     aci    0
  233.     mov    h,a    ; hl pts to after last char
  234.     mvi    m,0    ; store ending zero
  235.     pop    h    ; pt to first char
  236.     lxi    d,cbuff    ; temp storage for line
  237.  
  238. ;
  239. ;  Copy input line into temporary buffer
  240. ;
  241. start0:
  242.     mov    a,m    ; get byte
  243.     stax    d    ; put byte
  244.     inx    h    ; pt to next
  245.     inx    d
  246.     ora    a    ; end of line?
  247.     jnz    start0
  248.  
  249. ;
  250. ;  Skip to first non-blank and process if Help requested
  251. ;
  252.     lxi    h,cbuff    ; pt to first char
  253. sblank:
  254.     mov    a,m    ; pt to char
  255.     inx    h    ; pt to next
  256.     cpi    ' '    ; <sp>?
  257.     jz    sblank
  258.     dcx    h    ; pt to first non-blank
  259.     ora    a    ; print directory info?
  260.     jz    help
  261.     cpi    '/'    ; help option?
  262.     jnz    cd    ; change dir processing if not help
  263.  
  264. ;
  265. ;  Print Help Message
  266. ;
  267. help:
  268.     call    print
  269.     db    cr,lf,'    CD is a ZCPR2 named directory move utility'
  270.     db    cr,lf,'(CD=Change Directory).  Command Forms are:'
  271.     db    cr,lf,'        CD or CD //        <-- Print Help Message'
  272.     db    cr,lf,'        CD dir or CD dir:    <-- Log Into Dir'
  273.     db    cr,lf,0
  274.     ret
  275.  
  276. ;
  277. ;  Scan Line for Colon and append Colon if none present
  278. ;
  279. cd:
  280.     push    h    ; save ptr to first char for later
  281. scolon:
  282.     mov    a,m    ; get char
  283.     ora    a    ; eol?
  284.     jz    pcolon    ; append colon
  285.     cpi    ' '    ; <sp>?
  286.     jz    pcolon    ; append colon
  287.     cpi    ':'    ; colon?
  288.     jz    cd2    ; continue processing
  289.     inx    h    ; pt to next char
  290.     jmp    scolon
  291. pcolon:
  292.     mvi    m,':'    ; place colon at end of token
  293.     inx    h    ; pt to next char
  294.     mvi    m,0    ; place ending zero
  295.  
  296. ;
  297. ;  Extract User/Disk Numbers
  298. ;
  299. cd2:
  300.     call    retud    ; get current user/disk
  301.     mov    a,b    ; store disk
  302.     sta    cdisk
  303.     mov    a,c    ; store user
  304.     sta    cuser
  305.     pop    h    ; get ptr to first char
  306.     xra    a    ; do not allow du: form
  307.     call    zdnfind    ; extract user/disk info
  308.     jnz    cd3
  309.     call    print
  310.     db    cr,lf,'Dir Name Not Found',0
  311.     ret
  312.  
  313. ;
  314. ;  Set Current User/Disk
  315. ;
  316. cd3:
  317.     mov    a,b    ; get disk number
  318.     cpi    0ffh    ; current?
  319.     jnz    setd    ; set disk if not
  320.     lda    cdisk    ; get current disk
  321.     inr    a    ; increment because of ZDNFIND offset
  322. setd:
  323.     mov    b,a    ; disk in B
  324.     lda    mdisk    ; max disk number
  325.     cmp    b    ; must be less
  326.     jnc    setd1    ; error if selected > max
  327. uderr:
  328.     call    print
  329.     db    cr,lf,'Dir Range Error -- Abort',0
  330.     ret
  331. setd1:
  332.     mov    a,c    ; get user number
  333.     cpi    0ffh    ; current?
  334.     jnz    setu    ; set user if not
  335.     lda    cuser    ; get current user
  336. setu:
  337.     mov    c,a    ; user in C
  338.     lda    muser    ; max user number
  339.     cmp    c    ; must be less
  340.     jc    uderr    ; error if selected > max
  341.     call    pass    ; ask for password if not priv cding into priv
  342.     dcr    b    ; adjust disk to 0 to n-1
  343.     lda    mcavail    ; multiple commands available?
  344.     ora    a    ; 0=no
  345.     jz    login
  346.     call    logud    ; log into new directory
  347.     lxi    d,stfile    ; check for presence of startup file
  348.     call    initfcb    ; init FCB
  349.     call    f$exist    ; does it exist?
  350.     jz    login
  351.     call    zmcptr    ; get ptr to next char in MC line
  352.     dcx    h    ; back up two chars
  353.     lda    stfile+2
  354.     mov    m,a
  355.     dcx    h
  356.     lda    stfile+1    ; store new file name
  357.     mov    m,a
  358.     lhld    mcadr    ; get address of line
  359.     mov    a,m    ; get low-order byte
  360.     dcr    a    ; back up 2 chars
  361.     dcr    a
  362.     mov    m,a    ; set new count
  363. login:
  364.     mov    a,c    ; user in A
  365.     ora    a    ; clear carry
  366.     rlc        ; move user into high nybble
  367.     rlc
  368.     rlc
  369.     rlc
  370.     ora    b    ; mask in new disk
  371.     mov    c,a    ; user/disk flag in C
  372. ;    lhld    entry+1    ; get address of BDOS
  373. ;    lxi    d,-800h    ; pt to base of ZCPR2
  374. ;    mvi    l,0
  375. ;    dad    d
  376.     lhld    zcpadr
  377.     inx    h    ; pt to restart entry point
  378.     inx    h
  379.     inx    h
  380.     pchl        ; enter ZCPR2 with proper flag in C
  381.  
  382. ;
  383. ;  Ask for password if non-priveleged user (cuser) is trying to CD into
  384. ;  a priveleged user area (=>puser)
  385. ;
  386. pass:
  387.     push    b    ; save desired user/disk
  388.     lda    puser    ; get priv user number
  389.     mov    b,a    ; ... in B
  390.     lda    cuser    ; get current user
  391.     cmp    b    ; is current user priveleged?
  392.     pop    b
  393.     rnc        ; done if so
  394.     lda    puser    ; see if desired to move into priveleged user area
  395.     dcr    a    ; just under priveleged user area
  396.     cmp    c    ; is C >= puser?
  397.     rnc        ; done if PUSER-1 >= desired user
  398. ;
  399. ;  Non-priv wants to CD into Priv ... ask password
  400. ;
  401.     push    b    ; save desired user/disk
  402.     call    print
  403.     db    cr,lf,'Access Password? ',0
  404.     call    codend    ; pt to scratch area
  405.     xra    a    ; no echo
  406.     call    inline    ; input line editor
  407.     lxi    d,ppass    ; pt to password stored
  408. scomp:
  409.     ldax    d    ; get byte
  410.     cmp    m    ; compare
  411.     jnz    nomatch
  412.     inx    h    ; pt to next
  413.     inx    d
  414.     ora    a    ; end of strings?
  415.     jnz    scomp
  416.     call    print
  417.     db    cr,lf,'** Access Granted **',0
  418.     pop    b    ; match -- return normally
  419.     ret
  420. nomatch:
  421.     pop    b    ; clear BC
  422.     pop    h    ; clear stack
  423.     call    print
  424.     db    cr,lf,'** Invalid Password -- Access Denied **',0
  425.     ret
  426.  
  427. ;
  428. ;  Buffers
  429. ;
  430. cuser:
  431.     ds    1    ; current user
  432. cdisk:
  433.     ds    1    ; current disk
  434. cbuff:
  435.     ds    250    ; command line buffer
  436.  
  437.     end
  438.