diff --git a/Console/CONSOLE.ASM b/Console/CONSOLE.ASM index 69d4167..7598af9 100644 --- a/Console/CONSOLE.ASM +++ b/Console/CONSOLE.ASM @@ -10,6 +10,7 @@ ;=====================================================================[] ;Rev. Date Name Description ;---------------------------------------------------------------------[] +;R11 20-07-2023 BAO Поправлена функция LCPIR для корректного выбора сообщения об ошибке при номере ошибки > заготовленных сообщений ;R10 16-05-2023 BAO TEХT MODE AND TEXT ARE RESTORED AFTER RETURNING FROM THE APP ;R09 ??-??-???? DNS ;????? ???? ;R08 21-02-2003 DNS FIX BUG IN BAT-PARSER, IT SPLIT STRINGS @@ -1795,15 +1796,23 @@ MESSAGE CALL FMESAGE FMESAGE INC DE LD HL,MSG0 LD BC,MSG1-MSG0 -LCPIR XOR A +LCPIR: XOR A CPIR RET PO RET NZ + ;R11 + XOR A + CP (HL) + JR Z,.no_mess + ; DEC DE LD A,D OR E JP NZ,LCPIR RET +.no_mess: INC HL + RET + PUTPRM LD BC,15 PUTPRMA LD A,(HL) @@ -1903,62 +1912,67 @@ MSG0 DB 0 DB "DATE EXIT PATH RMDIR VERSION " DB " ",CR,LF DB 0 -MSG1 - +MSG1: +;----------------------------------------------------------------------- +;!FIXIT функция вызывающая вывод ошибки делает в начале фильтр по номерам и несколько первых отшиваются ERR0 DB #00 - DB "Bad command or file name",0 - DB "Invalid function",0 - DB "Invalid drive number",0 - DB "File not found",0 - DB "Path not found",0 - DB "Invalid handle",0 - DB "Extended error 6",0 - DB "File exist",0 - DB "File read only",0 - DB "Root overflow",0 - DB "No free space",0 - DB "Directory not empty",0 - DB "Can't delete current directory",0 - DB "Invalid media",0 - DB "Unknown operation",0 ;R02 - DB "Directory exist",0 - DB "Invalid filename",0 - DB "Invalid EXE-file",0 - DB "Not supported EXE-file",0 - DB "Access denied",0 - DB "Not ready",0 - DB "Seek error",0 - DB "Sector not found",0 - DB "CRC error",0 - DB "Write protect",0 - DB "Read error",0 - DB "Write error",0 - DB "Drive failure",0 - DB "Extended error 28",0 - DB "Extended error 29",0 - DB "No free memory",0 - DB "Invalid memory block",0 - DB "Extended error 32",0 - DB "Extended error 33",0 - DB "Extended error 34",0 - DB "35",0 - DB "36",0 - DB "37",0 - DB "38",0 - DB "39",0 - DB "40",0 - DB "41",0 - DB "42",0 - DB "43",0 - DB "44",0 - DB "45",0 - DB "46",0 - DB "47",0 - DB "48",0 - DB "49",0 - DB "50" - DB 0 -ERR1 + DZ "Bad command or file name" + DZ "Invalid function" ; 01 - неверный номер функции + DZ "Invalid drive number" ; 02 - неправильный номер устройства + DZ "File not found" ; 03 - файл не обнаружен + DZ "Path not found" ; 04 - неверный путь + DZ "Invalid handle" ; 05 - несуществующий файловый манипулятор + DZ "No free filehandle" ; 06 - нет свободного файлового манипулятора + DZ "File exist" ; 07 - файл существует + DZ "File read only" ; 08 - файл только для чтения + DZ "Root overflow" ; 09 - переполнение ROOT (корневого каталога) + DZ "No free space" ; 10 - нет свободного места на диске + DZ "Directory not empty" ; 11 - каталог не пуст + DZ "Can't delete current directory" ; 12 - неудачная попытка удалить текущий каталог + DZ "Invalid media" ; 13 - неизвестный формат + DZ "Unknown operation" ;R02 ; 14 - невозможная операция + DZ "Directory exist" ; 15 - каталог уже есть + DZ "Invalid filename" ; 16 - неверное имя + DZ "Invalid EXE-file" ; 17 - неправильный EXE-файл + DZ "Not supported EXE-file" ; 18 - не поддерживаемая версия EXE-файла + DZ "Access denied" ; 19 - ресурс не доступен + DZ "Not ready" ; 20 - нет готовности + DZ "Seek error" ; 21 - ошибка позиционирования + DZ "Sector not found" ; 22 - сектор не найден + DZ "CRC error" ; 23 - ошибка CRC + DZ "Write protect" ; 24 - защита записи + DZ "Read error" ; 25 - ошибка чтения + DZ "Write error" ; 26 - ошибка записи + DZ "Drive failure" ; 27 - сбой диска + DZ "Extended error 28" + DZ "Extended error 29" + DZ "No free memory" ; 30 - недостаточно памяти + DZ "Invalid memory block" ; 31 - несуществующий блок памяти + DZ "Extended error 32" + DZ "Maximum PATH size exceeded" ; 33 - превышен максимальный размер переменной + DZ "Extended error 34" + DZ "Too many files in directory" ; 35 - слишком много файлов в директории + DZ "Directory nesting too large or number of folders > 1023" ; 36 - слишком большая вложенность каталогов или количество папок > 1023 + DZ "Operation interrupted by user" ; 37 - операция прервана пользователем + DZ "Common error" ; 38 - общая ошибка + DZ "Unexpected application termination" ; 39 - unexpected application termination / неожиданное завершение приложения + DZ "40" + DZ "41" + DZ "42" + DZ "43" + DZ "44" + DZ "45" + DZ "46" + DZ "Wrong video mode" ; 48 - неправильный видеорежим + DZ "48" + DZ "49" + DZ "50" + ;R11 + BYTE 0 ; ограничитель, чтоб при ошибке больше, чем есть сообщений выдавалось общее: + DZ "Unknown error" + ; +ERR1: +;----------------------------------------------------------------------- GETPATH: LD C,Dss.CurDisk diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index d62542b..a279d3e 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -174,7 +174,7 @@ DEL01 EX DE,HL ; hl= CALL WR_FAT JP SAVEDIR ; сбросить кеш каталога на диск -;///////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// ; Функция #10. Переименование файла. ; Глобальные символы * и ? в именах файлов не допускаются. ; @@ -184,7 +184,7 @@ DEL01 EX DE,HL ; hl= ; ; INPUT: HL - "old_name.ext",#00 without simbols * ? ; DE - "new_name.ext",#00 without simbols * ? -;///////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// RENAME PUSH DE LD DE,MASKARE CALL MASK @@ -249,7 +249,7 @@ OPENATR: ;R02 -;///////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// ; Функция #11. Открытие файла. ; ; вход: HL - указатель на имя файла @@ -259,7 +259,7 @@ OPENATR: ; A=2 запись ; выход: A - дескриптор файла, если CF=0 ; код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// OPEN_FN: _mSavePath OPEN: ;R08 @@ -931,12 +931,12 @@ IT_DIR: LD E,(IX+_sFM.ST_CLUSTER) RET -;///////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// ; Функция #1E. Информация о текущем каталоге. ; ; вход: HL - буфер в памяти 256 байт ; выход: A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// CURRDIR: EX DE,HL LD HL,DIRSPEC CURDIR1 LD A,(HL) @@ -1262,7 +1262,7 @@ HGUPPER CP ' RET -;///////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// ; Функция #21. Текущая дата и время. ; ; вход: нет @@ -1273,7 +1273,7 @@ HGUPPER CP ' ; L - минуты ; B - секунды ; C - день недели -;///////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// SYSTIME LD C,BIOS.CMOS_TEST RST ToBIOS JP C,NOCMOS @@ -1396,7 +1396,7 @@ NOCMOS2 LD C,0 AND A RET -;///////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// ; Функция #22. Установить текущую дату и время. ; ; вход: D - день @@ -1406,7 +1406,7 @@ NOCMOS2 LD C,0 ; L - минуты ; B - секунды ; выход: A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// SETTIME PUSH IX PUSH BC PUSH HL @@ -1492,7 +1492,7 @@ NC_YEAR DW YEAR ;YEAR -;///////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// ; Функция #17. Информация о дате и времени файла. ; ; вход: A - дескриптор файла @@ -1503,7 +1503,7 @@ NC_YEAR DW YEAR ;YEAR ; L - минуты ; B - секунды ; A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// GET_D_T CALL SET_FM RET C @@ -1516,7 +1516,7 @@ GET_D_T AND A RET -;///////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// ; Функция #18. Изменение даты и времени файла. ; ; вход: A - дескриптор файла @@ -1527,7 +1527,7 @@ GET_D_T ; L - минуты ; B - секунды ; выход: A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// PUT_D_T PUSH AF CALL MK_TIME ; закодировать время/дату POP AF ; дескриптор @@ -1644,7 +1644,7 @@ RMKTIME EX DE,HL RET -;///////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// ; Функция #1D. Смена текущего каталога. ; Меняет текущий каталог и текущий диск, если он указан в файловой ; спецификации. Если путь начинается с "\" - это означает путь от @@ -1654,7 +1654,7 @@ RMKTIME EX DE,HL ; выход: нет ; ; INPUT: HL - "C:\DIR\DIR\DIR_NAME[\]",0 -;///////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// CHDIR: CALL GETWORD ; тест на допуст. имя и настр. на диск RET C LD HL,TMPNAME @@ -1663,14 +1663,14 @@ CHDIR: CALL GETWORD ; CALL NZ,OPENDIR RET -;///////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// ; Функция #1B. Создание каталога. ; ; вход: HL - указатель на имя каталога ; выход: A - код ошибки, если CF=1 ; ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 -;///////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// MKDIR: _mSavePath CALL GETWORD ; тест на допуст. имя и настр. на диск @@ -1824,7 +1824,7 @@ MKD11 POP AF AND A RET -;///////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// ; Функция #1C. Удаление каталога. ; Можно удалить только пустой каталог. ; @@ -1832,7 +1832,7 @@ MKD11 POP AF ; выход: A - код ошибки, если CF=1 ; ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 -;///////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// RMDIR: _mSavePath CALL GETWORD diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index b672b3e..3809b5c 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -61,7 +61,7 @@ ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[CLOSE TASK]> ; -RST_0x00: JP LEAVE ; +RST_0x00: JP RETFAR ; ;EXECUTE.ASM R12 ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; @@ -433,9 +433,11 @@ BootSector _sBOOT_SEC = BUFFERSplace.BootSector EXEBUFF _sEXE_HEADER = BUFFERSplace.EXE_Header XSTACK EQU BUFFERSplace.Stack.SPoint BUFFER EQU BUFFERSplace.Buffer -SECBUF EQU BUFFER +SECBUF EQU BUFFER ;!TODO отделить SECBUF от BUFFER CLEAR_ZONE.size EQU _sBuffers + + ASSERT (BUFFERSplace+_sBuffers)<#3FFF, "Warning!!! OUT OF SLOT0" DISPLAY "--- --- --- --- --- --- --- ---" DISPLAY "BUFFERSplace.BootSector ",/H,BUFFERSplace.BootSector DISPLAY "BootSector ", /H, BootSector @@ -446,7 +448,6 @@ CLEAR_ZONE.size EQU _sBuffers /* ;R11 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ -;!TEST FM_BUF _sFM=$ .Size EQU _sFM .FullSize EQU FMCOUNT*FM_BUF.Size @@ -492,7 +493,7 @@ SECBUF EQU BUFFER ;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||; ; !!!!! эта процедура затрётся после исполнения DEPLOY: -;Allocate memory + ;Allocate memory LD BC,USING_MEMPAGES*256 + BIOS.GetMem RST ToBIOS RET C ;R10 diff --git a/DSS/EXECUTE.ASM b/DSS/EXECUTE.ASM index c48bba8..105f882 100644 --- a/DSS/EXECUTE.ASM +++ b/DSS/EXECUTE.ASM @@ -6,6 +6,7 @@ ;--------------------------------------------------------------- ;Rev Date Name Description ;--------------------------------------------------------------- +;R12 20-07-2023 BAO При завершении приложения через функцию #41 или "аварийно" в возвращаемое приложение передаётся код ошибки и флаг CF=1 ;R11 17-04-2023 BAO OPTIMIZED BUFFERS, FREED UP 768 BYTES FOR CODE ;R10 13-04-2023 BAO FIX BUG WITH PARSING DIRECTORY BUFFER ;R09 14-04-2003 DNS NOW EXEC DON'T FOLLOW TO PROGRAM'S DIR @@ -20,17 +21,26 @@ ;R01 14-05-1999 DNS DECREASE HEADER SIZE FOR EXE-FILE ;--------------------------------------------------------------- + +////////////////////////////////////////////////////////////////////// +; Функция #47. Получение информации приложения. +; +; вход: HL - буфер данных +; B - номер подфункции: +; B=0 - получение параметров командной строки +; B=1 - получение полного пути к каталогу программы +; B=2 - получение полного пути и имени файла программы +; выход: нет ; ; APPLICATION INFO ;==================== -; ; B = 0 - GET APP_PARAM ; B = 1 - GET APP_PATH ; B = 2 - GET APP_FULLNAME -LAST_PSP_PTR DW 0 - -APPINFO INC B -APPINF0 DJNZ APPINF1 +////////////////////////////////////////////////////////////////////// +;LAST_PSP_PTR: DW 0 +APPINFO: INC B +APPINF0: DJNZ APPINF1 EX DE,HL XOR A LD (DE),A @@ -43,22 +53,25 @@ APPINF0 DJNZ APPINF1 AND A RET +; Получение параметров командной строки APPINF1: DJNZ APPINF2 EX DE,HL - LD HL,(LAST_PSP_PTR) +LAST_PSP_PTR+1: + LD HL,0 + LD C,(HL) INC HL ADD HL,BC INC HL INC HL PUSH HL - LD BC,#100 + LD BC,#100 ;!HARDCODE длина коммандной строки XOR A CPIR DEC HL ;R10 ;[x] исправлен баг с парсингом буфера каталога DEC HL ;R10,5 - не тестил ;!!!!! - LD BC,#100 ;R10 ;[x] не было этой команды, CPDR мог не прошерстить всё + LD BC,#100 ;R10 ;[x] не было этой команды, CPDR мог не прошерстить всё ;!HARDCODE длина коммандной строки LD A,'\' CPDR INC HL @@ -77,6 +90,7 @@ APPINF1: LD (DE),A RET +; Получение полного пути к каталогу программы APPINF2: DJNZ APPINF3 EX DE,HL @@ -96,19 +110,32 @@ APPINF3 LD A,DSS_Error.sys.INVALID_FUNCTION SCF RET - -;=================== function 45H =================== - -; HL - Input command line - +////////////////////////////////////////////////////////////////////// +; Функция #45. Разбор командной строки. +; +; вход: HL - указатель командной строки +; DE - указатель на буфер пользователя +; B - номер подфункции: +; 0 - Разобрать строку +; 1 - Выделить имя диска +; 2 - Выделить директорию +; 3 - Выделить имя файла +; 4 - Выделить расширение файла +; 5 - Выделить имя диска, путь к файлу, имя файла и расш. файла +; 6 - Зарезервировано +; 7 - Выделить параметр командной строки +; 8 - Преобразовать из 11 символьного формата в формат ДОС +; 9 - Преобразовать из формата ДОС в 11 символьный формат +; выход: нет +////////////////////////////////////////////////////////////////////// GLOB_PR EQU 7 ;%10000000 DRIV_PR EQU 3 ;%00001000 PATH_PR EQU 2 ;%00000100 EXTN_PR EQU 1 ;%00000010 NAM_PR EQU 0 ;%00000001 -EX_PATH EXX - LD HL,NM_PATH_A ;BUILT-IN BUFFER FOR PATH +EX_PATH: EXX + LD HL,NM_PATH_A ;BUILT-IN BUFFER FOR PATH ;!FIXIT не чё, что используется общий буфер? LD (NM_PATH),HL LD HL,NM_NAME_A LD (NM_NAME),HL @@ -119,30 +146,32 @@ EX_PATH EXX EXX INC B DEC B - JR Z,EX_GET_ALL ;0 + ;JR Z,EX_GET_ALL + JR Z,EX_FULL ;0 ; разобрать строку DEC B - JR Z,EX_GET_DRIVE ;1 + JR Z,EX_GET_DRIVE ;1 ; выделить имя диска DEC B - JR Z,EX_GET_PATH ;2 + JR Z,EX_GET_PATH ;2 ; выделить директорию DEC B - JR Z,EX_GET_NAME ;3 + JR Z,EX_GET_NAME ;3 ; выделить имя файла DEC B - JR Z,EX_GET_TYPE ;4 + JR Z,EX_GET_TYPE ;4 ; выделить расширение файла DEC B - JR Z,EX_GET_ALL_EX ;5 + JR Z,EX_GET_ALL_EX ;5 ; выделить диск, путь, файл и расш. DEC B - JR Z,EX_RESR ;6 + JR Z,EX_RESR ;6 ; зарезервировано DEC B - JP Z,GSWITCH ;7 + JP Z,GSWITCH ;7 ; выделить параметр ком-строки DEC B - JP Z,GETNAME ;8 + JP Z,GETNAME ;8 ; преобр. имя 11 -> 8.3 формат DEC B - JP Z,MASK ;9 -EX_RESR LD A,DSS_Error.sys.INVALID_FUNCTION + JP Z,MASK ;9 ; преобр. имя 8.3 -> 11 формат +EX_RESR: LD A,DSS_Error.sys.INVALID_FUNCTION SCF RET -EX_GET_DRIVE +; Выделить имя диска +EX_GET_DRIVE: LD (NM_DRIVE),DE CALL EX_FULL RET C @@ -161,22 +190,27 @@ ERGD001 LD A,DSS_Error.sys.INVALID_DRIVE SCF RET +; Выделить директорию EX_GET_PATH LD (NM_PATH),DE JR EX_FULL +; Выделить имя файла EX_GET_NAME LD (NM_NAME),DE JR EX_FULL +; Выделить расширение файла EX_GET_TYPE LD (NM_EXTN),DE JR EX_FULL -EX_GET_ALL - JR EX_FULL +; Разобрать строку +; EX_GET_ALL +; JR EX_FULL -EX_GET_ALL_EX +; Выделить диск, путь, файл и расш. +EX_GET_ALL_EX: EX DE,HL LD C,(HL) INC HL @@ -198,14 +232,14 @@ EX_GET_ALL_EX LD B,(HL) LD (NM_EXTN),BC EX DE,HL - JR EX_FULL - -EX_FULL EX AF,AF' + ;JR EX_FULL + ; Разобрать строку +EX_FULL: EX AF,AF' EXX XOR A LD HL,(NM_PATH) LD (HL),A - LD HL,(NM_NAME) + LD HL,(NM_NAME) ; адрес буфера под имя файла LD (HL),A LD HL,(NM_EXTN) LD (HL),A @@ -213,15 +247,15 @@ EX_FULL EX AF,AF' LD (HL),A EXX EX AF,AF' -EX_PAT0 LD DE,TMPBUF - LD BC,#0D01 -EX_PAT1 LD A,(HL) - CALL UPPER +EX_PAT0: LD DE,TMPBUF + LD BC,#0D01 ;!HARDCODE счетчики +EX_PAT1: LD A,(HL) + CALL UPPER ; a..z -> A..Z LD (DE),A INC HL INC DE - INC C - CP #5C ; \ + INC C ; ++счетчик + CP '\' JR Z,PATH_YEP CP ":" JR Z,DRIVE_YEP @@ -231,23 +265,22 @@ EX_PAT1 LD A,(HL) JR Z,GLOBP1 CP "*" JR Z,GLOBP1 -EX_PAT2 DJNZ EX_PAT1 +EX_PAT2: DJNZ EX_PAT1 LD A,DSS_Error.sys.INVALID_NAME SCF RET -GLOBP1 EX AF,AF' +GLOBP1: EX AF,AF' SET GLOB_PR,A EX AF,AF' JR EX_PAT2 -NAME_YEP - LD A,2 +NAME_YEP: LD A,2 CP C JR Z,NOFNAME PUSH HL LD HL,TMPBUF - LD DE,(NM_NAME) + LD DE,(NM_NAME) ; адрес буфера под имя файла LD B,0 DEC C DEC C @@ -262,12 +295,12 @@ NAME_YEP JR NZ,NOEXTN LD C,3 LD DE,(NM_EXTN) -EXTSK0 LD A,(HL) +EXTSK0: LD A,(HL) OR A JR NZ,EXTSK1 - LD A,#20 + LD A,' ' DEC HL -EXTSK1 LD (DE),A +EXTSK1: LD (DE),A INC HL INC DE DEC C @@ -275,19 +308,18 @@ EXTSK1 LD (DE),A XOR A LD (DE),A EX AF,AF' - SET EXTN_PR,A + SET EXTN_PR,A ; указано расш. файла EX AF,AF' -NOEXTN EX AF,AF' - SET NAM_PR,A +NOEXTN: EX AF,AF' + SET NAM_PR,A ; указано имя файла EX AF,AF' POP HL -NOFNAME - EX AF,AF' +NOFNAME: EX AF,AF' AND A RET -DRIVE_YEP - XOR A + +DRIVE_YEP: XOR A LD (DE),A PUSH HL LD HL,TMPBUF @@ -296,12 +328,11 @@ DRIVE_YEP LDIR POP HL EX AF,AF' - SET DRIV_PR,A + SET DRIV_PR,A ; указано имя диска EX AF,AF' JP EX_PAT0 -PATH_YEP - XOR A +PATH_YEP: XOR A LD (DE),A PUSH HL PUSH BC @@ -310,7 +341,7 @@ PATH_YEP CPIR DEC HL EX DE,HL - LD HL,TMPBUF + LD HL,TMPBUF ; 12 пробелов POP BC LD B,0 LDIR @@ -320,95 +351,121 @@ PATH_YEP EX AF,AF' JP EX_PAT0 -TMPBUF DB " ",#00 +TMPBUF: DB " ",#00 ; 12 пробелов -NM_DRIVE DW NM_DRIVE_A -NM_NAME DW NM_NAME_A -NM_EXTN DW NM_EXTN_A -NM_PATH DW NM_PATH_A +NM_DRIVE: DW NM_DRIVE_A +NM_NAME: DW NM_NAME_A +NM_EXTN: DW NM_EXTN_A +NM_PATH: DW NM_PATH_A +NM_DRIVE_A: BLOCK 9,0 -NM_DRIVE_A DB 0,0,0,0,0,0,0,0,0 +NM_NAME_A: DB " ",#00 -NM_NAME_A DB " ",#00 - -NM_EXTN_A DB " ",0 +NM_EXTN_A: DB " ",0 NM_PATH_A EQU BUFFER ;DS 256 -;===================== function 45h end ================ - +////////////////////////////////////////////////////////////////////// +; Функция #43. Выделить параметр командной строки. +; +; вход: HL - указатель командной строки +; DE - буфер для выдел. параметра +; выход: HL - указатель на след. параметр ком-строки +; CF=0 - конец строки не достигнут (есть другие параметры) +; CF=1 - конец строки (в буфер перенесён последний параметр или ноль) +; ;ENTRY: HL - COMMAND LINE ; DE - SWITCH BUFFER ;EXIT: BUFFER -GSWITCH XOR A +////////////////////////////////////////////////////////////////////// +GSWITCH: XOR A LD (DE),A -GSWIT1 LD A,(HL) +GSWIT1: LD A,(HL) INC HL CP " " RET C JR Z,GSWIT1 -GSWIT2 LD (DE),A +GSWIT2: LD (DE),A LD A,(HL) INC HL INC DE - CP "!" + CP " "+1 JR NC,GSWIT2 CP " " LD A,0 LD (DE),A RET -;RET: HL - ALL MEMORY -; BC - FREE MEMORY -FREEMEM LD C,#C0 +////////////////////////////////////////////////////////////////////// +; Функция #3C. Информация о памяти. +; +; вход: нет +; выход: HL - общее кол-во страниц +; BC - кол-во своб. страниц +////////////////////////////////////////////////////////////////////// +FREEMEM: LD C,BIOS.GetMemSize RST ToBIOS RET -; B - SIZE BLOCK -; RET: A - ID MEMORY BLOCK - -GETMEM LD C,#C2 +////////////////////////////////////////////////////////////////////// +; Функция #3D. Выделение блока памяти. +; +; вход: B - размер блока в страницах по 16kB +; выход: A - идентификатор блока памяти, если CF=0 +; A - код ошибки, если CF=1 +////////////////////////////////////////////////////////////////////// +GETMEM: LD C,BIOS.GetMem RST ToBIOS LD E,A - LD A,30 + LD A,DSS_Error.sys.NOT_ENOUGH_MEMORY RET C LD D,#00 - LD HL,MEMTAB + LD HL,MEMTAB ; массив списка выдел. страниц ADD HL,DE - LD A,(TASK) + LD A,(TASK) ; уровень текущей программы LD (HL),A LD A,E AND A RET -; A - ID BLOCK -RETMEM LD E,A +////////////////////////////////////////////////////////////////////// +; Функция #3E. Освобождение блока памяти. +; +; вход: A - идентификатор блока памяти +; выход: A - код ошибки, если CF=1 +////////////////////////////////////////////////////////////////////// +RETMEM: LD E,A LD D,#00 - LD HL,MEMTAB + LD HL,MEMTAB ; массив списка выдел. страниц ADD HL,DE - LD A,(TASK) + LD A,(TASK) ; уровень текущей программы CP (HL) LD A,DSS_Error.sys.INVALID_MEMORY_HND SCF RET NZ PUSH DE LD A,E - LD C,#C3 + LD C,BIOS.FreeMem RST ToBIOS POP DE LD A,DSS_Error.sys.INVALID_MEMORY_HND RET C LD HL,MEMTAB ADD HL,DE - LD (HL),#00 XOR A + LD (HL),A RET -; A - ID BLOCK -; B - NEW SIZE -SETMEM LD E,A +////////////////////////////////////////////////////////////////////// +; Функция #3F. Изменение блока памяти. +; +; вход: A - идентификатор блока памяти +; B - новый размер блока +; выход: A - код ошибки, если CF=1 +////////////////////////////////////////////////////////////////////// +SETMEM: LD E,A LD D,#00 LD HL,MEMTAB ADD HL,DE @@ -428,51 +485,52 @@ SETMEM LD E,A CP D RET Z JR C,INCMEM -DECMEM LD B,D +DECMEM: LD B,D LD A,E - LD C,#9D + LD C,BIOS.DivMemBlocks RST ToBIOS LD A,B - LD C,#C3 + LD C,BIOS.FreeMem RST ToBIOS XOR A RET -INCMEM LD A,D +; Добавить страниц памяти к блоку +INCMEM: LD A,D SUB B LD B,A LD C,E PUSH BC - LD C,#C2 + LD C,BIOS.GetMem RST ToBIOS POP BC LD B,A - LD A,30 + LD A,DSS_Error.sys.NOT_ENOUGH_MEMORY RET C LD A,C - LD C,#9E + LD C,BIOS.MergeMemBlocks RST ToBIOS XOR A RET -SIZEBLK LD B,#FF +SIZEBLK: LD B,#FF LD C,A -BLK001 INC B +.loop: INC B PUSH BC LD A,C - LD C,#C4 + LD C,BIOS.GetMemPage RST ToBIOS POP BC - JR NC,BLK001 + JR NC,.loop OR A SCF RET Z XOR A RET -LEAVMEM LD HL,MEMTAB - LD BC,256 -LEVMEM LD A,(TASK) +LEAVMEM: LD HL,MEMTAB + LD BC,256 ;!HARDCODE размер блока страниц ОЗУ +.loop: LD A,(TASK) CPIR RET NZ PUSH HL @@ -482,48 +540,35 @@ LEVMEM LD A,(TASK) LD DE,MEMTAB SBC HL,DE LD A,L - CALL RETMEM + CALL RETMEM ; освоб. блок памяти POP BC POP HL - JR LEVMEM + JP .loop -; B - LOGICAL PAGE -; A - ID BLOCK -; HL - BIT 15&14 WINDOW -; RET: A - PAGE (WIN) +////////////////////////////////////////////////////////////////////// +; Функция #38. Подключение страницы памяти. +; +; вход: A - идентиф. блока памяти +; B - номер страницы в блоке (0,1,2,..) +; H - биты 6 и 7 задают номер окна, в которое будет подкл. страница +; выход: A - номер страницы, если CF=0 +; A - код ошибки, если CF=1 ; if B = 0FFh, then logical page number got from DE -SETWIN BIT 7,H ;if 08000h or high? - JR Z,SETWIN1 ;no, go to open in SLOT1 - BIT 6,H ;if 0C000h or high? - JR Z,SETWIN2 ;no, go to open in SLOT2 - JR SETWIN3 ;yes, go to open in SLOT3 - -; B - LOGICAL PAGE -; A - ID BLOCK -; RET: A - PAGE (WIN) -SETWIN1 LD C,#C4 - EX DE,HL - RST ToBIOS - EX DE,HL - RET C - LD C,SLOT1 - IN B,(C) - OUT (C),A - LD A,B - RET - -SETWIN2 LD C,#C4 - EX DE,HL - RST ToBIOS - EX DE,HL - RET C - LD C,SLOT2 - IN B,(C) - OUT (C),A - LD A,B - RET - -SETWIN3 LD C,#C4 +////////////////////////////////////////////////////////////////////// +SETWIN: BIT 7,H ; if #8000 or high? + JR Z,SETWIN1 ; no, go to open in SLOT1 + BIT 6,H ; if #C000 or high? + JR Z,SETWIN2 ; no, go to open in SLOT2 + //JR SETWIN3 ; yes, go to open in SLOT3 +////////////////////////////////////////////////////////////////////// +; Функция #3B. Подключение страницы памяти в третье окно. +; +; вход: A - идентиф. блока памяти +; B - номер страницы в блоке (0,1,2,..) +; выход: A - номер страницы, если CF=0 +; A - код ошибки, если CF=1 +////////////////////////////////////////////////////////////////////// +SETWIN3: LD C,BIOS.GetMemPage EX DE,HL RST ToBIOS EX DE,HL @@ -534,6 +579,83 @@ SETWIN3 LD C,#C4 LD A,B RET +////////////////////////////////////////////////////////////////////// +; Функция #39. Подключение страницы памяти в первое окно. +; +; вход: A - идентиф. блока памяти +; B - номер страницы в блоке (0,1,2,..) +; выход: A - номер страницы, если CF=0 +; A - код ошибки, если CF=1 +////////////////////////////////////////////////////////////////////// +SETWIN1: LD C,BIOS.GetMemPage + EX DE,HL + RST ToBIOS + EX DE,HL + RET C + LD C,SLOT1 + IN B,(C) + OUT (C),A + LD A,B + RET + +////////////////////////////////////////////////////////////////////// +; Функция #3A. Подключение страницы памяти во второе окно. +; +; вход: A - идентиф. блока памяти +; B - номер страницы в блоке (0,1,2,..) +; выход: A - номер страницы, если CF=0 +; A - код ошибки, если CF=1 +////////////////////////////////////////////////////////////////////// +SETWIN2 LD C,BIOS.GetMemPage + EX DE,HL + RST ToBIOS + EX DE,HL + RET C + LD C,SLOT2 + IN B,(C) + OUT (C),A + LD A,B + RET + +;!TODO если надо будет сэкономить память, но привязаться к номерам слотов +; SETWIN1: LD H,SLOT1 : JR SETWIN.ALL +; SETWIN2: LD H,SLOT2 : JR SETWIN.ALL +; SETWIN3: LD H,SLOT3 : JR SETWIN.ALL +; SETWIN: LD C,A +; LD A,H +; AND %1100'0000 +; JR NZ,.no_error +; OR %0100'0000 +; .no_error: RRСA +; OR %100'0010 +; LD H,A ;SLOT number +; LD A,C +; .ALL: LD C,BIOS.GetMemPage +; EX DE,HL +; RST ToBIOS +; EX DE,HL +; RET C +; LD C,H ;SLOT number +; IN B,(C) +; OUT (C),A +; LD A,B +; RET +; +; // SLOT0 - #82 %1000'0010 +; // SLOT0 - #A2 %1010'0010 +; // SLOT0 - #C2 %1100'0010 +; // SLOT0 - #E2 %1110'0010 + + +;///////////////////////////////////////////////////////////////////// +; Функция #40. Выполнить файл. +; +; вход: HL - указатель на имя файла +; B=0 - загрузить и выполнить программу с коротким именем (без полного пути до программы) +; B=1 - загрузить и выполнить программу с полным путём до программы +; выход: A - код завершения, если CF=0 +; код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// EXEC: _mSavePath INC B ;R03 @@ -586,9 +708,6 @@ NEXTPATHI: PUSH BC EX DE,HL CALL Z,GOTO_CURDIR -; -;DBUG CALL DPRINT -; CALL CHDIR JR C,BADPATH LD HL,EXEBUFF @@ -608,15 +727,12 @@ PATHFOUND: POP BC LD A,B OUT (SLOT3),A -; LD A,DSS_Error.sys.PATH_NOT_FOUND ;????? нужен ли тут код ошибки? + LD A,DSS_Error.sys.PATH_NOT_FOUND RET GOTO_CURDIR: PUSH HL LD HL,TMP_CURDIR -; -;DBUG CALL DPRINT -; CALL CHDIR POP HL RET @@ -639,7 +755,7 @@ NEXTAR: LD (HL),C ;R04 ;R04 INC HL INC B NEXTRT: LD A,(DE) - CP #5C ;\ + CP '\' JR NZ,NEXTCH NEXTDR: SET ABSOLUTE_DIR,C NEXTRL: ;SET RELATIVE_DIR,C ;!TODO ???? @@ -662,41 +778,58 @@ NEXTCH: LD A,(DE) ENVPATH DB "PATH=",0 -;;; DEBUG ;;; - -;DPRINT -; PUSH HL -; CALL PCHARS -; LD HL,C1310 -; CALL PCHARS -; POP HL -; RET -; -;C1310 DB 13,10,0 - ;;; ; !TODO СДЕЛАТЬ СТРУКТУРОЙ PATH_PNT_ARRAY EQU #FC80 TMP_CURDIR EQU #FD00 ENVTEMP EQU #FE00 -INCTASK LD HL,TASK ;R08 +INCTASK: LD HL,TASK ;R08 INC (HL) ;R08 RET ;R08 -DECTASK LD HL,TASK ;R08 +DECTASK: LD HL,TASK ;R08 DEC (HL) ;R08 RET ;R08 -EXEC0: - LD (CMDLINE),HL +;------------------------------------------------------------------------ +; Загрузить и выполнить программу. +; функ. 40h, B=0. +; +; 1) Открывает exe-файл на чтение; +; 2) Считывает в рабочую область префикс exe-файла; +; 3) Выделяет блок памяти, требуемый для загрузки всего файла или первичного +; загрузчика, если его размер не равен нулю; +; 4) Сохраняет стек; +; 5) Подключает страницы из выделенного блока; +; 6) Строит префикс запуска программы и устанавливает на него регистр IX; +; 7) Считывает файл по адресу указанному в смещении 16 (Адрес расположения +; кода в памяти); +; 8) Закрывает exe-файл, если это не первичный загрузчик; +; 9) Устанавливает стек равным значению из смещения 20 (Адрес расп. стека); +; 10) Передает управление по адресу указанному в смещении 18 (Адрес запуска); +; +; Префикс запуска файла: +; +; -03 1 db ? ; Дескриптор файла, если exe-файл с первичным загрузчиком +; -02 1 db ? ; Идентификатор блока памяти +; -01 1 db ? ; Уровень текущей программы +; +00 1 db ? ; Длина ком-строки +; +01 127 ds ? ; Параметры ком-строки, заканчивается нулем +;------------------------------------------------------------------------ +EXEC0: LD (CMDLINE),HL CALL CHECKPATH ;CHECK FOR '\' - SHORT/FULL NAME LD HL,(CMDLINE) JR C,EXEC0_SHORT -EXEC1: - LD (CMDLINE),HL - LD A,#01 +EXEC1: CALL EXEC_1 + SCF + RET ; File not found - exit + + +; при выходе с ошибкой, в регистре А - код ошибки +EXEC_1: LD (CMDLINE),HL + LD A,#01 ; %7600000R = !FAT_ATTR LD (ACCESS),A CALL GETWORD RET C @@ -708,49 +841,32 @@ EXEC1: LD A,3 RET C CALL INCTASK ;R08 -;R08 LD HL,TASK -;R08 INC (HL) CALL OPENEXE - JP NC,EXEC02 ;R07 CONTINUE EXECUTING PROGRAM + JR NC,.noError CALL DECTASK ;R08 - RET ;RET C! + AND A + RET +.noError: + POP HL ; убираем лишний адрес_возврата_в_вызвавшую_процедуру + JP EXEC02 ;R07 CONTINUE EXECUTING PROGRAM -;R07 -; !FIXIT EXEC0_SHORT - копия EXEC1 до CALL DECTASK + + ;SHORT NAME + ;TRY TO FIND IN CURRENT DIRECTORY EXEC0_SHORT: -;SHORT NAME -; TRY TO FIND IN CURRENT DIRECTORY -; LD (CMDLINE),HL - LD A,#01 ; %7600000R = !FAT_ATTR - LD (ACCESS),A - CALL GETWORD + CALL EXEC_1 RET C - LD HL,TMPNAME - LD DE,MASKARE - CALL MASK - RET C - CALL TST_EXT - LD A,3 - RET C - CALL INCTASK -;R08 LD HL,TASK -;R08 INC (HL) - CALL OPENEXE - JR NC,EXEC02 ;R07 CONTINUE EXECUTING PROGRAM - CALL DECTASK ;R08 -;R07 -;FILE NO FOUND, SEARCHING IN PATH - -; GET PATH AND ETC. + ;FILE NO FOUND, SEARCHING IN PATH + ; GET PATH AND ETC. LD HL,ENVPATH LD DE,ENVTEMP - LD B,1 + LD B,Dss.Environ.Get CALL ENVIRON LD HL,(CMDLINE) LD DE,EXEBUFF -COPYEXN LD A,(HL) +COPYEXN: LD A,(HL) LDI OR A JR NZ,COPYEXN @@ -759,9 +875,7 @@ COPYEXN LD A,(HL) LD HL,(CMDLINE) JR EXEC1 -;EXEC00 - -EXEC02 LD (EXE_FM),A +EXEC02: LD (EXE_FM),A LD HL,EXEBUFF LD DE,#0080 ;!#0200(512) ;R02 LD A,(EXE_FM) @@ -770,12 +884,12 @@ EXEC02 LD (EXE_FM),A LD IX,EXEBUFF LD HL,(EXEBUFF) LD DE,'E'+'X'*256 - AND A + ;AND A ; не нужно, если бы был CF=1, то чуть выше мы бы ушли на JP C,ERREXE SBC HL,DE LD A,DSS_Error.sys.INVALID_EXE SCF JP NZ,ERREXE - LD A,(IX+3) + LD A,(IX+3) ;!HARDCODE OR A LD A,DSS_Error.sys.UNKNOWN_EXE SCF @@ -793,8 +907,12 @@ EXEC02 LD (EXE_FM),A LD A,E OR D JP NZ,PRELOAD - LD HL,#0000 - LD IX,#0000 + ; A=0 + LD H,A + LD L,A + LD XL,A + LD XH,A + ; LD B,#02 LD A,(EXE_FM) CALL MOVE_FP @@ -815,150 +933,164 @@ EXEC02 LD (EXE_FM),A OR XL JR Z,NOINK INC HL -NOINK LD A,H +NOINK: LD A,H OR A JP NZ,ERREXE0 LD B,L - 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 -;!FIXIT.НЕ.СОХРАНЯЕТ.DE.перед.вызовом.BIOS..............................; - LD DE,RAMMAP - LD BC,#00C4 - LD A,(EXE_MEM) - RST ToBIOS - LD (DE),A - INC DE - LD BC,#01C4 - LD A,(EXE_MEM) - RST ToBIOS - LD (DE),A - INC DE - LD BC,#02C4 - LD A,(EXE_MEM) - RST ToBIOS - LD (DE),A - INC DE - LD BC,#03C4 - LD A,(EXE_MEM) - RST ToBIOS - LD (DE),A -;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^; - LD HL,(CMDLINE) - LD DE,SECBUF+1 - CALL SCOPYS - LD A,#80 - SUB B - LD (SECBUF),A - LD SP,EXEBUFF+510 ;R02 - LD A,DSS_PAGE - OUT (SLOT1),A - OUT (SLOT2),A - OUT (SLOT3),A - LD HL,(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,(EXEBUFF.OFFCOD2) - LD IX,(EXEBUFF.OFFCOD1) - LD B,#00 - LD A,(EXE_FM) - CALL MOVE_FP - ;R02 - LD SP,#403F ;R02 - ;R02 + ;!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 +;...... ;!FIXIT.НЕ.СОХРАНЯЕТ.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,SECBUF+1 + CALL SCOPYS + LD A,#80 + SUB B + LD (SECBUF),A + ;R02 + LD SP,EXEBUFF+510 ;Вставляется в DSS_PAGE + ; + LD A,DSS_PAGE ;!FIXIT втыкать страницы приложения + OUT (SLOT1),A + OUT (SLOT2),A + OUT (SLOT3),A + LD HL,(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,(EXEBUFF.OFFCOD2) + LD IX,(EXEBUFF.OFFCOD1) + LD B,Dss.Move_FP.FrStart + LD A,(EXE_FM) + CALL MOVE_FP + ;R02 + LD SP,#403F ;!HARDCODE STACK before start EXE. Устанавливается когда воткнуты DSS_PAGE + ; + ; LD DE,(EXEBUFF.LD_ADDR) - LD HL,#0000 - AND A + XOR A + LD H,A + LD L,A SBC HL,DE - EX DE,HL - LD HL,(EXEBUFF.LD_ADDR) - LD A,(EXE_FM) - CALL READ - LD A,(EXE_FM) - CALL CLOSE -;R09 - _mRestorePath -;R09 - LD SP,(EXEBUFF.SP_REG) - LD HL,(EXEBUFF.LD_ADDR) - LD DE,#0080 - AND A - SBC HL,DE - EX DE,HL - LD XH,D - LD XL,E - LD HL,(EXEBUFF.PC_REG) - LD DE,RETFAR - PUSH DE - PUSH HL - RET -RETFAR JP LEAVE + EX DE,HL ; de=число чит. байт + LD HL,(EXEBUFF.LD_ADDR) ; буфер + LD A,(EXE_FM) ; дескр. файла + CALL READ ; чтение из файла + LD A,(EXE_FM) ; дескр. файла + CALL CLOSE ; закрыть файл -TST_EXT LD HL,EXE_EXT + ;!FIXIT double 2 + ;R09 + _mRestorePath + ; + LD SP,(EXEBUFF.SP_REG) + LD HL,(EXEBUFF.LD_ADDR) + LD DE,#0080 + AND A + SBC HL,DE + EX DE,HL + LD XH,D + LD XL,E + LD HL,(EXEBUFF.PC_REG) + LD DE,RETFAR ; адрес п/п "неожиданное завершение процесса" + PUSH DE + PUSH HL + RET + ; +;[ ] +RETFAR: LD B,DSS_Error.sys.UNEXPECTED_APP_TRMN + JP LEAVE ; завершить программу (процесс) + +;------------------------------------------------- +; Если расш. файла не задано, задать "exe". +; Если расш. файла задано, сравнить его с "exe". +;------------------------------------------------- +TST_EXT: LD HL,EXE_EXT ; "EXE" LD DE,MASKARE+8 LD B,3 LD A,(DE) - CP #20 - JR NZ,TSTE1 + CP ' ' + JR NZ,.loop ; задано расш. LDI LDI LDI XOR A RET -TSTE1 LD A,(DE) +; сравнить расш. с "EXE" +.loop: LD A,(DE) CP (HL) SCF - RET NZ + RET NZ ; не совпадает INC HL INC DE - DJNZ TSTE1 - XOR A + DJNZ .loop + XOR A ; Ok RET -ERREXE0 LD A,30 -ERREXE PUSH AF +ERREXE0: LD A,DSS_Error.sys.NOT_ENOUGH_MEMORY +ERREXE: PUSH AF LD A,(EXE_FM) CALL CLOSE - LD HL,TASK - DEC (HL) + CALL DECTASK POP AF RET -PRELOAD EX DE,HL +PRELOAD: EX DE,HL LD DE,(EXEBUFF.LD_ADDR) LD A,D AND #3F @@ -974,110 +1106,134 @@ PRELOAD EX DE,HL OR L JR Z,NOINK2 INC B -NOINK2 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 - LD DE,RAMMAP - LD BC,#00C4 - LD A,(EXE_MEM) - RST ToBIOS - LD (DE),A - INC DE - LD BC,#01C4 - LD A,(EXE_MEM) - RST ToBIOS - LD (DE),A - INC DE - LD BC,#02C4 - LD A,(EXE_MEM) - RST ToBIOS - LD (DE),A - INC DE - LD BC,#03C4 - LD A,(EXE_MEM) - RST ToBIOS - LD (DE),A - LD HL,(CMDLINE) - LD DE,SECBUF+1 - CALL SCOPYS - LD A,#80 - SUB B - LD (SECBUF),A - LD SP,EXEBUFF+510 - LD A,DSS_PAGE - OUT (SLOT1),A - OUT (SLOT2),A - OUT (SLOT3),A - LD HL,(EXEBUFF.LD_ADDR) - LD DE,RAMMAP - LD A,H - AND #C0 - CP #40 - JR Z,FR4000H - CP #80 - JR Z,FR8000H - CP #C0 - JR Z,FRC000H -FR4000H LD A,(DE) - OUT (SLOT1),A - INC DE -FR8000H LD A,(DE) - OUT (SLOT2),A - INC DE -FRC000H LD A,(DE) - OUT (SLOT3),A - CALL M_PSP - LD HL,(EXEBUFF.OFFCOD2) - LD IX,(EXEBUFF.OFFCOD1) - LD B,#00 - LD A,(EXE_FM) - CALL MOVE_FP - ;R02 - LD SP,#403F ;R02 - ;R02 - LD HL,(EXEBUFF.LD_ADDR) - LD DE,(EXEBUFF.LOADER) - LD A,(EXE_FM) - CALL READ -;R09 - _mRestorePath -;R09 - LD SP,(EXEBUFF.SP_REG) - LD HL,(EXEBUFF.LD_ADDR) - LD DE,#0080 - AND A - SBC HL,DE - EX DE,HL - LD XH,D - LD XL,E - LD HL,(EXEBUFF.PC_REG) - LD DE,RETFAR - PUSH DE - PUSH HL - RET +NOINK2: + ;!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 +;...... ;!FIXIT.НЕ.СОХРАНЯЕТ.DE.перед.вызовом.BIOS..............................; + LD A,(EXE_MEM) + LD DE,RAMMAP + LD BC,#00*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,SECBUF+1 + CALL SCOPYS + LD A,#80 + SUB B + LD (SECBUF),A + ;R02 + LD SP,EXEBUFF+510 ;Вставляется в DSS_PAGE + ; + LD A,DSS_PAGE + OUT (SLOT1),A + OUT (SLOT2),A + OUT (SLOT3),A + LD HL,(EXEBUFF.LD_ADDR) + LD DE,RAMMAP + LD A,H + AND #C0 + CP #40 + JR Z,FR4000H + CP #80 + JR Z,FR8000H + CP #C0 + JR Z,FRC000H +FR4000H: LD A,(DE) + OUT (SLOT1),A + INC DE +FR8000H: LD A,(DE) + OUT (SLOT2),A + INC DE +FRC000H: LD A,(DE) + OUT (SLOT3),A + CALL M_PSP + LD HL,(EXEBUFF.OFFCOD2) + LD IX,(EXEBUFF.OFFCOD1) + LD B,Dss.Move_FP.FrStart + LD A,(EXE_FM) + CALL MOVE_FP + ;R02 + LD SP,#403F ;!HARDCODE STACK before start EXE. Устанавливается когда воткнуты DSS_PAGE + ; + ; + LD HL,(EXEBUFF.LD_ADDR) ; буфер + LD DE,(EXEBUFF.LOADER) ; число чит. байт + LD A,(EXE_FM) ; дескр. файла + CALL READ ; чтение из файла + + ;!FIXIT double 2 + ;R09 + _mRestorePath + ; + LD SP,(EXEBUFF.SP_REG) + LD HL,(EXEBUFF.LD_ADDR) + LD DE,#0080 + AND A + SBC HL,DE + EX DE,HL + LD XH,D + LD XL,E + LD HL,(EXEBUFF.PC_REG) + LD DE,RETFAR + PUSH DE + PUSH HL + RET + ; + +;///////////////////////////////////////////////////////////////////// +; Функция #41. Завершить программу (процесс). +; +; вход: B - код завершения +; выход: A - код ошибки, если CF=1 +; +; Выход из EXE-файла: +; +; 1) Освобождаются все блоки памяти которые выделялась данному приложению. +; 2) Восстанавливаются страницы которые были подключены до запуска EXE-файла. +; 3) Вспоминается стек. +; 4) В регистр A помещается код возврата и выполняется RET. +; +;///////////////////////////////////////////////////////////////////// LEAVE: LD A,B LD (ERLEVEL),A CALL LEAVMEM - LD HL,TASK - DEC (HL) + CALL DECTASK LD SP,(EXSTACK) POP AF POP HL @@ -1093,13 +1249,17 @@ LEAVE: LD A,B EX DE,HL LD A,(ERLEVEL) AND A - JP (HL) + ;R12 + JR Z,.exit + SCF + ; +.exit: JP (HL) -WAIT LD A,(ERLEVEL) +WAIT: LD A,(ERLEVEL) AND A RET -M_PSP LD HL,(EXEBUFF.LD_ADDR) +M_PSP: LD HL,(EXEBUFF.LD_ADDR) DEC H LD D,H LD E,L @@ -1126,62 +1286,62 @@ M_PSP LD HL,(EXEBUFF.LD_ADDR) LD (IX-2),A LD A,(EXE_FM) LD (IX-3),A -;R05 - INC HL - LD (HL),B - INC HL - CALL CURRDSK - 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 нет привязки к DIRSPEC.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 -ENMLP1 LD A,(HL) - LDI - CP '!' - JR NC,ENMLP1 - DEC DE - XOR A - LD (DE),A - LD (LAST_PSP_PTR),IX -;R05 + ;R05 + INC HL + LD (HL),B + INC HL + CALL CURRDSK + 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 нет привязки к DIRSPEC.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 (LAST_PSP_PTR),IX + ; RET -SCOPYS: LD BC,#80*256 + '!' -SCOP0 LD A,(HL) +SCOPYS: LD BC,#80*256 + ' '+1 +.loop: LD A,(HL) CP C - JR C,SCOP1 + JR C,.copy INC HL - DJNZ SCOP0 + DJNZ .loop XOR A LD (DE),A LD B,#80 RET -SCOP1 LD BC,#8020 -SCOP2 LD A,(HL) +.copy: LD BC,#80*256 + ' ' +.loop2: LD A,(HL) LD (DE),A INC HL INC DE CP C RET C - DJNZ SCOP2 + DJNZ .loop2 RET diff --git a/DSS/build.txt b/DSS/build.txt index dec2bf5..86ee83a 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -19 \ No newline at end of file +40 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index afe66b1..94cb0e3 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit afe66b1f354cab8d2780826697cf371d1d9e389d +Subproject commit 94cb0e39f321bd11519008801187d93eacb280f2