From b515b2429fe719e61a343d5236306a9114c6a57e Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Mon, 1 Apr 2024 02:49:38 +1000 Subject: [PATCH] FAT_X done --- DSS/API/Close.asm | 2 +- DSS/API/Find.asm | 26 +-- DSS/API/Open.asm | 4 +- DSS/API/Write.asm | 6 +- DSS/DOS_Proc.asm | 4 +- DSS/FS/FAT/FAT.asm | 23 +- DSS/FS/FAT/FAT_X.asm | 520 +++++++++++++++---------------------------- DSS/build.txt | 2 +- 8 files changed, 214 insertions(+), 373 deletions(-) diff --git a/DSS/API/Close.asm b/DSS/API/Close.asm index fe945ee..38843d0 100644 --- a/DSS/API/Close.asm +++ b/DSS/API/Close.asm @@ -40,7 +40,7 @@ CLOSE_FN: ; SET_PAGE_X DIRPAGE ; - ;TEST 9/11/23 + ;!TEST 9/11/23 record index ; LD HL,DIR ; LD DE,#0020 ; LD C,(IY+_sFM.HANDLE) diff --git a/DSS/API/Find.asm b/DSS/API/Find.asm index e6875b5..1c2c86b 100644 --- a/DSS/API/Find.asm +++ b/DSS/API/Find.asm @@ -3,26 +3,17 @@ ; C - #19 ; HL - указатель на файловую спецификацию ; DE - рабочий буфер 44 байта, если B=0, иначе 256 байт -; ;!!!!! на самом деле пока что если B=1, рабочий буфер 46 байт ; A - атрибуты, используемые при поиске -; B = 0 - имя найденного файла в формате 11 байт "FilenameExt" -; B = 1 - имя найденного файла в формате DOS "filename.ext",0 +; B = #00 - имя найденного файла в формате 11 байт "FilenameExt" +; B = #01 - имя найденного файла в формате DOS "filename.ext",0 +; поиск без ограничение на размер каталога: +; !TODO B = #02 - имя найденного файла в формате DOS + LFN +; !TODO B = #80 - имя найденного файла в формате 11 байт "FilenameExt" +; !TODO B = #81 - имя найденного файла в формате DOS "filename.ext",0 ;Выходные значения: ; A - код ошибки, если CF=1 //////////////////////////////////////////////////////////////////////// F_FIRST: - ; Current Dir [x] 15/10/23 - ; LD C,A - ; PUSH HL - ; PUSH DE - ; PUSH BC - ; CALL DIR_PATH_CHECK - ; POP BC - ; POP DE - ; POP HL - ; RET C - ; LD A,C - ; ; LD (.TMP),A LD (.DTABUF),DE LD A,B @@ -50,7 +41,8 @@ F_FIRST: LD (DE),A .FIND_S: INC DE - LD BC,#0020 + ;!TODO лучше тут использовать как в record index для перебора каталога > #4000 bytes + LD BC,#0020 ;!HARDCODE размер одной записи каталога ADD IX,BC LD (F_NEXT.CURHND),IX LD HL,HANDBUF+12 ;!HARDCODE @@ -112,7 +104,7 @@ F_NEXT: EX AF,AF' CPL LD C,A - ;TEST 9/11/23 + ;!TEST 9/11/23 record index ; EXX ; LD DE,0 ; EXX diff --git a/DSS/API/Open.asm b/DSS/API/Open.asm index 645f568..e69b6df 100644 --- a/DSS/API/Open.asm +++ b/DSS/API/Open.asm @@ -26,14 +26,14 @@ OPEN_FN:;!TEST Current Dir ;[x] 15/10/23 RET C .FILE: CALL SEARCH.File ; enter point from EXEC, CREATE RET C - ;!TEST указатель на запись в каталоге FS + ;!TEST 9/11/23 record index PUSH DE ; сохраняем указатель на запись в каталоге FS (получен из SEARCH) ;R002 ; .FM: CALL GET_FM ; enter point from ATTRIB RET C LD A,C EX AF,AF' - ;!TEST указатель на запись в каталоге FS + ;!TEST 9/11/23 record index указатель на запись в каталоге FS POP DE ; EXX LD (IY+_sFM.HANDLE),E diff --git a/DSS/API/Write.asm b/DSS/API/Write.asm index 163072e..fcc9d91 100644 --- a/DSS/API/Write.asm +++ b/DSS/API/Write.asm @@ -64,7 +64,7 @@ WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] PUSH BC .R_POINT+2: LD IX,0 - CALL BLOK_WR + CALL BLOK_WRITE POP BC JR C,.ERR3 LD C,B @@ -114,7 +114,7 @@ WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] PUSH AF IN A,(SLOT0) OUT (SLOT3),A - CALL BLOK_WR + CALL BLOK_WRITE POP BC LD C,SLOT3 OUT (C),B @@ -192,7 +192,7 @@ WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] PUSH AF IN A,(SLOT0) OUT (SLOT3),A - CALL BLOK_WR + CALL BLOK_WRITE POP BC LD C,SLOT3 OUT (C),B diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index f89fab1..86b816f 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -276,8 +276,8 @@ OPENDIR:;[x] some optimizations .REROOT1: LD DE,0 ;[x] some optimizations - ;LD (IY+_sFM.FIRST_CLUSTER_L),E - ;LD (IY+_sFM.FIRST_CLUSTER_L+1),D + ; LD (IY+_sFM.FIRST_CLUSTER_L),E + ; LD (IY+_sFM.FIRST_CLUSTER_L+1),D ; [ ] fat32 EX DE,HL LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 138799a..e3c9e92 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -18,7 +18,7 @@ SEARCH: .Dir: ;LD A,FAT_ATTR.DIRECTORY LD A,FAT_ATTR.HiddenSysDir - CALL SEARCH.Custom + CALL .Custom RET NC CP DSS_Error.sys.PATH_NOT_FOUND + 1 RET C @@ -36,7 +36,9 @@ SEARCH: CPL LD C,A LD IX,DIRPAGE.buffer - ;[x] 9/11/23 оптимизация для индекса записи в списке каталога (возможно понадобится вернуть) + ;!TEST 9/11/23 record index + ; оптимизация для индекса записи в списке каталога. + ; Понадобится вернуть для перебора каталога > #4000 байт ; EXX ; LD DE,0 ; EXX @@ -67,18 +69,17 @@ SEARCH: ; LD D,XH LD E,XL - ;[x] 9/11/23 оптимизация для индекса записи в списке каталога (возможно понадобится вернуть) - EXX - ; LD D,XH - ; LD E,XL + ;!TEST 9/11/23 record index + ; EXX + ; PUSH DE + ; EXX PUSH IX - EXX ; LD HL,HANDBUF EX DE,HL LD BC,HANDBUF.SIZE LDIR - ;[x] 9/11/23 оптимизация для индекса записи в списке каталога (возможно понадобится удалить) + ;!TEST 9/11/23 record index POP DE ; EX AF,AF' @@ -87,7 +88,7 @@ SEARCH: AND A RET .next_record: - ;[x] 9/11/23 оптимизация для индекса записи в списке каталога (возможно понадобится вернуть) + ;!TEST 9/11/23 record index ; EXX ; INC DE ; EXX @@ -96,7 +97,6 @@ SEARCH: ADD IX,DE JR NC,.loop .error_too_many_files: - ;POP AF EX AF,AF' OUT (SLOT3),A LD A,DSS_Error.sys.TOO_MANY_FILES_IN_DIR @@ -104,7 +104,6 @@ SEARCH: RET ; .error_file_not_found: - ;POP AF EX AF,AF' OUT (SLOT3),A LD A,DSS_Error.sys.FILE_NOT_FOUND @@ -383,7 +382,7 @@ WRT_HND: SET_PAGE_X DIRPAGE ; ;LD IX,DIRPAGE.buffer LD HL,DIRPAGE.buffer - ;TEST 9/11/23 + ;!TEST 9/11/23 record index ; EXX ; LD DE,0 ; EXX diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index b4f8a44..e0665fb 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -; FAT 12-16 +; FAT 12-16-32 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ;[BEGIN] @@ -13,8 +13,8 @@ ;RX01 10-02-1999 DNS UPGRADE FAT CASH ;--------------------------------------------------------------- +; [x] fat32 ;!TEST ; Установить начальный кластер для чтения -; [x] fat32 ;!TEST R_CLUST: LD HL,#0001 LD (G_CLUST.low),HL DEC L @@ -22,6 +22,7 @@ R_CLUST: LD HL,#0001 RET +; ; [x] fat32 ;!TEST ; найти первый свободный кластер ;!TODO проверить перебор кластеров ; выход: HL - младший номер свободного кластера @@ -56,11 +57,12 @@ G_CLUST: ; EXX RET +; +; [x] fat32 ;!TEST ; Прикрепить к последнему кластеру цепочки новый пустой кластер ; Вход: HL':HL - номер кластера к которому прикрепить пустой ; Выход: HL':HL - номер кластера к которому прикрепился пустой ; DE':DE - номер пустого кластера -; [x] fat32 ;!TEST INC_FAT: PUSH HL ; текущий кластер EXX @@ -107,9 +109,9 @@ INC_FAT: ;RX01 -; вход: de = младшее слово номера кластера для сравнения с FAT_Max_Cluster -; de' = старшее слово номера кластера для сравнения с FAT_Max_Cluster (только для fat32) ; [x] fat32 ;!TEST +; вход: hl = младшее слово номера кластера для сравнения с FAT_Max_Cluster +; hl' = старшее слово номера кластера для сравнения с FAT_Max_Cluster (только для fat32) CHECK_CLUSTER_IS_SMALLER: LD A,(FatBuffer.FAT_TYPE) XOR FAT_TYPE.x32 @@ -133,20 +135,21 @@ CHECK_CLUSTER_IS_SMALLER: EX DE,HL LD A,DSS_Error.sys.DISK_FULL RET - ; +; +; +;[x] fat32 ;!TEST ;------------------------------------------------------------------------------------------------ ; Прочитать из кеша FAT-а номер след. кластера ; вход: hl - номер кластера (младшее слово) -; hl' - номера кластера (старшее слово. только для FAT32) +; hl' - номер кластера (старшее слово. только для FAT32) ; выход: hl - номер кластера (младшее слово) -; hl' - номера кластера (старшее слово) +; hl' - номер кластера (старшее слово) ; de - номер след. кластера (младшее слово) ; de' - номер след. кластера (старшее слово) ; если DE':DE = 0, то кластер HL':HL свободен ; CF - конец цепочки ;------------------------------------------------------------------------------------------------ -;[x] fat32 ;!TEST READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER RET C ; @@ -172,6 +175,7 @@ READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER ; проверка на служ. кластеры SBC HL,DE POP HL + ;!FIXIT fat32 перестраховка EXX LD H,A LD L,A @@ -180,6 +184,7 @@ READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER EXX RET ; + ; .FAT12: CALL GET_FAT12_CELL LD E,(HL) INC HL @@ -236,17 +241,20 @@ READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER LD A,B OUT (SLOT3),A RET + +; +; [x] fat32 ;!TEST ;------------------------------------------------------------------------------------------------ ; Записать в кеш FAT-а номер кластера ; вход: hl = младшее слово номера кластера в который записать ; hl' = старшее слово номера кластера в который записать (только для fat32) +; .Custom: ; de = младшее слово номера кластера которое вписать ; de' = старшее слово номера кластера которое вписать (только для fat32) ; выход: HL':HL такие же как и на входе -; .Custom: +; .Custom: ; HL':HL и DE':DE такие же как и на входе ;------------------------------------------------------------------------------------------------ -; [x] fat32 ;!TEST WRITE_TO_FAT: LD DE,(FatBuffer.ENDCLUS_LOW) ; номер кластера EXX LD DE,(FatBuffer.ENDCLUS_HIGH) ; номер кластера @@ -324,12 +332,12 @@ WRITE_TO_FAT: LD DE,(FatBuffer.ENDCLUS_LOW) ; ; .FAT32: ; [x] fat32 ;!TEST EXX - PUSH DE ; старший номер кластера который вписать - PUSH HL ; старшее слово номера кластера в который записать + PUSH DE ; старший номер кластера который вписать + PUSH HL ; старшее слово номера кластера в который записать EXX CALL GET_FAT32_CELL EXX - POP HL ; старшее слово номера кластера в который записать + POP HL ; старшее слово номера кластера в который записать EXX POP DE ; старший номер кластера который вписать POP BC ; младший номер кластера который вписать @@ -346,11 +354,11 @@ WRITE_TO_FAT: LD DE,(FatBuffer.ENDCLUS_LOW) ; +; [x] fat32 ;!TEST ;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT ; in: HL - Cache block ; out: C:HL - logical number ; B = 0 -; [x] fat32 ;!TEST GET_SECTOR_OF_FAT: LD A,(FatBuffer.FAT_TYPE) LD B,FAT_CACHE.Degree_32 ;!FIXIT сделать через переменную @@ -385,10 +393,10 @@ GET_SECTOR_OF_FAT: ;;;;;;;;; +; [x] fat32 ;!TEST ;RE_FAT: ;RX01 ; Прочитать в кеш ХХ секторов FAT-а -; [x] fat32 ;!TEST ; DE - NEW FAT BLOCK READ_FAT_TABLE: PUSH HL PUSH DE @@ -425,8 +433,8 @@ READ_FAT_TABLE: PUSH HL RET -; Подключить банку кеша FAT и записать его на диск ; [x] fat32 ;!TEST +; Подключить банку кеша FAT и записать его на диск WRITE_FAT_TABLE: SET_PAGE_X FATPAGE PUSH AF @@ -543,10 +551,10 @@ WRITE_FAT_TABLE: JP ToDSS.DRV ;----------------------------------------------------------------------- -;вход: HL':HL - номер кластера -;выход: HL - адрес нужной ячейки в странице FATPAGE ; ;[x] fat32 ;!TEST +;вход: HL':HL - номер кластера +;выход: HL - адрес нужной ячейки в странице FATPAGE GET_FAT32_CELL: ; двигаем влево HL':H LD A,H @@ -572,7 +580,7 @@ GET_FAT32_CELL: LD H,A ADD HL,HL ADD HL,HL - PUSH HL ; [ ] fat32 сохраняем на случай, если READ_FAT_TABLE испортит + PUSH HL ; [ч] fat32 сохраняем на случай, если READ_FAT_TABLE испортит AND A ; EXX @@ -663,10 +671,10 @@ GET_FAT12_CELL: +;[x] fat32 ;!TEST ;NSECTOR: ; in: HL':HL - CLUSTER ; out: HL:IX - SECTOR -;[x] fat32 ;!TEST CLUSTER_TO_SECTOR: EXX PUSH HL @@ -705,17 +713,16 @@ CLUSTER_TO_SECTOR: //////////////////////////////////////////////////////////////////////// - -; 225 937 408 / 512 = 0x6BBC4 / 4 = 0x1AEF1 -; -;READ SECTORS OF FILE -;HL:DE - FP (in sectors) -; B - Amount sectors -; IX - buffer in RAM -; [ ] fat32 -BLOCK_READ: PUSH BC - LD (READ.PointerOnBuffer),IX +; [x] fat32 ;!TEST +; READ SECTORS OF FILE +; вход: HL:DE - FP (in sectors) +; IY - FM +; IX - buffer in RAM +; B - количество секторов для чтения +BLOCK_READ: LD (READ.PointerOnBuffer),IX LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ;SECTORS PER CLUSTER + LD C,A + PUSH BC ; B - количество секторов для чтения, C - SectorsPerCluster ; HL:DE / A => DE:BC, H=0, L - остаток CALL DIV_for_SPC PUSH HL ; остаток DIV_for_SPC @@ -723,16 +730,17 @@ BLOCK_READ: PUSH BC 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 + ; 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 + CALL CHECK_FIRST_CLUSTER JR Z,.fast_exit_4 CALL GetSavedCluster ;HL': HL - известный кластер файла для отсчёта @@ -759,7 +767,7 @@ BLOCK_READ: PUSH BC JR C,.fast_exit_5 ;RY01 EX DE,HL EXX - EX DE,HL + EX DE,HL EXX .enter_loop1: INC B DEC BC ; ВС - смещение внутри файла в кластерах (младшее слово) @@ -771,28 +779,32 @@ BLOCK_READ: PUSH BC ;;;; ; ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE - POP DE - POP BC ; B - Amount sectors + POP DE ; [x] fat32 старшее слово номера кластера + POP BC ; младшее слово номера кластера CALL SaveGotCluster ; POP DE ; D = 0, E = остаток DIV_for_SPC - POP BC ; B = Amount sectors + POP BC ; B - количество секторов для чтения, C - SectorsPerCluster ; (SP) = (RET) ; работа с остатком от деления - LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) + LD A,C SUB E LD C,A - CP B - JR C,.skip1 ;SIZE > RESIDUE CLUSTER - LD C,B ;SIZE < CLUSTER + CP B ; (SectorsPerCluster - остаток) - количество секторов для чтения + JR C,.skip1 ; SIZE > RESIDUE CLUSTER + LD C,B ; SIZE < CLUSTER .skip1: LD A,B SUB C LD B,A - PUSH HL ; номер кластера младшая часть - PUSH BC - PUSH DE + ; + EXX + PUSH HL ; номер кластера старшая часть + EXX + PUSH HL ; номер кластера младшая часть + PUSH BC ; B = количество секторов на дочитку, C = (SectorsPerCluster - остаток) либо количество секторов для чтения + PUSH DE ; D = 0, E = остаток DIV_for_SPC CALL CLUSTER_TO_SECTOR - POP DE + POP DE ; D = 0, E = остаток DIV_for_SPC ADD IX,DE JR NC,.skip2 INC HL @@ -801,24 +813,25 @@ BLOCK_READ: PUSH BC LD B,C LD C,Dss.DRV.Read RST ToDSS.DRV + ; JR C,.Error - ; [ ] fat32 ??? - POP BC + POP BC ; B = количество секторов на дочитку, C = (SectorsPerCluster - остаток) либо количество секторов для чтения 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 + LD A,B + LD B,C +.loop2: ADD HL,DE + DJNZ .loop2 + ; + LD (READ.PointerOnBuffer),HL + POP DE ; номер кластера младшая часть + EXX + POP HL ; номер кластера старшая часть + EXX + OR A + RET Z ; количество секторов на дочитку = 0? + LD B,A ; .loop4: LD HL,CORE_BUFFERS.BootSector.SectorsPerCluster LD A,B @@ -834,11 +847,17 @@ BLOCK_READ: PUSH BC ; .BLOKRD7: EX DE,HL PUSH BC + ; HL':HL - номер кластера CALL READ_FROM_FAT POP BC JR C,.ECL1 ;RY01 + ; + EXX + EX DE,HL + PUSH HL ; номер след. кластера (старшее слово) + EXX EX DE,HL - PUSH HL + PUSH HL ; номер след. кластера (младшее слово) PUSH BC CALL CLUSTER_TO_SECTOR LD DE,(READ.PointerOnBuffer) @@ -847,6 +866,7 @@ BLOCK_READ: PUSH BC LD C,Dss.DRV.Read RST ToDSS.DRV JR C,.Error + ; POP BC LD HL,(READ.PointerOnBuffer) LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) @@ -854,11 +874,15 @@ BLOCK_READ: PUSH BC DEC C JR NZ,.loop3 LD (READ.PointerOnBuffer),HL - POP DE + POP DE ; номер след. кластера (младшее слово) + EXX + POP HL ; номер след. кластера (старшее слово) + EXX JP .loop4 ; .Error: POP BC POP DE + POP HL ;SCF RET ; @@ -866,34 +890,12 @@ BLOCK_READ: PUSH BC RET ;----------------------------------------------------------------------- -; BLOK_WR.Error: -; POP BC -; ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE -; POP BC - ; -; BLOK_WR.ErrorWrite: -; POP BC -; POP DE -; LD A,DSS_Error.sys.WRITE_ERROR -; SCF -; RET - ; - -;WRITE SECTORS OF FILE -;HL:DE - FP (in sectors), IX - data in RAM -; B - Amount sectors -; [ ] 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 старшее слово номера кластера - ; +; [x] fat32 +; вход: IY - FM +; выход: HL':HL - first cluster +; ZF = 0 если первого кластера нет +CHECK_FIRST_CLUSTER: EXX LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_H) ; START CLUSTER High LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_H+1) @@ -904,19 +906,48 @@ BLOK_WR: PUSH BC LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) OR L OR H + RET + +; [x] fat32 ;!TEST +; WRITE SECTORS OF FILE +; вход: HL:DE - FP (in sectors) +; IX - data in RAM +; IY - FM +; B - количество секторов для записи +BLOK_WRITE: LD (READ.PointerOnBuffer),IX + LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ;SECTORS PER CLUSTER + LD C,A + PUSH BC ; B - количество секторов для чтения, C - SectorsPerCluster + ; 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 + CALL CHECK_FIRST_CLUSTER JR NZ,.FindCluster ; PUSH BC ; младшее слово номера кластера PUSH DE ; [x] fat32 старшее слово номера кластера - ; [ ] fat32 + ; [x] 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 + ; [x] 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 @@ -949,23 +980,15 @@ BLOK_WR: 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 + ; [x] избыточное обращение 01/04/2024 + ;CALL READ_FROM_FAT ; - CALL READ_FROM_FAT .next: POP BC EX DE,HL EXX - EX DE,HL + EX DE,HL EXX .enter_loop: INC B DEC BC @@ -981,49 +1004,58 @@ BLOK_WR: PUSH BC POP BC CALL SaveGotCluster ; - POP DE - POP BC + POP DE ; D = 0, E = остаток DIV_for_SPC + POP BC ; B - количество секторов для чтения, C - SectorsPerCluster ; (SP) = (RET) ; - LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) + LD A,C SUB E LD C,A - CP B - JR C,.WR3 ;SIZE > RESIDUE CLUSTER + CP B ; (SectorsPerCluster - остаток) - количество секторов для чтения + JR C,.skip1 ;SIZE > RESIDUE CLUSTER LD C,B ;SIZE < CLUSTER -.WR3: LD A,B +.skip1: LD A,B SUB C LD B,A - PUSH HL - PUSH BC - PUSH DE + ; + EXX + PUSH HL ; номер кластера старшая часть + EXX + PUSH HL ; номер кластера младшая часть + PUSH BC ; B = количество секторов на дочитку, C = (SectorsPerCluster - остаток) либо количество секторов для чтения + PUSH DE ; D = 0, E = остаток DIV_for_SPC CALL CLUSTER_TO_SECTOR - POP DE + POP DE ; D = 0, E = остаток DIV_for_SPC ADD IX,DE - JR NC,.WR4 + JR NC,.skip2 INC HL ; DOUBLE 1 -.WR4: LD DE,(READ.PointerOnBuffer) +.skip2: LD DE,(READ.PointerOnBuffer) LD A,(FatBuffer.DRIVE) LD B,C LD C,Dss.DRV.Write RST ToDSS.DRV - LD A,DSS_Error.sys.WRITE_ERROR - JR C,.ErrorWrite + ; + LD A,DSS_Error.sys.WRITE_ERROR + JR C,.Error_3 POP BC LD HL,(READ.PointerOnBuffer) LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) ; + LD A,B + LD B,C .loop2: ADD HL,DE - DEC C - JR NZ,.loop2 + DJNZ .loop2 ; LD (READ.PointerOnBuffer),HL - POP DE + POP DE ; номер кластера младшая часть + EXX + POP HL ; номер кластера старшая часть + EXX ; - LD A,B OR A - RET Z + RET Z ; количество секторов на дочитку = 0? + LD B,A ; .big_loop: LD HL,CORE_BUFFERS.BootSector.SectorsPerCluster LD A,B @@ -1036,18 +1068,24 @@ BLOK_WR: PUSH BC LD C,A OR A ;CLEAR CF RET Z + ; .WR7: EX DE,HL PUSH BC + ; HL':HL - номер кластера CALL READ_FROM_FAT JR NC,.WR9 - ;PUSH HL CALL INC_FAT - ;POP HL - JR C,.ErrorFull - ;CALL READ_FROM_FAT + JR C,.ErrorFull + ; [x] избыточное обращение 01/04/2024 + ;CALL READ_FROM_FAT + ; .WR9: POP BC + EXX + EX DE,HL + PUSH HL ; номер след. кластера (старшее слово) + EXX EX DE,HL - PUSH HL + PUSH HL ; номер след. кластера (младшее слово) PUSH BC CALL CLUSTER_TO_SECTOR ; DOUBLE 1 @@ -1056,8 +1094,8 @@ BLOK_WR: PUSH BC LD B,C LD C,Dss.DRV.Write RST ToDSS.DRV - LD A,DSS_Error.sys.WRITE_ERROR - JR C,.ErrorWrite + LD A,DSS_Error.sys.WRITE_ERROR + JR C,.Error_3 POP BC LD HL,(READ.PointerOnBuffer) LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) @@ -1065,15 +1103,17 @@ BLOK_WR: PUSH BC DEC C JR NZ,.loop3 LD (READ.PointerOnBuffer),HL - POP DE - ; + POP DE ; номер след. кластера (младшее слово) + EXX + POP HL ; номер след. кластера (старшее слово) + EXX JP .big_loop ; .Error_6: POP BC POP BC POP BC - POP BC ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE -.ErrorWrite: POP BC +.Error_3: POP BC ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE + POP BC POP DE ;LD A,DSS_Error.sys.WRITE_ERROR ;SCF @@ -1084,54 +1124,8 @@ BLOK_WR: PUSH BC ;SCF RET - -; ;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] fat32 ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE ; Вход: DE - смещение в файле в кластерах (старшее слово) ; BC - смещение в файле в кластерах (младшее слово) @@ -1142,7 +1136,6 @@ BLOK_WR: PUSH BC ; DE - оставшееся смещение в файле в кластерах (старшее слово, D=D+1) ; BC - оставшееся смещение в файле в кластерах (младшее слово, B=B+1) ; не портит HL, HL' и DE:BC если оптимизация не сработала -;[ ] fat32 GetSavedCluster: XOR A CP (IY+_sFM.OptimizedClusters) @@ -1157,7 +1150,7 @@ GetSavedCluster: ; проверка старшего слова AND A SBC HL,DE - JR C,.noOptimization_2 + JR C,.noOptimization_2 ; PUSH BC EX DE,HL @@ -1170,7 +1163,7 @@ GetSavedCluster: LD BC,0 EX DE,HL SBC HL,BC - JR C,.noOptimization_3 + JR C,.noOptimization_3 EX DE,HL LD B,H LD C,L @@ -1239,148 +1232,5 @@ SaveGotCluster: LD A,C ;LD (FatBuffer.MaxClusterLow),HL ;======================================================================= - -;FatCache: -;.Block WORD #0000 -;.Update BYTE 0 -;FAT_Max_Cluster_L: WORD #0FF0 ; макс. число кластеров (без служ.) -;FAT_Max_Cluster_H: WORD #0000 ; макс. число кластеров (без служ.) - ;//MODULE: FAT_X -;[END] - - -;RX01 - ;; HL - CLUSTER - ;; DE - (CLUSTER) - ; - ;READ_FROM_FAT EX DE,HL - ; LD HL,(FAT_Max_Cluster) - ; AND A - ; SBC HL,DE - ; EX DE,HL - ; LD A,10 - ; RET C - ; PUSH HL - ; LD A,(FAT_TYP) - ; CP "2" - ; JP Z,R_F_F12 - ;R_F_F16 LD DE,768 ; DE - CLUSTERS IN CASH - ; XOR A - ;R_F_00H INC A ; HL - CLUSTER - ; SBC HL,DE - ; JP NC,R_F_00H - ; ADD HL,DE - ; ADD HL,HL ; HL - FAT OFFSET (FROM CASH) - ; DEC A - ; LD BC,(FatCache) ; A - ELEMENT OF CASH - ; CP C - ; CALL NZ,READ_FAT_TABLE - ; LD DE,FAT - ; ADD HL,DE - ; LD E,(HL) - ; INC HL - ; LD D,(HL) - ; LD HL,#FFEF - ; AND A - ; SBC HL,DE - ; POP HL - ; LD A,0 - ; RET - ; - ;R_F_F12 LD D,H - ; LD E,L - ; ADD HL,HL - ; ADD HL,DE - ; RR H - ; RR L - ; PUSH AF - ; EX DE,HL - ; LD HL,(B_P_S) - ; LD B,H - ; LD C,L - ; ADD HL,HL - ; ADD HL,BC - ; EX DE,HL - ; XOR A ; DE - SIZE SECTOR * 3 - ;R_F_00 INC A ; HL - FAT OFFSET - ; SBC HL,DE - ; JP NC,R_F_00 - ; ADD HL,DE - ; DEC A - ; - ; - - ;WRITE_FAT_TABLE LD HL,(FatCache) - ; LD H,0 - ; LD (FatCache),HL - ; LD E,L - ; LD D,H - ; ADD HL,HL - ; ADD HL,DE - ; PUSH HL - ; LD B,H - ; LD C,L - ; INC HL - ; INC HL - ; INC HL - ; LD DE,(S_P_F) - ; LD A,3 - ; AND A - ; SBC HL,DE - ; JP C,WR_FAT1 - ; EX DE,HL - ; LD HL,3 - ; AND A - ; SBC HL,DE - ; JP C,FATERR - ; LD A,L - ;WR_FAT1 LD H,B - ; LD L,C - ; LD DE,(FAT_FRM) - ; ADD HL,DE - ; EX DE,HL - ; LD IX,0 - ; ADD IX,DE - ; LD DE,FAT - ; LD HL,0 - ; LD B,A - ; LD C,6 - ; LD A,(DRIVE) - ; PUSH BC - ; RST #18 - ; POP BC - ; POP HL - ; LD DE,(FAT2_SEC_L) - ; ADD HL,DE - ; EX DE,HL - ; LD IX,0 - ; ADD IX,DE - ; LD DE,FAT - ; LD HL,0 - ; LD A,(DRIVE) - ; LD C,6 - ; RST #18 - ; RET - - -////////////// OLD //////////////// -; HL - CLUSTER -; HL:IX - SECTOR -; CLUSTER_TO_SECTOR: DEC HL -; DEC HL -; EX DE,HL -; LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) -; LD B,A -; LD HL,0 -; LD IX,0 -; ADD_DE1: ADD IX,DE -; JR NC,ADD_DE2 -; INC HL -; ADD_DE2: DJNZ ADD_DE1 -; LD DE,(FatBuffer.FirstDataSector_L) ;first data sector -; ADD IX,DE -; LD DE,#0000 -; ADC HL,DE -; RET -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file +;[END] \ No newline at end of file diff --git a/DSS/build.txt b/DSS/build.txt index db8b695..b7cbeb8 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -948 \ No newline at end of file +953 \ No newline at end of file