//////////////////////////////////////////////////////////////////////// ; Функция #1C. Удаление каталога. ; Можно удалить только пустой каталог. ; ; вход: HL - указатель на имя каталога ; выход: A - код ошибки, если CF=1 ; ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 //////////////////////////////////////////////////////////////////////// RMDIR: ;!TEST Current Dir ;[x] 15/10/23 PUSH HL CALL DIR_PATH_CHECK POP HL RET C CALL .START PUSH AF LD HL,CurrentDirectory CALL CHDIR CALL DIR_PATH_CHANGE.Current POP AF RET ; .START: 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.Dir RET C ; [ ] fat32 LD HL,(HANDBUF+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) PUSH IX .RMD17: PUSH HL CALL NSECTOR LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ; начинаем вычитывать содержимое каталога посекторно .read_dir_loop: PUSH AF PUSH HL PUSH IX ; IN A,(SLOT3) PUSH AF IN A,(SLOT0) OUT (SLOT3),A LD DE,CORE_BUFFERS.SECBUF+#C000 LD BC,1*256 + Dss.DRV.Read LD A,(FatBuffer.DRIVE) RST ToDSS.DRV POP AF OUT (SLOT3),A ; ;!HARDCODE 16 * 32 = 512; 32 - размер записи, 512 - размер считанного сектора LD B,16 LD HL,CORE_BUFFERS.SECBUF .check_dir_loop: LD A,(HL) OR A JP Z,.RMD15 ;DIR EMPTY CP "." JR Z,.next_record CP #E5 ;!HARDCODE байт удаления файла JR Z,.next_record LD DE,_sFAT_DIRECTORY_RECORD.ATTRIBUT ; смещ. до байта атрибутов ADD HL,DE LD A,(HL) SBC HL,DE AND FAT_ATTR.VOLUME_ID JP Z,.error ;DIR NOT EMPTY .next_record: LD DE,#0020 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 ; [ ] fat32 POP HL ; номер кластера CALL READ_FROM_FAT ; прочитать из кеша FAT-а номер след. кластера EX DE,HL ; hl=номер след. кластера JR NC,.RMD17 ; не конец цепочки .delete: POP IX JP DEL_FN.DELETE ; пометить запись как "удаленная" .RMD15: POP IX POP HL POP AF POP HL JR .delete ; .error: POP IX POP HL POP AF POP HL POP IX LD A,DSS_Error.sys.DIR_NOT_EMPTY SCF RET ;