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 / SGFA.Z80 < prev    next >
Text File  |  2000-06-30  |  3KB  |  128 lines

  1. ;
  2. ; SYSLIB Module Name:  SGFA
  3. ; Author:  Richard Conn
  4. ; SYSLIB Version Number:  3.6
  5. ; Module Version Number:  1.1
  6.  
  7.     public    gfa
  8.  
  9. ;
  10. ;  Externals
  11. ;
  12.     ext    initfcb
  13.  
  14. ;
  15. ;  Equates
  16. ;
  17. bdos    equ    5    ; base address of BDOS
  18. bsear    equ    17    ; set file attributes function code
  19. tbuff    equ    80h    ; DMA address
  20.  
  21. ;
  22. ;  Macros
  23. ;
  24. putrg    macro
  25.     push    hl    ; save regs
  26.     push    de
  27.     push    bc
  28.     endm
  29. getrg    macro
  30.     pop    bc    ; restore regs
  31.     pop    de
  32.     pop    hl
  33.     endm
  34.  
  35. ;
  36. ;  GFA gets the file attributes of the unambiguous file whose FCB
  37. ;    is pted to by DE; on return, A0 is the R/O bit and A7 is the SYS
  38. ;    bit, and the MSBs of the FCB in the FN and FT fields are set
  39. ;    according to the disk entry
  40. ;  On exit, A=0FFH and NZ if file not found or ambigous file reference
  41. ;    A=code (A0 is R/O bit and A7 is SYS bit) and Z if OK
  42. ;    All FCB fields are cleared except for file name and type, and
  43. ; these fields are changed in the MSBs to reflect those of the located
  44. ; file
  45. ;
  46. gfa:
  47.     putrg        ; save registers
  48. ;
  49. ;  Check for ambiguous file name
  50. ;
  51.     push    de    ; save ptr to FCB
  52.     inc    de    ; pt to first char
  53.     ld    b,11    ; check 11 bytes
  54. amb:
  55.     ld    a,(de)    ; get char
  56.     and    7fh    ; mask MSB
  57.     ld    (de),a    ; put char
  58.     cp    '?'
  59.     jp    z,amb1
  60.     inc    de
  61.     dec    b
  62.     jp    nz,amb
  63.     inc    b    ; make NZ
  64. amb1:
  65.     pop    de
  66.     jp    z,error
  67. ;
  68. ;  Search for file
  69. ;
  70.     push    de    ; save FCB ptr
  71.     call    initfcb    ; clear FCB fields
  72.     ld    c,bsear    ; search for first
  73.     call    bdos
  74.     pop    de    ; get FCB ptr
  75.     cp    0ffh    ; error?
  76.     jp    z,error
  77. ;
  78. ;  Pt to File Name in TBUFF area
  79. ;
  80.     add    a,a    ; *2
  81.     add    a,a    ; *4
  82.     add    a,a    ; *8
  83.     add    a,a    ; *16
  84.     add    a,a    ; *32 for TBUFF offset
  85.     ld    c,a    ; DE=offset
  86.     ld    b,0
  87.     ld    hl,tbuff+1    ; pt to DMA address
  88.     add    hl,bc    ; HL pts to FN of desired file
  89.     inc    de    ; DE pts to FN of target file
  90.     ld    b,8    ; copy 8 bytes
  91. copy:
  92.     ld    a,(hl)    ; get byte
  93.     ld    (de),a    ; put byte
  94.     inc    hl    ; pt to next
  95.     inc    de
  96.     dec    b    ; count down
  97.     jp    nz,copy
  98.     ld    a,(hl)    ; get R/O byte
  99.     ld    (de),a    ; put R/O byte
  100.     rlca        ; rotate R/O bit into LSB
  101.     and    1    ; mask out uninteresting bits
  102.     ld    c,a    ; save in C
  103.     inc    hl    ; pt to next
  104.     inc    de
  105.     ld    a,(hl)    ; get SYS byte
  106.     ld    (de),a    ; put SYS byte
  107.     and    80h    ; mask out all but MSB
  108.     or    c    ; OR in R/O bit
  109.     ld    c,a    ; C=return code
  110.     inc    hl    ; pt to next
  111.     inc    de
  112.     ld    a,(hl)    ; get and put last byte
  113.     ld    (de),a
  114.     xor    a    ; OK return
  115.     ld    a,c    ; return code in A
  116.     getrg        ; restore regs
  117.     ret
  118. ;
  119. ;  Error Return
  120. ;
  121. error:
  122.     ld    a,0ffh    ; set code
  123.     or    a    ; set flags
  124.     getrg        ; restore registers
  125.     ret
  126.  
  127.     end
  128.