fat32 - 98%

This commit is contained in:
Anatoliy Belyanskiy 2024-04-21 05:11:18 +10:00
parent beb5dd8196
commit ed82bbff78
9 changed files with 374 additions and 234 deletions

View File

@ -24,7 +24,7 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23
SCF SCF
RET RET
.FILE_EXISTS_DEL: .FILE_EXISTS_DEL:
CALL DEL_FN.DELETE CALL DELETE_REC_FAT
LD A,DSS_Error.sys.FILE_NOT_FOUND LD A,DSS_Error.sys.FILE_NOT_FOUND
RET RET
; ;

View File

@ -27,48 +27,5 @@ DEL_FN: ;!TEST
CALL LOADDIR CALL LOADDIR
CALL SEARCH.File CALL SEARCH.File
RET C RET C
; ¯®¬¥â¨âì § ¯¨áì ª ª "㤠«¥­­ ï" JP DELETE_REC_FAT ; ¯®¬¥â¨âì § ¯¨áì ª ª "㤠«¥­­ ï"
;!TODO record index. ¢®§¬®¦­®, çâ® ¬®¦¥â á«®¬ âìáï, ¥á«¨ ¡®«ìè¥ áâà ­¨æë
.DELETE:
SET_PAGE_X DIRPAGE
EX AF,AF'
CALL DELETE_LFN_RECORDS ; [ ] 㤠«¥­¨¥ § ¯¨á¨ LFN
LD (IX + FAT_DIRECTORY_RECORD.NAME),#E5 ; ¯à¨§­ ª 㤠«¥­¨ï ä ©« 
; fat32
LD E,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) ; ü ¯¥à¢®£® ª« áâ¥à 
LD D,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1)
LD A,E
OR D
EXX
LD E,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) ; ü ¯¥à¢®£® ª« áâ¥à 
LD D,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1)
OR D
OR E
;
EX AF,AF'
OUT (SLOT3),A
EX AF,AF'
JP Z,SAVEDIR ; á¡à®á¨âì ª¥è ª â «®£  ­  ¤¨áª
; ¥á«¨ à §¬¥à ä ©«  ­¥ ­®«ì
.loop: EX DE,HL ; hl=­®¬¥à ª« áâ¥à 
EXX
EX DE,HL
EXX
CALL READ_FROM_FAT ; ¯à®ç¨â âì ¨§ ª¥è  FAT-  ­®¬¥à á«¥¤. ª« áâ¥à 
EXX
PUSH DE ; ­®¬¥à á«¥¤. ª« áâ¥à 
PUSH AF
LD DE,#0000 ; ­®¬¥à ª« áâ¥à 
EXX
PUSH DE
LD DE,#0000 ; ­®¬¥à ª« áâ¥à 
CALL WRITE_TO_FAT.Custom ; § ¯¨á âì ¢ ª¥è FAT-  ­®¬¥à ª« áâ¥à 
POP DE
EXX
POP AF
POP DE
EXX
JP NC,.loop
CALL WRITE_FAT_TABLE
JP SAVEDIR ; á¡à®á¨âì ª¥è ª â «®£  ­  ¤¨áª
; ;

View File

@ -89,6 +89,7 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23
LD A,(HL) LD A,(HL)
SBC HL,DE SBC HL,DE
AND FAT_ATTR.VOLUME_ID AND FAT_ATTR.VOLUME_ID
SCF
JP Z,.error ;DIR NOT EMPTY JP Z,.error ;DIR NOT EMPTY
.next_record: LD DE,FAT_DIRECTORY_RECORD .next_record: LD DE,FAT_DIRECTORY_RECORD
ADD HL,DE ADD HL,DE
@ -119,22 +120,17 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23
JR NC,.read_dir_big_loop ; ­¥ ª®­¥æ 楯®çª¨ JR NC,.read_dir_big_loop ; ­¥ ª®­¥æ 楯®çª¨
; ;
.delete: POP IX .delete: POP IX
JP DEL_FN.DELETE ; ¯®¬¥â¨âì § ¯¨áì ª ª "㤠«¥­­ ï" JP DELETE_REC_FAT ; ¯®¬¥â¨âì § ¯¨áì ª ª "㤠«¥­­ ï"
; ;
.dir_empty: POP HL .dir_empty: ; CF = 0
.error: ; CF = 1
POP HL POP HL
POP HL
POP HL
POP HL
JR .delete
;
.error: POP HL
POP HL POP HL
POP HL POP HL
POP HL POP HL
POP HL POP HL
JR NC,.delete
POP HL POP HL
LD A,DSS_Error.sys.DIR_NOT_EMPTY LD A,DSS_Error.sys.DIR_NOT_EMPTY
SCF
RET RET
; ;

View File

@ -101,15 +101,13 @@
; ;
; ‚•Ž„: L - «®£¨ç¥áª¨© ­®¬¥à ¢ â ¡«¨æ¥ ; ‚•Ž„: L - «®£¨ç¥áª¨© ­®¬¥à ¢ â ¡«¨æ¥
; ‚›•Ž„: IY - ­ ç «® § ¯¨á¨ ; ‚›•Ž„: IY - ­ ç «® § ¯¨á¨
; <20>Ž<EFBFBD>ˆ: HL, IY. HL<-->DE ; <20>Ž<EFBFBD>ˆ: HL, DE, IY.
MACRO LOGDRV_ENTRY_FIND tbl_addr MACRO LOGDRV_ENTRY_FIND tbl_addr
LD H,0 LD H,0
ADD HL,HL ADD HL,HL
ADD HL,HL ADD HL,HL
ADD HL,HL ADD HL,HL
ADD HL,HL ADD HL,HL
;LD B,H
;LD C,L
EX DE,HL EX DE,HL
LD IY,tbl_addr LD IY,tbl_addr
ADD IY,DE ADD IY,DE

View File

@ -10,20 +10,23 @@
;--------------------------------------------------------------- ;---------------------------------------------------------------
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
; á¡à á뢠¥â §­ ç¥­¨ï ᢮¡®¤­ëå ¨ ¯¥à¢®£® ᢮¡®¤­®£® ᥪâ®à®¢ ­  "­¥®¯à¥¤¥«¥­®" ; á¡à á뢠¥â §­ ç¥­¨¥ ᢮¡®¤­ëå ª« áâ¥à®¢ ­  "­¥®¯à¥¤¥«¥­®"
RESET_FSInfo: LD A,(CORE_BUFFERS.FatBuffer.RESET_FSINFO) ; ¬¥­ï¥â §­ ç¥­¨¥ ¯¥à¢®£® ᢮¡®¤­®£® ª« áâ¥à 
SET_FSInfo: LD A,(CORE_BUFFERS.FatBuffer.RESET_FSINFO)
OR A OR A
RET Z RET Z
; ;
CALL READ_FSinfo CALL READ_FSinfo
; ;
LD HL,CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT ;!TODO FREE_CLUSTERS_COUNT
LD B,8 ; 2 x DWORD LD HL,#FFFF
LD A,#FF LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER),HL
; LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER+2),HL
.fsinfo_loop: LD (HL),A ; FIRST_FREE_CLUSTER
INC HL LD HL,(G_CLUST.low)
DJNZ .fsinfo_loop LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER),HL
LD HL,(G_CLUST.high)
LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER+2),HL
; ;
XOR A XOR A
LD (CORE_BUFFERS.FatBuffer.RESET_FSINFO),A LD (CORE_BUFFERS.FatBuffer.RESET_FSINFO),A
@ -32,18 +35,16 @@ RESET_FSInfo: LD A,(CORE_BUFFERS.FatBuffer.RESET_FSINFO)
; <20>à®ç¨â âì BPB ¢ SECTOR_BUFFER ; <20>à®ç¨â âì BPB ¢ SECTOR_BUFFER
READ_BPB: LD C,Dss.DRV.GetBPB READ_BPB: LD C,Dss.DRV.GetBPB
JR RW_SECTOR JR RW_SECTOR
;
; ‡ ¯¨á âì FSinfo ¨§ SECTOR_BUFFER ; ‡ ¯¨á âì FSinfo ¨§ SECTOR_BUFFER
WRITE_FSinfo: LD IX,(CORE_BUFFERS.FatBuffer.FSINFO_Sector) WRITE_FSinfo: LD IX,(CORE_BUFFERS.FatBuffer.FSINFO_Sector)
LD HL,0 LD HL,0
;JR WRITE_SECTOR
; ‡ ¯¨á âì ᥪâ®à ¨§ SECTOR_BUFFER ; ‡ ¯¨á âì ᥪâ®à ¨§ SECTOR_BUFFER
; ‚室: HL:IX = Logical Block (sector) ; ‚室: HL:IX = Logical Block (sector)
WRITE_SECTOR: LD BC,1*256 + Dss.DRV.Write WRITE_SECTOR: LD BC,1*256 + Dss.DRV.Write
JR RW_SECTOR JR RW_SECTOR
;
; <20>à®ç¨â âì FSinfo ¢ SECTOR_BUFFER ; <20>à®ç¨â âì FSinfo ¢ SECTOR_BUFFER
READ_FSinfo: READ_FSinfo: LD IX,(CORE_BUFFERS.FatBuffer.FSINFO_Sector)
LD IX,(CORE_BUFFERS.FatBuffer.FSINFO_Sector)
LD HL,0 LD HL,0
; <20>à®ç¨â âì ᥪâ®à ¢ SECTOR_BUFFER ; <20>à®ç¨â âì ᥪâ®à ¢ SECTOR_BUFFER
; ‚室: HL:IX = Logical Block (sector) ; ‚室: HL:IX = Logical Block (sector)
@ -712,7 +713,7 @@ RD_BPB: ; LD C,SLOT3
LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_H),A LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_H),A
LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT32) LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT32)
.skip_high: LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_L),DE .skip_high: LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_L),DE
; ;!TODO ¢ë¡®à  ªâ¨¢­®© FAT ¤«ï fat32
LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.Number_of_FATs) ; amount FATs LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.Number_of_FATs) ; amount FATs
CP 1 CP 1
JR Z,.one_FAT JR Z,.one_FAT
@ -1023,25 +1024,38 @@ RD_BPB: ; LD C,SLOT3
LD DE,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.DATA_SIGNATURE + 2) LD DE,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.DATA_SIGNATURE + 2)
LD BC,#7272 LD BC,#7272
SBC HL,BC SBC HL,BC
JR NZ,.error_sig JR NZ,.error
EX DE,HL EX DE,HL
LD DE,#6141 LD DE,#6141
SBC HL,DE SBC HL,DE
JR NZ,.error_sig JR NZ,.error
; !FIXIT ᤥ« âì ¯à®¢¥àªã ª« áâ¥à®¢ ­  ¢ «¨¤­®áâì (­¥ ¡®«ìè¥ ¬ ªá¨¬ «ì­®£® ¤«ï à §¤¥« ) ; FIRST_FREE_CLUSTER
LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER) LD DE,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER+2)
LD (G_CLUST.low),HL LD BC,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER)
LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER+2) LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterLow)
LD (G_CLUST.high),HL ; CF = 0
LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT) ;!TODO MaxCluster - ¬ ªá¨¬ «ì­® ¤®¯ãáâ¨¬ë© ¨«¨ ­  1 ¡®«ìè¥ ¬ ªá¨¬ «ì­® ¤®¯ãá⨬®£®?
LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL SBC HL,BC
LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT+2) LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterHigh)
LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),HL SBC HL,DE
JR C,.error
;
LD (G_CLUST.high),DE
LD (G_CLUST.low),BC
;!TODO FREE_CLUSTERS_COUNT
;LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT)
;LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL
;LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT+2)
;LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),HL
;
XOR A XOR A
RET .error: LD (CORE_BUFFERS.FatBuffer.RESET_FSINFO),A
.error_sig: LD HL,#FFFF RET Z
LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL ;!TODO FREE_CLUSTERS_COUNT
LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),HL ;LD HL,#FFFF
;LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL
;LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),HL
;
XOR A XOR A
LD H,A LD H,A
LD L,2 LD L,2

View File

@ -13,6 +13,91 @@
;RX01 10-02-1999 DNS UPGRADE FAT CASH ;RX01 10-02-1999 DNS UPGRADE FAT CASH
;--------------------------------------------------------------- ;---------------------------------------------------------------
; “¤ «ï¥â § ¯¨áì ¢ ª â «®£¥ ¨ ®á¢®¡®¦¤ ¥â § ­ïâãî æ¥¯®çªã ª« áâ¥à®¢
; ‚室: IX - 㪠§ â¥«ì ­  㤠«ï¥¬ãî § ¯¨áì ¢ DIRPAGE
;!TODO record index. ¢®§¬®¦­®, çâ® ¬®¦¥â á«®¬ âìáï, ¥á«¨ ¡®«ìè¥ áâà ­¨æë
DELETE_REC_FAT: SET_PAGE_X DIRPAGE
EX AF,AF'
CALL DELETE_LFN_RECORDS ; [x] 㤠«¥­¨¥ § ¯¨á¨ LFN
LD (IX + FAT_DIRECTORY_RECORD.NAME),#E5 ; ¯à¨§­ ª 㤠«¥­¨ï ä ©« 
; fat32
LD E,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) ; ü ¯¥à¢®£® ª« áâ¥à 
LD D,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1)
LD A,E
OR D
EXX
LD E,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) ; ü ¯¥à¢®£® ª« áâ¥à 
LD D,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1)
OR D
OR E
;
EX AF,AF'
OUT (SLOT3),A
EX AF,AF'
JP Z,SAVEDIR ; á¡à®á¨âì ª¥è ª â «®£  ­  ¤¨áª
; ¥á«¨ à §¬¥à ä ©«  ­¥ ­®«ì
.loop: EX DE,HL ; hl=­®¬¥à ª« áâ¥à 
EXX
EX DE,HL
EXX
CALL READ_FROM_FAT ; ¯à®ç¨â âì ¨§ ª¥è  FAT-  ­®¬¥à á«¥¤. ª« áâ¥à 
EXX
PUSH DE ; ­®¬¥à á«¥¤. ª« áâ¥à 
PUSH AF
LD DE,#0000 ; ­®¬¥à ª« áâ¥à 
EXX
PUSH DE
;
CALL SET_NEW_FREE_CLUSTER
;
LD DE,#0000 ; ­®¬¥à ª« áâ¥à 
CALL WRITE_TO_FAT.Custom ; § ¯¨á âì ¢ ª¥è FAT-  ­®¬¥à ª« áâ¥à 
POP DE
EXX
POP AF
POP DE
EXX
JP NC,.loop
CALL WRITE_FAT_TABLE
JP SAVEDIR ; á¡à®á¨âì ª¥è ª â «®£  ­  ¤¨áª
; “áâ ­®¢¨âì ¯¥à¢ë¬ ¨§¢¥áâ­ë¬ ª« áâ¥à®¬ ¤«ï ¯®¨áª  ᢮¡®¤­®£®.
; “áâ ­®¢¨âáï ⮫쪮 ¥á«¨ ¬¥­ìè¥ ¯à¥¤ë¤ã饣®
; ‚室: HL':HL - cluster
; [x] à ­ìè¥ ¡ë« è ­á 㯥à¥âìáï ¢ "DISK FULL" ¥á«¨ G_CLUST 㪠§ë¢ « ­  ª« áâ¥à ¤ «ìè¥, 祬 ¤à㣮© ᢮¡®¤­ë©
SET_NEW_FREE_CLUSTER:
XOR A
LD B,D
LD C,E
EX DE,HL
LD HL,(G_CLUST.low)
SBC HL,DE
EX DE,HL
LD D,B
LD E,C
;
EXX
LD B,D
LD C,E
EX DE,HL
LD HL,(G_CLUST.high)
SBC HL,DE
EX DE,HL
LD D,B
LD E,C
EXX
RET C
;
JR G_CLUST.set_new
; LD (G_CLUST.low),HL
; EXX
; LD (G_CLUST.high),HL
; EXX
; XOR A
; INC A
; LD (CORE_BUFFERS.FatBuffer.RESET_FSINFO),A
; RET
; ;
; [x] fat32 ;!TEST ; [x] fat32 ;!TEST
; ­ ©â¨ ¯¥à¢ë© ᢮¡®¤­ë© ª« áâ¥à ;!TODO ¯à®¢¥à¨âì ¯¥à¥¡®à ª« áâ¥à®¢ ; ­ ©â¨ ¯¥à¢ë© ᢮¡®¤­ë© ª« áâ¥à ;!TODO ¯à®¢¥à¨âì ¯¥à¥¡®à ª« áâ¥à®¢
@ -44,10 +129,13 @@ G_CLUST: ;
OR D OR D
OR E OR E
JR NZ,.loop JR NZ,.loop
.set_new: ; A = 0
LD (G_CLUST.low),HL LD (G_CLUST.low),HL
EXX EXX
LD (G_CLUST.high),HL LD (G_CLUST.high),HL
EXX EXX
INC A
LD (CORE_BUFFERS.FatBuffer.RESET_FSINFO),A
RET RET
; ;
@ -56,8 +144,7 @@ G_CLUST: ;
; ‚室: HL':HL - ­®¬¥à ª« áâ¥à  ª ª®â®à®¬ã ¯à¨ªà¥¯¨âì ¯ãá⮩ ; ‚室: HL':HL - ­®¬¥à ª« áâ¥à  ª ª®â®à®¬ã ¯à¨ªà¥¯¨âì ¯ãá⮩
; ‚ë室: HL':HL - ­®¬¥à ª« áâ¥à  ª ª®â®à®¬ã ¯à¨ªà¥¯¨«áï ¯ãá⮩ ; ‚ë室: HL':HL - ­®¬¥à ª« áâ¥à  ª ª®â®à®¬ã ¯à¨ªà¥¯¨«áï ¯ãá⮩
; DE':DE - ­®¬¥à ¯ãá⮣® ª« áâ¥à  ; DE':DE - ­®¬¥à ¯ãá⮣® ª« áâ¥à 
INC_FAT: INC_FAT: PUSH HL ; ⥪ã騩 ª« áâ¥à
PUSH HL ; ⥪ã騩 ª« áâ¥à
EXX EXX
PUSH HL ; ⥪ã騩 ª« áâ¥à PUSH HL ; ⥪ã騩 ª« áâ¥à
EXX EXX
@ -235,6 +322,24 @@ READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER
POP HL POP HL
LD A,0 LD A,0
RET RET
;
; ‚室: HL - <20>®¬¥à ¯¥à¢®© ï祩ª¨ ª« áâ¥à  ¢ ¡«®ª¥ ä â 
; <20>®àâ¨âì ⮫쪮 HL ¨ A
SET_FAT32_CACHE_BLOCK_CHANGED_REGION:
LD A,H
AND #38
LD HL,#0108
JR Z,.set_region
;
.loop: SLA H
SUB L
JR NZ,.loop
;
.set_region: LD A,(CORE_BUFFERS.FatBuffer.CacheUpdated)
OR H
LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A
RET
; ;
; [x] fat32 ;!TEST ; [x] fat32 ;!TEST
@ -302,13 +407,17 @@ WRITE_TO_FAT: LD DE,(CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L) ;
LD (HL),E ; á®åà. ¢ ª¥è¥ FAT-  LD (HL),E ; á®åà. ¢ ª¥è¥ FAT- 
INC HL ; ­®¬¥à ª« áâ¥à  INC HL ; ­®¬¥à ª« áâ¥à 
LD (HL),D LD (HL),D
.exit: POP AF ; ¢®ááâ. ¯®àâ ;
.exit: ; [ ] ã᪮७¨¥ à ¡®âë á ªí襬 FAT
CALL SET_FAT32_CACHE_BLOCK_CHANGED_REGION
;
POP AF ; ¢®ááâ. ¯®àâ
POP HL POP HL
OUT (SLOT3),A OUT (SLOT3),A
; [x] 2/12/23 FAT ­¥ ¢á¥£¤  ¬®£ § ¯¨á âìáï ­  HDD ; [x] 2/12/23 FAT ­¥ ¢á¥£¤  ¬®£ § ¯¨á âìáï ­  HDD
XOR A ;XOR A
INC A ;INC A
LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A ;LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A
; CF = 0 ; CF = 0
RET RET
; ;
@ -362,7 +471,10 @@ WRITE_TO_FAT: LD DE,(CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L) ;
INC HL INC HL
LD (HL),C LD (HL),C
INC HL INC HL
LD (HL),B LD A,(HL)
AND #F0
OR B
LD (HL),A
JR .exit JR .exit
;;;;;;;;; ;;;;;;;;;
@ -459,7 +571,7 @@ WRITE_FAT_TABLE:
; ‡ ¯¨áì ª¥è  FAT-  ­  ¤¨áª ; ‡ ¯¨áì ª¥è  FAT-  ­  ¤¨áª
.Start: LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) .Start: LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE)
CP FAT_TYPE.x32 CP FAT_TYPE.x32
CALL Z,RESET_FSInfo CALL Z,SET_FSInfo
LD HL,(CORE_BUFFERS.FatBuffer.CacheBlock) LD HL,(CORE_BUFFERS.FatBuffer.CacheBlock)
;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT ;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT
CALL GET_SECTOR_OF_FAT CALL GET_SECTOR_OF_FAT
@ -556,16 +668,73 @@ WRITE_FAT_TABLE:
LD D,XH LD D,XH
LD E,XL LD E,XL
EX DE,HL EX DE,HL
; LD H,0
; LD L,C
LD XH,D LD XH,D
LD XL,E LD XL,E
; HL:IX - ᬥ饭¨¥ ¢­ãâਠࠧ¤¥«  ­  ­ ç «® ­ã¦­®£® ¡«®ª  FAT ; HL:IX - ᬥ饭¨¥ ¢­ãâਠࠧ¤¥«  ­  ­ ç «® ­ã¦­®£® ¡«®ª  FAT
LD A,(CORE_BUFFERS.FatBuffer.CacheUpdated)
CP #FF
JR NZ,.SAVE_NOT_ALL_BLOCK
;
LD DE,FATPAGE.cache ; ®âªã¤  LD DE,FATPAGE.cache ; ®âªã¤ 
LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª  LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª 
LD C,Dss.DRV.Write LD C,Dss.DRV.Write
JP ToDSS.DRV JP ToDSS.DRV
.SAVE_NOT_ALL_BLOCK:
; A = CORE_BUFFERS.FatBuffer.CacheBlock
; HL:IX - ᬥ饭¨¥ ¢­ãâਠࠧ¤¥«  ­  ­ ç «® ­ã¦­®£® ¡«®ª  FAT
; B = ¬ ªá¨¬ «ì­®¥ ç¨á«® ¡«®ª®¢ ¤«ï § ¯¨á¨
EXX
LD HL,FATPAGE.cache
LD DE,#0800 ;!HARDCODE à §¬¥à ॣ¨®­  ¢ ¡«®ª¥ Š<>˜  FAT (¡ ©â®¢)
EXX
LD C,A
LD A,B
LD B,8 ;!HARDCODE ª®«¨ç¥á⢮ ॣ¨®­®¢ ¢ ¡«®ª¥ Š<>˜  FAT
LD DE,4 ;!HARDCODE à §¬¥à ॣ¨®­  ¢ ¡«®ª¥ Š<>˜  FAT (ᥪâ®à®¢)
; ç⮡ ­¥ ­ áà âì §  £à ­¨æë FAT
.region_loop: SUB A,E
JR NC,.good_blk
; ¬ ªá¨¬ «ì­® ¤®¯ãáâ¨¬ë© ¡«®ª ¤«ï § ¯¨á¨ ¬¥­ìè¥, 祬 å®ç¥âáï
ADD A,E
LD E,A
;
.good_blk: SRL C
JR C,.SAVE_FAT_CACHE_REGION
EXX
ADD HL,DE
EXX
ADD IX,DE
JR NC,.no_inc_HL
INC HL
.no_inc_HL: DJNZ .region_loop
RET
; HL' - €¤à¥á ¢ áâà ­¨æ¥ Š<>˜ 
; HL:IX - ᬥ饭¨¥ ¢­ãâਠࠧ¤¥«  ­  ­ ç «® ­ã¦­®£® <20>…ƒˆŽ<CB86>€ ¡«®ª  FAT
.SAVE_FAT_CACHE_REGION:
PUSH AF
PUSH DE
PUSH BC
;
EXX
PUSH HL
EXX
LD B,E ; ª®«-¢® ᥪâ®à®¢
POP DE ; €¤à¥á ¢ áâà ­¨æ¥ Š<>˜ 
LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª 
LD C,Dss.DRV.Write
RST ToDSS.DRV
PUSH DE
EXX
POP HL
LD DE,#0800 ;!HARDCODE à §¬¥à ॣ¨®­  ¢ ¡«®ª¥ Š<>˜  FAT (¡ ©â®¢)
EXX
;
POP BC
POP DE
POP AF
DJNZ .region_loop
RET
;----------------------------------------------------------------------- ;-----------------------------------------------------------------------
; ;
;[x] fat32 ;!TEST ;[x] fat32 ;!TEST
@ -692,13 +861,19 @@ GET_FAT12_CELL:
; in: HL':HL - CLUSTER ; in: HL':HL - CLUSTER
; out: HL:IX - SECTOR ; out: HL:IX - SECTOR
CLUSTER_TO_SECTOR: CLUSTER_TO_SECTOR:
PUSH BC
EXX EXX
PUSH HL PUSH HL
EXX EXX
POP DE POP DE
; DE:HL - cluster ; DE:HL - cluster
DEC HL ;
DEC HL LD BC,-2
ADD HL,BC
JR C,.no_dec_de
DEC DE
.no_dec_de: ; cluster = cluster - 2
;
LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster)
XOR 1 XOR 1
JR Z,.skip JR Z,.skip
@ -725,6 +900,7 @@ CLUSTER_TO_SECTOR:
;LD E,A ;LD E,A
; ;
ADC HL,DE ADC HL,DE
POP BC
RET RET
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////

View File

@ -175,7 +175,7 @@
; IDE1 EQU #0C1C8 ; IDE1 EQU #0C1C8
PARTITION_BUFFER _sBOOT_SECTOR = #C000 ; EQU #C000 _sBOOT_SECTOR PARTITION_BUFFER _sBOOT_SECTOR = #C000 ; EQU #C000 _sBOOT_SECTOR
HDDRIVE INC C HDDRIVE: INC C
DEC C DEC C
JP Z,INIT_H ; c=0 Initialization JP Z,INIT_H ; c=0 Initialization
DEC C DEC C
@ -195,12 +195,13 @@ HDDRIVE INC C
DEC C DEC C
JP Z,IOCTL_H ; c=8 ã§­ âì £¥®¬¥âà¨î ¤¨áª  Generic IOCTL JP Z,IOCTL_H ; c=8 ã§­ âì £¥®¬¥âà¨î ¤¨áª  Generic IOCTL
DEC C DEC C
JP Z,RESR_H ; c=9 Reserved JP Z,.Reserved ; c=9 Reserved
DEC C DEC C
JP Z,LREADH ; c=10 Read Long JP Z,LREADH ; c=10 Read Long
DEC C DEC C
JP Z,LWRITEH ; c=11 Write Long JP Z,LWRITEH ; c=11 Write Long
RESR_H LD A,DSS_Error.drv.INVALID_COMMAND ;
.Reserved: LD A,DSS_Error.drv.INVALID_COMMAND
SCF SCF
RET RET
@ -280,23 +281,20 @@ DRVCLC: ; INC A
; LOGDRV: BLOCK .TBL_Entry * LD_DSK,0 ; LOGDRV: BLOCK .TBL_Entry * LD_DSK,0
; .TBL_Entry EQU 16 ; .TBL_Entry EQU 16
; .Size EQU $-LOGDRV ; .Size EQU $-LOGDRV
SELHDD: PUSH DE SELHDD: PUSH DE
PUSH BC
PUSH HL PUSH HL
; ;
LD L,A LD L,A
LOGDRV_ENTRY_FIND LOGDRV LOGDRV_ENTRY_FIND LOGDRV
; !HARDCODE ; !HARDCODE
LD C,(IY+1) LD E,(IY+1)
LD B,(IY+2) LD D,(IY+2)
ADD IX,DE
LD E,(IY+3) LD E,(IY+3)
LD D,(IY+4) LD D,(IY+4)
POP HL POP HL
ADD IX,BC
ADC HL,DE ADC HL,DE
LD A,(IY+0) ;DRIVE NUMBER LD A,(IY+0) ;DRIVE NUMBER
POP BC
POP DE POP DE
RET RET

View File

@ -1 +1 @@
954 955

View File

@ -27,7 +27,8 @@
;LD_DSK EQU 16 ; ¬ ªá¨¬ «ì­®¥ ª®«¨ç¥á⢮ «®£¨ç¥áª¨å HDD ¤¨áª®¢ ¢ á¨á⥬¥ ;LD_DSK EQU 16 ; ¬ ªá¨¬ «ì­®¥ ª®«¨ç¥á⢮ «®£¨ç¥áª¨å HDD ¤¨áª®¢ ¢ á¨á⥬¥
///////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////
DEFINE USE_FSINFO_FAT32 0 ; ­¥¤®¤¥« ­®. ­ã¦­® «¨? DEFINE USE_FSINFO_FAT32 1 ; ­¥¤®¤¥« ­®. ­ã¦­® «¨?
DEFINE CHANGE_FREE_CLU_AFTER_DEL 1
SERVICE_SECTORS: SERVICE_SECTORS:
.FAT12 EQU #0FEF .FAT12 EQU #0FEF