This commit is contained in:
Tolik 2025-12-11 21:24:10 +10:00 committed by Tolik Trek
parent 7d98613cb5
commit cfb3543373
13 changed files with 484 additions and 177 deletions

View File

@ -10,11 +10,13 @@
CLOSE_FN: LD (.TMP),A
CALL SET_FM
RET C
;
LD A,(TASK)
CP (IY+_sFM.TASK_NUM)
LD A,DSS_Error.sys.ACCESS_DENIED
SCF
RET NZ
;
BIT 7,(IY+_sFM.ACCESS_MODE)
JR Z,.NOTMODF
;
@ -47,7 +49,7 @@ CLOSE_FN: LD (.TMP),A
LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L),E
LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1),D
;
CALL LOADDIR
CALL LOADDIR ; [ ] big dir
; [ ] big dir
;!TODO ®â¬®â âì ªíè ¤® ­ã¦­®£® record index?
;
@ -75,9 +77,6 @@ CLOSE_FN: LD (.TMP),A
LD D,YH
LD E,YL
EX DE,HL
;PUSH HL
;SET_PAGE_X DIRPAGE
;POP HL
LD BC,FAT_DIRECTORY_RECORD
LDIR
EX AF,AF'

View File

@ -80,7 +80,7 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 ;CREATE_FN:
INC HL
DJNZ .loop2
; [ ] big dir ¯¥à¥¤ ¢ âì ®âªã¤  ¨ ᪮«ìª® ¡ ©â®¢ ¨§¬¥­¨«®áì ¢ ªíè, ç⮡ ­¥ ¯¨á âì ­  ¤¨áª «¨è­¥£®
CALL WRT_HND
CALL WRITE_DIR_HANDLE
RET C
;CALL SAVEDIR
.PATH0+1: LD HL,0
@ -97,7 +97,7 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 ;CREATE_FN:
LD (.PATH0),HL
CALL SetPath_GetName
RET C
; [ ] 26/06/2024
; [x] 26/06/2024 {64 kb cluster}
CALL CHECK_64kb_CLUSTER
RET C
;

View File

@ -10,7 +10,7 @@ DEL_FN: ;Current Dir ;[x] 15/10/23
;
CALL SetPath_GetName ; â¥áâ ­  ¤®¯ãáâ. ¨¬ï ¨ ­ áâà. ­  ¤¨áª
RET C
; [ ] 26/06/2024
; [x] 26/06/2024 {64 kb cluster}
CALL CHECK_64kb_CLUSTER
RET C
;
@ -27,7 +27,8 @@ DEL_FN: ;Current Dir ;[x] 15/10/23
CALL CHECK_NAME
;
RET Z
CALL LOADDIR
;
CALL LOADDIR ; [ ] big dir
CALL SEARCH.File
RET C
JP DELETE_REC_FAT ; ¯®¬¥â¨âì § ¯¨áì ª ª "㤠«¥­­ ï"

View File

@ -28,7 +28,7 @@ MKDIR:
;
.START: CALL SetPath_GetName ; â¥áâ ­  ¤®¯ãáâ. ¨¬ï ¨ ­ áâà. ­  ¤¨áª
RET C
; [ ] 26/06/2024
; [x] 26/06/2024 {64 kb cluster}
CALL CHECK_64kb_CLUSTER
RET C
;
@ -101,7 +101,7 @@ MKDIR:
INC HL
DJNZ .loop2
; [ ] big dir ¯¥à¥¤ ¢ âì ®âªã¤  ¨ ᪮«ìª® ¡ ©â®¢ ¨§¬¥­¨«®áì ¢ ªíè, ç⮡ ­¥ ¯¨á âì ­  ¤¨áª «¨è­¥£®
CALL WRT_HND ; αͺ<CEB1>―¨ΰ. ­<>γξ § ―¨αμ α―¨α<C2A8>ͺ €¨αͺ  (ͺ β «<C2A0>£ )
CALL WRITE_DIR_HANDLE ; ᪮¯¨à. ­®¢ãî § ¯¨áì ¢ ᯨ᮪ ¤¨áª  (ª â «®£ )
;CALL SAVEDIR ; ¨ á¡à®á¨âì ª¥è ª â «®£  ­  ¤¨áª
;
; á®§¤ ñ¬ á«ã¦¥¡­ë¥ ª â «®£¨ "." ¨ ".." ¢ á®§¤ ­­®¬ ª â «®£¥

View File

@ -19,7 +19,7 @@ RENAME: ;!TEST Current Dir ;[x] 15/10/23
;
; !TODO ¢®âª­ãâì âãâ SetPath_GetName, ç⮡ ¬®¦­® ¡ë«® 㤠«ïâì ¯® ®â­®á¨â¥«ì­ë¬ ¯ãâï¬?
;
; [ ] 26/06/2024
; [x] 26/06/2024 {64 kb cluster}
PUSH HL
CALL CHECK_64kb_CLUSTER
POP HL
@ -41,10 +41,10 @@ RENAME: ;!TEST Current Dir ;[x] 15/10/23
;
RET Z
PUSH DE
CALL LOADDIR ; ¯à®ç¨â âì ᯨ᮪ ª â «®£ 
CALL LOADDIR ; [ ] big dir ; ¯à®ç¨â âì ᯨ᮪ ª â «®£ 
;LD A,#33
LD A,FAT_ATTR.NoSYSnoVolID
CALL SEARCH.Custom ; ¯®¨áª § ¯¨á¨ ¢ ᯨ᪥ ¤¨áª 
CALL SEARCH.Custom ; ¯®¨áª § ¯¨á¨ "old_name.ext" ¢ ᯨ᪥ ¤¨áª 
POP HL
RET C
;LD DE,MASKARE
@ -62,7 +62,7 @@ RENAME: ;!TEST Current Dir ;[x] 15/10/23
RET Z
PUSH IX
LD A,FAT_ATTR.NoSYSnoVolID
CALL SEARCH.Custom ; ¯®¨áª § ¯¨á¨ ¢ ᯨ᪥ ¤¨áª 
CALL SEARCH.Custom ; ¯®¨áª § ¯¨á¨ "new_name.ext" ¢ ᯨ᪥ ¤¨áª 
POP IX
LD A,DSS_Error.sys.FILE_EXISTS
CCF
@ -77,7 +77,7 @@ RENAME: ;!TEST Current Dir ;[x] 15/10/23
LD BC,11
LDIR
;
CALL DELETE_LFN_RECORDS ; [ ] 㤠«¥­¨¥ § ¯¨á¨ LFN
CALL DELETE_LFN_RECORDS ; [ ] 㤠«¥­¨¥ § ¯¨á¨ LFN
;
EX AF,AF'
OUT (SLOT3),A

View File

@ -23,23 +23,17 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23
;
.START: CALL SetPath_GetName
RET C
; [ ] 26/06/2024
; [x] 26/06/2024 {64 kb cluster}
CALL CHECK_64kb_CLUSTER
RET C
;
CALL MASK
RET C
;!TEST optimization
;LD HL,MASKARE
;LD BC,11
;LD A,"?"
;CPIR
;LD A,DSS_Error.sys.INVALID_NAME
;SCF
CALL CHECK_NAME
;
CALL CHECK_NAME
RET Z
CALL LOADDIR
;
CALL LOADDIR ; [ ] big dir
CALL SEARCH.Dir
RET C
; fat32 ; [ ] CDFS

View File

@ -37,7 +37,7 @@ WRITE: ;!TEST ;!TODO 5/12/23 ; [ ]
LD A,(IY + _sFM.DRIVE)
CALL OPENDSK
JR C,.ERR1
; [ ] 26/06/2024
; [x] 26/06/2024 {64 kb cluster}
CALL CHECK_64kb_CLUSTER
RET C
;

View File

@ -85,13 +85,15 @@ RW_SECTOR: IN A,(SLOT3)
; [ ] 㤠«¥­¨¥ § ¯¨á¨ LFN
;
; ¢å®¤: IX = ⥪ãé ï § ¯¨áì ¢ áâà ­¨æ¥ á ª â «®£®¬ FAT ¤«ï ª®â®à®©
; ¢å®¤: IX = 㪠§ â¥«ì ­  ⥪ãéãî § ¯¨áì ¢ áâà ­¨æ¥ á ª â «®£®¬ FAT ¤«ï ª®â®à®©
; ­ ¤® 㤠«¨âì § ¯¨á¨ LFS
; [ ] big dir
DELETE_LFN_RECORDS:
PUSH IX
LD A,XH
AND #C0
SUB 1
DEC A
;SUB 1
LD C,A
; ॣ¨áâॠC ¬ áª  ¤«ï ®¯à¥¤¥«¥­¨ï ¢ë室  §  ¯à¥¤¥«ë áâà ­¨æë
;
@ -101,7 +103,7 @@ DELETE_LFN_RECORDS:
.loop: ADD IX,DE
LD A,XH
CP C
JR Z,.beyond_boundaries
JR Z,.beyond_boundaries ; [ ] big dir âãâ ­ ¤® ¯®¤£à㦠âì ¯à¥¤ë¤ã騩 DIR_BLOCK
;
LD A,FAT_ATTR.LFS_Entry
CP (IX+FAT_DIRECTORY_RECORD.ATTRIBUT)
@ -488,7 +490,7 @@ OPENDIR: LD IY,CORE_BUFFERS.FM_BUF
.REROOT: LD DE,0 ; !FIXIT ; [ ] CDFS - ¡à âì ¯¥à¢ë© ª« áâ¥à ¨§ ¯¥à¥¬¥­­®©
LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),DE
LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),DE
CALL LOADDIR
CALL LOADDIR ; [ ] big dir
; CF=0
LD HL,CORE_BUFFERS.WorkDirectory
LD (HL),'\'
@ -529,16 +531,20 @@ OPENDIR: LD IY,CORE_BUFFERS.FM_BUF
; fat32
.SUBDIR3: CALL FINDDIR
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
; [ ] big dir
; ...
;
;LD HL,#4000 ;!HARDCODE
;LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE),HL
;-------------; EX DE,HL
; JP LOADDIR
; <20>à®ç¨â âì ᯨ᮪ ª â «®£ 
; [x] fat32 ;!TEST
; ¢å®¤ (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L), (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H)
LOADDIR: ;!TODO optimize
CALL LOAD_SAVE_DIR_PREPARE
.next: PUSH AF
@ -553,31 +559,31 @@ LOADDIR: ;!TODO optimize
LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL
LD HL,(CORE_BUFFERS.FS_Buffer.RootDirStartCluster_H)
LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),HL
;LD HL,(CORE_BUFFERS.FS_Buffer.BytesPerCluster) ; !FIXIT ¢ëç¨â뢠âì ¯®«­®áâìî ª â «®£
LD HL,#4000 ; à §¬¥à ¤¨à¥ªâ®à¨¨ ;!HARDCODE
;LD HL,(CORE_BUFFERS.FS_Buffer.BytesPerCluster) ; !FIXIT ¢ëç¨â뢠âì ¯®«­®áâìî ª â «®£
LD HL,DIRPAGE.size ; à §¬¥à ¤¨à¥ªâ®à¨¨ ;!HARDCODE
LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE),HL
;
.read_dir: LD HL,DIRPAGE.buffer ; ªã¤ 
LD DE,#4000 ; ᪮«ìª®
XOR A ; ¤¥áªà¨¯â®à
CALL READ ; ç⥭¨¥ ¨§ ä ©« 
.read_dir: LD HL,DIRPAGE.buffer ; ªã¤ 
LD DE,DIRPAGE.size ; ᪮«ìª®
XOR A ; ¤¥áªà¨¯â®à
CALL READ ; ç⥭¨¥ ¨§ ä ©« 
EX AF,AF'
LD (SAVEDIR.DIRSIZE),DE ; ç¨á«® ¯à®ç¨â. ¡ ©â®¢
LD (SAVEDIR.DIRSIZE),DE ; ç¨á«® ¯à®ç¨â. ¡ ©â®¢
POP AF
OUT (SLOT3),A
EX AF,AF'
RET
;
.LoadRootDir: LD HL,(CORE_BUFFERS.FS_Buffer.RootDirFirstSector_H) ;!TODO ¢®§¬®¦­®, 墠â¨â LD HL,0
LD IX,(CORE_BUFFERS.FS_Buffer.RootDirFirstSector_L) ; ­®¬¥à «®£. ᥪâ®à 
.LoadRootDir: 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-ª â «®£ 
CP B
JR NC,.RTD1
;
LD B,A ; ç¨á«® ᥪâ®à®¢
.RTD1: LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) ; ­®¬¥à ¤¨áª 
.RTD1: LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) ; ­®¬
¥à ¤¨áª 
LD DE,DIRPAGE.buffer ; ¡ãä¥à
LD C,Dss.DRV.Read ; ç⥭¨¥ ᥪâ®à®¢
RST ToDSS.DRV
@ -594,133 +600,46 @@ LOADDIR: ;!TODO optimize
;----------------------------------------------------------------------;
ld
; ¤®¤¥« âì ¯¥à¥¤ çã ID § ¯¨á¨ ¤¨à¥ªâ®à¨¨ ¨ § £à㧪¨ ¯® ­¥© ­ã¦­®£® ªã᪠ ¢ ªíè
;!TODO FAT procedures
;----------------------------------------------------------------------;
/*
LOAD_SAVE_DIR_PREPARE:
;!TODO optimize
XOR A ; FILE MANIPULATOR = 0
LD H,A
LD L,A
LD IX,0
LD B,A ; ®â ­ ç «  ä ©« 
CALL MOVE_FP
SET_PAGE_X DIRPAGE
AND A
PUSH AF
;
LD A,(CORE_BUFFERS.FS_Buffer.DRIVE)
LD (CORE_BUFFERS.FM_BUF.DRIVE),A
;;;;;;;;
;LD A,(IY+_sFM.FS_REC.FIRST_CLUSTER_L)
;OR (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1)
;OR (IY+_sFM.FS_REC.FIRST_CLUSTER_H)
;OR (IY+_sFM.FS_REC.FIRST_CLUSTER_H+1)
;
XOR A
LD D,#40
LD E,A
LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L)
EXX
LD D,A
LD E,A
LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H)
OR H
OR L
EXX
OR H
OR L
;;;;;;;;
PUSH AF
CALL NZ,.CalcDirSize
;
LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE),DE
EXX
LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE + 2),DE
POP AF
EX AF,AF'
POP AF
RET
;
.CalcDirSize: ; calc dir size in clusters
LD DE,0
;LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L)
;EXX
; LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H)
.loop: ; ;
;EXX
INC DE ; <20> ¤¥¥¬áï âãâ ­  â®, ç⮠ᯥæ¨ä¨ª æ¨ï ¢ë¯®«­ï¥âáï ¨ ¯¥à¥¯®«­¥­¨ï ­¥ ¡ã¤¥â
PUSH DE
CALL READ_FROM_FAT
EX DE,HL
POP DE
EXX
EX DE,HL
EXX
JR NC,.loop
;
; DE - à §¬¥à ¤¨à¥ªâ®à¨¨ ¢ ª« áâ¥à å
;!FIXIT ¬®¦­® ®¯â¨¬¨§­ãâì ª®«-¢® ᤢ¨£®¢
;0001 0000 0000 0000 max ª®«-¢® ª« áâ¥à®¢
; ¯à¨¬¥à
;0000 0000 0000 0111 Clusters
; 0100 0000 SectorsPerCluster
;0000 0010 0000 0000 BytesPerSector
; D' E' D E
;0000 0000 0000 0011 1000 0000 0000 0000
;
LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster)
LD BC,(CORE_BUFFERS.FS_Buffer.BytesPerSector)
; DE':DE - ª®«-¢® ª« áâ¥à®¢
; A - à §¬¥à ª« áâ¥à  ¢ ᥪâ®à å
; BC - à §¬¥à ᥪâ®à  ¢ ¡ ©â å
; --> DE*BC*A = DE':DE ¤«ï ®â¢¥â  墠â¨â, ¯®å®¤ã, 4å ॣ¨áâ஢
EXX
LD DE,0
EXX
SRL B
RR C
RRCA
JR C,.loop2
;
.loop1: ;
SLA E
RL D
EXX
RL E
RL D
;RL C
EXX
;
RRCA
JR NC,.loop1
;
.loop2: ;
SLA E
RL D
EXX
RL E
RL D
;RL C
EXX
;
SRL B
RR C
JR NC,.loop2
; <-- DE*BC*A = DE':DE
RET
*/
; ‚室:
; ID § ¯¨á¨, ª®â®àë© ¤®«¦¥­ ¯®¯ áâì ¢ Š<>˜
; HL - ID § ¯¨á¨, ª®â®àë© ¤®«¦¥­ ¯®¯ áâì ¢ Š<>˜
LOAD_SAVE_DIR_PREPARE:
;!TODO optimize
XOR A ; FILE MANIPULATOR = 0
LD H,A
; [ ] ‚室: HL - ID § ¯¨á¨, ª®â®àë© ¤®«¦¥­ ¯®¯ áâì ¢ Š<>˜
; [ ] ‚ë室: HLIX - ᬥ饭¨¥ ¢ ä ©«¥ ª â «®£  ­  ­ã¦­ë© ¡«®ª ¯® #4000 ¡ ©â®¢
; HLIX = (HL*32) & #1FC000 ᬥ饭¨¥ ­  ­ã¦­ë© ¡«®ª ¯® #4000 ¡ ©â®¢
XOR A
LD XL,A
LD L,A
LD IX,0
LD B,A ; ®â ­ ç «  ä ©« 
CALL MOVE_FP
LD A,H
AND #0E
RRA
RR L
RRA
RR L
RRA
RR L
LD E,L
LD XH,E
LD L,A
; ;
;
; A = ­®¬¥à ¡«®ª  ªíè ¤¨à¥ªâ®à¨¨
RL E
RLA
RL E
RLA
LD (CORE_BUFFERS.FS_Buffer.DIR_BLOCK),A
;
XOR A ; FILE MANIPULATOR = 0
;LD H,A
;LD L,A
;LD IX,0
LD B,A ; ®â ­ ç «  ä ©« 
CALL MOVE_FP
SET_PAGE_X DIRPAGE
AND A
@ -839,11 +758,12 @@ LOAD_SAVE_DIR_PREPARE:
;----------------------------------------------------------------------;
; [ ] big dir
; ᪮¯¨à®¢ âì § ¯¨áì ¢ ᯨ᮪ ¤¨áª  (ª â «®£ ) de ix iy
; ¨ á¡à®á¨âì ª¥è ª â «®£  ­  ¤¨áª
; ¢å®¤: (HANDBUF) - § ¯¨áì ª â «®£ 
; ¢ë室: DE - record index
WRT_HND:
WRITE_DIR_HANDLE:
SET_PAGE_X DIRPAGE
EX AF,AF'
LD HL,DIRPAGE.buffer
@ -1047,13 +967,13 @@ FAT_BPB: LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE)
LD BC,(CORE_BUFFERS.FS_Buffer.BytesPerSector)
LD A,B
AND A
;
RL C
RLA
RL C
RLA
RL C
RLA
; BytesPerSector/FAT_DIRECTORY_RECORD (32)
RL C
RLA
RL C
RLA
RL C
RLA
;
LD C,A
LD B,0 ; BC - File handels per sector
@ -3019,7 +2939,7 @@ GET_OFFSET_IN_SECTORS:
;----------------------------------------------------------------------;
; [x] 26/06/2024& read only 64kb cluster ; !TODO cluster 64kb
; [x] 26/06/2024 {64 kb cluster} read only 64kb cluster ; !TODO cluster 64kb
CHECK_64kb_CLUSTER:
LD HL,(CORE_BUFFERS.FS_Buffer.BytesPerCluster)
; CF=0

View File

@ -111,8 +111,8 @@
.UPD_FSINFO: BYTE 0
.FREE_CLUSTERS_COUNT_L: WORD #FFFF
.FREE_CLUSTERS_COUNT_H: WORD #FFFF
.DIR_BLOCK BYTE #00 ; ª ª®© ¡«®ª ¤¨à¥ªâ®à¨¨ § £à㦥­ ¢ ªíè ¤¨à¥ªâ®à¨© DIRPAGE
.DIR_BLOCK_CHANGES DWORD #00000000 ; ª ª¨¥ ¨§ ªã᪮¢ ¢ ¡«®ª¥ ªíè DIRPAGE ¨§¬¥­¨«¨áì ¤® á®åà ­¥­¨ï
.DIR_BLOCK BYTE #00 ; [ ] big dir. ª ª®© ¡«®ª ¤¨à¥ªâ®à¨¨ § £à㦥­ ¢ ªíè ¤¨à¥ªâ®à¨© DIRPAGE
.DIR_BLOCK_CHANGES DWORD #00000000 ; [ ] big dir. ª ª¨¥ ¨§ ªã᪮¢ ¢ ¡«®ª¥ ªíè DIRPAGE ¨§¬¥­¨«¨áì ¤® á®åà ­¥­¨ï
;.FilesPerSector: BYTE #00 ; ç¨á«® ä ©«®¢ëå § ¯¨á¥© ¢ ᥪâ®à¥
;.ClustersPerBank: BYTE #00 ; A - Clusters per bank (16k) (ç¨á«® ª« áâ¥à®¢ ­  ¡«®ª އ“)
;.READ_PG: BYTE #00 ;!TODO ­¥ ¨á¯®«ì§ãîâáï ­¥ª®â®àë¥ §­ ç¥­¨ï, ­® § ¤ã¬ª  ­¥¯«®å ï)))

View File

@ -1,6 +1,21 @@
<EFBFBD>® ¯®«­ë¬ ¤¨à¥ªâ®à¨ï¬.
;[ ] <20>¥à¥¤¥« âì WRITE_DIR_HANDLE ¤«ï à ¡®âë á «î¡®© § ¯¨áìî ¢ ª â «®£¥ (ᥩç á ¨é¥â ¯¥à¢ãî ¯ãáâãî, ç⮡ § ¯¨á âì ¢ ­¥ñ)
;[ ] ‚ᥠ¨§¬¥­¥­¨ï ¢ § ¯¨áïå ª â «®£  ¤¥« âì ¢ ¡ãä¥à¥ CORE_BUFFERS.HANDBUF ¨ á®åà ­ïâì ç¥à¥§ WRITE_DIR_HANDLE
;[ ] <20>¥à¥¬¥­­ ï DIR_BLOCK ¯®ª §ë¢ îé ï ª ª®© ¡«®ª ¤¨à¥ªâ®à¨¨ ¢ ªíè.
;[ ] <20>¥à¥¬¥­­ ï DIR_BLOCK_CHANGED ¯®ª §ë¢ îé ï ª ª®© ¨§ ªã᪮¢ ¢ ¡«®ª¥ ªíè ¨§¬¥­¨«áï ¤® á®åà ­¥­¨ï. Š ª ¢ FAT.
;[ ] <20>à®æ¥¤ãàë ¬¥­ïî騥 ¤ ­­ë¥ ¢ ªíè ¤¨à¥ªâ®à¨¨ ¤®«¦­ë ¬¥­ïâì DIR_BLOCK_CHANGED.
;[ ] <20>¥à¥¤ ¢ âì ¢ LOADDIR ­ã¦­ë© ¡«®ª ¤«ï § £à㧪¨ ¢ ªíè (¨«¨ ­®¬¥à ­ã¦­®© § ¯¨á¨ ª â «®£ ).
;[ ] <20>¥à¥¤ ¢ âì ¢ SAVEDIR ­ã¦­ë© ¡«®ª ¤«ï § ¯¨á¨ ¨§ ªíè (¨«¨ ­®¬¥à ­ã¦­®© § ¯¨á¨ ª â «®£ ).
;[ ] LOAD_SAVE_DIR_PREPARE ¯®å®¤ã, ¯¥à¥¤¥« âì ª å¥à ¬ ¢¬¥á⥠á LOADDIR ¨ SAVEDIR
<EFBFBD>¥à¥«®¯ â¨âì
;[ ] LOAD_SAVE_DIR_PREPARE
;[ ] LOADDIR
;[ ] SAVEDIR
;[ ] RENAME
;[ ] CLOSE_FN
;[ ] DEL_FN
;[ ] RMDIR
;[ ] OPENDIR
;[ ] DELETE_LFN_RECORDS

View File

@ -73,6 +73,7 @@ MINIMUM_BIOS_VERSION EQU 3*256 + 06 ; version 3.06
; ªíè ᯨ᪠ ª â «®£ 
DIRPAGE EQU 0 + (low BANKTBL)
.buffer EQU #C000
.size EQU #4000
FATPAGE EQU 1 + (low BANKTBL)
.cache EQU #C000
TXTPAGE EQU 2 + (low BANKTBL)

View File

@ -291,7 +291,7 @@ ACCESS DEFB #00
HANDBUF DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
;WRITE_DIR_HANDLE
WRT_HND LD A,DIRPAGE
CALL BANK
PUSH AF

377
TMP_CODE.ASM Normal file
View File

@ -0,0 +1,377 @@
FAT_BPB: LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE)
CP #F0
JP C,RD_BPB.UnknownBPB
; PREPARE
XOR A
LD (.UsesVarsFAT32),A
;
;EXX
LD H,A
LD L,A
LD D,A
LD E,A
EXX
;[ ] fat32
LD B,A
LD C,A
LD (CORE_BUFFERS.FS_Buffer.SectorsPerFAT_H),A ; [ ] fat32
;
LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.BytesPerSector)
LD (CORE_BUFFERS.FS_Buffer.BytesPerSector),HL
LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerCluster)
LD (CORE_BUFFERS.FS_Buffer.SectorsPerCluster),A
; calc. first sector FAT
LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RESERVED_SECTORS)
LD (CORE_BUFFERS.FS_Buffer.FAT1_SEC_L),HL ; low word first sector FAT #1
LD (CORE_BUFFERS.FS_Buffer.FAT2_SEC_L),HL ; low word first sector FAT #2
;[ ] fat32
LD (CORE_BUFFERS.FS_Buffer.FAT1_SEC_H),BC ; high word first sector FAT #1 ; [ ] fat32
LD (CORE_BUFFERS.FS_Buffer.FAT2_SEC_H),BC ; high word first sector FAT #1 ; [ ] fat32
LD (CORE_BUFFERS.FS_Buffer.RootDirFirstSector_H),BC
;LD (CORE_BUFFERS.FS_Buffer.END_CHAIN_CLUSTER_H),BC ; [ ] fat32 reset variables
;
;
LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT16)
LD A,E
OR D
JR NZ,.skip_high
;
LD (.UsesVarsFAT32),A
/*
0001 0000 0000 0000 max ª®«-¢® ª« áâ¥à®¢
0000 0000 0000 0111 Clusters
0100 0000 SectorsPerCluster
0000 0010 0000 0000 BytesPerSector
D' E' D E
0000 0000 0000 0011 1000 0000 0000 0000
#FFFF<<5 = #1FFFE0 = 0000 0000 0001 1111 1111 1111 1110 0000
#FFFF ­®¬¥à § ¯¨á¨
#1FFFE0 ᬥ饭¨¥ ­  § ¯¨áì ¢ ä ©«¥ ¤¨à¥ªâ®à¨¨
#1FFFE0 & #1FC000 ᬥ饭¨¥ ­  ­ã¦­ë© ¡«®ª ¯® #4000 ¡ ©â®¢
#1FFFE0 & #3FFF ¤à¥á ­ã¦­®© ¯®§¨æ¨¨ ¢ ªíè
(#1FFFE0 & #1FC000)<<2 ¤¢¨£ ¥¬ ¡ ©â 2 ¨ 3 ç⮡ ¯®«ãç¨âì ­®¬¥à ¡«®ª 
H L
0000 1011 1101 0001 3025
0001 0111 1010 0010 0000 3025*32
0001 0100 0000 0000 0000 and #1FC000
0011 1010 0010 0000 addr in page
H L
1111 1111 1111 1111 65535
0001 1111 1111 1111 1110 0000 65535*32
L Xh Xl
0001 1111 1100 0000 0000 0000 and #1FC000
0011 1010 0010 0000 addr in page
1 0111 1010 001
0000 0001 0111 1010 0010 0000
*/
; <20>à®ç¨â âì ᯨ᮪ ª â «®£ 
; [x] fat32 ;!TEST
LOADDIR: ;!TODO optimize
CALL LOAD_SAVE_DIR_PREPARE
.next: PUSH AF
EX AF,AF'
JR NZ,.read_dir ; root dir or not
; root dir
LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE)
CP FAT_TYPE.x32
JR NZ,.LoadRootDir
; fat32
LD HL,(CORE_BUFFERS.FS_Buffer.RootDirStartCluster_L)
LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL
LD HL,(CORE_BUFFERS.FS_Buffer.RootDirStartCluster_H)
LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),HL
;LD HL,(CORE_BUFFERS.FS_Buffer.BytesPerCluster) ; !FIXIT ¢ëç¨â뢠âì ¯®«­®áâìî ª â «®£
LD HL,DIRPAGE.size
LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE),HL
;
.read_dir: LD HL,DIRPAGE.buffer ; ªã¤ 
LD DE,DIRPAGE.size ; ᪮«ìª®
XOR A ; ¤¥áªà¨¯â®à
CALL READ ; ç⥭¨¥ ¨§ ä ©« 
EX AF,AF'
LD (SAVEDIR.DIRSIZE),DE ; ç¨á«® ¯à®ç¨â. ¡ ©â®¢
POP AF
OUT (SLOT3),A
EX AF,AF'
RET
;
.LoadRootDir: 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-ª â «®£ 
CP B
JR NC,.RTD1
;
LD B,A ; ç¨á«® ᥪâ®à®¢
.RTD1: LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) ; ­®¬¥à ¤¨áª 
LD DE,DIRPAGE.buffer ; ¡ãä¥à
LD C,Dss.DRV.Read ; ç⥭¨¥ ᥪâ®à®¢
RST ToDSS.DRV
; !FIXIT ­¥â ¯à®¢¥àª¨ ­  ®è¨¡ªã
; 21/04/2025 fix ¬ãá®à ¢ áâà ­¨æ¥ ª â «®£ , ¥á«¨ ª â «®£ ¬¥­ìè¥ áâà ­¨æë
BIT 7,D
JR Z,.exit
XOR A
LD (DE),A
;
.exit: POP AF
OUT (SLOT3),A
RET
; <20>à®ç¨â âì ᯨ᮪ ª â «®£ 
; ‚室:
; (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L), (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H)
; [ ] ID § ¯¨á¨, ª®â®àë© ¤®«¦¥­ ¯®¯ áâì ¢ Š<>˜
LOAD_SAVE_DIR_PREPARE:
;!TODO optimize
XOR A ; FILE MANIPULATOR = 0
LD H,A
LD L,A
LD IX,0
LD B,A ; ®â ­ ç «  ä ©« 
CALL MOVE_FP
;
SET_PAGE_X DIRPAGE
AND A
PUSH AF
;
LD A,(CORE_BUFFERS.FS_Buffer.DRIVE)
LD (CORE_BUFFERS.FM_BUF.DRIVE),A
;;;;;;;;
;LD A,(IY+_sFM.FS_REC.FIRST_CLUSTER_L)
;OR (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1)
;OR (IY+_sFM.FS_REC.FIRST_CLUSTER_H)
;OR (IY+_sFM.FS_REC.FIRST_CLUSTER_H+1)
;
XOR A
LD D,#40
LD E,A
LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L)
EXX
LD D,A
LD E,A
LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H)
OR H
OR L
EXX
OR H
OR L
;;;;;;;;
PUSH AF
CALL NZ,.CalcDirSize
;
LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE),DE
EXX
LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE + 2),DE
POP AF
EX AF,AF'
POP AF
RET
;
.CalcDirSize: ; calc dir size in clusters
LD DE,0
;LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L)
;EXX
; LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H)
.loop: ; ;
;EXX
INC DE ; <20> ¤¥¥¬áï âãâ ­  â®, ç⮠ᯥæ¨ä¨ª æ¨ï ¢ë¯®«­ï¥âáï ¨ ¯¥à¥¯®«­¥­¨ï ­¥ ¡ã¤¥â
PUSH DE
CALL READ_FROM_FAT
EX DE,HL
POP DE
EXX
EX DE,HL
EXX
JR NC,.loop
;
; DE - à §¬¥à ¤¨à¥ªâ®à¨¨ ¢ ª« áâ¥à å
;!FIXIT ¬®¦­® ®¯â¨¬¨§­ãâì ª®«-¢® ᤢ¨£®¢
;0001 0000 0000 0000 max ª®«-¢® ª« áâ¥à®¢
; ¯à¨¬¥à
;0000 0000 0000 0111 Clusters
; 0100 0000 SectorsPerCluster
;0000 0010 0000 0000 BytesPerSector
; D' E' D E
;0000 0000 0000 0011 1000 0000 0000 0000
;
LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster)
LD BC,(CORE_BUFFERS.FS_Buffer.BytesPerSector)
; DE':DE - ª®«-¢® ª« áâ¥à®¢
; A - à §¬¥à ª« áâ¥à  ¢ ᥪâ®à å
; BC - à §¬¥à ᥪâ®à  ¢ ¡ ©â å
; --> DE*BC*A = DE':DE ¤«ï ®â¢¥â  墠â¨â, ¯®å®¤ã, 4å ॣ¨áâ஢
EXX
LD DE,0
EXX
SRL B
RR C
RRCA
JR C,.loop2
;
.loop1: ;
SLA E
RL D
EXX
RL E
RL D
;RL C
EXX
;
RRCA
JR NC,.loop1
;
.loop2: ;
SLA E
RL D
EXX
RL E
RL D
;RL C
EXX
;
SRL B
RR C
JR NC,.loop2
; <-- DE*BC*A = DE':DE
RET
/* 4 3 2 1
#FFFF<<5 = #1FFFE0 = 0000 0000 0001 1111 1111 1111 1110 0000
#FFFF ­®¬¥à § ¯¨á¨
#1FFFE0 ᬥ饭¨¥ ­  § ¯¨áì ¢ ä ©«¥ ¤¨à¥ªâ®à¨¨
#1FFFE0 & #1FC000 ᬥ饭¨¥ ­  ­ã¦­ë© ¡«®ª ¯® #4000 ¡ ©â®¢
#1FFFE0 & #3FFF ¤à¥á ­ã¦­®© ¯®§¨æ¨¨ ¢ ªíè
(#1FFFE0 & #1FC000)<<2 ¤¢¨£ ¥¬ ¡ ©â 2 ¨ 3 ç⮡ ¯®«ãç¨âì ­®¬¥à ¡«®ª 
*/
;----------------------------------------------------------------------;
; [ ] big dir
; ᪮¯¨à®¢ âì § ¯¨áì ¢ ᯨ᮪ ¤¨áª  (ª â «®£ ) de ix iy
; ¨ á¡à®á¨âì ª¥è ª â «®£  ­  ¤¨áª
; ¢å®¤: (HANDBUF) - § ¯¨áì ª â «®£ 
; ¢ë室: DE - record index
WRITE_DIR_HANDLE:
SET_PAGE_X DIRPAGE
EX AF,AF'
LD HL,DIRPAGE.buffer
;!TEST 9/11/23 record index
EXX
LD DE,0
EXX
;
LD BC,FAT_DIRECTORY_RECORD
.loop: ;LD A,(IX+00)
LD A,(HL)
OR A
JR Z,.WRT_HN2
CP #E5
JR Z,.WRT_HN2
;ADD IX,BC
ADD HL,BC
JR NC,.loop ;!FIXIT ª®«¨ç¥á⢮ § ¯¨á¥© ª â «®£  = áâà ­¨æ 
;
EX AF,AF'
OUT (SLOT3),A
LD A,DSS_Error.sys.ROOT_OVERFLOW
SCF
RET
;
.WRT_HN2: ;LD D,XH
;LD E,XL
EX DE,HL
LD HL,CORE_BUFFERS.HANDBUF
LD BC,CORE_BUFFERS.HANDBUF.SIZE
LDIR
EX AF,AF'
OUT (SLOT3),A
; ¯à®¢¥à塞, 㢥«¨ç¨«áï «¨ à §¬¥à ¤ ­­ëå ¤¨à¥ªâ®à¨¨
LD HL,DIRPAGE.buffer
LD BC,(SAVEDIR.DIRSIZE)
DEC BC
ADD HL,BC
AND A
SBC HL,DE
JR NC,.SAVEDIR
;
; à §¬¥à ¤ ­­ëå ¤¨à¥ªâ®à¨¨ 㢥«¨ç¨«áï
LD HL,(SAVEDIR.DIRSIZE)
LD BC,(CORE_BUFFERS.FS_Buffer.BytesPerCluster)
ADD HL,BC
LD (SAVEDIR.DIRSIZE),HL
AND A
.SAVEDIR: EXX
PUSH DE
EXX
; [ ] big dir ¯¥à¥¤ ¢ âì ®âªã¤  ¨ ᪮«ìª® ¡ ©â®¢ ¨§¬¥­¨«®áì ¢ ªíè, ç⮡ ­¥ ¯¨á âì ­  ¤¨áª «¨è­¥£®
CALL SAVEDIR
POP DE
RET
;----------------------------------------------------------------------;
; ‘¡à®á¨âì ª¥è ª â «®£  ­  ¤¨áª.
; ¢å®¤: iy=áâàãªâãà  ¤¥áªà¨¯â®à 
; [ ] big dir ¯®«ãç âì ®âªã¤  ¨ ᪮«ìª® ¡ ©â®¢ ¨§¬¥­¨«®áì ¢ ªíè, ç⮡ ­¥ ¯¨á âì ­  ¤¨áª «¨è­¥£®
SAVEDIR: ;!TODO optimize
CALL LOAD_SAVE_DIR_PREPARE
PUSH AF
EX AF,AF'
JR NZ,.save_dir
;
LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE)
CP FAT_TYPE.x32
JR NZ,.SaveRootDir
; fat32
LD HL,(CORE_BUFFERS.FS_Buffer.RootDirStartCluster_L)
LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL
LD HL,(CORE_BUFFERS.FS_Buffer.RootDirStartCluster_H)
LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),HL
;
.save_dir: LD HL,DIRPAGE.buffer
; à §¬¥à ᯨ᪠ ª â «®£  size_cash_directory
;!FIXIT ¥á«¨ ®­  ­ã¦­ , â® ¯à®¢¥à¨âì ­  ¡ £¨ (­ ¯à¨¬¥à, à §¬¥à ¤¨à४â®à¨¨ ¬¥­ìè¥ ¯à¨ ®âªàë⨨ ¨ ¡®«ìè¥ ¯®á«¥ ¯à ¢®ª)
; ª®£¤  ¡ã¤¥â ç⥭¨¥ ªã᪠¬¨ ª â «®£  ¢ ªíè, âãâ ¥éñ áçñâ稪 ¯à¨ªàãâ¨âì
.DIRSIZE+1: LD DE,0
XOR A
CALL WRITE
POP AF
OUT (SLOT3),A
RET
;
.SaveRootDir: 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, Root Dir max size in sectors
SUB B
JR NC,.RTD1S
ADD A,B
LD B,A
.RTD1S: LD A,(CORE_BUFFERS.FS_Buffer.DRIVE)
LD DE,DIRPAGE.buffer
LD C,Dss.DRV.Write
RST ToDSS.DRV
POP AF
OUT (SLOT3),A
RET