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 / CPM / ZCPR2 / PWD.MAC < prev    next >
Text File  |  2000-06-30  |  11KB  |  527 lines

  1. ;
  2. ;  Program:  PWD
  3. ;  Version:  1.1
  4. ;  Author:  Richard Conn
  5. ;  Date:  6 Jan 83
  6. ;  Previous Versions:  1.0 (7 Dec 82)
  7. ;  Derivation:  PWD.MAC was derived in concept from CD.MAC, Version 2.1
  8. ;
  9. vers    equ    11
  10.  
  11. ;
  12. ;    This program is Copyright (c) 1982, 1983 by Richard Conn
  13. ;    All Rights Reserved
  14. ;
  15. ;    ZCPR2 and its utilities, including this one, are released
  16. ; to the public domain.  Anyone who wishes to USE them may do so with
  17. ; no strings attached.  The author assumes no responsibility or
  18. ; liability for the use of ZCPR2 and its utilities.
  19. ;
  20. ;    The author, Richard Conn, has sole rights to this program.
  21. ; ZCPR2 and its utilities may not be sold without the express,
  22. ; written permission of the author.
  23. ;
  24.  
  25.  
  26. ;
  27. ;    PWD is designed to allow the user to print his working directory
  28. ; (PWD=Print Working Directory) and to find out what directories
  29. ; are available to him to move to.
  30. ;     Intended to be small in size, PWD accepts a command of the
  31. ; following forms:
  32. ;
  33. ;        PWD            <-- Print Current Info
  34. ;        PWD DIR            <-- Print Directory Info
  35. ;        PWD //            <-- Print Help Message
  36. ;
  37.  
  38. ;
  39. ;  CP/M Constants
  40. ;
  41. cpm    equ    0    ; Warm Boot Address
  42. entry    equ    cpm+5    ; BDOS Entry Point
  43. fcb    equ    5ch    ; Location of Default FCB
  44. tbuff    equ    80h    ; Temporary Input Line Buffer
  45. cr    equ    0dh
  46. lf    equ    0ah
  47.  
  48. ;
  49. ;  Externals
  50. ;
  51.     ext    cline    ; save current line as string
  52.     ext    zgpins    ; init ZCPR2 buffers
  53.     ext    zdnfind    ; used to determine directory user/disk
  54.     ext    retud    ; return current user/disk
  55.     ext    print    ; print routine
  56.     ext    zdname    ; load directory names
  57.     ext    cout    ; char output
  58.     ext    codend    ; end of code
  59.     ext    padc    ; print A as decimal
  60.     ext    madc    ; print A in memory
  61.     ext    crlf    ; new line
  62.     ext    cin    ; char input
  63.  
  64. ;
  65. ;  Branch to Start of Program
  66. ;
  67.     jmp    start
  68.  
  69. ;
  70. ;******************************************************************
  71. ;
  72. ;  SINSFORM -- ZCPR2 Utility Standard General Purpose Initialization Format
  73. ;
  74. ;    This data block precisely defines the data format for
  75. ; initial features of a ZCPR2 system which are required for proper
  76. ; initialization of the ZCPR2-Specific Routines in SYSLIB.
  77. ;
  78.  
  79. ;
  80. ;  EXTERNAL PATH DATA
  81. ;
  82. EPAVAIL:
  83.     DB    0FFH    ; IS EXTERNAL PATH AVAILABLE? (0=NO, 0FFH=YES)
  84. EPADR:
  85.     DW    40H    ; ADDRESS OF EXTERNAL PATH IF AVAILABLE
  86.  
  87. ;
  88. ;  INTERNAL PATH DATA
  89. ;
  90. INTPATH:
  91.     DB    0,0    ; DISK, USER FOR FIRST PATH ELEMENT
  92.             ; DISK = 1 FOR A, '$' FOR CURRENT
  93.             ; USER = NUMBER, '$' FOR CURRENT
  94.     DB    0,0
  95.     DB    0,0
  96.     DB    0,0
  97.     DB    0,0
  98.     DB    0,0
  99.     DB    0,0
  100.     DB    0,0    ; DISK, USER FOR 8TH PATH ELEMENT
  101.     DB    0    ; END OF PATH
  102.  
  103. ;
  104. ;  MULTIPLE COMMAND LINE BUFFER DATA
  105. ;
  106. MCAVAIL:
  107.     DB    0FFH    ; IS MULTIPLE COMMAND LINE BUFFER AVAILABLE?
  108. MCADR:
  109.     DW    0FF00H    ; ADDRESS OF MULTIPLE COMMAND LINE BUFFER IF AVAILABLE
  110.  
  111. ;
  112. ;  DISK/USER LIMITS
  113. ;
  114. MDISK:
  115.     DB    4    ; MAXIMUM NUMBER OF DISKS
  116. MUSER:
  117.     DB    31    ; MAXIMUM USER NUMBER
  118.  
  119. ;
  120. ;  FLAGS TO PERMIT LOG IN FOR DIFFERENT USER AREA OR DISK
  121. ;
  122. DOK:
  123.     DB    0FFH    ; ALLOW DISK CHANGE? (0=NO, 0FFH=YES)
  124. UOK:
  125.     DB    0FFH    ; ALLOW USER CHANGE? (0=NO, 0FFH=YES)
  126.  
  127. ;
  128. ;  PRIVILEGED USER DATA
  129. ;
  130. PUSER:
  131.     DB    10    ; BEGINNING OF PRIVILEGED USER AREAS
  132. PPASS:
  133.     DB    'chdir',0    ; PASSWORD FOR MOVING INTO PRIV USER AREAS
  134.     DS    41-($-PPASS)    ; 40 CHARS MAX IN BUFFER + 1 for ending NULL
  135.  
  136. ;
  137. ;  CURRENT USER/DISK INDICATOR
  138. ;
  139. CINDIC:
  140.     DB    '$'    ; USUAL VALUE (FOR PATH EXPRESSIONS)
  141.  
  142. ;
  143. ;  DMA ADDRESS FOR DISK TRANSFERS
  144. ;
  145. DMADR:
  146.     DW    80H    ; TBUFF AREA
  147.  
  148. ;
  149. ;  NAMED DIRECTORY INFORMATION
  150. ;
  151. NDRADR:
  152.     DW    00000H    ; ADDRESS OF MEMORY-RESIDENT NAMED DIRECTORY
  153. NDNAMES:
  154.     DB    64    ; MAX NUMBER OF DIRECTORY NAMES
  155. DNFILE:
  156.     DB    'NAMES   '    ; NAME OF DISK NAME FILE
  157.     DB    'DIR'        ; TYPE OF DISK NAME FILE
  158.  
  159. ;
  160. ;  REQUIREMENTS FLAGS
  161. ;
  162. EPREQD:
  163.     DB    0FFH    ; EXTERNAL PATH?
  164. MCREQD:
  165.     DB    0FFH    ; MULTIPLE COMMAND LINE?
  166. MXREQD:
  167.     DB    0FFH    ; MAX USER/DISK?
  168. UDREQD:
  169.     DB    0FFH    ; ALLOW USER/DISK CHANGE?
  170. PUREQD:
  171.     DB    0FFH    ; PRIVILEGED USER?
  172. CDREQD:
  173.     DB    0FFH    ; CURRENT INDIC AND DMA?
  174. NDREQD:
  175.     DB    0FFH    ; NAMED DIRECTORIES?
  176. Z2CLASS:
  177.     DB    0    ; CLASS 0
  178.     DB    'ZCPR2'
  179.     DS    10    ; RESERVED
  180.  
  181. ;
  182. ;  END OF SINSFORM -- STANDARD DEFAULT PARAMETER DATA
  183. ;
  184. ;******************************************************************
  185. ;
  186.  
  187. ;
  188. ;  Start of Program
  189. ;
  190. start:
  191.     call    zgpins    ; install ZCPR2 variables
  192.  
  193.     call    print    ; print banner
  194.     db    'PWD, Version '
  195.     db    vers/10+'0','.',(vers mod 10)+'0',0
  196.  
  197.     lxi    h,0    ; set no loaded directory file
  198.     shld    ndfadr
  199.     xra    a    ; set zero count
  200.     sta    ndfcnt
  201.     lxi    h,tbuff    ; pt to input line
  202.     call    cline    ; save and buffer input line
  203.  
  204. ;
  205. ;  Skip to first non-blank and process if Help requested
  206. ;
  207. sblank:
  208.     mov    a,m    ; pt to char
  209.     inx    h    ; pt to next
  210.     cpi    ' '    ; <sp>?
  211.     jz    sblank
  212.     dcx    h    ; pt to first non-blank
  213.     ora    a    ; print directory info?
  214.     jz    cwd
  215.     cpi    'D'    ; dir option?
  216.     jz    pwd
  217.  
  218. ;
  219. ;  Print Help Message
  220. ;
  221.     call    print
  222.     db    cr,lf,'    PWD is a ZCPR2 named directory display utility'
  223.     db    cr,lf,'(PWD=Print Working Directory).  Command Forms are:'
  224.     db    cr,lf,'        PWD    <-- Print Current Info'
  225.     db    cr,lf,'        PWD DIR    <-- Print Available Directories'
  226.     db    cr,lf,'        PWD //    <-- Print Help Message'
  227.     db    cr,lf,0
  228.     ret
  229.  
  230. ;
  231. ;  Print Directories and Current Working Directory
  232. ;
  233. pwd:
  234.     call    retud    ; get current disk/user
  235.     mov    a,b    ; save current disk
  236.     sta    cdisk
  237.     mov    a,c    ; save current user
  238.     sta    cuser
  239.     call    print
  240.     db    cr,lf,cr,lf,'** Directory Display **',cr,lf,0
  241.     lhld    ndradr    ; check for named directory buffer
  242.     mov    a,l
  243.     ora    h    ; HL=0 if none
  244.     jnz    pwdn
  245.     call    print
  246.     db    '** No Named Directory Buffer **',0
  247.     jmp    pwd0
  248. ;
  249. ;  Print contents of named directory buffer
  250. ;
  251. pwdn:
  252.     inx    h    ; pt to entry count
  253.     mov    c,m    ; get count in C
  254.     mov    a,c    ; check for any entries
  255.     ora    a
  256.     jz    pwd0
  257.     inx    h    ; pt to first entry
  258.     call    print
  259.     db    cr,lf,'    ** Named Directory Memory-Based Definitions **',0
  260.     call    prndir    ; print named directory
  261.     call    print
  262.     db    cr,lf,cr,lf,'Strike Any Key to Continue - ',0
  263.     call    cin
  264.     call    crlf
  265. pwd0:
  266.     call    codend    ; get end of code
  267.     call    zdname    ; load names.dir entries
  268.     jnz    pwd1
  269.     call    print
  270.     db    cr,lf,'** No Directory Names File **',0
  271.     jmp    pwd2
  272. pwd1:
  273.     mov    a,c    ; save count in buffer
  274.     sta    ndfcnt
  275.     shld    ndfadr    ; save address in buffer
  276.     call    print
  277.     db    cr,lf,'    ** Named Directory  Disk-Based  Definitions **',0
  278.     call    prndir    ; print named directory
  279. pwd2:
  280.     call    print
  281.     db    cr,lf,cr,lf,'** Current Directory **',0
  282.     lhld    ndradr    ; check named directory buffer
  283.     mov    a,h    ; any buffer?
  284.     ora    l
  285.     jz    pwd3
  286.     inx    h    ; pt to count
  287.     mov    c,m    ; get count in C
  288.     inx    h    ; pt to first entry
  289.     call    prcwd    ; print current working dir
  290.     rnz        ; found
  291. pwd3:
  292.     lhld    ndfadr    ; get address of NAMES.DIR file in memory
  293.     lda    ndfcnt    ; get entry count
  294.     mov    c,a    ; ... in C
  295.     call    prcwd
  296.     rnz        ; found
  297.     call    print
  298.     db    cr,lf,'    Noname',0
  299.     ret
  300. ;
  301. ;  Print Current Working Directory alone
  302. ;
  303. cwd:
  304.     call    retud    ; get current disk/user
  305.     mov    a,b    ; save current disk
  306.     sta    cdisk
  307.     mov    a,c    ; save current user
  308.     sta    cuser
  309.     call    codend    ; get end of code
  310.     call    zdname    ; load names.dir entries
  311.     jz    pwd2
  312.     mov    a,c    ; save count in buffer
  313.     sta    ndfcnt
  314.     shld    ndfadr    ; save address in buffer
  315.     jmp    pwd2
  316.  
  317. ;
  318. ;  Print named directory pointed to by HL whose entry count is in C
  319. ;
  320. prndir:
  321.     call    crlf    ; new line
  322.     mov    a,c    ; print total count
  323.     call    padc
  324.     call    print
  325.     db    ' Directory Entries Total ',0
  326.     ora    a    ; any entries?
  327.     rz
  328.     call    prpriv    ; print privileged count
  329.     mvi    b,0    ; set new line count
  330.     mvi    d,0ffh    ; set last dir to empty
  331.     push    h    ; save ptr to first entry
  332.     push    b    ; save entry count
  333. prnd1:
  334.     call    dsel    ; check for priv rights to see this entry
  335.     jz    prnd2    ; do not see
  336.     call    diskck    ; check for new disk
  337.     mov    a,b    ; get flag
  338.     ani    3    ; mask
  339.     cz    crlf    ; new line
  340.     inr    b    ; increment flag
  341.     call    pentry    ; print entry
  342.     dcr    c    ; count down
  343.     jnz    prnd1
  344.     pop    b    ; get entry count
  345.     pop    h    ; get ptr to first entry
  346.     ret
  347. prnd2:
  348.     call    add10    ; pt to next entry (HL=HL+10)
  349.     dcr    c    ; count down
  350.     jnz    prnd1
  351.     pop    b    ; get entry count
  352.     pop    h    ; get ptr to first entry
  353.     ret
  354. ;
  355. ;  Print Count of Privileged Directories
  356. ;
  357. prpriv:
  358.     mvi    a,'('    ; print text
  359.     call    cout
  360.     push    h    ; save HL
  361.     push    b    ; save BC
  362.     mvi    b,0    ; set count
  363. prp1:
  364.     call    dsel    ; priv dir?
  365.     jnz    prp2
  366.     inr    b    ; increment count
  367. prp2:
  368.     call    add10    ; HL=HL+10
  369.     dcr    c    ; count down
  370.     jnz    prp1
  371.     mov    a,b    ; get count
  372.     pop    b    ; restore regs
  373.     pop    h
  374.     call    padc    ; print decimal value
  375.     call    print
  376.     db    ' Directories Hidden) --',0
  377.     ret
  378.  
  379. ;
  380. ;  Print Current Directory
  381. ;
  382. prcwd:
  383.     mov    a,c    ; check for no entries
  384.     ora    a
  385.     rz
  386.     lda    cuser    ; get current user
  387.     mov    e,a    ; ... in E
  388.     lda    cdisk    ; get current disk
  389.     mov    b,a    ; ... in B
  390. prcwd1:
  391.     mov    a,m    ; get disk
  392.     cmp    b    ; compare disks
  393.     jnz    prcwd2
  394.     inx    h    ; pt to user
  395.     mov    a,m    ; get user
  396.     dcx    h    ; pt back
  397.     cmp    e    ; compare users
  398.     jnz    prcwd2
  399.     call    print
  400.     db    cr,lf,'    ',0
  401.     mov    a,m    ; get disk number
  402.     adi    'A'    ; convert to letter
  403.     call    cout
  404.     call    pe0    ; print entry without leading spaces
  405.     mvi    a,0ffh    ; set OK flag
  406.     ora    a
  407.     ret
  408. prcwd2:
  409.     call    add10    ; HL=HL+10 to pt to next entry
  410.     dcr    c    ; count down
  411.     jnz    prcwd1
  412.     xra    a    ; set not found flag
  413.     ret
  414.  
  415. ;
  416. ;  Determine if user is priveleged, and, if not, then select only those
  417. ;  directory entries he has access to without a password.  On return,
  418. ;  Zero Flag Set (Z) if user should not see the entry pted to by HL
  419. ;
  420. dsel:
  421.     push    b    ; save BC
  422.     lda    cuser    ; get current user
  423.     mov    c,a    ; ... in C
  424.     lda    puser    ; start of priveleged user areas
  425.     cmp    c    ; compare current and priv users
  426.     jz    dselok    ; OK if same
  427.     jc    dselok    ; OK if current > priv
  428.     inx    h    ; pt to user number
  429.     mov    c,m    ; get user number
  430.     dcx    h    ; pt to disk number
  431.     cmp    c    ; compare entry and priv users
  432.     jz    dselno    ; no select if entry is priv
  433.     jnc    dselok    ; select is entry is not priv
  434. dselno:
  435.     pop    b    ; restore BC
  436.     xra    a    ; return not OK
  437.     ret
  438. dselok:
  439.     pop    b    ; restore BC
  440.     mvi    a,0ffh    ; return OK
  441.     ora    a
  442.     ret
  443. ;
  444. ;  Check to see if new disk, and, if so, print banner and set current disk
  445. ;
  446. diskck:
  447.     mov    a,m    ; get next disk number
  448.     cmp    d    ; same as before?
  449.     rz
  450.     mov    d,a    ; set new disk number
  451.     mvi    b,0    ; reset entry/line flag
  452.     call    crlf    ; new line
  453.     adi    'A'    ; convert to letter
  454.     call    cout
  455.     call    print
  456.     db    ' --',0
  457.     ret
  458. ;
  459. ;  HL=HL+10 to pt to next entry
  460. ;
  461. add10:
  462.     mov    a,l    ; add low
  463.     adi    10
  464.     mov    l,a
  465.     mov    a,h    ; add high
  466.     aci    0
  467.     mov    h,a
  468.     ret
  469. ;
  470. ;  Print entry pted to by HL; on return, HL pts to next entry
  471. ;
  472. pentry:
  473.     mvi    a,' '    ; print leading spaces
  474.     call    cout
  475.     call    cout
  476. pe0:
  477.     push    d    ; save DE
  478.     inx    h    ; skip disk number
  479.     mov    a,m    ; get user number
  480.     call    pusr    ; print user number
  481.     inx    h    ; pt to next char
  482.     mvi    d,8    ; 8 chars
  483. pe1:
  484.     mov    a,m    ; get char
  485.     call    cout    ; print it
  486.     inx    h    ; pt to next
  487.     dcr    d    ; count down
  488.     jnz    pe1
  489.     pop    d    ; restore de
  490.     ret
  491. ;
  492. ;  Print user number in A as 2 decimal digits with leading spaces
  493. ;
  494. pusr:
  495.     push    d    ; save DE
  496.     lxi    d,buff    ; pt to buffer
  497.     push    d    ; save ptr
  498.     call    madc    ; load number into buffer as ASCII chars
  499.     pop    d    ; get ptr
  500.     inx    d    ; pt to 2nd letter (1st digit)
  501.     ldax    d    ; get 1st digit
  502.     call    cout
  503.     inx    d    ; pt to 2nd digit
  504.     ldax    d    ; get it
  505.     call    cout
  506.     mvi    a,':'    ; separator
  507.     call    cout
  508.     mvi    a,' '    ; print space
  509.     call    cout
  510.     pop    d    ; restore DE
  511.     ret
  512. ;
  513. ;  Buffers
  514. ;
  515. buff:
  516.     ds    3    ; number storage buffer
  517. cuser:
  518.     ds    1    ; current user
  519. cdisk:
  520.     ds    1    ; current disk
  521. ndfcnt:
  522.     ds    1    ; named directory file entry count
  523. ndfadr:
  524.     ds    2    ; named directory file load address
  525.  
  526.     end
  527.