@ -1,5 +1,5 @@
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
; FAT 12-16
; FAT 12-16 -32
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
;[BEGIN]
@ -13,8 +13,8 @@
;RX01 10-02-1999 DNS UPGRADE FAT CASH
;---------------------------------------------------------------
; “áâ ®¢¨âì ç «ìë© ª« áâ¥à ¤«ï ç⥨ï
; [x] fat32 ;!TEST
; “áâ ®¢¨âì ç «ìë© ª« áâ¥à ¤«ï ç⥨ï
R_CLUST: LD HL , # 0001
LD ( G_CLUST.low ), HL
DEC L
@ -22,6 +22,7 @@ R_CLUST: LD HL,#0001
RET
;
; [x] fat32 ;!TEST
; ©â¨ ¯¥à¢ë© ᢮¡®¤ë© ª« áâ¥à ;!TODO ¯à®¢¥à¨âì ¯¥à¥¡®à ª« áâ¥à®¢
; ¢ë室: HL - ¬« ¤è¨© ®¬¥à ᢮¡®¤®£® ª« áâ¥à
@ -56,11 +57,12 @@ G_CLUST: ;
EXX
RET
;
; [x] fat32 ;!TEST
; <20> ਪ९¨âì ª ¯®á«¥¤¥¬ã ª« áâ¥àã æ¥¯®çª¨ ®¢ë© ¯ãá⮩ ª« áâ¥à
; ‚室: HL':HL - ®¬¥à ª« áâ¥à ª ª®â®à®¬ã ¯à¨ªà¥¯¨âì ¯ãá⮩
; ‚ë室: HL':HL - ®¬¥à ª« áâ¥à ª ª®â®à®¬ã ¯à¨ªà¥¯¨«áï ¯ãá⮩
; DE':DE - ®¬¥à ¯ãá⮣® ª« áâ¥à
; [x] fat32 ;!TEST
INC_FAT:
PUSH HL ; ⥪ã騩 ª« áâ¥à
EXX
@ -107,9 +109,9 @@ INC_FAT:
;RX01
; ¢å®¤: de = ¬« ¤è¥¥ á«®¢® ®¬¥à ª« áâ¥à ¤«ï áà ¢¥¨ï á FAT_Max_Cluster
; de' = áâ à襥 á«®¢® ®¬¥à ª« áâ¥à ¤«ï áà ¢¥¨ï á FAT_Max_Cluster (⮫쪮 ¤«ï fat32)
; [x] fat32 ;!TEST
; ¢å®¤: hl = ¬« ¤è¥¥ á«®¢® ®¬¥à ª« áâ¥à ¤«ï áà ¢¥¨ï á FAT_Max_Cluster
; hl' = áâ à襥 á«®¢® ®¬¥à ª« áâ¥à ¤«ï áà ¢¥¨ï á FAT_Max_Cluster (⮫쪮 ¤«ï fat32)
CHECK_CLUSTER_IS_SMALLER:
LD A ,( FatBuffer.FAT_TYPE )
XOR FAT_TYPE.x32
@ -133,20 +135,21 @@ CHECK_CLUSTER_IS_SMALLER:
EX DE , HL
LD A , DS S_Error.sys.DISK_FULL
RET
;
;
;
;[x] fat32 ;!TEST
;------------------------------------------------------------------------------------------------
; <20> à®ç¨â âì ¨§ ª¥è FAT- ®¬¥à á«¥¤. ª« áâ¥à
; ¢å®¤: hl - ®¬¥à ª« áâ¥à (¬« ¤è¥¥ á«®¢®)
; hl' - ®¬¥à ª« áâ¥à (áâ à襥 á«®¢®. ⮫쪮 ¤«ï FAT32)
; hl' - ®¬¥à ª« áâ¥à (áâ à襥 á«®¢®. ⮫쪮 ¤«ï FAT32)
; ¢ë室: hl - ®¬¥à ª« áâ¥à (¬« ¤è¥¥ á«®¢®)
; hl' - ®¬¥à ª« áâ¥à (áâ à襥 á«®¢®)
; hl' - ®¬¥à ª« áâ¥à (áâ à襥 á«®¢®)
; de - ®¬¥à á«¥¤. ª« áâ¥à (¬« ¤è¥¥ á«®¢®)
; de' - ®¬¥à á«¥¤. ª« áâ¥à (áâ à襥 á«®¢®)
; ¥á«¨ DE':DE = 0, â® ª« áâ¥à HL':HL ᢮¡®¤¥
; CF - ª®¥æ 楯®çª¨
;------------------------------------------------------------------------------------------------
;[x] fat32 ;!TEST
READ_FROM_FAT: CALL CH ECK_CLUSTER_IS_SMALLER
RET C
;
@ -172,6 +175,7 @@ READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER
; ¯à®¢¥àª á«ã¦. ª« áâ¥àë
SBC HL , DE
POP HL
;!FIXIT fat32 ¯¥à¥áâà 客ª
EXX
LD H , A
LD L , A
@ -180,6 +184,7 @@ READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER
EXX
RET
;
;
.FAT12: CALL GET_FAT12_CELL
LD E ,( HL )
INC HL
@ -236,17 +241,20 @@ READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER
LD A , B
OUT ( SLOT3 ), A
RET
;
; [x] fat32 ;!TEST
;------------------------------------------------------------------------------------------------
; ‡ ¯¨á âì ¢ ª¥è FAT- ®¬¥à ª« áâ¥à
; ¢å®¤: hl = ¬« ¤è¥¥ á«®¢® ®¬¥à ª« áâ¥à ¢ ª®â®àë© § ¯¨á âì
; hl' = áâ à襥 á«®¢® ®¬¥à ª« áâ¥à ¢ ª®â®àë© § ¯¨á âì (⮫쪮 ¤«ï fat32)
; .Custom:
; de = ¬« ¤è¥¥ á«®¢® ®¬¥à ª« áâ¥à ª®â®à®¥ ¢¯¨á âì
; de' = áâ à襥 á«®¢® ®¬¥à ª« áâ¥à ª®â®à®¥ ¢¯¨á âì (⮫쪮 ¤«ï fat32)
; ¢ë室: HL':HL â ª¨¥ ¦¥ ª ª ¨ ¢å®¤¥
; .Custom:
; .Custom:
; HL':HL ¨ DE':DE â ª¨¥ ¦¥ ª ª ¨ ¢å®¤¥
;------------------------------------------------------------------------------------------------
; [x] fat32 ;!TEST
WRITE_TO_FAT: LD DE ,( FatBuffer.ENDCLUS_LOW ) ; ®¬¥à ª« áâ¥à
EXX
LD DE ,( FatBuffer.ENDCLUS_HIGH ) ; ®¬¥à ª« áâ¥à
@ -324,12 +332,12 @@ WRITE_TO_FAT: LD DE,(FatBuffer.ENDCLUS_LOW) ;
;
.FAT32: ; [x] fat32 ;!TEST
EXX
PUSH DE ; áâ à訩 ®¬¥à ª« áâ¥à ª®â®àë© ¢¯¨á âì
PUSH HL ; áâ à襥 á«®¢® ®¬¥à ª« áâ¥à ¢ ª®â®àë© § ¯¨á âì
PUSH DE ; áâ à訩 ®¬¥à ª« áâ¥à ª®â®àë© ¢¯¨á âì
PUSH HL ; áâ à襥 á«®¢® ®¬¥à ª« áâ¥à ¢ ª®â®àë© § ¯¨á âì
EXX
CALL GET_FAT32_CELL
EXX
POP HL ; áâ à襥 á«®¢® ®¬¥à ª« áâ¥à ¢ ª®â®àë© § ¯¨á âì
POP HL ; áâ à襥 á«®¢® ®¬¥à ª« áâ¥à ¢ ª®â®àë© § ¯¨á âì
EXX
POP DE ; áâ à訩 ®¬¥à ª« áâ¥à ª®â®àë© ¢¯¨á âì
POP BC ; ¬« ¤è¨© ®¬¥à ª« áâ¥à ª®â®àë© ¢¯¨á âì
@ -346,11 +354,11 @@ WRITE_TO_FAT: LD DE,(FatBuffer.ENDCLUS_LOW) ;
; [x] fat32 ;!TEST
;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT
; in: HL - Cache block
; out: C:HL - logical number
; B = 0
; [x] fat32 ;!TEST
GET_SECTOR_OF_FAT:
LD A ,( FatBuffer.FAT_TYPE )
LD B , FAT_CACHE.Degree_32 ;!FIXIT ᤥ« âì ç¥à¥§ ¯¥à¥¬¥ãî
@ -385,10 +393,10 @@ GET_SECTOR_OF_FAT:
;;;;;;;;;
; [x] fat32 ;!TEST
;RE_FAT:
;RX01
; <20> à®ç¨â âì ¢ ª¥è •• ᥪâ®à®¢ FAT-
; [x] fat32 ;!TEST
; DE - NEW FAT BLOCK
READ_FAT_TABLE: PUSH HL
PUSH DE
@ -425,8 +433,8 @@ READ_FAT_TABLE: PUSH HL
RET
; <20> ®¤ª«îç¨âì ¡ ªã ª¥è FAT ¨ § ¯¨á âì ¥£® ¤¨áª
; [x] fat32 ;!TEST
; <20> ®¤ª«îç¨âì ¡ ªã ª¥è FAT ¨ § ¯¨á âì ¥£® ¤¨áª
WRITE_FAT_TABLE:
SET_PAGE_X FATPAGE
PUSH AF
@ -543,10 +551,10 @@ WRITE_FAT_TABLE:
JP ToDSS.DRV
;-----------------------------------------------------------------------
;¢å®¤: HL':HL - ®¬¥à ª« áâ¥à
;¢ë室: HL - ¤à¥á 㦮© ï祩ª¨ ¢ áâà ¨æ¥ FATPAGE
;
;[x] fat32 ;!TEST
;¢å®¤: HL':HL - ®¬¥à ª« áâ¥à
;¢ë室: HL - ¤à¥á 㦮© ï祩ª¨ ¢ áâà ¨æ¥ FATPAGE
GET_FAT32_CELL:
; ¤¢¨£ ¥¬ ¢«¥¢® HL':H
LD A , H
@ -572,7 +580,7 @@ GET_FAT32_CELL:
LD H , A
ADD HL , HL
ADD HL , HL
PUSH HL ; [ ] fat32 á®åà 塞 á«ãç ©, ¥á«¨ READ_FAT_TABLE ¨á¯®àâ¨â
PUSH HL ; [ ç ] fat32 á®åà 塞 á«ãç ©, ¥á«¨ READ_FAT_TABLE ¨á¯®àâ¨â
AND A
;
EXX
@ -663,10 +671,10 @@ GET_FAT12_CELL:
;[x] fat32 ;!TEST
;NSECTOR:
; in: HL':HL - CLUSTER
; out: HL:IX - SECTOR
;[x] fat32 ;!TEST
CLUSTER_TO_SECTOR:
EXX
PUSH HL
@ -705,17 +713,16 @@ CLUSTER_TO_SECTOR:
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
; 225ÿ937ÿ408 / 512 = 0x6BBC4 / 4 = 0x1AEF1
;
;READ SECTORS OF FILE
;HL:DE - FP (in sectors)
; B - Amount sectors
; IX - buffer in RAM
; [ ] fat32
BLOCK_READ: PUSH BC
LD ( READ.PointerOnBuffer ), IX
; [x] fat32 ;!TEST
; READ SECTORS OF FILE
; ¢å®¤: HL:DE - FP (in sectors)
; IY - FM
; IX - buffer in RAM
; B - ª®«¨ç¥á⢮ ᥪâ®à®¢ ¤«ï ç⥨ï
BLOCK_READ: LD ( READ.PointerOnBuffer ), IX
LD A ,( CORE_BUFFERS.BootSector.SectorsPerCluster ) ;SECTORS PER CLUSTER
LD C , A
PUSH BC ; B - ª®«¨ç¥á⢮ ᥪâ®à®¢ ¤«ï ç⥨ï, C - SectorsPerCluster
; HL:DE / A => DE:BC, H=0, L - ®áâ ⮪
CALL DI V_for_SPC
PUSH HL ; ®áâ ⮪ DIV_for_SPC
@ -723,16 +730,17 @@ BLOCK_READ: PUSH BC
PUSH BC ; ¬« ¤è¥¥ á«®¢® ®¬¥à ª« áâ¥à
PUSH DE ; [x] 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 Low
LD H ,( IY + _sFM.FS_REC.FIRST_CLUSTER_L + 1 )
OR L
OR H
; 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 Low
; LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1)
; OR L
; OR H
CALL CH ECK_FIRST_CLUSTER
JR Z , .fast_exit_4
CALL GetSavedCluster
;HL': HL - ¨§¢¥áâë© ª« áâ¥à ä ©« ¤«ï ®âáçñâ
@ -759,7 +767,7 @@ BLOCK_READ: PUSH BC
JR C , .fast_exit_5 ;RY01
EX DE , HL
EXX
EX DE , HL
EX DE , HL
EXX
.enter_loop1: INC B
DEC BC ; ‚ ‘ - ᬥ饨¥ ¢ãâà¨ ä ©« ¢ ª« áâ¥à å (¬« ¤è¥¥ á«®¢®)
@ -771,28 +779,32 @@ BLOCK_READ: PUSH BC
;;;;
;
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
POP DE
POP BC ; B - Amount sectors
POP DE ; [x] fat32 áâ à襥 á«®¢® ®¬¥à ª« áâ¥à
POP BC ; ¬« ¤è¥¥ á«®¢® ®¬¥à ª« áâ¥à
CALL SaveGotCluster
;
POP DE ; D = 0, E = ®áâ ⮪ DIV_for_SPC
POP BC ; B = Amount sectors
POP BC ; B - ª®«¨ç¥á⢮ ᥪâ®à®¢ ¤«ï ç⥨ï, C - SectorsPerCluster
; (SP) = (RET)
; à ¡®â á ®áâ ⪮¬ ®â ¤¥«¥¨ï
LD A , ( C ORE_BUFFERS.BootSector.SectorsPerCluster)
LD A , C
SUB E
LD C , A
CP B
JR C , .skip1 ; SIZE > RESIDUE CLUSTER
LD C , B ; SIZE < CLUSTER
CP B ; (SectorsPerCluster - ®áâ ⮪) - ª®«¨ç¥á⢮ ᥪâ®à®¢ ¤«ï ç⥨ï
JR C , .skip1 ; SIZE > RESIDUE CLUSTER
LD C , B ; SIZE < CLUSTER
.skip1: LD A , B
SUB C
LD B , A
PUSH HL ; ®¬¥à ª« áâ¥à ¬« ¤è ï ç áâì
PUSH BC
PUSH DE
;
EXX
PUSH HL ; ®¬¥à ª« áâ¥à áâ àè ï ç áâì
EXX
PUSH HL ; ®¬¥à ª« áâ¥à ¬« ¤è ï ç áâì
PUSH BC ; B = ª®«¨ç¥á⢮ ᥪâ®à®¢ ¤®ç¨âªã, C = (SectorsPerCluster - ®áâ ⮪) «¨¡® ª®«¨ç¥á⢮ ᥪâ®à®¢ ¤«ï ç⥨ï
PUSH DE ; D = 0, E = ®áâ ⮪ DIV_for_SPC
CALL CL USTER_TO_SECTOR
POP DE
POP DE ; D = 0, E = ®áâ ⮪ DIV_for_SPC
ADD IX , DE
JR NC , .skip2
INC HL
@ -801,24 +813,25 @@ BLOCK_READ: PUSH BC
LD B , C
LD C , Ds s.DRV.Read
RST ToDSS.DRV
;
JR C , .Error
; [ ] fat32 ???
POP BC
POP BC ; B = ª®«¨ç¥á⢮ ᥪâ®à®¢ ¤®ç¨âªã, C = (SectorsPerCluster - ®áâ ⮪) «¨¡® ª®«¨ç¥á⢮ ᥪâ®à®¢ ¤«ï ç⥨ï
LD HL ,( READ.PointerOnBuffer )
LD DE ,( CORE_BUFFERS.BootSector.BytesPerSector )
;!TEST
LD A , B
LD B , C
.loop2: ADD HL , DE
;DEC C
;JR NZ,.loop2
DJNZ .loop2
LD ( READ.PointerOnBuffer ), HL
POP DE
;LD A,B
OR A
RET Z
LD B , A
LD A , B
LD B , C
.loop2: ADD HL , DE
DJNZ .loop2
;
LD ( READ.PointerOnBuffer ), HL
POP DE ; ®¬¥à ª« áâ¥à ¬« ¤è ï ç áâì
EXX
POP HL ; ®¬¥à ª« áâ¥à áâ àè ï ç áâì
EXX
OR A
RET Z ; ª®«¨ç¥á⢮ ᥪâ®à®¢ ¤®ç¨âªã = 0?
LD B , A
;
.loop4: LD HL , CORE_BUFFERS.BootSector.SectorsPerCluster
LD A , B
@ -834,11 +847,17 @@ BLOCK_READ: PUSH BC
;
.BLOKRD7: EX DE , HL
PUSH BC
; HL':HL - ®¬¥à ª« áâ¥à
CALL READ_FROM_FAT
POP BC
JR C , .ECL1 ;RY01
;
EXX
EX DE , HL
PUSH HL ; ®¬¥à á«¥¤. ª« áâ¥à (áâ à襥 á«®¢®)
EXX
EX DE , HL
PUSH HL
PUSH HL ; ®¬¥à á«¥¤. ª« áâ¥à (¬« ¤è¥¥ á«®¢®)
PUSH BC
CALL CL USTER_TO_SECTOR
LD DE ,( READ.PointerOnBuffer )
@ -847,6 +866,7 @@ BLOCK_READ: PUSH BC
LD C , Ds s.DRV.Read
RST ToDSS.DRV
JR C , .Error
;
POP BC
LD HL ,( READ.PointerOnBuffer )
LD DE ,( CORE_BUFFERS.BootSector.BytesPerSector )
@ -854,11 +874,15 @@ BLOCK_READ: PUSH BC
DEC C
JR NZ , .loop3
LD ( READ.PointerOnBuffer ), HL
POP DE
POP DE ; ®¬¥à á«¥¤. ª« áâ¥à (¬« ¤è¥¥ á«®¢®)
EXX
POP HL ; ®¬¥à á«¥¤. ª« áâ¥à (áâ à襥 á«®¢®)
EXX
JP .loop4
;
.Error: POP BC
POP DE
POP HL
;SCF
RET
;
@ -866,34 +890,12 @@ BLOCK_READ: PUSH BC
RET
;-----------------------------------------------------------------------
; BLOK_WR.Error:
; POP BC
; ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
; POP BC
;
; BLOK_WR.ErrorWrite:
; POP BC
; POP DE
; LD A,DSS_Error.sys.WRITE_ERROR
; SCF
; RET
;
;WRITE SECTORS OF FILE
;HL:DE - FP (in sectors), IX - data in RAM
; B - Amount sectors
; [ ] fat32
BLOK_WR: PUSH BC
LD ( READ.PointerOnBuffer ), IX
LD A ,( CORE_BUFFERS.BootSector.SectorsPerCluster ) ;SECTORS PER CLUSTER
; HL:DE / A => DE:BC, H=0, L - ®áâ ⮪
CALL DI V_for_SPC
PUSH HL ; ®áâ ⮪ DIV_for_SPC
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
PUSH BC ; ¬« ¤è¥¥ á«®¢® ®¬¥à ª« áâ¥à
PUSH DE ; [x] fat32 áâ à襥 á«®¢® ®¬¥à ª« áâ¥à
;
; [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 )
@ -904,19 +906,48 @@ BLOK_WR: PUSH BC
LD H ,( IY + _sFM.FS_REC.FIRST_CLUSTER_L + 1 )
OR L
OR H
RET
; [x] fat32 ;!TEST
; WRITE SECTORS OF FILE
; ¢å®¤: HL:DE - FP (in sectors)
; IX - data in RAM
; IY - FM
; B - ª®«¨ç¥á⢮ ᥪâ®à®¢ ¤«ï § ¯¨á¨
BLOK_WRITE: LD ( READ.PointerOnBuffer ), IX
LD A ,( CORE_BUFFERS.BootSector.SectorsPerCluster ) ;SECTORS PER CLUSTER
LD C , A
PUSH BC ; B - ª®«¨ç¥á⢮ ᥪâ®à®¢ ¤«ï ç⥨ï, C - SectorsPerCluster
; HL:DE / A => DE:BC, H=0, L - ®áâ ⮪
CALL DI V_for_SPC
PUSH HL ; ®áâ ⮪ DIV_for_SPC
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
PUSH BC ; ¬« ¤è¥¥ á«®¢® ®¬¥à ª« áâ¥à
PUSH DE ; [x] 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 CH ECK_FIRST_CLUSTER
JR NZ , .FindCluster
;
PUSH BC ; ¬« ¤è¥¥ á«®¢® ®¬¥à ª« áâ¥à
PUSH DE ; [x] fat32 áâ à襥 á«®¢® ®¬¥à ª« áâ¥à
; [ ] fat32
; [ x ] fat32
CALL G_CLUST
JP C , .Error_6
;
LD ( IY + _sFM.FS_REC.FIRST_CLUSTER_L ), L
LD ( IY + _sFM.FS_REC.FIRST_CLUSTER_L + 1 ), H
; [ ] fat32
; [ x ] fat32
EXX
LD HL , 0 ;!FIXIT
LD ( IY + _sFM.FS_REC.FIRST_CLUSTER_H ), L ; START CLUSTER High
LD ( IY + _sFM.FS_REC.FIRST_CLUSTER_H + 1 ), H
EXX
@ -949,23 +980,15 @@ BLOK_WR: PUSH BC
CALL READ_FROM_FAT
JR NC , .next
; end of chain - get new cluster
; [ ] fat32
; PUSH HL
; EXX
; PUSH HL
; EXX
CALL INC_FAT
; EXX
; POP HL
; EXX
; POP HL
JP C , .Error_6
; [x] ¨§¡ëâ®ç®¥ ®¡à 饨¥ 01/04/2024
;CALL READ_FROM_FAT
;
CALL READ_FROM_FAT
.next: POP BC
EX DE , HL
EXX
EX DE , HL
EX DE , HL
EXX
.enter_loop: INC B
DEC BC
@ -981,49 +1004,58 @@ BLOK_WR: PUSH BC
POP BC
CALL SaveGotCluster
;
POP DE
POP BC
POP DE ; D = 0, E = ®áâ ⮪ DIV_for_SPC
POP BC ; B - ª®«¨ç¥á⢮ ᥪâ®à®¢ ¤«ï ç⥨ï, C - SectorsPerCluster
; (SP) = (RET)
;
LD A , ( C ORE_BUFFERS.BootSector.SectorsPerCluster)
LD A , C
SUB E
LD C , A
CP B
JR C , . WR3 ;SIZE > RESIDUE CLUSTER
CP B ; (SectorsPerCluster - ®áâ ⮪) - ª®«¨ç¥á⢮ ᥪâ®à®¢ ¤«ï ç⥨ï
JR C , . skip1 ;SIZE > RESIDUE CLUSTER
LD C , B ;SIZE < CLUSTER
. WR3 : LD A , B
. skip1 : LD A , B
SUB C
LD B , A
PUSH HL
PUSH BC
PUSH DE
;
EXX
PUSH HL ; ®¬¥à ª« áâ¥à áâ àè ï ç áâì
EXX
PUSH HL ; ®¬¥à ª« áâ¥à ¬« ¤è ï ç áâì
PUSH BC ; B = ª®«¨ç¥á⢮ ᥪâ®à®¢ ¤®ç¨âªã, C = (SectorsPerCluster - ®áâ ⮪) «¨¡® ª®«¨ç¥á⢮ ᥪâ®à®¢ ¤«ï ç⥨ï
PUSH DE ; D = 0, E = ®áâ ⮪ DIV_for_SPC
CALL CL USTER_TO_SECTOR
POP DE
POP DE ; D = 0, E = ®áâ ⮪ DIV_for_SPC
ADD IX , DE
JR NC , .WR4
JR NC , . skip2
INC HL
; DOUBLE 1
. WR4 : LD DE ,( READ.PointerOnBuffer )
. skip2 : LD DE ,( READ.PointerOnBuffer )
LD A ,( FatBuffer.DRIVE )
LD B , C
LD C , Ds s.DRV.Write
RST ToDSS.DRV
LD A , DS S_Error.sys.WRITE_ERROR
JR C , .ErrorWrite
;
LD A , DS S_Error.sys.WRITE_ERROR
JR C , .Error_3
POP BC
LD HL ,( READ.PointerOnBuffer )
LD DE ,( CORE_BUFFERS.BootSector.BytesPerSector )
;
LD A , B
LD B , C
.loop2: ADD HL , DE
DEC C
JR NZ , .loop2
DJNZ .loop2
;
LD ( READ.PointerOnBuffer ), HL
POP DE
POP DE ; ®¬¥à ª« áâ¥à ¬« ¤è ï ç áâì
EXX
POP HL ; ®¬¥à ª« áâ¥à áâ àè ï ç áâì
EXX
;
LD A , B
OR A
RET Z
RET Z ; ª®«¨ç¥á⢮ ᥪâ®à®¢ ¤®ç¨âªã = 0?
LD B , A
;
.big_loop: LD HL , CORE_BUFFERS.BootSector.SectorsPerCluster
LD A , B
@ -1036,18 +1068,24 @@ BLOK_WR: PUSH BC
LD C , A
OR A ;CLEAR CF
RET Z
;
.WR7: EX DE , HL
PUSH BC
; HL':HL - ®¬¥à ª« áâ¥à
CALL READ_FROM_FAT
JR NC , .WR9
;PUSH HL
CALL INC_FAT
;POP HL
JR C , .ErrorFull
;CALL READ_FROM_FAT
JR C , .ErrorFull
; [x] ¨§¡ëâ®ç®¥ ®¡à 饨¥ 01/04/2024
;CALL READ_FROM_FAT
;
.WR9: POP BC
EXX
EX DE , HL
PUSH HL ; ®¬¥à á«¥¤. ª« áâ¥à (áâ à襥 á«®¢®)
EXX
EX DE , HL
PUSH HL
PUSH HL ; ®¬¥à á«¥¤. ª« áâ¥à (¬« ¤è¥¥ á«®¢®)
PUSH BC
CALL CL USTER_TO_SECTOR
; DOUBLE 1
@ -1056,8 +1094,8 @@ BLOK_WR: PUSH BC
LD B , C
LD C , Ds s.DRV.Write
RST ToDSS.DRV
LD A , DS S_Error.sys.WRITE_ERROR
JR C , .ErrorWrite
LD A , DS S_Error.sys.WRITE_ERROR
JR C , .Error_3
POP BC
LD HL ,( READ.PointerOnBuffer )
LD DE ,( CORE_BUFFERS.BootSector.BytesPerSector )
@ -1065,15 +1103,17 @@ BLOK_WR: PUSH BC
DEC C
JR NZ , .loop3
LD ( READ.PointerOnBuffer ), HL
POP DE
;
POP DE ; ®¬¥à á«¥¤. ª« áâ¥à (¬« ¤è¥¥ á«®¢®)
EXX
POP HL ; ®¬¥à á«¥¤. ª« áâ¥à (áâ à襥 á«®¢®)
EXX
JP .big_loop
;
.Error_6: POP BC
POP BC
POP BC
POP BC ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
.ErrorWrite: POP BC
.Error_3: POP BC ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
POP BC
POP DE
;LD A,DSS_Error.sys.WRITE_ERROR
;SCF
@ -1084,54 +1124,8 @@ BLOK_WR: PUSH BC
;SCF
RET
; ;GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
; ; ‚室: HL - ¯¥à¢ë© ª« áâ¥à ä ©« (¬« ¤è¥¥ á«®¢®)
; ; BC - ᬥ饨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (¬« ¤è¥¥ á«®¢®)
; ; ‚ë室: HL - ¨§¢¥áâë© ª« áâ¥à ä ©« ¤«ï ®âáçñâ (¬« ¤è¥¥ á«®¢®)
; ; BC - ®á⠢襥áï ᬥ饨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (¬« ¤è¥¥ á«®¢®)
; GetSavedCluster:
; INC B
; ;PUSH DE ; ¯¥à¢ë© ª« áâ¥à ä ©« (áâ à襥 á«®¢®)
; LD E,(IY+_sFM.KnownCluster_L)
; LD D,(IY+_sFM.KnownCluster_L+1)
; LD A,E
; OR D
; RET Z
; ;
; DEC B
; PUSH DE ; KnownCluster_H
; PUSH HL ; ¯¥à¢ë© ª« áâ¥à ä ©« (¬« ¤è¥¥ á«®¢®)
; PUSH BC ; ᬥ饨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å
; LD E,(IY+_sFM.KnownOffset_L)
; LD D,(IY+_sFM.KnownOffset_L+1)
; LD A,D
; OR E
; JR Z,.noOptimization_3
; ;
; POP HL ; ᬥ饨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å
; SBC HL,DE
; JR C,.noOptimization_2
; LD C,L
; LD B,H
; POP DE ; ¡ « á á⥪
; POP HL
; ; ®¯â¨¬¨§ æ¨ï: HL - ¥ ¯¥à¢ë© ª« áâ¥à ä ©« , KnownCluster
; ; BC - à ááâ®ï¨¥ ¤® âॡ㥬®£® á¬¥é¥¨ï ®â KnownCluster
; ;
; INC B
; RET
; ;
; .noOptimization_3:
; POP BC
; .noOptimization_2:
; POP HL
; .noOptimization_1:
; POP DE
; INC B
; RET
;
;[x] fat32
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
; ‚室: DE - ᬥ饨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (áâ à襥 á«®¢®)
; BC - ᬥ饨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (¬« ¤è¥¥ á«®¢®)
@ -1142,7 +1136,6 @@ BLOK_WR: PUSH BC
; DE - ®á⠢襥áï ᬥ饨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (áâ à襥 á«®¢®, D=D+1)
; BC - ®á⠢襥áï ᬥ饨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (¬« ¤è¥¥ á«®¢®, B=B+1)
; ¥ ¯®àâ¨â HL, HL' ¨ DE:BC ¥á«¨ ®¯â¨¬¨§ æ¨ï ¥ áà ¡®â «
;[ ] fat32
GetSavedCluster:
XOR A
CP ( IY + _sFM.OptimizedClusters )
@ -1157,7 +1150,7 @@ GetSavedCluster:
; ¯à®¢¥àª áâ à襣® á«®¢
AND A
SBC HL , DE
JR C , .noOptimization_2
JR C , .noOptimization_2
;
PUSH BC
EX DE , HL
@ -1170,7 +1163,7 @@ GetSavedCluster:
LD BC , 0
EX DE , HL
SBC HL , BC
JR C , .noOptimization_3
JR C , .noOptimization_3
EX DE , HL
LD B , H
LD C , L
@ -1239,148 +1232,5 @@ SaveGotCluster: LD A,C
;LD (FatBuffer.MaxClusterLow),HL
;=======================================================================
;FatCache:
;.Block WORD #0000
;.Update BYTE 0
;FAT_Max_Cluster_L: WORD #0FF0 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.)
;FAT_Max_Cluster_H: WORD #0000 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.)
;//MODULE: FAT_X
;[END]
;RX01
;; HL - CLUSTER
;; DE - (CLUSTER)
;
;READ_FROM_FAT EX DE,HL
; LD HL,(FAT_Max_Cluster)
; AND A
; SBC HL,DE
; EX DE,HL
; LD A,10
; RET C
; PUSH HL
; LD A,(FAT_TYP)
; CP "2"
; JP Z,R_F_F12
;R_F_F16 LD DE,768 ; DE - CLUSTERS IN CASH
; XOR A
;R_F_00H INC A ; HL - CLUSTER
; SBC HL,DE
; JP NC,R_F_00H
; ADD HL,DE
; ADD HL,HL ; HL - FAT OFFSET (FROM CASH)
; DEC A
; LD BC,(FatCache) ; A - ELEMENT OF CASH
; CP C
; CALL NZ,READ_FAT_TABLE
; LD DE,FAT
; ADD HL,DE
; LD E,(HL)
; INC HL
; LD D,(HL)
; LD HL,#FFEF
; AND A
; SBC HL,DE
; POP HL
; LD A,0
; RET
;
;R_F_F12 LD D,H
; LD E,L
; ADD HL,HL
; ADD HL,DE
; RR H
; RR L
; PUSH AF
; EX DE,HL
; LD HL,(B_P_S)
; LD B,H
; LD C,L
; ADD HL,HL
; ADD HL,BC
; EX DE,HL
; XOR A ; DE - SIZE SECTOR * 3
;R_F_00 INC A ; HL - FAT OFFSET
; SBC HL,DE
; JP NC,R_F_00
; ADD HL,DE
; DEC A
;
;
;WRITE_FAT_TABLE LD HL,(FatCache)
; LD H,0
; LD (FatCache),HL
; LD E,L
; LD D,H
; ADD HL,HL
; ADD HL,DE
; PUSH HL
; LD B,H
; LD C,L
; INC HL
; INC HL
; INC HL
; LD DE,(S_P_F)
; LD A,3
; AND A
; SBC HL,DE
; JP C,WR_FAT1
; EX DE,HL
; LD HL,3
; AND A
; SBC HL,DE
; JP C,FATERR
; LD A,L
;WR_FAT1 LD H,B
; LD L,C
; LD DE,(FAT_FRM)
; ADD HL,DE
; EX DE,HL
; LD IX,0
; ADD IX,DE
; LD DE,FAT
; LD HL,0
; LD B,A
; LD C,6
; LD A,(DRIVE)
; PUSH BC
; RST #18
; POP BC
; POP HL
; LD DE,(FAT2_SEC_L)
; ADD HL,DE
; EX DE,HL
; LD IX,0
; ADD IX,DE
; LD DE,FAT
; LD HL,0
; LD A,(DRIVE)
; LD C,6
; RST #18
; RET
/ / / / / / / / / / / / / / OLD ////////////////
; HL - CLUSTER
; HL:IX - SECTOR
; CLUSTER_TO_SECTOR: DEC HL
; DEC HL
; EX DE,HL
; LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster)
; LD B,A
; LD HL,0
; LD IX,0
; ADD_DE1: ADD IX,DE
; JR NC,ADD_DE2
; INC HL
; ADD_DE2: DJNZ ADD_DE1
; LD DE,(FatBuffer.FirstDataSector_L) ;first data sector
; ADD IX,DE
; LD DE,#0000
; ADC HL,DE
; RET
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /