//////////////////////////////////////////////////////////////////////// ; Функция #1B. Создание каталога. ; ; вход: HL - указатель на имя каталога ; выход: A - код ошибки, если CF=1 ; ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 //////////////////////////////////////////////////////////////////////// ;error MKDIR.DIR_EXISTS: LD A,DSS_Error.sys.DIR_EXISTS CCF RET MKDIR: ;!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 POP AF RET ; .START: CALL GETWORD ; тест на допуст. имя и настр. на диск RET C ;LD HL,TMPNAME ; 8.3 имя ;LD DE,MASKARE ; буфер имени 11 симв. формата CALL MASK ; преобр. имя 8.3 -> 11 формат RET C ;!TEST optimization ранее GETWORD уже загрузил директорию ;CALL LOADDIR ; прочитать список каталога ; CALL SEARCH.Dir ; поиск записи каталога в списке диска ; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024 ; LD A,DSS_Error.sys.DIR_EXISTS ; CCF ; RET C ; каталог найден JR NC,.DIR_EXISTS CP DSS_Error.sys.FILE_NOT_FOUND SCF RET NZ ; CALL G_CLUST RET C PUSH HL ; [ ] fat32 LD DE,(FatBuffer.ENDCLUS_LOW) ; номер кластера CALL WRITE_TO_FAT ; записать в кеш FAT-а номер кластера CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск LD HL,MASKARE LD DE,HANDBUF LD BC,11 LDIR EX DE,HL LD A,#10 ; атрибут записи каталога LD (HL),A INC HL LD BC,#0A00 ; b=счетчик ; .loop1: LD (HL),C INC HL DJNZ .loop1 ; PUSH HL CALL SYSTIME ; узнать тек. дату и время CALL MK_TIME ; закодировать время/дату POP HL LD (HL),E ; de=время INC HL LD (HL),D INC HL LD (HL),C ; день INC HL LD (HL),B ; месяц INC HL POP DE PUSH DE LD (HL),E INC HL LD (HL),D INC HL LD BC,#0400 ; b=счетчик ; .loop2: LD (HL),C INC HL DJNZ .loop2 ; CALL WRT_HND ; скопир. новую запись в список диска (каталога) ;CALL SAVEDIR ; и сбросить кеш каталога на диск LD HL,CORE_BUFFERS.SECBUF ; буфер LD (HL),"." ; запись тек. каталога LD BC,10*256 + ' ' ; !HARDCODE b=счетчик, c=пробел ; .loop3: INC HL LD (HL),C DJNZ .loop3 ; INC HL LD DE,HANDBUF+11 ; ячейка атрибутов файла EX DE,HL LD BC,21 LDIR EX DE,HL LD (HL),"." ; запись родит. каталога INC HL LD (HL),"." LD BC,9*256 + ' ' ; b=счетчик, c=пробел .MKD03: INC HL LD (HL),C DJNZ .MKD03 ; INC HL SET_PAGE_X DIRPAGE PUSH AF ; LD A,(DIRPAGE.buffer) CP "." LD DE,DIRPAGE.buffer+11 ; атрибуты записи ;!HARDCODE JP Z,.MKD04 LD IX,HANDBUF XOR A ; [ ] fat32 LD (IX+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L),A LD (IX+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1),A LD DE,HANDBUF + _sFAT_DIRECTORY_RECORD.ATTRIBUT ; ячейка атрибутов файла .MKD04: EX DE,HL LD BC,HANDBUF.SIZE - _sFAT_DIRECTORY_RECORD.ATTRIBUT LDIR POP AF OUT (SLOT3),A ; EX DE,HL LD D,H LD E,L INC DE LD (HL),0 LD BC,512-65 ;!HARDCODE LDIR ; POP HL CALL NSECTOR LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ; секторов на кластер .MKD12: PUSH AF PUSH HL ; ст. разряд PUSH IX ; номер лог. сектора IN A,(SLOT3) PUSH AF IN A,(SLOT0) OUT (SLOT3),A ; LD A,(FatBuffer.DRIVE) LD DE,CORE_BUFFERS.SECBUF+#C000 LD BC,1*256 + Dss.DRV.Write RST ToDSS.DRV ; POP AF OUT (SLOT3),A ; LD HL,CORE_BUFFERS.SECBUF LD DE,CORE_BUFFERS.SECBUF+1 LD BC,511 LD (HL),0 LDIR ; POP IX POP HL INC IX LD A,XH OR XL JR NZ,.MKD11 INC HL .MKD11 POP AF DEC A JR NZ,.MKD12 AND A RET ;