diff --git a/DSS/API/MkDir.asm b/DSS/API/MkDir.asm index c2382f8..fe08e0d 100644 --- a/DSS/API/MkDir.asm +++ b/DSS/API/MkDir.asm @@ -46,8 +46,12 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 ; CALL G_CLUST RET C - PUSH HL - ; [ ] fat32 + ; [x] fat32 + PUSH HL ; младший номер сектора + EXX + PUSH HL ; старший номер сектора + EXX + ; CALL WRITE_TO_FAT ; записать в кеш FAT-а номер кластера CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск LD HL,MASKARE @@ -55,35 +59,50 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 LD BC,11 LDIR EX DE,HL - LD A,#10 ; атрибут записи каталога + LD A,FAT_ATTR.DIRECTORY ; атрибут записи каталога + ; _sFAT_DIRECTORY_RECORD.ATTRIBUT LD (HL),A INC HL - LD BC,#0A00 ; b=счетчик + LD BC,#0800 ; 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 + ; _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H + ; [x] fat32 запись старшего номера кластера .FIRST_CLUSTER_H POP DE - PUSH DE + PUSH DE ; старший номер сектора LD (HL),E INC HL LD (HL),D INC HL + ; [ ] fat32 & VFAT + PUSH HL + CALL SYSTIME ; узнать тек. дату и время + CALL MK_TIME ; закодировать время/дату + POP HL + ; _sFAT_DIRECTORY_RECORD.TIME + LD (HL),E ; de=время + INC HL + LD (HL),D + INC HL + ; _sFAT_DIRECTORY_RECORD.DATE + LD (HL),C ; день + INC HL + LD (HL),B ; месяц + INC HL + ; запись младшего номера кластера .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 @@ -97,9 +116,9 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 .loop3: INC HL LD (HL),C DJNZ .loop3 - ; + ; скопировать байты 11..31 _sFAT_DIRECTORY_RECORD INC HL - LD DE,HANDBUF+11 ; ячейка атрибутов файла + LD DE,HANDBUF+_sFAT_DIRECTORY_RECORD.ATTRIBUT ; ячейка атрибутов файла EX DE,HL LD BC,21 LDIR @@ -118,16 +137,16 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 ; LD A,(DIRPAGE.buffer) CP "." - LD DE,DIRPAGE.buffer+11 ; атрибуты записи ;!HARDCODE + LD DE,DIRPAGE.buffer + _sFAT_DIRECTORY_RECORD.ATTRIBUT ; атрибуты записи JP Z,.MKD04 LD IX,HANDBUF XOR A - ; [ ] fat32 + ; [ ] 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 + LD BC,HANDBUF.SIZE - _sFAT_DIRECTORY_RECORD.ATTRIBUT ; 21 LDIR POP AF OUT (SLOT3),A @@ -140,7 +159,9 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 LD BC,512-65 ;!HARDCODE LDIR ; - POP HL + POP HL ; старший номер сектора + EXX + POP HL ; младший номер сектора CALL CLUSTER_TO_SECTOR LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ; секторов на кластер .MKD12: PUSH AF diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index 7c5cd3d..81d28ea 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -22,8 +22,10 @@ R_CLUST: LD HL,#0001 RET +; [x] fat32 ;!TEST ; найти первый свободный кластер ;!TODO проверить перебор кластеров -; [x] fat32 ;!TEST +; выход: HL - младший номер свободного кластера +; HL' - старший номер свободного кластера G_CLUST: ; .low+1: LD HL,#0001 .loop: INC HL ; номер кластера @@ -31,7 +33,7 @@ G_CLUST: ; OR H ; [x] fat32 EXX -.high+1: LD HL,0 +.high+1: LD HL,#0000 JR NZ,.no_inc INC HL .no_inc: EXX @@ -39,7 +41,8 @@ G_CLUST: ; CALL READ_FROM_FAT ; прочитать из кеша FAT-а номер след. кластера CP DSS_Error.sys.DISK_FULL SCF - RET Z ; ошибка ? + RET Z + ; EXX LD A,D OR E @@ -51,33 +54,54 @@ G_CLUST: ; EXX LD (G_CLUST.high),HL EXX - ; XOR A RET -; HL - CLUSTER -; [ ] fat32 +; Прикрепить к последнему кластеру цепочки новый пустой кластер +; Вход: HL':HL - номер кластера к которому прикрепить пустой +; Выход: HL':HL - номер кластера к которому прикрепился пустой +; DE':DE - номер пустого кластера +; [x] fat32 ;!TEST INC_FAT: - PUSH HL - CALL G_CLUST - POP DE - RET C + PUSH HL ; текущий кластер + EXX + PUSH HL ; текущий кластер + EXX + ; + CALL G_CLUST + ; + EXX + POP DE ; текущий кластер + EXX + POP DE ; текущий кластер + RET C + ; HL':HL - свободный кластер, DE':DE - текущий кластер ; - PUSH HL -; PUSH HL -; EX DE,HL ; hl=номер кластера -; .loop: CALL READ_FROM_FAT ; прочитать из кеша FAT-а номер след. кластера -; EX DE,HL -; JR NC,.loop ; не конец цепочки EX DE,HL -; POP DE ; номер кластера + EXX + EX DE,HL + EXX + ; CALL WRITE_TO_FAT.Custom ; записать в кеш FAT-а номер кластера ;!FIXIT <нет контроля ошибки> ; - POP HL + PUSH HL + EX DE,HL + EXX + PUSH HL + EX DE,HL + EXX + ; CALL WRITE_TO_FAT ; записать в кеш FAT-а номер кластера ;!TEST ;!TODO 2/12/23 ; [ ] баг с избыточной записью WRITE_FAT_TABLE? ;CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск ; + EXX + POP DE + EX DE,HL + EXX + POP DE + EX DE,HL + ; AND A RET ;RX01 @@ -216,10 +240,11 @@ READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER ; Записать в кеш FAT-а номер кластера ; вход: hl = младшее слово номера кластера в который записать ; hl' = старшее слово номера кластера в который записать (только для fat32) -; .Custom: ; de = младшее слово номера кластера которое вписать ; de' = старшее слово номера кластера которое вписать (только для fat32) -; выход: такой же как и вход +; выход: HL':HL такие же как и на входе +; .Custom: +; HL':HL и DE':DE такие же как и на входе ;------------------------------------------------------------------------------------------------ ; [x] fat32 ;!TEST WRITE_TO_FAT: LD DE,(FatBuffer.ENDCLUS_LOW) ; номер кластера @@ -270,7 +295,7 @@ WRITE_TO_FAT: LD DE,(FatBuffer.ENDCLUS_LOW) ; .FAT12: ;!FIXIT переделать на переменные FAT_CACHE CALL GET_FAT12_CELL POP DE ; младший номер кластера который вписать - JR C,.Correct_1 ; номер нечётный + JR C,.Correct_1 ; номер нечётный LD (HL),E INC HL LD A,(HL) @@ -280,6 +305,7 @@ WRITE_TO_FAT: LD DE,(FatBuffer.ENDCLUS_LOW) ; JR .exit ; .Correct_1: ; влево на 4 битa + PUSH DE EX DE,HL ADD HL,HL ADD HL,HL @@ -293,6 +319,7 @@ WRITE_TO_FAT: LD DE,(FatBuffer.ENDCLUS_LOW) ; LD (HL),A ; сохр. в кеше FAT-а INC HL ; номер кластера LD (HL),D + POP DE JR .exit ; .FAT32: ; [x] fat32 ;!TEST @@ -619,7 +646,6 @@ CLUSTER_TO_SECTOR: ;LD E,A ; ADC HL,DE - ;!TODO а надо ли проверять переполнение HL:IX? RET //////////////////////////////////////////////////////////////////////// @@ -868,15 +894,15 @@ BLOK_WR: PUSH BC JR NC,.next ; end of chain - get new cluster ; [ ] fat32 - PUSH HL - EXX - PUSH HL - EXX + ; PUSH HL + ; EXX + ; PUSH HL + ; EXX CALL INC_FAT - EXX - POP HL - EXX - POP HL + ; EXX + ; POP HL + ; EXX + ; POP HL JP C,.Error_6 ; CALL READ_FROM_FAT @@ -957,11 +983,11 @@ BLOK_WR: PUSH BC PUSH BC CALL READ_FROM_FAT JR NC,.WR9 - PUSH HL + ;PUSH HL CALL INC_FAT - POP HL + ;POP HL JR C,.ErrorFull - CALL READ_FROM_FAT + ;CALL READ_FROM_FAT .WR9: POP BC EX DE,HL PUSH HL diff --git a/DSS/build.txt b/DSS/build.txt index 0c8ddea..5a30e5a 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -955 \ No newline at end of file +947 \ No newline at end of file