From 5d914d4e5c5e7748eef195741fe83fecc084d209 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 22 Jul 2023 02:15:05 +1000 Subject: [PATCH] ... --- Console/CONSOLE.ASM | 40 ++++++------ DSS/DOS_X.ASM | 24 +++++-- DSS/DRV-MAIN.ASM | 2 +- DSS/ENVIRON.ASM | 121 ++++++++++++++++++++++++----------- DSS/EXECUTE.ASM | 45 +++++++------ DSS/Media_drivers/FDD.ASM | 4 ++ DSS/Media_drivers/Shared.ASM | 80 +++++++++++++++-------- DSS/Structures.inc | 2 +- DSS/build.txt | 2 +- SYS/DSSBOOT.ASM | 27 +++----- SYS/SYS.ASM | 1 - 11 files changed, 215 insertions(+), 133 deletions(-) diff --git a/Console/CONSOLE.ASM b/Console/CONSOLE.ASM index 7598af9..8e339bc 100644 --- a/Console/CONSOLE.ASM +++ b/Console/CONSOLE.ASM @@ -1766,21 +1766,21 @@ GETyesZERO: RET */ -HELP LD DE,HELPMSG +HELP: LD DE,HELPMSG CALL MESSAGE RET -CEXIT LD A,(TASKX) +CEXIT: LD A,(TASKX) DEC A DEC A RET Z POP HL -QUIT LD B,0 +QUIT: LD B,0 LD C,Dss.Exit RST ToDSS RET -ERR_MSG INC DE +ERR_MSG: INC DE LD HL,ERR0 LD BC,ERR1-ERR0 CALL LCPIR @@ -1788,12 +1788,12 @@ ERR_MSG INC DE CALL CRLF JP CRLF -MESSAGE CALL FMESAGE +MESSAGE: CALL FMESAGE CALL PRINTZ CALL GETXY RET -FMESAGE INC DE +FMESAGE: INC DE LD HL,MSG0 LD BC,MSG1-MSG0 LCPIR: XOR A @@ -1814,8 +1814,8 @@ LCPIR: XOR A RET -PUTPRM LD BC,15 -PUTPRMA LD A,(HL) +PUTPRM: LD BC,15 +PUTPRMA: LD A,(HL) LDI RET PO OR A @@ -1833,12 +1833,12 @@ PUTPRMA LD A,(HL) // ret -PRINTZ LD A,(HL) +PRINTZ: LD A,(HL) INC HL OR A RET Z CP "%" - JR NZ,PRINTZ2 + JR NZ,.char LD A,(HL) INC HL SUB "1" @@ -1854,24 +1854,24 @@ PRINTZ LD A,(HL) LD C,Dss.PChars RST ToDSS POP HL - JR PRINTZ -PRINTZ2 LD C,Dss.PutChar + JP PRINTZ +.char: LD C,Dss.PutChar RST ToDSS JP PRINTZ -ROOT DB '\',0 +ROOT: DB '\',0 -ALLFS DB "*.*",0 +ALLFS: DB "*.*",0 -SER_NUM DB "C37F-73AB",0 +SER_NUM: DB "C37F-73AB",0 //SER_NUM DB "XXXX-XXXX",0 -EXTBF BLOCK 4,0 +EXTBF: BLOCK 4,0 -BATBF DB "BAT" +BATBF: DB "BAT" -ECHOON DB "ON",0 -ECHOOFF DB "OFF",0 +ECHOON: DB "ON",0 +ECHOOFF: DB "OFF",0 DIR1MSG EQU 0 @@ -1887,7 +1887,7 @@ DIR2MSG EQU 9 DIR3MSG EQU 10 HELPMSG EQU 11 -MSG0 DB 0 +MSG0: DB 0 DB "Volume in drive %1 has no label",CR,LF ; !FIXIT DB "Volume Serial number is %2",CR,LF DB "Directory of %3",CR,LF,CR,LF,0 diff --git a/DSS/DOS_X.ASM b/DSS/DOS_X.ASM index 48ff8c8..814c550 100644 --- a/DSS/DOS_X.ASM +++ b/DSS/DOS_X.ASM @@ -46,10 +46,15 @@ VERSION: //OSINFO: //OSINFO_SIG: DB "OSINFOSTRUCTURE",0 +//BOOTDRV: DB 0 -;R09 -BOOTDRV: DB #FF - +;///////////////////////////////////////////////////////////////////// +; Функция #09. Номер системного диска. +; Возвращает номер диска, c которого загружена система. +; +; вход: B = 0 (01h - исп. boot-загрузчик системы) +; выход: A - номер системного диска (0=A,1=B,..) +;///////////////////////////////////////////////////////////////////// BOOTDSK: INC B DEC B @@ -61,11 +66,14 @@ BOOTDSK: RET ;GET BOOT DISK -GETBOOT LD A,(BOOTDRV) +GETBOOT: +BOOTDRV+1: LD A,0 ;R09 AND A RET ;SET BOOT DISK +; Сообщить DSS с какого диска загружается система. +; Исп. загрузчик системы для иниц. ячейки "boot_disk". SETBOOT: LD B,A LD C,0 @@ -153,7 +161,7 @@ FRESP2: LD D,B AND A RET -LDRIVE: DB #02 +LDRIVE: DB #FF TDRIVE: DB #00 TCLUST: DW #0000 TCOUNT: DW #0000 @@ -519,6 +527,12 @@ BACK_CUR_PATH: ;R11 ;R12 +;///////////////////////////////////////////////////////////////////// +; Функция #08 (DSS_RESCAN). Пересканировать девайсы системы. +; +; вход: нет +; выход: A - номер последнего лог. диска в системе +;///////////////////////////////////////////////////////////////////// SCANDRV: ;!TEST в DRV-MAIN могут быть проблемы с прерываниями ;DI diff --git a/DSS/DRV-MAIN.ASM b/DSS/DRV-MAIN.ASM index d5ccf47..34ed599 100644 --- a/DSS/DRV-MAIN.ASM +++ b/DSS/DRV-MAIN.ASM @@ -58,7 +58,7 @@ A0010: ;JP RST_10 ; A0018: PUSH AF ; PUSH BC ; MAIN_PG_NUMBER+2: ; - LD BC,0*256+SLOT0 ; !FIXIT сюда не должны вставляться номера выделенных страниц? + LD BC,0*256 + SLOT0 ; !FIXIT сюда не должны вставляться номера выделенных страниц? JP PORTAL.outDRV ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; diff --git a/DSS/ENVIRON.ASM b/DSS/ENVIRON.ASM index 297be7e..15d2eb9 100644 --- a/DSS/ENVIRON.ASM +++ b/DSS/ENVIRON.ASM @@ -4,38 +4,55 @@ ;--------------------------------------------------------------- ;Rev Date Name Description ;--------------------------------------------------------------- +;R02 13-05-2023 BAO Инициализация переменной BOOTDSK при старте ;!TODO проверить как у Саймана сделано +;R03 09-03-2007 VAS Функция ENV_EX теперь обрезает слишком длинную строку перед выходом ;R01 19-11-2002 DNS CORRECT DE ADDRESS IN GETENV ;--------------------------------------------------------------- -; LD HL,MYVAR -; CALL SETENV -; LD HL,MYVAR2 -; LD DE,MYBUF -; CALL GETENV - +;///////////////////////////////////////////////////////////////////// +; Функция #46. Системное окружение. +; +; вход: B - номер подфункции: +; B=0, получение системного окружения. +; HL - буфер +; B=1, получить переменную окружения. +; HL - имя переменной +; DE - буфер для значения переменной +; B=2, установить/удалить переменную окружения +; HL - ПЕРЕМЕННАЯ=ЗНАЧЕНИЕ +; В конце строки ноль. +; выход: A - состояние, если CF=0 +; DE - указывает на конец буфера (только для B=1) +; A=#FF - переменная обнаружена +; A=0 - переменная не обнаружена +; A - код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// ENVIRON: INC B - JR Z,INITENV ;B=FF + JR Z,INITENV ; B=#FF DEC B - JR Z,READENV ;B=0 + JR Z,READENV ; B=0. получить сист. окружение DEC B - JP Z,GETENV ;B=1 + JP Z,GETENV ; B=1. получить перем. окружения DEC B - JP Z,SETENV ;B=2 + JP Z,SETENV ; B=2. установить/удалить перем. окружения LD A,DSS_Error.sys.INVALID_FUNCTION SCF RET +;------------------------------------------------- +; Инициализация буфера переменных окружения +;------------------------------------------------- INITENV: SET_PAGE_X ENVPAGE PUSH AF - ;!TEST + ;R02 LD A,(BOOTDRV) ADD A,'A' LD (DEFAULT_ENV.boot_disk),A ; - LD DE,ENVIRONMENT + LD DE,ENVIRONMENT ; начало буфера переменных окружения XOR A LD (DE),A INC DE @@ -53,6 +70,9 @@ INITENV: AND A RET +;------------------------------------------------- +; Получить сист. окружение +;------------------------------------------------- READENV: PUSH HL @@ -82,39 +102,48 @@ READENV: OR C EXX JR NZ,.loop - XOR A + //XOR A + ;A=0 RET +;------------------------------------------------- +; Получить переменную окружения +;------------------------------------------------- GETENV: PUSH DE - CALL ENV_EX + CALL ENV_EX ; скопир. строку перем. окруж. в буферы SET_PAGE_X ENVPAGE EX AF,AF' - CALL F_ENV + CALL F_ENV ; RET: DE - VAR VALUE; HL - VAR ADDRESS; BC - ENVIRONMENT SIZE POP DE LD A,0 LD (DE),A - JR NC,GE_1 -GE_0: LD A,(HL) + JR NC,.exit +.loop: LD A,(HL) LDI OR A - JR NZ,GE_0 + JR NZ,.loop DEC DE ;R01 LD A,#FF -GE_1: EX AF,AF' +.exit: EX AF,AF' OUT (SLOT3),A EX AF,AF' AND A RET -SETENV: CALL ENV_EX +;------------------------------------------------- +; Установить/Удалить переменную окружения +; +; вход: hl=имя перем. и значение, раздел. символом "=" +;------------------------------------------------- +SETENV: CALL ENV_EX ; скопир. строку перем. окруж. в буферы SET_PAGE_X ENVPAGE PUSH AF - CALL F_ENV + CALL F_ENV ; RET: DE - VAR VALUE; HL - VAR ADDRESS; BC - ENVIRONMENT SIZE JR NC,PENV XOR A CPIR @@ -176,12 +205,18 @@ END_OF_ENV POP DE RET -ENV_EX LD B,ENVIRONMENT_STRING_LENGTH - LD DE,ENVNAME -ENV_E0 XOR A +;----------------------------------------------------------- +; Скопировать строку переменной окружения в буферы +; (имя и значение в разные буферы) +; вход: hl=имя перем. и значение, раздел. символом "=" +;----------------------------------------------------------- +ENV_EX: LD B,ENVIRONMENT_STRING_LENGTH ; 255 макс. длина строки (имя+знач.) + LD DE,ENVNAME ; куда +ENV_E0: XOR A LD (DE),A LD (ENVVALUE),A -ENV_E1 LD A,(HL) + ; скопир. в "ENVNAME" имя переменной +ENV_E1: LD A,(HL) INC HL CP "=" JR Z,EQUAL_SG @@ -191,35 +226,42 @@ ENV_E1 LD A,(HL) LD (DE),A INC DE DJNZ ENV_E1 - ;!TEST from Vasil + ;R03 + ; слишком длинная строка ld a,b ld (de),a ; обрезать слишком длинную строку inc de ; SCF RET - -ENV_E3 LD A,"=" + ; значение не задано +ENV_E3: LD A,"=" LD (DE),A INC DE XOR A LD (DE),A INC DE RET - -EQUAL_SG: - LD (DE),A + ; значение задано +EQUAL_SG: LD (DE),A ; сохр. "=" INC DE XOR A + LD (DE),A ; в конец имени перем. + ; скопир. в "ENVVALUE" значение переменной (строку путей) + LD DE,ENVVALUE ; 512 байт, буфер LD (DE),A - LD DE,ENVVALUE - LD (DE),A - LD C,#FF + LD C,#FF ; чтобы "ldi" не портила "b" ENV_E2 LD A,(HL) LDI OR A - RET Z + RET Z ; конец строки знач. переменной DJNZ ENV_E2 + ;R03 + ; слишком длинная строка + ld a,b + ld (de),a ; обрезать слишком длинную строку + inc de + ; SCF RET @@ -230,9 +272,12 @@ ENVSIZE DW DEF_ENV_SIZE ;E_END-ENVIRONMENT ;160 ENVIRONMENT EQU ENVADDR -DEFAULT_ENV: DB 'BOOTDSK=' -.boot_disk: DB 'X:',0 -DEF_ENV_SIZE EQU $-DEFAULT_ENV +DEFAULT_ENV: DB 'BOOTDSK=' ;R02 +.boot_disk: DB 'X:',0 ;R02 +; DB 'SYSTEM=C:\system.exe',0 +; DB 'PATH=\SYSTEM\;\COMMAND\;',0 +DEF_ENV_SIZE EQU $-DEFAULT_ENV ;R02 + ; DB 'SYSTEM=C:\system.exe',0 ; DB 'PATH=\SYSTEM\;\COMMAND\;',0 diff --git a/DSS/EXECUTE.ASM b/DSS/EXECUTE.ASM index 105f882..28ea073 100644 --- a/DSS/EXECUTE.ASM +++ b/DSS/EXECUTE.ASM @@ -1255,6 +1255,12 @@ LEAVE: LD A,B ; .exit: JP (HL) +;///////////////////////////////////////////////////////////////////// +; Функция #42. Получить код завершения программы. +; +; вход: нет +; выход: A - код завершения +;///////////////////////////////////////////////////////////////////// WAIT: LD A,(ERLEVEL) AND A RET @@ -1301,8 +1307,8 @@ M_PSP: LD HL,(EXEBUFF.LD_ADDR) CALL CURRDIR POP HL XOR A - LD BC,#0100 ;!FIXIT нет привязки к DIRSPEC.DEPTH - CPIR ;!FIXIT нет проверки на выход по BC=0 + LD BC,#0100 ;!FIXIT нет привязки к DIRSPEC.DEPTH + CPIR ;!FIXIT нет проверки на выход по BC=0 DEC HL DEC HL LD A,'\' @@ -1345,41 +1351,40 @@ SCOPYS: LD BC,#80*256 + ' '+1 RET -EXE_EXT DB "E","X","E" +EXE_EXT: DB "EXE" -TASK DB #01 +TASK: DB #01 ; уровень текущей программы -RAMMAP DB #00,#00,#00,#00 +RAMMAP: DB #00,#00,#00,#00 -ERLEVEL DB #00 +ERLEVEL: DB #00 ; код завершения программы (процесса) -EXE_FM DB #00 -EXE_MEM DB #00 +EXE_FM: DB #00 ; дескр. файла +EXE_MEM: DB #00 ; идентификатор блока памяти -CMDLINE DW #0000 +CMDLINE: DW #0000 -EXSTACK DW XSTACK +EXSTACK: DW XSTACK ; адрес стека ;R11 \\\\\\\\\\\\\\\\\\\\\\\\\\\\ ;; ; EXEBUFF: -; DB "EXE" -; DB #00 +; DB "EXE" +; DB #00 ; OFFCOD1 DW #0000 ; OFFCOD2 DW #0000 ; LOADER DW #0000 -; DW #0000 -; DW #0000 -; DW #0000 +; DW #0000 +; DW #0000 +; DW #0000 ; LD_ADDR DW #0000 ; PC_REG DW #0000 ; SP_REG DW #0000 -; BLOCK 512-($-EXEBUFF),0 -; ;(!!!HERE STACK FOR EXEC!!!) -; BLOCK 255,0 +; BLOCK 512-($-EXEBUFF),0 +; ;(!!!HERE STACK FOR EXEC!!!) +; BLOCK 255,0 ; XSTACK DB #00 ;R11 //////////////////////////// ;//MODULE: EXECUTE -;[END] - +;[END] \ No newline at end of file diff --git a/DSS/Media_drivers/FDD.ASM b/DSS/Media_drivers/FDD.ASM index 6f0ca7a..594a837 100644 --- a/DSS/Media_drivers/FDD.ASM +++ b/DSS/Media_drivers/FDD.ASM @@ -130,6 +130,10 @@ R_DSK EQU #FF ;Drive Control COM_B EQU #1B + +;------------------------------------------------- +; Обработчик FDD (rst 18h) +;------------------------------------------------- FDDRIVE: INC C DEC C diff --git a/DSS/Media_drivers/Shared.ASM b/DSS/Media_drivers/Shared.ASM index 4593d9e..de0c995 100644 --- a/DSS/Media_drivers/Shared.ASM +++ b/DSS/Media_drivers/Shared.ASM @@ -1,3 +1,12 @@ +;[BEGIN] +;//MODULE: Shared AUTHOR: Denis Parinov +;//CREATE: A LONG TIME AGO :) +;--------------------------------------------------------------- +;Rev Date Name Description +;R01 17-04-2023 BAO Добавлена процедура INITDVC_RET_DRIVE и изменена INTDISK для поддержки рескана драйвов +;--------------------------------------------------------------- + + ; DISK DRIVER SPECIFICATION ;--------------------------------------------- @@ -107,15 +116,19 @@ ; EX (SP),HL ; RET +;------------------------------------------------- +; RST 18h. Вектор дисковых устройств +; вход: a=номер устройства (0-25) +;------------------------------------------------- DSS_MAX_DRIVES_AMOUNT EQU 26 - INTDISK: - CP #FF - JR NZ,.noNeedRescan - CP C - JR Z,INITDVC_RET_DRIVE - + ;R01 + CP #FF + JR NZ,.noNeedRescan + CP C + JR Z,INITDVC_RET_DRIVE .noNeedRescan: + ; PUSH HL PUSH BC LD C,A @@ -138,7 +151,7 @@ INTDISK: EX (SP),HL RET -NODEV POP BC +NODEV: POP BC POP HL LD A,DSS_Error.drv.INVALID_DRIVE SCF @@ -175,26 +188,34 @@ NETWORK EQU #0008 ; DB #80 ;PHISICAL DRIVE NUMBER ; ; DB #00 ;END OF TABLE -INITDVC_RET_DRIVE: - CALL INITDVC - LD A,(LDRIVE) - AND A - RET +;----------------------------------------------------------------------- -INITDVC XOR A - LD (LDRIVE),A + ;R01 +INITDVC_RET_DRIVE: + CALL INITDVC + LD A,(LDRIVE) + AND A + RET + ; + +;----------------------------------------------------------- +; Просканировать систему на FDD/HDD девайсы и RAM-диски +;----------------------------------------------------------- +INITDVC: XOR A + LD (LDRIVE),A ; сбр. ячейку LD HL,DEVICE - LD (PDEVICE),HL + LD (PDEVICE),HL ; восст. ячейку + ; FDD девайсы LD C,A - CALL FDDRIVE - LD DE,FDDRIVE - CALL MAKEDVC -// XOR A + CALL FDDRIVE ; узнать число FDD-девайсов + LD DE,FDDRIVE ; адрес обработчика тек. девайса + CALL MAKEDVC ; иниц. таблицу переходов + ; HDD девайсы LD C,0 CALL HDDRIVE LD DE,HDDRIVE CALL MAKEDVC -// XOR A + ; RAM-диски LD C,0 CALL RMDRIVE LD DE,RMDRIVE @@ -202,22 +223,25 @@ INITDVC XOR A XOR A RET -MAKEDVC LD C,A - LD HL,LDRIVE +; Инициировать таблицу переходов девайса. +; вход: de=адрес обработчика девайса +; a=число девайсов (0=нет) +MAKEDVC: LD C,A + LD HL,LDRIVE ; ячейка номера посл. диска ADD A,(HL) LD (HL),A LD A,C - LD C,0 + LD C,0 ; сбр. OR A - RET Z - LD HL,(PDEVICE) -.loop: LD (HL),C + RET Z ; нет девайсов + LD HL,(PDEVICE) ; тек. полож. в таблице +.loop: LD (HL),C ; номер драйва этого устройства (младшие 4 бита). Например, для HDD #81: #80 - тип драйва, 1 - номер драйва INC HL - LD (HL),E + LD (HL),E ; de=адрес обработчика INC HL LD (HL),D INC HL - INC C + INC C ; ++номер драйва DEC A JR NZ,.loop LD (PDEVICE),HL diff --git a/DSS/Structures.inc b/DSS/Structures.inc index b40ef1e..9e6ab74 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -1,6 +1,6 @@ ; STRUCT _sStack ; 256 bytes -buffer BLOCK 255,0 +buffer BLOCK 256,0 SPoint BYTE 0 ENDS ; diff --git a/DSS/build.txt b/DSS/build.txt index 86ee83a..ac4213d 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -40 \ No newline at end of file +43 \ No newline at end of file diff --git a/SYS/DSSBOOT.ASM b/SYS/DSSBOOT.ASM index 27c8095..ff46adf 100644 --- a/SYS/DSSBOOT.ASM +++ b/SYS/DSSBOOT.ASM @@ -129,24 +129,15 @@ NOSHELL EQU 5 STARTDO EQU 6 ;a BIOS version that is incompatible with this version of DOS ; 0 10 20 30 40 50 60 70 80 -MSG0 DB 0 - DB 13,10,"The system has been halted. Press RESET to restart your computer.",13,10 - DB 0 - DB 13,10 - DB "You started your computer with a BIOS version that is incompatible with this",13,10 - DB "version of DSS. Please update BIOS to run this version of DSS.",13,10 - DB 0 - DB "Invalid partition table.",13,10 - DB 0 - DB "Invalid BOOT sector.",13,10 - DB 0 - DB "Can't open file SYSTEM.DOS ...",13,10 - DB 0 - DB "Can't open file SYSTEM.EXE ...",13,10 - DB 0 - DB 13,10,"Starting DSS... ",13,10,13,10 - DB 0 -MSGE DB 0 +MSG0: DB 0 + DB 13,10,"The system has been halted. Press RESET to restart your computer.",13,10,0 + DB 13,10,"You started your computer with a BIOS version that is incompatible with this",13,10,0 + DB "version of DSS. Please update BIOS to run this version of DSS.",13,10,0 + DB "Invalid partition table.",13,10,0 + DB "Invalid BOOT sector.",13,10,0 + DB "Can't open file SYSTEM.DOS ...",13,10,0 + DB 13,10,"Starting DSS... ",13,10,13,10,0 +MSGE DB 0 CONTINU LD HL,0 diff --git a/SYS/SYS.ASM b/SYS/SYS.ASM index 1649222..4e26e7f 100644 --- a/SYS/SYS.ASM +++ b/SYS/SYS.ASM @@ -1,6 +1,5 @@ ;!TODO определение попытки сделать загрузочным не первый раздел -; Последняя редакция: 25.04.2006 ; Программа записи на FDD/HDD boot-загрузчика и файлов системы. ; ; Загружает сист. файлы из корня диска, с которого была