diff --git a/DSS/API/Attribute.asm b/DSS/API/Attribute.asm index a26b780..a973978 100644 --- a/DSS/API/Attribute.asm +++ b/DSS/API/Attribute.asm @@ -35,49 +35,55 @@ ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 ;LD A,B ; RET + ; +.B_1: DJNZ .B_2 + ; +.WRITE_FN: AND FAT_ATTR.NoVolID ; [x] 2/12/23 фикс для volume ID +.WRITE: PUSH AF + XOR A + ;!TEST ;[x] 16/11/23 optimize get attribute + LD (OPEN_FN.TMP),A + ; + CALL .OPENATR ;R002 + ;!TEST ;[x] 16/11/23 optimize get attribute + CALL NC,OPEN_FN.FM + ; + POP BC + RET C + SET 7,(IY+_sFM.ACCESS_MODE) + ;RES 3,B ;CLEAR LABEL ATTR ;R003 + LD (IY+_sFM.FS_REC.ATTRIBUT),B + PUSH BC + CALL CLOSE_FN +.error: POP BC + RET C + LD A,B + RET + ;R002 +; выход: если CF = 0, то DE = record index +;!TEST 9/11/23 record index +.OPENATR: ;!TEST ;[x] 16/11/23 optimize get attribute + ;LD (OPEN.TMP),A ; раб. ячейка (здесь атрибут записи) + ; + CALL GETWORD ; тест на допуст. имя и настр. на диск + RET C + CALL MASK + RET C + LD A,FAT_ATTR.NoVolID + ;!TEST ;[x] 16/11/23 optimize get attribute + JP SEARCH.Custom + ;CALL SEARCH.Custom + ;RET C ; запись не найдена + ;JP OPEN.FM ; на поиск своб. дескриптора + ; + ; + ; [ ] ; !TODO для команды LABEL в Shell + ; 1. проверить что в HL указана только метка в кавычках + ; 2. если метка без недопустимых символов, то делаем её не + ; только в BPB, но и на корневом разделе, иначе удаляем на корневом + ; 3. открываем требуемый диск через .force, чтоб сбросить кэши +.B_2: DJNZ .error_fn ; .error_fn: LD A,DSS_Error.sys.INVALID_FUNCTION SCF - RET - ; -.B_1: DJNZ .error_fn -.WRITE_FN: - AND FAT_ATTR.NoVolID ; [x] 2/12/23 временный фикс для volume ID -.WRITE: PUSH AF - XOR A - ;!TEST ;[x] 16/11/23 optimize get attribute - LD (OPEN_FN.TMP),A - ; - CALL .OPENATR ;R002 - ;!TEST ;[x] 16/11/23 optimize get attribute - CALL NC,OPEN_FN.FM - ; - POP BC - RET C - SET 7,(IY+_sFM.ACCESS_MODE) - RES 3,B ;CLEAR LABEL ATTR ;R003 ;!HARDCODE attribute bit - LD (IY+_sFM.FS_REC.ATTRIBUT),B - PUSH BC - CALL CLOSE_FN -.error: POP BC - RET C - LD A,B - RET -;R002 -.OPENATR: - ;!TEST ;[x] 16/11/23 optimize get attribute - ;LD (OPEN.TMP),A ; раб. ячейка (здесь атрибут записи) - ; - CALL GETWORD ; тест на допуст. имя и настр. на диск - RET C - CALL MASK - RET C - LD A,FAT_ATTR.NoVolID - ;!TEST ;[x] 16/11/23 optimize get attribute - JP SEARCH.Custom - ;CALL SEARCH.Custom - ;RET C ; запись не найдена - ;JP OPEN.FM ; на поиск своб. дескриптора - ; - ; -;R002 \ No newline at end of file + RET \ No newline at end of file diff --git a/DSS/API/Open.asm b/DSS/API/Open.asm index 676313a..331fb20 100644 --- a/DSS/API/Open.asm +++ b/DSS/API/Open.asm @@ -28,10 +28,10 @@ OPEN_FN: ;!TEST Current Dir ;[x] 15/10/23 RET C .FILE: CALL SEARCH.File ; enter point from EXEC, CREATE RET C - ;!TEST 9/11/23 record index - PUSH DE ; сохраняем указатель на запись в каталоге FS (получен из SEARCH) -;R002 ; -.FM: CALL GET_FM ; enter point from ATTRIB +;R002 ;!TEST 9/11/23 record index +.FM: PUSH DE ; сохраняем указатель на запись в каталоге FS (получен из SEARCH) + ; + CALL GET_FM ; enter point from ATTRIB RET C LD A,C EX AF,AF' diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index b156df1..98ae456 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -9,7 +9,17 @@ ;R07 17-12-1999 DNS BUG FIX SIGNATURE #55AA AT 510 OFFSET ;--------------------------------------------------------------- ;----------------------------------------------------------------------; -MAKE_FSinfo: ; чистим сектор + +SET_FSInfo: LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) + CP FAT_TYPE.x32 + RET NZ + ; + LD A,(CORE_BUFFERS.FatBuffer.UPD_FSINFO) + OR A + RET Z + ; + ; Делаем FSInfo сектор + ; чистим сектор LD HL,CORE_BUFFERS.SECTOR_BUFFER LD DE,CORE_BUFFERS.SECTOR_BUFFER+1 LD (HL),0 @@ -28,21 +38,6 @@ MAKE_FSinfo: ; ; SECTOR_SIGNATURE LD HL,#AA55 LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.SECTOR_SIGNATURE),HL - RET -; сбрасывает значение свободных кластеров на "неопределено" -; меняет значение первого свободного кластера -SET_FSInfo: LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) - CP FAT_TYPE.x32 - RET NZ - ; - LD A,(CORE_BUFFERS.FatBuffer.UPD_FSINFO) - OR A - RET Z - ; - ;!TODO формировать самому в буфер - ;CALL READ_FSinfo - CALL MAKE_FSinfo - ; ; FREE_CLUSTERS_COUNT LD HL,(CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L) LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT),HL @@ -53,7 +48,7 @@ SET_FSInfo: LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER),HL LD HL,(G_CLUST.high) LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER+2),HL - ; + ; Пишем его на винт XOR A LD (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A JR WRITE_FSinfo diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index e881f9d..0582a6b 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -139,9 +139,6 @@ G_CLUST: ; EXX INC A LD (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A - ; [ ] free clusters for FSInfo - ; XOR A ; уменьшить - ; CALL SET_NEW_FREE_CLUSTERS RET ; Вход: A - уменьшить (0) или увеличить (!0) число свободных кластеров diff --git a/DSS/build.txt b/DSS/build.txt index 37944e4..fbee9e3 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -981 \ No newline at end of file +982 \ No newline at end of file diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index 96333c2..ac3c70e 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -411,7 +411,7 @@ toNumber: ld c,#2F MAKE_LN_32: CALL MAKE_LN ld hl,L32BIT_ ; "0000000000" JR MAKE_LN_Clean - ; +; десятичный 40-а разрядный вывод MAKE_LN_40: CALL MAKE_LN.skip_1 ld hl,L40BIT_ ; "0000000000" ; @@ -429,7 +429,7 @@ MAKE_LN_Clean: ld de,#2030 ; " ","0" ret nz ld (hl),e ret - +; десятичный 32-х разрядный вывод MAKE_LN: ld ix,L32BIT_ ; "0000000000" exx ld de,#3B9A @@ -668,13 +668,6 @@ read_disk_info: OR #80 LD L,(HL) LD H,A call hex16 - ; - - ; Метка диска - ; ld a,(disk) ; номер диска - ; cp 2 ; меньше "C:" ? - ; jr nc,get_inf_data1 ; метка в BPB - .get_label: ; ищем метку в корне ФС раздела ; уст. корень диска ld hl,root_path ; "x:\",0 @@ -774,27 +767,9 @@ cmd_dir_options:; [ ] ; cmd_dir_freeSpace: - ;PUSH DE - ;PUSH BC - ; затираем найденый ключ - ; ld A,'/' - ; ex de,hl - ; ld bc,4 - ; CPDR - ; inc hl - ; ld (hl),' ' - ; inc hl - ; ld (hl),' ' - ; ; ставим опцию для API DSS DskInfo ld a,1 ld (read_disk_info.full),a - ; ; выводим строку о расчёте свободного места так, чтоб она затёрлась - ; LD DE,MAIN_MSG.CALCULATING - ; CALL MESSAGE - ; возвращаемся в цикл - ;POP BC - ;POP DE jp cmd_dir.parse ; cmd_dir_pause: ld a,#ff @@ -853,38 +828,14 @@ PRINT_5BYTES: ld ix,L40BIT_ ; "00" CALL GET_BIG_DIG ; ; DE':DE = 100,000,000 - ; HL':HL ещё нужны - ; PUSH HL - ; LD HL,L40BIT_ -; LD B,3 ;!HARDCODE 2 знака -; .loop: LD A,(HL) -; CP "1" -; jr nc,.exit_clean -; LD (HL)," " -; INC HL -; DJNZ .loop -;.exit_clean: POP HL CALL MAKE_LN_40 - ;JR PRINT_DWORD.skip_LN - ; -;PRINT_DWORD: call MAKE_LN ; десятичный 32-х разрядный вывод -.skip_LN: ld hl,L32BIT_.end ; "0" + ld hl,L32BIT_.end ; "0" ld a,(hl) cp " " jr nz,.not_zero ld a,"0" ld (hl),a - -.not_zero: -; ld hl,SIZE_BUFFER.high ; "0 000 000 000" -; ld b,SIZE_BUFFER.bytes - 1 -; .clean_loop: ld a,(hl) -; cp "1" -; jr nc,.exit_clean -; ld (hl)," " -; inc hl -; djnz .clean_loop - ; +.not_zero: ; .exit_clean: ld de,SIZE_BUFFER.high ; "0 000 000 000" ld hl,L40BIT_ ; "0000000000" ldi diff --git a/SHELL/EXEC.ASM b/SHELL/EXEC.ASM index a67f946..48aa538 100644 --- a/SHELL/EXEC.ASM +++ b/SHELL/EXEC.ASM @@ -97,7 +97,7 @@ RUN_EXT: ex de,hl ; ld bc,4*256 + Dss.EX_Path ; выделить расш. файла RST ToDSS ld hl,(SAVEHL) ; имя файла - jr c,RUN_EXE ; выполнить exe-файл + jr c,RUN_EXE ; выполнить exe-файл bit 1,a ; есть расш. ? jr z,.NON_EXT ; нет ; есть расш. файла diff --git a/SHELL/build.txt b/SHELL/build.txt index bbce651..2a9c18a 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -356 \ No newline at end of file +357 \ No newline at end of file