//////////////////////////////////////////////////////////////////////// ; Функция #1B. Создание каталога. ; ; вход: HL - указатель на имя каталога ; выход: A - код ошибки, если CF=1 ; ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 //////////////////////////////////////////////////////////////////////// MKDIR: ;error .DIR_EXISTS: LD A,DSS_Error.sys.DIR_EXISTS CCF RET ; ; Entry point .B: PUSH HL CALL DIR_PATH_CHECK POP HL RET C CALL .START PUSH AF ;Current Dir LD HL,CORE_BUFFERS.CurrentDirectory CALL CHDIR 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 ;!TEST optimization ранее SetPath_GetName уже загрузил директорию ;CALL LOADDIR ; прочитать список каталога ; ;[ ] cdfs 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 ; fat32 PUSH HL ; младший номер сектора EXX PUSH HL ; старший номер сектора EXX ; XOR A ; уменьшить CALL SET_NEW_FREE_CLUSTERS ; [ ] free clusters for FSInfo ; CALL WRITE_TO_FAT ; записать в кеш FAT-а номер кластера CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск LD HL,CORE_BUFFERS.MASKARE LD DE,CORE_BUFFERS.HANDBUF LD BC,11 LDIR EX DE,HL LD A,FAT_ATTR.DIRECTORY ; атрибут записи каталога ; FAT_DIRECTORY_RECORD.ATTRIBUT LD (HL),A INC HL LD BC,#0800 ; b=счетчик ; .loop1: LD (HL),C INC HL DJNZ .loop1 ; FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H ; fat32 запись старшего номера кластера .FIRST_CLUSTER_H POP DE PUSH DE ; старший номер сектора LD (HL),E INC HL LD (HL),D INC HL ; CALL WRITE_DATE_TIME_FOR_DIRECTORY_RECORD ; запись младшего номера кластера .FIRST_CLUSTER_L POP BC ; старший номер сектора POP DE ; младший номер сектора PUSH DE PUSH BC ; FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L LD (HL),E INC HL LD (HL),D INC HL ; FAT_DIRECTORY_RECORD.F_SIZE LD BC,#0400 ; b=счетчик .loop2: LD (HL),C INC HL DJNZ .loop2 ; [ ] big dir передавать откуда и сколько байтов изменилось в кэш, чтоб не писать на диск лишнего CALL WRITE_DIR_HANDLE ; скопир. новую запись в список диска (каталога) ;CALL SAVEDIR ; и сбросить кеш каталога на диск ; ; создаём служебные каталоги "." и ".." в созданном каталоге ; КАТАЛОГ "." LD HL,CORE_BUFFERS.SECTOR_BUFFER ; буфер LD (HL),"." ; запись тек. каталога LD BC,10*256 + ' ' ; !HARDCODE b=счетчик, c=пробел ; .loop3: INC HL LD (HL),C DJNZ .loop3 ; скопировать байты 11..31 FAT_DIRECTORY_RECORD INC HL LD DE,CORE_BUFFERS.HANDBUF+FAT_DIRECTORY_RECORD.ATTRIBUT ; ячейка атрибутов файла EX DE,HL LD BC,21 ; !HARDCODE LDIR ; КАТАЛОГ ".." EX DE,HL LD (HL),"." ; запись родит. каталога INC HL LD (HL),"." LD BC,9*256 + ' ' ; b=счетчик, c=пробел .loop4: INC HL LD (HL),C DJNZ .loop4 ; INC HL SET_PAGE_X DIRPAGE PUSH AF ; LD DE,DIRPAGE.buffer + FAT_DIRECTORY_RECORD.ATTRIBUT ; атрибуты записи ; LD A,(DIRPAGE.buffer) CP "." JR Z,.copy_dir_record ; ;LD IX,HANDBUF XOR A LD (CORE_BUFFERS.HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L),A LD (CORE_BUFFERS.HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1),A LD (CORE_BUFFERS.HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H),A LD (CORE_BUFFERS.HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1),A LD DE,CORE_BUFFERS.HANDBUF + FAT_DIRECTORY_RECORD.ATTRIBUT ; ячейка атрибутов файла .copy_dir_record: EX DE,HL LD BC,CORE_BUFFERS.HANDBUF.SIZE - FAT_DIRECTORY_RECORD.ATTRIBUT ; 21 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 ;!FIXIT ; [ ] sector size LDIR ; POP HL ; старший номер сектора EXX POP HL ; младший номер сектора CALL CLUSTER_TO_SECTOR LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster) ; секторов на кластер .MKD12: PUSH AF PUSH HL ; ст. разряд PUSH IX ; номер лог. сектора ; CALL WRITE_SECTOR ; !FIXIT нет проверки на ошибку ; LD HL,CORE_BUFFERS.SECTOR_BUFFER ; [x] optimization LD A,(HL) OR A JR Z,.skip_clean ; LD DE,CORE_BUFFERS.SECTOR_BUFFER+1 LD BC,511 ;!HARDCODE ;!FIXIT ; [ ] sector size LD (HL),0 LDIR .skip_clean: ; 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 ;