From 87c74c1ee7b6eaa6a049e9827bfbc38ccc70c31a Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 22 Mar 2024 04:06:17 +1000 Subject: [PATCH] fixed BLOCK_READ, BLOCK_WR --- DSS/API/Open.asm | 7 +- DSS/FS/FAT/FAT12_16.asm | 900 ++++++++++++++++++++++++---------------- DSS/Procedures.asm | 141 +------ DSS/Structures.inc | 12 +- Shared_Includes | 2 +- 5 files changed, 555 insertions(+), 507 deletions(-) diff --git a/DSS/API/Open.asm b/DSS/API/Open.asm index d290ad3..645f568 100644 --- a/DSS/API/Open.asm +++ b/DSS/API/Open.asm @@ -50,11 +50,16 @@ OPEN_FN:;!TEST Current Dir ;[x] 15/10/23 LD A,(TASK) LD (IY+_sFM.TASK_NUM),A XOR A - ; [ ] fat32 LD (IY+_sFM.KnownCluster_L),A LD (IY+_sFM.KnownCluster_L+1),A LD (IY+_sFM.KnownOffset_L),A LD (IY+_sFM.KnownOffset_L+1),A + LD (IY+_sFM.OptimizedClusters),A + ; [x] fat32 + LD (IY+_sFM.KnownCluster_H),A + LD (IY+_sFM.KnownCluster_H+1),A + LD (IY+_sFM.KnownOffset_H),A + LD (IY+_sFM.KnownOffset_H+1),A ; LD (IY+_sFM.F_POSITION),A LD (IY+_sFM.F_POSITION+1),A diff --git a/DSS/FS/FAT/FAT12_16.asm b/DSS/FS/FAT/FAT12_16.asm index 3865e2f..6b3f4a0 100644 --- a/DSS/FS/FAT/FAT12_16.asm +++ b/DSS/FS/FAT/FAT12_16.asm @@ -75,36 +75,46 @@ INC_FAT: ;----------------------------------------------------------- ; Прочитать из кеша FAT-а номер след. кластера -; вход: hl = номер кластера -; de = СТАРШЕЕ слово номера кластера (только для FAT32) -; выход: hl = номер кластера -; de = номер след. кластера (если 0, то кластер hl свободен) -; CF - конец цепочки -;!FIXIT далее заточка на то, что в DE всегда 0 - раздел не больше 2Gb +; вход: hl - номер кластера (младшее слово) +; hl' - номера кластера (старшее слово. только для FAT32) +; выход: hl - номер кластера (младшее слово) +; hl' - номера кластера (старшее слово) +; de - номер след. кластера (младшее слово. если 0, то кластер hl свободен) +; de' - номер след. кластера (старшее слово. если 0, то кластер hl' свободен) +; CF - конец цепочки +;!FIXIT далее заточка на то, что в DE всегда 0 - файл не больше 2Gb ;----------------------------------------------------------- ;[ ] fat32 READ_FROM_FAT: ;[x] fat32 - PUSH DE LD A,(FatBuffer.FAT_TYPE) XOR 32 JR NZ,.low ; Z=0 проверяем младшее слово номера кластера - LD HL,(FAT_Max_Cluster_H) ; проверяем старшее слово номера кластера - JP .high + ; проверяем старшее слово номера кластера + ; !FIXIT fat32 проверять оба слова FAT_Max_Cluster + EXX + EX DE,HL + LD HL,(FAT_Max_Cluster_H) + ; CF = 0 + SBC HL,DE + EX DE,HL + EXX + LD A,DSS_Error.sys.DISK_FULL + RET C + JP NZ,.correct_cluster ; если FAT_Max_Cluster_H - IX != 0, то кластер корректный ; + ; проверяем младше слово номера кластера .low: EX DE,HL LD HL,(FAT_Max_Cluster_L) -.high: ; CF = 0 + ; CF = 0 SBC HL,DE EX DE,HL LD A,DSS_Error.sys.DISK_FULL - ;[x] fat32 - POP DE - ; RET C - - SET_PAGE_X FATPAGE - + ; +.correct_cluster: + SET_PAGE_X FATPAGE + ; PUSH HL PUSH AF LD A,(FatBuffer.FAT_TYPE) @@ -116,13 +126,20 @@ READ_FROM_FAT: LD E,(HL) ; прочитать номер кластера INC HL LD D,(HL) + ; POP AF OUT (SLOT3),A - ;!TODO #FFF7 - кластер с косячными секторами LD HL,#FFEF ;!HARDCODE - XOR A ; DssErr.sys.NO_ERROR +.exit: XOR A ; обнуляем CF и устанавливаем код ошибки = DssErr.sys.NO_ERROR SBC HL,DE ; проверка на служ. кластеры POP HL + ; [x] fat32 + EXX + LD H,A + LD L,A + LD D,A + LD E,A + EXX RET ; .FAT12: CALL GET_FAT12_CELL @@ -147,10 +164,8 @@ READ_FROM_FAT: POP AF OUT (SLOT3),A LD HL,#0FEF - XOR A ; обнуляем CF и устанавливаем код ошибки = нулю - SBC HL,DE ; проверка на служ. кластеры - POP HL - RET + JR .exit + ; .FAT32: ; [ ] fat32 CALL GET_FAT32_CELL DI @@ -556,199 +571,165 @@ NSECTOR:;[ ] fat32 RET //////////////////////////////////////////////////////////////////////// -;[ ] fat32 -;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE - MACRO _GetSavedCluster exit_to - LD E,(IY+_sFM.KnownCluster_L) - LD D,(IY+_sFM.KnownCluster_L+1) - LD A,D - INC B - OR E - JR Z,exit_to - DEC B - ; - PUSH DE - PUSH HL - PUSH BC - LD E,(IY+_sFM.KnownOffset_L) - LD D,(IY+_sFM.KnownOffset_L+1) - LD A,D - OR E - JR Z,.noOptimization_1 - ; - POP HL - SBC HL,DE - JR C,.noOptimization_2 - ; - LD C,L - LD B,H - POP DE - POP HL - ; - INC B - JP exit_to -.noOptimization_1: - POP BC -.noOptimization_2: - POP HL - POP DE - INC B - JP exit_to - ENDM - ; -;[ ] fat32 -;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE - MACRO _SaveGetedCluster - LD (IY+_sFM.KnownCluster_L),L - LD (IY+_sFM.KnownCluster_L+1),H - POP BC - LD (IY+_sFM.KnownOffset_L),C - LD (IY+_sFM.KnownOffset_L+1),B - ENDM -;; -BLOCK_READ.ECL2: - ;POP DE ; [ ] старшее слово номера кластера (раньше игнорировалось) - POP BC ; [x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE - POP BC - POP DE - AND A - RET - ; + +; 225 937 408 / 512 = 0x6BBC4 / 4 = 0x1AEF1 +; ;READ SECTORS OF FILE ;HL:DE - FP (in sectors) ; B - Amount sectors ; IX - buffer in RAM -; 225 937 408 / 512 = 0x6BBC4 / 4 = 0x1AEF1 -BLOCK_READ: - PUSH BC - LD (READ.PointerOnBuffer),IX - LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ;SECTORS PER CLUSTER - LD C,A - LD B,0 - ;HL:DE / BC => DE:IX HL-OSTATOK - CALL DIV_for_SPC - ; [ ] fat32. далее заточка на то, что в DE всегда 0 - файл не больше 2Gb. Использовать DE - LD B,XH - LD C,XL - PUSH HL ; остаток DIV_for_SPC - - LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) ;START CLUSTER - LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) - LD A,L - OR H - ;OR (IY+_sFM.FS_REC.FIRST_CLUSTER_H+1) - ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE - ;JR NZ,BLOKRD2 - PUSH BC - ;PUSH DE ; [ ] старшее слово номера кластера (раньше игнорировалось) - JR Z,.ECL2 - ;JP ECL2 ;RY01 JR BLOKRD0 - _GetSavedCluster .enter_loop1 - ; -.loop1: PUSH BC - CALL READ_FROM_FAT - POP BC - JR C,.ECL2 ;RY01 - EX DE,HL - ; DEC BC -.enter_loop1: - ; LD A,B ; ВС - смещение внутри файла в кластерах - ; OR C - ; JR NZ,.loop1 - INC B - DEC BC - DJNZ .loop1 - ;POP DE ; [ ] старшее слово номера кластера (раньше игнорировалось) - ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE - _SaveGetedCluster - ; - POP DE ; остаток DIV_for_SPC - POP BC ; HL:DE - FP (in sectors) - LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) - SUB E - LD C,A ;\ - CP B ; \ - JR C,.skip1 ;SIZE > RESIDUE CLUSTER ; \ - LD C,B ;SIZE < CLUSTER ;->-|--> ; !TODO разобраться -.skip1: LD A,B ; / - SUB C ; / - LD B,A ;/ - PUSH HL - PUSH BC - PUSH DE - CALL NSECTOR - POP DE - ADD IX,DE - JR NC,.skip2 - INC HL -.skip2: LD DE,(READ.PointerOnBuffer) - LD A,(FatBuffer.DRIVE) - LD B,C - LD C,Dss.DRV.Read - RST ToDSS.DRV - JR C,.Error - POP BC - LD HL,(READ.PointerOnBuffer) - LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) - ;!TEST - LD A,B - LD B,C -.loop2: ADD HL,DE - ;DEC C - ;JR NZ,.loop2 - DJNZ .loop2 - LD (READ.PointerOnBuffer),HL - POP DE - ;LD A,B - OR A - RET Z - LD B,A - ; -.loop4: LD HL,CORE_BUFFERS.BootSector.SectorsPerCluster - LD A,B - SUB (HL) - LD B,A - LD C,(HL) - JR NC,.BLOKRD7 - LD B,0 - ADD A,(HL) ;0 AND CF - LD C,A - OR A ;CLEAR CF - RET Z -.BLOKRD7: - EX DE,HL - PUSH BC - CALL READ_FROM_FAT - POP BC - JR C,.ECL1 ;RY01 - EX DE,HL - PUSH HL - PUSH BC - CALL NSECTOR - LD DE,(READ.PointerOnBuffer) - LD A,(FatBuffer.DRIVE) - LD B,C - LD C,Dss.DRV.Read - RST ToDSS.DRV - JR C,.Error - POP BC - LD HL,(READ.PointerOnBuffer) - LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) -.loop3: ADD HL,DE - DEC C - JR NZ,.loop3 - LD (READ.PointerOnBuffer),HL - POP DE - JP .loop4 - ; -.Error: POP BC - POP DE - ;SCF - RET - ; -.ECL1: AND A - RET +; [ ] fat32 +BLOCK_READ: PUSH BC + LD (READ.PointerOnBuffer),IX + LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ;SECTORS PER CLUSTER + ; HL:DE / A => DE:BC, H=0, L - остаток + CALL DIV_for_SPC + PUSH HL ; остаток DIV_for_SPC + ; [x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE + PUSH BC ; младшее слово номера кластера + PUSH DE ; [x] fat32 старшее слово номера кластера + ; + EXX + LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_H) ; START CLUSTER High + LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_H+1) + LD A,L + OR H + EXX + LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) ; START CLUSTER Low + LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) + OR L + OR H + JR Z,.fast_exit_4 + CALL GetSavedCluster + ;HL': HL - известный кластер файла для отсчёта + ;DE : BC - оставшееся смещение в файле в кластерах (D=D+1, B=B+1) + ; + PUSH DE ; [x] оставшееся смещение в файле в кластерах (старшее слово) + JP .enter_loop1 + ; +.fast_exit_5: POP DE +.fast_exit_4: ; [x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE + POP DE ; [x] fat32 старшее слово номера кластера + POP BC + ; + POP BC + POP DE + AND A + RET + ; [x] fat32 +.loop1_big: PUSH BC + LD BC,0 +.loop1_small: PUSH BC + CALL READ_FROM_FAT + POP BC + JR C,.fast_exit_5 ;RY01 + EX DE,HL + EXX + EX DE,HL + EXX +.enter_loop1: INC B + DEC BC ; ВС - смещение внутри файла в кластерах (младшее слово) + DJNZ .loop1_small + POP BC ; [x] оставшееся смещение в файле в кластерах (старшее слово) + INC B + DEC BC + DJNZ .loop1_big + ;;;; + ; + ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE + POP DE + POP BC + CALL SaveGotCluster + ; + POP DE ; остаток DIV_for_SPC + POP BC ; HL:DE - FP (in sectors) + ; (SP) = (RET) + ; + LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) + SUB E + LD C,A ;\ + CP B ; \ + JR C,.skip1 ;SIZE > RESIDUE CLUSTER ; \ + LD C,B ;SIZE < CLUSTER ;->-|--> ; !TODO разобраться +.skip1: LD A,B ; / + SUB C ; / + LD B,A ;/ + PUSH HL + PUSH BC + PUSH DE + CALL NSECTOR + POP DE + ADD IX,DE + JR NC,.skip2 + INC HL +.skip2: LD DE,(READ.PointerOnBuffer) + LD A,(FatBuffer.DRIVE) + LD B,C + LD C,Dss.DRV.Read + RST ToDSS.DRV + JR C,.Error + POP BC + LD HL,(READ.PointerOnBuffer) + LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) + ;!TEST + LD A,B + LD B,C +.loop2: ADD HL,DE + ;DEC C + ;JR NZ,.loop2 + DJNZ .loop2 + LD (READ.PointerOnBuffer),HL + POP DE + ;LD A,B + OR A + RET Z + LD B,A + ; +.loop4: LD HL,CORE_BUFFERS.BootSector.SectorsPerCluster + LD A,B + SUB (HL) + LD B,A + LD C,(HL) + JR NC,.BLOKRD7 + LD B,0 + ADD A,(HL) ;0 AND CF + LD C,A + OR A ;CLEAR CF + RET Z + ; +.BLOKRD7: EX DE,HL + PUSH BC + CALL READ_FROM_FAT + POP BC + JR C,.ECL1 ;RY01 + EX DE,HL + PUSH HL + PUSH BC + CALL NSECTOR + LD DE,(READ.PointerOnBuffer) + LD A,(FatBuffer.DRIVE) + LD B,C + LD C,Dss.DRV.Read + RST ToDSS.DRV + JR C,.Error + POP BC + LD HL,(READ.PointerOnBuffer) + LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) +.loop3: ADD HL,DE + DEC C + JR NZ,.loop3 + LD (READ.PointerOnBuffer),HL + POP DE + JP .loop4 + ; +.Error: POP BC + POP DE + ;SCF + RET + ; +.ECL1: AND A + RET ;----------------------------------------------------------------------- ; BLOK_WR.Error: @@ -763,170 +744,351 @@ BLOCK_READ: ; SCF ; RET ; + + ;WRITE SECTORS OF FILE ;HL:DE - FP (in sectors), IX - data in RAM ; B - Amount sectors -BLOK_WR: - PUSH BC - LD (READ.PointerOnBuffer),IX - LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ;SECTORS PER CLUSTER - LD C,A - LD B,0 - ;HL:DE / BC => DE:IX HL-OSTATOK - CALL DIV_for_SPC - ; [ ] fat32. далее заточка на то, что в DE всегда 0 - файл не больше 2Gb - LD B,XH - LD C,XL - PUSH HL ;RESIDUE - LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) ;START CLUSTER - LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) - LD A,H - OR L - ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE - ;JR NZ,BLOKWR2 - PUSH BC - JR NZ,.GetSavedCluster - ; - PUSH BC - CALL G_CLUST - JP C,.Error - LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L),L - LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1),H - LD DE,(FatBuffer.ENDCLUS_LOW) - CALL WRITE_TO_FAT - PUSH HL - ;!TEST ;!TODO 2/12/23 [ ] баг с избыточной записью WRITE_FAT_TABLE? - ;CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск - ; - POP HL - POP BC - INC B - JP .WR2 - ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE -.GetSavedCluster: - _GetSavedCluster .WR2 - ; -.loop: PUSH BC - CALL READ_FROM_FAT - JR NC,.WRB - PUSH HL - CALL INC_FAT - POP HL - JP C,.Error - CALL READ_FROM_FAT -.WRB: POP BC - EX DE,HL - ; DEC BC -.WR2: - ; LD A,B - ; OR C - ; JR NZ,.loop - INC B - DEC BC - DJNZ .loop - - ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE - _SaveGetedCluster - ; - POP DE - POP BC - LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) - SUB E - LD C,A - CP B - JR C,.WR3 ;SIZE > RESIDUE CLUSTER - LD C,B ;SIZE < CLUSTER -.WR3: LD A,B - SUB C - LD B,A - PUSH HL - PUSH BC - PUSH DE - CALL NSECTOR - POP DE - ADD IX,DE - JR NC,.WR4 - INC HL - ; DOUBLE 1 -.WR4: LD DE,(READ.PointerOnBuffer) - LD A,(FatBuffer.DRIVE) - LD B,C - LD C,Dss.DRV.Write - RST ToDSS.DRV - JR C,.ErrorWrite - POP BC - LD HL,(READ.PointerOnBuffer) - LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) - ; -.loop2: ADD HL,DE - DEC C - JR NZ,.loop2 - ; - LD (READ.PointerOnBuffer),HL - POP DE - ; - LD A,B - OR A - RET Z - ; -.big_loop: - LD HL,CORE_BUFFERS.BootSector.SectorsPerCluster - LD A,B - SUB (HL) - LD B,A - LD C,(HL) - JR NC,.WR7 - LD B,0 - ADD A,(HL) ;0 AND CF - LD C,A - OR A ;CLEAR CF - RET Z -.WR7: EX DE,HL - PUSH BC - CALL READ_FROM_FAT - JR NC,.WR9 - PUSH HL - CALL INC_FAT - POP HL +; [ ] fat32 +BLOK_WR: PUSH BC + LD (READ.PointerOnBuffer),IX + LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ;SECTORS PER CLUSTER + ; HL:DE / A => DE:BC, H=0, L - остаток + CALL DIV_for_SPC + PUSH HL ; остаток DIV_for_SPC + ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE + PUSH BC ; младшее слово номера кластера + PUSH DE ; [x] fat32 старшее слово номера кластера + ; + EXX + LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_H) ; START CLUSTER High + LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_H+1) + LD A,L + OR H + EXX + LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) ; START CLUSTER + LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) + OR L + OR H + JR NZ,.FindCluster + ; + PUSH BC ; младшее слово номера кластера + PUSH DE ; [x] fat32 старшее слово номера кластера + ; [ ] fat32 + CALL G_CLUST + JP C,.Error_6 + ; + LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L),L + LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1),H + ; [ ] fat32 + EXX + LD HL,0 ;!FIXIT + LD (IY+_sFM.FS_REC.FIRST_CLUSTER_H),L ; START CLUSTER High + LD (IY+_sFM.FS_REC.FIRST_CLUSTER_H+1),H + EXX + ; + LD DE,(FatBuffer.ENDCLUS_LOW) + CALL WRITE_TO_FAT + ;!TEST ;!TODO 2/12/23 ; [ ] баг с избыточной записью WRITE_FAT_TABLE? + ;PUSH HL + ;CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск + ;POP HL + ; + POP DE ; младшее слово номера кластера + POP BC ; [x] fat32 старшее слово номера кластера + ; + INC B + INC D ; [x] fat32 + PUSH DE + JP .enter_loop + ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE +.FindCluster: CALL GetSavedCluster + ;HL': HL - известный кластер файла для отсчёта + ;DE : BC - оставшееся смещение в файле в кластерах (D=D+1, B=B+1) + ; + PUSH DE ; [x] оставшееся смещение в файле в кластерах (старшее слово) + JP .enter_loop + ; + ; [x] fat32 +.loop_big: PUSH BC + LD BC,0 +.loop: PUSH BC + CALL READ_FROM_FAT + JR NC,.next + ; end of chain - get new cluster + ; [ ] fat32 + PUSH HL + EXX + PUSH HL + EXX + CALL INC_FAT + EXX + POP HL + EXX + POP HL + JP C,.Error_6 + ; + CALL READ_FROM_FAT +.next: POP BC + EX DE,HL + EXX + EX DE,HL + EXX +.enter_loop: INC B + DEC BC + DJNZ .loop + POP BC ; [x] оставшееся смещение в файле в кластерах (старшее слово) + INC B + DEC BC + DJNZ .loop_big + ;;;; + ; + ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE + POP DE + POP BC + CALL SaveGotCluster + ; + POP DE + POP BC + ; (SP) = (RET) + ; + LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) + SUB E + LD C,A + CP B + JR C,.WR3 ;SIZE > RESIDUE CLUSTER + LD C,B ;SIZE < CLUSTER +.WR3: LD A,B + SUB C + LD B,A + PUSH HL + PUSH BC + PUSH DE + CALL NSECTOR + POP DE + ADD IX,DE + JR NC,.WR4 + INC HL + ; DOUBLE 1 +.WR4: LD DE,(READ.PointerOnBuffer) + LD A,(FatBuffer.DRIVE) + LD B,C + LD C,Dss.DRV.Write + RST ToDSS.DRV + JR C,.ErrorWrite + POP BC + LD HL,(READ.PointerOnBuffer) + LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) + ; +.loop2: ADD HL,DE + DEC C + JR NZ,.loop2 + ; + LD (READ.PointerOnBuffer),HL + POP DE + ; + LD A,B + OR A + RET Z + ; +.big_loop: LD HL,CORE_BUFFERS.BootSector.SectorsPerCluster + LD A,B + SUB (HL) + LD B,A + LD C,(HL) + JR NC,.WR7 + LD B,0 + ADD A,(HL) ;0 AND CF + LD C,A + OR A ;CLEAR CF + RET Z +.WR7: EX DE,HL + PUSH BC + CALL READ_FROM_FAT + JR NC,.WR9 + PUSH HL + CALL INC_FAT + POP HL JR C,.ErrorFull - CALL READ_FROM_FAT -.WR9: POP BC - EX DE,HL - PUSH HL - PUSH BC - CALL NSECTOR - ; DOUBLE 1 - LD DE,(READ.PointerOnBuffer) - LD A,(FatBuffer.DRIVE) - LD B,C - LD C,Dss.DRV.Write - RST ToDSS.DRV + CALL READ_FROM_FAT +.WR9: POP BC + EX DE,HL + PUSH HL + PUSH BC + CALL NSECTOR + ; DOUBLE 1 + LD DE,(READ.PointerOnBuffer) + LD A,(FatBuffer.DRIVE) + LD B,C + LD C,Dss.DRV.Write + RST ToDSS.DRV JR C,.ErrorWrite - POP BC - LD HL,(READ.PointerOnBuffer) - LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) -.loop3: ADD HL,DE - DEC C - JR NZ,.loop3 - LD (READ.PointerOnBuffer),HL - POP DE - ; - JP .big_loop - ; -.Error: POP BC - POP BC ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE -.ErrorWrite: - POP BC - POP DE - LD A,DSS_Error.sys.WRITE_ERROR - ;SCF - RET - ; -.ErrorFull: - POP BC - LD A,DSS_Error.sys.DISK_FULL - ;SCF - RET + POP BC + LD HL,(READ.PointerOnBuffer) + LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) +.loop3: ADD HL,DE + DEC C + JR NZ,.loop3 + LD (READ.PointerOnBuffer),HL + POP DE + ; + JP .big_loop + ; +.Error_6: POP BC + POP BC +.Error_4: POP BC + POP BC ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE +.ErrorWrite: POP BC + POP DE + LD A,DSS_Error.sys.WRITE_ERROR + ;SCF + RET + ; +.ErrorFull: POP BC + LD A,DSS_Error.sys.DISK_FULL + ;SCF + RET + +/* +;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE +; Вход: HL - первый кластер файла (младшее слово) +; BC - смещение в файле в кластерах (младшее слово) +; Выход: HL - известный кластер файла для отсчёта (младшее слово) +; BC - оставшееся смещение в файле в кластерах (младшее слово) +GetSavedCluster: + INC B + ;PUSH DE ; первый кластер файла (старшее слово) + LD E,(IY+_sFM.KnownCluster_L) + LD D,(IY+_sFM.KnownCluster_L+1) + LD A,E + OR D + RET Z + ; + DEC B + PUSH DE ; KnownCluster_H + PUSH HL ; первый кластер файла (младшее слово) + PUSH BC ; смещение в файле в кластерах + LD E,(IY+_sFM.KnownOffset_L) + LD D,(IY+_sFM.KnownOffset_L+1) + LD A,D + OR E + JR Z,.noOptimization_3 + ; + POP HL ; смещение в файле в кластерах + SBC HL,DE + JR C,.noOptimization_2 + LD C,L + LD B,H + POP DE ; баланс стека + POP HL + ; оптимизация: HL - не первый кластер файла, а KnownCluster + ; BC - расстояние до требуемого смещения от KnownCluster + ; + INC B + RET + ; +.noOptimization_3: + POP BC +.noOptimization_2: + POP HL +.noOptimization_1: + POP DE + INC B + RET +*/ + +;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE +; Вход: DE - смещение в файле в кластерах (старшее слово) +; BC - смещение в файле в кластерах (младшее слово) +; HL - первый кластер файла (младшее слово) +; HL' - первый кластер файла (старшее слово) +; Выход: HL - известный кластер файла для отсчёта (младшее слово) +; HL' - известный кластер файла для отсчёта (старшее слово) +; DE - оставшееся смещение в файле в кластерах (старшее слово, D=D+1) +; BC - оставшееся смещение в файле в кластерах (младшее слово, B=B+1) +; не портит HL, HL' и DE:BC если оптимизация не сработала +GetSavedCluster: + XOR A + CP (IY+_sFM.OptimizedClusters) + JR Z,.noOptimization_0 + ; + PUSH DE + PUSH HL ; первый кластер файла (младшее слово) + ; смещение в файле в кластерах + EX DE,HL + LD E,(IY+_sFM.KnownOffset_H) + LD D,(IY+_sFM.KnownOffset_H+1) + ; проверка старшего слова + AND A + SBC HL,DE + JR C,.noOptimization_2 + ; + PUSH BC + EX DE,HL + LD H,B + LD L,C + LD C,(IY+_sFM.KnownOffset_L) + LD B,(IY+_sFM.KnownOffset_L+1) + ; проверка младшего слова + SBC HL,BC + LD BC,0 + EX DE,HL + SBC HL,BC + JR C,.noOptimization_3 + EX DE,HL + LD B,H + LD C,L + ; DE:BC новое смещение от известного кластера файла (в кластерах) + ; + LD L,(IY+_sFM.KnownCluster_L) + LD H,(IY+_sFM.KnownCluster_L+1) + EXX + LD L,(IY+_sFM.KnownCluster_H) + LD H,(IY+_sFM.KnownCluster_H+1) + EXX + ; баланс стека + POP AF + POP AF + POP AF + ; для цикла DJNZ + INC B + INC D + RET + ; +.noOptimization_3: + POP BC +.noOptimization_2: + POP HL +.noOptimization_1: + POP DE +.noOptimization_0: + INC B + INC D + RET + +;[x] fat32 +;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE +SaveGotCluster: LD A,C + OR B + OR E + OR D + RET Z + ; + LD (IY+_sFM.KnownOffset_L),C + LD (IY+_sFM.KnownOffset_L+1),B + LD (IY+_sFM.KnownOffset_H),E + LD (IY+_sFM.KnownOffset_H+1),D + ; + LD (IY+_sFM.KnownCluster_L),L + LD (IY+_sFM.KnownCluster_L+1),H + EXX + LD (IY+_sFM.KnownCluster_H),L + LD (IY+_sFM.KnownCluster_H+1),H + EXX + ; + LD A,1 + LD (IY+_sFM.OptimizedClusters),A + RET //////////////////////////////////////////////////////////////////////// diff --git a/DSS/Procedures.asm b/DSS/Procedures.asm index e12fa42..2225fac 100644 --- a/DSS/Procedures.asm +++ b/DSS/Procedures.asm @@ -320,148 +320,29 @@ BC_Div_DE: ;----------------------------------------------------------------------; ; - -; HL:DE / C => DE:IX HL-OSTATOK (DE:BC.HL). Легко переделать под HL:DE / A => HL:DE.A ;----------------------------------------------------------------------; +; HL:DE / A => DE:BC, H=0, L - остаток DIV_for_SPC: - LD A,C + LD C,A DEC A JR Z,.exit -; + ; AND E LD B,A ; остаток LD A,C RRCA -; -.loop: SRL H : RR L - RR D : RR E + ; +.loop: SRL H + RR L + RR D + RR E RRCA JP NC,.loop LD A,B -; -.exit: LD XH,D - LD XL,E +.exit: LD B,D + LD C,E EX DE,HL LD H,0 LD L,A RET -;----------------------------------------------------------------------; - -; DIV32: LD A,#FF -; LD B,E -; .loop: SRL C -; JR C,.exitLoop -; SRL H : RR L : RR D : RR E : SLA A -; JP .loop -; .exitLoop: -; CPL -; AND B -; LD XH,D -; LD XL,E -; EX DE,HL -; LD H,0 -; LD L,A -; RET - -; DEFINE NEW_DIV 1 - -; DIV32: LD XH,D -; LD XL,E - -; IFN NEW_DIV -; EX DE,HL -; LD HL,0 -; LD A,#20 -; DIV001: ADD IX,IX -; EX DE,HL -; ADC HL,HL -; EX DE,HL -; ADC HL,HL -; SBC HL,BC -; JR NC,DIV002 -; ADD HL,BC -; DEC A -; JR NZ,DIV001 -; RET -; DIV002: INC IX -; DEC A -; JR NZ,DIV001 -; RET -; ELSE - - -; div32_16: -; ;HLIX/BC -> HLIX remainder DE -; ;174+4*div32_16_sub8 -; ;min: 2186cc -; ;max: 2794cc -; ;avg: 2466cc -; ;61 bytes -; ex de,hl ; 4 - -; ; Negate BC to allow add instead of sbc -; xor a ; 4 -; ; Need to set HL to 0 anyways, so save 2cc and a byte -; ld h,a ; 4 -; ld l,a ; 4 -; sub c ; 4 -; ld c,a ; 4 -; sbc a,a ; 4 -; sub b ; 4 -; ld b,a ; 4 - - -; ld a,d ; 4 -; call div32_16_sub8 ; 17 -; rla ; 4 -; ld d,a ; 4 - -; ld a,e ; 4 -; call div32_16_sub8 ; 17 -; rla ; 4 -; ld e,a ; 4 - -; ld a,ixh ; 8 -; call div32_16_sub8 ; 17 -; rla ; 4 -; ld ixh,a ; 8 - -; ld a,ixl ; 8 -; call div32_16_sub8 ; 17 -; rla ; 4 -; ld ixl,a ; 8 - -; ;ex de,hl ; 4 -; ret ; 10 - -; div32_16_sub8: -; ;119+8*div32_16_sub -; ;min: 503cc -; ;max: 655cc -; ;avg: 573cc -; call 1F -; 1: -; ;17+2(17+2(div32_16_sub))) -; call 1F -; 1: -; ;17+2(div32_16_sub) -; call div32_16_sub -; div32_16_sub: -; ;48+{8,0+{0,19}} -; ;min: 48cc -; ;max: 67cc -; ;avg: 56.75cc -; rla ; 4 -; adc hl,hl ; 15 -; jr c,1F ;12/7 -; add hl,bc ; 11 -; ret c ;11/5 -; sbc hl,bc ; 15 -; ret ; 10 -; 1: -; add hl,bc ; 11 -; scf ; 4 -; ret ; 10 - -; ENDIF -; \ No newline at end of file +;----------------------------------------------------------------------; \ No newline at end of file diff --git a/DSS/Structures.inc b/DSS/Structures.inc index 403ee1d..3934e8c 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -45,12 +45,12 @@ .DRIVE: BYTE #00 ;+ #28 +40 DRIVE OR CURRENT .ACCESS_MODE: BYTE #00 ;+ #29 +41 ACCESS MODE признак изменения файла .TASK_NUM: BYTE #00 ;+ #2A +42 TASK -;.EMPTY: BYTE #00 ;+ #2B +43 EMPTY -.KnownCluster_L: WORD #0000 ;+ #2B +43 Младшее слово номера кластера для которого известно относительное смещение внутри файла -.KnownCluster_H: WORD #0000 ;+ #2C +44 Старшее слово номера кластера для которого известно относительное смещение внутри файла -.KnownOffset_L: WORD #0000 ;+ #2D +45 Младшее слово смещения (в кластерах) относительно начала файла для сохраненного номера кластера. -.KnownOffset_H: WORD #0000 ;+ #2E +46 Старшее слово смещения (в кластерах) относительно начала файла для сохраненного номера кластера. - ENDS +.OptimizedClusters BYTE #00 ;+ #2B +43 +.KnownCluster_L: WORD #0000 ;+ #2C +44 Младшее слово номера кластера для которого известно относительное смещение внутри файла +.KnownCluster_H: WORD #0000 ;+ #2E +46 Старшее слово номера кластера для которого известно относительное смещение внутри файла +.KnownOffset_L: WORD #0000 ;+ #30 +48 Младшее слово смещения (в кластерах) относительно начала файла для сохраненного номера кластера. +.KnownOffset_H: WORD #0000 ;+ #32 +50 Старшее слово смещения (в кластерах) относительно начала файла для сохраненного номера кластера. + ENDS ; ; diff --git a/Shared_Includes b/Shared_Includes index 42dfec0..68681fb 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 42dfec072030351eb386205ead32983bbc1c4909 +Subproject commit 68681fbc50da463f1debae860e6db64603886d39