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 / SLIB2.LBR / SLUDIR.Z80 < prev    next >
Text File  |  2000-06-30  |  4KB  |  164 lines

  1. ;
  2. ; LULIB Module: LUDIR
  3. ; Author: Richard Conn
  4. ; Date: 8 August 85
  5. ; LULIB Version: 1.0
  6. ; LULIB Module Version: 1.0
  7. ;
  8.     public    ludir
  9.  
  10. ;
  11. ;    LUDIR stores selected directory entries from a library in a
  12. ; memory buffer.  It accepts an ambiguous file name reference and an
  13. ; LUD pointer (as provided by LUINIT), and it builds a listing of names
  14. ; in memory.  This listing is structured as follows:
  15. ;
  16. ;    DB    'FILENAME'
  17. ;    DB    'TYP'
  18. ;    DW    START_INDEX
  19. ;    DW    LENGTH
  20. ;    DW    CRC
  21. ;    ...            ; entries repeated as necessary
  22. ;    DB    0        ; indicates end of list
  23. ;
  24. ;    On input, DE = ptr to LUD, HL = ptr to FN.FT, and BC = ptr to
  25. ;        memory buffer
  26. ;    On output, A is return code:
  27. ;        0     OK
  28. ;        0FFH  Memory Buffer overflow (encountered top of TPA)
  29. ;
  30. ;    Side Effect: DMA Address is set to 80H
  31. ;
  32.  
  33. ;
  34. ;    Externals and Equates
  35. ;
  36. lentsz    equ    17        ; size of dir entry:
  37.                 ;    11 - for FN.FT
  38.                 ;     2 - for Index
  39.                 ;     2 - for Length
  40.                 ;     2 - for CRC
  41. bdose    equ    5
  42.  
  43.     ext    f$open,r$read
  44.  
  45.     .in    luddef
  46.  
  47. ludir:
  48.     push    hl        ; save regs
  49.     push    de
  50.     push    bc
  51.     ld    c,26        ; set DMA address
  52.     ld    de,tbuff
  53.     call    bdose        ; use BDOS call
  54.     pop    bc        ; restore and save regs
  55.     pop    de
  56.     pop    hl
  57.     push    hl
  58.     push    de
  59.     push    bc
  60.     ld    a,(bdose+7)    ; get upper base page of system
  61.     sub    a,10        ; pt to below ZCPR3
  62.     ld    (tpaend),a    ; set end ptr
  63.     ld    (file),hl    ; save ptr to file name
  64.     ld    h,b        ; get ptr to memory buffer
  65.     ld    l,c
  66.     ld    (buffer),hl    ; save ptr to memory buffer
  67.     ld    hl,ludfcb    ; offset to FCB
  68.     add    hl,de
  69.     ex    de,hl        ; DE = FCB
  70.     ld    c,(hl)        ; get length of directory
  71.     inc    hl
  72.     ld    b,(hl)
  73.     ld    hl,0        ; read directory in (record 0)
  74. loop:
  75.     call    r$read        ; random read
  76.     jr    nz,error    ; file not found if error
  77.     push    hl        ; save key regs
  78.     push    de
  79.     push    bc
  80.     call    scan        ; scan for file name match and build buffer
  81.     pop    bc        ; restore key regs
  82.     pop    de
  83.     pop    hl
  84.     jr    z,error        ; TPA full
  85.     inc    hl        ; pt to next record
  86.     dec    bc        ; count down length of dir
  87.     ld    a,b        ; done?
  88.     or    c
  89.     jr    nz,loop
  90.     ld    hl,(buffer)    ; point to next byte after last entry
  91.     ld    (hl),0        ; store zero
  92.     jr    done        ; A=0 from before the "jr nz,loop"
  93. error:
  94.     or    0ffh        ; set 0FFH
  95. done:
  96.     pop    bc        ; restore regs
  97.     pop    de
  98.     pop    hl
  99.     or    a        ; set flags
  100.     ret
  101. ;
  102. ;  Scan TBUFF for file names
  103. ;  If memory overflow, A=0 and Zero Flag Set
  104. ;  If OK, A=0FFH
  105. ;
  106. scan:
  107.     ld    hl,tbuff    ; pt to buffer
  108.     ld    c,4        ; 4 entries possible
  109. scan1:
  110.     ld    a,(hl)        ; check for active entry
  111.     or    a        ; 0=yes
  112.     jr    nz,scanxt
  113.     push    hl
  114.     inc    hl        ; pt to name
  115.     ld    de,(file)    ; pt to file name
  116.     ld    b,11        ; 11 bytes
  117. scanlp:
  118.     ld    a,(de)        ; get name
  119.     and    7fh        ; mask msb
  120.     cp    '?'        ; match wild
  121.     jr    z,scanlp1
  122.     cp    (hl)        ; compare to dir entry
  123.     jr    nz,scanlp2
  124. scanlp1:
  125.     inc    hl        ; pt to next
  126.     inc    de
  127.     djnz    scanlp
  128.     pop    de        ; we have a match - pt to entry with DE
  129.     ld    hl,(buffer)    ; get address of next buffer entry
  130.     ld    a,(tpaend)    ; check for overflow
  131.     cp    h
  132.     jr    c,scanerr    ; TPA overflow
  133.     push    de        ; save ptr
  134.     push    bc        ; save count
  135.     inc    de        ; pt to file name
  136.     ex    de,hl        ; source in HL
  137.     ld    bc,lentsz    ; entry size
  138.     ldir
  139.     ld    (buffer),de    ; save ptr for next copy
  140.     pop    bc        ; get count
  141.     jr    scanlp2        ; continue
  142. scanerr:
  143.     xor    a        ; return with zero for error
  144.     ret
  145. scanlp2:
  146.     pop    hl        ; pt to current
  147. scanxt:
  148.     ld    de,32        ; pt to next
  149.     add    hl,de
  150.     dec    c        ; count down
  151.     jr    nz,scan1
  152.     or    0ffh        ; set no error
  153.     ret
  154.  
  155. ;
  156. ;  Buffers
  157. ;
  158. file:    ds    2        ; pointer to FN.FT
  159. buffer:    ds    2        ; pointer to memory buffer
  160. tpaend:    ds    1        ; end page of TPA
  161. ludent:    ds    2        ; pointer to LUD entry
  162.  
  163.     end
  164.