; [x] fat32 ;!TEST //////////////////////////////////////////////////////////////////////// ; Функция #1C. Удаление каталога. ; Можно удалить только пустой каталог. ; ; вход: HL - указатель на имя каталога ; выход: A - код ошибки, если CF=1 ; ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 //////////////////////////////////////////////////////////////////////// RMDIR: ;!TEST Current Dir ;[x] 15/10/23 ; [ ] 10/06/24 IF OLD_DSS_FOR_OLD_EXE LD A,(EXE_VERSION) OR A JR Z,.START ENDIF ; PUSH HL CALL DIR_PATH_CHECK POP HL RET C CALL .START PUSH AF LD HL,CORE_BUFFERS.CurrentDirectory CALL CHDIR CALL DIR_PATH_CHANGE.Current POP AF RET ; .START: CALL SetPath_GetName RET C ; [ ] 26/06/2024 CALL CHECK_64kb_CLUSTER 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.Dir RET C ; fat32 LD HL,(HANDBUF+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) EXX LD HL,(HANDBUF+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) PUSH IX ;!TODO record index. возможно, что может сломаться, если больше страницы ; ;!TODO Процедура полного вычитывания каталога (все кластеры). Можно задействовать в других местах .read_dir_big_loop: PUSH HL EXX PUSH HL EXX CALL CLUSTER_TO_SECTOR LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) LD B,A ; начинаем вычитывать содержимое каталога посекторно .read_dir_loop: ;PUSH AF PUSH BC PUSH HL PUSH IX ; ; IN A,(SLOT3) ; PUSH AF ; IN A,(SLOT0) ; OUT (SLOT3),A ; ; ; LD DE,CORE_BUFFERS.SECTOR_BUFFER+#C000 ; LD BC,1*256 + Dss.DRV.Read ; LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; RST ToDSS.DRV ; POP AF ; OUT (SLOT3),A CALL READ_SECTOR ; !FIXIT нет проверки на ошибку ; ;!HARDCODE 16 * 32 = 512; 32 - размер записи, 512 - размер считанного сектора LD B,16 LD HL,CORE_BUFFERS.SECTOR_BUFFER .check_dir_loop: LD A,(HL) OR A JP Z,.dir_empty CP "." JR Z,.next_record CP #E5 ;!HARDCODE байт удаления файла JR Z,.next_record LD DE,FAT_DIRECTORY_RECORD.ATTRIBUT ; смещ. до байта атрибутов ADD HL,DE 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 DJNZ .check_dir_loop ; POP IX POP HL INC IX LD A,XH OR XL JR NZ,.no_inc_hl INC HL .no_inc_hl: ; POP AF ; DEC A ; JR NZ,.read_dir_loop POP BC DJNZ .read_dir_loop ; fat32 EXX POP HL ; номер кластера EXX POP HL ; номер кластера CALL READ_FROM_FAT ; прочитать из кеша FAT-а номер след. кластера EX DE,HL ; hl=номер след. кластера EXX EX DE,HL ; hl=номер след. кластера EXX JR NC,.read_dir_big_loop ; не конец цепочки ; .delete: POP IX JP DELETE_REC_FAT ; пометить запись как "удаленная" ; .dir_empty: ; CF = 0 .error: ; CF = 1 POP HL POP HL POP HL POP HL POP HL JR NC,.delete POP HL LD A,DSS_Error.sys.DIR_NOT_EMPTY RET ;