Saving in FM offset in file and it's cluster on disk

This commit is contained in:
Anatoliy Belyanskiy 2023-07-10 03:49:01 +10:00
parent e542bc0bd3
commit d8e13bc4b5
5 changed files with 165 additions and 93 deletions

View File

@ -561,10 +561,8 @@ ADD_DE2 DJNZ ADD_DE1
;----------------- ;-----------------
; HL - CLUSTER ; HL - CLUSTER
; DE - (CLUSTER) ; DE - (CLUSTER)
R_F_FAT: PUSH HL
R_F_FAT PUSH HL
LD A,(FAT_TYP) LD A,(FAT_TYP)
CP "2" CP "2"
JP Z,R_F_F12 JP Z,R_F_F12

View File

@ -654,7 +654,10 @@ TMPNAME: DB ' ',#00 ; 12
;!TODO ᤥ« âì ¤«ï ª ¦¤®£® ¤à ©¢  § ¯®¬¨­ ­¨¥ ⥪ã饩 ¤¨à४â®à¨¨, ¯®ª  âãâ § £«ã誠 ;!TODO ᤥ« âì ¤«ï ª ¦¤®£® ¤à ©¢  § ¯®¬¨­ ­¨¥ ⥪ã饩 ¤¨à४â®à¨¨, ¯®ª  âãâ § £«ã誠
; RestoreDIR: ; RestoreDIR:
CHNDISK: CHNDISK:
CALL OPENDSK ;!TEST
CALL OPENDSK
;CALL OPENDSK.force
;
;????? R10 ;????? R10
RET C RET C
;LD HL,DIRSPEC+1 ;LD HL,DIRSPEC+1
@ -686,7 +689,7 @@ OPENDSK:
JR Z,.exit JR Z,.exit
LD A,C LD A,C
; ;
PUSH AF .force: PUSH AF
LD C,Dss.DRV.Open LD C,Dss.DRV.Open
RST ToDSS.DRV RST ToDSS.DRV
POP BC POP BC

View File

@ -41,6 +41,7 @@ FM_BUF: _sFM
BLOCK (FMCOUNT-1)*FM_BUF.Size, 0 BLOCK (FMCOUNT-1)*FM_BUF.Size, 0
*/ */
; ­  ¢ë室¥ ¡¥§ ®è¨¡®ª IY 㪠§ë¢ ¥â ­  ä ©«®¢ë© ¬ ­¨¯ã«ïâ®à
MACRO _mFM_FIND MACRO _mFM_FIND
CP FMCOUNT+1 CP FMCOUNT+1
JR NC,ABS_FM JR NC,ABS_FM
@ -138,6 +139,10 @@ MOVE_F1 ADD IX,BC
LD (IY+34),L LD (IY+34),L
LD (IY+35),H LD (IY+35),H
XOR A XOR A
;!TEST SAVE CLUSTER AFTER READ
;LD (IY+_sFM.RESERVED_L),A
;LD (IY+_sFM.RESERVED_L+1),A
;
RET RET
;FP COMPARE ;FP COMPARE
@ -158,8 +163,11 @@ MOVE_CP LD L,(IY+28)
RET RET
;-------------------- ;--------------------
ECL2:
ECL2 POP BC ;!TEST SAVE CLUSTER AFTER READ
POP BC
;
POP BC
POP DE POP DE
AND A AND A
RET RET
@ -170,32 +178,91 @@ BLOKRD0 POP BC
RET RET
;READ SECTORS OF FILE ;READ SECTORS OF FILE
;HL:DE - FP (in sectors) ;HL:DE - FP (in sectors)
; B - Amount sectors ; B - Amount sectors
BLOK_RD PUSH BC BLOK_RD: PUSH BC
LD (READMEM),IX LD (READMEM),IX
LD A,(BootSector.S_P_C) ;SECTORS PER CLUSTER LD A,(BootSector.S_P_C) ;SECTORS PER CLUSTER
LD C,A LD C,A
LD B,0 LD B,0
;HL:DE / BC => DE:IX HL-OSTATOK
CALL DIV32 ;!FIXIT § ¬¥­¨âì ¢ë§®¢ HLDE/BC ­  HLDE/C CALL DIV32 ;!FIXIT § ¬¥­¨âì ¢ë§®¢ HLDE/BC ­  HLDE/C
;!FIXIT ¤ «¥¥ § â®çª  ­  â®, çâ® ¢ DE ¢á¥£¤  0 - à §¤¥« ­¥ ¡®«ìè¥ 2Gb
LD B,XH LD B,XH
LD C,XL LD C,XL
PUSH HL ;RESIDUE PUSH HL ;RESIDUE
LD L,(IY+26) ;START CLUSTER LD L,(IY+_sFM.ST_CLUSTER) ;START CLUSTER
LD H,(IY+27) LD H,(IY+_sFM.ST_CLUSTER+1)
LD A,H LD A,H
OR L OR L
JR NZ,BLOKRD2 ;!TEST SAVE CLUSTER AFTER READ
JR ECL2 ;R01 JR BLOKRD0 ;JR NZ,BLOKRD2
BLOKRD1 PUSH BC PUSH BC
JR NZ,.testFunc
;
JP ECL2 ;R01 JR BLOKRD0
.testFunc:
;!TEST SAVE CLUSTER AFTER READ
LD E,(IY+_sFM.RESERVED_L)
LD D,(IY+_sFM.RESERVED_H)
LD A,D
OR E
JR Z,BLOKRD2
PUSH DE
PUSH HL
PUSH BC
LD E,(IY+_sFM.RESERVED_CL)
LD D,(IY+_sFM.RESERVED_CH)
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 BLOKRD2
;
.noOptimization_1:
POP BC
.noOptimization_2:
POP HL
POP DE
JP BLOKRD2
BLOKRD1:
PUSH BC
CALL R_F_FAT CALL R_F_FAT
POP BC POP BC
JR C,ECL2 ;R01 JR C,ECL2 ;R01
EX DE,HL EX DE,HL
DEC BC DEC BC
BLOKRD2 LD A,B
BLOKRD2:
LD A,B ; - ᬥ饭¨¥ ¢­ãâਠ䠩«  ¢ ª« áâ¥à å
OR C OR C
JR NZ,BLOKRD1 JR NZ,BLOKRD1
;!TEST SAVE CLUSTER AFTER READ
LD (IY+_sFM.RESERVED_L),L
LD (IY+_sFM.RESERVED_H),H
POP BC
LD (IY+_sFM.RESERVED_CL),C
LD (IY+_sFM.RESERVED_CH),B
;
POP DE POP DE
POP BC POP BC
LD A,(BootSector.S_P_C) LD A,(BootSector.S_P_C)
@ -255,7 +322,7 @@ BLOKRD7 EX DE,HL
LD DE,(READMEM) LD DE,(READMEM)
LD A,(FatBuffer.DRIVE) LD A,(FatBuffer.DRIVE)
LD B,C LD B,C
LD C,5 LD C,Dss.DRV.Read
RST ToDSS.DRV RST ToDSS.DRV
JP C,BLOKRD0 JP C,BLOKRD0
POP BC POP BC
@ -407,23 +474,23 @@ BLOKWRA POP BC
TSTSIZE XOR A TSTSIZE XOR A
LD (READCOD),A LD (READCOD),A
LD L,(IY+32) ;FP LOW LD L,(IY+32) ;FP LOW _sFM.F_POSITION
LD H,(IY+33) LD H,(IY+33)
ADD HL,DE ADD HL,DE
EXX EXX
LD DE,0 LD DE,0
LD L,(IY+34) ;FP HIGH LD L,(IY+34) ;FP HIGH
LD H,(IY+35) LD H,(IY+35)
ADC HL,DE ADC HL,DE
EXX ;HL':HL - NEW FP EXX ;HL':HL - NEW FP
LD C,(IY+28) LD C,(IY+28) ; _sFM.F_SIZE
LD B,(IY+29) ;SIZE LOW LD B,(IY+29) ;SIZE LOW
AND A AND A
SBC HL,BC SBC HL,BC
EXX EXX
LD C,(IY+30) ;SIZE HIGH LD C,(IY+30) ;SIZE HIGH
LD B,(IY+31) LD B,(IY+31)
SBC HL,BC SBC HL,BC
EXX EXX
RET C ;OK READ ALL RET C ;OK READ ALL
EX DE,HL EX DE,HL
@ -436,38 +503,40 @@ TSTSIZE XOR A
; HL - ADDRESS ; HL - ADDRESS
; DE - SIZE ; DE - SIZE
; A - FM ; A - FM
READ: LD (R_POINT),HL
READ LD (R_POINT),HL
LD (S_POINT),HL LD (S_POINT),HL
CALL SET_FM CALL SET_FM
RET C RET C
CALL TSTSIZE CALL TSTSIZE
LD A,D LD A,D
OR E OR E
JP Z,NOREAD JP Z,NOREAD ;!FIXIT ¬®¦­® ¯¥à¥­¥á⨠¢ ­ ç «® ¯à®æ¥¤ãàë
PUSH DE PUSH DE
LD A,(IY+_sFM.DRIVE) LD A,(IY+_sFM.DRIVE)
;!TEST CHNDISK OPENDSK ;!TEST CHNDISK OPENDSK
CALL OPENDSK CALL OPENDSK
; ;
JP C,RPERR1 JP C,RPERR1
LD C,(IY+_sFM.F_POSITION) ;<3B> áçñâ ᬥ饭¨ï ¢ ᥪâ®à å
LD E,(IY+_sFM.F_POSITION+1) LD C,(IY+_sFM.F_POSITION)
LD A,E LD E,(IY+_sFM.F_POSITION+1)
AND #01 LD A,E
LD B,A AND #01
LD D,(IY+_sFM.F_POSITION+2) LD B,A
LD L,(IY+_sFM.F_POSITION+3) LD D,(IY+_sFM.F_POSITION+2)
LD H,0 LD L,(IY+_sFM.F_POSITION+3)
OR A LD H,0
RR L OR A
RR D RR L
RR E ;HL:DE FP (in sectors) RR D
; BC FP residue (in bytes) RR E
;HL:DE FP (in sectors)
;BC FP residue (in bytes)
;
LD A,B LD A,B
OR C OR C
JP NZ,ROV1 JP NZ,ROV1
ROV4 POP BC ROV4: POP BC
PUSH BC PUSH BC
SRL B SRL B
JR Z,ROV2 JR Z,ROV2
@ -491,7 +560,7 @@ SECTORL+1: LD HL,0 // LD HL,(SECTORL)
SECTORH+1: LD HL,0 // LD HL,(SECTORH) SECTORH+1: LD HL,0 // LD HL,(SECTORH)
LD C,B LD C,B
ADC HL,BC ADC HL,BC
ROV2 POP BC ROV2: POP BC
LD A,B LD A,B
AND #01 AND #01
LD B,A LD B,A
@ -514,7 +583,6 @@ ROV2 POP BC
POP BC POP BC
LDIR LDIR
LD (R_POINT),DE LD (R_POINT),DE
ROV6: ROV6:
S_POINT+1: LD HL,0 // LD HL,(S_POINT) S_POINT+1: LD HL,0 // LD HL,(S_POINT)
LD DE,(R_POINT) LD DE,(R_POINT)
@ -533,7 +601,7 @@ READCOD+1: LD A,0 // LD A,(READCOD)
OR A OR A
RET RET
ROV1 PUSH BC ROV1: PUSH BC
PUSH HL PUSH HL
PUSH DE PUSH DE
LD IX,BUFFER+#C000 LD IX,BUFFER+#C000
@ -569,7 +637,7 @@ ROV1 PUSH BC
LD B,H LD B,H
LD C,L LD C,L
LD HL,0 LD HL,0
ROV3 PUSH HL ROV3: PUSH HL
LD HL,BUFFER LD HL,BUFFER
ADD HL,DE ADD HL,DE
LD DE,(R_POINT) LD DE,(R_POINT)
@ -578,19 +646,19 @@ ROV3 PUSH HL
EXX EXX
JP ROV4 JP ROV4
RPERR3 POP HL RPERR3: POP HL
RPERR2 POP HL RPERR2: POP HL
RPERR1 POP BC RPERR1: POP BC
SCF SCF
RET RET
PWERR3 POP HL PWERR3: POP HL
PWERR2 POP HL PWERR2: POP HL
PWERR1 POP BC PWERR1: POP BC
SCF SCF
RET RET
RD_ONLY POP DE RD_ONLY: POP DE
LD A,DSS_Error.sys.READONLY LD A,DSS_Error.sys.READONLY
SCF SCF
RET RET
@ -599,7 +667,7 @@ RD_ONLY POP DE
; DE - SIZE ; DE - SIZE
; A - FM ; A - FM
WRITE LD (R_POINT),HL WRITE: LD (R_POINT),HL
LD (S_POINT),HL LD (S_POINT),HL
PUSH DE PUSH DE
CALL SET_FM CALL SET_FM
@ -631,7 +699,7 @@ WRITE LD (R_POINT),HL
LD A,B LD A,B
OR C OR C
JP NZ,WOV1 JP NZ,WOV1
WOV4 POP BC WOV4: POP BC
PUSH BC PUSH BC
SRL B SRL B
JR Z,WOV2 JR Z,WOV2
@ -646,7 +714,7 @@ R_POINT+2: LD IX,0 // LD IX,(R_POINT)
LD C,B LD C,B
LD HL,(R_POINT) LD HL,(R_POINT)
LD DE,#0200 LD DE,#0200
WOV5 ADD HL,DE WOV5: ADD HL,DE
DJNZ WOV5 DJNZ WOV5
LD (R_POINT),HL LD (R_POINT),HL
LD B,0 LD B,0
@ -656,7 +724,7 @@ WOV5 ADD HL,DE
POP HL POP HL
LD C,B LD C,B
ADC HL,BC ADC HL,BC
WOV2 POP BC WOV2: POP BC
LD A,B LD A,B
AND #01 AND #01
LD B,A LD B,A
@ -694,7 +762,7 @@ WOV2 POP BC
LD C,SLOT3 LD C,SLOT3
OUT (C),B OUT (C),B
RET C RET C
WOV6 LD DE,(S_POINT) WOV6: LD DE,(S_POINT)
LD HL,(R_POINT) LD HL,(R_POINT)
AND A AND A
SBC HL,DE SBC HL,DE
@ -717,8 +785,7 @@ WOV6 LD DE,(S_POINT)
LD (IY+31),B LD (IY+31),B
AND A AND A
RET RET
WOV1: PUSH BC
WOV1 PUSH BC
PUSH HL PUSH HL
PUSH DE PUSH DE
LD IX,BUFFER+#C000 LD IX,BUFFER+#C000
@ -749,7 +816,7 @@ WOV1 PUSH BC
LD B,H LD B,H
LD C,L LD C,L
LD HL,0 LD HL,0
WOV3 PUSH HL WOV3: PUSH HL
LD HL,BUFFER LD HL,BUFFER
ADD HL,DE ADD HL,DE
LD DE,(R_POINT) LD DE,(R_POINT)
@ -782,17 +849,17 @@ WOV3 PUSH HL
; HL - CLUSTER ; HL - CLUSTER
; HL:IX - SECTOR ; HL:IX - SECTOR
NSECTOR DEC HL NSECTOR: DEC HL
DEC HL DEC HL
EX DE,HL EX DE,HL
LD A,(BootSector.S_P_C) LD A,(BootSector.S_P_C)
LD B,A LD B,A
LD HL,0 LD HL,0
LD IX,0 LD IX,0
ADD_DE1 ADD IX,DE ADD_DE1: ADD IX,DE
JR NC,ADD_DE2 JR NC,ADD_DE2
INC HL INC HL
ADD_DE2 DJNZ ADD_DE1 ADD_DE2: DJNZ ADD_DE1
LD DE,(FatBuffer.DAT_FRM) LD DE,(FatBuffer.DAT_FRM)
ADD IX,DE ADD IX,DE
LD DE,#0000 LD DE,#0000
@ -800,12 +867,12 @@ ADD_DE2 DJNZ ADD_DE1
RET RET
; HL:DE / BC => DE:IX HL-OSTATOK ; HL:DE / BC => DE:IX HL-OSTATOK
DIV32 LD XH,D DIV32: LD XH,D
LD XL,E LD XL,E
EX DE,HL EX DE,HL
LD HL,0 LD HL,0
LD A,#20 LD A,#20
DIV001 ADD IX,IX DIV001: ADD IX,IX
EX DE,HL EX DE,HL
ADC HL,HL ADC HL,HL
EX DE,HL EX DE,HL
@ -816,7 +883,7 @@ DIV001 ADD IX,IX
DEC A DEC A
JR NZ,DIV001 JR NZ,DIV001
RET RET
DIV002 INC IX DIV002: INC IX
DEC A DEC A
JR NZ,DIV001 JR NZ,DIV001
RET RET

View File

@ -28,7 +28,6 @@ G_CLUS1: INC HL
RET RET
; HL - CLUSTER ; HL - CLUSTER
INC_FAT PUSH HL INC_FAT PUSH HL
CALL G_CLUST CALL G_CLUST
POP DE POP DE
@ -53,7 +52,8 @@ INC_FA2 CALL R_F_FAT
; HL - CLUSTER ; HL - CLUSTER
; DE - (CLUSTER) ; DE - (CLUSTER)
R_F_FAT EX DE,HL ;!FIXIT ¤ «¥¥ § â®çª  ­  â®, çâ® ¢ DE ¢á¥£¤  0 - à §¤¥« ­¥ ¡®«ìè¥ 2Gb
R_F_FAT: EX DE,HL
LD HL,(MAX_CLU) LD HL,(MAX_CLU)
AND A AND A
SBC HL,DE SBC HL,DE
@ -75,15 +75,17 @@ R_F_F16 LD A,H
AND #0F AND #0F
LD H,A LD H,A
LD A,B LD A,B
RRCA ; A/16
RRCA RRCA
RRCA RRCA
RRCA RRCA
AND #0F ; A - BLOCK FAT (1 BLOCK = 8192 BYTES) RRCA
ADD HL,HL ; HL - FAT OFFSET (FROM CASH) ;
LD BC,(FATCASH) ; C - BLOCK FAT IN CASH 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 CP C
CALL NZ,RE_FAT ; A <> C - READ NEW BLOCK FAT CALL NZ,RE_FAT ; A <> C - READ NEW BLOCK FAT
LD DE,FAT LD DE,FAT
ADD HL,DE ADD HL,DE
LD E,(HL) LD E,(HL)
@ -91,11 +93,11 @@ R_F_F16 LD A,H
LD D,(HL) LD D,(HL)
POP AF POP AF
OUT (SLOT3),A OUT (SLOT3),A
LD HL,#FFEF LD HL,#FFEF ;!HARDCODE
XOR A ;DssErr.sys.NO_ERROR XOR A ;DssErr.sys.NO_ERROR
SBC HL,DE SBC HL,DE
POP HL POP HL
;LD A,DssErr.sys.NO_ERROR ;LD A,DssErr.sys.NO_ERROR
RET RET
;R01; HL - CLUSTER ;R01; HL - CLUSTER
@ -172,7 +174,7 @@ R_F_F12 LD D,H
RLCA RLCA
RLCA RLCA
AND #07 AND #07
LD BC,(FATCASH) LD BC,(FATCASH) ; C - BLOCK FAT IN CASH
CP C CP C
CALL NZ,RE_FAT CALL NZ,RE_FAT
LD DE,FAT LD DE,FAT
@ -208,7 +210,6 @@ R_F_F02 POP AF
; HL - CLUSTER ; HL - CLUSTER
; DE - (CLUSTER) ; DE - (CLUSTER)
W_T_FAT PUSH DE W_T_FAT PUSH DE
EX DE,HL EX DE,HL
LD HL,(MAX_CLU) LD HL,(MAX_CLU)
@ -226,7 +227,7 @@ W_T_FAT PUSH DE
PUSH HL PUSH HL
PUSH AF PUSH AF
LD A,1 LD A,1
LD (FATCASH+1),A LD (FATCASH.Update),A
LD A,(FatBuffer.FAT_TYP) LD A,(FatBuffer.FAT_TYP)
CP "2" CP "2"
JP Z,W_T_F12 JP Z,W_T_F12
@ -241,11 +242,10 @@ W_T_F16:
RRCA RRCA
RRCA RRCA
RRCA RRCA
AND #0F ; A - BLOCK FAT (1 BLOCK = 8192 BYTES) AND #0F ; A - BLOCK FAT (1 BLOCK = 8192 BYTES)
ADD HL,HL ; HL - FAT OFFSET (FROM CASH) ADD HL,HL ; HL - FAT OFFSET (FROM CASH)
LD BC,(FATCASH) ; C - BLOCK FAT IN CASH LD BC,(FATCASH) ; C - BLOCK FAT IN CASH
CP C CALL NZ,RE_FAT ; A <> C - READ NEW BLOCK FAT
CALL NZ,RE_FAT ; A <> C - READ NEW BLOCK FAT
LD DE,FAT LD DE,FAT
ADD HL,DE ADD HL,DE
POP DE POP DE
@ -275,7 +275,7 @@ W_T_F12 PUSH DE
RLCA RLCA
RLCA RLCA
AND #07 AND #07
LD BC,(FATCASH) LD BC,(FATCASH) ; C - BLOCK FAT IN CASH
CP C CP C
CALL NZ,RE_FAT CALL NZ,RE_FAT
LD DE,FAT LD DE,FAT
@ -317,9 +317,9 @@ W_T_F01 SLA E
;R01 ;R01
; A - NEW FAT BLOCK ; A - NEW FAT BLOCK
RE_FAT PUSH HL RE_FAT: PUSH HL
PUSH AF PUSH AF
LD A,(FATCASH+1) LD A,(FATCASH.Update)
OR A OR A
CALL NZ,WR_FAT_ CALL NZ,WR_FAT_
POP AF POP AF
@ -466,6 +466,8 @@ FATERR: POP HL
RET RET
FATCASH: WORD #0000 FATCASH: WORD #0000
.Block EQU FATCASH
.Update EQU FATCASH+1
MAX_CLU: WORD #0FF0 MAX_CLU: WORD #0FF0
;//MODULE: FAT_X ;//MODULE: FAT_X

View File

@ -27,7 +27,9 @@ RESERVED2 BLOCK 490,0
.ATTRIBUT: BYTE #10 ;+11 ATTRIBUT .ATTRIBUT: BYTE #10 ;+11 ATTRIBUT
.RESERVED_L: BYTE 0 ;+12 RESERVED; !TODO á«¥¤ãî騩 ª« áâ¥à ¤«ï ç⥭¨ï .RESERVED_L: BYTE 0 ;+12 RESERVED; !TODO á«¥¤ãî騩 ª« áâ¥à ¤«ï ç⥭¨ï
.RESERVED_H: BYTE 0 ;+13 RESERVED; !TODO á«¥¤ãî騩 ª« áâ¥à ¤«ï § ¯¨á¨ .RESERVED_H: BYTE 0 ;+13 RESERVED; !TODO á«¥¤ãî騩 ª« áâ¥à ¤«ï § ¯¨á¨
.RESERVED_X: BLOCK 8,0 ;+14 RESERVED .RESERVED_CL: BYTE 0 ;+14 RESERVED; !TODO á«¥¤ãî騩 ª« áâ¥à ¤«ï § ¯¨á¨
.RESERVED_CH: BYTE 0 ;+15 RESERVED; !TODO á«¥¤ãî騩 ª« áâ¥à ¤«ï § ¯¨á¨
.RESERVED_X: BLOCK 6,0 ;+16 RESERVED
.TIME: WORD #0000 ;+22 TIME .TIME: WORD #0000 ;+22 TIME
.DATE: WORD #0000 ;+24 DATE .DATE: WORD #0000 ;+24 DATE
.ST_CLUSTER: WORD #0000 ;+26 START CLUSTER .ST_CLUSTER: WORD #0000 ;+26 START CLUSTER