Estex-DSS/DSS/API/Find.asm
Tolik 05c9224a7b добить:
LOAD_NEXT_DIR_PART_TO_DIR_CACHE
WRITE_DIR_HANDLE
;-bug: GenIOCTL.GetParams - выдавала неправильное количество секторов для FDD
2026-01-22 22:45:41 +10:00

148 lines
3.6 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

////////////////////////////////////////////////////////////////////////
;‚室­ë¥ §­ ç¥­¨ï:
; C - #19
; HL - 㪠§ â¥«ì ­  ä ©«®¢ãî ᯥæ¨ä¨ª æ¨î
; DE - à ¡®ç¨© ¡ãä¥à 44 ¡ ©â , ¥á«¨ B=0, ¨­ ç¥ 256 ¡ ©â
; A -  âਡãâë, ¨á¯®«ì§ã¥¬ë¥ ¯à¨ ¯®¨áª¥
; B = #00 - ¨¬ï ­ ©¤¥­­®£® ä ©«  ¢ ä®à¬ â¥ 11 ¡ ©â "FilenameExt"
; B = #01 - ¨¬ï ­ ©¤¥­­®£® ä ©«  ¢ ä®à¬ â¥ DOS "filename.ext",0
; ¯®¨áª ¡¥§ ®£à ­¨ç¥­¨¥ ­  à §¬¥à ª â «®£ :
; !TODO B = #02 - ¨¬ï ­ ©¤¥­­®£® ä ©«  ¢ ä®à¬ â¥ DOS + LFN
; B = #80 - ¨¬ï ­ ©¤¥­­®£® ä ©«  ¢ ä®à¬ â¥ 11 ¡ ©â "FilenameExt"
; 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
////////////////////////////////////////////////////////////////////////