From d8e13bc4b55d82efbf96ea33cf6e7db8693e67cb Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Mon, 10 Jul 2023 03:49:01 +1000 Subject: [PATCH] Saving in FM offset in file and it's cluster on disk --- BOOT/DSSBOOT.ASM | 4 +- DSS/DOS5.ASM | 7 +- DSS/DOS_FM.ASM | 195 ++++++++++++++++++++++++++++++--------------- DSS/FAT_X.ASM | 48 +++++------ DSS/Structures.inc | 4 +- 5 files changed, 165 insertions(+), 93 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index 3ef99b2..27c8095 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -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 diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index 03f3377..ca479f1 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -654,7 +654,10 @@ TMPNAME: DB ' ',#00 ; 12 ;!TODO сделать для каждого драйва запоминание текущей дирректории, пока тут заглушка ; RestoreDIR: CHNDISK: - CALL OPENDSK + ;!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 diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index e5a7152..e4e82be 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -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 @@ -170,32 +178,91 @@ BLOKRD0 POP BC RET ;READ SECTORS OF FILE -;HL:DE - FP (in sectors) -; B - Amount sectors -BLOK_RD PUSH BC +;HL:DE - FP (in sectors) +; B - Amount sectors +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) + PUSH HL ;RESIDUE + 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,23 +474,23 @@ 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 - LD DE,0 - LD L,(IY+34) ;FP HIGH - LD H,(IY+35) - ADC HL,DE + LD DE,0 + LD L,(IY+34) ;FP HIGH + 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 EXX - LD C,(IY+30) ;SIZE HIGH - LD B,(IY+31) - SBC HL,BC + LD C,(IY+30) ;SIZE HIGH + LD B,(IY+31) + SBC HL,BC EXX RET C ;OK READ ALL EX DE,HL @@ -436,38 +503,40 @@ 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 - LD C,(IY+_sFM.F_POSITION) - LD E,(IY+_sFM.F_POSITION+1) - LD A,E - AND #01 - LD B,A - LD D,(IY+_sFM.F_POSITION+2) - LD L,(IY+_sFM.F_POSITION+3) - LD H,0 - OR A - RR L - RR D - RR E ;HL:DE FP (in sectors) - ; BC FP residue (in bytes) + ;Расчёт смещения в секторах + LD C,(IY+_sFM.F_POSITION) + LD E,(IY+_sFM.F_POSITION+1) + LD A,E + AND #01 + LD B,A + LD D,(IY+_sFM.F_POSITION+2) + LD L,(IY+_sFM.F_POSITION+3) + LD H,0 + OR A + RR L + RR D + 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 diff --git a/DSS/FAT_X.ASM b/DSS/FAT_X.ASM index 6c08d1c..ca89b79 100644 --- a/DSS/FAT_X.ASM +++ b/DSS/FAT_X.ASM @@ -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,15 +75,17 @@ R_F_F16 LD A,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 + ; 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 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 ADD HL,DE LD E,(HL) @@ -91,11 +93,11 @@ 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 - ;LD A,DssErr.sys.NO_ERROR + ;LD A,DssErr.sys.NO_ERROR RET ;R01; HL - CLUSTER @@ -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 @@ -241,11 +242,10 @@ W_T_F16: 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 + 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 + CALL NZ,RE_FAT ; A <> C - READ NEW BLOCK FAT LD DE,FAT ADD HL,DE POP 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 diff --git a/DSS/Structures.inc b/DSS/Structures.inc index b518975..80ea250 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -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