//////////////////////////////////////////////////////////////////////// ;Входные значения: ; 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 ; [ ] 10/06/24 IF OLD_DSS_FOR_OLD_EXE LD A,(EXE_VERSION) OR A JR Z,.old_EXE ENDIF ; CALL DIR_PATH_CHECK RET C ; .old_EXE: POP HL JR F_FIRST.begin ; F_FIRST: CALL .INIT_VARS .begin: CALL GETWORD ;CALL LOADDIR RET C CALL MASK RET C LD A,(.SEARCH_ATTRIBUT) CALL SEARCH.Custom RET C LD HL,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 .FIND_S: INC DE ;!TODO лучше тут использовать как в record index для перебора каталога > #4000 bytes LD BC,FAT_DIRECTORY_RECORD ADD IX,BC LD (F_NEXT.CURHND),IX LD HL,HANDBUF + FAT_DIRECTORY_RECORD.RESERVED_NT LD BC,HANDBUF.SIZE - FAT_DIRECTORY_RECORD.RESERVED_NT LDIR LD A,(HANDBUF + FAT_DIRECTORY_RECORD.ATTRIBUT) LD (DE),A INC DE LD HL,HANDBUF .FNDMODE+1: LD A,0 OR A 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,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 DE RET C 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 ; LD DE,0 ; EXX ; .CURHND+2: LD IX,0 LD A,XH OR XL JP Z,SEARCH.error_too_many_files JP SEARCH.loop ;