From ed82bbff7872e4886f83973447815c56fbcfc9da Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sun, 21 Apr 2024 05:11:18 +1000 Subject: [PATCH] fat32 - 98% --- DSS/API/Create.asm | 2 +- DSS/API/Delete.asm | 95 +++------- DSS/API/RmDir.asm | 14 +- DSS/DSS_MACROSES.Z80 | 6 +- DSS/FS/FAT/FAT.asm | 72 ++++--- DSS/FS/FAT/FAT_X.asm | 348 +++++++++++++++++++++++++--------- DSS/Media_drivers/ide-drv.asm | 66 ++++--- DSS/build.txt | 2 +- DSS/defines.inc | 3 +- 9 files changed, 374 insertions(+), 234 deletions(-) diff --git a/DSS/API/Create.asm b/DSS/API/Create.asm index acfd62b..88bfdea 100644 --- a/DSS/API/Create.asm +++ b/DSS/API/Create.asm @@ -24,7 +24,7 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 SCF RET .FILE_EXISTS_DEL: - CALL DEL_FN.DELETE + CALL DELETE_REC_FAT LD A,DSS_Error.sys.FILE_NOT_FOUND RET ; diff --git a/DSS/API/Delete.asm b/DSS/API/Delete.asm index b6d0873..d03c56f 100644 --- a/DSS/API/Delete.asm +++ b/DSS/API/Delete.asm @@ -2,73 +2,30 @@ //////////////////////////////////////////////////////////////////////// ; INPUT: HL - "c:\dir\filename.ext",#00 without simbols * ? //////////////////////////////////////////////////////////////////////// -DEL_FN: ;!TEST - ;!TEST Current Dir ;[x] 15/10/23 - PUSH HL - CALL DIR_PATH_CHECK - POP HL - RET C - ; - CALL GETWORD ; тест на допуст. имя и настр. на диск - RET C - CALL MASK - RET C - ; - ;!TEST optimization - ;LD HL,MASKARE - ;LD BC,11 - ;LD A,"?" - ;CPIR - ;LD A,DSS_Error.sys.INVALID_NAME - ;SCF - CALL CHECK_NAME - ; - RET Z - CALL LOADDIR - CALL SEARCH.File - RET C -; пометить запись как "удаленная" -;!TODO record index. возможно, что может сломаться, если больше страницы -.DELETE: - SET_PAGE_X DIRPAGE - EX AF,AF' - CALL DELETE_LFN_RECORDS ; [ ] удаление записи LFN - LD (IX + FAT_DIRECTORY_RECORD.NAME),#E5 ; признак удаления файла - ; fat32 - LD E,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) ; № первого кластера - LD D,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1) - LD A,E - OR D - EXX - LD E,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) ; № первого кластера - LD D,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1) - OR D - OR E - ; - EX AF,AF' - OUT (SLOT3),A - EX AF,AF' - JP Z,SAVEDIR ; сбросить кеш каталога на диск - ; если размер файла не ноль -.loop: EX DE,HL ; hl=номер кластера - EXX - EX DE,HL - EXX - CALL READ_FROM_FAT ; прочитать из кеша FAT-а номер след. кластера - EXX - PUSH DE ; номер след. кластера - PUSH AF - LD DE,#0000 ; номер кластера - EXX - PUSH DE - LD DE,#0000 ; номер кластера - CALL WRITE_TO_FAT.Custom ; записать в кеш FAT-а номер кластера - POP DE - EXX - POP AF - POP DE - EXX - JP NC,.loop - CALL WRITE_FAT_TABLE - JP SAVEDIR ; сбросить кеш каталога на диск +DEL_FN: ;!TEST + ;!TEST Current Dir ;[x] 15/10/23 + PUSH HL + CALL DIR_PATH_CHECK + POP HL + RET C + ; + CALL GETWORD ; тест на допуст. имя и настр. на диск + RET C + CALL MASK + RET C + ; + ;!TEST optimization + ;LD HL,MASKARE + ;LD BC,11 + ;LD A,"?" + ;CPIR + ;LD A,DSS_Error.sys.INVALID_NAME + ;SCF + CALL CHECK_NAME + ; + RET Z + CALL LOADDIR + CALL SEARCH.File + RET C + JP DELETE_REC_FAT ; пометить запись как "удаленная" ; \ No newline at end of file diff --git a/DSS/API/RmDir.asm b/DSS/API/RmDir.asm index 95f45f5..28fb499 100644 --- a/DSS/API/RmDir.asm +++ b/DSS/API/RmDir.asm @@ -89,6 +89,7 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 LD A,(HL) SBC HL,DE AND FAT_ATTR.VOLUME_ID + SCF JP Z,.error ;DIR NOT EMPTY .next_record: LD DE,FAT_DIRECTORY_RECORD ADD HL,DE @@ -119,22 +120,17 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 JR NC,.read_dir_big_loop ; не конец цепочки ; .delete: POP IX - JP DEL_FN.DELETE ; пометить запись как "удаленная" + JP DELETE_REC_FAT ; пометить запись как "удаленная" ; -.dir_empty: POP HL +.dir_empty: ; CF = 0 +.error: ; CF = 1 POP HL - POP HL - POP HL - POP HL - JR .delete - ; -.error: POP HL POP HL POP HL POP HL POP HL + JR NC,.delete POP HL LD A,DSS_Error.sys.DIR_NOT_EMPTY - SCF RET ; \ No newline at end of file diff --git a/DSS/DSS_MACROSES.Z80 b/DSS/DSS_MACROSES.Z80 index 7589bb9..776efd5 100644 --- a/DSS/DSS_MACROSES.Z80 +++ b/DSS/DSS_MACROSES.Z80 @@ -101,16 +101,14 @@ ; ; ВХОД: L - логический номер в таблице ; ВЫХОД: IY - начало записи -; ПОРТИТ: HL, IY. HL<-->DE +; ПОРТИТ: HL, DE, IY. MACRO LOGDRV_ENTRY_FIND tbl_addr LD H,0 ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL - ;LD B,H - ;LD C,L - EX DE,HL + EX DE,HL LD IY,tbl_addr ADD IY,DE ENDM diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index ada06b3..769a3a6 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -10,20 +10,23 @@ ;--------------------------------------------------------------- ;----------------------------------------------------------------------; -; сбрасывает значения свободных и первого свободного секторов на "неопределено" -RESET_FSInfo: LD A,(CORE_BUFFERS.FatBuffer.RESET_FSINFO) +; сбрасывает значение свободных кластеров на "неопределено" +; меняет значение первого свободного кластера +SET_FSInfo: LD A,(CORE_BUFFERS.FatBuffer.RESET_FSINFO) OR A RET Z ; CALL READ_FSinfo ; - LD HL,CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT - LD B,8 ; 2 x DWORD - LD A,#FF - ; -.fsinfo_loop: LD (HL),A - INC HL - DJNZ .fsinfo_loop + ;!TODO FREE_CLUSTERS_COUNT + LD HL,#FFFF + LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER),HL + LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER+2),HL + ; FIRST_FREE_CLUSTER + LD HL,(G_CLUST.low) + LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER),HL + LD HL,(G_CLUST.high) + LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER+2),HL ; XOR A LD (CORE_BUFFERS.FatBuffer.RESET_FSINFO),A @@ -32,18 +35,16 @@ RESET_FSInfo: LD A,(CORE_BUFFERS.FatBuffer.RESET_FSINFO) ; Прочитать BPB в SECTOR_BUFFER READ_BPB: LD C,Dss.DRV.GetBPB JR RW_SECTOR - ; ; Записать FSinfo из SECTOR_BUFFER WRITE_FSinfo: LD IX,(CORE_BUFFERS.FatBuffer.FSINFO_Sector) LD HL,0 + ;JR WRITE_SECTOR ; Записать сектор из SECTOR_BUFFER ; Вход: HL:IX = Logical Block (sector) WRITE_SECTOR: LD BC,1*256 + Dss.DRV.Write JR RW_SECTOR - ; ; Прочитать FSinfo в SECTOR_BUFFER -READ_FSinfo: - LD IX,(CORE_BUFFERS.FatBuffer.FSINFO_Sector) +READ_FSinfo: LD IX,(CORE_BUFFERS.FatBuffer.FSINFO_Sector) LD HL,0 ; Прочитать сектор в SECTOR_BUFFER ; Вход: HL:IX = Logical Block (sector) @@ -712,7 +713,7 @@ RD_BPB: ; LD C,SLOT3 LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_H),A LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT32) .skip_high: LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_L),DE - ; + ;!TODO выбор активной FAT для fat32 LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.Number_of_FATs) ; amount FATs CP 1 JR Z,.one_FAT @@ -1023,25 +1024,38 @@ RD_BPB: ; LD C,SLOT3 LD DE,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.DATA_SIGNATURE + 2) LD BC,#7272 SBC HL,BC - JR NZ,.error_sig + JR NZ,.error EX DE,HL LD DE,#6141 SBC HL,DE - JR NZ,.error_sig - ; !FIXIT сделать проверку кластеров на валидность (не больше максимального для раздела) - LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER) - LD (G_CLUST.low),HL - LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER+2) - LD (G_CLUST.high),HL - LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT) - LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL - LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT+2) - LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),HL + JR NZ,.error + ; FIRST_FREE_CLUSTER + LD DE,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER+2) + LD BC,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER) + LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterLow) + ; CF = 0 + ;!TODO MaxCluster - максимально допустимый или на 1 больше максимально допустимого? + SBC HL,BC + LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterHigh) + SBC HL,DE + JR C,.error + ; + LD (G_CLUST.high),DE + LD (G_CLUST.low),BC + ;!TODO FREE_CLUSTERS_COUNT + ;LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT) + ;LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL + ;LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT+2) + ;LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),HL + ; XOR A - RET -.error_sig: LD HL,#FFFF - LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL - LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),HL +.error: LD (CORE_BUFFERS.FatBuffer.RESET_FSINFO),A + RET Z + ;!TODO FREE_CLUSTERS_COUNT + ;LD HL,#FFFF + ;LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL + ;LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),HL + ; XOR A LD H,A LD L,2 diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index e77f6fe..87f285e 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -13,6 +13,91 @@ ;RX01 10-02-1999 DNS UPGRADE FAT CASH ;--------------------------------------------------------------- +; Удаляет запись в каталоге и освобождает занятую цепочку кластеров +; Вход: IX - указатель на удаляемую запись в DIRPAGE +;!TODO record index. возможно, что может сломаться, если больше страницы +DELETE_REC_FAT: SET_PAGE_X DIRPAGE + EX AF,AF' + CALL DELETE_LFN_RECORDS ; [x] удаление записи LFN + LD (IX + FAT_DIRECTORY_RECORD.NAME),#E5 ; признак удаления файла + ; fat32 + LD E,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) ; № первого кластера + LD D,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1) + LD A,E + OR D + EXX + LD E,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) ; № первого кластера + LD D,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1) + OR D + OR E + ; + EX AF,AF' + OUT (SLOT3),A + EX AF,AF' + JP Z,SAVEDIR ; сбросить кеш каталога на диск + ; если размер файла не ноль +.loop: EX DE,HL ; hl=номер кластера + EXX + EX DE,HL + EXX + CALL READ_FROM_FAT ; прочитать из кеша FAT-а номер след. кластера + EXX + PUSH DE ; номер след. кластера + PUSH AF + LD DE,#0000 ; номер кластера + EXX + PUSH DE + ; + CALL SET_NEW_FREE_CLUSTER + ; + LD DE,#0000 ; номер кластера + CALL WRITE_TO_FAT.Custom ; записать в кеш FAT-а номер кластера + POP DE + EXX + POP AF + POP DE + EXX + JP NC,.loop + CALL WRITE_FAT_TABLE + JP SAVEDIR ; сбросить кеш каталога на диск + +; Установить первым известным кластером для поиска свободного. +; Установится только если меньше предыдущего +; Вход: HL':HL - cluster +; [x] раньше был шанс упереться в "DISK FULL" если G_CLUST указывал на кластер дальше, чем другой свободный +SET_NEW_FREE_CLUSTER: + XOR A + LD B,D + LD C,E + EX DE,HL + LD HL,(G_CLUST.low) + SBC HL,DE + EX DE,HL + LD D,B + LD E,C + ; + EXX + LD B,D + LD C,E + EX DE,HL + LD HL,(G_CLUST.high) + SBC HL,DE + EX DE,HL + LD D,B + LD E,C + EXX + RET C + ; + JR G_CLUST.set_new + ; LD (G_CLUST.low),HL + ; EXX + ; LD (G_CLUST.high),HL + ; EXX + ; XOR A + ; INC A + ; LD (CORE_BUFFERS.FatBuffer.RESET_FSINFO),A + ; RET + ; ; [x] fat32 ;!TEST ; найти первый свободный кластер ;!TODO проверить перебор кластеров @@ -44,10 +129,13 @@ G_CLUST: ; OR D OR E JR NZ,.loop +.set_new: ; A = 0 LD (G_CLUST.low),HL EXX - LD (G_CLUST.high),HL + LD (G_CLUST.high),HL EXX + INC A + LD (CORE_BUFFERS.FatBuffer.RESET_FSINFO),A RET ; @@ -56,49 +144,48 @@ G_CLUST: ; ; Вход: HL':HL - номер кластера к которому прикрепить пустой ; Выход: HL':HL - номер кластера к которому прикрепился пустой ; DE':DE - номер пустого кластера -INC_FAT: - PUSH HL ; текущий кластер - EXX - PUSH HL ; текущий кластер - EXX - ; - CALL G_CLUST - ; - EXX - POP DE ; текущий кластер - EXX - POP DE ; текущий кластер - RET C - ; HL':HL - свободный кластер, DE':DE - текущий кластер - ; - EX DE,HL - EXX - EX DE,HL - EXX - ; - CALL WRITE_TO_FAT.Custom ; записать в кеш FAT-а номер кластера - ;!FIXIT <нет контроля ошибки> - ; - PUSH HL - EX DE,HL - EXX - PUSH HL - EX DE,HL - EXX - ; - CALL WRITE_TO_FAT ; записать в кеш FAT-а номер кластера - ;!TEST ;!TODO 2/12/23 ; [ ] баг с избыточной записью WRITE_FAT_TABLE? - ;CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск - ; - EXX - POP DE - EX DE,HL - EXX - POP DE - EX DE,HL - ; - AND A - RET +INC_FAT: PUSH HL ; текущий кластер + EXX + PUSH HL ; текущий кластер + EXX + ; + CALL G_CLUST + ; + EXX + POP DE ; текущий кластер + EXX + POP DE ; текущий кластер + RET C + ; HL':HL - свободный кластер, DE':DE - текущий кластер + ; + EX DE,HL + EXX + EX DE,HL + EXX + ; + CALL WRITE_TO_FAT.Custom ; записать в кеш FAT-а номер кластера + ;!FIXIT <нет контроля ошибки> + ; + PUSH HL + EX DE,HL + EXX + PUSH HL + EX DE,HL + EXX + ; + CALL WRITE_TO_FAT ; записать в кеш FAT-а номер кластера + ;!TEST ;!TODO 2/12/23 ; [ ] баг с избыточной записью WRITE_FAT_TABLE? + ;CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск + ; + EXX + POP DE + EX DE,HL + EXX + POP DE + EX DE,HL + ; + AND A + RET ;RX01 @@ -235,6 +322,24 @@ READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER POP HL LD A,0 RET +; + +; Вход: HL - Номер первой ячейки кластера в блоке фата +; Портить только HL и A +SET_FAT32_CACHE_BLOCK_CHANGED_REGION: + LD A,H + AND #38 + LD HL,#0108 + JR Z,.set_region + ; +.loop: SLA H + SUB L + JR NZ,.loop + ; +.set_region: LD A,(CORE_BUFFERS.FatBuffer.CacheUpdated) + OR H + LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A + RET ; ; [x] fat32 ;!TEST @@ -302,13 +407,17 @@ WRITE_TO_FAT: LD DE,(CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L) ; LD (HL),E ; сохр. в кеше FAT-а INC HL ; номер кластера LD (HL),D -.exit: POP AF ; восст. порт + ; +.exit: ; [ ] ускорение работы с кэшем FAT + CALL SET_FAT32_CACHE_BLOCK_CHANGED_REGION + ; + POP AF ; восст. порт POP HL OUT (SLOT3),A ; [x] 2/12/23 FAT не всегда мог записаться на HDD - XOR A - INC A - LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A + ;XOR A + ;INC A + ;LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A ; CF = 0 RET ; @@ -362,7 +471,10 @@ WRITE_TO_FAT: LD DE,(CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L) ; INC HL LD (HL),C INC HL - LD (HL),B + LD A,(HL) + AND #F0 + OR B + LD (HL),A JR .exit ;;;;;;;;; @@ -459,7 +571,7 @@ WRITE_FAT_TABLE: ; Запись кеша FAT-а на диск .Start: LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) CP FAT_TYPE.x32 - CALL Z,RESET_FSInfo + CALL Z,SET_FSInfo LD HL,(CORE_BUFFERS.FatBuffer.CacheBlock) ;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT CALL GET_SECTOR_OF_FAT @@ -556,16 +668,73 @@ WRITE_FAT_TABLE: LD D,XH LD E,XL EX DE,HL - ; LD H,0 - ; LD L,C LD XH,D LD XL,E ; HL:IX - смещение внутри раздела на начало нужного блока FAT + LD A,(CORE_BUFFERS.FatBuffer.CacheUpdated) + CP #FF + JR NZ,.SAVE_NOT_ALL_BLOCK + ; LD DE,FATPAGE.cache ; откуда LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; номер диска LD C,Dss.DRV.Write JP ToDSS.DRV +.SAVE_NOT_ALL_BLOCK: + ; A = CORE_BUFFERS.FatBuffer.CacheBlock + ; HL:IX - смещение внутри раздела на начало нужного блока FAT + ; B = максимальное число блоков для записи + EXX + LD HL,FATPAGE.cache + LD DE,#0800 ;!HARDCODE размер региона в блоке КЭШа FAT (байтов) + EXX + LD C,A + LD A,B + LD B,8 ;!HARDCODE количество регионов в блоке КЭШа FAT + LD DE,4 ;!HARDCODE размер региона в блоке КЭШа FAT (секторов) + ; чтоб не насрать за границы FAT +.region_loop: SUB A,E + JR NC,.good_blk + ; максимально допустимый блок для записи меньше, чем хочется + ADD A,E + LD E,A + ; +.good_blk: SRL C + JR C,.SAVE_FAT_CACHE_REGION + EXX + ADD HL,DE + EXX + ADD IX,DE + JR NC,.no_inc_HL + INC HL +.no_inc_HL: DJNZ .region_loop + RET + ; HL' - Адрес в странице КЭШа + ; HL:IX - смещение внутри раздела на начало нужного РЕГИОНА блока FAT +.SAVE_FAT_CACHE_REGION: + PUSH AF + PUSH DE + PUSH BC + ; + EXX + PUSH HL + EXX + LD B,E ; кол-во секторов + POP DE ; Адрес в странице КЭШа + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; номер диска + LD C,Dss.DRV.Write + RST ToDSS.DRV + PUSH DE + EXX + POP HL + LD DE,#0800 ;!HARDCODE размер региона в блоке КЭШа FAT (байтов) + EXX + ; + POP BC + POP DE + POP AF + DJNZ .region_loop + RET ;----------------------------------------------------------------------- ; ;[x] fat32 ;!TEST @@ -692,40 +861,47 @@ GET_FAT12_CELL: ; in: HL':HL - CLUSTER ; out: HL:IX - SECTOR CLUSTER_TO_SECTOR: - EXX - PUSH HL - EXX - POP DE - ; DE:HL - cluster - DEC HL - DEC HL - LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) - XOR 1 - JR Z,.skip - ; - RRA -.loop: ADD HL,HL - RL E - RL D - ; - RRA - JP NC,.loop - ; -.skip: EX DE,HL - LD XL,E - LD XH,D - LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_L) - ; [x] fat32 - ;XOR A - ; - ADD IX,DE - ; [x] fat32 - LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_H) - ;LD D,A - ;LD E,A - ; - ADC HL,DE - RET + PUSH BC + EXX + PUSH HL + EXX + POP DE + ; DE:HL - cluster + ; + LD BC,-2 + ADD HL,BC + JR C,.no_dec_de + DEC DE +.no_dec_de: ; cluster = cluster - 2 + ; + LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) + XOR 1 + JR Z,.skip + ; + RRA +.loop: ADD HL,HL + RL E + RL D + ; + RRA + JP NC,.loop + ; +.skip: EX DE,HL + LD XL,E + LD XH,D + LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_L) + ; [x] fat32 + ;XOR A + ; + ADD IX,DE + ; [x] fat32 + LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_H) + ;LD D,A + ;LD E,A + ; + ADC HL,DE + POP BC + RET //////////////////////////////////////////////////////////////////////// diff --git a/DSS/Media_drivers/ide-drv.asm b/DSS/Media_drivers/ide-drv.asm index 08efad2..59d8a11 100644 --- a/DSS/Media_drivers/ide-drv.asm +++ b/DSS/Media_drivers/ide-drv.asm @@ -175,34 +175,35 @@ ; IDE1 EQU #0C1C8 PARTITION_BUFFER _sBOOT_SECTOR = #C000 ; EQU #C000 _sBOOT_SECTOR -HDDRIVE INC C - DEC C - JP Z,INIT_H ; c=0 Initialization - DEC C - JP Z,RESE_H ; c=1 open - DEC C - JP Z,STAT_H ; c=2 close - DEC C - JP Z,CHEK_H ; c=3 media check (смена носителя) - DEC C - JP Z,GBPB_H ; c=4 get BPB - DEC C - JP Z,READH ; c=5 read (чтение секторов) - DEC C - JP Z,WRITEH ; c=6 write (запись секторов) - DEC C - JP Z,REMOV_H ; c=7 Removable - DEC C - JP Z,IOCTL_H ; c=8 узнать геометрию диска Generic IOCTL - DEC C - JP Z,RESR_H ; c=9 Reserved - DEC C - JP Z,LREADH ; c=10 Read Long - DEC C - JP Z,LWRITEH ; c=11 Write Long -RESR_H LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET +HDDRIVE: INC C + DEC C + JP Z,INIT_H ; c=0 Initialization + DEC C + JP Z,RESE_H ; c=1 open + DEC C + JP Z,STAT_H ; c=2 close + DEC C + JP Z,CHEK_H ; c=3 media check (смена носителя) + DEC C + JP Z,GBPB_H ; c=4 get BPB + DEC C + JP Z,READH ; c=5 read (чтение секторов) + DEC C + JP Z,WRITEH ; c=6 write (запись секторов) + DEC C + JP Z,REMOV_H ; c=7 Removable + DEC C + JP Z,IOCTL_H ; c=8 узнать геометрию диска Generic IOCTL + DEC C + JP Z,.Reserved ; c=9 Reserved + DEC C + JP Z,LREADH ; c=10 Read Long + DEC C + JP Z,LWRITEH ; c=11 Write Long + ; +.Reserved: LD A,DSS_Error.drv.INVALID_COMMAND + SCF + RET //////////////////////////////////////////////////////////////////////// @@ -280,23 +281,20 @@ DRVCLC: ; INC A ; LOGDRV: BLOCK .TBL_Entry * LD_DSK,0 ; .TBL_Entry EQU 16 ; .Size EQU $-LOGDRV - SELHDD: PUSH DE - PUSH BC PUSH HL ; LD L,A LOGDRV_ENTRY_FIND LOGDRV ; !HARDCODE - LD C,(IY+1) - LD B,(IY+2) + LD E,(IY+1) + LD D,(IY+2) + ADD IX,DE LD E,(IY+3) LD D,(IY+4) POP HL - ADD IX,BC ADC HL,DE LD A,(IY+0) ;DRIVE NUMBER - POP BC POP DE RET diff --git a/DSS/build.txt b/DSS/build.txt index 71ed48c..0c8ddea 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -954 \ No newline at end of file +955 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 972f2cd..55068c7 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -27,7 +27,8 @@ ;LD_DSK EQU 16 ; максимальное количество логических HDD дисков в системе ///////////////////////////////////////////////////////////////////////////////////////////////////////////// - DEFINE USE_FSINFO_FAT32 0 ; недоделано. А нужно ли? + DEFINE USE_FSINFO_FAT32 1 ; недоделано. А нужно ли? + DEFINE CHANGE_FREE_CLU_AFTER_DEL 1 SERVICE_SECTORS: .FAT12 EQU #0FEF