Estex-DSS/DSS/FAT_X.ASM
2023-10-06 00:31:46 +10:00

537 lines
10 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.

;[BEGIN]
;//MODULE: FAT_X
;//CREATE: 19-05-1998 AUTHOR: Denis Parinov
;//UPDATE: 24-10-1999 DNS Restore module
;---------------------------------------------------------------
;Rev Date Name Description
;---------------------------------------------------------------
;R01 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
G_CLUS1: INC HL ; ­®¬¥à ª« áâ¥à 
CALL R_F_FAT ; ¯à®ç¨â âì ¨§ ª¥è  FAT-  ­®¬¥à á«¥¤. ª« áâ¥à 
CP DSS_Error.sys.DISK_FULL
SCF
RET Z ; ®è¨¡ª  ?
LD A,D
OR E
JR NZ,G_CLUS1
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=­®¬¥à ª« áâ¥à 
INC_FA2 CALL R_F_FAT ; ¯à®ç¨â âì ¨§ ª¥è  FAT-  ­®¬¥à á«¥¤. ª« áâ¥à 
EX DE,HL
JR NC,INC_FA2 ; ­¥ ª®­¥æ 楯®çª¨
EX DE,HL
POP DE ; ­®¬¥à ª« áâ¥à 
CALL W_T_FAT ; § ¯¨á âì ¢ ª¥è FAT-  ­®¬¥à ª« áâ¥à 
POP HL
LD DE,(FatBuffer.ENDCLUS) ; ­®¬¥à ª« áâ¥à 
CALL W_T_FAT ; § ¯¨á âì ¢ ª¥è FAT-  ­®¬¥à ª« áâ¥à 
CALL WR_FAT ; ¯®¤ª«. ¡ ­ªã ª¥è  FAT ¨ § ¯¨á âì ¥£® ­  ¤¨áª
AND A
RET
;R01
;-----------------------------------------------------------
; <20>à®ç¨â âì ¨§ ª¥è  FAT-  ­®¬¥à á«¥¤. ª« áâ¥à 
; ¢å®¤: hl = ­®¬¥à ª« áâ¥à 
; ¢ë室: hl = ­®¬¥à ª« áâ¥à 
; de = ­®¬¥à á«¥¤. ª« áâ¥à 
; CF - ª®­¥æ 楯®çª¨
;!FIXIT ¤ «¥¥ § â®çª  ­  â®, çâ® ¢ DE ¢á¥£¤  0 - à §¤¥« ­¥ ¡®«ìè¥ 2Gb
;-----------------------------------------------------------
R_F_FAT:
EX DE,HL
LD HL,(MAX_CLU)
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
LD H,A
LD A,B
; bit7..4 --> bit3..0.
RRCA
RRCA
RRCA
RRCA
AND #0F ; A=A/16 ; A - BLOCK FAT (1 BLOCK = 8192 BYTES)
;
ADD HL,HL ; HL - FAT OFFSET (FROM CASH)
LD BC,(FATCASH) ; C - BLOCK FAT IN CASH
CP C
CALL NZ,RE_FAT ; A != C - READ NEW BLOCK FAT
LD DE,FAT_CACHE ; ­ ç «® ª¥è  FAT- 
ADD HL,DE ; ­  ï祩ªã FAT
LD E,(HL) ; ¯à®ç¨â âì ­®¬¥à ª« áâ¥à 
INC HL
LD D,(HL)
POP AF
OUT (SLOT3),A
LD HL,#FFEF ;!HARDCODE
XOR A ; DssErr.sys.NO_ERROR
SBC HL,DE ; ¯à®¢¥àª  ­  á«ã¦. ª« áâ¥àë
POP HL
RET
;R01; HL - CLUSTER
;R01; DE - (CLUSTER)
;R01
;R01R_F_FAT EX DE,HL
;R01 LD HL,(MAX_CLU)
;R01 AND A
;R01 SBC HL,DE
;R01 EX DE,HL
;R01 LD A,10
;R01 RET C
;R01 PUSH HL
;R01 LD A,(FAT_TYP)
;R01 CP "2"
;R01 JP Z,R_F_F12
;R01R_F_F16 LD DE,768 ; DE - CLUSTERS IN CASH
;R01 XOR A
;R01R_F_00H INC A ; HL - CLUSTER
;R01 SBC HL,DE
;R01 JP NC,R_F_00H
;R01 ADD HL,DE
;R01 ADD HL,HL ; HL - FAT OFFSET (FROM CASH)
;R01 DEC A
;R01 LD BC,(FATCASH) ; A - ELEMENT OF CASH
;R01 CP C
;R01 CALL NZ,RE_FAT
;R01 LD DE,FAT
;R01 ADD HL,DE
;R01 LD E,(HL)
;R01 INC HL
;R01 LD D,(HL)
;R01 LD HL,#FFEF
;R01 AND A
;R01 SBC HL,DE
;R01 POP HL
;R01 LD A,0
;R01 RET
;R01
;R01R_F_F12 LD D,H
;R01 LD E,L
;R01 ADD HL,HL
;R01 ADD HL,DE
;R01 RR H
;R01 RR L
;R01 PUSH AF
;R01 EX DE,HL
;R01 LD HL,(B_P_S)
;R01 LD B,H
;R01 LD C,L
;R01 ADD HL,HL
;R01 ADD HL,BC
;R01 EX DE,HL
;R01 XOR A ; DE - SIZE SECTOR * 3
;R01R_F_00 INC A ; HL - FAT OFFSET
;R01 SBC HL,DE
;R01 JP NC,R_F_00
;R01 ADD HL,DE
;R01 DEC A
; R_F_F12 LD D,H
; LD E,L
; ADD HL,HL
; ADD HL,DE
; RR H ; ᤢ¨£ ¢¯à ¢® ç¥à¥§ CF
; RR L ; CLUSTER * 1.5
; PUSH AF ; á®åà. ä« £
R_F_F12 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,(FATCASH) ; C - BLOCK FAT IN CASH
CP C
CALL NZ,RE_FAT ; ¯à®ç¨â âì ¢ ª¥è 16 ᥪâ®à®¢ FAT- 
ENDIF
;
LD DE,FAT_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
; LD E,A
; RR D ; ¢¯à ¢® ­  4 ¡¨âa
; RR E
; RR D
; RR E
; RR D
; RR E
; RR D
; RR E
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,(MAX_CLU)
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
LD A,1
LD (FATCASH.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
LD H,A
LD A,B
RRCA
RRCA
RRCA
RRCA
AND #0F ; A - BLOCK FAT (1 BLOCK = 8192 BYTES)
ADD HL,HL ; HL - FAT OFFSET (FROM CASH)
LD BC,(FATCASH) ; C - BLOCK FAT IN CASH
CP C
CALL NZ,RE_FAT ; A != C - READ NEW BLOCK FAT
LD DE,FAT_CACHE
ADD HL,DE ; ­  ï祩ªã FAT
POP DE
LD (HL),E ; á®åà. ¢ ª¥è¥ FAT- 
INC HL ; ­®¬¥à ª« áâ¥à 
LD (HL),D
POP AF ; ¢®ááâ. ¯®àâ
POP HL
OUT (SLOT3),A
XOR A
RET
;
; fat12
W_T_F12 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,(FATCASH) ; C - BLOCK FAT IN CASH
CP C
CALL NZ,RE_FAT ; ¯à®ç¨â âì ¢ ª¥è 16 ᥪâ®à®¢ FAT- 
ENDIF
;
LD DE,FAT_CACHE
ADD HL,DE
POP AF
POP DE
JP 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
AND A
RET
; W_T_F01 SLA E
; RL D
; RL E
; RL D
; RL E
; RL D
; RL E
; RL D
;
W_T_F01:; ¢«¥¢® ­  4 ¡¨âa
SLA E
LD A,E
RL D
RLA
RL D
RLA
RL D
RLA
RL D
LD E,A
;
LD A,(HL)
AND #0F
OR E
LD (HL),A ; á®åà. ¢ ª¥è¥ FAT- 
INC HL ; ­®¬¥à ª« áâ¥à 
LD (HL),D
POP AF
POP HL
OUT (SLOT3),A
AND A
RET
;R01
; <20>à®ç¨â âì ¢ ª¥è 16 ᥪâ®à®¢ FAT- 
; A - NEW FAT BLOCK
RE_FAT: PUSH HL
PUSH AF
LD A,(FATCASH.Update)
OR A
CALL NZ,WR_FAT.Start
POP AF
LD L,A
LD H,0
LD (FATCASH),HL
;FAT BLOCK * 16 = SECTOR OF FAT
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL ;!TODO FATcacheSize
;
LD DE,(FatBuffer.FAT_FRM)
ADD HL,DE
EX DE,HL
LD IX,0
ADD IX,DE ; ­®¬¥à «®£. ᥪâ®à 
LD HL,0 ; áâ. à §àï¤ ; HL:IX - SECTOR FAT FOR READING
LD DE,FAT_CACHE ; ªã¤  ; DE - FAT ADDRESS
LD A,(FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª 
LD BC,16*256 + Dss.DRV.Read ;ॣ B: 16 * 512 = 8192 (CASH SIZE) ;!TODO FATcacheSize
RST ToDSS.DRV
POP HL
RET
; <20>®¤ª«îç¨âì ¡ ­ªã ª¥è  FAT ¨ § ¯¨á âì ¥£® ­  ¤¨áª
WR_FAT: SET_PAGE_X FATPAGE
PUSH AF
CALL .Start
POP AF
OUT (SLOT3),A
RET
; ‡ ¯¨áì ª¥è  (¢á¥£®?) FAT-  ­  ¤¨áª
.Start: LD HL,(FATCASH)
LD H,0
LD (FATCASH),HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL ;FAT BLOCK * 16 = SECTOR OF FAT ;!TODO FATcacheSize
PUSH HL
LD B,H
LD C,L ;BC - BLOCK OF FAT
LD DE,16 ;!HARDCODE ;!TODO FATcacheSize
ADD HL,DE ;+ SIZE CASH (16 SECTORS)
LD DE,(CORE_BUFFERS.BootSector.S_P_F) ; ᥪâ®à®¢ ­  FAT
LD A,16 ;!HARDCODE ; MAX ç¨á«® ᥪâ®à®¢ ¤«ï ç⥭¨ï ¢ ªíè ;!TODO FATcacheSize
AND A
SBC HL,DE
JR C,.WALLFAT
EX DE,HL
LD HL,16 ;!HARDCODE ; ç¨á«® ᥪâ®à®¢ ;!TODO FATcacheSize
; CF = 0
SBC HL,DE
JP C,FATERR
LD A,L
.WALLFAT:
LD H,B
LD L,C
LD DE,(FatBuffer.FAT_FRM)
ADD HL,DE
EX DE,HL
LD IX,0
;HL:IX - SECTOR OF FAT FOR SAVE
ADD IX,DE ; ­®¬¥à «®£. ᥪâ®à 
LD HL,0 ; áâ. à §àï¤
LD DE,FAT_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 IX,0
ADD IX,DE
LD DE,FAT_CACHE
LD HL,0
LD A,(FatBuffer.DRIVE)
LD C,Dss.DRV.Write
RST ToDSS.DRV
RET
;R01
;R01WR_FAT LD HL,(FATCASH)
;R01 LD H,0
;R01 LD (FATCASH),HL
;R01 LD E,L
;R01 LD D,H
;R01 ADD HL,HL
;R01 ADD HL,DE
;R01 PUSH HL
;R01 LD B,H
;R01 LD C,L
;R01 INC HL
;R01 INC HL
;R01 INC HL
;R01 LD DE,(S_P_F)
;R01 LD A,3
;R01 AND A
;R01 SBC HL,DE
;R01 JP C,WR_FAT1
;R01 EX DE,HL
;R01 LD HL,3
;R01 AND A
;R01 SBC HL,DE
;R01 JP C,FATERR
;R01 LD A,L
;R01WR_FAT1 LD H,B
;R01 LD L,C
;R01 LD DE,(FAT_FRM)
;R01 ADD HL,DE
;R01 EX DE,HL
;R01 LD IX,0
;R01 ADD IX,DE
;R01 LD DE,FAT
;R01 LD HL,0
;R01 LD B,A
;R01 LD C,6
;R01 LD A,(DRIVE)
;R01 PUSH BC
;R01 RST #18
;R01 POP BC
;R01 POP HL
;R01 LD DE,(FAT2_XX)
;R01 ADD HL,DE
;R01 EX DE,HL
;R01 LD IX,0
;R01 ADD IX,DE
;R01 LD DE,FAT
;R01 LD HL,0
;R01 LD A,(DRIVE)
;R01 LD C,6
;R01 RST #18
;R01 RET
FATERR: POP HL
; CF = 1
RET
FATCASH: WORD #0000
.Block EQU FATCASH
.Update EQU FATCASH+1
MAX_CLU: WORD #0FF0 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ FAT12 (¡¥§ á«ã¦.)
;//MODULE: FAT_X
;[END]