; [x] fat32 ;!TEST //////////////////////////////////////////////////////////////////////// ; Функция #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 ;!TEST Current Dir ;[x] 15/10/23 .B: 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 ; fat32 PUSH HL ; младший номер сектора EXX PUSH HL ; старший номер сектора EXX ; 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,FAT_ATTR.DIRECTORY ; атрибут записи каталога ; _sFAT_DIRECTORY_RECORD.ATTRIBUT LD (HL),A INC HL LD BC,#0800 ; b=счетчик ; .loop1: LD (HL),C INC HL DJNZ .loop1 ; _sFAT_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_TO_DIRECTORY_RECORD ; запись младшего номера кластера .FIRST_CLUSTER_L POP BC ; старший номер сектора POP DE ; младший номер сектора PUSH DE PUSH BC ; _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L LD (HL),E INC HL LD (HL),D INC HL ; _sFAT_DIRECTORY_RECORD.F_SIZE 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 ; скопировать байты 11..31 _sFAT_DIRECTORY_RECORD INC HL LD DE,HANDBUF+_sFAT_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 + _sFAT_DIRECTORY_RECORD.ATTRIBUT ; атрибуты записи ; LD A,(DIRPAGE.buffer) CP "." JR Z,.copy_dir_record ; ;LD IX,HANDBUF XOR A LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L),A LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1),A LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H),A LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1),A LD DE,HANDBUF + _sFAT_DIRECTORY_RECORD.ATTRIBUT ; ячейка атрибутов файла .copy_dir_record: EX DE,HL LD BC,HANDBUF.SIZE - _sFAT_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 LDIR ; POP HL ; старший номер сектора EXX POP HL ; младший номер сектора CALL CLUSTER_TO_SECTOR LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) ; секторов на кластер .MKD12: PUSH AF PUSH HL ; ст. разряд PUSH IX ; номер лог. сектора IN A,(SLOT3) PUSH AF IN A,(SLOT0) OUT (SLOT3),A ; LD A,(CORE_BUFFERS.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 ; [x] optimization LD A,(HL) OR A JR Z,.skip_clean ; LD DE,CORE_BUFFERS.SECBUF+1 LD BC,511 ;!HARDCODE 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 ;