From 4b564101d163b3d4d60f92d22515e38f84381a04 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 29 May 2024 01:10:05 +1000 Subject: [PATCH] =?UTF-8?q?[Core]=20DISKINF:=20=20=D0=9C=D0=B5=D1=82=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=B4=D0=B8=D1=81=D0=BA=D0=B0=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D1=8F=D0=B5=D1=82=D1=81=D1=8F=20=D1=81=D0=BD?= =?UTF-8?q?=D0=B0=D1=87=D0=B0=D0=BB=D0=B0=20=D0=B2=20=D0=BA=D0=BE=D1=80?= =?UTF-8?q?=D0=BD=D0=B5=D0=B2=D0=BE=D0=BC=20=D0=BA=D0=B0=D1=82=D0=B0=D0=BB?= =?UTF-8?q?=D0=BE=D0=B3=D0=B5=20=D0=B8=20=D0=B5=D1=81=D0=BB=D0=B8=20=D1=82?= =?UTF-8?q?=D0=B0=D0=BC=20=D0=BD=D0=B5=D1=82,=20=D1=82=D0=BE=20=D0=B1?= =?UTF-8?q?=D0=B5=D1=80=D1=91=D1=82=D1=81=D1=8F=20=D0=BC=D0=B5=D1=82=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=B8=D0=B7=20BPB.=20[Shell]=20=D0=9C=D0=B5=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B1=D0=B5=D1=80=D1=91=D1=82=D1=81=D1=8F=20?= =?UTF-8?q?=D1=82=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE=20=D0=B8=D0=B7=20=D1=84?= =?UTF-8?q?=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B8=20DISKINF.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/API/diskINF.asm | 25 ++++++++++++++++---- SHELL/BATCH.ASM | 13 ++++------- SHELL/Commands/BREAK.ASM | 4 ---- SHELL/Commands/CLS.ASM | 2 +- SHELL/Commands/DIR.ASM | 48 ++++----------------------------------- SHELL/Commands/ECHO.ASM | 2 +- SHELL/EDLINE.ASM | 6 ++--- SHELL/Procedures/math.asm | 4 ++-- SHELL/SHELL.ASM | 28 +++++++++-------------- SHELL/build.txt | 2 +- 10 files changed, 49 insertions(+), 85 deletions(-) diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index 88ddc61..219ac33 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -31,6 +31,10 @@ ; BC - размер сектора в байтах ; CF=1: ; A - код ошибки, если CF=1 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Метка диска проверяется сначала в корневом каталоге и если там ; +; нет, то берётся метка из BPB ; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;///////////////////////////////////////////////////////////////////// DISKINF: LD C,B LD B,1 @@ -76,8 +80,9 @@ DISKINF: LD C,B .next_prm: LD HL,CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER LD C,4 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER CALL .mCOPY_LOOP - ; !FIXIT если метка в BPB "NO NAME" или пробелы, то проверять метку в корневом каталоге. - LD HL,CORE_BUFFERS.FatBuffer.BPB_LABEL + ; + ;LD HL,CORE_BUFFERS.FatBuffer.BPB_LABEL + CALL GET_LABEL LD C,11 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_LABEL CALL .mCOPY_LOOP ; fat32 @@ -226,6 +231,18 @@ GetFreeSpace: LD A,1 EXX JP .loop_free_space ; - FAT_STRING: DB 'FAT12' -; \ No newline at end of file +; +; DE - буфер +GET_LABEL: PUSH DE + LD HL,.LABEL_MASK ; "\*.*" имя метки + LD A,FAT_ATTR.VOLUME_ID ; атрибут метки тома + LD BC,Dss.F_First.FATname ; f_first, формат 11 + RST ToDSS + POP DE + LD HL,CORE_BUFFERS.FatBuffer.BPB_LABEL + RET C + LD HL,BUFFER_FIND.REC_Name + ADD HL,DE + RET +.LABEL_MASK: DB '\*.*',0 \ No newline at end of file diff --git a/SHELL/BATCH.ASM b/SHELL/BATCH.ASM index daa71d8..4392518 100644 --- a/SHELL/BATCH.ASM +++ b/SHELL/BATCH.ASM @@ -134,11 +134,6 @@ BATCH: ld de,Buffers.input_line.Path + .shell.size - 1 call copy_string ; - ; ld c,Dss.CurDisk - ; rst ToDSS - ; add a,'A' - ; ld (.shell),a - ; ld hl,Buffers.input_line.Path ld bc,Dss.Exec RST ToDSS @@ -161,10 +156,10 @@ BATCH: .shell.size EQU $ - .shell ;!TODO -.ErrorEnv: DB 'ERRORLEVEL=' -.ErrorEnv.Code: DB 'xxx',0 -.ErrorEnv.Size EQU $ - .ErrorEnv - ; + ; .ErrorEnv: DB 'ERRORLEVEL=' + ; .ErrorEnv.Code: DB 'xxx',0 + ; .ErrorEnv.Size EQU $ - .ErrorEnv +; ;--------------------------------------------------- ; Выполнение команд BAT-файла diff --git a/SHELL/Commands/BREAK.ASM b/SHELL/Commands/BREAK.ASM index 673fcec..55e7b69 100644 --- a/SHELL/Commands/BREAK.ASM +++ b/SHELL/Commands/BREAK.ASM @@ -1,9 +1,5 @@ ; [x] 11/12/23 cmd_break: - ; pop hl ; восстановление баланса стека - ; pop hl ; восстановление баланса стека - ; XOR A - ; ld (MOVWORD.count),a .sp+1: LD SP,0 ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat .exit: ld a,(BAT_FM) ; дескр. bat-файла diff --git a/SHELL/Commands/CLS.ASM b/SHELL/Commands/CLS.ASM index 2fe52b7..11e9c0c 100644 --- a/SHELL/Commands/CLS.ASM +++ b/SHELL/Commands/CLS.ASM @@ -54,7 +54,7 @@ ascii2byte: cp "0" ret c cp "9"+1 - jr c,$+10 + jr c,$+10 ;!FIXIT $ and 5Fh cp "F"+1 ccf diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index 2375026..f1fcd6a 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -1,7 +1,6 @@ ;/////////////////////////////////////////////////// ; ; DIR. Вывод списка файлов и папок -; !TODO убрать баг если в параметре маски указан путь до папки или даже до другого диска ;/////////////////////////////////////////////////// cmd_dir: push de ;;;; [ ] поддержка параметров @@ -22,7 +21,7 @@ cmd_dir: push de jr z,.skip LD DE,MAIN_MSG.CALCULATING CALL MESSAGE - ;!TEST 23/05/24 + ; 23/05/24 .skip: ;LD C,Dss.CurDisk ; узнать тек. диск ;RST ToDSS ;CALL read_disk_info ; прочитать метку и серийный номер диска @@ -41,21 +40,11 @@ cmd_dir: push de ld de,Buffers.work.buffer1 ld c,Dss.GSwitch ; выделить параметр ком-строки RST ToDSS - ;!TODO тут в Buffers.work.buffer1 лежит путь и/или/либо маска файла - ; надо разобрать её Dss.EX_Path выделить если есть диск, путь и маску, после чего уже - ; отпечатывать путь в шапке, узнавать CurDisk как в .skip выше. Делать это до вызова - ; процедуры read_disk_info. Лучше делать это после метки .skip ; ld a,(Buffers.work.buffer1) or a ;jr nz,.SkipMask ; задана маска имён jr z,.NoSkipMask ; не задана маска имён - ; сохранить текущий путь в Buffers.work.buffer2 - ; Из буфера DE запомнить маску (первые справа символы после первого справа '\') и убрать её - ; если маски нет и последний в строке '\', то потом добавить маску как в "; добавление маски" - ; сделать CD в директорию из буфера DE - ; make_short_path - ; ld hl,Buffers.work.buffer1 ld bc,Dss.EX_Path.GET_ALL rst ToDSS @@ -111,7 +100,7 @@ cmd_dir: push de .NoSkipMask: ld hl,mask_fname ; "*.*" ld de,Buffers.work.free call copy_string - ; !TEST 23/05/24 + ; 23/05/24 .SkipMask: LD C,Dss.CurDisk ; узнать тек. диск RST ToDSS CALL read_disk_info ; прочитать метку и серийный номер диска @@ -409,8 +398,6 @@ PRNSIZE: ld a,(ix+32) .PRZ: ld de,PRM3 ; 16 буфер jp ncopy_string ; скопир. строку (с нулем), макс.15 симв. - - ; Скопировать в буфер дату файла/папки PRNDATE: ld c,(ix+FAT_DIRECTORY_RECORD.DATE) ld b,(ix+FAT_DIRECTORY_RECORD.DATE+1) @@ -419,10 +406,6 @@ PRNDATE: ld c,(ix+FAT_DIRECTORY_RECORD.DATE) ld (hl),0 ld hl,SIZE_BUFFER.low ; "0 000 000 000" ld de,PRM4 ; 16 куда - ; ld a,(hl) - ; cp "0" - ; jr nz,$+4 - ; ld (hl)," " jp ncopy_string ; скопир. строку (с нулем), макс.15 симв. ; Скопировать в буфер время файла/папки @@ -433,10 +416,6 @@ PRNTIME: ld b,(ix+22) ld (hl),0 ld hl,SIZE_BUFFER.low ; "0 000 000 000" ld de,PRM5 ; 80 буфер строки - ; ld a,(hl) - ; cp "0" - ; jr nz,$+4 - ; ld (hl)," " jp ncopy_string ; скопир. строку (с нулем), макс.15 симв. ; в буфер время файла/папки @@ -740,26 +719,9 @@ read_disk_info: OR #80 LD L,(HL) LD H,A call hex16 -.get_label: ; ищем метку в корне ФС раздела - ; уст. корень диска - ; ld hl,root_path ; "x:\",0 - ; ld c,Dss.ChDir - ; RST ToDSS - ; поиск метки - ;ld hl,mask_fname ; "*.*" имя метки - ld hl,SlashMaskFname ; "\*.*" имя метки - ld de,Buffers.work.buffer1 ; куда - ld a,FAT_ATTR.VOLUME_ID ; атрибут метки тома - ld bc,Dss.F_First.FATname ; f_first, формат 11 - RST ToDSS - ;push af - ;call restore_path ; восст. тек. путь - ;pop af - ld hl,Buffers.work.buffer1 + BUFFER_FIND.REC_Name ; начало метки в буфере f_first - jr nc,volume_label ; метка в корневом каталоге - ; берём метку из BPB - ; тут в HL длина поля "Метка диска" - POP hl + ; +.get_label: ; тут в HL длина поля "Метка диска" + POP HL LD A,(HL) INC HL AND A diff --git a/SHELL/Commands/ECHO.ASM b/SHELL/Commands/ECHO.ASM index 5828524..7fc3418 100644 --- a/SHELL/Commands/ECHO.ASM +++ b/SHELL/Commands/ECHO.ASM @@ -33,7 +33,7 @@ A8623: ld c,Dss.PChars A862E: ld a,(echo_mode) ; флаг echo-режима or a ld de,7 ; индекс "on" - jr nz,$+5 ; false + jr nz,$+5 ; false ;!FIXIT $ ld de,MAIN_MSG.OFF ; индекс "off" call FMESAGE ; найти строку по индексу ld de,PRM1 ; куда (аргумент %1) diff --git a/SHELL/EDLINE.ASM b/SHELL/EDLINE.ASM index b3aac17..e22a51a 100644 --- a/SHELL/EDLINE.ASM +++ b/SHELL/EDLINE.ASM @@ -295,10 +295,10 @@ Enter: pop hl ; ; убрать конц. пробелы ком-строки ld a,(hl) cp c - jr nz,$+8 + jr nz,$+8 ;!FIXIT $ dec hl dec (iy+4) ; --число введ. символов - djnz $-8 + djnz $-8 ;!FIXIT $ inc hl ld (hl),d ; в конец ком-строки ld a,b @@ -894,7 +894,7 @@ hist_comp_loop: hist_comp_notequal: inc hl dec c - jr nz,$-2 ; до конца строки + jr nz,$-2 ; до конца строки ;!FIXIT $ hist_comp_next: pop de ex af,af' diff --git a/SHELL/Procedures/math.asm b/SHELL/Procedures/math.asm index 1809cf1..21ff29d 100644 --- a/SHELL/Procedures/math.asm +++ b/SHELL/Procedures/math.asm @@ -60,10 +60,10 @@ hex2dec_ascii_16bit: and a inc a sbc hl,bc - jr nc,$-3 + jr nc,$-3 ;!FIXIT $ add hl,bc cp "0" - jr z,$+6 + jr z,$+6 ;!FIXIT $ set 7,(ix+0) bit 7,(ix+0) ret z diff --git a/SHELL/SHELL.ASM b/SHELL/SHELL.ASM index 26809c2..3e0f8b4 100644 --- a/SHELL/SHELL.ASM +++ b/SHELL/SHELL.ASM @@ -290,8 +290,8 @@ set_option_flag: cp "a" jr c,setopt1 cp "z"+1 - jr nc,$+4 - and 5Fh ; a..z -> A..Z + jr nc,$+4 ;!FIXIT $ + and #5F ; a..z -> A..Z setopt1: cp "P" ; запуск шелла с отраб. autoexec.bat jr nz,setopt2 set 7,c @@ -310,10 +310,6 @@ setopt4: ld a,c ret - - - -;!TODO проверить 4 нижеидущие процедуры когда в DSS будут нормально пути запоминаться ; Сохранить тек. диск и путь ;GETPATH: Get_Path: @@ -328,31 +324,29 @@ Get_Path: ld (Buffers.screen_path),a ; 33 строка экранного пути ret - ;!FIXIT убрать лишние вызовы + ; Восстановить тек. диск и путь (после ошибки) + IFUSED restore_disk_path + ASSERT restore_path restore_disk_path: ; уст. тек. диск ld a,(Buffers.screen_path) ; 33 строка экранного пути sub "A" ld c,Dss.ChDisk RST ToDSS + ENDIF - ;!FIXIT убрать лишние вызовы + IFUSED restore_path restore_path: ; уст. тек. каталог ld hl,Buffers.sys_path ; 256 буфер сист. пути ld c,Dss.ChDir - RST ToDSS + JP ToDSS ret + ENDIF +; -; на новую строку ;!FIXIT сделать через .PChars -; newline: ld a,_cc.cr -; ld c,Dss.PutChar -; rst ToDSS -; ld a,_cc.lf -; ld c,Dss.PutChar -; jp ToDSS newline: push hl ld hl,MAIN_MSG.TABLE+1 ; "CR,LF,0" ld c,Dss.PChars @@ -387,7 +381,7 @@ ncopy_string: ldi ret po or a - jr nz,$-5 + jr nz,$-5 ;!FIXIT $ ret ; Скопир. строку (с нулем) diff --git a/SHELL/build.txt b/SHELL/build.txt index cbafdca..50b04df 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -393 \ No newline at end of file +402 \ No newline at end of file