diff --git a/.tmp/disasm.list b/.tmp/disasm.list new file mode 100644 index 0000000..e69de29 diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index 3258ee4..fa31c5a 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -16,11 +16,6 @@ ; BIOS 3.06 загружает один сектор загрузчика и передаёт ему управление. - ; 0 - оригинальный вариант запуска DSS, 1 - вариант Саймана - DEFINE ORIGINAL_DSS 0 - ; 1 - будет грузить версию Саймана и основную. 0 - только основную. - DEFINE UNIVERSAL_BOOT 1 - ;------------------------------------------------------------------------------ ORG_ADDRESS EQU #8000 MAX_SECTORS_PER_PAGE EQU #20 ;максимальное кол-во секторов в странице ;!TODO а если сектор больше 512? diff --git a/DSS/API/Rename.asm b/DSS/API/Rename.asm index d3d1af3..33e703d 100644 --- a/DSS/API/Rename.asm +++ b/DSS/API/Rename.asm @@ -64,7 +64,7 @@ RENAME: ; Current Dir 15/10/23 LD BC,11 LDIR ; - CALL DELETE_LFN_RECORDS ; [ ] удаление записи LFN + ;CALL DELETE_LFN_RECORDS ; [ ] удаление записи LFN ; EX AF,AF' OUT (SLOT3),A diff --git a/DSS/API/RmDir.asm b/DSS/API/RmDir.asm index 3059a1c..4228525 100644 --- a/DSS/API/RmDir.asm +++ b/DSS/API/RmDir.asm @@ -41,6 +41,7 @@ RMDIR: ; Current Dir 15/10/23 LD HL,(CORE_BUFFERS.HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) PUSH IX ;!TODO record index. возможно, что может сломаться, если больше страницы ; + ;!FIXIT ;[ ] big dir. проверять, что пустой через новый вызов Find. ;!TODO Процедура полного вычитывания каталога (все кластеры). Можно задействовать в других местах .read_dir_big_loop: PUSH HL diff --git a/DSS/FS/FAT.asm b/DSS/FS/FAT.asm index 88e92a7..70ac624 100644 --- a/DSS/FS/FAT.asm +++ b/DSS/FS/FAT.asm @@ -860,7 +860,7 @@ WRITE_DIR_HANDLE: POP DE RET ;----------------------------------------------------------------------; - ASSERT 0 "TODO!" + ASSERT 0 "TODO! GET_ADDR_IN_DIR_CACHE" ;!TODO ; .DIRSIZE помешает если в кэш будет другая страница? ; LOAD_SAVE_DIR_PREPARE возможно не нужен, нужно только установить правильное смещение в FM @@ -896,6 +896,7 @@ SAVEDIR: ;!TODO optimize OUT (SLOT3),A RET ; + ; FAT12-16 .SaveRootDir: LD HL,(CORE_BUFFERS.FS_Buffer.RootDirFirstSector_H) ;!TODO возможно, хватит LD HL,0 LD IX,(CORE_BUFFERS.FS_Buffer.RootDirFirstSector_L) LD A,(CORE_BUFFERS.FS_Buffer.DirSizeInSectors) @@ -1453,12 +1454,36 @@ FS_Buffer: ; FAT_X 12-16-32 ;███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████; + +; Вход: IX - указатель на номер записи в каталоге +; Выход: HL - смещение в SLOT3 на запись в каталоге +GET_ADDR_IN_DIR_CACHE: + LD A,3 + PUSH IX + POP HL + RR H + ; + RR L + RRA + RR L + RRA + RR L + RRA + LD H,L + LD L,A + LD A,H + OR #C0 + LD H,A + RET + + ; Удаляет запись в каталоге и освобождает занятую цепочку кластеров ; Вход: IX - указатель на удаляемую запись в DIRPAGE +; в КЭШ директории должна быть загружена часть с нужной записью ;!TODO record index. возможно, что может сломаться, если больше страницы DELETE_REC_FAT: SET_PAGE_X DIRPAGE EX AF,AF' - CALL DELETE_LFN_RECORDS ; [ ] big dir ; [x] удаление записи LFN + ;CALL DELETE_LFN_RECORDS ; [ ] big dir ; [x] удаление записи LFN LD (IX + FAT_DIRECTORY_RECORD.NAME),#E5 ; признак удаления файла ; fat32 LD L,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) ; № первого кластера diff --git a/SHELL/Commands/REN.ASM b/SHELL/Commands/REN.ASM index 4e6c82f..5914229 100644 --- a/SHELL/Commands/REN.ASM +++ b/SHELL/Commands/REN.ASM @@ -3,17 +3,19 @@ ; REN, RENAME. Переименовать файл ; ;/////////////////////////////////////////////////// -cmd_rename: - ex de,hl - ld de,Buffers.work.buffer1; - ld c,Dss.GSwitch - RST ToDSS - ld de,Buffers.work.buffer+256; - ld c,Dss.GSwitch - RST ToDSS - ld hl,Buffers.work.buffer1; - ld de,Buffers.work.buffer+256; - ld c,Dss.Rename - RST ToDSS - call c,print_err_message ; вывод сообщения - ret +cmd_rename: EX DE,HL + LD DE,Buffers.work.buffer1; + LD C,Dss.GSwitch + RST ToDSS + ; + LD DE,Buffers.work.buffer + 256; + LD C,Dss.GSwitch + RST ToDSS + ; + LD HL,Buffers.work.buffer1; + LD DE,Buffers.work.buffer + 256; + LD C,Dss.Rename + RST ToDSS + ; + CALL C,print_err_message ; вывод сообщения + RET diff --git a/TMP_CODE.ASM b/TMP_CODE.ASM index cda401f..9c287be 100644 --- a/TMP_CODE.ASM +++ b/TMP_CODE.ASM @@ -263,6 +263,45 @@ LOAD_SAVE_DIR_PREPARE: #1FFFE0 & #1FC000 смещение на нужный блок по #4000 байтов #1FFFE0 & #3FFF Адрес нужной позиции в кэш (#1FFFE0 & #1FC000)<<2 двигаем байт 2 и 3 чтоб получить номер блока + + 3025 + #0BD1 номер записи + #017A20 смещение на запись в файле директории + #017A20 & #1FC000 = #014000 смещение на нужный блок по #4000 байтов + #017A20 & #3FFF = #3A20 Адрес нужной позиции в кэш + (#017A20 & #1FC000)<<2 = #50000 двигаем байт 2 и 3 чтоб получить номер блока + + 1011 1101 0001 + + 0001 1101 0001 + 0000 1110 1000 1000 + 0000 0111 0100 0100 + 0000 0011 1010 0010 + A E + 00000001 11010001 + + 10000000 11101000 + 01000000 01110100 + 00100000 00111010 + + 0010 0000 0011 1010 + E A + 0011 1010 0010 0000 + + 0001 0111 1010 0010 0000 + 0000 0011 1010 0010 0000 + 0001 0100 0000 0000 0000 + + XOR A + PUSH IX + POP DE + RR D + ; + RR E + RRA + RR E + RRA + RR E + RRA */ ;----------------------------------------------------------------------;