//////////////////////////////////////////////////////////////////////// ; Функция #1C. Удаление каталога. ; Можно удалить только пустой каталог. ; ; вход: HL - указатель на имя каталога ; выход: A - код ошибки, если CF=1 ; ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 //////////////////////////////////////////////////////////////////////// RMDIR: ; Current Dir 15/10/23 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 ; [x] 26/06/2024 {64 kb cluster} CALL CHECK_64kb_CLUSTER RET C ; CALL MASK RET C ; CALL CHECK_NAME RET Z ; CALL LOADDIR ; [ ] big dir CALL SEARCH.Dir RET C ; fat32 ; [ ] CDFS LD HL,(CORE_BUFFERS.HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) EXX LD HL,(CORE_BUFFERS.HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) PUSH IX ;!TODO record index. возможно, что может сломаться, если больше страницы ; ;!FIXIT ;[ ] big dir. проверять, что пустой через новый вызов Find. ;!TODO Процедура полного вычитывания каталога (все кластеры). Можно задействовать в других местах .read_dir_big_loop: PUSH HL EXX PUSH HL EXX CALL CLUSTER_TO_SECTOR LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster) LD B,A ; начинаем вычитывать содержимое каталога посекторно .read_dir_loop: ;PUSH AF PUSH BC PUSH HL PUSH IX CALL READ_SECTOR ; !FIXIT нет проверки на ошибку ; ;!HARDCODE sector size. 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 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 ;