Estex-DSS/DSS/FS/FAT/FAT12_16.asm
2024-03-23 04:07:31 +10:00

1277 lines
26 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
; FAT 12-16
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;[BEGIN]
;//MODULE: FAT_X
;//CREATE: 19-05-1998 AUTHOR: Denis Parinov
;//UPDATE: 24-10-1999 DNS Restore module
;---------------------------------------------------------------
;Rev Date Name Description
;---------------------------------------------------------------
;RY01 16-11-1999 DNS ERROR READING FAT CHAIN
;RX01 10-02-1999 DNS UPGRADE FAT CASH
;---------------------------------------------------------------
; “áâ ­®¢¨âì ­ ç «ì­ë© ª« áâ¥à ¤«ï ç⥭¨ï
; [ ] fat32
R_CLUST:
LD HL,#0001
LD (G_CLUST.num),HL
RET
.FAT32: WORD 0
; ­ ©â¨ ¯¥à¢ë© ᢮¡®¤­ë© ª« áâ¥à
; [ ] fat32
G_CLUST:
.num+1: LD HL,#0001
.loop: INC HL ; ­®¬¥à ª« áâ¥à 
; [x] fat32
IF _FAT32_ENABLE
LD A,(FatBuffer.FAT_TYPE)
XOR FAT_TYPE.x32
CALL Z,SET_FAT32.CHECK_INC_HIGH_CLUSTER
ENDIF
;
CALL READ_FROM_FAT ; ¯à®ç¨â âì ¨§ ª¥è  FAT-  ­®¬¥à á«¥¤. ª« áâ¥à 
CP DSS_Error.sys.DISK_FULL
SCF
RET Z ; ®è¨¡ª  ?
LD A,D
OR E
JR NZ,.loop
LD (G_CLUST.num),HL
; XOR A
RET
; HL - CLUSTER
; [ ] fat32
INC_FAT:
PUSH HL
CALL G_CLUST
POP DE
RET C
;
PUSH HL
; PUSH HL
; EX DE,HL ; hl=­®¬¥à ª« áâ¥à 
; .loop: CALL READ_FROM_FAT ; ¯à®ç¨â âì ¨§ ª¥è  FAT-  ­®¬¥à á«¥¤. ª« áâ¥à 
; EX DE,HL
; JR NC,.loop ; ­¥ ª®­¥æ 楯®çª¨
EX DE,HL
; POP DE ; ­®¬¥à ª« áâ¥à 
CALL WRITE_TO_FAT ; § ¯¨á âì ¢ ª¥è FAT-  ­®¬¥à ª« áâ¥à 
;!FIXIT <­¥â ª®­âà®«ï ®è¨¡ª¨>
;
POP HL
LD DE,(FatBuffer.ENDCLUS_LOW) ; ­®¬¥à ª« áâ¥à 
CALL WRITE_TO_FAT ; § ¯¨á âì ¢ ª¥è FAT-  ­®¬¥à ª« áâ¥à 
;!TEST ;!TODO 2/12/23 ; [ ] ¡ £ á ¨§¡ëâ®ç­®© § ¯¨áìî WRITE_FAT_TABLE?
;CALL WRITE_FAT_TABLE ; ¯®¤ª«. ¡ ­ªã ª¥è  FAT ¨ § ¯¨á âì ¥£® ­  ¤¨áª
;
AND A
RET
;RX01
;------------------------------------------------------------------------------------------------
; <20>à®ç¨â âì ¨§ ª¥è  FAT-  ­®¬¥à á«¥¤. ª« áâ¥à 
; ¢å®¤: hl - ­®¬¥à ª« áâ¥à  (¬« ¤è¥¥ á«®¢®)
; hl' - ­®¬¥à  ª« áâ¥à  (áâ à襥 á«®¢®. ⮫쪮 ¤«ï FAT32)
; ¢ë室: hl - ­®¬¥à ª« áâ¥à  (¬« ¤è¥¥ á«®¢®)
; hl' - ­®¬¥à  ª« áâ¥à  (áâ à襥 á«®¢®)
; de - ­®¬¥à á«¥¤. ª« áâ¥à  (¬« ¤è¥¥ á«®¢®)
; de' - ­®¬¥à á«¥¤. ª« áâ¥à  (áâ à襥 á«®¢®)
; ¥á«¨ DE':DE = 0, â® ª« áâ¥à HL':HL ᢮¡®¤¥­
; CF - ª®­¥æ 楯®çª¨
;------------------------------------------------------------------------------------------------
;[x] fat32 ;!TEST
READ_FROM_FAT:
;[x] fat32
LD A,(FatBuffer.FAT_TYPE)
XOR FAT_TYPE.x32
JR NZ,.low ; Z=0 ¯à®¢¥à塞 ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à 
; ¯à®¢¥à塞 áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à 
; !FIXIT fat32 ¯à®¢¥àïâì ®¡  á«®¢  FAT_Max_Cluster
EXX
EX DE,HL
LD HL,(FAT_Max_Cluster_H)
; CF = 0
SBC HL,DE
EX DE,HL
EXX
LD A,DSS_Error.sys.DISK_FULL
RET C
JP NZ,.correct_cluster ; ¥á«¨ FAT_Max_Cluster_H - hl' != 0, â® ª« áâ¥à ª®à४â­ë©
;
; ¯à®¢¥à塞 ¬« ¤è¥ á«®¢® ­®¬¥à  ª« áâ¥à 
.low: EX DE,HL
LD HL,(FAT_Max_Cluster_L)
; CF = 0
SBC HL,DE
EX DE,HL
LD A,DSS_Error.sys.DISK_FULL
RET C
;
.correct_cluster:
SET_PAGE_X FATPAGE
;
PUSH HL
PUSH AF
LD A,(FatBuffer.FAT_TYPE)
CP FAT_TYPE.x16
JR C,.FAT12
JR NZ,.FAT32
; fat16, ¯à®áâ® ç¨â âì á«¥¤. ­®¬¥à
.FAT16: CALL GET_FAT16_CELL
LD E,(HL) ; ¯à®ç¨â âì ­®¬¥à ª« áâ¥à 
INC HL
LD D,(HL)
;
LD HL,SERVICE_SECTORS.FAT16
.exit: POP AF
OUT (SLOT3),A
; ®¡­ã«ï¥¬ CF ¨ ãáâ ­ ¢«¨¢ ¥¬ ª®¤ ®è¨¡ª¨ = DssErr.sys.NO_ERROR
XOR A
; ¯à®¢¥àª  ­  á«ã¦. ª« áâ¥àë
SBC HL,DE
POP HL
; [x] fat32
EXX
LD H,A
LD L,A
LD D,A
LD E,A
EXX
RET
;
.FAT12: CALL GET_FAT12_CELL
LD E,(HL)
INC HL
LD D,(HL)
LD HL,SERVICE_SECTORS.FAT12
JR NC,.Correct_2
.Correct_1:
LD A,E
AND #F0
DUP 4 ; ¢¯à ¢® ­  4 ¡¨âa
RR D
RRA
EDUP
LD E,A
JR .exit
;
.Correct_2
LD A,D
AND #0F
LD D,A
JR .exit
;
.FAT32: ; [x] fat32 ;!TEST
EXX
PUSH HL
EXX
;
CALL GET_FAT32_CELL
; ¯à®ç¨â âì ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à 
LD E,(HL)
INC HL
LD D,(HL)
INC HL
; ¯à®ç¨â âì áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à 
LD A,(HL)
INC HL
EX AF,AF'
LD A,(HL)
EXX
AND #0F
LD D,A
EX AF,AF'
LD E,A
EXX
; ®¡­ã«ï¥¬ CF ¨ ãáâ ­ ¢«¨¢ ¥¬ ª®¤ ®è¨¡ª¨ = DssErr.sys.NO_ERROR
XOR A
; ¯à®¢¥àª  ­  á«ã¦. ª« áâ¥àë ¬« ¤è¥£® á«®¢  ª« áâ¥à 
LD HL,SERVICE_SECTORS.FAT32.Low
SBC HL,DE
; ¯à®¢¥àª  ­  á«ã¦. ª« áâ¥àë áâ à襣® á«®¢  ª« áâ¥à 
EXX
LD HL,SERVICE_SECTORS.FAT32.High
SBC HL,DE
POP HL
EXX
;
POP BC
LD A,B
OUT (SLOT3),A
RET
;------------------------------------------------------------------------------------------------
; ‡ ¯¨á âì ¢ ª¥è FAT-  ­®¬¥à ª« áâ¥à 
; ¢å®¤: hl = ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à  ¢ ª®â®àë© § ¯¨á âì
; hl' = áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à  ¢ ª®â®àë© § ¯¨á âì (⮫쪮 ¤«ï fat32)
; de = ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à  ª®â®à®¥ ¢¯¨á âì
; de' = áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à  ª®â®à®¥ ¢¯¨á âì (⮫쪮 ¤«ï fat32)
; ¢ë室: â ª®© ¦¥ ª ª ¨ ¢å®¤
;------------------------------------------------------------------------------------------------
; [ ] fat32
WRITE_TO_FAT:
PUSH DE
EX DE,HL
LD HL,(FAT_Max_Cluster_L)
AND A
SBC HL,DE
EX DE,HL
POP DE
LD A,DSS_Error.sys.DISK_FULL
RET C
EXX
SET_PAGE_X FATPAGE
EXX
PUSH HL
PUSH AF
PUSH DE ; de = ­®¬¥à ª« áâ¥à  ª®â®àë© ¢¯¨á âì
; [x] 2/12/23 FAT ­¥ ¢á¥£¤  ¬®£ § ¯¨á âìáï ­  HDD
;LD A,1
;LD (FatCache.Update),A
;
LD A,(FatBuffer.FAT_TYPE)
CP FAT_TYPE.x16
JR C,.FAT12
JR NZ,.FAT32
;
.FAT16: CALL GET_FAT16_CELL
POP DE ; de = ­®¬¥à ª« áâ¥à  ª®â®àë© ¢¯¨á âì
LD (HL),E ; á®åà. ¢ ª¥è¥ FAT- 
INC HL ; ­®¬¥à ª« áâ¥à 
LD (HL),D
.exit: POP AF ; ¢®ááâ. ¯®àâ
POP HL
OUT (SLOT3),A
; [x] 2/12/23 FAT ­¥ ¢á¥£¤  ¬®£ § ¯¨á âìáï ­  HDD
XOR A
INC A
LD (FatCache.Update),A
; CF = 0
RET
;
.FAT12: ;!FIXIT ¯¥à¥¤¥« âì ­  ¯¥à¥¬¥­­ë¥ FAT_CACHE
CALL GET_FAT12_CELL
POP DE ; de = ­®¬¥à ª« áâ¥à  ª®â®àë© ¢¯¨á âì
JR C,.Correct_1 ; ­®¬¥à ­¥çñâ­ë©
LD (HL),E
INC HL
LD A,(HL)
AND #F0
OR D
LD (HL),A
JR .exit
;
.Correct_1:
; ¢«¥¢® ­  4 ¡¨âa
EX DE,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
EX DE,HL
;
LD A,(HL)
AND #0F
OR E
LD (HL),A ; á®åà. ¢ ª¥è¥ FAT- 
INC HL ; ­®¬¥à ª« áâ¥à 
LD (HL),D
POP AF
POP HL
OUT (SLOT3),A
; [x] 2/12/23 FAT ­¥ ¢á¥£¤  ¬®£ § ¯¨á âìáï ­  HDD
XOR A
INC A
LD (FatCache.Update),A
; LD A,1
; LD (FatCache.Update),A
; AND A
; CF = 0
RET
.FAT32: ; [ ] fat32
CALL GET_FAT32_CELL
POP DE ; de = ­®¬¥à ª« áâ¥à  ª®â®àë© ¢¯¨á âì
LD (HL),E ; á®åà. ¢ ª¥è¥ FAT- 
INC HL ; ­®¬¥à ª« áâ¥à 
LD (HL),D
DI
HALT
;RE_FAT:
;RX01
; <20>à®ç¨â âì ¢ ª¥è •• ᥪâ®à®¢ FAT- 
; [ ] fat32 ;!TEST
; DE - NEW FAT BLOCK
READ_FAT_TABLE:
PUSH HL
; [x] fat32
; PUSH AF
PUSH DE
;
LD A,(FatCache.Update)
OR A
CALL NZ,WRITE_FAT_TABLE.Start
; [x] fat32
; POP AF
POP DE
;
;[ ] fat32
; LD L,A
; XOR A
; LD H,A
EX DE,HL
;
LD (FatCache.Block),HL
;LD (FatCache.Update),A
;FAT BLOCK ^ FAT_CACHE.Degree = SECTOR OF FAT
DUP FAT_CACHE.Degree ; 4
ADD HL,HL ;x2
EDUP
LD DE,(FatBuffer.FAT1_SEC_L)
; ­®¬¥à «®£. ᥪâ®à 
ADD HL,DE
EX DE,HL
LD XH,D
LD XL,E
LD HL,(FatBuffer.FAT1_SEC_H)
LD DE,0
ADC HL,DE
; HL:IX - SECTOR FAT FOR READING
LD B,FAT_CACHE.Sectors_16
LD A,(FatBuffer.FAT_TYPE)
CP FAT_TYPE.x32
JR NZ,.nxt
LD B,FAT_CACHE.Sectors_32
.nxt: LD DE,FATPAGE.cache ; ªã¤  ; DE - FAT ADDRESS
LD A,(FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª 
LD C,Dss.DRV.Read ;ॣ B * FAT_CACHE.Sector_Size = CASH SIZE
RST ToDSS.DRV
POP HL
RET
; <20>®¤ª«îç¨âì ¡ ­ªã ª¥è  FAT ¨ § ¯¨á âì ¥£® ­  ¤¨áª
; [ ] fat32
WRITE_FAT_TABLE:
SET_PAGE_X FATPAGE
PUSH AF
CALL .Start ;!TODO ­¥â ª®­âà®«ï ®è¨¡®ª
POP AF
OUT (SLOT3),A
RET
; ‡ ¯¨áì ª¥è  FAT-  ­  ¤¨áª
.Start: LD HL,(FatCache.Block)
;
;LD H,0
;FAT BLOCK * 16 = SECTOR OF FAT
DUP FAT_CACHE.Degree
ADD HL,HL ;x2
EDUP
; HL - ­®¬¥à «®£. ᥪâ®à 
LD B,H
LD C,L ;BC - BLOCK OF FAT
LD DE,FAT_CACHE.Sectors_16
ADD HL,DE ;+ SIZE CASH (16 SECTORS)
LD A,E ;!HARDCODE ; MAX ç¨á«® ᥪâ®à®¢ ¤«ï ç⥭¨ï ¢ ªíè
LD DE,(CORE_BUFFERS.BootSector.SectorsPerFAT16) ; ᥪâ®à®¢ ­  FAT
AND A
SBC HL,DE
JR C,.WALLFAT
EX DE,HL
LD HL,FAT_CACHE.Sectors_16
; CF = 0
SBC HL,DE
JR C,.ERR
LD A,L
.WALLFAT:; !TODO çñ¡ áà §ã ¢ IX ­¥ £à㧨âì FAT_FRM?
LD H,B
LD L,C
PUSH HL ; HL - ­®¬¥à «®£. ᥪâ®à 
;
LD DE,(FatBuffer.FAT1_SEC_L)
LD B,A ; ç¨á«® ᥪâ®à®¢
LD C,Dss.DRV.Write ; § ¯¨áì ᥪâ®à®¢
PUSH BC
; á®å࠭塞 ¯¥à¢ãî ª®¯¨î FAT
CALL .SAVE_FAT_XX
; [ ] ¥á«¨ ¢á¥£® ®¤­  â ¡«¨æ  FAT, â® ¯®¢â®à­®© § ¯¨á¨ ­¥ ¯à®¨á室¨â 13/03/2024
LD DE,(FatBuffer.FAT2_SEC_L)
LD HL,(FatBuffer.FAT1_SEC_L)
AND A
SBC HL,DE
POP BC ; b=ç¨á«® ᥪâ®à®¢
POP HL
JR Z,.only_one_FAT
;
; á®å࠭塞 ¢â®àãî ª®¯¨î FAT
CALL .SAVE_FAT_XX
AND A ;!TODO ­¥â ª®­âà®«ï ®è¨¡®ª
.only_one_FAT:
.ERR: LD A,0
LD (FatCache.Update),A
RET
;
.SAVE_FAT_XX:
ADD HL,DE
EX DE,HL
; ­®¬¥à «®£. ᥪâ®à 
;LD IX,0
;ADD IX,DE
LD XH,D
LD XL,E
;
LD HL,0 ; áâ. à §àï¤
; CF = ADD HL,DE
; [ ] fat32 - ¢â®à ï â ¡«¨æ  ä â ¬®¦¥â ¦¥ ã¥å âì ¤ «ìè¥ 16-¡¨â «®£¨ç¥áª®£® ᥪâ®à ?
IF _FAT32_ENABLE
RL L
ENDIF
;HL:IX - SECTOR OF FAT FOR SAVE
LD DE,FATPAGE.cache ; ®âªã¤ 
LD A,(FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª 
JP ToDSS.DRV
/*
.WALLFAT:; !TODO çñ¡ áà §ã ¢ IX ­¥ £à㧨âì FAT_FRM?
LD H,B
LD L,C
PUSH HL ; HL - ­®¬¥à «®£. ᥪâ®à 
;
LD DE,(FatBuffer.FAT1_SEC_L)
ADD HL,DE
EX DE,HL
; ­®¬¥à «®£. ᥪâ®à 
;LD IX,0
;ADD IX,DE
LD XH,D
LD XL,E
;
LD HL,0 ; áâ. à §àï¤
;HL:IX - SECTOR OF FAT FOR SAVE
LD DE,FATPAGE.cache ; ®âªã¤ 
LD B,A ; ç¨á«® ᥪâ®à®¢
LD C,Dss.DRV.Write ; § ¯¨áì ᥪâ®à®¢
LD A,(FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª 
PUSH BC
RST ToDSS.DRV
; [ ] ¥á«¨ ¢á¥£® ®¤­  â ¡«¨æ  FAT, â® ¯®¢â®à­®© § ¯¨á¨ ­¥ ¯à®¨á室¨â 13/03/2024
LD DE,(FatBuffer.FAT2_SEC_L)
LD HL,(FatBuffer.FAT1_SEC_L)
AND A
SBC HL,DE
POP BC ; b=ç¨á«® ᥪâ®à®¢
POP HL
JR Z,.only_one_FAT
; POP BC ; b=ç¨á«® ᥪâ®à®¢
; POP HL
; LD DE,(FatBuffer.FAT2_SEC_L)
;
ADD HL,DE
EX DE,HL
LD XH,D
LD XL,E
;
LD HL,0
; CF = ADD HL,DE
; [ ] fat32 - ¢â®à ï â ¡«¨æ  ä â ¬®¦¥â ¦¥ ã¥å âì ¤ «ìè¥ 16-¡¨â «®£¨ç¥áª®£® ᥪâ®à ?
IF _FAT32_ENABLE
RL L
ENDIF
;
LD DE,FATPAGE.cache
LD A,(FatBuffer.DRIVE)
LD C,Dss.DRV.Write
RST ToDSS.DRV
AND A ;!TODO ­¥â ª®­âà®«ï ®è¨¡®ª
.only_one_FAT:
;
.ERR: LD A,0
LD (FatCache.Update),A
RET
*/
;¢å®¤: HL - ­®¬¥à ª« áâ¥à 
;¢ë室: HL -  ¤à¥á ­ã¦­®© ï祩ª¨ ¢ áâà ­¨æ¥ FATPAGE
GET_FAT16_CELL:
LD A,H
LD B,H
;AND #0F
AND FAT_CACHE.Size_Mask_16
LD H,A
LD A,B
; A=A/16 ; A - BLOCK FAT (1 BLOCK = 8192 BYTES)
DUP FAT_CACHE.Degree_16
RRCA
EDUP
;AND #0F
AND FAT_CACHE.Part_Mask_16
;
ADD HL,HL ; HL - FAT OFFSET (FROM CASH)
; [ ] fat32 ¯®¬¥­ï«áï ¢å®¤ ¢ ¯à®æ¥¤ãàã READ_FAT_TABLE. <20> ­ìè¥ ­®¬¥à ¡«®ª  ¢ ॣ. A ¯¥à¥¤ ¢ «áï
; LD BC,(FatCache.Block) ; BC - BLOCK FAT IN CASH
; CP C
LD DE,(FatCache.Block) ; BC - BLOCK FAT IN CASH
CP E
LD E,A
;
CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT
LD DE,FATPAGE.cache ; ­ ç «® ª¥è  FAT- 
ADD HL,DE ; ­  ï祩ªã FAT
RET
;¢å®¤: HL - ­®¬¥à ª« áâ¥à 
;¢ë室: HL -  ¤à¥á ­ã¦­®© ï祩ª¨ ¢ áâà ­¨æ¥ FATPAGE
; CF - çñâ­ë©/­¥çñâ­ë©  ¤à¥á ª« áâ¥à 
GET_FAT12_CELL:
LD D,H
LD E,L
SRL H
RR L ; ᤢ¨£ ¢¯à ¢® ç¥à¥§ CF
PUSH AF ; á®åà. ä« £
ADD HL,DE ; CLUSTER * 1.5
;
IF FAT_CACHE.Size_12 < #2000
;!FIXIT ®¯â¨¬¨§¨à®¢ âì
LD A,H
LD B,H
;
AND #1F
;AND FAT_CACHE.Size_Mask_16
;
LD H,A
LD A,B
;
RLCA
RLCA
RLCA
;DUP FAT_CACHE.Degree_16
; RRCA
;EDUP
AND #07
;AND FAT_CACHE.Part_Mask_16
;
; [ ] fat32 ¯®¬¥­ï«áï ¢å®¤ ¢ ¯à®æ¥¤ãàã READ_FAT_TABLE. <20> ­ìè¥ ­®¬¥à ¡«®ª  ¢ ॣ. A ¯¥à¥¤ ¢ «áï
; LD BC,(FatCache.Block) ; BC - BLOCK FAT IN CASH
; CP C
LD DE,(FatCache.Block) ; BC - BLOCK FAT IN CASH
CP E
LD E,A
;
CALL NZ,READ_FAT_TABLE ; ¯à®ç¨â âì ¢ ª¥è 16 ᥪâ®à®¢ FAT- 
ENDIF
;
LD DE,FATPAGE.cache
ADD HL,DE
POP AF
RET
; in: DE:HL - CLUSTER
; out: HL:IX - SECTOR
NSECTOR:;[ ] fat32
LD DE,(FAT_Max_Cluster_H) ; [ ] fat32 - § ¬¥­¨âì ¤à㣮© ¯¥à¥¬¥­­®©
DEC HL
DEC HL
LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster)
XOR 1
JR Z,.skip
;
RRA
.loop: ADD HL,HL
RL E
RL D
;
RRA
JP NC,.loop
;
.skip: EX DE,HL
LD XL,E
LD XH,D
LD DE,(FatBuffer.FirstDataSector_L)
; [x] fat32
;XOR A
;
ADD IX,DE
; [x] fat32
LD DE,(FatBuffer.FirstDataSector_H)
;LD D,A
;LD E,A
;
ADC HL,DE
;!TODO   ­ ¤® «¨ ¯à®¢¥àïâì ¯¥à¥¯®«­¥­¨¥ HL:IX?
RET
////////////////////////////////////////////////////////////////////////
; 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
LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ;SECTORS PER CLUSTER
; HL:DE / A => DE:BC, H=0, L - ®áâ â®ª
CALL DIV_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 Low
LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1)
OR L
OR H
JR Z,.fast_exit_4
CALL GetSavedCluster
;HL': HL - ¨§¢¥áâ­ë© ª« áâ¥à ä ©«  ¤«ï ®âáçñâ 
;DE : BC - ®á⠢襥áï ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (D=D+1, B=B+1)
;
PUSH DE ; [x] ®á⠢襥áï ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (áâ à襥 á«®¢®)
JP .enter_loop1
;
.fast_exit_5: POP DE
.fast_exit_4: ; [x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
POP DE ; [x] fat32 áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à 
POP BC
;
POP BC
POP DE
AND A
RET
; [x] fat32
.loop1_big: PUSH BC
LD BC,0
.loop1_small: PUSH BC
CALL READ_FROM_FAT
POP BC
JR C,.fast_exit_5 ;RY01
EX DE,HL
EXX
EX DE,HL
EXX
.enter_loop1: INC B
DEC BC ; - ᬥ饭¨¥ ¢­ãâਠ䠩«  ¢ ª« áâ¥à å (¬« ¤è¥¥ á«®¢®)
DJNZ .loop1_small
POP BC ; [x] ®á⠢襥áï ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (áâ à襥 á«®¢®)
INC B
DEC BC
DJNZ .loop1_big
;;;;
;
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
POP DE
POP BC
CALL SaveGotCluster
;
POP DE ; ®áâ â®ª DIV_for_SPC
POP BC ; HL:DE - FP (in sectors)
; (SP) = (RET)
;
LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster)
SUB E
LD C,A ;\
CP B ; \
JR C,.skip1 ;SIZE > RESIDUE CLUSTER ; \
LD C,B ;SIZE < CLUSTER ;->-|--> ; !TODO à §®¡à âìáï
.skip1: LD A,B ; /
SUB C ; /
LD B,A ;/
PUSH HL
PUSH BC
PUSH DE
CALL NSECTOR
POP DE
ADD IX,DE
JR NC,.skip2
INC HL
.skip2: LD DE,(READ.PointerOnBuffer)
LD A,(FatBuffer.DRIVE)
LD B,C
LD C,Dss.DRV.Read
RST ToDSS.DRV
JR C,.Error
POP BC
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
;
.loop4: LD HL,CORE_BUFFERS.BootSector.SectorsPerCluster
LD A,B
SUB (HL)
LD B,A
LD C,(HL)
JR NC,.BLOKRD7
LD B,0
ADD A,(HL) ;0 AND CF
LD C,A
OR A ;CLEAR CF
RET Z
;
.BLOKRD7: EX DE,HL
PUSH BC
CALL READ_FROM_FAT
POP BC
JR C,.ECL1 ;RY01
EX DE,HL
PUSH HL
PUSH BC
CALL NSECTOR
LD DE,(READ.PointerOnBuffer)
LD A,(FatBuffer.DRIVE)
LD B,C
LD C,Dss.DRV.Read
RST ToDSS.DRV
JR C,.Error
POP BC
LD HL,(READ.PointerOnBuffer)
LD DE,(CORE_BUFFERS.BootSector.BytesPerSector)
.loop3: ADD HL,DE
DEC C
JR NZ,.loop3
LD (READ.PointerOnBuffer),HL
POP DE
JP .loop4
;
.Error: POP BC
POP DE
;SCF
RET
;
.ECL1: AND A
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 DIV_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
JR NZ,.FindCluster
;
PUSH BC ; ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à 
PUSH DE ; [x] fat32 áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à 
; [ ] 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
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
;
LD DE,(FatBuffer.ENDCLUS_LOW)
CALL WRITE_TO_FAT
;!TEST ;!TODO 2/12/23 ; [ ] ¡ £ á ¨§¡ëâ®ç­®© § ¯¨áìî WRITE_FAT_TABLE?
;PUSH HL
;CALL WRITE_FAT_TABLE ; ¯®¤ª«. ¡ ­ªã ª¥è  FAT ¨ § ¯¨á âì ¥£® ­  ¤¨áª
;POP HL
;
POP DE ; ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à 
POP BC ; [x] fat32 áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à 
;
INC B
INC D ; [x] fat32
PUSH DE
JP .enter_loop
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
.FindCluster: CALL GetSavedCluster
;HL': HL - ¨§¢¥áâ­ë© ª« áâ¥à ä ©«  ¤«ï ®âáçñâ 
;DE : BC - ®á⠢襥áï ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (D=D+1, B=B+1)
;
PUSH DE ; [x] ®á⠢襥áï ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (áâ à襥 á«®¢®)
JP .enter_loop
;
; [x] fat32
.loop_big: PUSH BC
LD BC,0
.loop: 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
;
CALL READ_FROM_FAT
.next: POP BC
EX DE,HL
EXX
EX DE,HL
EXX
.enter_loop: INC B
DEC BC
DJNZ .loop
POP BC ; [x] ®á⠢襥áï ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (áâ à襥 á«®¢®)
INC B
DEC BC
DJNZ .loop_big
;;;;
;
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
POP DE
POP BC
CALL SaveGotCluster
;
POP DE
POP BC
; (SP) = (RET)
;
LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster)
SUB E
LD C,A
CP B
JR C,.WR3 ;SIZE > RESIDUE CLUSTER
LD C,B ;SIZE < CLUSTER
.WR3: LD A,B
SUB C
LD B,A
PUSH HL
PUSH BC
PUSH DE
CALL NSECTOR
POP DE
ADD IX,DE
JR NC,.WR4
INC HL
; DOUBLE 1
.WR4: LD DE,(READ.PointerOnBuffer)
LD A,(FatBuffer.DRIVE)
LD B,C
LD C,Dss.DRV.Write
RST ToDSS.DRV
JR C,.ErrorWrite
POP BC
LD HL,(READ.PointerOnBuffer)
LD DE,(CORE_BUFFERS.BootSector.BytesPerSector)
;
.loop2: ADD HL,DE
DEC C
JR NZ,.loop2
;
LD (READ.PointerOnBuffer),HL
POP DE
;
LD A,B
OR A
RET Z
;
.big_loop: LD HL,CORE_BUFFERS.BootSector.SectorsPerCluster
LD A,B
SUB (HL)
LD B,A
LD C,(HL)
JR NC,.WR7
LD B,0
ADD A,(HL) ;0 AND CF
LD C,A
OR A ;CLEAR CF
RET Z
.WR7: EX DE,HL
PUSH BC
CALL READ_FROM_FAT
JR NC,.WR9
PUSH HL
CALL INC_FAT
POP HL
JR C,.ErrorFull
CALL READ_FROM_FAT
.WR9: POP BC
EX DE,HL
PUSH HL
PUSH BC
CALL NSECTOR
; DOUBLE 1
LD DE,(READ.PointerOnBuffer)
LD A,(FatBuffer.DRIVE)
LD B,C
LD C,Dss.DRV.Write
RST ToDSS.DRV
JR C,.ErrorWrite
POP BC
LD HL,(READ.PointerOnBuffer)
LD DE,(CORE_BUFFERS.BootSector.BytesPerSector)
.loop3: ADD HL,DE
DEC C
JR NZ,.loop3
LD (READ.PointerOnBuffer),HL
POP DE
;
JP .big_loop
;
.Error_6: POP BC
POP BC
.Error_4: POP BC
POP BC ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
.ErrorWrite: POP BC
POP DE
LD A,DSS_Error.sys.WRITE_ERROR
;SCF
RET
;
.ErrorFull: POP BC
LD A,DSS_Error.sys.DISK_FULL
;SCF
RET
/*
;[x] 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] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
; ‚室: DE - ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (áâ à襥 á«®¢®)
; BC - ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (¬« ¤è¥¥ á«®¢®)
; HL - ¯¥à¢ë© ª« áâ¥à ä ©«  (¬« ¤è¥¥ á«®¢®)
; HL' - ¯¥à¢ë© ª« áâ¥à ä ©«  (áâ à襥 á«®¢®)
; ‚ë室: HL - ¨§¢¥áâ­ë© ª« áâ¥à ä ©«  ¤«ï ®âáçñâ  (¬« ¤è¥¥ á«®¢®)
; HL' - ¨§¢¥áâ­ë© ª« áâ¥à ä ©«  ¤«ï ®âáçñâ  (áâ à襥 á«®¢®)
; DE - ®á⠢襥áï ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (áâ à襥 á«®¢®, D=D+1)
; BC - ®á⠢襥áï ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (¬« ¤è¥¥ á«®¢®, B=B+1)
; ­¥ ¯®àâ¨â HL, HL' ¨ DE:BC ¥á«¨ ®¯â¨¬¨§ æ¨ï ­¥ áà ¡®â « 
GetSavedCluster:
XOR A
CP (IY+_sFM.OptimizedClusters)
JR Z,.noOptimization_0
;
PUSH DE
PUSH HL ; ¯¥à¢ë© ª« áâ¥à ä ©«  (¬« ¤è¥¥ á«®¢®)
; ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å
EX DE,HL
LD E,(IY+_sFM.KnownOffset_H)
LD D,(IY+_sFM.KnownOffset_H+1)
; ¯à®¢¥àª  áâ à襣® á«®¢ 
AND A
SBC HL,DE
JR C,.noOptimization_2
;
PUSH BC
EX DE,HL
LD H,B
LD L,C
LD C,(IY+_sFM.KnownOffset_L)
LD B,(IY+_sFM.KnownOffset_L+1)
; ¯à®¢¥àª  ¬« ¤è¥£® á«®¢ 
SBC HL,BC
LD BC,0
EX DE,HL
SBC HL,BC
JR C,.noOptimization_3
EX DE,HL
LD B,H
LD C,L
; DE:BC ­®¢®¥ ᬥ饭¨¥ ®â ¨§¢¥áâ­®£® ª« áâ¥à  ä ©«  (¢ ª« áâ¥à å)
;
LD L,(IY+_sFM.KnownCluster_L)
LD H,(IY+_sFM.KnownCluster_L+1)
EXX
LD L,(IY+_sFM.KnownCluster_H)
LD H,(IY+_sFM.KnownCluster_H+1)
EXX
; ¡ « ­á á⥪ 
POP AF
POP AF
POP AF
; ¤«ï 横«  DJNZ
INC B
INC D
RET
;
.noOptimization_3:
POP BC
.noOptimization_2:
POP HL
.noOptimization_1:
POP DE
.noOptimization_0:
INC B
INC D
RET
;[x] fat32
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
SaveGotCluster: LD A,C
OR B
OR E
OR D
RET Z
;
LD (IY+_sFM.KnownOffset_L),C
LD (IY+_sFM.KnownOffset_L+1),B
LD (IY+_sFM.KnownOffset_H),E
LD (IY+_sFM.KnownOffset_H+1),D
;
LD (IY+_sFM.KnownCluster_L),L
LD (IY+_sFM.KnownCluster_L+1),H
EXX
LD (IY+_sFM.KnownCluster_H),L
LD (IY+_sFM.KnownCluster_H+1),H
EXX
;
LD A,1
LD (IY+_sFM.OptimizedClusters),A
RET
////////////////////////////////////////////////////////////////////////
FatCache: ;WORD #0000
.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
; NSECTOR: 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
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////