//////////////////////////////////////////////////////////////////////// ; Функция #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 LD HL,(HANDBUF+_sFM.ST_CLUSTER) PUSH IX .RMD17: PUSH HL CALL NSECTOR LD A,(CORE_BUFFERS.BootSector.S_P_C) .RMD12: 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 LD B,16 ;!HARDCODE 16 * 32 = 512; 32 - размер записи, 512 - размер считанного сектора LD HL,CORE_BUFFERS.SECBUF .RMD10: LD A,(HL) OR A JP Z,.RMD15 ;DIR EMPTY CP "." JR Z,.RMD14 CP #E5 ;!HARDCODE байт удаления файла JR Z,.RMD14 LD DE,11 ;!HARDCODE смещ. до байта атрибутов ADD HL,DE LD A,(HL) SBC HL,DE ;BIT 3,A AND %0000'1000 JP Z,.error ;DIR NOT EMPTY .RMD14: LD DE,#0020 ADD HL,DE DJNZ .RMD10 POP IX POP HL INC IX LD A,XH OR XL JR NZ,.RMD11 INC HL .RMD11: POP AF DEC A JR NZ,.RMD12 POP HL ; номер кластера CALL R_F_FAT ; прочитать из кеша FAT-а номер след. кластера EX DE,HL ; hl=номер след. кластера JR NC,.RMD17 ; не конец цепочки .RMD18: POP IX JP DEL_FN.DELETE ; пометить запись как "удаленная" .RMD15: POP IX POP HL POP AF POP HL JR .RMD18 .error: POP IX POP HL POP AF POP HL POP IX LD A,DSS_Error.sys.DIR_NOT_EMPTY SCF RET ;