diff --git a/DSS/API/CurrDir.asm b/DSS/API/CurrDir.asm index 7ae85dc..d5b882b 100644 --- a/DSS/API/CurrDir.asm +++ b/DSS/API/CurrDir.asm @@ -4,21 +4,20 @@ ; вход: HL - буфер в памяти 256 байт ; выход: A - код ошибки, если CF=1 //////////////////////////////////////////////////////////////////////// -CURRDIR: LD DE,CORE_BUFFERS.WorkDirectory - JR CURRDIR_FN.skip -CURRDIR_FN: - LD DE,CORE_BUFFERS.CurrentDirectory -.skip: EX DE,HL - LD BC,DIRECTORY_PATH_LENGTH ;[x] 15/11/2023 могло выйти за пределы буфера - XOR A -.loop: CP (HL) - LDI - JP PO,.error ;[x] 15/11/2023 могло выйти за пределы буфера - JR NZ,.loop - RET - ;[x] 15/11/2023 могло выйти за пределы буфера -.error: LD A,DSS_Error.sys.TOO_DEEP_DIR_DEPTH - SCF - RET - ; +CURRDIR: LD DE,CORE_BUFFERS.WorkDirectory + JR CURRDIR_FN.skip +CURRDIR_FN: LD DE,CORE_BUFFERS.CurrentDirectory +.skip: EX DE,HL + LD BC,DIRECTORY_PATH_LENGTH ;[x] 15/11/2023 могло выйти за пределы буфера + XOR A +.loop: CP (HL) + LDI + JP PO,.error ;[x] 15/11/2023 могло выйти за пределы буфера + JR NZ,.loop + RET + ;[x] 15/11/2023 могло выйти за пределы буфера +.error: LD A,DSS_Error.sys.TOO_DEEP_DIR_DEPTH + SCF + RET + ; ; \ No newline at end of file diff --git a/DSS/API/Execute.ASM b/DSS/API/Execute.ASM index cc7d871..3169d65 100644 --- a/DSS/API/Execute.ASM +++ b/DSS/API/Execute.ASM @@ -78,7 +78,12 @@ EXEC: LD (CMDLINE),HL JR Z,.VAR_1 ;R03 DEC B ;R03 JR Z,.VAR_2 ;R03 - LD A,DSS_Error.sys.INVALID_FUNCTION ;R03 + ; + ; POP AF + ; JP PO,.no_EI + ; ; + ; EI +.no_EI: LD A,DSS_Error.sys.INVALID_FUNCTION ;R03 SCF ;R03 RET ;R03 ; @@ -136,10 +141,10 @@ EXEC0_SHORT: ; CALL ENVIRON LD HL,(CMDLINE) LD DE,CORE_BUFFERS.EXEBUFF -COPYEXN: LD A,(HL) +.COPYEXN: LD A,(HL) LDI OR A - JR NZ,COPYEXN + JR NZ,.COPYEXN CALL FINDPATH ;[x] 1/10/2023 @@ -187,11 +192,8 @@ EXEC02: LD (EXE_FM),A AND #3F LD D,A ADD IX,DE - ;!TEST - JR NC,.no_inc_hl - INC HL - ;LD DE,#0000 - ;ADC HL,DE + JR NC,.no_inc_hl + INC HL ; .no_inc_hl: LD A,XH SLA A @@ -278,9 +280,9 @@ PRELOAD: EX DE,HL LD B,A LD A,H OR L - JR Z,NOINK2 + JR Z,.NOINK INC B -NOINK2: LD HL,_RET_2 +.NOINK: LD HL,_RET_2 LD (_ret),HL JR _TST_PROC ; @@ -293,6 +295,8 @@ _RET_2: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) ; ;-------------------------------------------------------------------;[ ] _TST_PROC: CALL GETMEM JP C,ERREXE0 + ; + DI LD (EXE_MEM),A EXX POP DE ;снимаем со стека адрес возврата @@ -312,55 +316,29 @@ _TST_PROC: CALL GETMEM PUSH AF ; +2 LD (EXSTACK),SP LD SP,HL - ; ; + ; EXX ; - ;!TEST 27/03/2024 - LD DE,RAMMAP+3 - LD A,(EXE_MEM) - LD BC,4*256 + BIOS.GetMemPage -.mem_loop: PUSH AF - PUSH BC - DEC B - RST ToBIOS - LD (DE),A - DEC DE - POP BC - POP AF - DJNZ .mem_loop - ; - ; LD DE,RAMMAP - ; ; - ; LD A,(EXE_MEM) - ; LD BC,0*256 + BIOS.GetMemPage - ; RST ToBIOS - ; LD (DE),A - ; INC DE - ; ; - ; LD A,(EXE_MEM) - ; LD BC,1*256 + BIOS.GetMemPage - ; RST ToBIOS - ; LD (DE),A - ; INC DE - ; ; - ; LD A,(EXE_MEM) - ; LD BC,2*256 + BIOS.GetMemPage - ; RST ToBIOS - ; LD (DE),A - ; INC DE - ; ; - ; LD A,(EXE_MEM) - ; LD BC,3*256 + BIOS.GetMemPage - ; RST ToBIOS - ; LD (DE),A + LD DE,RAMMAP+3 + LD A,(EXE_MEM) + LD BC,4*256 + BIOS.GetMemPage +.mem_loop: PUSH AF + PUSH BC + DEC B + RST ToBIOS + LD (DE),A + DEC DE + POP BC + POP AF + DJNZ .mem_loop ; - ; LD HL,(CMDLINE) - LD DE,CORE_BUFFERS.BUFFER+1 + ;LD DE,CORE_BUFFERS.BUFFER+1 + LD DE,CORE_BUFFERS.BUFFER_CLP + 1 CALL SCOPYS LD A,#80 ;!HARDCODE cmd line size SUB B - LD (CORE_BUFFERS.BUFFER),A + LD (CORE_BUFFERS.BUFFER_CLP),A ; LD SP,CORE_BUFFERS.EXEBUFF + _sEXE_HEADER ;R02 ; ! Далее стек в нулевой странице! BIOS и не DSS-MAIN не вызывать @@ -385,7 +363,7 @@ FR8000: LD A,(DE) INC DE FRC000: LD A,(DE) OUT (SLOT3),A - CALL M_PSP + ;CALL M_PSP ; LD HL,(CORE_BUFFERS.EXEBUFF.OFFCOD2) LD IX,(CORE_BUFFERS.EXEBUFF.OFFCOD1) @@ -393,10 +371,21 @@ FRC000: LD A,(DE) LD A,(EXE_FM) CALL MOVE_FP ; - LD SP,#403F ;R02 ;!HARDCODE STACK before start EXE. Устанавливается когда воткнуты SHARED_PAGE -_ret+1: JP 0 ;EXEC02.RET1 или _RET_2 - -_TST_PROC_2: LD SP,(CORE_BUFFERS.EXEBUFF.SP_REG) + ;LD SP,#403F ;R02 ;!HARDCODE STACK before start EXE. Устанавливается когда воткнуты SHARED_PAGE + ;LD A,R + ;DI + LD SP,#4100 ;R02 ;!HARDCODE STACK before start EXE. Устанавливается когда воткнуты SHARED_PAGE + ;PUSH AF +_ret+1: JP 0 ;EXEC02.RET_1 или _RET_2 + ; +; сюда возврат из 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 @@ -404,10 +393,10 @@ _TST_PROC_2: LD SP,(CORE_BUFFERS.EXEBUFF.SP_REG) EX DE,HL LD XH,D LD XL,E - LD HL,(CORE_BUFFERS.EXEBUFF.PC_REG) + ;LD HL,(CORE_BUFFERS.EXEBUFF.PC_REG) LD DE,RETFAR ; адрес п/п "неожиданное завершение процесса" PUSH DE - PUSH HL + ;PUSH HL ;!TEST Current Dir ;[x] 15/10/23 PUSH IX LD HL,CORE_BUFFERS.CurrentPath @@ -420,7 +409,10 @@ _TST_PROC_2: LD SP,(CORE_BUFFERS.EXEBUFF.SP_REG) .set_path: CALL CHDIR_FN POP IX ; - RET + EI + ;RET + LD HL,(CORE_BUFFERS.EXEBUFF.PC_REG) + JP (HL) ;----------------------------------------------------------------------- ; ! вызывается когда стек в нулевой странице! M_PSP: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) @@ -428,17 +420,18 @@ M_PSP: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) LD D,H LD E,L INC DE - LD BC,#00FF ;!HARDCODE + LD BC,#00FF ;!FIXIT LD (HL),B LDIR EX DE,HL DEC H - LD DE,#0080 + LD DE,#0080 ;!FIXIT ADD HL,DE EX DE,HL LD XH,D LD XL,E - LD HL,CORE_BUFFERS.BUFFER + ;LD HL,CORE_BUFFERS.BUFFER + LD HL,CORE_BUFFERS.BUFFER_CLP LD C,(HL) INC C LDIR @@ -540,8 +533,8 @@ EXSTACK: DW CORE_BUFFERS.XSTACK.Spoint ; ; 5) В регистр A помещается код возврата и выполняется RET. ; ;///////////////////////////////////////////////////////////////////// -LEAVE: LD A,R - PUSH AF ; INT ON/OFF +LEAVE: ;LD A,R + ;PUSH AF ; INT ON/OFF DI ; LD A,B @@ -552,7 +545,7 @@ LEAVE: LD A,R ; _mDECTASK ; - POP DE ; INT ON/OFF + ;POP DE ; INT ON/OFF LD SP,(EXSTACK) ; тут стек в нулевой странице! POP AF ; -2 EXSTACK size for 1 task @@ -563,15 +556,15 @@ LEAVE: LD A,R LD A,H OUT (SLOT3),A ; - LD A,E ; INT ON/OFF + ;LD A,E ; INT ON/OFF POP DE ; -2 POP HL ; -2 LD (EXSTACK),SP LD SP,HL ; ;!TEST - AND %0000'0100 ; PO/PE flag - JR Z,.no_ei + ;AND %0000'0100 ; PO/PE flag + ;JR Z,.no_ei EI .no_ei: ; EX DE,HL diff --git a/DSS/API/PChars.asm b/DSS/API/PChars.asm index a9c3bbe..271e6a7 100644 --- a/DSS/API/PChars.asm +++ b/DSS/API/PChars.asm @@ -12,9 +12,12 @@ ; CALL PUTCHAR ; JP PCHARS ;/////////////////////////////////////////////////////////////////////// -PCHARS: XOR A ; no attr-mode +PCHARS: XOR A +.NO_SCROLL: LD D,A LD A,(CLEAR.shell_color) LD B,A + LD A,D + AND A ; no attr-mode EX AF,AF' XOR A ; no XY-mode LD C,BIOS.LP_PR_LINE_DIR @@ -22,6 +25,7 @@ PCHARS: XOR A ; no attr-mode JP ToBIOS ;/////////////////////////////////////////////////////////////////////// ; A - атрибуты выводимого символа если CF' +; A' - если !=0 то без скролла ; CF - XY-mode ; DE - место символа в окне, если CF=1 ; HL - адрес с выводимой строкой diff --git a/DSS/API/PutChar.asm b/DSS/API/PutChar.asm index 49e9f79..74be50b 100644 --- a/DSS/API/PutChar.asm +++ b/DSS/API/PutChar.asm @@ -100,7 +100,8 @@ ;/////////////////////////////////////////////////////////////////////// -PUTCHAR: PUSH HL +PUTCHAR: LD C,0 +.NO_SCROLL: PUSH HL ; LD L,A XOR A ; no attr-mode @@ -111,6 +112,7 @@ PUTCHAR: PUSH HL ; LD A,(CLEAR.shell_color) LD B,A + LD A,C EX AF,AF' XOR A ; no XY-mode LD C,BIOS.LP_PR_LINE_DIR diff --git a/DSS/API/curDisk.asm b/DSS/API/curDisk.asm index 70d838e..8ffbe78 100644 --- a/DSS/API/curDisk.asm +++ b/DSS/API/curDisk.asm @@ -5,18 +5,16 @@ ; выход: A - номер диска (0=A,1=B,..) ; C - номер последнего диска в системе ;///////////////////////////////////////////////////////////////////// -CURDISK_FN: - LD A,(LDRIVE) - LD C,A - LD A,(CORE_BUFFERS.CurrentPath) - SUB 'A' - RET NC - LD A,DSS_Error.sys.INVALID_DRIVE - RET -CURDISK: - LD A,(LDRIVE) - LD C,A - LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) - AND A - RET +CURDISK_FN: LD A,(LDRIVE) + LD C,A + LD A,(CORE_BUFFERS.CurrentPath) + SUB 'A' + RET NC + LD A,DSS_Error.sys.INVALID_DRIVE + RET +CURDISK: LD A,(LDRIVE) + LD C,A + LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) + AND A + RET ; \ No newline at end of file diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index af5c4ab..e4c3b4e 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -391,13 +391,15 @@ CurrentDirectory EQU BUFFERSplace.CurrentDirectory .DEPTH EQU DIRECTORY_PATH_LENGTH WorkDirectory EQU BUFFERSplace.WorkDirectory .DEPTH EQU DIRECTORY_PATH_LENGTH +BUFFER_CLP EQU BUFFERSplace.BUFFER_CLP ; буфер для CMD в Execute.asm ENDMODULE CLEAR_ZONE.size EQU _sBuffers ASSERT (CLEAR_ZONE.start + _sBuffers)<#4000, "Warning!!! OUT OF SLOT0" + ASSERT (#4000 - CORE_BUFFERS.BUFFER_CLP) > #100, "Warning!!! No memory for buffer!!!" - + ; Тут не всё DISPLAY "--- --- --- --- --- --- --- ---" DISPLAY "CLEAR_ZONE.start ", /H, CLEAR_ZONE.start DISPLAY "CLEAR_ZONE.Size ", /H, CLEAR_ZONE.size @@ -417,7 +419,7 @@ CLEAR_ZONE.size EQU _sBuffers DISPLAY " MemoryTable ", /H, CORE_BUFFERS.MemoryTable DISPLAY " Size ", /H, _sBuffers - (CORE_BUFFERS.MemoryTable - CORE_BUFFERS.BUFFERSplace) DISPLAY "--- --- --- --- --- --- --- ---" - DISPLAY "CLEAR_ZONE.End ", /H, CLEAR_ZONE.start + CLEAR_ZONE.size + DISPLAY "CLEAR_ZONE.End ", /H, CLEAR_ZONE.start + CLEAR_ZONE.size DISPLAY "--- --- --- --- --- --- --- ---" @@ -444,6 +446,7 @@ CLEAR_ZONE.size EQU _sBuffers EXPORT CORE_BUFFERS.CurrentDirectory.DEPTH EXPORT CORE_BUFFERS.WorkDirectory EXPORT CORE_BUFFERS.WorkDirectory.DEPTH + EXPORT CORE_BUFFERS.BUFFER_CLP ;> > > > > > > > > > > > > > > > BUFFERS < < < < < < < < < < < < < < < < diff --git a/DSS/KEYINTER.ASM b/DSS/KEYINTER.ASM index 4ee0e3a..332a346 100644 --- a/DSS/KEYINTER.ASM +++ b/DSS/KEYINTER.ASM @@ -204,7 +204,8 @@ ECHOKEY: CALL Cursor_On ; POP AF OR A ; [x] -bug with Vasil's version of cursor - CALL NZ,PUTCHAR;.NO_SCROLL ; добавил вывод "a" на экран + LD C,A + CALL NZ,PUTCHAR.NO_SCROLL POP BC POP DE LD A,E diff --git a/DSS/Structures.inc b/DSS/Structures.inc index 9a0b26f..de54b83 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -140,5 +140,6 @@ .CurrentPath WORD 0 .CurrentDirectory BLOCK DIRECTORY_PATH_LENGTH,0 .WorkDirectory BLOCK DIRECTORY_PATH_LENGTH,0 +.BUFFER_CLP BLOCK CLP_Buffer,0 ; буфер для CLP запускаемого в Execute.asm ENDS ; \ No newline at end of file diff --git a/DSS/build.txt b/DSS/build.txt index c227083..56a6051 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -0 \ No newline at end of file +1 \ No newline at end of file diff --git a/SHELL/Commands/CHDIR.ASM b/SHELL/Commands/CHDIR.ASM index 20f168c..013d985 100644 --- a/SHELL/Commands/CHDIR.ASM +++ b/SHELL/Commands/CHDIR.ASM @@ -3,26 +3,25 @@ ; CD, CHDIR. Смена каталога ; ;/////////////////////////////////////////////////// -cmd_chdir: - ex de,hl - ld de,Buffers.work.buffer1; - ld c,Dss.GSwitch ; выделить параметр ком-строки - RST ToDSS - xor a - ld hl,Buffers.work.buffer1; - cp (hl) - jr nz,.chdir - ld (hl),"." ; ".." родит. папка - inc hl - ld (hl),"." - inc hl - ld (hl),0 - dec hl - dec hl -.chdir: ld c,Dss.ChDir ; сменить тек. каталог - RST ToDSS - call c,print_err_message ; вывод сообщения - jp Get_Path ; сохр. тек. диск и путь +cmd_chdir: ex de,hl + ld de,Buffers.work.buffer1; + ld c,Dss.GSwitch ; выделить параметр ком-строки + RST ToDSS + xor a + ld hl,Buffers.work.buffer1; + cp (hl) + jr nz,.chdir + ld (hl),"." ; ".." родит. папка + inc hl + ld (hl),"." + inc hl + ld (hl),0 + dec hl + dec hl +.chdir: ld c,Dss.ChDir ; сменить тек. каталог + RST ToDSS + call c,print_err_message ; вывод сообщения + jp Get_Path ; сохр. тек. диск и путь ; ; вывод сист. пути на экран ; ld c,8Eh ; узнать полож. курсора ; RST ToBIOS diff --git a/SHELL/Commands/EXIT.ASM b/SHELL/Commands/EXIT.ASM index 78f5b9c..c05225b 100644 --- a/SHELL/Commands/EXIT.ASM +++ b/SHELL/Commands/EXIT.ASM @@ -4,9 +4,9 @@ ; ;/////////////////////////////////////////////////// cmd_exit: -.TASKX+1: ld a,2 ; уровень текущего шелла - dec a - dec a - ret z ; a=2 (primary шелл) - ;pop hl ; восст. баланс стека (убрать вызов COMP в гл. цикле оболочки) - jp back_to_parent_process ; вернуться в родит. процесс +.TASKX+1: ld a,2 ; уровень текущего шелла + dec a + dec a + ret z ; a=2 (primary шелл) + ;pop hl ; восст. баланс стека (убрать вызов COMP в гл. цикле оболочки) + jp back_to_parent_process ; вернуться в родит. процесс diff --git a/SHELL/Commands/HELP.ASM b/SHELL/Commands/HELP.ASM index df431b4..906e4e1 100644 --- a/SHELL/Commands/HELP.ASM +++ b/SHELL/Commands/HELP.ASM @@ -24,11 +24,11 @@ cmd_help: LD HL,.help_txt ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;LP_PR_LINE_DIR: -; A - атрибуты выводимого символа если ZF=0 +; A - атрибуты выводимого символа если CF' +; A' - если !=0 то без скролла ; CF - XY-mode ; DE - место символа в окне, если CF=1 ; HL - адрес с выводимой строкой -; B - разделитель +; B - цвет консоли (используется при скролле и очистке окна) ; IY - два спец.символа для выхода с CF=1. Должны быть равны B, если не нужны -; A' - цвет консоли (используется при скролле и очистке окна) ; CF' - выводить символ с атрибутами \ No newline at end of file diff --git a/SHELL/Commands/PAUSE.ASM b/SHELL/Commands/PAUSE.ASM index 0c39baf..6268f24 100644 --- a/SHELL/Commands/PAUSE.ASM +++ b/SHELL/Commands/PAUSE.ASM @@ -9,14 +9,14 @@ cmd_pause: LD A,LF LD C,Dss.PutChar RST ToDSS - LD A,R - PUSH AF + ;LD A,R + ;PUSH AF LD C,Dss.WaitKey ; ждем нажатия клавиши - EI + ;EI RST ToDSS - POP AF - DI - RET PO - EI + ;POP AF + ;DI + ;RET PO + ;EI RET - ;ret +;/////////////////////////////////////////////////// diff --git a/SHELL/Commands/REM.ASM b/SHELL/Commands/REM.ASM index 4bba462..95afea4 100644 --- a/SHELL/Commands/REM.ASM +++ b/SHELL/Commands/REM.ASM @@ -3,8 +3,6 @@ ; REM. Комментарий (в bat-файле) ; ;/////////////////////////////////////////////////// -cmd_rem:; [x] 15/12/23 может и не понадобится - AND A - ; - ret +cmd_rem: AND A + RET ; diff --git a/SHELL/build.txt b/SHELL/build.txt index 8db1e5f..1fc188d 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -522 \ No newline at end of file +525 \ No newline at end of file