From 9ad718d6b37d4e5e206df9cc899e060f07ed6fec Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 25 May 2024 03:17:00 +1000 Subject: [PATCH] =?UTF-8?q?SHELL:=20=D0=BF=D0=BE=D0=B4=D0=B2=D0=B8=D0=B3?= =?UTF-8?q?=D0=B0=D0=BB=20=D0=B1=D1=83=D1=84=D0=B5=D1=80=D1=8B;=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BC=D0=BC=D0=B0=D0=BD=D0=B4=D0=B0=20DIR=20=D1=82=D0=B5?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D1=8C=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0?= =?UTF-8?q?=D0=B5=D1=82=20=D1=81=20=D0=BF=D1=83=D1=82=D1=8F=D0=BC=D0=B8=20?= =?UTF-8?q?=D0=BA=D0=BE=D1=80=D1=80=D0=B5=D0=BA=D1=82=D0=BD=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SHELL/BATCH.ASM | 71 +++--- SHELL/Commands/CHDIR.ASM | 4 +- SHELL/Commands/CLS.ASM | 2 +- SHELL/Commands/DATE.ASM | 8 +- SHELL/Commands/DEL.ASM | 4 +- SHELL/Commands/DIR.ASM | 101 +++++--- SHELL/Commands/MKDIR.ASM | 4 +- SHELL/Commands/PATH.ASM | 4 +- SHELL/Commands/REN.ASM | 8 +- SHELL/Commands/RMDIR.ASM | 4 +- SHELL/Commands/SET.ASM | 4 +- SHELL/EDLINE.ASM | 461 ++++++++++++++++++------------------ SHELL/EXEC.ASM | 20 +- SHELL/Messages/main_txt.asm | 2 +- SHELL/SHELL.ASM | 112 +++++---- SHELL/build.txt | 2 +- SHELL/structures.inc | 16 +- 17 files changed, 427 insertions(+), 400 deletions(-) diff --git a/SHELL/BATCH.ASM b/SHELL/BATCH.ASM index 09f0ddc..daa71d8 100644 --- a/SHELL/BATCH.ASM +++ b/SHELL/BATCH.ASM @@ -75,9 +75,9 @@ BATCH: ; push hl ; сохр. имя bat-файла - ld de,work_buffer ; 512 местный буфер + ld de,Buffers.work.buffer ; 512 местный буфер call copy_string ; скопир. строку (с нулем) - ld hl,work_buffer ; 512 местный буфер + ld hl,Buffers.work.buffer ; 512 местный буфер ld de,BAT_PRM_ARRAY ; таблица указат. на "ZERO".."NINE" ld b,BAT_PRM_ARRAY.TOTAL ; число слов "ZERO".."NINE" call MAKE_BATCH_PRM_ARRAY @@ -123,15 +123,15 @@ BATCH: ret ; [x] 11/12/23 вложенные bat .new_process: - ld de,work_buffer2 + ld de,Buffers.work.buffer2 call copy_string ; ld hl,.shell - ld de,struct_input_line+5 + ld de,Buffers.input_line.Path call copy_string ; - ld hl,work_buffer2 - ld de,struct_input_line+5 + .shell.size - 1 + ld hl,Buffers.work.buffer2 + ld de,Buffers.input_line.Path + .shell.size - 1 call copy_string ; ; ld c,Dss.CurDisk @@ -139,7 +139,7 @@ BATCH: ; add a,'A' ; ld (.shell),a ; - ld hl,struct_input_line+5 + ld hl,Buffers.input_line.Path ld bc,Dss.Exec RST ToDSS ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat @@ -172,9 +172,9 @@ BATCH: NEWLINE: LD (cmd_break.sp),SP ; [x] 11/12/23 cmd_break ; - ld de,struct_input_line+5 ;!HARDCODE + ld de,Buffers.input_line.Path .ADDBAT: push de - call READBAT ; прочитать 128 байт из файла в "work_buffer1" + call READBAT ; прочитать 128 байт из файла в "Buffers.work.buffer1" pop de ;!TODO доделать тут нормальную проверку на облом с чтением файла, выводить ошибку jp c,cmd_break.exit @@ -182,11 +182,11 @@ NEWLINE: jr nz,.BATLINE ; ex de,hl - ld de,struct_input_line+5 + ld de,Buffers.input_line.Path sbc hl,de jp z,cmd_break.exit; ;[x] убран баг с незакрытым BAT-файлом ld a,l - ld (struct_input_line+4),a ; длина строки + ld (Buffers.input_line.Symbols_Num),a ; длина строки call CMDMODE ; тест на bat-команды ; ^^^^^^^ ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat @@ -200,21 +200,21 @@ NEWLINE: ; ret ; .BATLINE: - ld hl,work_buffer1 -.loop: call MOVWORD ; скопир. work_buffer1 -> struct_input_line+5 + ld hl,Buffers.work.buffer1 +.loop: call MOVWORD ; скопир. Buffers.work.buffer1 -> Buffers.input_line.Path jr c,.ADDBAT ld a,b ld (MOVWORD.count),a ; осталось пропарсить прочитанных байтов push hl ex de,hl - ld de,struct_input_line+5 + ld de,Buffers.input_line.Path sbc hl,de ld a,l - ld (struct_input_line+4),a ; длина строки + ld (Buffers.input_line.Symbols_Num),a ; длина строки call CMDMODE ; тест на bat-команды ; ^^^^^^^ ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat - ld de,struct_input_line+5 + ld de,Buffers.input_line.Path pop hl jr .loop @@ -255,7 +255,7 @@ MOVWORD: ;!TODO доделать тут нормальную проверку на облом с чтением файла, выводить ошибку RET C ;ld hl,BATBUFF ; 128 буфер (ccp.asm) "work_buffer1" - ld hl,work_buffer1 + ld hl,Buffers.work.buffer1 ld b,a ; число прочит. байт or a jr nz,.loop2 @@ -264,8 +264,7 @@ MOVWORD: ; прочитать 128 байт из файла READBAT: - ;ld hl,T99B9 ; 128 буфер под данные (ccp.asm) "work_buffer1" - ld hl,work_buffer1 + ld hl,Buffers.work.buffer1 ld de,128 ; сколько ld a,(BAT_FM) ; дескр. bat-файла ld c,Dss.Read ; чтение файла @@ -288,18 +287,18 @@ CMDMODE: call EVALCMD ; (batch.asm) ;ld ix,T96AC ; нужно?? закоментарил (inline.asm) ;ld hl,T96AE ;;256 буфер (inline.asm) - ld hl,struct_input_line+5 + ld hl,Buffers.input_line.Path ld a,(hl) cp "@" ; 40h jr nz,.A8240 dec hl - ;ld hl,struct_input_line+4;; + ;ld hl,Buffers.input_line.Symbols_Num;; dec (hl) jr z,.A825B ld c,(hl) ; длина строки inc hl ld b,0 - ;ld hl,work_buffer+256;; + ;ld hl,Buffers.work.buffer+256;; ld d,h ld e,l inc hl @@ -311,7 +310,7 @@ CMDMODE: jr z,.A825B ; off ; вывести сист. путь и строку содержимого bat-файла ;ld de,T96AE ;;256 буфер (inline.asm) - ;ld de,struct_input_line+5 + ;ld de,Buffers.input_line.Path ;call A95DE ; вывод экран. пути с ">" (inline.asm) ; вывести экран. путь и введ. команду ld c,BIOS.LP_GET_PLACE ; узнать полож. курсора @@ -322,8 +321,8 @@ CMDMODE: ld de,(YXpos) ; Y/X начало ком-строки ld c,Dss.Locate ; уст. полож. курсора RST ToDSS - ;ld hl,work_buffer+256;; - ld hl,struct_input_line+4 ; длина строки + ;ld hl,Buffers.work.buffer+256;; + ld hl,Buffers.input_line.Symbols_Num ; длина строки ld a,(hl) ld b,a inc hl ;+5 @@ -348,25 +347,25 @@ CMDMODE: ; ; ;ld a,(D96AD) ;; длина строки (inline.asm) - ;ld a,(struct_input_line+4);- + ;ld a,(Buffers.input_line.Symbols_Num);- ;or a ;ret z ;call newline ;jr A8264 ; .A825B: ;ld a,(D96AD) ;; длина строки (inline.asm) - ld a,(struct_input_line+4) + ld a,(Buffers.input_line.Symbols_Num) or a ret z ;A8264: ld hl,T96AE ;;256 буфер (inline.asm) - ;ld hl,struct_input_line+5 + ;ld hl,Buffers.input_line.Path ;dec hl ; убрать концевые пробелы строки - ld hl,struct_input_line+4 + ld hl,Buffers.input_line.Symbols_Num ld c,(hl) ; hl=длина строки (inline.asm) ld b,0 inc hl - ;ld hl,work_buffer+256;; + ;ld hl,Buffers.work.buffer+256;; .A826C: ld a,(hl) cp " " jr nz,.A8276 @@ -391,23 +390,23 @@ CMDMODE: ld c,a ; длина слова или строки ? ld hl,BATLIST ; команды bat + dos-команды ; - ; de=struct_input_line+5, c=длина строки (без конц. пробелов) + ; de=Buffers.input_line.Path, c=длина строки (без конц. пробелов) ; выполн. команду или запустить файл jp COMP.start ; должна убрать конц. пробелы и уст. длину строки, если урезалась EVALCMD: xor a - ld hl,struct_input_line+4 ;!HARDCODE + ld hl,Buffers.input_line.Symbols_Num ;!HARDCODE ld c,(hl) ld b,a inc hl add hl,bc ld (hl),a ; 0 в конец строки sbc hl,bc - ld de,work_buffer2 ; 256 буфер + ld de,Buffers.work.buffer2 ; 256 буфер call EVALSTR - ld hl,work_buffer2 ;work_buffer+256 - ld de,struct_input_line+5 ; куда + ld hl,Buffers.work.buffer2 ;work_buffer+256 + ld de,Buffers.input_line.Path ; куда ld bc,255 ;!HARDCODE .loop: ld a,(hl) ldi @@ -416,7 +415,7 @@ EVALCMD: xor a jr nz,.loop dec b ld a,b - ld (struct_input_line+4),a ; длина строки (edline.asm) + ld (Buffers.input_line.Symbols_Num),a ; длина строки (edline.asm) and a ret diff --git a/SHELL/Commands/CHDIR.ASM b/SHELL/Commands/CHDIR.ASM index 5a7a215..b1268e3 100644 --- a/SHELL/Commands/CHDIR.ASM +++ b/SHELL/Commands/CHDIR.ASM @@ -5,11 +5,11 @@ ;/////////////////////////////////////////////////// cmd_chdir: ex de,hl - ld de,work_buffer1; + ld de,Buffers.work.buffer1; ld c,Dss.GSwitch ; выделить параметр ком-строки RST ToDSS xor a - ld hl,work_buffer1; + ld hl,Buffers.work.buffer1; cp (hl) jr nz,.chdir ld (hl),"." ; ".." родит. папка diff --git a/SHELL/Commands/CLS.ASM b/SHELL/Commands/CLS.ASM index 66acef9..2fe52b7 100644 --- a/SHELL/Commands/CLS.ASM +++ b/SHELL/Commands/CLS.ASM @@ -7,7 +7,7 @@ ;/////////////////////////////////////////////////// cmd_cls: ex de,hl ; hl=ком-строка ;ld de,T9186 ; буфер под параметр - ld de,work_buffer1; + ld de,Buffers.work.buffer1; push de ld c,Dss.GSwitch ; выделить параметр ком-строки RST ToDSS diff --git a/SHELL/Commands/DATE.ASM b/SHELL/Commands/DATE.ASM index 020b7a1..b09accc 100644 --- a/SHELL/Commands/DATE.ASM +++ b/SHELL/Commands/DATE.ASM @@ -9,10 +9,10 @@ ;/////////////////////////////////////////////////// cmd_date: ex de,hl ; hl=ком-строка - ld de,work_buffer1; + ld de,Buffers.work.buffer1; ld c,Dss.GSwitch ; выделить параметр ком-строки RST ToDSS - ld de,work_buffer1; + ld de,Buffers.work.buffer1; ld a,(de) or a jr z,.cmd_dt1 @@ -104,11 +104,11 @@ cmd_date: cmd_time: ex de,hl ;ld de,T9186 - ld de,work_buffer1; + ld de,Buffers.work.buffer1; ld c,Dss.GSwitch RST ToDSS ;ld de,T9186 - ld de,work_buffer1; + ld de,Buffers.work.buffer1; ld a,(de) or a jr z,cmd_tm1 diff --git a/SHELL/Commands/DEL.ASM b/SHELL/Commands/DEL.ASM index 25f16b6..f66a790 100644 --- a/SHELL/Commands/DEL.ASM +++ b/SHELL/Commands/DEL.ASM @@ -4,10 +4,10 @@ ; ;/////////////////////////////////////////////////// cmd_del: ex de,hl - ld de,work_buffer1; + ld de,Buffers.work.buffer1; ld c,Dss.GSwitch RST ToDSS - ld hl,work_buffer1; + ld hl,Buffers.work.buffer1; ld c,Dss.Delete RST ToDSS call c,print_err_message ; вывод сообщения diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index 736914e..2375026 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -7,7 +7,7 @@ cmd_dir: push de ;;;; [ ] поддержка параметров ; зануляем все параметры на старте xor a - ld (work_buffer2),a + ld (Buffers.work.buffer2),a ld (read_disk_info.full),a ld (.key_p),a ; выполняем/настраиваем все найденные параметры в строке @@ -38,43 +38,43 @@ cmd_dir: push de ld (S_HIGH),a ; ex de,hl - ld de,work_buffer1 + ld de,Buffers.work.buffer1 ld c,Dss.GSwitch ; выделить параметр ком-строки RST ToDSS - ;!TODO тут в work_buffer1 лежит путь и/или/либо маска файла + ;!TODO тут в Buffers.work.buffer1 лежит путь и/или/либо маска файла ; надо разобрать её Dss.EX_Path выделить если есть диск, путь и маску, после чего уже ; отпечатывать путь в шапке, узнавать CurDisk как в .skip выше. Делать это до вызова ; процедуры read_disk_info. Лучше делать это после метки .skip ; - ld a,(work_buffer1) + ld a,(Buffers.work.buffer1) or a ;jr nz,.SkipMask ; задана маска имён jr z,.NoSkipMask ; не задана маска имён - ; сохранить текущий путь в work_buffer2 + ; сохранить текущий путь в Buffers.work.buffer2 ; Из буфера DE запомнить маску (первые справа символы после первого справа '\') и убрать её ; если маски нет и последний в строке '\', то потом добавить маску как в "; добавление маски" ; сделать CD в директорию из буфера DE ; make_short_path ; - ld hl,work_buffer1 + ld hl,Buffers.work.buffer1 ld bc,Dss.EX_Path.GET_ALL rst ToDSS ; and %00001100 ; имя диска и путь jr z,.SkipMask ; - ld hl,work_buffer2+2 + ld hl,Buffers.work.buffer2+2 ld c,Dss.CurDir rst ToDSS ld c,Dss.CurDisk rst ToDSS add a,"A" - ld (work_buffer2),a + ld (Buffers.work.buffer2),a ld a,":" - ld (work_buffer2+1),a + ld (Buffers.work.buffer2+1),a ; xor a - ld hl,work_buffer1 + ld hl,Buffers.work.buffer1 ld bc,256 cpir ;!FIXIT проверка на ошибку по флагу P/V @@ -95,12 +95,12 @@ cmd_dir: push de ld de,PRM1 call ncopy_string ; сохраняем маску файла ; - ld hl,work_buffer1 + ld hl,Buffers.work.buffer1 ld c,Dss.ChDir rst ToDSS ; ld hl,PRM1 - ld de,work_buffer1 + ld de,Buffers.work.free call ncopy_string ; восстанавливаем маску файла ; ld a,(PRM1) @@ -109,7 +109,7 @@ cmd_dir: push de ; ; добавление маски .NoSkipMask: ld hl,mask_fname ; "*.*" - ld de,work_buffer1 + ld de,Buffers.work.free call copy_string ; !TEST 23/05/24 .SkipMask: LD C,Dss.CurDisk ; узнать тек. диск @@ -118,8 +118,8 @@ cmd_dir: push de ; CALL Print_Header ; [ ] 01/10/23 - ld hl,work_buffer1 ; имя файла - ld de,work_buffer1 ; 80 буфер + ld hl,Buffers.work.free ; имя файла + ld de,Buffers.work.buffer1 ; 80 буфер ld a,FAT_ATTR.NoVolID ; атрибут (все, кроме метки тома) ld bc,Dss.F_First.FATname ; f_first (формат 11) RST ToDSS @@ -144,13 +144,13 @@ cmd_dir: push de ;ld (.key_p),a ; отменяем ESC .skip_esc: ld a,32-1 .skip_wait: PUSH AF - ld hl,work_buffer1+33 ; 80 + ld hl,Buffers.work.buffer1+33 ; 80 ;push af ;ld de,33 ;add hl,de call PRNNAME ; - ld ix,work_buffer1 ; 80 + ld ix,Buffers.work.buffer1 ; 80 ld a,(ix+32) ; атрибут тек. записи and FAT_ATTR.DIRECTORY ; папка ? jr z,.Calc_Size ; нет @@ -201,7 +201,7 @@ cmd_dir: push de adc a,0 ld (S_HIGH),a ;exx -.next: ld de,work_buffer1 ; 80 буфер +.next: ld de,Buffers.work.buffer1 ; 80 буфер ld c,Dss.F_Next ; поиск след. RST ToDSS jp nc,.loop ; назад в цикл, если не конец списка @@ -242,7 +242,7 @@ cmd_dir: push de CALL MESSAGE ; вывести строку ; ; [ ] 23/05/2024 - ld hl,work_buffer2 + ld hl,Buffers.work.buffer2 ld c,Dss.ChDir ld a,(hl) or a @@ -278,7 +278,13 @@ Print_Header: ; %1 ld a,'"' ld (hl),a inc hl - ld a,(screen_path) ; диск ; !TODO вот это заменить на вывод честного диска + push hl + ; + ld c,Dss.CurDisk + rst ToDSS + add a,"A" + ; + pop hl ld (hl),a inc hl ld a,'"' @@ -290,12 +296,31 @@ Print_Header: ; %1 ld hl,serial_string ; строка серийного номера диска ld de,PRM2 ; куда call ncopy_string ; скопир. строку (с нулем) - ; диск ; !TODO вот это заменить на вывод честного пути - ; пример вывода длинной строки пути есть в print_compath: - ; %3 - ld hl,screen_path ; !FIXIT если ввести "DIR gamez\*.*", то отображаемый путь в заголовке будет неверным - ld de,PRM3 ; 16 буфер - CALL copy_string ; скопир. строку (с нулем) + ; %3..5 + ;push hl + ld hl,Buffers.work.free + 256 + 128 ; 128 - на всякий случай + ld c,Dss.CurDir + rst ToDSS + ld hl,PRM3 + ld a,(PRM1 + 1) + ld (hl),a + inc hl + ld (hl),':' + ; + ld hl,PRM3+2 + ld de,PRM3+2+1 + ld (hl),0 + ld bc,16+16+16-1-2 + ldir + ; + ld hl,Buffers.work.free + 256 + 128 ; сист. путь + ld de,PRM3 + 2 ;+PRM4..5 ; 2 + 48 байтов буфер + call make_short_path + ;pop hl + + ; ld hl,Buffers.screen_path ; !FIXIT если ввести "DIR gamez\*.*", то отображаемый путь в заголовке будет неверным + ; ld de,PRM3 ;+PRM4 ; 32 байта буфер + ; CALL copy_string ; скопир. строку (с нулем) ; ld de,MAIN_MSG.DIR_1 ; индекс "Volume in drive %1..." JP MESSAGE ; вывести строку @@ -318,7 +343,7 @@ PRNNAME: dec hl ldi ldi ld (de),a - ld ix,work_buffer1 + ld ix,Buffers.work.buffer1 call PRNSIZE ; вывести в буфер имя файла и его размер (у папки ) call PRNDATE ; вывести в буфер дату файла/папки call PRNTIME ; вывести в буфер время файла/папки @@ -593,7 +618,7 @@ SIZE_BUFFER: db " " ; ; иная логика получения метки тома - сначала ищется в корневой директории, ; если там нет, то берётся из BPB read_disk_info: OR #80 - LD HL,work_buffer + LD HL,Buffers.work.buffer .full+1: LD B,0 LD C,Dss.DskInfo RST ToDSS @@ -681,7 +706,7 @@ read_disk_info: OR #80 .no_full_space_option: ; parse LD D,0 - LD HL,work_buffer + LD HL,Buffers.work.buffer ; тут в HL длина поля "Файловая система" LD E,(HL) ADD HL,DE @@ -723,14 +748,14 @@ read_disk_info: OR #80 ; поиск метки ;ld hl,mask_fname ; "*.*" имя метки ld hl,SlashMaskFname ; "\*.*" имя метки - ld de,work_buffer1 ; куда + 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,work_buffer1 + BUFFER_FIND.REC_Name ; начало метки в буфере f_first + ld hl,Buffers.work.buffer1 + BUFFER_FIND.REC_Name ; начало метки в буфере f_first jr nc,volume_label ; метка в корневом каталоге ; берём метку из BPB ; тут в HL длина поля "Метка диска" @@ -749,26 +774,26 @@ read_disk_info: OR #80 DJNZ .loop POP HL ; снимаем лишнее ; нет метки -.no_volume_label:; %4 +.no_volume_label:; %6 ld hl,volume_string_no ; строка - ld de,PRM4 ; куда + ld de,PRM6 ; куда call ncopy_string ; скопир. строку (с нулем) XOR A - LD (PRM5),A + LD (PRM7),A ret .good_label: POP HL PUSH HL ; толкаем лишнее ; есть метка volume_label: POP DE ; снимаем лишнее - ; %5 - ld de,PRM5 + ; %7 + ld de,PRM7 ld bc,11 ;!HARDCODE длина метки ldir xor a ld (de),a - ; %4 + ; %6 ld hl,volume_string_yes ; строка - ld de,PRM4 ; куда + ld de,PRM6 ; куда call ncopy_string ; скопир. строку (с нулем) ret ; diff --git a/SHELL/Commands/MKDIR.ASM b/SHELL/Commands/MKDIR.ASM index f55682a..a01c513 100644 --- a/SHELL/Commands/MKDIR.ASM +++ b/SHELL/Commands/MKDIR.ASM @@ -6,11 +6,11 @@ cmd_mkdir: ex de,hl ;ld de,T9186 ; буфер - ld de,work_buffer1; + ld de,Buffers.work.buffer1; ld c,Dss.GSwitch ; выделить параметр ком-строки RST ToDSS ;ld hl,T9186 ; имя папки - ld hl,work_buffer1; + ld hl,Buffers.work.buffer1; ld c,Dss.MkDir ; создать папку RST ToDSS call c,print_err_message ; вывод сообщения diff --git a/SHELL/Commands/PATH.ASM b/SHELL/Commands/PATH.ASM index 9f18de3..c7faa99 100644 --- a/SHELL/Commands/PATH.ASM +++ b/SHELL/Commands/PATH.ASM @@ -34,7 +34,7 @@ cmd_path: ; Показать системный путь A85B9: ;ld de,T9186 ; куда - ld de,work_buffer1; + ld de,Buffers.work.buffer1; ld hl,T858C ; имя переменной "PATH=" ld bc,Dss.Environ.Get ; получить переменную окружения RST ToDSS @@ -43,7 +43,7 @@ A85B9: ;ld de,T9186 ; ld c,Dss.PChars RST ToDSS ;ld hl,T9186 ; строка - ld hl,work_buffer1; + ld hl,Buffers.work.buffer1; ld c,Dss.PChars RST ToDSS jp newline diff --git a/SHELL/Commands/REN.ASM b/SHELL/Commands/REN.ASM index 454d88a..7df2136 100644 --- a/SHELL/Commands/REN.ASM +++ b/SHELL/Commands/REN.ASM @@ -6,17 +6,17 @@ cmd_rename: ex de,hl ;ld de,T9186 - ld de,work_buffer1; + ld de,Buffers.work.buffer1; ld c,Dss.GSwitch RST ToDSS ;ld de,T9206 - ld de,work_buffer+256; + ld de,Buffers.work.buffer+256; ld c,Dss.GSwitch RST ToDSS ;ld hl,T9186 ;ld de,T9206 - ld hl,work_buffer1; - ld de,work_buffer+256; + ld hl,Buffers.work.buffer1; + ld de,Buffers.work.buffer+256; ld c,Dss.Rename RST ToDSS call c,print_err_message ; вывод сообщения diff --git a/SHELL/Commands/RMDIR.ASM b/SHELL/Commands/RMDIR.ASM index 800231a..86ef838 100644 --- a/SHELL/Commands/RMDIR.ASM +++ b/SHELL/Commands/RMDIR.ASM @@ -6,11 +6,11 @@ cmd_rmdir: ex de,hl ;ld de,T9186 ; буфер - ld de,work_buffer1; + ld de,Buffers.work.buffer1; ld c,Dss.GSwitch ; выделить параметр ком-строки RST ToDSS ;ld hl,T9186 ; имя папки - ld hl,work_buffer1; + ld hl,Buffers.work.buffer1; ld c,Dss.RmDir ; удалить папку RST ToDSS call c,print_err_message ; вывод сообщения diff --git a/SHELL/Commands/SET.ASM b/SHELL/Commands/SET.ASM index 7034ad2..3eba9b9 100644 --- a/SHELL/Commands/SET.ASM +++ b/SHELL/Commands/SET.ASM @@ -21,11 +21,11 @@ cmd_set:ld a,(de) ; ; Показать системное окружение A85EE: ;ld hl,T9186 ; куда - ld hl,work_buffer1; + ld hl,Buffers.work.buffer1; ld bc,Dss.Environ.Read ; получить сист. окружение RST ToDSS ;ld hl,T9186 - ld hl,work_buffer1; + ld hl,Buffers.work.buffer1; A85F8: ld c,Dss.PChars RST ToDSS call newline diff --git a/SHELL/EDLINE.ASM b/SHELL/EDLINE.ASM index f8e889a..b3aac17 100644 --- a/SHELL/EDLINE.ASM +++ b/SHELL/EDLINE.ASM @@ -4,12 +4,12 @@ ; Функция строки редактирования. Имеет историю вводимых строк. ; Функция использует для своей работы временный буфер: ; -; work_buffer - этот буфер использует история -; ;work_buffer+256 - возвращается набранная строка +; Buffers.work.buffer - этот буфер использует история +; ;Buffers.work.buffer+256 - возвращается набранная строка ; ; Клавиши: ; Esc - сбросить текущую строку -; Enter - выход из функции (в work_buffer+256 готовая строка) +; Enter - выход из функции (в Buffers.work.buffer+256 готовая строка) ; Ins - смена режима ввода (вставка/замена) ; , курсор - прокрутка истории ; PageUp - в начало истории @@ -45,7 +45,7 @@ evCombKey equ 2 ; ; Строка редактирования ; ; Выход из строки по клавише , -; ;в work_buffer+256 = набранная строка (или пустая) +; ;в Buffers.work.buffer+256 = набранная строка (или пустая) ;=========================================================== input_line: ld a,1 @@ -66,8 +66,8 @@ input_line: ; Вывод пути в ком-строке на экран + новая ширина поля ввода ;--------------------------------------------------------------- print_compath: - ld hl,system_path ; сист. путь - ld de,screen_path+2 ; буфер для короткого пути + ld hl,Buffers.sys_path ; сист. путь + ld de,Buffers.screen_path+2 ; буфер для короткого пути call make_short_path xor a ld (de),a ; зануление строки @@ -91,7 +91,7 @@ print_compath: RST ToBIOS pop bc ; вывести экран. путь - ld hl,screen_path ; экран. путь + ld hl,Buffers.screen_path ; экран. путь ;call print_inpchar ; вывод строки по счетчику ld c,BIOS.LP_PRINT_LINE2 RST ToBIOS; @@ -103,68 +103,68 @@ print_compath: ; Вывод строки ~input line~ на экран ;------------------------------------------------- print_inpline: - ld de,(YXpos) ; Y/X начало ком-строки - ld c,Dss.Locate ; уст. курсор + ld de,(YXpos) ; Y/X начало ком-строки + ld c,Dss.Locate ; уст. курсор RST ToDSS - ld hl,struct_input_line ; структура буфера ~input line~ + ld hl,Buffers.input_line ; структура буфера ~input line~ push hl pop iy - ld a,(iy+3) ;+3 смещ. строки за левый край + ld a,(iy + Input_Line.Left_Shift) ;+3 смещ. строки за левый край add a,l ld l,a - jr nc,$+3 + jr nc,$+3 ; !FIXIT inc h inc hl inc hl inc hl inc hl inc hl - ld a,(width_inpline) ; ширина поля + ld a,(width_inpline) ; ширина поля ld c,a ld b,a push bc xor a - ld de,work_buffer ; врем. буфер + ld de,Buffers.work.buffer ; врем. буфер push de ld (de),a inc de - djnz $-2 ; !FIXIT - ld a,(iy+0) - sub (iy+3) + djnz $-2 ; !FIXIT + ld a,(iy + Input_Line.max_Len) + sub (iy + Input_Line.Left_Shift) cp c - jr nc,$+3 + jr nc,$+3 ; !FIXIT ld c,a - ld a,(iy+4) ; число введ. символов + ld a,(iy + Input_Line.Symbols_Num) ; число введ. символов sub c - jr nc,$+4 + jr nc,$+4 ; !FIXIT add a,c ld c,a pop de push de ld a,b or c - jr z,$+4 + jr z,$+4 ; !FIXIT ldir pop hl pop bc - ld a,b ; длина строки + ld a,b ; длина строки or a - ;call nz,print_inpchar ; вывод строки по счетчику + ;call nz,print_inpchar ; вывод строки по счетчику ld c,BIOS.LP_PRINT_LINE2 call nz,ToBIOS - ld a,(YXpos) ; X начало ком-строки - ld e,(iy+2) ;+2 тек. полож. курсора в строке + ld a,(YXpos) ; X начало ком-строки + ld e,(iy + Input_Line.Cur_X) ;+2 тек. полож. курсора в строке add a,e - cp width_inpline.MAX ; ширина экрана + cp width_inpline.MAX ; ширина экрана jr c,prne1__ ld b,width_inpline.MAX-1 sub b - ld d,a ; "наезд" за правый край + ld d,a ; "наезд" за правый край ld a,e sub d - ld (iy+2),a ;+2 новое полож. курсора + ld (iy + Input_Line.Cur_X),a ;+2 новое полож. курсора ld a,b -prne1__:ld (cursor_position),a ; X полож. курсора на экране +prne1__:ld (cursor_position),a ; X полож. курсора на экране ret ; вход: HL - полный путь @@ -257,11 +257,6 @@ handle_event_comb: ; поле событий what: ds 3 - - - - - step_scroll equ 1 ; шаг X скроллинга строки @@ -269,11 +264,11 @@ step_scroll equ 1 ; шаг X ; Обработчик событий ~Input Line~ ;================================================= event_input_line: - call handle_event ; читаем событие + call handle_event ; читаем событие ld hl,event_input_line push hl - ld iy,struct_input_line ; структура буфера ~input line~ - ld hl,what ; список событий + ld iy,Buffers.input_line ; структура буфера ~input line~ + ld hl,what ; список событий ld a,(hl) inc hl cp evKeyboard @@ -285,8 +280,8 @@ event_input_line: ; Enter: pop hl ; восст. баланс стека (выход из обработчика) xor a - ;ld (work_buffer+256),a ; задать пустую строку - ld hl,struct_input_line+4 ; число введ. символов + ;ld (Buffers.work.buffer+256),a ; задать пустую строку + ld hl,Buffers.input_line.Symbols_Num ; число введ. символов ld e,(hl) cp e ret z ; пустая строка @@ -309,12 +304,12 @@ Enter: pop hl ; ld a,b or a ret z ; были одни пробелы - ld de,struct_input_line+4 ; число введ. символов + ld de,Buffers.input_line.Symbols_Num ; число введ. символов ld (de),a ; новое число (для history_adding) ent1__: call history_adding ; добавить строку в history ; скопир. строку во врем. буфер -; ld hl,struct_input_line+4 ; откуда -; ld de,work_buffer+254 ; куда +; ld hl,Buffers.input_line.Symbols_Num ; откуда +; ld de,Buffers.work.buffer+254 ; куда ; ld a,(hl) ; скопир. строку (с нулем) ; ldi ; or a @@ -327,8 +322,8 @@ ent1__: call history_adding ; ; xor a ; ld (YXpos+1),a; ; восст. буфер -; ld hl,work_buffer+254 ; откуда -; ld de,struct_input_line+4 ; куда +; ld hl,Buffers.work.buffer+254 ; откуда +; ld de,Buffers.input_line.Symbols_Num ; куда ; ld a,(hl) ; скопир. строку (с нулем) ; ldi ; or a @@ -341,57 +336,57 @@ ent1__: call history_adding ; ; Событие - обычная клавиша EvComKeys: - ld a,(hl) ;+1 what - cp #1B ; Esc - jp z,clear_input_line ; очистить строку ввода - cp #0D ; Enter + ld a,(hl) ;+1 what + cp #1B ; Esc + jp z,clear_input_line ; очистить строку ввода + cp #0D ; Enter jr z,Enter - cp 8 ; Backspace + cp 8 ; Backspace jr z,inpline_work cp " " ret c inpline_work: ld de,input_line_done push de - ld hl,struct_input_line ; структура буфера ~input line~ + ld hl,Buffers.input_line ; структура буфера ~input line~ ex af,af' - res 7,(iy+1) ;+1 флаг ReadyString - ld a,(insert_mode) ; режим ввода: 1-inser, 0-overwrite + res 7,(iy + Input_Line.ReadyString) ;+1 флаг ReadyString + ld a,(insert_mode) ; режим ввода: 1-inser, 0-overwrite and 1 - rrca ; вправо (мл.бит -> перенос) - or (iy+1) - ld (iy+1),a ;+1 флаг ReadyString + rrca ; вправо (мл.бит -> перенос) + or (iy + Input_Line.ReadyString) + ld (iy + Input_Line.ReadyString),a ;+1 флаг ReadyString ex af,af' - cp 8 ; Backspace + cp 8 ; Backspace jp z,back_space ex af,af' - ld a,(iy+4) ; InputSymb - cp (iy+0) ; Max len + ld a,(iy + Input_Line.Symbols_Num) ; InputSymb + cp (iy + Input_Line.max_Len) jr nz,ILn___ - ld a,(iy+2) - add a,(iy+3) - cp (iy+0) + ld a,(iy + Input_Line.Cur_X) + add a,(iy + Input_Line.Left_Shift) + cp (iy + Input_Line.max_Len) ;ret nc JR NC,LastChar_BEEP - bit 7,(iy+1) + bit 7,(iy + Input_Line.ReadyString) ;ret nz JR NZ,NoMoreChars_BEEP -ILn___: ld a,(iy+4) - sub (iy+3) - sub (iy+2) +ILn___: ld a,(iy + Input_Line.Symbols_Num) + sub (iy + Input_Line.Left_Shift) + sub (iy + Input_Line.Cur_X) jr z,no_insert - dec (iy+4) - bit 7,(iy+1) + dec (iy + Input_Line.Symbols_Num) + bit 7,(iy + Input_Line.ReadyString) jr z,no_insert - inc (iy+4) + inc (iy + Input_Line.Symbols_Num) ; ввод в середину текста (вставка) ld c,a ld b,0 - ld hl,struct_input_line ; структура буфера ~input line~ - ld a,(iy+4) ;+4 число введ. символов + ld hl,Buffers.input_line ; структура буфера ~input line~ + ld a,(iy + Input_Line.Symbols_Num) ;+4 число введ. символов add a,l ld l,a - jr nc,$+3 + jr nc,$+3 ;!FIXIT inc h inc hl inc hl @@ -403,12 +398,12 @@ ILn___: ld a,(iy+4) dec hl lddr no_insert: - ld hl,struct_input_line ; структура буфера ~input line~ - ld a,(iy+2) ; X тек. полож. курсора в строке - add a,(iy+3) + ld hl,Buffers.input_line ; структура буфера ~input line~ + ld a,(iy + Input_Line.Cur_X) ; X тек. полож. курсора в строке + add a,(iy + Input_Line.Left_Shift) add a,l ld l,a - jr nc,$+3 + jr nc,$+3 ;!FIXIT inc h inc hl inc hl @@ -416,17 +411,17 @@ no_insert: inc hl inc hl ex af,af' - ld (hl),a ; сохр. символ в строке - inc (iy+4) - inc (iy+2) - ld a,(width_inpline) ; ширина поля ввода - cp (iy+2) ; X тек. полож. курсора в пределах строки - jr nz,$+8 + ld (hl),a ; сохр. символ в строке + inc (iy + Input_Line.Symbols_Num) + inc (iy + Input_Line.Cur_X) + ld a,(width_inpline) ; ширина поля ввода + cp (iy + Input_Line.Cur_X) ; X тек. полож. курсора в пределах строки + jr nz,$+8 ;!FIXIT ; курсор за полем - inc (iy+3) ; смещ. строки за левый край - dec (iy+2) ; X тек. полож. курсора в пределах строки - call print_inpline ; вывести строку на экран - pop de ; восст. баланс стека + inc (iy + Input_Line.Left_Shift) ; смещ. строки за левый край + dec (iy + Input_Line.Cur_X) ; X тек. полож. курсора в пределах строки + call print_inpline ; вывести строку на экран + pop de ; восст. баланс стека input_line_done: ret LastChar_BEEP: @@ -447,35 +442,35 @@ NoMoreChars_BEEP: ; Событие - курс. клавиши или комбинации EvComComb: - ld b,(hl) ;+1 what + ld b,(hl) ;+1 what inc hl - ld a,(hl) ;+2 what - ld hl,struct_input_line ; структура буфера ~input line~ - ld de,input_line_done ; точка выхода + ld a,(hl) ;+2 what + ld hl,Buffers.input_line ; структура буфера ~input line~ + ld de,input_line_done ; точка выхода push de - cp #54 ; курсор влево + cp #54 ; курсор влево jr z,Left - cp #56 ; курсор вправо + cp #56 ; курсор вправо jr z,Right - cp #58 ; курсор вверх, пред. строка истории + cp #58 ; курсор вверх, пред. строка истории jp z,history_prev - cp #52 ; курсор вниз, след. строка истории + cp #52 ; курсор вниз, след. строка истории jp z,history_next - cp #59 ; PageUp, в начало истории + cp #59 ; PageUp, в начало истории jp z,history_begin - cp #53 ; PageDown, в конец истории + cp #53 ; PageDown, в конец истории jp z,history_last - cp #4F ; Del, удалить символ в тек. позиции + cp #4F ; Del, удалить символ в тек. позиции jp z,Delete - cp #57 ; Home, в начало строки + cp #57 ; Home, в начало строки jp z,Home - cp #51 ; End, в конец строки + cp #51 ; End, в конец строки jp z,End1 - cp #50 ; Ins, смена режима ввода + cp #50 ; Ins, смена режима ввода jr z,change_insert_mode - bit 5,b ; Ctrl бит + bit 5,b ; Ctrl бит jr z,.exit - cp #4F+#80 ; Ctrl+Del, очистить историю команд + cp #4F+#80 ; Ctrl+Del, очистить историю команд jp z,clear_history .exit: pop de ret @@ -488,52 +483,52 @@ change_insert_mode: ret ; Курсор влево -Left: ld a,(iy+2) +Left: ld a,(iy + Input_Line.Cur_X) dec a jp p,ComPrint - ld a,(iy+3) ; смещ. строки за левый край - sub step_scroll ; шаг скроллинга - ret c ; курсор в крайнем левом полож. - ld (iy+3),a ; X смещ. строки за левый край (в символах) - ld a,(iy+2) ; X полож. курсора в пределах строки - add a,step_scroll-1 ; шаг скроллинга + ld a,(iy + Input_Line.Left_Shift) ; смещ. строки за левый край + sub step_scroll ; шаг скроллинга + ret c ; курсор в крайнем левом полож. + ld (iy + Input_Line.Left_Shift),a ; X смещ. строки за левый край (в символах) + ld a,(iy + Input_Line.Cur_X) ; X полож. курсора в пределах строки + add a,step_scroll-1 ; шаг скроллинга ComPrint: - ld (iy+2),a - jp print_inpline ; вывести строку на экран + ld (iy + Input_Line.Cur_X),a + jp print_inpline ; вывести строку на экран ; Курсор вправо -Right: ld a,(iy+2) ; X полож. курсора в пределах строки - add a,(iy+3) ; смещ. строки за левый край - cp (iy+4) ; число введ. символов +Right: ld a,(iy + Input_Line.Cur_X) ; X полож. курсора в пределах строки + add a,(iy + Input_Line.Left_Shift) ; смещ. строки за левый край + cp (iy+4) ; число введ. символов ret z - ld a,(width_inpline) ; ширина поля ввода + ld a,(width_inpline) ; ширина поля ввода ld b,a - ld a,(iy+2) ; X полож. курсора в пределах строки + ld a,(iy + Input_Line.Cur_X) ; X полож. курсора в пределах строки inc a cp b jr nz,ComPrint - inc (iy+3) ; смещ. строки за левый край - ld a,(iy+2) ; X полож. курсора в пределах строки - sub step_scroll-1 ; шаг скроллинга + inc (iy + Input_Line.Left_Shift) ; смещ. строки за левый край + ld a,(iy + Input_Line.Cur_X) ; X полож. курсора в пределах строки + sub step_scroll-1 ; шаг скроллинга jr ComPrint ; Backspace - удалить символ левее курсора back_space: - ld a,(iy+2) ; X тек. полож. курсора в строке + ld a,(iy + Input_Line.Cur_X) ; X тек. полож. курсора в строке or a jr nz,back_space1 - ld a,(iy+3) ; смещ. строки за левый край - sub step_scroll ; шаг скроллинга + ld a,(iy + Input_Line.Left_Shift) ; смещ. строки за левый край + sub step_scroll ; шаг скроллинга ret c - ld (iy+3),a - inc (iy+2) ;+2 тек. полож. курсора в строке + ld (iy + Input_Line.Left_Shift),a + inc (iy + Input_Line.Cur_X) ;+2 тек. полож. курсора в строке back_space1: - ld hl,struct_input_line ; структура буфера ~input line~ - ld a,(iy+2) ;+2 X тек. полож. курсора в строке - add a,(iy+3) ;+3 смещ. строки за левый край + ld hl,Buffers.input_line ; структура буфера ~input line~ + ld a,(iy + Input_Line.Cur_X) ;+2 X тек. полож. курсора в строке + add a,(iy + Input_Line.Left_Shift) ;+3 смещ. строки за левый край add a,l ld l,a - jr nc,$+3 + jr nc,$+3 ;!FIXIT inc h inc hl inc hl @@ -543,27 +538,27 @@ back_space1: ld d,h ld e,l dec de - ld a,(iy+4) ;+4 число введ. символов - sub (iy+3) ; смещ. строки за левый край - sub (iy+2) ; X полож. курсора в пределах строки - jr z,$+7 ; курсор за концом строки + ld a,(iy + Input_Line.Symbols_Num) ;+4 число введ. символов + sub (iy + Input_Line.Left_Shift) ; смещ. строки за левый край + sub (iy + Input_Line.Cur_X) ; X полож. курсора в пределах строки + jr z,$+7 ; курсор за концом строки ;!FIXIT ld c,a ld b,0 - ldir ; обновить остаток строки + ldir ; обновить остаток строки xor a - ld (de),a ; в конец строки - dec (iy+2) ; X полож. курсора в пределах строки - dec (iy+4) ; число введ. символов - jp print_inpline ; вывести строку на экран + ld (de),a ; в конец строки + dec (iy + Input_Line.Cur_X) ; X полож. курсора в пределах строки + dec (iy + Input_Line.Symbols_Num) ; число введ. символов + jp print_inpline ; вывести строку на экран ; Delete - удалить символ в тек. позиции -Delete: ld hl,struct_input_line ; структура буфера ~input line~ - ld a,(iy+2) ; X тек. полож. курсора в строке +Delete: ld hl,Buffers.input_line ; структура буфера ~input line~ + ld a,(iy + Input_Line.Cur_X) ; X тек. полож. курсора в строке inc a - add a,(iy+3) ; смещ. строки за левый край + add a,(iy + Input_Line.Left_Shift) ; смещ. строки за левый край add a,l ld l,a - jr nc,$+3 + jr nc,$+3 ;!FIXIT inc h inc hl inc hl @@ -573,74 +568,74 @@ Delete: ld hl,struct_input_line ; ld d,h ld e,l dec de - ld a,(iy+4) ;+4 число введ. символов - sub (iy+3) ; смещ. строки за левый край - sub (iy+2) ; X тек. полож. курсора в строке - ret z ; курсор за концом строки + ld a,(iy + Input_Line.Symbols_Num) ;+4 число введ. символов + sub (iy + Input_Line.Left_Shift) ; смещ. строки за левый край + sub (iy + Input_Line.Cur_X) ; X тек. полож. курсора в строке + ret z ; курсор за концом строки ld c,a ld b,0 - ldir ; обновить остаток строки + ldir ; обновить остаток строки xor a - ld (de),a ; в конец строки - dec (iy+4) ; число введ. символов - jp print_inpline ; вывести строку на экран + ld (de),a ; в конец строки + dec (iy + Input_Line.Symbols_Num) ; число введ. символов + jp print_inpline ; вывести строку на экран ; Home - в начало строки -Home: ld a,(iy+2) ; X тек. полож. курсора в строке - add a,(iy+3) ; смещ. строки за левый край +Home: ld a,(iy + Input_Line.Cur_X) ; X тек. полож. курсора в строке + add a,(iy + Input_Line.Left_Shift) ; смещ. строки за левый край ret z - xor a ; X полож. курсора - ld (iy+2),a ; X полож. курсора в пределах строки - ld (iy+3),a ; смещ. строки за левый край - jp ComPrint ; вывести строку на экран + xor a ; X полож. курсора + ld (iy + Input_Line.Cur_X),a ; X полож. курсора в пределах строки + ld (iy + Input_Line.Left_Shift),a ; смещ. строки за левый край + jp ComPrint ; вывести строку на экран ; End - в конец строки -End1: ld a,(iy+4) ;+4 число введ. символов - sub (iy+3) ;+3 смещ. строки за левый край - cp (iy+2) ;+2 X тек. полож. курсора в строке +End1: ld a,(iy + Input_Line.Symbols_Num) ;+4 число введ. символов + sub (iy + Input_Line.Left_Shift) ;+3 смещ. строки за левый край + cp (iy + Input_Line.Cur_X) ;+2 X тек. полож. курсора в строке ret z - add a,(iy+3) ; смещ. строки за левый край + add a,(iy + Input_Line.Left_Shift) ; смещ. строки за левый край ld c,a - ld (iy+3),0 ; смещ. строки за левый край - ld a,(width_inpline) ; ширина поля ввода + ld (iy + Input_Line.Left_Shift),0 ; смещ. строки за левый край + ld a,(width_inpline) ; ширина поля ввода sub c jr z,EndLp jr nc,EndNIL neg -EndLp: inc (iy+3) ; X смещ. строки за левый край - sub step_scroll ; шаг скроллинга +EndLp: inc (iy + Input_Line.Left_Shift) ; X смещ. строки за левый край + sub step_scroll ; шаг скроллинга jr nc,EndLp -EndNIL: ld a,(iy+4) ; число введ. символов - sub (iy+3) ; смещ. строки за левый край - jp ComPrint ; вывести строку на экран +EndNIL: ld a,(iy + Input_Line.Symbols_Num) ; число введ. символов + sub (iy + Input_Line.Left_Shift) ; смещ. строки за левый край + jp ComPrint ; вывести строку на экран ; Очистить буфер строки clear_input_line: - call clear_inpline ; очистить структуру ~input line~ - jp print_inpline ; вывести строку на экран + call clear_inpline ; очистить структуру ~input line~ + jp print_inpline ; вывести строку на экран ; очистить структуру ~input line~ clear_inpline: xor a - ld hl,struct_input_line ; структура буфера ~input line~ - ld b,(hl) ;+0 макс. длина строки - inc hl - ld (hl),a ;+1 сбр. флаг ReadyString - inc hl - ld (hl),a ;+2 X тек. полож. курсора в строке - inc hl - ld (hl),a ;+3 смещ. строки за левый край - inc hl - ld (hl),a ;+4 число введ. символов - cp b - ret z - inc hl ;+5 буфер редакт. строки - ld (hl),a - djnz $-2 + ld hl,Buffers.input_line ; структура буфера ~input line~ + ld b,(hl) ;+0 макс. длина строки + inc hl + ld (hl),a ;+1 сбр. флаг ReadyString + inc hl + ld (hl),a ;+2 X тек. полож. курсора в строке + inc hl + ld (hl),a ;+3 смещ. строки за левый край + inc hl + ld (hl),a ;+4 число введ. символов + cp b + ret z + inc hl ;+5 буфер редакт. строки + ld (hl),a + djnz $-2 ;!FIXIT ret @@ -648,17 +643,17 @@ clear_inpline: ; Вставить строку из history-буфера ; вход: de=структура строки: +0=длина строки, +1=строка put_from_history: - call clear_inpline ; очистить строку ввода - ld a,(de) ;+0 длина строки + call clear_inpline ; очистить строку ввода + ld a,(de) ;+0 длина строки ld c,a put_history_loop: inc de - ld hl,struct_input_line ; структура буфера ~input line~ - ld a,(iy+2) ; X тек. полож. курсора в строке - add a,(iy+3) + ld hl,Buffers.input_line ; структура буфера ~input line~ + ld a,(iy + Input_Line.Cur_X) ; X тек. полож. курсора в строке + add a,(iy + Input_Line.Left_Shift) add a,l ld l,a - jr nc,$+3 + jr nc,$+3 ;!FIXIT inc h inc hl inc hl @@ -667,14 +662,14 @@ put_history_loop: inc hl ld a,(de) ld (hl),a - inc (iy+4) ; число введ. символов - inc (iy+2) ; X тек. полож. курсора в строке - ld a,(width_inpline) ; ширина поля ввода - cp (iy+2) ; X тек. полож. курсора в пределах строки - jr nz,$+8 + inc (iy + Input_Line.Symbols_Num) ; число введ. символов + inc (iy + Input_Line.Cur_X) ; X тек. полож. курсора в строке + ld a,(width_inpline) ; ширина поля ввода + cp (iy + Input_Line.Cur_X) ; X тек. полож. курсора в пределах строки + jr nz,$+8 ;!FIXIT ; курсор за правым краем поля ввода - inc (iy+3) ; смещ. строки за левый край - dec (iy+2) ; X тек. полож. курсора в пределах строки + inc (iy + Input_Line.Left_Shift) ; смещ. строки за левый край + dec (iy + Input_Line.Cur_X) ; X тек. полож. курсора в пределах строки dec c jr nz,put_history_loop ; вывести строку на экран @@ -684,11 +679,11 @@ put_history_loop: ; Очистить историю команд clear_history: - call clear_input_line ; очистить строку ~input line~ + call clear_input_line ; очистить строку ~input line~ xor a - ld (history_count),a ; число строк в history - ld (history_cur_string),a ; номер тек. строки history - ld hl,history_buff ; конец посл. строки + ld (history_count),a ; число строк в history + ld (history_cur_string),a ; номер тек. строки history + ld hl,Buffers.history ; конец посл. строки ld (history_end),hl ret @@ -702,13 +697,13 @@ clear_history: ;======================================================================== history_count: - db 0 ; число строк в истории + db 0 ; число строк в истории ; history_cur_string: - db 0 ; номер тек. строки истории + db 0 ; номер тек. строки истории ; history_end: - dw history_buff ; конец послед. строки истории + dw Buffers.history ; конец послед. строки истории @@ -718,10 +713,10 @@ history_end: history_begin: ld a,(history_count) or a - ret z ; нет строк + ret z ; нет строк xor a ld (history_cur_string),a - jr history_copy ; перейти на 1-ю строку + jr history_copy ; перейти на 1-ю строку ;------------------------------------------------- ; В конец истории @@ -729,9 +724,9 @@ history_begin: history_last: ld a,(history_count) or a - ret z ; нет строк - ld (history_cur_string),a ; уст. послед. пустую строку - jp clear_input_line ; вернуть пустую строку + ret z ; нет строк + ld (history_cur_string),a ; уст. послед. пустую строку + jp clear_input_line ; вернуть пустую строку ;------------------------------------------------- ; Следующая строка @@ -745,7 +740,7 @@ history_next: ld hl,history_cur_string ld a,(hl) cp b - jr c,$+7 + jr c,$+7 ;!FIXIT inc b ld (hl),b jp clear_input_line ; вернуть пустую строку @@ -767,7 +762,7 @@ history_prev: or a jr z,history_copy ; уперлись в начало истории cp b - jr c,$+3 + jr c,$+3 ;!FIXIT ld a,b dec a ld (hl),a @@ -780,14 +775,14 @@ history_copy: ; выход: de=строка (ее структура из history-буфера) history_index: ld b,0 - ld hl,history_buff ; буфер истории + ld hl,Buffers.history ; буфер истории or a ; индекс строки jr z,hist_index ; 1-я строка истории ld c,(hl) ; размер строки inc c add hl,bc ; на след. строку dec a - jr nz,$-4 + jr nz,$-4 ;!FIXIT hist_index: ex de,hl ret @@ -799,24 +794,24 @@ hist_index: ; тех пор, пока появится достаточно места для новой строки. ;----------------------------------------------------------- history_adding: - ld de,struct_input_line+4 ; структура строки - call history_compare ; сравнить строки - ret z ; уже есть такая строка - ld bc,(history_end) ; адрес конца посл. строки - ld hl,history_buff+history_size ; адрес конца буфера + ld de,Buffers.input_line.Symbols_Num ; структура строки + call history_compare ; сравнить строки + ret z ; уже есть такая строка + ld bc,(history_end) ; адрес конца посл. строки + ld hl,Buffers.history + history_size ; адрес конца буфера and a - sbc hl,bc ; hl=размер своб. места - ld a,(de) ; длина новой строки + sbc hl,bc ; hl=размер своб. места + ld a,(de) ; длина новой строки inc a ld c,a xor a ld b,a - sbc hl,bc ; умещ. в своб. месте буфера истории ? - jr nc,history_add_ok ; да + sbc hl,bc ; умещ. в своб. месте буфера истории ? + jr nc,history_add_ok ; да ; удалить первую (самую старую) строку из буфера ;push de - ld de,history_buff ; буфер истории - ld a,(de) ; длина 1-й строки + ld de,Buffers.history ; буфер истории + ld a,(de) ; длина 1-й строки inc a ld c,a xor a @@ -837,7 +832,7 @@ history_adding: ldir ld hl,history_count dec (hl) ; --число строк в history - ;pop de ; восст. адрес struct_input_line+4 + ;pop de ; восст. адрес Buffers.input_line.Symbols_Num jr history_adding ; history_add_ok: @@ -866,7 +861,7 @@ history_compare: ex af,af' xor a ; сбр. индекс сравн. строки ex af,af' - ld hl,history_buff ; буфер истории + ld hl,Buffers.history ; буфер истории history_comp_loop: push de ld (move_cur_str+1),hl ; тек. строка истории @@ -922,7 +917,7 @@ move_to_end_history: ; сохр. строку во врем. буфере move_cur_str: ld hl,0 ; тек. строка истории - ld de,work_buffer ; врем. буфер + ld de,Buffers.work.buffer ; врем. буфер ld c,(hl) ;+0 длина строки inc c ; учесть ячейку длины строки xor a @@ -944,7 +939,7 @@ move_cur_str: pop hl ; откуда ldir ; восст. строку из врем. буфера в конец истории - ld hl,work_buffer ; врем. буфер + ld hl,Buffers.work.buffer ; врем. буфер ld c,(hl) inc c ld b,a @@ -982,18 +977,18 @@ insert_mode: ; 5 0 ; экранный путь -screen_path: - db "A:" - BLOCK max_screen_path+1,0 ; 32+1 +; screen_path: +; db "A:" +; BLOCK max_screen_path+1,0 ; 32+1 ; 6 0 ; системный путь -system_path: - BLOCK 256,0 ;!HARDCODE +; system_path: +; BLOCK 256,0 ;!HARDCODE ; ; 7 0 ; ; Структура строки ввода ~input line~ -; struct_input_line: +; Buffers.input_line.: ; db max_len_comline ;+0 254 макс. число ввод. символов ; db 0 ;+1 флаг ReadyString ; db 0 ;+2 X тек. полож. курсора в пределах строки @@ -1008,7 +1003,7 @@ system_path: ; ; 9 0 ; ; Рабочий буфер -; work_buffer: +; Buffers.work.buffer: ; BLOCK 512,0 //////////////////////////////////////////////////////////////////////// ; \ No newline at end of file diff --git a/SHELL/EXEC.ASM b/SHELL/EXEC.ASM index 440143f..0aa1bf9 100644 --- a/SHELL/EXEC.ASM +++ b/SHELL/EXEC.ASM @@ -7,11 +7,11 @@ SAVEHL: dw 0 ; Разбор и выполнение введенных команд и имен файлов ;------------------------------------------------------------- COMP: call EVALCMD ; (batch.asm) - ld hl,struct_input_line+5 + ld hl,Buffers.input_line.Path dec hl ld c,(hl) ; длина строки ld b,0 - inc hl ; struct_input_line+5 + inc hl ; Buffers.input_line.Path .loop: ld a,(hl) cp " " jr nz,.COMP01 @@ -42,7 +42,7 @@ COMP: call EVALCMD ; (batch.asm) .skip: ; Не дос-команды. Тест на задание диска и запуск файла ld h,d ld l,e - ; hl=struct_input_line+5 + ; hl=Buffers.input_line.Path ld b,(hl) ;+0 1-й символ inc hl ld c,(hl) ;+1 2-й символ @@ -65,10 +65,10 @@ COMP: call EVALCMD ; (batch.asm) jp c,print_err_message ; вывод сообщения ;!FIXIT тут восстанавливается директория и могут быть глюки на новом ядре - ;!TODO доставать system_path отдельно для каждого диска (или в ядре сделать?) + ;!TODO доставать Buffers.sys_path отдельно для каждого диска (или в ядре сделать?) ; тест на существование папки на целевом диске IFDEF MANY_SYS_PATHES - ld hl,system_path ; буфер сист. пути + ld hl,Buffers.sys_path ; буфер сист. пути ld c,Dss.ChDir ; уст. тек. путь RST ToDSS jp nc,Get_Path ; Ok @@ -76,7 +76,7 @@ COMP: call EVALCMD ; (batch.asm) ; ; уст. корень, нет такой папки на новом диске - ld hl,system_path+1 ; буфер сист. пути + ld hl,Buffers.sys_path + 1 ; буфер сист. пути ld (hl),0 dec hl ld (hl),'\' @@ -92,7 +92,7 @@ COMP: call EVALCMD ; (batch.asm) ; задан не диск RUN_EXT: ex de,hl ; восст. адрес начала строки - ld (SAVEHL),hl ; struct_input_line+5 + ld (SAVEHL),hl ; Buffers.input_line.Path ld de,EXTBF ; буфер ld bc,4*256 + Dss.EX_Path ; выделить расш. файла RST ToDSS @@ -124,7 +124,7 @@ RUN_EXT: ex de,hl ; jr nz,EXEERR push hl ;ld a,(D96AD) ; длина строки (inline.asm) - ld a,(struct_input_line+4) ; длина строки + ld a,(Buffers.input_line.Symbols_Num) ; длина строки ld b,a .loop: ld a,(hl) cp " "+1 @@ -187,12 +187,12 @@ RESTORE_ALL: ;[x] 01/11/23 ;!TEST CALL Get_Path ; - LD A,(screen_path) + LD A,(Buffers.screen_path) SUB 'A' LD C,Dss.ChDisk RST ToDSS ; - LD HL,system_path + LD HL,Buffers.sys_path LD C,Dss.ChDir RST ToDSS ; diff --git a/SHELL/Messages/main_txt.asm b/SHELL/Messages/main_txt.asm index 53d9244..8dd5dcd 100644 --- a/SHELL/Messages/main_txt.asm +++ b/SHELL/Messages/main_txt.asm @@ -31,7 +31,7 @@ MAIN_MSG: ; ; 1 2 3 4 5 6 7 ; 01234567890123456789012345678901234567890123456789012345678901234567890123456789; - stN .DIR_1_ : db "Volume in drive %1 %4 %5\r\n" + stN .DIR_1_ : db "Volume in drive %1 %6 %7\r\n" db "Volume Serial Number is %2\r\n" DZ "\r\nDirectory of %3\r\n\n" stN .VERS_ : DZ "Estex DSS version %1. Shell version %2.\r\n" ;R13 diff --git a/SHELL/SHELL.ASM b/SHELL/SHELL.ASM index 6092c8a..26809c2 100644 --- a/SHELL/SHELL.ASM +++ b/SHELL/SHELL.ASM @@ -56,6 +56,7 @@ Loader_length EQU 0 code_addr EQU shell program_start EQU shell stack_point EQU #C000 +stack_size EQU #100 org_addr EQU #8000 + CLP_Buffer ;---------------------------------------------------------------------[] ; @@ -91,15 +92,17 @@ org_addr EQU #8000 + CLP_Buffer ;============================================================== ; Точка входа в Шелл ;============================================================== -shell: - ;!TODO merge: активировать когда буферы будут через структуру, а не нулями - ;LD HL,WORK_BUFFERS - ;LD DE,WORK_BUFFERS+1 - ;LD BC,BUFFERS_STRUCT-1 - ;LD (HL),0 - ;LDIR +shell: ld hl,Buffers + ld de,Buffers+1 + ld (hl),0 + ld bc,Struc_Buffers-1 + ldir + ; + ld hl,":A" + ld (Buffers.screen_path),hl + ld a,max_len_comline + ld (Buffers.input_line),a ; - ; сохр. уровень тек. шелла ld a,(ix-1) ld (cmd_exit.TASKX),a @@ -155,8 +158,8 @@ back_to_parent_process: ;--------------------------------------------------------------- option_c: ;ld hl,T96AE ; имя bat-файла, 256 буфер (inline.asm) - ;ld hl,work_buffer+256;; - ld hl,struct_input_line+5 ; имя bat-файла + ;ld hl,Buffers.work.buffer+256;; + ld hl,Buffers.input_line.Path ; имя bat-файла call BATCH ; обработка bat-файла (batch.asm) ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat jr back_to_parent_process.saveA ; вернуться в родит. процесс @@ -187,7 +190,7 @@ run_shell_loop: run_shell_loop1: call input_line call newline ; на новую строку - ld a,(struct_input_line+4) ; число введ. символов + ld a,(Buffers.input_line.Symbols_Num) ; число введ. символов or a jr z,run_shell_loop1 ; пустая ; Парсинг и выполнение команд @@ -225,12 +228,12 @@ GET_CMD: dec hl cp '/' ; опция jr nz,.PROCESS - ld de,work_buffer1 ; 128 буфер для параметра + ld de,Buffers.work.buffer1 ; 128 буфер для параметра ld c,Dss.GSwitch ; выдел. параметр ком-строки RST ToDSS push af ex de,hl - ld hl,work_buffer1 ; 128 буфер для параметра + ld hl,Buffers.work.buffer1 ; 128 буфер для параметра inc hl call set_option_flag ; уст. биты флагов pop af @@ -239,18 +242,18 @@ GET_CMD: ; уст. бит-флаг .PROCESS: ld a,(RUNMODE) - set 6,a ; 6-й бит (вводились дополн. параметры) ;!HARDCODE + set 6,a ; 6-й бит (вводились дополн. параметры) ;!HARDCODE ld (RUNMODE),a ; скопир. параметр из ком-строки ; в буфер строки редактирования ;copy_to_input_line: - ld iy,struct_input_line ; структура буфера ~input line~ + ld iy,Buffers.input_line ; структура буфера ~input line~ push hl - call clear_inpline ; обнулить структуру "input line" - pop de ; de=хвост строки -.loop: ld hl,struct_input_line ; структура буфера ~input line~ - ld a,(iy+2) ; X тек. полож. курсора в строке - add a,(iy+3) + call clear_inpline ; обнулить структуру "input line" + pop de ; de=хвост строки +.loop: ld hl,Buffers.input_line ; структура буфера ~input line~ + ld a,(iy + Input_Line.Cur_X) ; X тек. полож. курсора в строке + add a,(iy + Input_Line.Left_Shift) add a,l ld l,a jr nc,1F @@ -260,20 +263,20 @@ GET_CMD: inc hl inc hl inc hl - ld a,(de) ; символ из строки + ld a,(de) ; символ из строки ld (hl),a or a - ret z ; конец строки - inc (iy+4) ; число введ. символов - inc (iy+2) ; X тек. полож. курсора в строке - ld a,(width_inpline) ; ширина поля ввода - cp (iy+2) ; X тек. полож. курсора в пределах строки + ret z ; конец строки + inc (iy + Input_Line.Symbols_Num) ; число введ. символов + inc (iy + Input_Line.Cur_X) ; X тек. полож. курсора в строке + ld a,(width_inpline) ; ширина поля ввода + cp (iy + Input_Line.Cur_X) ; X тек. полож. курсора в пределах строки jr nz,2F ; курсор за правым краем поля ввода - inc (iy+3) ; смещ. строки за левый край - dec (iy+2) ; X тек. полож. курсора в пределах строки -2: ld a,(de) ; символ из строки - inc de ; продв. поток + inc (iy + Input_Line.Left_Shift) ; смещ. строки за левый край + dec (iy + Input_Line.Cur_X) ; X тек. полож. курсора в пределах строки +2: ld a,(de) ; символ из строки + inc de ; продв. поток cp " " jr nc,.loop ret @@ -315,21 +318,21 @@ setopt4: ld a,c ;GETPATH: Get_Path: ; узнать тек. каталог - ld hl,system_path ; 256 буфер сист. пути + ld hl,Buffers.sys_path ; 256 буфер сист. пути ld c,Dss.CurDir RST ToDSS .disk: ; узнать тек. диск ld c,Dss.CurDisk RST ToDSS add a,"A" - ld (screen_path),a ; 33 строка экранного пути + ld (Buffers.screen_path),a ; 33 строка экранного пути ret ;!FIXIT убрать лишние вызовы ; Восстановить тек. диск и путь (после ошибки) restore_disk_path: ; уст. тек. диск - ld a,(screen_path) ; 33 строка экранного пути + ld a,(Buffers.screen_path) ; 33 строка экранного пути sub "A" ld c,Dss.ChDisk RST ToDSS @@ -337,7 +340,7 @@ restore_disk_path: ;!FIXIT убрать лишние вызовы restore_path: ; уст. тек. каталог - ld hl,system_path ; 256 буфер сист. пути + ld hl,Buffers.sys_path ; 256 буфер сист. пути ld c,Dss.ChDir RST ToDSS ret @@ -556,33 +559,40 @@ T8C24: db "OFF",0 include 'Commands/reboot.asm' ; софт ресет ; DISPLAY "Empty space for buffers from ",/H,$ - -CLEAR_ZONE: + DISPLAY "Free space from ",/H,$ + Struc_Buffers + assert ($ + Struc_Buffers) < (stack_point - stack_size), "Buffers can leack to stack!" Buffers Struc_Buffers = $ - - +; 5 0 +; экранный путь +;screen_path: +; db "A:" +; BLOCK max_screen_path+1,0 ; 32+1 +; 6 0 +; системный путь +; system_path: +; BLOCK 256,0 ;!HARDCODE ; 7 0 ; Структура строки ввода ~input line~ -struct_input_line: - db max_len_comline ;+0 254 макс. число ввод. символов - db 0 ;+1 флаг ReadyString - db 0 ;+2 X тек. полож. курсора в пределах строки - db 0 ;+3 X смещ. строки за левый край (в символах) - db 0 ;+4 число введенных символов - BLOCK max_len_comline+1,0 ;+5 строка ввода +; struct_input_line: +; db max_len_comline ;+0 254 макс. число ввод. символов +; db 0 ;+1 флаг ReadyString +; db 0 ;+2 X тек. полож. курсора в пределах строки +; db 0 ;+3 X смещ. строки за левый край (в символах) +; db 0 ;+4 число введенных символов +; BLOCK max_len_comline+1,0 ;+5 строка ввода ; 8 0 ; Буфер истории -history_buff: - BLOCK history_size,0 ; 256 +; history_buff: +; BLOCK history_size,0 ; 256 ; 9 0 ; Рабочий буфер -work_buffer: - BLOCK 512,0 +; work_buffer: +; BLOCK 512,0 -work_buffer1 equ $ ; 2-й раб. буфер ; 128 bytes -work_buffer2 equ work_buffer1+128 ; 3-й раб. буфер ; 256 bytes +; work_buffer1 equ $ ; 2-й раб. буфер ; 128 bytes +; work_buffer2 equ work_buffer1+128 ; 3-й раб. буфер ; 256 bytes ; diff --git a/SHELL/build.txt b/SHELL/build.txt index 6c8526a..cbafdca 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -370 \ No newline at end of file +393 \ No newline at end of file diff --git a/SHELL/structures.inc b/SHELL/structures.inc index 1427b2d..1826213 100644 --- a/SHELL/structures.inc +++ b/SHELL/structures.inc @@ -7,19 +7,17 @@ .Path BLOCK max_len_comline+1,0 ;+5 строка ввода ENDS - STRUCT History -.cmds BLOCK history_size,0 ; 256 - ENDS - STRUCT Work -.work_buffer BLOCK 512,0 -.work_buffer1 BLOCK 128,0 -.work_buffer2 BLOCK 256,0 -.free_buffer BLOCK 3840,0 +.buffer BLOCK 512,0 +.buffer1 BLOCK 128,0 +.buffer2 BLOCK 256,0 +.free BLOCK 3840,0 ENDS STRUCT Struc_Buffers +.screen_path BLOCK 2 + max_screen_path + 1, 0 ; db "A:" : BLOCK max_screen_path+1,0 +.sys_path BLOCK 256,0 .input_line Input_Line -.history History +.history BLOCK history_size,0 ; 256 .work Work ENDS