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
; DE - (CLUSTER)
R_F_FAT PUSH HL
R_F_FAT: PUSH HL
LD A,(FAT_TYP)
CP "2"
JP Z,R_F_F12

View File

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

View File

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

View File

@ -28,7 +28,6 @@ G_CLUS1: INC HL
RET
; HL - CLUSTER
INC_FAT PUSH HL
CALL G_CLUST
POP DE
@ -53,7 +52,8 @@ INC_FA2 CALL R_F_FAT
; HL - CLUSTER
; DE - (CLUSTER)
R_F_FAT EX DE,HL
;!FIXIT ¤ ŤĽĽ § âŽçŞ  ­  âŽ, ç⎠˘ DE ˘áĽŁ¤  0 - ŕ §¤ĽŤ ­Ľ ĄŽŤěčĽ 2Gb
R_F_FAT: EX DE,HL
LD HL,(MAX_CLU)
AND A
SBC HL,DE
@ -75,10 +75,12 @@ R_F_F16 LD A,H
AND #0F
LD H,A
LD A,B
; A/16
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
@ -91,7 +93,7 @@ R_F_F16 LD A,H
LD D,(HL)
POP AF
OUT (SLOT3),A
LD HL,#FFEF
LD HL,#FFEF ;!HARDCODE
XOR A ;DssErr.sys.NO_ERROR
SBC HL,DE
POP HL
@ -172,7 +174,7 @@ R_F_F12 LD D,H
RLCA
RLCA
AND #07
LD BC,(FATCASH)
LD BC,(FATCASH) ; C - BLOCK FAT IN CASH
CP C
CALL NZ,RE_FAT
LD DE,FAT
@ -208,7 +210,6 @@ R_F_F02 POP AF
; HL - CLUSTER
; DE - (CLUSTER)
W_T_FAT PUSH DE
EX DE,HL
LD HL,(MAX_CLU)
@ -226,7 +227,7 @@ W_T_FAT PUSH DE
PUSH HL
PUSH AF
LD A,1
LD (FATCASH+1),A
LD (FATCASH.Update),A
LD A,(FatBuffer.FAT_TYP)
CP "2"
JP Z,W_T_F12
@ -244,7 +245,6 @@ W_T_F16:
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
@ -275,7 +275,7 @@ W_T_F12 PUSH DE
RLCA
RLCA
AND #07
LD BC,(FATCASH)
LD BC,(FATCASH) ; C - BLOCK FAT IN CASH
CP C
CALL NZ,RE_FAT
LD DE,FAT
@ -317,9 +317,9 @@ W_T_F01 SLA E
;R01
; A - NEW FAT BLOCK
RE_FAT PUSH HL
RE_FAT: PUSH HL
PUSH AF
LD A,(FATCASH+1)
LD A,(FATCASH.Update)
OR A
CALL NZ,WR_FAT_
POP AF
@ -466,6 +466,8 @@ FATERR: POP HL
RET
FATCASH: WORD #0000
.Block EQU FATCASH
.Update EQU FATCASH+1
MAX_CLU: WORD #0FF0
;//MODULE: FAT_X

View File

@ -27,7 +27,9 @@ RESERVED2 BLOCK 490,0
.ATTRIBUT: BYTE #10 ;+11 ATTRIBUT
.RESERVED_L: BYTE 0 ;+12 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
.DATE: WORD #0000 ;+24 DATE
.ST_CLUSTER: WORD #0000 ;+26 START CLUSTER