//////////////////////////////////////////////////////////////////////// ;Входные значения: ; C - #19 ; HL - указатель на файловую спецификацию ; DE - рабочий буфер 44 байта, если B=0, иначе 256 байт ; A - атрибуты, используемые при поиске ; B = #00 - имя найденного файла в формате 11 байт "FilenameExt" ; B = #01 - имя найденного файла в формате DOS "filename.ext",0 ; поиск без ограничение на размер каталога: ; !TODO B = #02 - имя найденного файла в формате DOS + LFN ; !TODO B = #80 - имя найденного файла в формате 11 байт "FilenameExt" ; !TODO B = #81 - имя найденного файла в формате DOS "filename.ext",0 ;Выходные значения: ; A - код ошибки, если CF=1 //////////////////////////////////////////////////////////////////////// F_FIRST_FN: CALL F_FIRST.INIT_VARS PUSH HL ; Current Dir 15/10/23 CALL DIR_PATH_CHECK POP HL RET C ; JR F_FIRST.begin ; F_FIRST: CALL .INIT_VARS .begin: CALL SetPath_GetName ;!FIXIT не дублируется ли после DIR_PATH_CHECK выше? RET C ; LD A,(CORE_BUFFERS.FS_Buffer.DirBlock) AND A CALL NZ,LOADDIR ;!FIXIT check error CALL MASK RET C ; LD A,(.SEARCH_ATTRIBUT) CALL SEARCH.Custom RET C ; что-то нашлось PUSH DE ; record index может и не нужно LD HL,CORE_BUFFERS.MASKARE .DTABUF+1: LD DE,0 LD BC,FAT_DIRECTORY_RECORD.ATTRIBUT ; копируем .NAME и .EXT LDIR .SEARCH_ATTRIBUT+1: LD A,0 ; DSS_FCB_MAIN.SEARCH_ATTRIBUT LD (DE),A ; при прыжке сюда на стеке должен лежать record index .FIND_S: INC DE LD (F_NEXT.CURHND),IX POP HL ; record index LD (F_NEXT.RecordIndex),HL ; нет проверки на переполнение. надеемся, что FAT без косяков ; LD HL,CORE_BUFFERS.HANDBUF + FAT_DIRECTORY_RECORD.RESERVED_NT LD BC,CORE_BUFFERS.HANDBUF.SIZE - FAT_DIRECTORY_RECORD.RESERVED_NT LDIR LD A,(CORE_BUFFERS.HANDBUF + FAT_DIRECTORY_RECORD.ATTRIBUT) LD (DE),A INC DE LD HL,CORE_BUFFERS.HANDBUF .FNDMODE+1: LD A,0 AND %0111'1111 JR NZ,.FIND_M2 ; LD BC,11 ;!HARDCODE LDIR .exit: LD A,F_NEXT.NO_NEXT.NO LD (F_NEXT.NO_NEXT),A .FindCounter+1: LD HL,0 DEC HL LD (.FindCounter),HL ; CF=0 ;XOR A RET ; .FIND_M2: ;!TODO LFN ;CP 2 ;CALL NC,GetName_LFN ;CALL C,GetName CALL GetName ; JR .exit ; .INIT_VARS: LD (.SEARCH_ATTRIBUT),A LD (.DTABUF),DE LD DE,0 ; [ ] big dir for new directory read functions RLA JR C,.setCounter ; LD DE,512 ; for old directory read functions .setCounter: LD (.FindCounter),DE LD A,B LD (.FNDMODE),A RET //////////////////////////////////////////////////////////////////////// ; ; //////////////////////////////////////////////////////////////////////// F_NEXT: .NO_NEXT.YES EQU 0 .NO_NEXT.NO EQU #FF .NO_NEXT+1: LD A,0 OR A LD A,DSS_Error.sys.INVALID_ACCESS SCF RET Z ; LD (F_FIRST.DTABUF),DE EX DE,HL LD DE,CORE_BUFFERS.MASKARE LD BC,11 ;!HARDCODE LDIR ; XOR A ; F_NEXT.NO_NEXT.YES LD (F_NEXT.NO_NEXT),A ; проверка на режим. куча файлов или не больше 512? LD BC,(F_FIRST.FindCounter) LD A,B OR C LD A,DSS_Error.sys.TOO_MANY_FILES_IN_DIR SCF RET Z ; .nextSearch: LD A,(HL) PUSH HL CALL .NSEARCH POP HL RET C ; что-то нашлось PUSH DE EX DE,HL JP F_FIRST.FIND_S ; .NSEARCH: EX AF,AF' SET_PAGE_X DIRPAGE PUSH AF EX AF,AF' CPL LD C,A EXX .RecordIndex+1: LD DE,0 ; record index может и не нужно EXX ; .CURHND+2: LD IX,0 ; адрес следующей записи в кэше директории LD DE,SEARCH.for_F_NEXT PUSH DE ; выход в SEARCH из SEARCH_RECORD_IN_DIR_CACHE JP SEARCH_RECORD_IN_DIR_CACHE.next_record ;