diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index b28a211..3258ee4 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -27,6 +27,8 @@ MAX_SECTORS_PER_PAGE EQU #20 ; LOAD_SECTORS EQU SECTORS_OF_LOADER.AFTER_BPB LOADER_IN_BPB: .MAX_SIZE EQU _sBOOT_SECTOR.PARTITION_TABLE - _sBOOT_SECTOR_PARAMS_FAT32 +FATPAGE: +.cache EQU #C000 ;------------------------------------------------------------------------------ DISP ORG_ADDRESS diff --git a/DSS/API/ChDir.asm b/DSS/API/ChDir.asm index 11f2596..47f569c 100644 --- a/DSS/API/ChDir.asm +++ b/DSS/API/ChDir.asm @@ -10,7 +10,7 @@ ; INPUT: HL - "C:\DIR\DIR\DIR_NAME[\]",0 //////////////////////////////////////////////////////////////////////// CHDIR_FN: - ;!TEST Current Dir ;[x] 15/10/23 + ; Current Dir 15/10/23 ; PUSH HL CALL DIR_PATH_CHECK @@ -32,5 +32,5 @@ CHDIR: CALL SetPath_GetName ; LD A,(HL) OR A RET Z - JP OPENDIR + JP OPENDIR ; !FIXIT возможно, что избыточно после SetPath_GetName ; \ No newline at end of file diff --git a/DSS/API/ChnDisk.asm b/DSS/API/ChnDisk.asm deleted file mode 100644 index dc099b0..0000000 --- a/DSS/API/ChnDisk.asm +++ /dev/null @@ -1,24 +0,0 @@ -//////////////////////////////////////////////////////////////////////// -; -; -//////////////////////////////////////////////////////////////////////// -CHDISK_FN: CALL CHDISK - RET C - PUSH AF - CALL DIR_PATH_CHANGE.FullCurrent - POP AF - RET -CHDISK: ;[x] более корректная смена диска - CALL OPENDSK - ; - ;R010 - RET C - LD HL,CORE_BUFFERS.WorkDirectory - LD (HL),0 - PUSH AF - CALL OPENDIR - POP BC - RET C - LD A,B - RET -; \ No newline at end of file diff --git a/DSS/API/Close.asm b/DSS/API/Close.asm index 3b0cb03..fe8be49 100644 --- a/DSS/API/Close.asm +++ b/DSS/API/Close.asm @@ -1,4 +1,3 @@ -; [x] fat32 ;!TEST //////////////////////////////////////////////////////////////////////// ;Входные значения: ; C - #12 @@ -28,14 +27,14 @@ CLOSE_FN: LD (.TMP),A LD D,(IY+_sFM.DIR_CLUSTER_H+1) PUSH DE ; - ; [x] 15/11/2023 -bug with bad clusters ;!TEST + ; 15/11/2023 -bug with bad clusters LD A,(IY+_sFM.DRIVE) CALL OPENDSK JR C,.error ; XOR A CALL SET_FM - ; [x] fat32 + ; fat32 POP DE LD (IY+_sFM.DIR_CLUSTER_H),E LD (IY+_sFM.DIR_CLUSTER_H+1),D @@ -45,11 +44,13 @@ CLOSE_FN: LD (.TMP),A POP DE LD (IY+_sFM.DIR_CLUSTER_L),E LD (IY+_sFM.DIR_CLUSTER_L+1),D - ; [x] 15/11/2023 -bug with bad clusters ;!TEST + ; 15/11/2023 -bug with bad clusters LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L),E LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1),D ; - CALL LOADDIR ; [ ] big dir + LD L,(IY+_sFM.HANDLE) + LD H,(IY+_sFM.HANDLE+1) + CALL LOADDIR.Custom ; [ ] big dir ; [ ] big dir ;!TODO отмотать кэш до нужного record index? ; diff --git a/DSS/API/Create.asm b/DSS/API/Create.asm index 38fc7d4..cb1b0cf 100644 --- a/DSS/API/Create.asm +++ b/DSS/API/Create.asm @@ -3,7 +3,7 @@ ; A - File attribute ; OUTPUT: A - FM //////////////////////////////////////////////////////////////////////// -CREATE: ;!TEST Current Dir ;[x] 15/10/23 ;CREATE_FN: +CREATE: ; Current Dir 15/10/23 ;CREATE_FN: PUSH HL LD C,A ; @@ -31,7 +31,7 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 ;CREATE_FN: ; ; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 ; OUTPUT: A - FM -.NEW: ;!TEST Current Dir ;[x] 15/10/23 +.NEW: ; Current Dir 15/10/23 PUSH HL LD C,A ; @@ -97,7 +97,7 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 ;CREATE_FN: LD (.PATH0),HL CALL SetPath_GetName RET C - ; [x] 26/06/2024 {64 kb cluster} + ; 26/06/2024 {64 kb cluster} CALL CHECK_64kb_CLUSTER RET C ; diff --git a/DSS/API/Delete.asm b/DSS/API/Delete.asm index d9fa466..eb991bb 100644 --- a/DSS/API/Delete.asm +++ b/DSS/API/Delete.asm @@ -1,31 +1,22 @@ -; [x] fat32 ;!TEST //////////////////////////////////////////////////////////////////////// ; INPUT: HL - "c:\dir\filename.ext",#00 without simbols * ? //////////////////////////////////////////////////////////////////////// -DEL_FN: ;Current Dir ;[x] 15/10/23 +DEL_FN: ; Current Dir 15/10/23 PUSH HL CALL DIR_PATH_CHECK POP HL RET C ; - CALL SetPath_GetName ; тест на допуст. имя и настр. на диск - RET C - ; [x] 26/06/2024 {64 kb cluster} - CALL CHECK_64kb_CLUSTER - RET C - ; - CALL MASK + CALL SetPath_GetName ; тест на допуст. имя и настр. на диск + RET C + ; [x] 26/06/2024 {64 kb cluster} + CALL CHECK_64kb_CLUSTER RET C ; - ;!TEST optimization - ;LD HL,MASKARE - ;LD BC,11 - ;LD A,"?" - ;CPIR - ;LD A,DSS_Error.sys.INVALID_NAME - ;SCF - CALL CHECK_NAME + CALL MASK + RET C ; + CALL CHECK_NAME RET Z ; CALL LOADDIR ; [ ] big dir diff --git a/DSS/API/Execute.ASM b/DSS/API/Execute.ASM index 953383a..cc96224 100644 --- a/DSS/API/Execute.ASM +++ b/DSS/API/Execute.ASM @@ -350,18 +350,17 @@ _TST_PROC: CALL GETMEM LD DE,RAMMAP LD A,H AND #C0 - ;!TEST CP #80 - JR Z,FR8000 - JR NC,FRC000 - ; -FR4000: LD A,(DE) + JR Z,.from_8000 + JR NC,.from_C000 + ; from_4000 + LD A,(DE) OUT (SLOT1),A INC DE -FR8000: LD A,(DE) +.from_8000: LD A,(DE) OUT (SLOT2),A INC DE -FRC000: LD A,(DE) +.from_C000: LD A,(DE) OUT (SLOT3),A ;CALL M_PSP ; @@ -388,11 +387,9 @@ _TST_PROC_2: EX DE,HL LD XH,D LD XL,E - ;LD HL,(CORE_BUFFERS.EXEBUFF.PC_REG) LD DE,RETFAR ; адрес п/п "неожиданное завершение процесса" PUSH DE - ;PUSH HL - ;!TEST Current Dir ;[x] 15/10/23 + ; Current Dir 15/10/23 PUSH IX LD HL,CORE_BUFFERS.CurrentPath LD A,(CORE_BUFFERS.EXEBUFF.VERSION) @@ -711,12 +708,12 @@ FINDPATH: POP AF RET .MAKE_PATH_ARRAY: - LD HL,ENVPAGE.PATH_PNT_ARRAY-1 ;R04 -1 + LD HL,ENVPAGE.PATH_PNT_ARRAY-1 LD DE,ENVPAGE.ENVTEMP-1 LD B,#00 .NEXTAR: - LD (HL),C ;R04 - INC HL ;R04 + LD (HL),C + INC HL XOR A LD (DE),A LD C,A @@ -725,8 +722,6 @@ FINDPATH: INC HL LD (HL),D INC HL -;R04 LD (HL),C -;R04 INC HL INC B .NEXTRT: LD A,(DE) @@ -747,8 +742,8 @@ FINDPATH: JR Z,.NEXTRT OR A JR NZ,.NEXTCH - LD (HL),C ;R04 - INC HL ;R04 + LD (HL),C + INC HL LD (HL),A INC HL LD (HL),A diff --git a/DSS/API/Find.asm b/DSS/API/Find.asm index 2fccf92..c0268a5 100644 --- a/DSS/API/Find.asm +++ b/DSS/API/Find.asm @@ -15,7 +15,7 @@ //////////////////////////////////////////////////////////////////////// F_FIRST_FN: CALL F_FIRST.INIT_VARS PUSH HL - ;!TEST Current Dir ;[x] 15/10/23 + ; Current Dir 15/10/23 CALL DIR_PATH_CHECK POP HL RET C diff --git a/DSS/API/MkDir.asm b/DSS/API/MkDir.asm index 62d503e..44502fb 100644 --- a/DSS/API/MkDir.asm +++ b/DSS/API/MkDir.asm @@ -1,4 +1,3 @@ -; [x] fat32 ;!TEST //////////////////////////////////////////////////////////////////////// ; Функция #1B. Создание каталога. ; diff --git a/DSS/API/Open.asm b/DSS/API/Open.asm index 75d4aeb..03444a4 100644 --- a/DSS/API/Open.asm +++ b/DSS/API/Open.asm @@ -1,4 +1,3 @@ -; [x] fat32 ;!TEST //////////////////////////////////////////////////////////////////////// ; Функция #11. Открытие файла. ; @@ -12,7 +11,7 @@ ; выход: CF=0, A - дескриптор файла. ; CF=1, A - код ошибки. //////////////////////////////////////////////////////////////////////// -OPEN_FN: ;!TEST Current Dir ;[x] 15/10/23 +OPEN_FN: ; Current Dir 15/10/23 ;AND #7F ; ACCESS_MODE bit7 - для внутреннего использования))) ;!TODO LD (.TMP),A PUSH HL diff --git a/DSS/API/Read.asm b/DSS/API/Read.asm index a8e8905..60cc06b 100644 --- a/DSS/API/Read.asm +++ b/DSS/API/Read.asm @@ -146,14 +146,11 @@ READ: LD (.R_POINT),HL ADD HL,DE ; EXX - ;LD DE,0 ;!TEST LD L,(IY+_sFM.F_POSITION+2) ;FP HIGH LD H,(IY+_sFM.F_POSITION+3) - ;!TEST - JR NC,.no_inc_hl - INC HL - ;ADC HL,DE + JR NC,.no_inc_hl ; + INC HL .no_inc_hl: EXX ;HL':HL - NEW FP ; LD C,(IY+_sFM.FS_REC.F_SIZE) diff --git a/DSS/API/Rename.asm b/DSS/API/Rename.asm index 344b400..d3d1af3 100644 --- a/DSS/API/Rename.asm +++ b/DSS/API/Rename.asm @@ -9,7 +9,7 @@ ; INPUT: HL - "old_name.ext",#00 without simbols * ? ; DE - "new_name.ext",#00 without simbols * ? //////////////////////////////////////////////////////////////////////// -RENAME: ;!TEST Current Dir ;[x] 15/10/23 +RENAME: ; Current Dir 15/10/23 PUSH HL PUSH DE CALL DIR_PATH_CHECK.forceCheck @@ -30,19 +30,12 @@ RENAME: ;!TEST Current Dir ;[x] 15/10/23 CALL MASK.name POP DE RET C - ;!TEST optimization - ;LD HL,MASKARE - ;LD BC,11 - ;LD A,"?" - ;CPIR - ;LD A,DSS_Error.sys.INVALID_NAME - ;SCF - CALL CHECK_NAME ; + CALL CHECK_NAME RET Z + ; PUSH DE CALL LOADDIR ; [ ] big dir ; прочитать список каталога - ;LD A,#33 LD A,FAT_ATTR.NoSYSnoVolID CALL SEARCH.Custom ; поиск записи "old_name.ext" в списке диска POP HL @@ -50,16 +43,10 @@ RENAME: ;!TEST Current Dir ;[x] 15/10/23 ;LD DE,MASKARE CALL MASK.name RET C - ;!TEST optimization - ;LD HL,MASKARE - ;LD BC,11 - ;LD A,"?" - ;CPIR - ;LD A,DSS_Error.sys.INVALID_NAME - ;SCF - CALL CHECK_NAME ; + CALL CHECK_NAME RET Z + ; PUSH IX LD A,FAT_ATTR.NoSYSnoVolID CALL SEARCH.Custom ; поиск записи "new_name.ext" в списке диска @@ -67,7 +54,7 @@ RENAME: ;!TEST Current Dir ;[x] 15/10/23 LD A,DSS_Error.sys.FILE_EXISTS CCF RET C - + ; SET_PAGE_X DIRPAGE EX AF,AF' ; diff --git a/DSS/API/RmDir.asm b/DSS/API/RmDir.asm index c1bba29..3059a1c 100644 --- a/DSS/API/RmDir.asm +++ b/DSS/API/RmDir.asm @@ -1,4 +1,3 @@ -; [x] fat32 ;!TEST //////////////////////////////////////////////////////////////////////// ; Функция #1C. Удаление каталога. ; Можно удалить только пустой каталог. @@ -8,7 +7,7 @@ ; ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 //////////////////////////////////////////////////////////////////////// -RMDIR: ;!TEST Current Dir ;[x] 15/10/23 +RMDIR: ; Current Dir 15/10/23 PUSH HL CALL DIR_PATH_CHECK POP HL diff --git a/DSS/DOS_FS.ASM b/DSS/DOS_FS.ASM index 5d472d2..b3bda7c 100644 --- a/DSS/DOS_FS.ASM +++ b/DSS/DOS_FS.ASM @@ -209,7 +209,7 @@ OPENDSK: ;!TEST DRV.Open ;----------------------------------------------------------------------; -;!TEST Current Dir ;[x] 15/10/23 +;! Current Dir 15/10/23 DIR_PATH_CHANGE: .FullCurrent: LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) ADD 'A' diff --git a/DSS/FS/FAT.asm b/DSS/FS/FAT.asm index 827dbc9..206c239 100644 --- a/DSS/FS/FAT.asm +++ b/DSS/FS/FAT.asm @@ -318,7 +318,6 @@ SEARCH: ;----------------------------------------------------------------------; ; FIND "MASKAREA" IN DIRECTORY -; [x] fat32 ;!TEST ; выход: IY:DE - cluster number FINDDIR: SET_PAGE_X DIRPAGE ; @@ -467,34 +466,81 @@ FINDDIR: SET_PAGE_X DIRPAGE RET ;----------------------------------------------------------------------; + +;----------------------------------------------------------------------; + тут доделать +; Вход: IY - указатель на начало файлового манипулятора CHECK_ROOT_CLUSTER: - EX DE,HL - LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L) ;R005 - LD A,L - OR H - LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H) + ;EX DE,HL + ; LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L) + ; LD A,L + ; OR H + ; LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H) + ; OR L + ; OR H + ;EX DE,HL + CALL CHECK_FIRST_CLUSTER + ; RET NZ + + ; LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE) + ; CP FAT_TYPE.x32 + ; CALL Z,SET_FAT_ROOT_DIR_CLUSTER + ; ; + ; XOR A + RET + ; +; .fat32root: CALL SET_FAT32_ROOT_DIR_CLUSTER +; OR A +; RET +;----------------------------------------------------------------------; + + +;----------------------------------------------------------------------; +SET_FAT_ROOT_DIR_CLUSTER: + LD HL,(CORE_BUFFERS.FS_Buffer.RootDirStartCluster_L) + LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL + LD HL,(CORE_BUFFERS.FS_Buffer.RootDirStartCluster_H) + LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),HL + RET +;----------------------------------------------------------------------; + + +;----------------------------------------------------------------------- +; вход: IY - указатель на начало файлового манипулятора +; выход: 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) + 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 - EX DE,HL RET +;----------------------------------------------------------------------- + ;----------------------------------------------------------------------; ; вход: HL - имя директории -; [x] fat32 ;!TEST - OPENDIR: LD IY,CORE_BUFFERS.FM_BUF LD A,(HL) OR A JR NZ,.SUBDIR ; -.REROOT: LD DE,0 ; !FIXIT ; [ ] CDFS - брать первый кластер из переменной - LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),DE - LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),DE - CALL LOADDIR ; [ ] big dir + тут доделать +.REROOT: CALL SET_FAT_ROOT_DIR_CLUSTER + ;LD DE,0 ; признак root dir ; !FIXIT ; [ ] CDFS - брать первый кластер из переменной + ;LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),DE + ;LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),DE +.reroot: CALL LOADDIR ; [ ] big dir ; CF=0 LD HL,CORE_BUFFERS.WorkDirectory LD (HL),'\' - INC HL + INC HL LD (HL),#00 ;AND A RET @@ -502,7 +548,12 @@ OPENDIR: LD IY,CORE_BUFFERS.FM_BUF .SUBDIR: CP "." JR NZ,.SUBDIR2 ; fat32 - CALL CHECK_ROOT_CLUSTER + ; !TEST 04/01/2026 + EX DE,HL + CALL CHECK_ROOT_CLUSTER + ;CALL CHECK_FIRST_CLUSTER + EX DE,HL + ; JR NZ,.no_root ;R005 ; "cd ." or "cd .." ;R005 @@ -546,7 +597,8 @@ OPENDIR: LD IY,CORE_BUFFERS.FM_BUF ; Прочитать список каталога ; вход (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L), (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H) LOADDIR: ;!TODO optimize - CALL LOAD_SAVE_DIR_PREPARE + LD HL,0 +.Custom: CALL LOAD_SAVE_DIR_PREPARE .next: PUSH AF EX AF,AF' JR NZ,.read_dir ; root dir or not @@ -582,8 +634,7 @@ LOADDIR: ;!TODO optimize JR NC,.RTD1 ; LD B,A ; число секторов -.RTD1: LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) ; ном -ер диска +.RTD1: LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) ; номер диска LD DE,DIRPAGE.buffer ; буфер LD C,Dss.DRV.Read ; чтение секторов RST ToDSS.DRV @@ -601,8 +652,7 @@ LOADDIR: ;!TODO optimize - ld - ; доделать передачу ID записи директории и загрузки по ней нужного куска в кэш +; [ ] доделать передачу ID записи директории и загрузки по ней нужного куска в кэш ;!TODO FAT procedures ;----------------------------------------------------------------------; ; Вход: @@ -613,27 +663,21 @@ LOAD_SAVE_DIR_PREPARE: ; HLIX = (HL*32) & #1FC000 смещение на нужный блок по #4000 байтов XOR A LD XL,A - LD L,A + LD E,A LD A,H - AND #0E + LD H,E + AND #FE RRA - RR L + RR E + LD (CORE_BUFFERS.FS_Buffer.DIR_BLOCK),A RRA - RR L + RR E RRA - RR L - LD E,L + RR E LD XH,E LD L,A ; ; ; - ; A = номер блока кэш директории - RL E - RLA - RL E - RLA - LD (CORE_BUFFERS.FS_Buffer.DIR_BLOCK),A - ; XOR A ; FILE MANIPULATOR = 0 ;LD H,A ;LD L,A @@ -648,11 +692,6 @@ LOAD_SAVE_DIR_PREPARE: LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) LD (CORE_BUFFERS.FM_BUF.DRIVE),A ;;;;;;;; - ;LD A,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) - ;OR (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) - ;OR (IY+_sFM.FS_REC.FIRST_CLUSTER_H) - ;OR (IY+_sFM.FS_REC.FIRST_CLUSTER_H+1) - ; XOR A LD D,#40 LD E,A @@ -755,9 +794,10 @@ LOAD_SAVE_DIR_PREPARE: #1FFFE0 & #3FFF Адрес нужной позиции в кэш (#1FFFE0 & #1FC000)<<2 двигаем байт 2 и 3 чтоб получить номер блока */ - ;----------------------------------------------------------------------; + + ; [ ] big dir ; скопировать запись в список диска (каталога) de ix iy ; и сбросить кеш каталога на диск @@ -1409,7 +1449,7 @@ FS_Buffer: ;!TODO record index. возможно, что может сломаться, если больше страницы DELETE_REC_FAT: SET_PAGE_X DIRPAGE EX AF,AF' - CALL DELETE_LFN_RECORDS ; [x] удаление записи LFN + CALL DELETE_LFN_RECORDS ; [ ] big dir ; [x] удаление записи LFN LD (IX + FAT_DIRECTORY_RECORD.NAME),#E5 ; признак удаления файла ; fat32 LD L,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) ; № первого кластера @@ -1495,7 +1535,6 @@ SET_NEW_FREE_CLUSTER: ; RET ; -; [x] fat32 ;!TEST ; найти первый свободный кластер ;!TODO проверить перебор кластеров ; выход: HL - младший номер свободного кластера ; HL' - старший номер свободного кластера @@ -1590,7 +1629,6 @@ SET_NEW_FREE_CLUSTERS: ; ; ; -; [x] fat32 ;!TEST ; Прикрепить к последнему кластеру цепочки новый пустой кластер ; Вход: HL':HL - номер кластера к которому прикрепить пустой ; Выход: HL':HL - номер кластера к которому прикрепился пустой @@ -1625,7 +1663,7 @@ INC_FAT: PUSH HL ; тек EXX ; CALL WRITE_TO_FAT ; записать в кеш FAT-а номер кластера - ;!TEST ;!TODO 2/12/23 ; [ ] баг с избыточной записью WRITE_FAT_TABLE? + ; 02/12/23 баг с избыточной записью WRITE_FAT_TABLE ;CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск ; EXX @@ -1639,10 +1677,9 @@ INC_FAT: PUSH HL ; тек XOR A ; уменьшить CALL SET_NEW_FREE_CLUSTERS ; [ ] free clusters for FSInfo RET -;RX01 -; [x] fat32 ;!TEST + ; вход: hl = младшее слово номера кластера для сравнения с FAT_Max_Cluster ; hl' = старшее слово номера кластера для сравнения с FAT_Max_Cluster (только для fat32) CHECK_CLUSTER_IS_SMALLER: @@ -1670,7 +1707,6 @@ CHECK_CLUSTER_IS_SMALLER: ; ; -;[x] fat32 ;!TEST ;------------------------------------------------------------------------------------------------ ; Прочитать из кеша FAT-а номер след. кластера ; вход: hl - номер кластера (младшее слово) @@ -1802,8 +1838,6 @@ SET_FAT32_CACHE_BLOCK_CHANGED_REGION: LD (CORE_BUFFERS.FS_Buffer.CacheUpdated),A RET -; -; [x] fat32 ;!TEST ; ; !TODO optimize ; при записи в кэш значения отмечать через OR в ячейке FS_Buffer.SectorOfCacheBlock @@ -1913,8 +1947,7 @@ WRITE_TO_FAT: LD DE,(CORE_BUFFERS.FS_Buffer.END_CHAIN_CLUSTER_L) ; POP DE JR .exit ; -.FAT32: ; [x] fat32 ;!TEST - EXX +.FAT32: EXX PUSH DE ; старший номер кластера который вписать PUSH HL ; старшее слово номера кластера в который записать EXX @@ -1942,7 +1975,6 @@ WRITE_TO_FAT: LD DE,(CORE_BUFFERS.FS_Buffer.END_CHAIN_CLUSTER_L) ; -; [x] fat32 ;!TEST ;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT ; in: HL - Cache block ; out: C:HL - logical number @@ -1981,7 +2013,6 @@ GET_SECTOR_OF_FAT: ;;;;;;;;; -; [x] fat32 ;!TEST ;RE_FAT: ;RX01 ; Прочитать в кеш ХХ секторов FAT-а @@ -2021,7 +2052,7 @@ READ_FAT_TABLE: PUSH HL RET -; [x] fat32 ;!TEST + ; Подключить банку кеша FAT и записать его на диск WRITE_FAT_TABLE: SET_PAGE_X FATPAGE @@ -2228,9 +2259,9 @@ WRITE_FAT_TABLE: POP DE POP AF RET + + ;----------------------------------------------------------------------- -; -;[x] fat32 ;!TEST ;вход: HL':HL - номер кластера ;выход: HL - адрес нужной ячейки в странице FATPAGE GET_FAT32_CELL: ; двигаем влево HL':H @@ -2344,8 +2375,6 @@ GET_FAT12_CELL: LD D,H ;----------------------------------------------------------------------- - -;[x] fat32 ;!TEST ;CLUSTER_TO_SECTOR: ; in: HL':HL - CLUSTER ; out: HL:IX - SECTOR @@ -2394,7 +2423,6 @@ CLUSTER_TO_SECTOR: //////////////////////////////////////////////////////////////////////// -; [x] fat32 ;!TEST ; READ SECTORS OF FILE ; вход: HL:DE - FP (in sectors) ; IY - FM @@ -2561,24 +2589,8 @@ BLOCK_READ: LD (READ.PointerOnBuffer),IX RET ;----------------------------------------------------------------------- -; [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) - 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 - RET -; [x] fat32 +;----------------------------------------------------------------------- ; WRITE SECTORS OF FILE ; вход: HL:DE - FP (in sectors) ; IX - data in RAM @@ -2595,16 +2607,6 @@ BLOCK_WRITE: LD (READ.PointerOnBuffer),IX PUSH BC ; младшее слово номера кластера PUSH DE ; 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 ; diff --git a/DSS/Structures.inc b/DSS/Structures.inc index ddb0211..8cafc5a 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -37,8 +37,8 @@ ; .CREATE_DATE_FAT32: WORD #0000 ;+ #10 +16 RESERVED ; .RESERVED_FAT32_1: WORD #0000 ;+ #12 +18 RESERVED ; .FIRST_CLUSTER_H: WORD #0000 ;+ #14 +20 RESERVED -; .TIME: WORD #0000 ;+ #16 +22 TIME -; .DATE: WORD #0000 ;+ #18 +24 DATE +; .TIME: WORD #0000 ;+ #16 +22 TIME +; .DATE: WORD #0000 ;+ #18 +24 DATE ; .FIRST_CLUSTER_L: WORD #0000 ;+ #1A +26 START CLUSTER ; [ ] fat32 ; .F_SIZE: DWORD #00000000 ;+ #1C +28 SIZE FILE ; from Core diff --git a/DSS/build.txt b/DSS/build.txt index e440e5c..bf0d87a 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -3 \ No newline at end of file +4 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 24f0747..3514add 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -69,6 +69,7 @@ MINIMUM_BIOS_VERSION EQU 3*256 + 06 ; version 3.06 ;-----------------------------------------------[^^^^^^] ;-----------------------------------------------[лог.номера страниц] + IFUSED DIRPAGE DEFINE USING_MEMPAGES 4 ; размер блока дополнительных страниц ; кэш списка каталога DIRPAGE EQU 0 + (low BANKTBL) @@ -85,6 +86,7 @@ ENVPAGE EQU TXTPAGE DRVPAGE EQU 3 + (low BANKTBL) ; COREPAGE EQU 4 + (low BANKTBL) ; она отдельно и не с блоком выше. + ENDIF ;-----------------------------------------------[^^^^^^^^^^^^^^^^^^] DIRECTORY_PATH_LENGTH EQU 256 ; '\' + 255, 0 diff --git a/SHELL/build.txt b/SHELL/build.txt index 19afd4e..1bc9029 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -527 \ No newline at end of file +531 \ No newline at end of file diff --git a/TMP_CODE.ASM b/TMP_CODE.ASM index 4cfc29a..cda401f 100644 --- a/TMP_CODE.ASM +++ b/TMP_CODE.ASM @@ -375,3 +375,151 @@ SAVEDIR: ;!TODO optimize RET + + + +; [ ] доделать передачу ID записи директории и загрузки по ней нужного куска в кэш +;!TODO FAT procedures +;----------------------------------------------------------------------; +; Вход: +; HL - ID записи, который должен попасть в КЭШ +; Выход: A - Страница, которая была в SLOT3 до вызова +; ZF' - RootDir +LOAD_SAVE_DIR_PREPARE: + ; [ ] Вход: HL - ID записи, который должен попасть в КЭШ + ; [ ] Выход: HLIX - смещение в файле каталога на нужный блок по #4000 байтов + ; HLIX = (HL*32) & #1FC000 смещение на нужный блок по #4000 байтов + XOR A + LD XL,A + LD E,A + LD A,H + LD H,E + AND #FE + RRA + RR E + LD (CORE_BUFFERS.FS_Buffer.DIR_BLOCK),A + RRA + RR E + RRA + RR E + LD XH,E + LD L,A + ; ; + ; + XOR A ; FILE MANIPULATOR = 0 + ;LD H,A + ;LD L,A + ;LD IX,0 + LD B,A ; от начала файла + CALL MOVE_FP + + SET_PAGE_X DIRPAGE + AND A + PUSH AF + ; + LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) + LD (CORE_BUFFERS.FM_BUF.DRIVE),A + ;;;;;;;; + XOR A + LD D,#40 + LD E,A + LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L) + EXX + LD D,A + LD E,A + LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H) + OR H + OR L + EXX + OR H + OR L + ;;;;;;;; + PUSH AF + CALL NZ,.CalcDirSize + ; + LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE),DE + EXX + LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE + 2),DE + POP AF + EX AF,AF' + POP AF + RET + ; +.CalcDirSize: ; calc dir size in clusters + LD DE,0 + ;LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L) + ;EXX + ; LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H) +.loop: ; ; + ;EXX + INC DE ; Надеемся тут на то, что спецификация выполняется и переполнения не будет + PUSH DE + CALL READ_FROM_FAT + EX DE,HL + POP DE + EXX + EX DE,HL + EXX + JR NC,.loop + ; + ; DE - размер директории в кластерах + ;!FIXIT можно оптимизнуть кол-во сдвигов + ;0001 0000 0000 0000 max кол-во кластеров + ; пример + ;0000 0000 0000 0111 Clusters + ; 0100 0000 SectorsPerCluster + ;0000 0010 0000 0000 BytesPerSector + ; D' E' D E + ;0000 0000 0000 0011 1000 0000 0000 0000 + ; + LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster) + LD BC,(CORE_BUFFERS.FS_Buffer.BytesPerSector) + ; DE':DE - кол-во кластеров + ; A - размер кластера в секторах + ; BC - размер сектора в байтах + ; --> DE*BC*A = DE':DE для ответа хватит, походу, 4х регистров + EXX + LD DE,0 + EXX + SRL B + RR C + RRCA + JR C,.loop2 + ; +.loop1: ; + SLA E + RL D + EXX + RL E + RL D + ;RL C + EXX + ; + RRCA + JR NC,.loop1 + ; +.loop2: ; + SLA E + RL D + EXX + RL E + RL D + ;RL C + EXX + ; + SRL B + RR C + JR NC,.loop2 + ; <-- DE*BC*A = DE':DE + RET + +/* 4 3 2 1 + #FFFF<<5 = #1FFFE0 = 0000 0000 0001 1111 1111 1111 1110 0000 + + #FFFF номер записи + #1FFFE0 смещение на запись в файле директории + #1FFFE0 & #1FC000 смещение на нужный блок по #4000 байтов + #1FFFE0 & #3FFF Адрес нужной позиции в кэш + (#1FFFE0 & #1FC000)<<2 двигаем байт 2 и 3 чтоб получить номер блока +*/ +;----------------------------------------------------------------------; \ No newline at end of file