доделать OPENDIR

This commit is contained in:
Tolik Trek 2026-01-04 08:02:59 +10:00
parent cfb3543373
commit 53d3408ec0
20 changed files with 286 additions and 188 deletions

View File

@ -27,6 +27,8 @@ MAX_SECTORS_PER_PAGE EQU #20 ;
LOAD_SECTORS EQU SECTORS_OF_LOADER.AFTER_BPB LOAD_SECTORS EQU SECTORS_OF_LOADER.AFTER_BPB
LOADER_IN_BPB: LOADER_IN_BPB:
.MAX_SIZE EQU _sBOOT_SECTOR.PARTITION_TABLE - _sBOOT_SECTOR_PARAMS_FAT32 .MAX_SIZE EQU _sBOOT_SECTOR.PARTITION_TABLE - _sBOOT_SECTOR_PARAMS_FAT32
FATPAGE:
.cache EQU #C000
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
DISP ORG_ADDRESS DISP ORG_ADDRESS

View File

@ -10,7 +10,7 @@
; INPUT: HL - "C:\DIR\DIR\DIR_NAME[\]",0 ; INPUT: HL - "C:\DIR\DIR\DIR_NAME[\]",0
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
CHDIR_FN: CHDIR_FN:
;!TEST Current Dir ;[x] 15/10/23 ; Current Dir 15/10/23
; ;
PUSH HL PUSH HL
CALL DIR_PATH_CHECK CALL DIR_PATH_CHECK
@ -32,5 +32,5 @@ CHDIR: CALL SetPath_GetName ;
LD A,(HL) LD A,(HL)
OR A OR A
RET Z RET Z
JP OPENDIR JP OPENDIR ; !FIXIT ¢®§¬®¦­®, çâ® ¨§¡ëâ®ç­® ¯®á«¥ SetPath_GetName
; ;

View File

@ -1,24 +0,0 @@
////////////////////////////////////////////////////////////////////////
;
;
////////////////////////////////////////////////////////////////////////
CHDISK_FN: CALL CHDISK
RET C
PUSH AF
CALL DIR_PATH_CHANGE.FullCurrent
POP AF
RET
CHDISK: ;[x] ¡®«¥¥ ª®à४⭠ï ᬥ­  ¤¨áª 
CALL OPENDSK
;
;R010
RET C
LD HL,CORE_BUFFERS.WorkDirectory
LD (HL),0
PUSH AF
CALL OPENDIR
POP BC
RET C
LD A,B
RET
;

View File

@ -1,4 +1,3 @@
; [x] fat32 ;!TEST
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
;‚室­ë¥ §­ ç¥­¨ï: ;‚室­ë¥ §­ ç¥­¨ï:
; C - #12 ; C - #12
@ -28,14 +27,14 @@ CLOSE_FN: LD (.TMP),A
LD D,(IY+_sFM.DIR_CLUSTER_H+1) LD D,(IY+_sFM.DIR_CLUSTER_H+1)
PUSH DE PUSH DE
; ;
; [x] 15/11/2023 -bug with bad clusters ;!TEST ; 15/11/2023 -bug with bad clusters
LD A,(IY+_sFM.DRIVE) LD A,(IY+_sFM.DRIVE)
CALL OPENDSK CALL OPENDSK
JR C,.error JR C,.error
; ;
XOR A XOR A
CALL SET_FM CALL SET_FM
; [x] fat32 ; fat32
POP DE POP DE
LD (IY+_sFM.DIR_CLUSTER_H),E LD (IY+_sFM.DIR_CLUSTER_H),E
LD (IY+_sFM.DIR_CLUSTER_H+1),D LD (IY+_sFM.DIR_CLUSTER_H+1),D
@ -45,11 +44,13 @@ CLOSE_FN: LD (.TMP),A
POP DE POP DE
LD (IY+_sFM.DIR_CLUSTER_L),E LD (IY+_sFM.DIR_CLUSTER_L),E
LD (IY+_sFM.DIR_CLUSTER_L+1),D LD (IY+_sFM.DIR_CLUSTER_L+1),D
; [x] 15/11/2023 -bug with bad clusters ;!TEST ; 15/11/2023 -bug with bad clusters
LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L),E LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L),E
LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1),D LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1),D
; ;
CALL LOADDIR ; [ ] big dir LD L,(IY+_sFM.HANDLE)
LD H,(IY+_sFM.HANDLE+1)
CALL LOADDIR.Custom ; [ ] big dir
; [ ] big dir ; [ ] big dir
;!TODO ®â¬®â âì ªíè ¤® ­ã¦­®£® record index? ;!TODO ®â¬®â âì ªíè ¤® ­ã¦­®£® record index?
; ;

View File

@ -3,7 +3,7 @@
; A - File attribute ; A - File attribute
; OUTPUT: A - FM ; OUTPUT: A - FM
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
CREATE: ;!TEST Current Dir ;[x] 15/10/23 ;CREATE_FN: CREATE: ; Current Dir 15/10/23 ;CREATE_FN:
PUSH HL PUSH HL
LD C,A LD C,A
; ;
@ -31,7 +31,7 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 ;CREATE_FN:
; ;
; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 ; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00
; OUTPUT: A - FM ; OUTPUT: A - FM
.NEW: ;!TEST Current Dir ;[x] 15/10/23 .NEW: ; Current Dir 15/10/23
PUSH HL PUSH HL
LD C,A LD C,A
; ;
@ -97,7 +97,7 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 ;CREATE_FN:
LD (.PATH0),HL LD (.PATH0),HL
CALL SetPath_GetName CALL SetPath_GetName
RET C RET C
; [x] 26/06/2024 {64 kb cluster} ; 26/06/2024 {64 kb cluster}
CALL CHECK_64kb_CLUSTER CALL CHECK_64kb_CLUSTER
RET C RET C
; ;

View File

@ -1,31 +1,22 @@
; [x] fat32 ;!TEST
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
; INPUT: HL - "c:\dir\filename.ext",#00 without simbols * ? ; INPUT: HL - "c:\dir\filename.ext",#00 without simbols * ?
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
DEL_FN: ;Current Dir ;[x] 15/10/23 DEL_FN: ; Current Dir 15/10/23
PUSH HL PUSH HL
CALL DIR_PATH_CHECK CALL DIR_PATH_CHECK
POP HL POP HL
RET C RET C
; ;
CALL SetPath_GetName ; â¥áâ ­  ¤®¯ãáâ. ¨¬ï ¨ ­ áâà. ­  ¤¨áª CALL SetPath_GetName ; â¥áâ ­  ¤®¯ãáâ. ¨¬ï ¨ ­ áâà. ­  ¤¨áª
RET C RET C
; [x] 26/06/2024 {64 kb cluster} ; [x] 26/06/2024 {64 kb cluster}
CALL CHECK_64kb_CLUSTER CALL CHECK_64kb_CLUSTER
RET C
;
CALL MASK
RET C RET C
; ;
;!TEST optimization CALL MASK
;LD HL,MASKARE RET C
;LD BC,11
;LD A,"?"
;CPIR
;LD A,DSS_Error.sys.INVALID_NAME
;SCF
CALL CHECK_NAME
; ;
CALL CHECK_NAME
RET Z RET Z
; ;
CALL LOADDIR ; [ ] big dir CALL LOADDIR ; [ ] big dir

View File

@ -350,18 +350,17 @@ _TST_PROC: CALL GETMEM
LD DE,RAMMAP LD DE,RAMMAP
LD A,H LD A,H
AND #C0 AND #C0
;!TEST
CP #80 CP #80
JR Z,FR8000 JR Z,.from_8000
JR NC,FRC000 JR NC,.from_C000
; ; from_4000
FR4000: LD A,(DE) LD A,(DE)
OUT (SLOT1),A OUT (SLOT1),A
INC DE INC DE
FR8000: LD A,(DE) .from_8000: LD A,(DE)
OUT (SLOT2),A OUT (SLOT2),A
INC DE INC DE
FRC000: LD A,(DE) .from_C000: LD A,(DE)
OUT (SLOT3),A OUT (SLOT3),A
;CALL M_PSP ;CALL M_PSP
; ;
@ -388,11 +387,9 @@ _TST_PROC_2:
EX DE,HL EX DE,HL
LD XH,D LD XH,D
LD XL,E LD XL,E
;LD HL,(CORE_BUFFERS.EXEBUFF.PC_REG)
LD DE,RETFAR ;  ¤à¥á ¯/¯ "­¥®¦¨¤ ­­®¥ § ¢¥à襭¨¥ ¯à®æ¥áá " LD DE,RETFAR ;  ¤à¥á ¯/¯ "­¥®¦¨¤ ­­®¥ § ¢¥à襭¨¥ ¯à®æ¥áá "
PUSH DE PUSH DE
;PUSH HL ; Current Dir 15/10/23
;!TEST Current Dir ;[x] 15/10/23
PUSH IX PUSH IX
LD HL,CORE_BUFFERS.CurrentPath LD HL,CORE_BUFFERS.CurrentPath
LD A,(CORE_BUFFERS.EXEBUFF.VERSION) LD A,(CORE_BUFFERS.EXEBUFF.VERSION)
@ -711,12 +708,12 @@ FINDPATH:
POP AF POP AF
RET RET
.MAKE_PATH_ARRAY: .MAKE_PATH_ARRAY:
LD HL,ENVPAGE.PATH_PNT_ARRAY-1 ;R04 -1 LD HL,ENVPAGE.PATH_PNT_ARRAY-1
LD DE,ENVPAGE.ENVTEMP-1 LD DE,ENVPAGE.ENVTEMP-1
LD B,#00 LD B,#00
.NEXTAR: .NEXTAR:
LD (HL),C ;R04 LD (HL),C
INC HL ;R04 INC HL
XOR A XOR A
LD (DE),A LD (DE),A
LD C,A LD C,A
@ -725,8 +722,6 @@ FINDPATH:
INC HL INC HL
LD (HL),D LD (HL),D
INC HL INC HL
;R04 LD (HL),C
;R04 INC HL
INC B INC B
.NEXTRT: .NEXTRT:
LD A,(DE) LD A,(DE)
@ -747,8 +742,8 @@ FINDPATH:
JR Z,.NEXTRT JR Z,.NEXTRT
OR A OR A
JR NZ,.NEXTCH JR NZ,.NEXTCH
LD (HL),C ;R04 LD (HL),C
INC HL ;R04 INC HL
LD (HL),A LD (HL),A
INC HL INC HL
LD (HL),A LD (HL),A

View File

@ -15,7 +15,7 @@
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
F_FIRST_FN: CALL F_FIRST.INIT_VARS F_FIRST_FN: CALL F_FIRST.INIT_VARS
PUSH HL PUSH HL
;!TEST Current Dir ;[x] 15/10/23 ; Current Dir 15/10/23
CALL DIR_PATH_CHECK CALL DIR_PATH_CHECK
POP HL POP HL
RET C RET C

View File

@ -1,4 +1,3 @@
; [x] fat32 ;!TEST
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
; ”γ­<CEB3>ζ¨ο #1B. ‘®§¤ ­¨¥ <20> β «®£ . ; ”γ­<CEB3>ζ¨ο #1B. ‘®§¤ ­¨¥ <20> β «®£ .
; ;

View File

@ -1,4 +1,3 @@
; [x] fat32 ;!TEST
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #11. Žâªàë⨥ ä ©« . ; ”ã­ªæ¨ï #11. Žâªàë⨥ ä ©« .
; ;
@ -12,7 +11,7 @@
; ¢ë室: CF=0, A - ¤¥áªà¨¯â®à ä ©« . ; ¢ë室: CF=0, A - ¤¥áªà¨¯â®à ä ©« .
; CF=1, A - ª®¤ ®è¨¡ª¨. ; CF=1, A - ª®¤ ®è¨¡ª¨.
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
OPEN_FN: ;!TEST Current Dir ;[x] 15/10/23 OPEN_FN: ; Current Dir 15/10/23
;AND #7F ; ACCESS_MODE bit7 - ¤«ï ¢­ãâ७­¥£® ¨á¯®«ì§®¢ ­¨ï))) ;!TODO ;AND #7F ; ACCESS_MODE bit7 - ¤«ï ¢­ãâ७­¥£® ¨á¯®«ì§®¢ ­¨ï))) ;!TODO
LD (.TMP),A LD (.TMP),A
PUSH HL PUSH HL

View File

@ -146,14 +146,11 @@ READ: LD (.R_POINT),HL
ADD HL,DE ADD HL,DE
; ;
EXX EXX
;LD DE,0 ;!TEST
LD L,(IY+_sFM.F_POSITION+2) ;FP HIGH LD L,(IY+_sFM.F_POSITION+2) ;FP HIGH
LD H,(IY+_sFM.F_POSITION+3) LD H,(IY+_sFM.F_POSITION+3)
;!TEST JR NC,.no_inc_hl
JR NC,.no_inc_hl
INC HL
;ADC HL,DE
; ;
INC HL
.no_inc_hl: EXX ;HL':HL - NEW FP .no_inc_hl: EXX ;HL':HL - NEW FP
; ;
LD C,(IY+_sFM.FS_REC.F_SIZE) LD C,(IY+_sFM.FS_REC.F_SIZE)

View File

@ -9,7 +9,7 @@
; INPUT: HL - "old_name.ext",#00 without simbols * ? ; INPUT: HL - "old_name.ext",#00 without simbols * ?
; DE - "new_name.ext",#00 without simbols * ? ; DE - "new_name.ext",#00 without simbols * ?
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
RENAME: ;!TEST Current Dir ;[x] 15/10/23 RENAME: ; Current Dir 15/10/23
PUSH HL PUSH HL
PUSH DE PUSH DE
CALL DIR_PATH_CHECK.forceCheck CALL DIR_PATH_CHECK.forceCheck
@ -30,19 +30,12 @@ RENAME: ;!TEST Current Dir ;[x] 15/10/23
CALL MASK.name CALL MASK.name
POP DE POP DE
RET C 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 RET Z
;
PUSH DE PUSH DE
CALL LOADDIR ; [ ] big dir ; ¯à®ç¨â âì ᯨ᮪ ª â «®£  CALL LOADDIR ; [ ] big dir ; ¯à®ç¨â âì ᯨ᮪ ª â «®£ 
;LD A,#33
LD A,FAT_ATTR.NoSYSnoVolID LD A,FAT_ATTR.NoSYSnoVolID
CALL SEARCH.Custom ; ¯®¨áª § ¯¨á¨ "old_name.ext" ¢ ᯨ᪥ ¤¨áª  CALL SEARCH.Custom ; ¯®¨áª § ¯¨á¨ "old_name.ext" ¢ ᯨ᪥ ¤¨áª 
POP HL POP HL
@ -50,16 +43,10 @@ RENAME: ;!TEST Current Dir ;[x] 15/10/23
;LD DE,MASKARE ;LD DE,MASKARE
CALL MASK.name CALL MASK.name
RET C 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 RET Z
;
PUSH IX PUSH IX
LD A,FAT_ATTR.NoSYSnoVolID LD A,FAT_ATTR.NoSYSnoVolID
CALL SEARCH.Custom ; ¯®¨áª § ¯¨á¨ "new_name.ext" ¢ ᯨ᪥ ¤¨áª  CALL SEARCH.Custom ; ¯®¨áª § ¯¨á¨ "new_name.ext" ¢ ᯨ᪥ ¤¨áª 
@ -67,7 +54,7 @@ RENAME: ;!TEST Current Dir ;[x] 15/10/23
LD A,DSS_Error.sys.FILE_EXISTS LD A,DSS_Error.sys.FILE_EXISTS
CCF CCF
RET C RET C
;
SET_PAGE_X DIRPAGE SET_PAGE_X DIRPAGE
EX AF,AF' EX AF,AF'
; ;

View File

@ -1,4 +1,3 @@
; [x] fat32 ;!TEST
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #1C. “¤ «¥­¨¥ ª â «®£ . ; ”ã­ªæ¨ï #1C. “¤ «¥­¨¥ ª â «®£ .
; Œ®¦­® 㤠«¨âì ⮫쪮 ¯ãá⮩ ª â «®£. ; Œ®¦­® 㤠«¨âì ⮫쪮 ¯ãá⮩ ª â «®£.
@ -8,7 +7,7 @@
; ;
; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
RMDIR: ;!TEST Current Dir ;[x] 15/10/23 RMDIR: ; Current Dir 15/10/23
PUSH HL PUSH HL
CALL DIR_PATH_CHECK CALL DIR_PATH_CHECK
POP HL POP HL

View File

@ -209,7 +209,7 @@ OPENDSK: ;!TEST DRV.Open
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
;!TEST Current Dir ;[x] 15/10/23 ;! Current Dir 15/10/23
DIR_PATH_CHANGE: DIR_PATH_CHANGE:
.FullCurrent: LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) .FullCurrent: LD A,(CORE_BUFFERS.FS_Buffer.DRIVE)
ADD 'A' ADD 'A'

View File

@ -318,7 +318,6 @@ SEARCH:
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
; FIND "MASKAREA" IN DIRECTORY ; FIND "MASKAREA" IN DIRECTORY
; [x] fat32 ;!TEST
; ¢ë室: IY:DE - cluster number ; ¢ë室: IY:DE - cluster number
FINDDIR: SET_PAGE_X DIRPAGE FINDDIR: SET_PAGE_X DIRPAGE
; ;
@ -467,34 +466,81 @@ FINDDIR: SET_PAGE_X DIRPAGE
RET RET
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
âãâ ¤®¤¥« âì
; ‚室: IY - 㪠§ â¥«ì ­  ­ ç «® ä ©«®¢®£® ¬ ­¨¯ã«ïâ®à 
CHECK_ROOT_CLUSTER: CHECK_ROOT_CLUSTER:
EX DE,HL ;EX DE,HL
LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L) ;R005 ; LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L)
LD A,L ; LD A,L
OR H ; OR H
LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H) ; LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H)
; OR L
; OR H
;EX DE,HL
CALL CHECK_FIRST_CLUSTER
; RET NZ
; LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE)
; CP FAT_TYPE.x32
; CALL Z,SET_FAT_ROOT_DIR_CLUSTER
; ;
; XOR A
RET
;
; .fat32root: CALL SET_FAT32_ROOT_DIR_CLUSTER
; OR A
; RET
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
SET_FAT_ROOT_DIR_CLUSTER:
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
RET
;----------------------------------------------------------------------;
;-----------------------------------------------------------------------
; ¢å®¤: IY - 㪠§ â¥«ì ­  ­ ç «® ä ©«®¢®£® ¬ ­¨¯ã«ïâ®à 
; ¢ë室: HL':HL - first cluster
; ZF = 0 ¥á«¨ ¯¥à¢®£® ª« áâ¥à  ­¥â
CHECK_FIRST_CLUSTER:
EXX
LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_H) ; START CLUSTER High
LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_H+1)
LD A,L
OR H
EXX
LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) ; START CLUSTER
LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1)
OR L OR L
OR H OR H
EX DE,HL
RET RET
;-----------------------------------------------------------------------
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
; ¢å®¤: HL - ¨¬ï ¤¨à¥ªâ®à¨¨ ; ¢å®¤: HL - ¨¬ï ¤¨à¥ªâ®à¨¨
; [x] fat32 ;!TEST
OPENDIR: LD IY,CORE_BUFFERS.FM_BUF OPENDIR: LD IY,CORE_BUFFERS.FM_BUF
LD A,(HL) LD A,(HL)
OR A OR A
JR NZ,.SUBDIR JR NZ,.SUBDIR
; ;
.REROOT: LD DE,0 ; !FIXIT ; [ ] CDFS - ¡à âì ¯¥à¢ë© ª« áâ¥à ¨§ ¯¥à¥¬¥­­®© âãâ ¤®¤¥« âì
LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),DE .REROOT: CALL SET_FAT_ROOT_DIR_CLUSTER
LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),DE ;LD DE,0 ; ¯à¨§­ ª root dir ; !FIXIT ; [ ] CDFS - ¡à âì ¯¥à¢ë© ª« áâ¥à ¨§ ¯¥à¥¬¥­­®©
CALL LOADDIR ; [ ] big dir ;LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),DE
;LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),DE
.reroot: CALL LOADDIR ; [ ] big dir
; CF=0 ; CF=0
LD HL,CORE_BUFFERS.WorkDirectory LD HL,CORE_BUFFERS.WorkDirectory
LD (HL),'\' LD (HL),'\'
INC HL INC HL
LD (HL),#00 LD (HL),#00
;AND A ;AND A
RET RET
@ -502,7 +548,12 @@ OPENDIR: LD IY,CORE_BUFFERS.FM_BUF
.SUBDIR: CP "." .SUBDIR: CP "."
JR NZ,.SUBDIR2 JR NZ,.SUBDIR2
; fat32 ; fat32
CALL CHECK_ROOT_CLUSTER ; !TEST 04/01/2026
EX DE,HL
CALL CHECK_ROOT_CLUSTER
;CALL CHECK_FIRST_CLUSTER
EX DE,HL
;
JR NZ,.no_root ;R005 JR NZ,.no_root ;R005
; "cd ." or "cd .." ; "cd ." or "cd .."
;R005 ;R005
@ -546,7 +597,8 @@ OPENDIR: LD IY,CORE_BUFFERS.FM_BUF
; <20>à®ç¨â âì ᯨ᮪ ª â «®£  ; <20>à®ç¨â âì ᯨ᮪ ª â «®£ 
; ¢å®¤ (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L), (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H) ; ¢å®¤ (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L), (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H)
LOADDIR: ;!TODO optimize LOADDIR: ;!TODO optimize
CALL LOAD_SAVE_DIR_PREPARE LD HL,0
.Custom: CALL LOAD_SAVE_DIR_PREPARE
.next: PUSH AF .next: PUSH AF
EX AF,AF' EX AF,AF'
JR NZ,.read_dir ; root dir or not JR NZ,.read_dir ; root dir or not
@ -582,8 +634,7 @@ LOADDIR: ;!TODO optimize
JR NC,.RTD1 JR NC,.RTD1
; ;
LD B,A ; ç¨á«® ᥪâ®à®¢ LD B,A ; ç¨á«® ᥪâ®à®¢
.RTD1: LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) ; ­®¬ .RTD1: LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) ; ­®¬¥à ¤¨áª 
¥à ¤¨áª 
LD DE,DIRPAGE.buffer ; ¡ãä¥à LD DE,DIRPAGE.buffer ; ¡ãä¥à
LD C,Dss.DRV.Read ; ç⥭¨¥ ᥪâ®à®¢ LD C,Dss.DRV.Read ; ç⥭¨¥ ᥪâ®à®¢
RST ToDSS.DRV RST ToDSS.DRV
@ -601,8 +652,7 @@ LOADDIR: ;!TODO optimize
ld ; [ ] ¤®¤¥« âì ¯¥à¥¤ çã ID § ¯¨á¨ ¤¨à¥ªâ®à¨¨ ¨ § £à㧪¨ ¯® ­¥© ­ã¦­®£® ªã᪠ ¢ ªíè
; ¤®¤¥« âì ¯¥à¥¤ çã ID § ¯¨á¨ ¤¨à¥ªâ®à¨¨ ¨ § £à㧪¨ ¯® ­¥© ­ã¦­®£® ªã᪠ ¢ ªíè
;!TODO FAT procedures ;!TODO FAT procedures
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
; ‚室: ; ‚室:
@ -613,27 +663,21 @@ LOAD_SAVE_DIR_PREPARE:
; HLIX = (HL*32) & #1FC000 ᬥ饭¨¥ ­  ­ã¦­ë© ¡«®ª ¯® #4000 ¡ ©â®¢ ; HLIX = (HL*32) & #1FC000 ᬥ饭¨¥ ­  ­ã¦­ë© ¡«®ª ¯® #4000 ¡ ©â®¢
XOR A XOR A
LD XL,A LD XL,A
LD L,A LD E,A
LD A,H LD A,H
AND #0E LD H,E
AND #FE
RRA RRA
RR L RR E
LD (CORE_BUFFERS.FS_Buffer.DIR_BLOCK),A
RRA RRA
RR L RR E
RRA RRA
RR L RR E
LD E,L
LD XH,E LD XH,E
LD L,A LD L,A
; ; ; ;
; ;
; A = ­®¬¥à ¡«®ª  ªíè ¤¨à¥ªâ®à¨¨
RL E
RLA
RL E
RLA
LD (CORE_BUFFERS.FS_Buffer.DIR_BLOCK),A
;
XOR A ; FILE MANIPULATOR = 0 XOR A ; FILE MANIPULATOR = 0
;LD H,A ;LD H,A
;LD L,A ;LD L,A
@ -648,11 +692,6 @@ LOAD_SAVE_DIR_PREPARE:
LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) LD A,(CORE_BUFFERS.FS_Buffer.DRIVE)
LD (CORE_BUFFERS.FM_BUF.DRIVE),A 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 XOR A
LD D,#40 LD D,#40
LD E,A LD E,A
@ -755,9 +794,10 @@ LOAD_SAVE_DIR_PREPARE:
#1FFFE0 & #3FFF ¤à¥á ­ã¦­®© ¯®§¨æ¨¨ ¢ ªíè #1FFFE0 & #3FFF ¤à¥á ­ã¦­®© ¯®§¨æ¨¨ ¢ ªíè
(#1FFFE0 & #1FC000)<<2 ¤¢¨£ ¥¬ ¡ ©â 2 ¨ 3 ç⮡ ¯®«ãç¨âì ­®¬¥à ¡«®ª  (#1FFFE0 & #1FC000)<<2 ¤¢¨£ ¥¬ ¡ ©â 2 ¨ 3 ç⮡ ¯®«ãç¨âì ­®¬¥à ¡«®ª 
*/ */
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
; [ ] big dir ; [ ] big dir
; ᪮¯¨à®¢ âì § ¯¨áì ¢ ᯨ᮪ ¤¨áª  (ª â «®£ ) de ix iy ; ᪮¯¨à®¢ âì § ¯¨áì ¢ ᯨ᮪ ¤¨áª  (ª â «®£ ) de ix iy
; ¨ á¡à®á¨âì ª¥è ª â «®£  ­  ¤¨áª ; ¨ á¡à®á¨âì ª¥è ª â «®£  ­  ¤¨áª
@ -1409,7 +1449,7 @@ FS_Buffer:
;!TODO record index. ¢®§¬®¦­®, çâ® ¬®¦¥â á«®¬ âìáï, ¥á«¨ ¡®«ìè¥ áâà ­¨æë ;!TODO record index. ¢®§¬®¦­®, çâ® ¬®¦¥â á«®¬ âìáï, ¥á«¨ ¡®«ìè¥ áâà ­¨æë
DELETE_REC_FAT: SET_PAGE_X DIRPAGE DELETE_REC_FAT: SET_PAGE_X DIRPAGE
EX AF,AF' EX AF,AF'
CALL DELETE_LFN_RECORDS ; [x] 㤠«¥­¨¥ § ¯¨á¨ LFN CALL DELETE_LFN_RECORDS ; [ ] big dir ; [x] 㤠«¥­¨¥ § ¯¨á¨ LFN
LD (IX + FAT_DIRECTORY_RECORD.NAME),#E5 ; ¯à¨§­ ª 㤠«¥­¨ï ä ©«  LD (IX + FAT_DIRECTORY_RECORD.NAME),#E5 ; ¯à¨§­ ª 㤠«¥­¨ï ä ©« 
; fat32 ; fat32
LD L,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) ; ü ¯¥à¢®£® ª« áâ¥à  LD L,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) ; ü ¯¥à¢®£® ª« áâ¥à 
@ -1495,7 +1535,6 @@ SET_NEW_FREE_CLUSTER:
; RET ; RET
; ;
; [x] fat32 ;!TEST
; ­ ©â¨ ¯¥à¢ë© ᢮¡®¤­ë© ª« áâ¥à ;!TODO ¯à®¢¥à¨âì ¯¥à¥¡®à ª« áâ¥à®¢ ; ­ ©â¨ ¯¥à¢ë© ᢮¡®¤­ë© ª« áâ¥à ;!TODO ¯à®¢¥à¨âì ¯¥à¥¡®à ª« áâ¥à®¢
; ¢ë室: HL - ¬« ¤è¨© ­®¬¥à ᢮¡®¤­®£® ª« áâ¥à  ; ¢ë室: HL - ¬« ¤è¨© ­®¬¥à ᢮¡®¤­®£® ª« áâ¥à 
; HL' - áâ à訩 ­®¬¥à ᢮¡®¤­®£® ª« áâ¥à  ; HL' - áâ à訩 ­®¬¥à ᢮¡®¤­®£® ª« áâ¥à 
@ -1590,7 +1629,6 @@ SET_NEW_FREE_CLUSTERS:
; ; ; ;
; ;
; [x] fat32 ;!TEST
; <20>ਪ९¨âì ª ¯®á«¥¤­¥¬ã ª« áâ¥àã æ¥¯®çª¨ ­®¢ë© ¯ãá⮩ ª« áâ¥à ; <20>ਪ९¨âì ª ¯®á«¥¤­¥¬ã ª« áâ¥àã æ¥¯®çª¨ ­®¢ë© ¯ãá⮩ ª« áâ¥à
; ‚室: HL':HL - ­®¬¥à ª« áâ¥à  ª ª®â®à®¬ã ¯à¨ªà¥¯¨âì ¯ãá⮩ ; ‚室: HL':HL - ­®¬¥à ª« áâ¥à  ª ª®â®à®¬ã ¯à¨ªà¥¯¨âì ¯ãá⮩
; ‚ë室: HL':HL - ­®¬¥à ª« áâ¥à  ª ª®â®à®¬ã ¯à¨ªà¥¯¨«áï ¯ãá⮩ ; ‚ë室: HL':HL - ­®¬¥à ª« áâ¥à  ª ª®â®à®¬ã ¯à¨ªà¥¯¨«áï ¯ãá⮩
@ -1625,7 +1663,7 @@ INC_FAT: PUSH HL ; ⥪
EXX EXX
; ;
CALL WRITE_TO_FAT ; § ¯¨á âì ¢ ª¥è FAT-  ­®¬¥à ª« áâ¥à  CALL WRITE_TO_FAT ; § ¯¨á âì ¢ ª¥è FAT-  ­®¬¥à ª« áâ¥à 
;!TEST ;!TODO 2/12/23 ; [ ] ¡ £ á ¨§¡ëâ®ç­®© § ¯¨áìî WRITE_FAT_TABLE? ; 02/12/23 ¡ £ á ¨§¡ëâ®ç­®© § ¯¨áìî WRITE_FAT_TABLE
;CALL WRITE_FAT_TABLE ; ¯®¤ª«. ¡ ­ªã ª¥è  FAT ¨ § ¯¨á âì ¥£® ­  ¤¨áª ;CALL WRITE_FAT_TABLE ; ¯®¤ª«. ¡ ­ªã ª¥è  FAT ¨ § ¯¨á âì ¥£® ­  ¤¨áª
; ;
EXX EXX
@ -1639,10 +1677,9 @@ INC_FAT: PUSH HL ; ⥪
XOR A ; 㬥­ìè¨âì XOR A ; 㬥­ìè¨âì
CALL SET_NEW_FREE_CLUSTERS ; [ ] free clusters for FSInfo CALL SET_NEW_FREE_CLUSTERS ; [ ] free clusters for FSInfo
RET RET
;RX01
; [x] fat32 ;!TEST
; ¢å®¤: hl = ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à  ¤«ï áà ¢­¥­¨ï á FAT_Max_Cluster ; ¢å®¤: hl = ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à  ¤«ï áà ¢­¥­¨ï á FAT_Max_Cluster
; hl' = áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à  ¤«ï áà ¢­¥­¨ï á FAT_Max_Cluster (⮫쪮 ¤«ï fat32) ; hl' = áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à  ¤«ï áà ¢­¥­¨ï á FAT_Max_Cluster (⮫쪮 ¤«ï fat32)
CHECK_CLUSTER_IS_SMALLER: CHECK_CLUSTER_IS_SMALLER:
@ -1670,7 +1707,6 @@ CHECK_CLUSTER_IS_SMALLER:
; ;
; ;
;[x] fat32 ;!TEST
;------------------------------------------------------------------------------------------------ ;------------------------------------------------------------------------------------------------
; <20>à®ç¨â âì ¨§ ª¥è  FAT-  ­®¬¥à á«¥¤. ª« áâ¥à  ; <20>à®ç¨â âì ¨§ ª¥è  FAT-  ­®¬¥à á«¥¤. ª« áâ¥à 
; ¢å®¤: hl - ­®¬¥à ª« áâ¥à  (¬« ¤è¥¥ á«®¢®) ; ¢å®¤: hl - ­®¬¥à ª« áâ¥à  (¬« ¤è¥¥ á«®¢®)
@ -1802,8 +1838,6 @@ SET_FAT32_CACHE_BLOCK_CHANGED_REGION:
LD (CORE_BUFFERS.FS_Buffer.CacheUpdated),A LD (CORE_BUFFERS.FS_Buffer.CacheUpdated),A
RET RET
;
; [x] fat32 ;!TEST
; ;
; !TODO optimize ; !TODO optimize
; ¯à¨ § ¯¨á¨ ¢ ªíè §­ ç¥­¨ï ®â¬¥ç âì ç¥à¥§ OR ¢ ï祩ª¥ FS_Buffer.SectorOfCacheBlock ; ¯à¨ § ¯¨á¨ ¢ ªíè §­ ç¥­¨ï ®â¬¥ç âì ç¥à¥§ OR ¢ ï祩ª¥ FS_Buffer.SectorOfCacheBlock
@ -1913,8 +1947,7 @@ WRITE_TO_FAT: LD DE,(CORE_BUFFERS.FS_Buffer.END_CHAIN_CLUSTER_L) ;
POP DE POP DE
JR .exit JR .exit
; ;
.FAT32: ; [x] fat32 ;!TEST .FAT32: EXX
EXX
PUSH DE ; áâ à訩 ­®¬¥à ª« áâ¥à  ª®â®àë© ¢¯¨á âì PUSH DE ; áâ à訩 ­®¬¥à ª« áâ¥à  ª®â®àë© ¢¯¨á âì
PUSH HL ; áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à  ¢ ª®â®àë© § ¯¨á âì PUSH HL ; áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à  ¢ ª®â®àë© § ¯¨á âì
EXX EXX
@ -1942,7 +1975,6 @@ WRITE_TO_FAT: LD DE,(CORE_BUFFERS.FS_Buffer.END_CHAIN_CLUSTER_L) ;
; [x] fat32 ;!TEST
;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT ;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT
; in: HL - Cache block ; in: HL - Cache block
; out: C:HL - logical number ; out: C:HL - logical number
@ -1981,7 +2013,6 @@ GET_SECTOR_OF_FAT:
;;;;;;;;; ;;;;;;;;;
; [x] fat32 ;!TEST
;RE_FAT: ;RE_FAT:
;RX01 ;RX01
; <20>à®ç¨â âì ¢ ª¥è •• ᥪâ®à®¢ FAT-  ; <20>à®ç¨â âì ¢ ª¥è •• ᥪâ®à®¢ FAT- 
@ -2021,7 +2052,7 @@ READ_FAT_TABLE: PUSH HL
RET RET
; [x] fat32 ;!TEST
; <20>®¤ª«îç¨âì ¡ ­ªã ª¥è  FAT ¨ § ¯¨á âì ¥£® ­  ¤¨áª ; <20>®¤ª«îç¨âì ¡ ­ªã ª¥è  FAT ¨ § ¯¨á âì ¥£® ­  ¤¨áª
WRITE_FAT_TABLE: WRITE_FAT_TABLE:
SET_PAGE_X FATPAGE SET_PAGE_X FATPAGE
@ -2228,9 +2259,9 @@ WRITE_FAT_TABLE:
POP DE POP DE
POP AF POP AF
RET RET
;----------------------------------------------------------------------- ;-----------------------------------------------------------------------
;
;[x] fat32 ;!TEST
;¢å®¤: HL':HL - ­®¬¥à ª« áâ¥à  ;¢å®¤: HL':HL - ­®¬¥à ª« áâ¥à 
;¢ë室: HL -  ¤à¥á ­ã¦­®© ï祩ª¨ ¢ áâà ­¨æ¥ FATPAGE ;¢ë室: HL -  ¤à¥á ­ã¦­®© ï祩ª¨ ¢ áâà ­¨æ¥ FATPAGE
GET_FAT32_CELL: ; ¤¢¨£ ¥¬ ¢«¥¢® HL':H GET_FAT32_CELL: ; ¤¢¨£ ¥¬ ¢«¥¢® HL':H
@ -2344,8 +2375,6 @@ GET_FAT12_CELL: LD D,H
;----------------------------------------------------------------------- ;-----------------------------------------------------------------------
;[x] fat32 ;!TEST
;CLUSTER_TO_SECTOR: ;CLUSTER_TO_SECTOR:
; in: HL':HL - CLUSTER ; in: HL':HL - CLUSTER
; out: HL:IX - SECTOR ; out: HL:IX - SECTOR
@ -2394,7 +2423,6 @@ CLUSTER_TO_SECTOR:
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
; [x] fat32 ;!TEST
; READ SECTORS OF FILE ; READ SECTORS OF FILE
; ¢å®¤: HL:DE - FP (in sectors) ; ¢å®¤: HL:DE - FP (in sectors)
; IY - FM ; IY - FM
@ -2561,24 +2589,8 @@ BLOCK_READ: LD (READ.PointerOnBuffer),IX
RET RET
;----------------------------------------------------------------------- ;-----------------------------------------------------------------------
; [x] fat32
; ¢å®¤: IY - FM
; ¢ë室: HL':HL - first cluster
; ZF = 0 ¥á«¨ ¯¥à¢®£® ª« áâ¥à  ­¥â
CHECK_FIRST_CLUSTER:
EXX
LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_H) ; START CLUSTER High
LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_H+1)
LD A,L
OR H
EXX
LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) ; START CLUSTER
LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1)
OR L
OR H
RET
; [x] fat32 ;-----------------------------------------------------------------------
; WRITE SECTORS OF FILE ; WRITE SECTORS OF FILE
; ¢å®¤: HL:DE - FP (in sectors) ; ¢å®¤: HL:DE - FP (in sectors)
; IX - data in RAM ; IX - data in RAM
@ -2595,16 +2607,6 @@ BLOCK_WRITE: LD (READ.PointerOnBuffer),IX
PUSH BC ; ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à  PUSH BC ; ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à 
PUSH DE ; fat32 áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à  PUSH DE ; fat32 áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à 
; ;
; EXX
; LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_H) ; START CLUSTER High
; LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_H+1)
; LD A,L
; OR H
; EXX
; LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) ; START CLUSTER
; LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1)
; OR L
; OR H
CALL CHECK_FIRST_CLUSTER CALL CHECK_FIRST_CLUSTER
JR NZ,.FindCluster JR NZ,.FindCluster
; ;

View File

@ -37,8 +37,8 @@
; .CREATE_DATE_FAT32: WORD #0000 ;+ #10 +16 RESERVED ; .CREATE_DATE_FAT32: WORD #0000 ;+ #10 +16 RESERVED
; .RESERVED_FAT32_1: WORD #0000 ;+ #12 +18 RESERVED ; .RESERVED_FAT32_1: WORD #0000 ;+ #12 +18 RESERVED
; .FIRST_CLUSTER_H: WORD #0000 ;+ #14 +20 RESERVED ; .FIRST_CLUSTER_H: WORD #0000 ;+ #14 +20 RESERVED
; .TIME: WORD #0000 ;+ #16 +22 TIME ; .TIME: WORD #0000 ;+ #16 +22 TIME
; .DATE: WORD #0000 ;+ #18 +24 DATE ; .DATE: WORD #0000 ;+ #18 +24 DATE
; .FIRST_CLUSTER_L: WORD #0000 ;+ #1A +26 START CLUSTER ; [ ] fat32 ; .FIRST_CLUSTER_L: WORD #0000 ;+ #1A +26 START CLUSTER ; [ ] fat32
; .F_SIZE: DWORD #00000000 ;+ #1C +28 SIZE FILE ; .F_SIZE: DWORD #00000000 ;+ #1C +28 SIZE FILE
; from Core ; from Core

View File

@ -1 +1 @@
3 4

View File

@ -69,6 +69,7 @@ MINIMUM_BIOS_VERSION EQU 3*256 + 06 ; version 3.06
;-----------------------------------------------[^^^^^^] ;-----------------------------------------------[^^^^^^]
;-----------------------------------------------[«®£.­®¬¥à  áâà ­¨æ] ;-----------------------------------------------[«®£.­®¬¥à  áâà ­¨æ]
IFUSED DIRPAGE
DEFINE USING_MEMPAGES 4 ; à §¬¥à ¡«®ª  ¤®¯®«­¨â¥«ì­ëå áâà ­¨æ DEFINE USING_MEMPAGES 4 ; à §¬¥à ¡«®ª  ¤®¯®«­¨â¥«ì­ëå áâà ­¨æ
; ªíè ᯨ᪠ ª â «®£  ; ªíè ᯨ᪠ ª â «®£ 
DIRPAGE EQU 0 + (low BANKTBL) DIRPAGE EQU 0 + (low BANKTBL)
@ -85,6 +86,7 @@ ENVPAGE EQU TXTPAGE
DRVPAGE EQU 3 + (low BANKTBL) DRVPAGE EQU 3 + (low BANKTBL)
; ;
COREPAGE EQU 4 + (low BANKTBL) ; ®­  ®â¤¥«ì­® ¨ ­¥ á ¡«®ª®¬ ¢ëè¥. COREPAGE EQU 4 + (low BANKTBL) ; ®­  ®â¤¥«ì­® ¨ ­¥ á ¡«®ª®¬ ¢ëè¥.
ENDIF
;-----------------------------------------------[^^^^^^^^^^^^^^^^^^] ;-----------------------------------------------[^^^^^^^^^^^^^^^^^^]
DIRECTORY_PATH_LENGTH EQU 256 ; '\' + 255, 0 DIRECTORY_PATH_LENGTH EQU 256 ; '\' + 255, 0

View File

@ -1 +1 @@
527 531

View File

@ -375,3 +375,151 @@ SAVEDIR: ;!TODO optimize
RET RET
; [ ] ¤®¤¥« âì ¯¥à¥¤ çã ID § ¯¨á¨ ¤¨à¥ªâ®à¨¨ ¨ § £à㧪¨ ¯® ­¥© ­ã¦­®£® ªã᪠ ¢ ªíè
;!TODO FAT procedures
;----------------------------------------------------------------------;
; ‚室:
; HL - ID § ¯¨á¨, ª®â®àë© ¤®«¦¥­ ¯®¯ áâì ¢ Š<>˜
; ‚ë室: A - ‘âà ­¨æ , ª®â®à ï ¡ë«  ¢ SLOT3 ¤® ¢ë§®¢ 
; ZF' - RootDir
LOAD_SAVE_DIR_PREPARE:
; [ ] ‚室: HL - ID § ¯¨á¨, ª®â®àë© ¤®«¦¥­ ¯®¯ áâì ¢ Š<>˜
; [ ] ‚ë室: HLIX - ᬥ饭¨¥ ¢ ä ©«¥ ª â «®£  ­  ­ã¦­ë© ¡«®ª ¯® #4000 ¡ ©â®¢
; HLIX = (HL*32) & #1FC000 ᬥ饭¨¥ ­  ­ã¦­ë© ¡«®ª ¯® #4000 ¡ ©â®¢
XOR A
LD XL,A
LD E,A
LD A,H
LD H,E
AND #FE
RRA
RR E
LD (CORE_BUFFERS.FS_Buffer.DIR_BLOCK),A
RRA
RR E
RRA
RR E
LD XH,E
LD L,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
PUSH AF
;
LD A,(CORE_BUFFERS.FS_Buffer.DRIVE)
LD (CORE_BUFFERS.FM_BUF.DRIVE),A
;;;;;;;;
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 ç⮡ ¯®«ãç¨âì ­®¬¥à ¡«®ª 
*/
;----------------------------------------------------------------------;