//////////////////////////////////////////////////////////////////////// ;Входные значения: ; 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 ;!TEST Current Dir ;[x] 15/10/23 CALL DIR_PATH_CHECK POP HL RET C ; JR F_FIRST.begin ; F_FIRST: CALL .INIT_VARS .begin: CALL SetPath_GetName ;CALL LOADDIR RET C 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 ;!TODO лучше тут использовать как в record index для перебора каталога > #4000 bytes ;LD BC,FAT_DIRECTORY_RECORD ;ADD IX,BC LD (F_NEXT.CURHND),IX ; record index может и не нужно POP HL ;!FIXIT нет проверки на переполнение ; надеемся, что FAT без косяков ;INC HL LD (F_NEXT.RecordIndex),HL ; 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 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 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 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 ;!TEST 9/11/23 record index EXX .RecordIndex+1: LD DE,0 ; record index может и не нужно EXX ; .CURHND+2: LD IX,0 ; адрес следующей записи в кэше директории ;LD A,XH ;OR XL ;JP Z,SEARCH.error_too_many_files ; [ ] big dir ;JP SEARCH.loop JP SEARCH.next_record ; /* Любые изменения в директории убьют её. */