From 66c77848edadcdb970b164f33d15cb5814ec1f1f Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 14 Oct 2023 23:40:22 +1000 Subject: [PATCH] =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=BC=D0=B5=D0=B6=D1=83?= =?UTF-8?q?=D1=82=D0=BE=D1=87=D0=BD=D0=B0=D1=8F=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BOOT/DSSBOOT.ASM | 30 +++--- DSS/DOS5.ASM | 269 +++++++++++++++++++++++++++++++++++++++++------ DSS/DOS_FM.ASM | 2 +- DSS/DOS_X.ASM | 28 ++++- DSS/DSS-MAIN.ASM | 40 +++---- DSS/EXECUTE.ASM | 151 ++++++++++++++++++++++++-- DSS/build.txt | 2 +- DSS/defines.inc | 5 +- 8 files changed, 436 insertions(+), 91 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index 9539114..136f0a1 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -176,28 +176,27 @@ CONTINUE: IF UNIVERSAL_BOOT LD A,(DRIVE) - LD C,#00 - RST #10 + LD C,Dss.Version + RST ToDSS jp c,XFAIL.fail LD A,STARTDO CALL DOSMESS LD A,(DRIVE) - LD B,1 - LD C,Dss.BootDSK - RST #10 + LD BC,Dss.BootDSK.Set*256 + Dss.BootDSK + RST ToDSS LD B,0 ELSE IF ORIGINAL_DSS - LD C,#00 - RST #10 + LD C,Dss.Version + RST ToDSS ELSE LD A,(DRIVE) - LD C,#00 - RST #10 + LD C,Dss.Version + RST ToDSS jp c,XFAIL.fail ENDIF @@ -206,27 +205,26 @@ CONTINUE: IF ORIGINAL_DSS LD A,(DRIVE) - LD B,1 - LD C,Dss.BootDSK - RST #10 + LD BC,Dss.BootDSK.Set*256 + Dss.BootDSK + RST ToDSS LD B,0 ENDIF ENDIF LD C,Dss.BootDSK - RST #10 + RST ToDSS ADD A,"A" LD HL,ROOT LD (HL),A LD C,Dss.ChDir - RST #10 + RST ToDSS LD HL,PSHELL LD BC,Dss.Exec - RST #10 + RST ToDSS LD A,NOSHELL JP XFAIL @@ -235,7 +233,7 @@ ROOT: DB 'X:\',0 DOSMESS CALL FMESAGE LD C,Dss.PChars - RST #10 + RST ToDSS RET XFAIL: CALL DOSMESS diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index 0778594..00c5de1 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -31,6 +31,18 @@ //////////////////////////////////////////////////////////////////////// ATTRIB: _mSavePath 1 + ;!Test Current Dir + LD C,A + PUSH HL + PUSH BC + CALL DIR_PATH_CHECK + POP BC + POP HL + RET C + LD A,C + ; + + INC B DEC B JP Z,.RATTRIB @@ -90,14 +102,27 @@ ATTRIB: ; OUTPUT: A - FM //////////////////////////////////////////////////////////////////////// CREATE: _mSavePath 0 + ;!Test Current Dir + PUSH HL + CALL DIR_PATH_CHECK + POP HL + RET C + ; CALL .Prepare RET C CALL SEARCH CALL NC,DELETE ;FILE EXIST RECREAT JR .DO + ; ; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 ; OUTPUT: A - FM .NEW: _mSavePath 0 + ;!Test Current Dir + PUSH HL + CALL DIR_PATH_CHECK + POP HL + RET C + ; CALL .Prepare RET C CALL SEARCH @@ -154,11 +179,18 @@ CREATE: _mSavePath 0 JP MASK CREAT_N EQU CREATE.NEW + //////////////////////////////////////////////////////////////////////// ; INPUT: HL - "c:\dir\filename.ext",#00 without simbols * ? //////////////////////////////////////////////////////////////////////// DEL_FN: ;!TEST _mSavePath 1 + ;!Test Current Dir + PUSH HL + CALL DIR_PATH_CHECK + POP HL + RET C + ; CALL GETWORD ; тест на допуст. имя и настр. на диск RET C LD HL,TMPNAME @@ -213,7 +245,17 @@ DELETE: SET_PAGE_X DIRPAGE ; INPUT: HL - "old_name.ext",#00 without simbols * ? ; DE - "new_name.ext",#00 without simbols * ? //////////////////////////////////////////////////////////////////////// -RENAME: PUSH DE +RENAME: + ;!Test Current Dir + PUSH HL + PUSH DE + CALL DIR_PATH_CHECK.forceCheck + POP DE + POP HL + RET C + ; + + PUSH DE LD DE,MASKARE CALL MASK POP DE @@ -273,6 +315,16 @@ RENAME: PUSH DE //////////////////////////////////////////////////////////////////////// OPEN_FN: _mSavePath 1 + ;!Test Current Dir + LD C,A + PUSH HL + PUSH BC + CALL DIR_PATH_CHECK.forceCheck + POP BC + POP HL + RET C + LD A,C + ; ;R08 OPEN: LD (F_FIRST.ACCESS),A CALL GETWORD @@ -319,8 +371,11 @@ OPEN: LD (F_FIRST.ACCESS),A RET //////////////////////////////////////////////////////////////////////// -; -; +;Входные значения: +; C - #12 +; A - файловый манипулятор +;Выходные значения: +; A - код ошибки, если CF=1 //////////////////////////////////////////////////////////////////////// CLOSE_FN: _mSavePath 1 @@ -376,10 +431,31 @@ CLOSE: LD (F_FIRST.ACCESS),A RET //////////////////////////////////////////////////////////////////////// -; -; +;Входные значения: +; C - #19 +; HL - указатель на файловую спецификацию +; DE - рабочий буфер 44 байта, если B=0, иначе 256 байт +; A - атрибуты, используемые при поиске +; B = 0 - имя найденного файла в формате 11 байт "FilenameExt" +; B = 1 - имя найденного файла в формате DOS "filename.ext",0 +;Выходные значения: +; A - код ошибки, если CF=1 //////////////////////////////////////////////////////////////////////// F_FIRST: + ;!Test Current Dir + LD C,A + PUSH HL + PUSH DE + PUSH BC + CALL DIR_PATH_CHECK + POP BC + POP DE + POP HL + RET C + LD A,C + ; + + LD (.ACCESS),A LD (.DTABUF),DE LD A,B @@ -487,9 +563,16 @@ F_NEXT: //////////////////////////////////////////////////////////////////////// ;!TODO сделать для каждого драйва запоминание текущей дирректории, пока тут заглушка ; RestoreDIR: +CHNDISK_FN: + CALL CHNDISK + RET C + PUSH AF + CALL DIR_PATH_CHANGE.FullCurrent + POP AF + RET CHNDISK: ;!TEST - CALL OPENDSK + CALL OPENDSK ;CALL OPENDSK.force ; ;????? R10 @@ -516,12 +599,13 @@ CHNDISK: ; выход: A - код ошибки, если CF=1 ; !FIXIT может выйти за пределы буфера? //////////////////////////////////////////////////////////////////////// -CURRDIR: EX DE,HL - LD HL,CurrentDirectory +CURRDIR: LD DE,WorkDirectory + JR CURRDIR_FN.skip +CURRDIR_FN: + LD DE,CurrentDirectory +.skip: EX DE,HL XOR A -.loop: ;LD A,(HL) - ;OR A - CP (HL) +.loop: CP (HL) LDI JR NZ,.loop RET @@ -778,10 +862,14 @@ PUT_D_T: //////////////////////////////////////////////////////////////////////// CHDIR_FN: _mSavePath 0 - ; EX DE,HL - ; LD HL,OPENDIR.dir - ; LD (HL),CurrentDirectory - ; CALL CHDIR + ;!Test Current Dir + PUSH HL + CALL DIR_PATH_CHECK + POP HL + RET C + ; + CALL CHDIR + JP DIR_PATH_CHANGE.FullCurrent ; RET ; CHDIR: CALL GETWORD ; тест на допуст. имя и настр. на диск @@ -801,6 +889,17 @@ CHDIR: CALL GETWORD ; ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 //////////////////////////////////////////////////////////////////////// MKDIR: _mSavePath 1 + ;!Test Current Dir + LD C,A + PUSH HL + PUSH BC + CALL DIR_PATH_CHECK + POP BC + POP HL + RET C + LD A,C + ; + CALL GETWORD ; тест на допуст. имя и настр. на диск RET C LD HL,TMPNAME ; 8.3 имя @@ -965,6 +1064,17 @@ MKDIR: _mSavePath 1 ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 //////////////////////////////////////////////////////////////////////// RMDIR: _mSavePath 1 + ;!Test Current Dir + LD C,A + PUSH HL + PUSH BC + CALL DIR_PATH_CHECK + POP BC + POP HL + RET C + LD A,C + ; + CALL GETWORD RET C LD HL,TMPNAME @@ -1051,9 +1161,35 @@ RMDIR: _mSavePath 1 LD A,DSS_Error.sys.DIR_NOT_EMPTY SCF RET + +//////////////////////////////////////////////////////////////////////// +;Входные значения: +; C - #44 +; B = 0, преобразовать из 11 символьного формата в формат ДОС +; HL - 11 символов имени файла +; DE - буфер для имени в формате ДОС +; B = 1, преобразовать из формата ДОС в 11 символьный формат +; HL - имя файла в формате ДОС +; DE - 11 символов имени файла +;Выходные значения: +; A - код ошибки, если CF=1 +//////////////////////////////////////////////////////////////////////// +DOSNAME: + INC B + DEC B + JP Z,GETNAME + DEC B + JP Z,MASK + LD A,DSS_Error.sys.INVALID_FUNCTION + SCF + RET //////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////////////////// + + + + + ;----------------------------------------------------------------------; ; Чтение регистров CMOS @@ -1263,19 +1399,6 @@ WRT_HND: ;----------------------------------------------------------------------; -;----------------------------------------------------------------------; -DOSNAME: - INC B - DEC B - JP Z,GETNAME - DEC B - JP Z,MASK - LD A,DSS_Error.sys.INVALID_FUNCTION - SCF - RET -;----------------------------------------------------------------------; - - ;----------------------------------------------------------------------; ; HL - 11 bytes filename "FILENAMEEXT" ; DE - DOS filename "FILENAME.EXT",0 @@ -1599,16 +1722,19 @@ FINDDIR: LD A,(IX+1) CP "." JP NZ,.IT_DIR - LD HL,CurrentDirectory + ;LD HL,CurrentDirectory + LD HL,WorkDirectory LD D,H LD E,L INC HL - LD BC,CurrentDirectory.DEPTH + ;LD BC,CurrentDirectory.DEPTH + LD BC,WorkDirectory.DEPTH XOR A CPIR ;!FIXIT нет проверки на завершение по BC=0 DEC HL ;R09 ;[x] исправлен баг с парсингом буфера каталога DEC HL - LD BC,CurrentDirectory.DEPTH + ;LD BC,CurrentDirectory.DEPTH + LD BC,WorkDirectory.DEPTH LD A,'\' CPDR INC HL @@ -1630,8 +1756,10 @@ FINDDIR: .ADDSPEC: LD E,XL LD D,XH - LD HL,CurrentDirectory+1 - LD BC,CurrentDirectory.DEPTH-1 + ;LD HL,CurrentDirectory+1 + ;LD BC,CurrentDirectory.DEPTH-1 + LD HL,WorkDirectory+1 + LD BC,WorkDirectory.DEPTH-1 XOR A CPIR ;!FIXIT нет проверки на завершение по BC=0 DEC HL @@ -1933,7 +2061,77 @@ SAVEDIR: AND A RET ;----------------------------------------------------------------------; -;DIRSIZE: WORD 0 ; размер списка каталога size_cash_directory + + +;----------------------------------------------------------------------; +DIR_PATH_CHANGE: +.FullCurrent: LD A,(FatBuffer.DRIVE) + ADD 'A' + LD (CurrentPath),A + ; +.Current: LD HL,WorkDirectory + LD DE,CurrentDirectory + LD BC,DIRECTORY_PATH_LENGTH + LDIR + RET + ; +.FullWork: LD A,(CurrentPath) + SUB 'A' + LD (FatBuffer.DRIVE),A + ; +.Work: LD HL,CurrentDirectory + LD DE,WorkDirectory + LD BC,DIRECTORY_PATH_LENGTH + LDIR + RET +DIR_PATH_CHECK: LD A,(HL) + CP '\' + JR NZ,.notRootDir + ; + CALL .checkDrive + RET Z + LD A,(CurrentPath) + SUB 'A' + JP OPENDSK + ; +.notRootDir: INC HL + LD A,(HL) + CP ':' + RET Z + ; +.forceCheck: CALL .checkDrive + JR Z,.checkDir + ; + LD HL,CurrentPath + LD A,(FatBuffer.DRIVE) + ADD 'A' + CP (HL) + JP NZ,GETWORD + ; +.checkDir: LD HL,CurrentDirectory+1 + LD DE,WorkDirectory+1 + ; +.loop: LD A,(DE) + AND A + JR Z,.end + CP (HL) + INC HL + INC DE + JR Z,.loop + ; + JR .ReDir +.end: CP (HL) + RET Z +.ReDir: LD HL,CurrentDirectory + JP GETWORD + ; +.checkDrive: LD HL,CurrentPath + LD A,(FatBuffer.DRIVE) + ADD 'A' + CP (HL) + RET +;----------------------------------------------------------------------; + @@ -1957,6 +2155,7 @@ MASKARE: BLOCK 8,0 ; ;//MODULE: DOS5 ;[END] +;DIRSIZE: WORD 0 ; размер списка каталога size_cash_directory ;!TODO ? diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index 367b81e..e7105c0 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -551,7 +551,7 @@ TSTSIZE XOR A ; HL - ADDRESS ; DE - SIZE ; A - FM -READ_FN: +;READ_FN: ; _mSavePath 1 ; HL - ADDRESS ; DE - SIZE diff --git a/DSS/DOS_X.ASM b/DSS/DOS_X.ASM index f4a79af..97816e7 100644 --- a/DSS/DOS_X.ASM +++ b/DSS/DOS_X.ASM @@ -141,6 +141,12 @@ NDISK11: ; вход: нет ; выход: A - номер диска (0=A,1=B,..) ;///////////////////////////////////////////////////////////////////// +CURRDSK_FN: + LD A,(CurrentPath) + SUB 'A' + RET NC + LD A,DSS_Error.sys.INVALID_DRIVE + RET CURRDSK: LD A,(FatBuffer.DRIVE) AND A RET @@ -160,10 +166,20 @@ CURRDSK: LD A,(FatBuffer.DRIVE) ;///////////////////////////////////////////////////////////////////// DISKINF: CP #FF ; !FIXIT WorkDirectory - JR Z,CURRDS ;R06 + ;!TEST Current Dir + ;JR Z,CURRDS ;R06 + JR NZ,.CustomDisk + LD A,(CurrentPath) + SUB 'A' + LD HL,FatBuffer.DRIVE + CP (HL) + JR Z,CURRDS + ; +.CustomDisk: CALL CHNDISK ;R06 RET C ;R06 -CURRDS: LD HL,2 +CURRDS: + LD HL,2 LD BC,0 FRESP: PUSH BC CALL R_F_FAT @@ -540,7 +556,7 @@ DOS_X_Error: ;!TODO к буферам! FatBuffer: .MSG: DB 'FAT' -.READ_PG: DB #00 +.READ_PG: DB #00 ;!TODO не используются некоторые значения, но задумка неплохая))) .BLOCK: DB #00 .DIR_CLU: DW #0000 .DRIVE: DB #FF @@ -562,11 +578,13 @@ FatBuffer: ; ;!TODO к буферам! +CurrentPath: DB 'X' + DB ':' CurrentDirectory: DB '\' .DEPTH: EQU DIRECTORY_PATH_LENGTH BLOCK CurrentDirectory.DEPTH,0 ; не .DEPTH-1 чтоб был 0 в конце - IF SAVE_PATH_MACRO + IF SAVE_PATH_CODE WorkDirectory: DB '\' .DEPTH: EQU DIRECTORY_PATH_LENGTH BLOCK WorkDirectory.DEPTH,0 ; не .DEPTH-1 чтоб был 0 в конце @@ -597,7 +615,7 @@ SAVE_CUR_PATH LD A,":" LD (HL),A INC HL - CALL CURRDIR + CALL CURRDIR_FN ; почему не POP AF : OUT (SLOT3),A //POP BC diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index 981510c..e0a14df 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -377,16 +377,16 @@ GO_ZERO EQU #0000 ADRST10: ;DS 512 ;,0 ;...............................................[LOW ADDRESS ]: ; 0 1 2 3 4 5 6 7 8 9 DEC HEX - DB low F_START, low CHNDISK, low CURRDSK, low DISKINF, low NOPS, low NOPS, low NOPS, low NOPS, low SCANDRV, low BOOTDSK ; 0 00..09 - DB low CREATE, low CREAT_N, low NOPS, low NOPS, low DEL_FN, low NOPS, low RENAME, low OPEN_FN, low CLOSE_FN, low READ_FN ; 1 0A..13 - DB low WRITE, low MOVE_FP, low ATTRIB, low GET_D_T, low PUT_D_T, low F_FIRST, low F_NEXT, low MKDIR, low RMDIR, low CHDIR_FN ; 2 14..1D - DB low CURRDIR, low NOPS, low NOPS, low SYSTIME, low SETTIME, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 3 1E..27 - DB low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low WAITKEY, low SCANKEY ; 4 28..31 - DB low ECHOKEY, low CTRLKEY, low NOPS, low K_CLEAR, low K_SETUP, low TESTKEY, low SETWIN, low SETWIN1, low SETWIN2, low SETWIN3 ; 5 32..3B - DB low FREEMEM, low GETMEM, low RETMEM, low SETMEM, low EXEC, low LEAVE, low WAIT, low GSWITCH, low DOSNAME, low EX_PATH ; 6 3C..45 - DB low ENVIRON, low APPINFO, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 7 46..4F - DB low SETVMOD, low GETVMOD, low LOCATE, low CURSOR, low SELPAGE, low SCROLL, low CLEAR, low RDCHAR, low WRCHAR, low WINCOPY ; 8 50..59 - DB low WINREST, low PUTCHAR, low PCHARS, low NOPS, low NOPS, low PRINT ; 9 5A..5F + DB low F_START, low CHNDISK_FN, low CURRDSK_FN,low DISKINF, low NOPS, low NOPS, low NOPS, low NOPS, low SCANDRV, low BOOTDSK ; 0 00..09 + DB low CREATE, low CREAT_N, low NOPS, low NOPS, low DEL_FN, low NOPS, low RENAME, low OPEN_FN, low CLOSE_FN, low READ ; 1 0A..13 + DB low WRITE, low MOVE_FP, low ATTRIB, low GET_D_T, low PUT_D_T, low F_FIRST, low F_NEXT, low MKDIR, low RMDIR, low CHDIR_FN ; 2 14..1D + DB low CURRDIR_FN,low NOPS, low NOPS, low SYSTIME, low SETTIME, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 3 1E..27 + DB low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low WAITKEY, low SCANKEY ; 4 28..31 + DB low ECHOKEY, low CTRLKEY, low NOPS, low K_CLEAR, low K_SETUP, low TESTKEY, low SETWIN, low SETWIN1, low SETWIN2, low SETWIN3 ; 5 32..3B + DB low FREEMEM, low GETMEM, low RETMEM, low SETMEM, low EXEC, low LEAVE, low WAIT, low GSWITCH, low DOSNAME, low EX_PATH ; 6 3C..45 + DB low ENVIRON, low APPINFO, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 7 46..4F + DB low SETVMOD, low GETVMOD, low LOCATE, low CURSOR, low SELPAGE, low SCROLL, low CLEAR, low RDCHAR, low WRCHAR, low WINCOPY ; 8 50..59 + DB low WINREST, low PUTCHAR, low PCHARS, low NOPS, low NOPS, low PRINT ; 9 5A..5F IFN SHORT_RSTx10_TABLE ;[ ] R09 @@ -404,16 +404,16 @@ ADRST10: ;DS 512 ;,0 ;[ ] R09 ENDIF ;...............................................[HIGH ADDRESS]: - DB high F_START,high CHNDISK,high CURRDSK,high DISKINF,high NOPS, high NOPS, high NOPS, high NOPS, high SCANDRV, high BOOTDSK - DB high CREATE, high CREAT_N,high NOPS, high NOPS, high DEL_FN, high NOPS, high RENAME, high OPEN_FN,high CLOSE_FN,high READ - DB high WRITE, high MOVE_FP,high ATTRIB, high GET_D_T,high PUT_D_T,high F_FIRST,high F_NEXT, high MKDIR, high RMDIR, high CHDIR_FN - DB high CURRDIR,high NOPS, high NOPS, high SYSTIME,high SETTIME,high NOPS, high NOPS, high NOPS, high NOPS, high NOPS - DB high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high WAITKEY, high SCANKEY - DB high ECHOKEY,high CTRLKEY,high NOPS, high K_CLEAR,high K_SETUP,high TESTKEY,high SETWIN, high SETWIN1,high SETWIN2, high SETWIN3 - DB high FREEMEM,high GETMEM, high RETMEM, high SETMEM, high EXEC, high LEAVE, high WAIT, high GSWITCH,high DOSNAME, high EX_PATH - DB high ENVIRON,high APPINFO,high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS - DB high SETVMOD,high GETVMOD,high LOCATE, high CURSOR, high SELPAGE,high SCROLL, high CLEAR, high RDCHAR, high WRCHAR, high WINCOPY - DB high WINREST,high PUTCHAR,high PCHARS, high NOPS, high NOPS, high PRINT + DB high F_START, high CHNDISK_FN,high CURRDSK_FN,high DISKINF,high NOPS, high NOPS, high NOPS, high NOPS, high SCANDRV, high BOOTDSK + DB high CREATE, high CREAT_N, high NOPS, high NOPS, high DEL_FN, high NOPS, high RENAME, high OPEN_FN,high CLOSE_FN,high READ + DB high WRITE, high MOVE_FP, high ATTRIB, high GET_D_T,high PUT_D_T,high F_FIRST,high F_NEXT, high MKDIR, high RMDIR, high CHDIR_FN + DB high CURRDIR_FN,high NOPS, high NOPS, high SYSTIME,high SETTIME,high NOPS, high NOPS, high NOPS, high NOPS, high NOPS + DB high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high WAITKEY, high SCANKEY + DB high ECHOKEY, high CTRLKEY, high NOPS, high K_CLEAR,high K_SETUP,high TESTKEY,high SETWIN, high SETWIN1,high SETWIN2, high SETWIN3 + DB high FREEMEM, high GETMEM, high RETMEM, high SETMEM, high EXEC, high LEAVE, high WAIT, high GSWITCH,high DOSNAME, high EX_PATH + DB high ENVIRON, high APPINFO, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS + DB high SETVMOD, high GETVMOD, high LOCATE, high CURSOR, high SELPAGE,high SCROLL, high CLEAR, high RDCHAR, high WRCHAR, high WINCOPY + DB high WINREST, high PUTCHAR, high PCHARS, high NOPS, high NOPS, high PRINT IFN SHORT_RSTx10_TABLE ;[ ] R09 diff --git a/DSS/EXECUTE.ASM b/DSS/EXECUTE.ASM index 2786eb6..aa6c19e 100644 --- a/DSS/EXECUTE.ASM +++ b/DSS/EXECUTE.ASM @@ -672,7 +672,7 @@ FINDPATH: SET_PAGE_X ENVPAGE PUSH AF - CALL CURRDSK + CALL CURRDSK_FN ADD A,"A" LD HL,TMP_CURDIR LD (HL),A @@ -680,7 +680,7 @@ FINDPATH: LD A,":" LD (HL),A INC HL - CALL CURRDIR + CALL CURRDIR_FN CALL MAKE_PATH_ARRAY LD HL,PATH_PNT_ARRAY @@ -769,6 +769,7 @@ ENVPATH DB "PATH=",0 ; !TODO СДЕЛАТЬ СТРУКТУРОЙ и обозначить страницу TMP_CURDIR_AUTO EQU #FB00 PATH_PNT_ARRAY EQU #FC80 +; !FIXIT не нужно если SAVE_PATH_MACRO = 1 TMP_CURDIR EQU #FD00 ENVTEMP EQU #FE00 @@ -949,6 +950,10 @@ NOINK: LD A,H JP NZ,ERREXE0 LD B,L + LD HL,_RET_1 + LD (_ret),HL + JP _TST_PROC +/* ;!FIXIT double 1 CALL GETMEM JP C,ERREXE0 @@ -1031,10 +1036,12 @@ FRC000: LD A,(DE) LD A,(EXE_FM) CALL MOVE_FP ;R02 - LD SP,#403F ;!HARDCODE STACK before start EXE. Устанавливается когда воткнуты DSS_PAGE + LD SP,#403F ;!HARDCODE STACK before start EXE. Устанавливается когда воткнуты SHARED_PAGE ; ; - LD DE,(CORE_BUFFERS.EXEBUFF.LD_ADDR) +*/ + +_RET_1: LD DE,(CORE_BUFFERS.EXEBUFF.LD_ADDR) XOR A LD H,A LD L,A @@ -1045,7 +1052,8 @@ FRC000: LD A,(DE) CALL READ ; чтение из файла LD A,(EXE_FM) ; дескр. файла CALL CLOSE ; закрыть файл - + JP _TST_PROC_2 +/* ;!FIXIT double 2 ;R09 ;_mRestorePath @@ -1067,6 +1075,7 @@ FRC000: LD A,(DE) RET ; +*/ ;[ ] RETFAR: LD B,DSS_Error.sys.UNEXPECTED_APP_TRMN JP LEAVE ; завершить программу (процесс) @@ -1121,7 +1130,10 @@ PRELOAD: EX DE,HL OR L JR Z,NOINK2 INC B -NOINK2: +NOINK2: LD HL,_RET_2 + LD (_ret),HL + JR _TST_PROC +/* ;!FIXIT double 1 CALL GETMEM JP C,ERREXE0 @@ -1204,15 +1216,17 @@ FRC000H: LD A,(DE) LD A,(EXE_FM) CALL MOVE_FP ;R02 - LD SP,#403F ;!HARDCODE STACK before start EXE. Устанавливается когда воткнуты DSS_PAGE + LD SP,#403F ;!HARDCODE STACK before start EXE. Устанавливается когда воткнуты SHARED_PAGE ; ; - - LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) ; буфер +*/ +_RET_2: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) ; буфер LD DE,(CORE_BUFFERS.EXEBUFF.LOADER) ; число чит. байт LD A,(EXE_FM) ; дескр. файла CALL READ ; чтение из файла + JP _TST_PROC_2 +/* ;!FIXIT double 2 ;R09 ;_mRestorePath @@ -1234,6 +1248,121 @@ FRC000H: LD A,(DE) RET ; +*/ + + +;----------------------------------------------------------------------- +_TST_PROC: + ;!FIXIT double 1 + CALL GETMEM + JP C,ERREXE0 + LD (EXE_MEM),A + EXX + POP DE ;снимаем со стека адрес возврата + LD HL,#0000 + ADD HL,SP + LD SP,(EXSTACK) + PUSH HL + PUSH DE + IN A,(SLOT3) + LD D,A + IN A,(SLOT2) + LD E,A + IN A,(SLOT1) + PUSH DE + PUSH AF + LD (EXSTACK),SP + LD SP,HL + EXX + ; НЕ СОХРАНЯЕТСЯ DE перед вызовом BIOS, а биос пока его и не портит + LD A,(EXE_MEM) + LD DE,RAMMAP + 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 HL,(CMDLINE) + LD DE,CORE_BUFFERS.SECBUF+1 + CALL SCOPYS + LD A,#80 ;!HARDCODE cmd line size + SUB B + LD (CORE_BUFFERS.SECBUF),A + ;R02 + LD SP,CORE_BUFFERS.EXEBUFF+510 ;Вставляется в SHARED_PAGE + ; + LD A,SHARED_PAGE + OUT (SLOT1),A + OUT (SLOT2),A + OUT (SLOT3),A + LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) + LD DE,RAMMAP + LD A,H + AND #C0 + CP #40 + JR Z,FR4000 + CP #80 + JR Z,FR8000 + CP #C0 + JR Z,FRC000 +FR4000: LD A,(DE) + OUT (SLOT1),A + INC DE +FR8000: LD A,(DE) + OUT (SLOT2),A + INC DE +FRC000: LD A,(DE) + OUT (SLOT3),A + CALL M_PSP + + LD HL,(CORE_BUFFERS.EXEBUFF.OFFCOD2) + LD IX,(CORE_BUFFERS.EXEBUFF.OFFCOD1) + LD B,Dss.Move_FP.FrStart + LD A,(EXE_FM) + CALL MOVE_FP + ;R02 + LD SP,#403F ;!HARDCODE STACK before start EXE. Устанавливается когда воткнуты SHARED_PAGE + ; +_ret+1: JP 0 + ; + +_TST_PROC_2: + ;!FIXIT double 2 + ;R09 + ;_mRestorePath + ; + LD SP,(CORE_BUFFERS.EXEBUFF.SP_REG) + LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) + LD DE,#0080 + AND 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 + + _mRestorePath + + RET + ; +;----------------------------------------------------------------------- ;///////////////////////////////////////////////////////////////////// ; Функция #41. Завершить программу (процесс). @@ -1322,7 +1451,7 @@ M_PSP: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) LD (HL),B INC HL ;!FIXIT тут восстанавливать правильный каталог - CALL CURRDSK + CALL CURRDSK_FN ADD A,'A' LD (HL),A INC HL @@ -1330,7 +1459,7 @@ M_PSP: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) LD (HL),A INC HL PUSH HL - CALL CURRDIR + CALL CURRDIR_FN ; POP HL XOR A diff --git a/DSS/build.txt b/DSS/build.txt index 6a5426c..9301519 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -474 \ No newline at end of file +483 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index a28e102..d931abd 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -15,7 +15,8 @@ DSS_MAX_DRIVES_AMOUNT EQU 26 DEFINE TABisSPACES 0 DEFINE EnoughtOnly_LF 0 DEFINE CLASSIC_CURSOR 0 - DEFINE SAVE_PATH_MACRO 0 + DEFINE SAVE_PATH_MACRO 0 ;\____ либо то, либо то + DEFINE SAVE_PATH_CODE 1 ;/ DEFINE MINIMUM_BIOS_VERSION 2*256 + 55 ; version 2.55 ; ;-------------------[MEMORY]-------------------------; @@ -32,7 +33,7 @@ DRVPAGE EQU 3 DEFINE USING_MEMPAGES 4 ; размер блока дополнительных страниц COREPAGE EQU 4 ; она отдельно и не с блоком выше. ;----------------------------------------------------------------------- -DIRECTORY_PATH_LENGTH EQU 256 ; '\' + 1..255 +DIRECTORY_PATH_LENGTH EQU 256 ; '\' + 255, 0 ENVIRONMENT_STRING_LENGTH EQU 255 TXTADDR EQU #C000