mirror of
https://github.com/Tolik-Trek/Estex-DSS.git
synced 2026-06-15 09:21:47 +03:00
1048 lines
19 KiB
NASM
1048 lines
19 KiB
NASM
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
; 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
|
||
;---------------------------------------------------------------
|
||
|
||
; “áâ ®¢¨âì ç «ìë© ª« áâ¥à ¤«ï ç⥨ï
|
||
R_CLUST LD HL,#0001
|
||
LD (G_CLUST.num),HL
|
||
RET
|
||
|
||
; ©â¨ ¯¥à¢ë© ᢮¡®¤ë© ª« áâ¥à
|
||
G_CLUST:
|
||
.num+1: LD HL,#0001
|
||
.loop: INC HL ; ®¬¥à ª« áâ¥à
|
||
CALL R_F_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
|
||
INC_FAT:
|
||
PUSH HL
|
||
CALL G_CLUST
|
||
POP DE
|
||
RET C
|
||
;
|
||
PUSH HL
|
||
PUSH HL
|
||
EX DE,HL ; hl=®¬¥à ª« áâ¥à
|
||
.loop: CALL R_F_FAT ; ¯à®ç¨â âì ¨§ ª¥è FAT- ®¬¥à á«¥¤. ª« áâ¥à
|
||
EX DE,HL
|
||
JR NC,.loop ; ¥ ª®¥æ 楯®çª¨
|
||
EX DE,HL
|
||
POP DE ; ®¬¥à ª« áâ¥à
|
||
CALL W_T_FAT ; § ¯¨á âì ¢ ª¥è FAT- ®¬¥à ª« áâ¥à
|
||
;!FIXIT <¥â ª®âà®«ï ®è¨¡ª¨>
|
||
;
|
||
;
|
||
POP HL
|
||
LD DE,(FatBuffer.ENDCLUS) ; ®¬¥à ª« áâ¥à
|
||
CALL W_T_FAT ; § ¯¨á âì ¢ ª¥è FAT- ®¬¥à ª« áâ¥à
|
||
;!TEST ;!TODO 2/12/23 ; [ ] ¡ £ á ¨§¡ëâ®ç®© § ¯¨áìî WR_FAT?
|
||
;CALL WR_FAT ; ¯®¤ª«. ¡ ªã ª¥è FAT ¨ § ¯¨á âì ¥£® ¤¨áª
|
||
;
|
||
AND A
|
||
RET
|
||
;RX01
|
||
|
||
;-----------------------------------------------------------
|
||
; <20>à®ç¨â âì ¨§ ª¥è FAT- ®¬¥à á«¥¤. ª« áâ¥à
|
||
; ¢å®¤: hl = ®¬¥à ª« áâ¥à
|
||
; ¢ë室: hl = ®¬¥à ª« áâ¥à
|
||
; de = ®¬¥à á«¥¤. ª« áâ¥à
|
||
; CF - ª®¥æ 楯®çª¨
|
||
;!FIXIT ¤ «¥¥ § â®çª â®, çâ® ¢ DE ¢á¥£¤ 0 - à §¤¥« ¥ ¡®«ìè¥ 2Gb
|
||
;-----------------------------------------------------------
|
||
R_F_FAT:
|
||
EX DE,HL
|
||
LD HL,(FAT_Max_Cluster)
|
||
AND A
|
||
SBC HL,DE
|
||
EX DE,HL
|
||
LD A,DSS_Error.sys.DISK_FULL
|
||
RET C
|
||
|
||
SET_PAGE_X FATPAGE
|
||
|
||
PUSH HL
|
||
PUSH AF
|
||
LD A,(FatBuffer.FAT_TYP)
|
||
CP "2" ; fat12
|
||
JR Z,R_F_F12
|
||
; fat16, ¯à®áâ® ç¨â âì á«¥¤. ®¬¥à
|
||
R_F_F16:
|
||
; 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) ; C - BLOCK FAT IN CASH
|
||
; CP C
|
||
; CALL NZ,READ_FAT ; A != C - READ NEW BLOCK FAT
|
||
; LD DE,FATPAGE.cache ; ç «® ª¥è FAT-
|
||
; ADD HL,DE ; ï祩ªã FAT
|
||
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
|
||
;
|
||
R_F_F12:
|
||
CALL GET_FAT12_CELL
|
||
; LD D,H
|
||
; LD E,L
|
||
; RR H
|
||
; RR L ; ᤢ¨£ ¢¯à ¢® ç¥à¥§ CF
|
||
; PUSH AF ; á®åà. ä« £
|
||
; ADD HL,DE ; CLUSTER * 1.5
|
||
; ;
|
||
; ;!FIXIT ®¯â¨¬¨§¨à®¢ âì
|
||
; ;IF COMPILE_UNUSED_CODE
|
||
; LD A,H
|
||
; LD B,H
|
||
; AND #1F
|
||
; LD H,A
|
||
; LD A,B
|
||
; RLCA
|
||
; RLCA
|
||
; RLCA
|
||
; AND #07
|
||
; LD BC,(FatCache) ; C - BLOCK FAT IN CASH
|
||
; CP C
|
||
; CALL NZ,READ_FAT ; ¯à®ç¨â âì ¢ ª¥è 16 ᥪâ®à®¢ FAT-
|
||
; ;ENDIF
|
||
; ;
|
||
; LD DE,FATPAGE.cache ; ç «® ª¥è FAT-
|
||
; ADD HL,DE ; ï祩ªã FAT
|
||
; POP AF ; ¢®ááâ. ä« £
|
||
|
||
LD E,(HL)
|
||
INC HL
|
||
LD D,(HL)
|
||
JR C,R_F_F01
|
||
LD A,D
|
||
AND #0F
|
||
LD D,A
|
||
JP R_F_F02
|
||
;
|
||
R_F_F01:
|
||
LD A,E
|
||
AND #F0
|
||
RR D ; ¢¯à ¢® 4 ¡¨âa
|
||
RRA
|
||
RR D
|
||
RRA
|
||
RR D
|
||
RRA
|
||
RR D
|
||
RRA
|
||
LD E,A
|
||
R_F_F02:
|
||
POP AF
|
||
OUT (SLOT3),A
|
||
LD HL,#0FEF
|
||
XOR A ; ®¡ã«ï¥¬ CF ¨ ãáâ ¢«¨¢ ¥¬ ª®¤ ®è¨¡ª¨ = ã«î
|
||
SBC HL,DE ; ¯à®¢¥àª á«ã¦. ª« áâ¥àë
|
||
POP HL
|
||
RET
|
||
|
||
;-----------------------------------------------------------
|
||
; ‡ ¯¨á âì ¢ ª¥è FAT- ®¬¥à ª« áâ¥à
|
||
; ¢å®¤: de = ®¬¥à ª« áâ¥à
|
||
; hl = ? ®¬¥à ¯¥à¢®£® ª« áâ¥à
|
||
; ¢ë室: hl = ? ®¬¥à á«¥¤. ª« áâ¥à
|
||
; de = ®¬¥à ª« áâ¥à
|
||
; in: HL - CLUSTER
|
||
; out: DE - (CLUSTER)
|
||
;-----------------------------------------------------------
|
||
W_T_FAT:
|
||
PUSH DE
|
||
EX DE,HL
|
||
LD HL,(FAT_Max_Cluster)
|
||
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_TYP)
|
||
CP "2" ; fat12
|
||
JR Z,W_T_F12
|
||
W_T_F16:
|
||
PUSH DE
|
||
; 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) ;!HARDCODE fat16 - à §¬¥à § ¯¨á¨ FAT
|
||
; LD BC,(FatCache) ; C - BLOCK FAT IN CASH
|
||
; CP C
|
||
; CALL NZ,READ_FAT ; A != C - READ NEW BLOCK FAT
|
||
; LD DE,FATPAGE.cache
|
||
; ADD HL,DE ; ï祩ªã FAT
|
||
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
|
||
LD A,1
|
||
LD (FatCache.Update),A
|
||
;
|
||
XOR A
|
||
RET
|
||
;
|
||
; fat12
|
||
W_T_F12: ;!FIXIT ¯¥à¥¤¥« âì ¯¥à¥¬¥ë¥ FAT_CACHE
|
||
PUSH DE
|
||
; LD D,H
|
||
; LD E,L
|
||
; ; ADD HL,HL
|
||
; ; ADD HL,DE
|
||
; ; RR H
|
||
; ; RR L ;CLUSTER * 1.5
|
||
; ; PUSH AF
|
||
; RR H
|
||
; RR L ; ᤢ¨£ ¢¯à ¢® ç¥à¥§ CF
|
||
; PUSH AF ; á®åà. ä« £
|
||
; ADD HL,DE ; CLUSTER * 1.5
|
||
; ;
|
||
; ;!FIXIT ®¯â¨¬¨§¨à®¢ âì
|
||
; ;IF COMPILE_UNUSED_CODE
|
||
; LD A,H
|
||
; LD B,H
|
||
; AND #1F
|
||
; LD H,A
|
||
; LD A,B
|
||
; RLCA
|
||
; RLCA
|
||
; RLCA
|
||
; AND #07
|
||
; LD BC,(FatCache) ; C - BLOCK FAT IN CASH
|
||
; CP C
|
||
; CALL NZ,READ_FAT ; ¯à®ç¨â âì ¢ ª¥è 16 ᥪâ®à®¢ FAT-
|
||
; ;ENDIF
|
||
; ;
|
||
; LD DE,FATPAGE.cache
|
||
; ADD HL,DE
|
||
; POP AF
|
||
|
||
CALL GET_FAT12_CELL
|
||
POP DE
|
||
JR C,W_T_F01 ; ®¬¥à ¥çñâë©
|
||
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
|
||
LD A,1
|
||
LD (FatCache.Update),A
|
||
;
|
||
AND A
|
||
RET
|
||
;
|
||
W_T_F01:; ¢«¥¢® 4 ¡¨âa
|
||
;SLA E
|
||
;LD A,E
|
||
;RL D
|
||
;RLA
|
||
;RL D
|
||
;RLA
|
||
;RL D
|
||
;RLA
|
||
;RL D
|
||
;LD E,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
|
||
LD A,1
|
||
LD (FatCache.Update),A
|
||
;
|
||
AND A
|
||
RET
|
||
|
||
;RX01
|
||
;RE_FAT:
|
||
; <20>à®ç¨â âì ¢ ª¥è 16 ᥪâ®à®¢ FAT-
|
||
; A - NEW FAT BLOCK
|
||
READ_FAT:
|
||
PUSH HL
|
||
PUSH AF
|
||
LD A,(FatCache.Update)
|
||
OR A
|
||
CALL NZ,WR_FAT.Start
|
||
POP AF
|
||
LD L,A
|
||
LD H,0
|
||
LD (FatCache),HL
|
||
;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 ¨ § ¯¨á âì ¥£® ¤¨áª
|
||
WR_FAT: SET_PAGE_X FATPAGE
|
||
PUSH AF
|
||
CALL .Start ;!TODO ¥â ª®âà®«ï ®è¨¡®ª
|
||
POP AF
|
||
OUT (SLOT3),A
|
||
RET
|
||
; ‡ ¯¨áì ª¥è (¢á¥£®?) FAT- ¤¨áª
|
||
.Start: LD HL,(FatCache)
|
||
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 IX,0
|
||
;ADD IX,DE ; ®¬¥à «®£. ᥪâ®à
|
||
;
|
||
LD DE,FATPAGE.cache
|
||
LD HL,0
|
||
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) ; C - BLOCK FAT IN CASH
|
||
CP C
|
||
CALL NZ,READ_FAT ; 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
|
||
RR H
|
||
RR L ; ᤢ¨£ ¢¯à ¢® ç¥à¥§ CF
|
||
PUSH AF ; á®åà. ä« £
|
||
ADD HL,DE ; CLUSTER * 1.5
|
||
;
|
||
;IF COMPILE_UNUSED_CODE
|
||
;!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) ; C - BLOCK FAT IN CASH
|
||
CP C
|
||
CALL NZ,READ_FAT ; ¯à®ç¨â âì ¢ ª¥è 16 ᥪâ®à®¢ FAT-
|
||
;ENDIF
|
||
;
|
||
LD DE,FATPAGE.cache
|
||
ADD HL,DE
|
||
POP AF
|
||
RET
|
||
|
||
|
||
; in: HL - CLUSTER
|
||
; out: HL:IX - SECTOR
|
||
NSECTOR:
|
||
LD DE,0
|
||
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_FRM) ;first data sector
|
||
XOR A
|
||
ADD IX,DE
|
||
LD D,A
|
||
LD E,A
|
||
ADC HL,DE
|
||
;!TODO ¤® «¨ ¯à®¢¥àïâì ¯¥à¥¯®«¥¨¥ HL:IX?
|
||
RET
|
||
|
||
////////////////////////////////////////////////////////////////////////
|
||
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
|
||
MACRO _GetSavedCluster exit_to
|
||
LD E,(IY+_sFM.KnownCluster_L)
|
||
LD D,(IY+_sFM.KnownCluster_H)
|
||
LD A,D
|
||
OR E
|
||
JR Z,exit_to
|
||
;
|
||
PUSH DE
|
||
PUSH HL
|
||
PUSH BC
|
||
LD E,(IY+_sFM.KnownOffset_L)
|
||
LD D,(IY+_sFM.KnownOffset_H)
|
||
LD A,D
|
||
OR E
|
||
JR Z,.noOptimization_1
|
||
;
|
||
POP HL
|
||
AND A
|
||
SBC HL,DE
|
||
JR C,.noOptimization_2
|
||
;
|
||
LD C,L
|
||
LD B,H
|
||
POP HL
|
||
POP DE
|
||
;
|
||
EX DE,HL
|
||
JP exit_to
|
||
.noOptimization_1:
|
||
POP BC
|
||
.noOptimization_2:
|
||
POP HL
|
||
POP DE
|
||
JP exit_to
|
||
ENDM
|
||
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
|
||
MACRO _SaveGetedCluster
|
||
LD (IY+_sFM.KnownCluster_L),L
|
||
LD (IY+_sFM.KnownCluster_H),H
|
||
POP BC
|
||
LD (IY+_sFM.KnownOffset_L),C
|
||
LD (IY+_sFM.KnownOffset_H),B
|
||
ENDM
|
||
;;
|
||
|
||
BLOK_RD.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
|
||
BLOK_RD: PUSH BC
|
||
LD (READ.PointerOnBuffer),IX
|
||
LD A,(CORE_BUFFERS.BootSector.S_P_C) ;SECTORS PER CLUSTER
|
||
LD C,A
|
||
LD B,0 ;!FIXIT
|
||
;HL:DE / BC => DE:IX HL-OSTATOK
|
||
CALL DIV_for_SPC
|
||
;!FIXIT ¤ «¥¥ § â®çª â®, çâ® ¢ DE ¢á¥£¤ 0 - à §¤¥« ¥ ¡®«ìè¥ 2Gb
|
||
LD B,XH
|
||
LD C,XL
|
||
PUSH HL ;RESIDUE
|
||
LD L,(IY+_sFM.ST_CLUSTER) ;START CLUSTER
|
||
LD H,(IY+_sFM.ST_CLUSTER+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 R_F_FAT
|
||
POP BC
|
||
JR C,.ECL2 ;RY01
|
||
EX DE,HL
|
||
DEC BC
|
||
.enter_loop1:
|
||
LD A,B ; ‚‘ - ᬥ饨¥ ¢ãâà¨ ä ©« ¢ ª« áâ¥à å
|
||
OR C
|
||
JR NZ,.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 R_F_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
|
||
LD B,XH
|
||
LD C,XL
|
||
|
||
PUSH HL ;RESIDUE
|
||
LD L,(IY+_sFM.ST_CLUSTER) ;START CLUSTER
|
||
LD H,(IY+_sFM.ST_CLUSTER+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.ST_CLUSTER),L
|
||
LD (IY+_sFM.ST_CLUSTER+1),H
|
||
LD DE,(FatBuffer.ENDCLUS)
|
||
CALL W_T_FAT
|
||
PUSH HL
|
||
;!TEST ;!TODO 2/12/23 [ ] ¡ £ á ¨§¡ëâ®ç®© § ¯¨áìî WR_FAT?
|
||
;CALL WR_FAT ; ¯®¤ª«. ¡ ªã ª¥è FAT ¨ § ¯¨á âì ¥£® ¤¨áª
|
||
;
|
||
POP HL
|
||
POP BC
|
||
JP .WR2
|
||
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
|
||
.GetSavedCluster:
|
||
_GetSavedCluster .WR2
|
||
;
|
||
.loop: PUSH BC
|
||
CALL R_F_FAT
|
||
JR NC,.WRB
|
||
PUSH HL
|
||
CALL INC_FAT
|
||
POP HL
|
||
JP C,.Error
|
||
CALL R_F_FAT
|
||
.WRB: POP BC
|
||
EX DE,HL
|
||
DEC BC
|
||
.WR2: LD A,B
|
||
OR C
|
||
JR NZ,.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 R_F_FAT
|
||
JR NC,.WR9
|
||
PUSH HL
|
||
CALL INC_FAT
|
||
POP HL
|
||
JR C,.ErrorFull
|
||
CALL R_F_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 EQU FatCache
|
||
.Update EQU FatCache+1
|
||
FAT_Max_Cluster: WORD #0FF0 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.)
|
||
|
||
;//MODULE: FAT_X
|
||
;[END]
|
||
|
||
|
||
;RX01
|
||
;; HL - CLUSTER
|
||
;; DE - (CLUSTER)
|
||
;
|
||
;R_F_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
|
||
; 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
|
||
;
|
||
;
|
||
|
||
;WR_FAT 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_FRM) ;first data sector
|
||
; ADD IX,DE
|
||
; LD DE,#0000
|
||
; ADC HL,DE
|
||
; RET
|
||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |