From b90cabb44b0cd148e045ab882572eca025212df6 Mon Sep 17 00:00:00 2001 From: Tolik Trek Date: Tue, 12 May 2026 02:07:25 +1000 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20CLP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/API/Execute.ASM | 167 +++++++++++++++++++++++++------------------ SHELL/structures.inc | 2 +- Shared_Includes | 2 +- 3 files changed, 100 insertions(+), 71 deletions(-) diff --git a/DSS/API/Execute.ASM b/DSS/API/Execute.ASM index 15969df..cc358ad 100644 --- a/DSS/API/Execute.ASM +++ b/DSS/API/Execute.ASM @@ -361,7 +361,8 @@ _TST_PROC: CALL GETMEM ;LD DE,CORE_BUFFERS.BUFFER+1 LD DE,CORE_BUFFERS.BUFFER_CLP + 1 CALL SCOPYS - LD A,#80 ;!HARDCODE cmd line size + ;LD A,#80 ;!HARDCODE cmd line size + LD A,low CLP_Buffer SUB B LD (CORE_BUFFERS.BUFFER_CLP),A ; @@ -406,33 +407,28 @@ _ret+1: JP 0 ;EXEC02.RET_1 ; сюда возврат из EXEC02.RET_1 или _RET_2 _TST_PROC_2: ; ! Далее стек в нулевой странице! BIOS и не DSS-MAIN не вызывать - ; LD SP,CORE_BUFFERS.EXEBUFF + _sEXE_HEADER CALL M_PSP LD SP,(CORE_BUFFERS.EXEBUFF.SP_REG) - ; - LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) - LD DE,#0080 ;!HARDCODE CLP_Buffer - XOR A - SBC HL,DE - EX DE,HL - LD XH,D - LD XL,E - ;LD HL,(CORE_BUFFERS.EXEBUFF.PC_REG) LD DE,RETFAR ; адрес п/п "неожиданное завершение процесса" PUSH DE - ;PUSH HL - ;!TEST Current Dir ;[x] 15/10/23 - PUSH IX - LD HL,CORE_BUFFERS.CurrentPath - LD A,(CORE_BUFFERS.EXEBUFF.VERSION) - ; - OR A - JR NZ,.set_path - CALL DIR_PATH_CHANGE.FullCurrent - LD HL,CORE_BUFFERS.CurrentPath -.set_path: CALL CHDIR_FN - POP IX + ; Current Dir ;[x] 15/10/23 + PUSH IX + LD HL,CORE_BUFFERS.CurrentPath + LD A,(CORE_BUFFERS.EXEBUFF.VERSION) + ; + OR A + JR NZ,.set_path + ; + CALL DIR_PATH_CHANGE.FullCurrent + LD HL,CORE_BUFFERS.CurrentPath +.set_path: CALL CHDIR_FN + POP IX + ; проверка на переполнение буфера CLP + LD A,(CORE_BUFFERS.BUFFER_CLP) + LD B,DSS_Error.sys.ENV_ITEM_OVERFLOW + INC A + JP Z,LEAVE ; LD HL,(CORE_BUFFERS.EXEBUFF.PC_REG) EI @@ -440,16 +436,17 @@ _TST_PROC_2: ;----------------------------------------------------------------------- ; ! вызывается когда стек в нулевой странице! M_PSP: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) - DEC H + DEC H ;!FIXIT отступ на 256 (CLP buffer + data) назад от LD_ADDR LD D,H LD E,L INC DE - LD BC,#00FF ;!FIXIT + LD BC,#00FF ;!FIXIT размер под буфер CLP LD (HL),B LDIR EX DE,HL DEC H - LD DE,#0080 ;!FIXIT + ;LD DE,#0080 ;!FIXIT + LD DE,#0003 ;!FIXIT ADD HL,DE EX DE,HL LD XH,D @@ -460,65 +457,93 @@ M_PSP: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) INC C LDIR EX DE,HL ;R06 - LD (HL),B + ;LD (HL),B LD A,(TASK) LD (IX-1),A LD A,(EXE_MEM) LD (IX-2),A LD A,(EXE_FM) LD (IX-3),A - ;R05 + ; так исторически сложилось, что два 0 после параметров строки INC HL - LD (HL),B + ;LD (HL),B INC HL - ;!FIXIT тут восстанавливать правильный каталог - CALL CURDISK - ADD A,'A' - LD (HL),A - INC HL - LD A,':' - LD (HL),A - INC HL - PUSH HL - CALL CURRDIR - ; - POP HL - XOR A - LD BC,#0100 ;!FIXIT нет привязки к CurrentDirectory.DEPTH - CPIR ;!FIXIT нет проверки на выход по BC=0 - DEC HL - DEC HL - LD A,'\' ; - CP (HL) - INC HL - JR Z,.YP_ESLA - LD (HL),A - INC HL -.YP_ESLA: EX DE,HL - LD HL,TMPNAME -.loop: LD A,(HL) - LDI - CP ' '+1 - JR NC,.loop - DEC DE - XOR A - LD (DE),A - LD (APPINFO.LAST_PSP_PTR),IX + ;!FIXIT тут восстанавливать правильный каталог + CALL CURDISK + ADD A,'A' + LD (HL),A + INC HL + LD A,':' + LD (HL),A + INC HL + PUSH HL + ;!FIXIT тут читать CURRDIR в отдельный буфер и из него копировать в HL без выхода за границы буфера + LD HL,CORE_BUFFERS.BUFFER_CLP + CALL CURRDIR ; + POP DE + LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) + SBC HL,DE + ;!FIXIT отработать Z и CF + LD B,H + LD C,L + ;EX DE,HL + JR Z,.error_CLP + JR C,.error_CLP + ; hl - адрес в CLP для записи полного имени приложения с путём + ; bc - количество оставшегося места в буфере + ; + LD HL,CORE_BUFFERS.BUFFER_CLP +.copy_loop: CALL .copyAndCheck + JP PO,.error_CLP + ; + EX DE,HL + DEC HL + LD A,'\' ; + LD (HL),A + INC HL +.YP_ESLA: PUSH HL + PUSH BC + LD HL,MASKARE + LD DE,TMPNAME + CALL GetName + POP BC + POP DE + LD HL,TMPNAME + ; + CALL .copyAndCheck + LD (APPINFO.LAST_PSP_PTR),IX ; !FIXIT сделать через стек переменных? RET - ; -SCOPYS: LD BC,#80*256 + ' '+1 ;!HARDCODE cmd line size + ; +.copyAndCheck: LD A,(HL) + AND A + LDI + RET Z + JP PE,.copyAndCheck + ; если мы тут, то буфера не хватило и нужно выдавать ошибку + POP HL ; снимаем адрес возврата + ; +.error_CLP: LD A,#FF + LD (CORE_BUFFERS.BUFFER_CLP),A + RET + +SCOPYS: LD BC,256*(low CLP_Buffer) + ' '+1 .loop: LD A,(HL) CP C JR C,.copy + ; INC HL DJNZ .loop XOR A LD (DE),A - LD B,#80 + LD B,low CLP_Buffer RET ; -.copy: LD BC,#80*256 + ' ' ;!HARDCODE cmd line size +.copy: LD BC,256*(low CLP_Buffer) + ' ' + AND A + LD (DE),A + RET Z + ; .loop2: LD A,(HL) LD (DE),A INC HL @@ -526,7 +551,9 @@ SCOPYS: LD BC,#80*256 + ' '+1 ;!HARDCODE cmd line size CP C RET C DJNZ .loop2 - RET + ; тут ошибка - слишком длинная строка параметров + INC B + RET ;--------------------------------------------------------------------- ENVPATH: DB "PATH=",0 EXE_EXT: DB "EXE" @@ -594,9 +621,11 @@ LEAVE: ;LD A,R EX DE,HL LD A,(ErrorLevel) ;R12 - CP DSS_Error.sys.UNEXPECTED_APP_TRMN + CP DSS_Error.sys.UNEXPECTED_APP_TRMN ; #27 0010 0111 6 JR Z,.error_exit - CP DSS_Error.sys.USER_ABORT + CP DSS_Error.sys.USER_ABORT ; #25 0010 0101 4 + JR Z,.error_exit + CP DSS_Error.sys.ENV_ITEM_OVERFLOW ; #21 0010 0001 0 JR NZ,.norm_exit .error_exit: SCF JP (HL) diff --git a/SHELL/structures.inc b/SHELL/structures.inc index db0218f..37d85c1 100644 --- a/SHELL/structures.inc +++ b/SHELL/structures.inc @@ -1,5 +1,5 @@ STRUCT Input_Line -.max_Len BYTE 254 ;+0 254 макс. число ввод. символов +.max_Len BYTE 253 ;+0 254 макс. число ввод. символов .ReadyString BYTE 0 ;+1 флаг ReadyString .Cur_X BYTE 0 ;+2 X тек. полож. курсора в пределах строки .Left_Shift BYTE 0 ;+3 X смещ. строки за левый край (в символах) diff --git a/Shared_Includes b/Shared_Includes index fbc8d02..51198ce 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit fbc8d02bd696cba183b6440a5d1e01b12b128693 +Subproject commit 51198ce44bd19f511b63e6fafaf91b3de5470f9d