mirror of
https://github.com/Tolik-Trek/Estex-DSS.git
synced 2026-06-15 01:11:48 +03:00
484 lines
7.8 KiB
NASM
484 lines
7.8 KiB
NASM
|
||
;[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
|
||
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
|
||
INC_FA2 CALL R_F_FAT
|
||
EX DE,HL
|
||
JR NC,INC_FA2
|
||
EX DE,HL
|
||
POP DE
|
||
CALL W_T_FAT
|
||
POP HL
|
||
LD DE,(FatBuffer.ENDCLUS)
|
||
CALL W_T_FAT
|
||
CALL WR_FAT
|
||
AND A
|
||
RET
|
||
|
||
;R01
|
||
|
||
; IN: HL - CLUSTER
|
||
; OUT: DE - (CLUSTER)
|
||
;!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
|
||
|
||
EXX ;!TODO optimize
|
||
SET_PAGE_X FATPAGE
|
||
EXX ;!TODO optimize
|
||
|
||
PUSH HL
|
||
PUSH AF
|
||
LD A,(FatBuffer.FAT_TYP)
|
||
CP "2"
|
||
JR Z,R_F_F12
|
||
R_F_F16:
|
||
LD A,H
|
||
LD B,A
|
||
AND #0F
|
||
LD H,A
|
||
LD A,B
|
||
; swap bit7..4 and 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)
|
||
;!TEST
|
||
LD BC,(FATCASH) ; C - BLOCK FAT IN CASH
|
||
CP C
|
||
//LD C,A
|
||
//LD A,(FATCASH.Block)
|
||
//CP C
|
||
;
|
||
CALL NZ,RE_FAT ; A != C - READ NEW BLOCK FAT
|
||
LD DE,FAT
|
||
ADD HL,DE
|
||
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
|
||
;LD A,DssErr.sys.NO_ERROR
|
||
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
|
||
RR L ;CLUSTER * 1.5
|
||
PUSH AF
|
||
LD A,H
|
||
LD B,A
|
||
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
|
||
LD DE,FAT
|
||
ADD HL,DE
|
||
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
|
||
RR E
|
||
RR D
|
||
RR E
|
||
RR D
|
||
RR E
|
||
RR D
|
||
RR E
|
||
R_F_F02 POP AF
|
||
OUT (SLOT3),A
|
||
LD HL,#0FEF
|
||
XOR A ; ®¡ã«ï¥¬ CF ¨ ãáâ ¢«¨¢ ¥¬ ª®¤ ®è¨¡ª¨ = ã«î
|
||
SBC HL,DE
|
||
POP HL
|
||
RET
|
||
|
||
; HL - CLUSTER
|
||
; 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,10 ;!HARDCODE error number
|
||
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"
|
||
JR Z,W_T_F12
|
||
W_T_F16:
|
||
PUSH DE
|
||
LD A,H
|
||
LD B,A
|
||
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
|
||
ADD HL,DE
|
||
POP DE
|
||
LD (HL),E
|
||
INC HL
|
||
LD (HL),D
|
||
POP AF
|
||
POP HL
|
||
OUT (SLOT3),A
|
||
XOR A
|
||
RET
|
||
|
||
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
|
||
LD A,H
|
||
LD B,A
|
||
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
|
||
LD DE,FAT
|
||
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
|
||
LD A,(HL)
|
||
AND #0F
|
||
OR E
|
||
LD (HL),A
|
||
INC HL
|
||
LD (HL),D
|
||
POP AF
|
||
POP HL
|
||
OUT (SLOT3),A
|
||
AND A
|
||
RET
|
||
|
||
;R01
|
||
; 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
|
||
ADD HL,HL
|
||
ADD HL,HL
|
||
ADD HL,HL
|
||
ADD HL,HL ;FAT BLOCK * 16 = SECTOR OF FAT
|
||
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 ; 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
|
||
|
||
WR_FAT: EXX
|
||
SET_PAGE_X FATPAGE
|
||
|
||
EXX
|
||
PUSH AF
|
||
CALL .Start
|
||
POP AF
|
||
OUT (SLOT3),A
|
||
RET
|
||
;
|
||
.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
|
||
|
||
PUSH HL
|
||
LD B,H
|
||
LD C,L ;BC - BLOCK OF FAT
|
||
LD DE,16
|
||
ADD HL,DE ;+ SIZE CASH (16 SECTORS)
|
||
|
||
LD DE,(BootSector.S_P_F)
|
||
LD A,16
|
||
AND A
|
||
SBC HL,DE
|
||
JR C,.WALLFAT
|
||
EX DE,HL
|
||
LD HL,16
|
||
; AND A ;âãâ â®ç® CF ¥ ¢§¢¥¤ñ
|
||
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
|
||
ADD IX,DE
|
||
LD HL,0 ;HL:IX - SECTOR OF FAT FOR SAVE
|
||
LD DE,FAT
|
||
LD B,A
|
||
LD C,Dss.DRV.Write
|
||
LD A,(FatBuffer.DRIVE)
|
||
PUSH BC
|
||
RST ToDSS.DRV
|
||
POP BC
|
||
POP HL
|
||
LD DE,(FatBuffer.FAT2_XX)
|
||
ADD HL,DE
|
||
EX DE,HL
|
||
LD IX,0
|
||
ADD IX,DE
|
||
LD DE,FAT
|
||
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
|
||
; SCF
|
||
RET
|
||
|
||
FATCASH: WORD #0000
|
||
.Block EQU FATCASH
|
||
.Update EQU FATCASH+1
|
||
MAX_CLU: WORD #0FF0
|
||
|
||
;//MODULE: FAT_X
|
||
;[END]
|
||
|
||
|