home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / zsys / simtel20 / z3lib / zlib2.lbr / Z3PFIND.Z80 < prev    next >
Encoding:
Text File  |  1986-02-07  |  4.1 KB  |  210 lines

  1. ;
  2. ; Z3LIB Module Name:  Z3PFIND
  3. ; Author:  Richard Conn
  4. ; Z3LIB  Version Number:  1.3
  5. ; Module Version Number:  1.1
  6. ;
  7.     public    pfind
  8.  
  9.     EXT    GETPATH
  10.  
  11. ;
  12. ;  EQUATES
  13. ;
  14. BDOS    EQU    5
  15.  
  16. ;
  17. ;  INTERNAL BUFFERS
  18. ;
  19. CURELT:
  20.     DS    1    ; LOW-ORDER PTR TO CURRENT PATH ELEMENT
  21. SEARCUR:
  22.     DS    1    ; 0=DON'T SEARCH CURRENT DIR
  23. CDISK:
  24.     DS    1    ; CURRENT DISK NUMBER
  25. CUSER:
  26.     DS    1    ; CURRENT USER NUMBER
  27. TDISK:
  28.     DS    1    ; TEMP DISK NUMBER
  29. TUSER:
  30.     DS    1    ; TEMP USER NUMBER
  31.  
  32. ;
  33. ;  PFIND -- LOOK FOR FILE WHOSE FCB IS PTED TO BY DE ALONG PATH
  34. ;    IF FILE FOUND, RETURN DISK NUMBER IN B, USER NUMBER IN C, AND
  35. ;    ZERO FLAG CLEAR (NZ) WITH A=0FFH; IF NOT FOUND, RETURN WITH ZERO FLAG
  36. ;    SET (Z) AND A=0; IF ERROR, RETURN WITH ERROR CODE (1,2,3) AND NZ
  37. ;
  38. ;    INPUTS:  DE PTS TO FCB, A IS FLAG: A=0 IF NO CURRENT SEARCH ALSO,
  39. ;                        <>0 IF CURRENT SEARCH
  40. ;    OUTPUTS:  B=DISK, C=USER IF FOUND
  41. ;            ZERO FLAG SET (Z) IF NOT FOUND
  42. ;            ZERO FLAG CLEAR (NZ) IF FOUND
  43. ;
  44. PFIND:
  45.     PUSH    HL        ; SAVE REGS
  46.     PUSH    DE
  47.     LD    (SEARCUR),A    ; SET FLAG TO SEARCH CURRENT
  48.     XOR    A        ; SET DISK NUMBER TO CURRENT
  49.     LD    (DE),A        ; CHANGE FCB
  50.     PUSH    DE        ; SAVE FCB PTR
  51.     LD    C,25        ; GET CURRENT DISK
  52.     CALL    BDOSH
  53.     LD    (CDISK),A    ; SAVE CURRENT DISK
  54.     LD    (TDISK),A    ; SET TEMP DISK
  55.     LD    C,32        ; GET CURRENT USER
  56.     LD    E,0FFH
  57.     CALL    BDOSH
  58.     LD    (CUSER),A    ; SAVE CURRENT USER
  59.     LD    (TUSER),A    ; SAVE TEMP USER
  60.     POP    DE        ; GET FCB PTR
  61.     CALL    GETPATH        ; GET ADDRESS OF EXTERNAL PATH IN HL
  62.     LD    A,(SEARCUR)    ; SEARCH CURRENT?
  63.     OR    A        ; 0=NO
  64.     JP    Z,PF1
  65. ;
  66. ; LOOK FOR FILE WHOSE FCB IS PTED TO BY DE
  67. ;
  68. PF0:
  69.     LD    C,17        ; SEARCH FOR FIRST
  70.     CALL    BDOSH
  71.     INC    A        ; FILE FOUND?
  72.     JP    NZ,PFFND
  73. ;
  74. ; ADVANCE TO NEXT ELEMENT IN PATH
  75. ;
  76. PF1:
  77.     LD    A,(HL)        ; GET DRIVE NUMBER FROM PATH
  78.     OR    A        ; 0=DONE=FILE NOT FOUND
  79.     JP    Z,PFNFND
  80.     CALL    GETDU        ; GET DU IN BC
  81.     CALL    CKDUP        ; CHECK FOR DUPLICATION OF PATH ENTRY
  82.     INC    HL        ; PT TO NEXT PATH ENTRY
  83.     INC    HL
  84.     JP    Z,PF1        ; CONTINUE IF DUPLICATION OF PATH ENTRY
  85.     PUSH    DE        ; SAVE FCB PTR
  86.     PUSH    BC        ; SAVE BC
  87.     LD    A,B        ; SET DISK
  88.     LD    (TDISK),A
  89.     LD    E,A
  90.     LD    C,14        ; SELECT DISK
  91.     CALL    BDOSH
  92.     POP    BC        ; GET BC
  93.     LD    A,C        ; SET USER
  94.     LD    (TUSER),A
  95.     LD    E,A
  96.     LD    C,32        ; SELECT USER
  97.     CALL    BDOSH
  98.     POP    DE        ; GET FCB PTR
  99.     JP    PF0        ; CONTINUE SEARCH
  100. ;
  101. ;  FILE FOUND FLAG SETTING
  102. ;
  103. PFFND:
  104.     XOR    A        ; FOUND RETURN CODE
  105.     DEC    A        ; SET NZ
  106.     JP    FNDEXIT
  107. ;
  108. ;  FILE NOT FOUND ERROR
  109. ;
  110. PFNFND:
  111.     XOR    A        ; FILE NOT FOUND
  112. FNDEXIT:
  113.     PUSH    AF        ; SAVE RETURN CODE
  114.     LD    A,(CDISK)    ; RESTORE CURRENT DISK
  115.     LD    E,A        ; SAVE IN E
  116.     LD    C,14        ; SELECT DISK IN E
  117.     CALL    BDOS
  118.     LD    A,(CUSER)    ; RESTORE CURRENT USER
  119.     LD    E,A        ; SAVE IN E
  120.     LD    C,32        ; SELECT USER IN E
  121.     CALL    BDOS
  122.     LD    A,(TDISK)    ; SET FOUND DISK
  123.     LD    B,A
  124.     LD    A,(TUSER)    ; SET FOUND USER
  125.     LD    C,A
  126.     POP    AF        ; GET RETURN CODE
  127.     POP    DE        ; RESTORE REGS
  128.     POP    HL
  129.     RET
  130.  
  131. ;
  132. ;  CHECK ALONG PATH FOR DUPLICATION OF ENTRY
  133. ;    RETURN WITH Z IF SO
  134. ;
  135. CKDUP:
  136.     PUSH    HL        ; SAVE PTRS
  137.     PUSH    DE        ; SAVE FCB
  138.     PUSH    BC        ; SAVE DU
  139.     LD    A,L        ; SAVE LOW-ORDER ADDRESS
  140.     LD    (CURELT),A
  141.     CALL    GETPATH        ; PT TO FIRST ELEMENT OF PATH
  142. CKDUP1:
  143.     LD    A,(CURELT)    ; GET CURRENT ELEMENT
  144.     CP    L        ; ARE WE THERE?
  145.     JP    Z,NODUP
  146.     CALL    GETDU        ; GET ELEMENT IN BC
  147.     INC    HL        ; PT TO NEXT PATH ELEMENT
  148.     INC    HL
  149.     POP    DE        ; GET CURRENT DU IN DE
  150.     PUSH    DE        ; SAVE IT AGAIN
  151.     LD    A,B        ; COMPARE AGAINST PATH ELEMENT
  152.     CP    D
  153.     JP    NZ,CKDUP1
  154.     LD    A,C
  155.     CP    E
  156.     JP    NZ,CKDUP1    ; NO MATCH, SO CONTINUE
  157. ;
  158. ;  WE HAVE A DUPLICATE - RETURN Z
  159. ;
  160.     POP    BC        ; RESTORE REGS
  161.     POP    DE
  162.     POP    HL
  163.     XOR    A        ; SET Z
  164.     RET
  165. ;
  166. ;  NO DUPLICATES - RETURN NZ
  167. ;
  168. NODUP:
  169.     POP    BC        ; RESTORE REGS
  170.     POP    DE
  171.     POP    HL
  172.     XOR    A        ; SET NZ
  173.     DEC    A
  174.     RET
  175.  
  176. ;
  177. ;  RETURN DU IN BC FOR CURRENT PATH ELEMENT PTED TO BY HL
  178. ;
  179. GETDU:
  180.     LD    A,(HL)        ; GET DISK
  181.     CP    '$'        ; CURRENT?
  182.     JP    NZ,GETDU1
  183.     LD    A,(CDISK)    ; SELECT CURRENT DISK
  184.     INC    A        ; ADJUST
  185. GETDU1:
  186.     DEC    A        ; SET DISK FOR A=0
  187.     LD    B,A        ; DISK IN B
  188.     INC    HL        ; PT TO USER
  189.     LD    A,(HL)        ; GET USER
  190.     DEC    HL        ; PT BACK TO DISK
  191.     CP    '$'        ; CURRENT?
  192.     JP    NZ,GETDU2
  193.     LD    A,(CUSER)    ; GET CURRENT USER
  194. GETDU2:
  195.     LD    C,A        ; USER IN C
  196.     RET
  197.  
  198. ;
  199. ;  CALL BDOS AND NOT CHANGE HL
  200. ;
  201. BDOSH:
  202.     PUSH    HL        ; CALL BDOS, BUT SAVE HL
  203.     PUSH    DE
  204.     CALL    BDOS
  205.     POP    DE
  206.     POP    HL
  207.     RET
  208.  
  209.     END
  210.