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 / SYSLIB / SLIB1.LBR / SDIR05.Z80 < prev    next >
Text File  |  2000-06-30  |  7KB  |  280 lines

  1. ;
  2. ; SYSLIB Module Name:  SDIR05
  3. ; Author:  Richard Conn
  4. ; Part of SYSLIB3 SDIR Series
  5. ; SYSLIB Version Number:  3.6
  6. ; Module Version Number:  1.5
  7.  
  8.     public    dirload,dirsload
  9.  
  10.     MACLIB    SDIRHDR.LIB
  11.     EXT    SDMOVE
  12. ;*
  13. ;*  BUILD DIRECTORY TABLE AT DIRBUF
  14. ;*    THIS IS THE OPTIMAL DIRECTORY LOAD ROUTINE; IT ONLY LOADS UNIQUE
  15. ;*        FILE NAMES FROM DISK, BUT THE INFORMATION IS NOT SUFFICIENT
  16. ;*        TO COMPUTE THE FILE SIZES
  17. ;*    ON INPUT, HL PTS TO DIRECTORY BUFFER (16 x N MAX)
  18. ;*    ON OUTPUT, BC IS NUM OF FILES
  19. ;*        A=0 AND ZERO FLAG SET IF TPA OVERFLOW
  20. ;*        DE, HL UNAFFECTED
  21. ;*
  22. DIRLOAD:
  23.     PUSH    HL    ; SAVE REGISTERS
  24.     PUSH    DE
  25.     LD    A,0FFH    ; SELECT FILES OF SMALLER EX
  26.     LD    (DFLAG),A    ; SET FLAG
  27. DLCOMMON:
  28.     LD    A,'?'    ; SELECT FILES FROM ALL USER AREAS
  29.     LD    (TFCB),A    ; SET DR FIELD TO ZERO TO DO THIS
  30.     LD    (DIRBUF),HL    ; SAVE PTR TO DIRECTORY BUFFER
  31.     LD    (DSTART),HL    ; SET START OF BUFFER AREA
  32. ;*
  33. ;*  THIS SECTION OF CODE INITIALIZES THE COUNTERS USED
  34. ;*
  35.     LD    HL,0    ; HL=0
  36.     LD    (FCOUNT),HL    ; TOTAL FILES ON DISK = 0
  37. ;*
  38. ;*  NOW WE BEGIN SCANNING FOR FILES TO PLACE INTO THE MEMORY BUFFER
  39. ;*
  40.     LD    C,17    ; SEARCH FOR FILE
  41.     JP    DIRLP1
  42. DIRLP:
  43.     CALL    PENTRY    ; PLACE ENTRY IN DIR
  44.     JP    Z,DIROVFL    ; MEMORY OVERFLOW ERROR
  45.     LD    C,18    ; SEARCH FOR NEXT MATCH
  46. DIRLP1:
  47.     LD    DE,TFCB    ; PT TO WILD NAME
  48.     CALL    BDOS
  49.     CP    255    ; DONE?
  50.     JP    NZ,DIRLP
  51. ;*
  52. ;*  NOW WE ARE DONE WITH THE LOAD -- SET UP RETURN VALUES
  53. ;*
  54. DIRDN:
  55.     XOR    A    ; LOAD OK
  56.     DEC    A    ; SET FLAGS (NZ)
  57. DIRDNX:
  58.     LD    HL,(FCOUNT)    ; GET TOTAL NUMBER OF FILES
  59.     LD    B,H    ; ... IN BC
  60.     LD    C,L
  61. ;*
  62. ;*  RESTORE REGISTERS AND RETURN
  63. ;*
  64.     POP    DE
  65.     POP    HL
  66.     RET
  67. ;*
  68. ;*  MEMORY OVERFLOW ERROR
  69. ;*
  70. DIROVFL:
  71.     XOR    A    ; LOAD ERROR
  72.     JP    DIRDNX
  73.  
  74. ;*
  75. ;*  PENTRY --
  76. ;*  PLACE ENTRY IN DIRECTORY BUFFER IF NOT AN ERASED ENTRY
  77. ;*
  78. ;*  ON INPUT,  A=0-3 FOR ADR INDEX IN BUFF OF ENTRY FCB
  79. ;*          FCOUNT=NUMBER OF FILES IN DIR SO FAR
  80. ;*  ON OUTPUT, FCOUNT=NUMBER OF FILES IN DIR SO FAR
  81. ;*          A=0 AND ZERO FLAG SET IF MEMORY OVERFLOW ERROR
  82. ;*
  83. PENTRY:
  84.     PUSH    BC    ; SAVE REGS
  85.     PUSH    DE
  86.     PUSH    HL
  87.     RRCA        ; MULTIPLY BY 32 FOR OFFSET COMPUTATION
  88.     RRCA
  89.     RRCA
  90.     AND    60H    ; A=BYTE OFFSET
  91.     LD    DE,BUFF    ; PT TO BUFFER ENTRY
  92.     LD    L,A    ; LET HL=OFFSET
  93.     LD    H,0
  94.     ADD    HL,DE    ; HL=PTR TO FCB
  95.     LD    A,(HL)    ; GET USER NUMBER
  96.     CP    0E5H    ; DELETED?
  97.     JP    Z,PEDONE    ; SKIP IT IF DELETED
  98. ;*
  99. ;*  HL=ADR OF FCB IN BUFF
  100. ;*
  101.  
  102. ;*
  103. ;*  SCAN DIRECTORY ENTRIES AS LOADED SO FAR FOR ANOTHER ENTRY BY THE SAME
  104. ;*    NAME; IF FOUND, SET THAT ENTRY TO BE THE ENTRY WITH THE LARGER EX
  105. ;*    AND RETURN WITH THE ZERO FLAG SET, INDICATING NO NEW FILE; IF NOT
  106. ;*    FOUND, RETURN WITH ZERO FLAG RESET (NZ)
  107. ;*
  108.     CALL    DUPENTRY    ; CHECK FOR DUPLICATE AND SELECT EX
  109.     JP    Z,PEDONE    ; SKIP IF DUPLICATE
  110.  
  111. ;*  INCREMENT TOTAL NUMBER OF FILES
  112.     PUSH    HL    ; SAVE PTR TO FCB
  113.     LD    HL,(FCOUNT)    ; TOTAL FILES = TOTAL FILES + 1
  114.     INC    HL
  115.     LD    (FCOUNT),HL
  116.     POP    HL    ; GET PTR TO FCB
  117.  
  118. ;*
  119. ;*  COPY FCB PTED TO BY HL INTO DIRECTORY BUFFER
  120. ;*
  121.     EX    DE,HL        ; SAVE PTR IN DE
  122.     LD    HL,(DIRBUF)    ; PT TO NEXT ENTRY LOCATION
  123.     EX    DE,HL        ; HL PTS TO FCB, DE PTS TO NEXT ENTRY LOCATION
  124.     LD    B,ESIZE    ; NUMBER OF BYTES/ENTRY
  125.     CALL    SDMOVE    ; COPY FCB INTO MEMORY BUFFER
  126.     EX    DE,HL        ; HL PTS TO NEXT ENTRY
  127.     LD    (DIRBUF),HL    ; SET PTR
  128.     EX    DE,HL        ; PTR TO NEXT ENTRY IN DE
  129.     LD    HL,(BDOS+1)    ; BASE ADDRESS OF BDOS IN HL
  130.     LD    A,H    ; GET BASE PAGE OF BDOS
  131.     SUB    9    ; COMPUTE 1 PAGE IN FRONT OF BASE PAGE OF CCP
  132.     CP    D    ; IS PTR TO NEXT ENTRY BEYOND THIS?
  133.     JP    NZ,PEDONE    ; OK IF NOT AT BUFFER OVERFLOW LEVEL
  134.  
  135. ;*  DONE WITH PENTRY WITH MEMORY OVERFLOW ERROR
  136. PEOVFL:
  137.     XOR    A    ; ERROR
  138.     POP    HL    ; RESTORE REGS
  139.     POP    DE
  140.     POP    BC
  141.     RET
  142.  
  143. ;*  DONE WITH PENTRY AND NO ERROR
  144. PEDONE:
  145.     XOR    A    ; NO ERROR
  146.     DEC    A    ; SET FLAGS (NZ)
  147.     POP    HL    ; RESTORE REGS
  148.     POP    DE
  149.     POP    BC
  150.     RET
  151.  
  152. ;*
  153. ;*  BUILD DIRECTORY TABLE AT DIRBUF
  154. ;*    THIS DIRECTORY LOAD ROUTINE IS MUST LESS EFFICIENT THAN DIRLOAD,
  155. ;*        BUT IT DOES LOAD ENOUGH INFORMATION TO COMPUTE THE FILE
  156. ;*        SIZES USING THE FSIZE ROUTINE
  157. ;*    ON INPUT, HL PTS TO DIRECTORY BUFFER (16 x N MAX)
  158. ;*    ON OUTPUT, BC IS NUM OF FILES
  159. ;*        A=0 AND ZERO FLAG SET IF TPA OVERFLOW
  160. ;*        DE, HL UNAFFECTED
  161. ;*
  162. DIRSLOAD:
  163.     PUSH    HL    ; SAVE REGISTERS
  164.     PUSH    DE
  165.     XOR    A    ; SELECT LARGER EX
  166.     LD    (DFLAG),A    ; SET FLAG
  167.     JP    DLCOMMON
  168.  
  169. ;*
  170. ;*  SCAN DIRECTORY ENTRIES AS LOADED SO FAR FOR ANOTHER ENTRY BY THE SAME
  171. ;*    NAME; IF FOUND, SET THAT ENTRY TO BE THE ENTRY WITH THE LARGER EX
  172. ;*    AND RETURN WITH THE ZERO FLAG SET, INDICATING NO NEW FILE; IF NOT
  173. ;*    FOUND, RETURN WITH ZERO FLAG RESET (NZ)
  174. ;*  ON INPUT, HL PTS TO ENTRY TO SCAN FOR, FCOUNT = NUMBER OF ENTRIES SO FAR,
  175. ;*        AND (DSTART) = STARTING ADDRESS OF DIRECTORY LOADED
  176. ;*  ON OUTPUT, A=0 AND ZERO FLAG SET IF DUPLICATE ENTRY FOUND; A=0FFH AND NZ
  177. ;*        IF NO DUP ENTRY FOUND
  178. ;*        ONLY HL NOT AFFECTED
  179. ;*
  180. DUPENTRY:
  181.     PUSH    HL    ; SAVE PTR TO ENTRY TO SCAN FOR
  182.     EX    DE,HL        ; PTR IN DE
  183.     LD    HL,(FCOUNT)    ; CHECK COUNT
  184.     LD    A,H    ; NO ENTRIES?
  185.     OR    L
  186.     JP    Z,NODUP    ; NO DUPLICATE ENTRY RETURN
  187.     LD    B,H    ; BC=NUMBER OF ENTRIES
  188.     LD    C,L
  189.     LD    HL,(DSTART)    ; HL PTS TO FIRST ENTRY
  190. DUPELOOP:
  191.     PUSH    BC    ; SAVE COUNT
  192.     PUSH    HL    ; SAVE PTRS
  193.     PUSH    DE
  194.     LD    B,12    ; COMPARE USER NUMBER, FN, AND FT
  195.     CALL    COMP
  196.     POP    DE    ; RESTORE PTRS
  197.     POP    HL
  198.     JP    NZ,NODUPL    ; CONTINUE LOOKING FOR ANOTHER ENTRY
  199. ;  DUPLICATE ENTRIES HAVE BEEN IDENTIFIED AT THIS POINT
  200.     PUSH    HL    ; SAVE PTRS AGAIN
  201.     PUSH    DE
  202.     LD    BC,12    ; PT TO EX FIELD
  203.     ADD    HL,BC
  204.     EX    DE,HL
  205.     ADD    HL,BC    ; DE PTS TO DIRECTORY ENTRY, HL PTS TO TARGET
  206.     LD    A,(DE)    ; GET EXTENT FIELD FROM DIRECTORY ENTRY
  207.     CP    (HL)    ; COMPARE WITH THAT IN TARGET
  208.     POP    DE    ; GET PTRS
  209.     POP    HL
  210.     JP    NC,DUPSMALL
  211. ;  NEW TARGET IS LARGER THAN STORED ENTRY
  212.     LD    A,(DFLAG)    ; CHECK FLAG FOR LARGE OR SMALL EX
  213.     OR    A    ; 0=SELECT LARGER
  214.     JP    NZ,DUPFND
  215. DUPSEL:
  216.     EX    DE,HL        ; MAKE HL PT TO NEW TARGET, DE PT TO DEST
  217.     LD    B,ESIZE    ; NUMBER OF BYTES TO MOVE
  218.     CALL    SDMOVE    ; MOVE IT
  219.     JP    DUPFND
  220. ;  NEW TARGET IS SMALLER THAN STORED ENTRY
  221. DUPSMALL:
  222.     LD    A,(DFLAG)    ; CHECK FLAG FOR LARGE OR SMALL EX
  223.     OR    A    ; 0FFH=SELECT SMALLER
  224.     JP    NZ,DUPSEL
  225. ;  RETURN INDICATOR THAT DUPLICATE WAS FOUND
  226. DUPFND:
  227.     POP    BC    ; CLEAR COUNT FROM STACK
  228.     XOR    A    ; INDICATE DUP FOUND
  229.     POP    HL    ; RESTORE PTR TO ENTRY TO SCAN FOR
  230.     RET
  231. ;  NO DUPLICATE FOUND; ADVANCE TO NEXT ENTRY
  232. NODUPL:
  233.     LD    BC,ESIZE    ; HL PTS TO CURRENT ENTRY IN BUFFER, SO ADD ESIZE TO IT
  234.     ADD    HL,BC
  235.     POP    BC    ; GET COUNT
  236.     DEC    BC    ; COUNT DOWN
  237.     LD    A,B    ; CHECK FOR DONE
  238.     OR    C
  239.     JP    NZ,DUPELOOP
  240. ;  NO DUPLICATE FOUND, PERIOD
  241. NODUP:
  242.     XOR    A    ; INDICATE DUP NOT FOUND
  243.     DEC    A    ; SET FLAGS (NZ)
  244.     POP    HL    ; RESTORE PTR TO ENTRY TO SCAN FOR
  245.     RET
  246.  
  247. ;*
  248. ;*  COMP COMPARES DE W/HL FOR B BYTES; RET W/CARRY IF DE<HL
  249. ;*    MSB IS DISREGARDED
  250. ;*
  251. COMP:
  252.     LD    A,(HL)    ; GET (HL)
  253.     AND    7FH    ; MASK MSB
  254.     LD    C,A    ; ... IN C
  255.     LD    A,(DE)    ; COMPARE
  256.     AND    7FH    ; MASK MSB
  257.     CP    C
  258.     RET    NZ
  259.     INC    HL    ; PT TO NEXT
  260.     INC    DE
  261.     DEC    B    ; COUNT DOWN
  262.     JP    NZ,COMP
  263.     RET
  264.  
  265. ;*
  266. ;*  BUFFERS
  267. ;*
  268. TFCB:
  269.     DB    0,'???????????',0,0,0,0    ; TEMPORARY FCB (FN,FT WILD)
  270.     DB    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  271.     DB    0,0,0
  272. DFLAG:            ; 0=SELECT FILES OF LARGER EX, ELSE OF SMALLER EX
  273.     DS    1
  274. DSTART:
  275.     DS    2    ; POINTER TO FIRST DIRECTORY ENTRY
  276. FCOUNT:
  277.     DS    2    ; TOTAL NUMBER OF FILES/NUMBER OF SELECTED FILES
  278.  
  279.     END
  280.