Estex-DSS/DSS/FS/FAT/FAT12_16.asm
Anatoliy Belyanskiy 0312779217 Preparing for FAT32
2024-03-12 03:51:04 +10:00

984 lines
18 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 32
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 = ­®¬¥à ª« áâ¥à 
; de = <E28099>˜…… á«®¢® ­®¬¥à  ª« áâ¥à  (⮫쪮 ¤«ï FAT32)
; ¢ë室: hl = ­®¬¥à ª« áâ¥à 
; de = ­®¬¥à á«¥¤. ª« áâ¥à  (¥á«¨ 0, â® ª« áâ¥à hl ᢮¡®¤¥­)
; CF - ª®­¥æ 楯®çª¨
;!FIXIT ¤ «¥¥ § â®çª  ­  â®, çâ® ¢ DE ¢á¥£¤  0 - à §¤¥« ­¥ ¡®«ìè¥ 2Gb
;-----------------------------------------------------------
;[ ] fat32
READ_FROM_FAT:
;[x] fat32
PUSH DE
LD A,(FatBuffer.FAT_TYPE)
XOR 32
JR NZ,.low ; Z=0 ¯à®¢¥à塞 ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à 
LD HL,(FAT_Max_Cluster_H) ; ¯à®¢¥à塞 áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à 
JP .high
;
.low: EX DE,HL
LD HL,(FAT_Max_Cluster_L)
.high: ; CF = 0
SBC HL,DE
EX DE,HL
LD A,DSS_Error.sys.DISK_FULL
;[x] fat32
POP DE
;
RET C
SET_PAGE_X FATPAGE
PUSH HL
PUSH AF
LD A,(FatBuffer.FAT_TYPE)
CP 16 ; fat16
JR C,.FAT12
JR NZ,.FAT32
; fat16, ¯à®áâ® ç¨â âì á«¥¤. ­®¬¥à
.FAT16: CALL GET_FAT16_CELL
LD E,(HL) ; ¯à®ç¨â âì ­®¬¥à ª« áâ¥à 
INC HL
LD D,(HL)
POP AF
OUT (SLOT3),A
;!TODO #FFF7 - ª« áâ¥à á ª®áïç­ë¬¨ ᥪâ®à ¬¨
LD HL,#FFEF ;!HARDCODE
XOR A ; DssErr.sys.NO_ERROR
SBC HL,DE ; ¯à®¢¥àª  ­  á«ã¦. ª« áâ¥àë
POP HL
RET
;
.FAT12: CALL GET_FAT12_CELL
LD E,(HL)
INC HL
LD D,(HL)
JR C,.Correct_1
LD A,D
AND #0F
LD D,A
JR .Correct_2
;
.Correct_1:
LD A,E
AND #F0
DUP 4 ; ¢¯à ¢® ­  4 ¡¨âa
RR D
RRA
EDUP
LD E,A
.Correct_2:
POP AF
OUT (SLOT3),A
LD HL,#0FEF
XOR A ; ®¡­ã«ï¥¬ CF ¨ ãáâ ­ ¢«¨¢ ¥¬ ª®¤ ®è¨¡ª¨ = ­ã«î
SBC HL,DE ; ¯à®¢¥àª  ­  á«ã¦. ª« áâ¥àë
POP HL
RET
.FAT32: ; [ ] fat32
CALL GET_FAT32_CELL
DI
HALT
;-----------------------------------------------------------
; ‡ ¯¨á âì ¢ ª¥è FAT-  ­®¬¥à ª« áâ¥à 
; ¢å®¤: hl = ­®¬¥à ª« áâ¥à  ¢ ª®â®àë© § ¯¨á âì
; de = ­®¬¥à ª« áâ¥à  ª®â®àë© ¢¯¨á âì
; ¢ë室: â ª®© ¦¥ ª ª ¨ ¢å®¤
;-----------------------------------------------------------
; [ ] 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
; [x] 2/12/23 FAT ­¥ ¢á¥£¤  ¬®£ § ¯¨á âìáï ­  HDD
;LD A,1
;LD (FatCache.Update),A
;
LD A,(FatBuffer.FAT_TYPE)
CP 16 ; fat16
JR C,.FAT12
JR NZ,.FAT32
;
.FAT16: PUSH DE
CALL GET_FAT16_CELL
POP DE
LD (HL),E ; á®åà. ¢ ª¥è¥ 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
; CF = 0
RET
;
.FAT12: ;!FIXIT ¯¥à¥¤¥« âì ­  ¯¥à¥¬¥­­ë¥ FAT_CACHE
PUSH DE
CALL GET_FAT12_CELL
POP DE
JR C,.Correct_1 ; ­®¬¥à ­¥çñâ­ë©
LD (HL),E
INC HL
LD A,(HL)
AND #F0
OR D
LD (HL),A
POP AF
POP HL
OUT (SLOT3),A
; [x] 2/12/23 FAT ­¥ ¢á¥£¤  ¬®£ § ¯¨á âìáï ­  HDD
XOR A
INC A
LD (FatCache.Update),A
; CF = 0
RET
.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
DI
HALT
;RX01
;RE_FAT:
; <20>à®ç¨â âì ¢ ª¥è 16 ᥪâ®à®¢ FAT- 
; A - NEW FAT BLOCK
READ_FAT_TABLE:
PUSH HL
PUSH AF
LD A,(FatCache.Update)
OR A
CALL NZ,WRITE_FAT_TABLE.Start
POP AF
LD L,A
XOR A
LD H,A ;!FIXIT fat32 - ã ä â32 ¡«®ª®¢ ¬®¦¥â ¡ëâì ¢ «®¬
LD (FatCache.Block),HL
LD (FatCache.Update),A
;FAT BLOCK ^ FAT_CACHE.Degree = SECTOR OF FAT
DUP FAT_CACHE.Degree_16
ADD HL,HL ;x2
EDUP
LD DE,(FatBuffer.FAT_FRM)
ADD HL,DE
EX DE,HL
;
LD XH,D
LD XL,E
;LD IX,0
;ADD IX,DE ; ­®¬¥à «®£. ᥪâ®à 
;
LD HL,0 ; áâ. à §àï¤ ; HL:IX - SECTOR FAT FOR READING
LD DE,FATPAGE.cache ; ªã¤  ; DE - FAT ADDRESS
LD A,(FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª 
LD BC,FAT_CACHE.Sectors*256 + Dss.DRV.Read ;ॣ B * FAT_CACHE.Sector_Size = CASH SIZE
RST ToDSS.DRV
POP HL
RET
; <20>®¤ª«îç¨âì ¡ ­ªã ª¥è  FAT ¨ § ¯¨á âì ¥£® ­  ¤¨áª
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_16
ADD HL,HL ;x2
EDUP
; HL - ­®¬¥à «®£. ᥪâ®à 
PUSH HL
LD B,H
LD C,L ;BC - BLOCK OF FAT
LD DE,FAT_CACHE.Sectors
ADD HL,DE ;+ SIZE CASH (16 SECTORS)
LD A,E ;!HARDCODE ; MAX ç¨á«® ᥪâ®à®¢ ¤«ï ç⥭¨ï ¢ ªíè
LD DE,(CORE_BUFFERS.BootSector.S_P_F) ; ᥪâ®à®¢ ­  FAT
AND A
SBC HL,DE
JR C,.WALLFAT
EX DE,HL
LD HL,FAT_CACHE.Sectors
; CF = 0
SBC HL,DE
JR C,.ERR
LD A,L
.WALLFAT:; !TODO çñ¡ áà §ã ¢ IX ­¥ £à㧨âì FAT_FRM?
LD H,B
LD L,C
LD DE,(FatBuffer.FAT_FRM)
ADD HL,DE
EX DE,HL
;
LD XH,D
LD XL,E
;LD IX,0
;ADD IX,DE ; ­®¬¥à «®£. ᥪâ®à 
;
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
POP BC ; b=ç¨á«® ᥪâ®à®¢
POP HL
LD DE,(FatBuffer.FAT2_XX)
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 ­¥â ª®­âà®«ï ®è¨¡®ª
;
.ERR: LD A,0
LD (FatCache.Update),A
RET NC
POP HL
; CF = 1
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)
LD BC,(FatCache.Block) ; BC - BLOCK FAT IN CASH
CP C
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 < #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
;
LD BC,(FatCache.Block) ; C - BLOCK FAT IN CASH
CP C
CALL NZ,READ_FAT_TABLE ; ¯à®ç¨â âì ¢ ª¥è 16 ᥪâ®à®¢ FAT- 
ENDIF
;
LD DE,FATPAGE.cache
ADD HL,DE
POP AF
RET
; in: HL - CLUSTER
; out: HL:IX - SECTOR
NSECTOR:;[x] fat32
LD DE,(FAT_Max_Cluster_H)
DEC HL
DEC HL
LD A,(CORE_BUFFERS.BootSector.S_P_C)
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.DAT_FRL) ;first data sector
XOR A
ADD IX,DE
LD D,A
LD E,A
ADC HL,DE
;!TODO   ­ ¤® «¨ ¯à®¢¥àïâì ¯¥à¥¯®«­¥­¨¥ HL:IX?
RET
////////////////////////////////////////////////////////////////////////
;[ ] fat32
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
MACRO _GetSavedCluster exit_to
LD E,(IY+_sFM.KnownCluster_L)
LD D,(IY+_sFM.KnownCluster_L+1)
LD A,D
INC B
OR E
JR Z,exit_to
DEC B
;
PUSH DE
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_1
;
POP HL
SBC HL,DE
JR C,.noOptimization_2
;
LD C,L
LD B,H
POP DE
POP HL
;
INC B
JP exit_to
.noOptimization_1:
POP BC
.noOptimization_2:
POP HL
POP DE
INC B
JP exit_to
ENDM
;
;[ ] fat32
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
MACRO _SaveGetedCluster
LD (IY+_sFM.KnownCluster_L),L
LD (IY+_sFM.KnownCluster_L+1),H
POP BC
LD (IY+_sFM.KnownOffset_L),C
LD (IY+_sFM.KnownOffset_L+1),B
ENDM
;;
BLOCK_READ.ECL2:
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
POP BC
;
POP BC
POP DE
AND A
RET
;
;READ SECTORS OF FILE
;HL:DE - FP (in sectors)
; B - Amount sectors
BLOCK_READ:
PUSH BC
LD (READ.PointerOnBuffer),IX
LD A,(CORE_BUFFERS.BootSector.S_P_C) ;SECTORS PER CLUSTER
LD C,A
LD B,0
;HL:DE / BC => DE:IX HL-OSTATOK
CALL DIV_for_SPC
; [ ] fat32. ¤ «¥¥ § â®çª  ­  â®, çâ® ¢ DE ¢á¥£¤  0 - ä ©« ­¥ ¡®«ìè¥ 2Gb
LD B,XH
LD C,XL
PUSH HL ;RESIDUE
LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) ;START CLUSTER
LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1)
LD A,H
OR L
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
;JR NZ,BLOKRD2
PUSH BC
JR Z,.ECL2
;JP ECL2 ;RY01 JR BLOKRD0
_GetSavedCluster .enter_loop1
;
.loop1: PUSH BC
CALL READ_FROM_FAT
POP BC
JR C,.ECL2 ;RY01
EX DE,HL
; DEC BC
.enter_loop1:
; LD A,B ; - ᬥ饭¨¥ ¢­ãâਠ䠩«  ¢ ª« áâ¥à å
; OR C
; JR NZ,.loop1
INC B
DEC BC
DJNZ .loop1
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
_SaveGetedCluster
;
POP DE
POP BC
LD A,(CORE_BUFFERS.BootSector.S_P_C)
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.B_P_S)
;!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.S_P_C
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.B_P_S)
.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
BLOK_WR:
PUSH BC
LD (READ.PointerOnBuffer),IX
LD A,(CORE_BUFFERS.BootSector.S_P_C) ;SECTORS PER CLUSTER
LD C,A
LD B,0
;HL:DE / BC => DE:IX HL-OSTATOK
CALL DIV_for_SPC
; [ ] fat32. ¤ «¥¥ § â®çª  ­  â®, çâ® ¢ DE ¢á¥£¤  0 - ä ©« ­¥ ¡®«ìè¥ 2Gb
LD B,XH
LD C,XL
PUSH HL ;RESIDUE
LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) ;START CLUSTER
LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1)
LD A,H
OR L
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
;JR NZ,BLOKWR2
PUSH BC
JR NZ,.GetSavedCluster
;
PUSH BC
CALL G_CLUST
JP C,.Error
LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L),L
LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1),H
LD DE,(FatBuffer.ENDCLUS_LOW)
CALL WRITE_TO_FAT
PUSH HL
;!TEST ;!TODO 2/12/23 [ ] ¡ £ á ¨§¡ëâ®ç­®© § ¯¨áìî WRITE_FAT_TABLE?
;CALL WRITE_FAT_TABLE ; ¯®¤ª«. ¡ ­ªã ª¥è  FAT ¨ § ¯¨á âì ¥£® ­  ¤¨áª
;
POP HL
POP BC
INC B
JP .WR2
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
.GetSavedCluster:
_GetSavedCluster .WR2
;
.loop: PUSH BC
CALL READ_FROM_FAT
JR NC,.WRB
PUSH HL
CALL INC_FAT
POP HL
JP C,.Error
CALL READ_FROM_FAT
.WRB: POP BC
EX DE,HL
; DEC BC
.WR2:
; LD A,B
; OR C
; JR NZ,.loop
INC B
DEC BC
DJNZ .loop
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
_SaveGetedCluster
;
POP DE
POP BC
LD A,(CORE_BUFFERS.BootSector.S_P_C)
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.B_P_S)
;
.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.S_P_C
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.B_P_S)
.loop3: ADD HL,DE
DEC C
JR NZ,.loop3
LD (READ.PointerOnBuffer),HL
POP DE
;
JP .big_loop
;
.Error: 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
////////////////////////////////////////////////////////////////////////
FatCache: ;WORD #0000
.Block WORD #0000 ;EQU FatCache
.Update BYTE 0 ;EQU FatCache+1
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_XX)
; 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.S_P_C)
; 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.DAT_FRL) ;first data sector
; ADD IX,DE
; LD DE,#0000
; ADC HL,DE
; RET
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////