# File lib/file_systems/TrsDos.rb, line 76
def self.files(file_system_image)
  files=FileContainer.new
  granule_allocation_table=file_system_image.get_sector(directory_track,0)
  return files if granule_allocation_table.nil?
  file_system_image.volume_name=granule_allocation_table[0xd0,8].unpack("A*")
  (file_system_image.sectors_in_track(directory_track)-[0,1]).each do |sector_no|
    fde_sector=file_system_image.get_sector(directory_track,sector_no)
    (fde_sector.length/FDE_SIZE).times do |fde_number|
      fde=fde_sector[fde_number*FDE_SIZE,FDE_SIZE]
      attributes=fde[0x00]
      
      #for a valid FPDE, bit 7 is 0 and bite 4 is 1

      is_fpde  = ((attributes & 0b10010000)==(0b00010000))
      next if !is_fpde 
      eof_low=fde[0x03]
      filename_base=fde[0x05,8].unpack("A8")
      filename_extension=fde[0x0D,3].unpack("A3")
      filename="#{filename_base}/#{filename_extension}"
      contents=""
      eof_mid=fde[0x14]
      eof_high=fde[0x15]
      file_length=(eof_high<<16)+(eof_mid<<8)+eof_low
      if (eof_low>0) then
        file_length-=0x100
      end
# byte $16 - $1F : 5 pairs of extent elements, each pair made up of:

#     byte $00 : if $FF, then end of extent elements for this file. if $FE, then next byte contains the DEC for the first (or next) FXDE assigned to this file.

#                     any other value ($00-$FD) equals the number of the diskette's lump in which the area starts. 

#     byte $01  : bits 7-5 = number of granules (0-7) from the start of the lump to the start of the area

#                   : bits 4- 0 = number less one of contiguous granules assigned to this area.


      5.times do |extent_no|
        extent=fde[(extent_no*2)+0x16,2]
        break if extent[0]==0xFF
        #raise "FXDE's not implemented yet" if extent[0]==0xFE

        break if extent[0]==0xFE # "FXDE's not implemented yet"

        track_no=extent[0]
        granule_offset=extent[1]>>5
        number_of_granules=1+(extent[1] & 0b00011111)
        start_sector=granule_offset*sectors_per_granule(file_system_image)
        number_of_sectors=number_of_granules*sectors_per_granule(file_system_image)
        number_of_sectors.times {|i| contents<<file_system_image.get_sector(track_no,start_sector+i)}        
      end
      contents=contents[0,file_length]
      files<<NativeFileType.best_fit(file_system_image,filename,contents,filename_extension)      
    end
  end
  files
end