FINDDIR вроде OK

This commit is contained in:
Tolik 2026-01-12 20:46:33 +10:00
parent 48b9504b37
commit e8cf44ae6b
7 changed files with 133 additions and 140 deletions

View File

@ -140,7 +140,9 @@ F_NEXT:
EXX
;
.CURHND+2: LD IX,0 ;  ¤à¥á á«¥¤ãî饩 § ¯¨á¨ ¢ ªíè¥ ¤¨à¥ªâ®à¨¨
JP SEARCH.next_record
LD DE,SEARCH.for_F_NEXT
PUSH DE ; ¢ë室 ¢ SEARCH ¨§ SEARCH_RECORD_IN_DIR_CACHE
JP SEARCH_RECORD_IN_DIR_CACHE.next_record
;
/*
î¡ë¥ ¨§¬¥­¥­¨ï ¢ ¤¨à¥ªâ®à¨¨ ã¡ìîâ ¥ñ.

View File

@ -53,7 +53,7 @@ OPEN_FN: ; Current Dir 15/10/23
LDIR
.TMP+1: LD A,0
LD (IY+_sFM.ACCESS_MODE),A
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
; !FIXIT ®¯â¨¬¨§­ã« âãâ
;LD A,(TASK)
;LD (IY+_sFM.TASK_NUM),A
;XOR A

View File

@ -40,29 +40,41 @@ RENAME: ; Current Dir 15/10/23
;
LD A,FAT_ATTR.NoSYSnoVolID
CALL SEARCH.Custom ; ¯®¨áª § ¯¨á¨ "old_name.ext" ¢ ᯨ᪥ ¤¨áª 
; DE - record index
POP HL
RET C
;LD DE,MASKARE
;
LD (.recordAddr),IX
; ­  á«ãç © ¯¥à¥ª«î祭¨ï áâà ­¨æë ªíè  ¯®á«¥ SEARCH.Custom "new_name.ext"
LD A,(CORE_BUFFERS.FS_Buffer.DirBlock)
LD (.DirBlock),A
LD (.recordIndex),DE
;
CALL MASK.name
RET C
;
CALL CHECK_NAME
RET Z
;
PUSH IX
;PUSH IX
LD A,FAT_ATTR.NoSYSnoVolID
CALL SEARCH.Custom ; ¯®¨áª § ¯¨á¨ "new_name.ext" ¢ ᯨ᪥ ¤¨áª 
POP IX
;POP IX
LD A,DSS_Error.sys.FILE_EXISTS
CCF
RET C
;
SET_PAGE_X DIRPAGE
EX AF,AF'
; ­  á«ãç © ¯¥à¥ª«î祭¨ï áâà ­¨æë ªíè  ¯®á«¥ SEARCH.Custom "new_name.ext"
LD A,(CORE_BUFFERS.FS_Buffer.DirBlock)
.DirBlock+1: CP 0
.recordIndex+1: LD DE,0
SCF ; ­¥ ¯¥à¥áç¨â뢠âì à §¬¥à ¤¨à¥ªâ®à¨¨
CALL NZ,LOADDIR.next
;
LD HL,CORE_BUFFERS.MASKARE
LD D,XH
LD E,XL
.recordAddr+1: LD DE,0
LD BC,11
LDIR
;

View File

@ -29,13 +29,15 @@ WRITE: ;!TEST ;!TODO 5/12/23 ; [ ]
PUSH DE
CALL SET_FM
JR C,.ERR1
;
LD A,(IY+_sFM.ACCESS_MODE)
AND Dss.Open.R
JR NZ,.RD_ONLY
;
SET 7,(IY + _sFM.ACCESS_MODE)
SET 5,(IY + _sFM.FS_REC.ATTRIBUT)
LD A,(IY + _sFM.DRIVE)
CALL OPENDSK
CALL OPENDSK ;!FIXIT ¤«ï á®åà ­¥­¨ï ¤¨à¥ªâ®à¨¨ ¨á¯®«ì§ã¥âáï. Œ®¦¥â «¨ á«ãç¨âìáï, çâ® ¤¨áª ᬥ­¨âáï?
JR C,.ERR1
; [x] 26/06/2024 {64 kb cluster}
CALL CHECK_64kb_CLUSTER
@ -49,6 +51,7 @@ WRITE: ;!TEST ;!TODO 5/12/23 ; [ ]
PUSH BC
SRL B
JR Z,.WOV2
;
PUSH HL
PUSH DE
PUSH BC
@ -56,6 +59,7 @@ WRITE: ;!TEST ;!TODO 5/12/23 ; [ ]
CALL BLOCK_WRITE
POP BC
JR C,.ERR3
;
LD C,B
LD HL,(.R_POINT)
LD DE,#0200 ;!HARDCODE sector size
@ -76,6 +80,7 @@ WRITE: ;!TEST ;!TODO 5/12/23 ; [ ]
LD B,A
OR C
JR Z,.WOV6
;
PUSH HL
PUSH DE
PUSH BC
@ -93,6 +98,7 @@ WRITE: ;!TEST ;!TODO 5/12/23 ; [ ]
LD HL,(.R_POINT)
POP BC
JP C,.ERR2
;
LDIR
LD (.R_POINT),HL
POP DE
@ -108,6 +114,7 @@ WRITE: ;!TEST ;!TODO 5/12/23 ; [ ]
LD C,SLOT3
OUT (C),B
RET C
;
.WOV6: LD HL,(.R_POINT)
.S_POINT+1: LD DE,0
; CF=0
@ -152,6 +159,7 @@ WRITE: ;!TEST ;!TODO 5/12/23 ; [ ]
EXX
POP DE
JP C,.ERR1
;
LD HL,512 ;!HARDCODE ;!FIXIT ; [ ] sector size
AND A
SBC HL,DE
@ -161,6 +169,7 @@ WRITE: ;!TEST ;!TODO 5/12/23 ; [ ]
AND A
SBC HL,BC
JR NC,.WOV3
;
ADD HL,BC
LD B,H
LD C,L
@ -187,6 +196,7 @@ WRITE: ;!TEST ;!TODO 5/12/23 ; [ ]
OUT (C),B
POP HL
JP C,.ERR2
;
LD BC,1
ADD HL,BC
EX DE,HL

View File

@ -114,12 +114,15 @@ OPENDSK: ;!TEST DRV.Open
LD A,(CORE_BUFFERS.FS_Buffer.DRIVE)
CP B
JR NZ,.open
;
PUSH BC
LD C,Dss.DRV.MediaCheck
RST ToDSS.DRV
POP BC
JR Z,.exit
;
JR C,.error
;
JR .skip_open ;!FIXIT ª®£¤  DRV.MediaCheck ¨ DRV.Open ¡ã¤ã⠮⫨ç âìáï
;
.open: LD A,B

View File

@ -2116,12 +2116,14 @@ DELETE_LFN_RECORDS:
;----------------------------------------------------------------------;
; [ ] big dir £à㧨âì âãâ ­ ç «ì­ãî áâà ­¨æã ¢ dir cache ¨«¨ ¯¥à¥¤ ¢ë§®¢®¬?
; [ ] big dir ¢á¥£¤  «¨ ¯à¨ ¢ë§®¢¥ ã ­ á ¯à ¢¨«ì­ë¥ (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L ¨ H) ¤«ï LOADDIR?
;----------------------------------------------------------------------;
; <20>®¨áª § ¯¨á¨ ª â «®£  ¢ ᯨ᪥ ª â «®£ 
; ¢å®¤: a =  âਡãâ § ¯¨á¨ (.Custom)
; ¢å®¤: A =  âਡãâ § ¯¨á¨ (.Custom)
; (CORE_BUFFERS.MASKARE) - ¬ áª  ¤«ï ¯®¨áª 
; ¢ë室: de = ¨­¤¥ªá § ¯¨á¨ ¢ ᯨ᪥ ª â «®£ 
; ¢ë室: DE - ¨­¤¥ªá § ¯¨á¨ ¢ ᯨ᪥ ª â «®£ 
; IX -  ¤à¥á ­ ©¤¥­®© § ¯¨á¨ ¢ SLOT3
; (HANDBUF) = file's directory record
; CF - ª â «®£ ­¥ ­ ©¤¥­
SEARCH:
@ -2141,8 +2143,34 @@ SEARCH:
SET_PAGE_X DIRPAGE
PUSH AF
EX AF,AF'
CPL
CALL SEARCH_RECORD_IN_DIR_CACHE
.for_F_NEXT: JR C,.error
;
CPL
LD D,XH
LD E,XL
LD HL,CORE_BUFFERS.HANDBUF
EX DE,HL
LD BC,CORE_BUFFERS.HANDBUF.SIZE
LDIR
POP AF
OUT (SLOT3),A
AND A
EXX ; record index
RET
;
.error: POP AF
OUT (SLOT3),A
LD A,DSS_Error.sys.FILE_NOT_FOUND
SCF
RET
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
SEARCH_RECORD_IN_DIR_CACHE:
;CPL
LD C,A
;!TEST 9/11/23 record index
EXX
@ -2152,13 +2180,16 @@ SEARCH:
.loop_big: LD IX,DIRPAGE.buffer
.loop: LD A,(IX + FAT_DIRECTORY_RECORD.NAME)
OR A
JR Z,.error_file_not_found
SCF
RET Z ; not found
;
CP #E5 ;!HARDCODE #E5 - § ¯¨áì ¢ ¤¨à¥ªâ®à¨¨ ᢮¡®¤­ , â ª ª ª ä ©«/¤¨à¥ªâ®à¨ï ¡ë«¨ 㤠«¥­ë
JR Z,.next_record
;
LD A,(IX + FAT_DIRECTORY_RECORD.ATTRIBUT)
LD D,A
AND C
JR NZ,.next_record
.type+0: JR NZ,.next_record
;
LD A,C
INC A
@ -2170,55 +2201,27 @@ SEARCH:
.found_attr: LD HL,CORE_BUFFERS.MASKARE
LD D,XH
LD E,XL
LD B,11
LD B,11 ;!HARDCODE dos name not LFN
EX DE,HL
;
.loop_compare: LD A,(DE)
CP '?'
JR Z,.next_char
;
CP (HL)
JR NZ,.next_record
;
.next_char: INC HL
INC DE
DJNZ .loop_compare
;
LD D,XH
LD E,XL
;!TEST 9/11/23 record index
; EXX
; PUSH DE ; record index
; EXX
;PUSH IX
;
LD HL,CORE_BUFFERS.HANDBUF
EX DE,HL
LD BC,CORE_BUFFERS.HANDBUF.SIZE
LDIR
; record index
;POP DE
POP AF
;EX AF,AF'
OUT (SLOT3),A
;EX AF,AF'
AND A
EXX ; record index
RET
;JR NZ,.next_record
JR Z,.next_char
;
.next_record: ;!TEST 9/11/23 record index
EXX
INC DE
EXX
;
.inc_rec_num: LD DE,FAT_DIRECTORY_RECORD
LD DE,FAT_DIRECTORY_RECORD
ADD IX,DE
JR NC,.loop
;
; [ ] big dir
; LD A,(F_FIRST.FNDMODE) ;!FIXIT big dir - ­¥¯à ¢¨«ì­® ¨á¯®«ì§®¢ âì íâ®, ­ ¤® ­®¢ãî ¯¥à¥¬¥­­ãî
; RLA
; JR NC,.error_too_many_files
;
; CF=1
; CF=1
; !FIXIT root dir in LOADDIR
; !FIXIT ¥á«¨ ¢ ªíè ¡ë«¨ ¨§¬¥­¥­¨ï?
.readDirNext: PUSH BC
@ -2229,59 +2232,40 @@ SEARCH:
POP DE
EXX
POP BC
JR NC,.loop_big ; !FIXIT â ¬ ­¥â CF ­  ¢ë室¥
JR NC,.loop_big ; !FIXIT ¬®¦¥â ¡ëâì ®è¨¡ª  ç⥭¨ï ¨«¨ ¯à¨ ZF - ª®­¥æ ¤¨à¥ªâ®à¨¨
;
.error_file_not_found:
POP AF
OUT (SLOT3),A
LD A,DSS_Error.sys.FILE_NOT_FOUND
SCF
RET
;
; .error_too_many_files:
; POP AF
; OUT (SLOT3),A
; LD A,DSS_Error.sys.TOO_MANY_FILES_IN_DIR
; SCF
; RET
;
.next_char: INC HL
INC DE
DJNZ .loop_compare
; CF=0
RET
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
;----------------------------------------------------------------------; 20 28
; FIND "MASKAREA" IN DIRECTORY
; ¢ë室: IY:DE - cluster number
; [ ] big dir ¢á¥£¤  «¨ ¯à¨ ¢ë§®¢¥ ã ­ á ¯à ¢¨«ì­ë¥ (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L ¨ H) ¤«ï LOADDIR?
FINDDIR: SET_PAGE_X DIRPAGE
;
PUSH AF
LD IX,DIRPAGE.buffer
.big_loop: LD A,(IX + FAT_DIRECTORY_RECORD.NAME)
OR A
JR Z,.error
;[ ] big dir ; !FIXIT § ¬¥­¨âì ­  横«¨ç­ë© ¯¥à¥¡®à ¤¨à¥ªâ®à¨¨ ¯® áâà ­¨æ ¬, ç⮡ ­¥ ¤¥« âì «¨è­¨å § £àã§®ª
LD A,(CORE_BUFFERS.FS_Buffer.DirBlock)
AND A
CALL NZ,LOADDIR
;
CP #E5
JR Z,.next_step
;
LD A,(IX + FAT_DIRECTORY_RECORD.ATTRIBUT)
AND FAT_ATTR.DIRECTORY
JR Z,.next_step
;
LD HL,CORE_BUFFERS.MASKARE
LD D,XH
LD E,XL
EX DE,HL
LD B,11 ;!HARDCODE
.loop: LD A,(DE)
CP "?"
JR Z,.compared
CP (HL)
JR NZ,.next_step
;
.compared: INC HL
INC DE
DJNZ .loop
LD A,#28 ; JR Z,...
LD (SEARCH_RECORD_IN_DIR_CACHE.type),A ; search directory
LD A,FAT_ATTR.DIRECTORY
CALL SEARCH_RECORD_IN_DIR_CACHE
EX AF,AF
LD A,#20 ; JR NZ,...
LD (SEARCH_RECORD_IN_DIR_CACHE.type),A ; search
EX AF,AF
JR C,.error
;
LD A,(IX + FAT_DIRECTORY_RECORD.NAME)
CP "."
@ -2315,10 +2299,6 @@ FINDDIR: SET_PAGE_X DIRPAGE
.MM3: LD (HL),0
JP .ITs_DIR
;
.next_step: LD BC,FAT_DIRECTORY_RECORD
ADD IX,BC
JR NC,.big_loop
;
.error: POP AF
OUT (SLOT3),A
LD A,DSS_Error.sys.PATH_NOT_FOUND
@ -2344,36 +2324,6 @@ FINDDIR: SET_PAGE_X DIRPAGE
CALL GetName
EX DE,HL
;
; LD BC,256*8 + ' ' ;!HARDCODE
; .MM1: LD A,(DE)
; INC DE
; CP C
; JR Z,.MM2
; LD (HL),A
; INC HL
; .MM2 DJNZ .MM1 ;x42-40 50-55
; LD A,(DE)
; INC DE
; CP C
; JR Z,.MM3
; LD (HL),"."
; INC HL
; LD (HL),A
; INC HL
; LD A,(DE)
; INC DE
; CP C
; JR Z,.MM3
; LD (HL),A
; INC HL
; LD A,(DE)
; CP C
; JR Z,.MM3
; LD (HL),A
; .MM2_5: INC HL
; .MM3: LD (HL),0
; ; JP IT_DIR
;
.ITs_DIR: ; fat32
LD E,(IX + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H)
LD D,(IX + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1)
@ -2488,8 +2438,8 @@ OPENDIR: ; init
JR NZ,.SUBDIR2
; fat32
; !TEST 04/01/2026
;EX DE,HL
CALL CHECK_ROOT_CLUSTER
EX DE,HL
CALL CHECK_ROOT_CLUSTER
;CALL CHECK_FIRST_CLUSTER
EX DE,HL
;
@ -2524,21 +2474,29 @@ OPENDIR: ; init
RET C
;
EX DE,HL
LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL ; fat32
LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),IY ; fat32
LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE)
CP FAT_TYPE.x32
JR NZ,.setCluster
; [ ] big dir
; ...
LD A,H
OR L
OR YH
OR YL
JR NZ,.setCluster
; set root dir for fat32
LD HL,(CORE_BUFFERS.FS_Buffer.RootDirStartCluster_L)
LD IY,(CORE_BUFFERS.FS_Buffer.RootDirStartCluster_H)
.setCluster: LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL
LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),IY ; fat32
;
;LD HL,#4000 ;!HARDCODE
;LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE),HL
;-------------; EX DE,HL
; JP LOADDIR
;-------------; JP LOADDIR
;----------------------------------------------------------------------;
; <20>à®ç¨â âì ᯨ᮪ ª â «®£ 
; ¢å®¤ (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L), (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H)
LOADDIR: ;!TODO optimize
;!FIXIT ¥á«¨ HL ¢ë©¤¥â §  à §¬¥àë ¤¨à¥ªâ®à¨¨ ¨ DirBlock ¡ã¤¥â ­¥ª®à४â­ë¬?
LD HL,0 ; ID § ¯¨á¨, ª®â®àë© ¤®«¦¥­ ¯®¯ áâì ¢ Š<>˜
.Custom: AND A ; ¢ LOAD_SAVE_DIR_PREPARE ¯®áç¨â ¥âáï à §¬¥à ª â «®£  ¤¨à¥ªâ®à¨¨
.Custom: AND A ; ¢ LOAD_SAVE_DIR_PREPARE ¯®áç¨â ¥âáï à §¬¥à ª â «®£  ¤¨à¥ªâ®à¨¨
.next: CALL LOAD_SAVE_DIR_PREPARE
PUSH AF
EX AF,AF'
@ -2546,7 +2504,7 @@ LOADDIR: ;!TODO optimize
; root dir
;LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE)
;CP FAT_TYPE.x32
JR Z,.LoadRootDir
JR Z,.LoadRootDirFAT12_16
;CALL LOAD_SAVE_DIR_PREPARE.CalcDirSize
; fat32
; LD HL,(CORE_BUFFERS.FS_Buffer.RootDirStartCluster_L)
@ -2575,10 +2533,17 @@ LOADDIR: ;!TODO optimize
RET NZ
; ç¨â ¥¬ á ­ ç « 
CALL LOADDIR
.no_more: XOR A ;!FIXIT ­ ãç¨âì í⮬㠢ë§ë¢ î騥 ¯à®æ¥¤ãàë ; 0 - ­¥â ®è¨¡®ª. ¯à¨§­ ª ª®­æ  ª â «®£ 
SCF
RET
;
.LoadRootDir: LD HL,(CORE_BUFFERS.FS_Buffer.RootDirFirstSector_H);!TODO ¢®§¬®¦­®, 墠â¨â LD HL,0
.LoadRootDirFAT12_16:
; [ ] big dir
LD A,(CORE_BUFFERS.FS_Buffer.DirBlock)
AND A
JR NZ,.no_more
;
LD HL,(CORE_BUFFERS.FS_Buffer.RootDirFirstSector_H);!TODO ¢®§¬®¦­®, 墠â¨â LD HL,0
LD IX,(CORE_BUFFERS.FS_Buffer.RootDirFirstSector_L); ­®¬¥à «®£. ᥪâ®à 
LD A,(CORE_BUFFERS.FS_Buffer.DirSizeInSectors)
LD B,32 ; !HARDCODE sector size 512. 16384/(sector 512). à §¬¥à root-ª â «®£  ; [ ] sector size 512
@ -2780,6 +2745,7 @@ LOAD_SAVE_DIR_PREPARE:
; ¢å®¤: iy=áâàãªâãà  ¤¥áªà¨¯â®à 
; [ ] big dir ¯®«ãç âì ®âªã¤  ¨ ᪮«ìª® ¡ ©â®¢ ¨§¬¥­¨«®áì ¢ ªíè, ç⮡ ­¥ ¯¨á âì ­  ¤¨áª «¨è­¥£®
SAVEDIR: ;!TODO optimize
SCF ; ­¥ áç¨â âì à §¬¥à ¤¨à¥ªâ®à¨¨
CALL LOAD_SAVE_DIR_PREPARE
PUSH AF
EX AF,AF'
@ -2800,7 +2766,7 @@ SAVEDIR: ;!TODO optimize
;!FIXIT ¥á«¨ ®­  ­ã¦­ , â® ¯à®¢¥à¨âì ­  ¡ £¨ (­ ¯à¨¬¥à, à §¬¥à ¤¨à४â®à¨¨ ¬¥­ìè¥ ¯à¨ ®âªàë⨨ ¨ ¡®«ìè¥ ¯®á«¥ ¯à ¢®ª)
; ª®£¤  ¡ã¤¥â ç⥭¨¥ ªã᪠¬¨ ª â «®£  ¢ ªíè, âãâ ¥éñ áçñâ稪 ¯à¨ªàãâ¨âì
.DirBlkSize+1: LD DE,0
XOR A
XOR A ; FM
CALL WRITE
POP AF
OUT (SLOT3),A

View File

@ -1,6 +1,6 @@
<EFBFBD>® ¯®«­ë¬ ¤¨à¥ªâ®à¨ï¬.
;[x] LOADDIR ¯®á«¥ READ ¢ë室¨âì á CF, ¥á«¨ ¯à®ç¨â ­® 0
;[ ] FINDDIR - ¯®ª  à ¡®â ¥â ⮫쪮 á ⥬, çâ® ¡ë«® § £à㦥­® ¢ ªíè ¨ ¬ «® çâ® ­ å®¤¨â, ¥á«¨ áâà ­¨æ ¡®«ìè¥ 1.
;[x] FINDDIR - ¯®ª  à ¡®â ¥â ⮫쪮 á ⥬, çâ® ¡ë«® § £à㦥­® ¢ ªíè ¨ ¬ «® çâ® ­ å®¤¨â, ¥á«¨ áâà ­¨æ ¡®«ìè¥ 1.
;[ ] <20>¥à¥¤¥« âì WRITE_DIR_HANDLE ¤«ï à ¡®âë á «î¡®© § ¯¨áìî ¢ ª â «®£¥ (ᥩç á ¨é¥â ¯¥à¢ãî ¯ãáâãî, ç⮡ § ¯¨á âì ¢ ­¥ñ)
;[ ] ‚ᥠ¨§¬¥­¥­¨ï ¢ § ¯¨áïå ª â «®£  ¤¥« âì ¢ ¡ãä¥à¥ CORE_BUFFERS.HANDBUF ¨ á®åà ­ïâì ç¥à¥§ WRITE_DIR_HANDLE
;[x] <20>¥à¥¬¥­­ ï DirBlock ¯®ª §ë¢ îé ï ª ª®© ¡«®ª ¤¨à¥ªâ®à¨¨ ¢ ªíè.
@ -12,9 +12,9 @@
<EFBFBD>¥à¥«®¯ â¨âì
;[ ] FINDDIR
;[ ] LOAD_SAVE_DIR_PREPARE
;[ ] LOADDIR
;[x] FINDDIR
;[x] LOAD_SAVE_DIR_PREPARE
;[x] LOADDIR
;[ ] SAVEDIR
;[ ] RENAME
;[ ] CLOSE_FN