Страница, посвященная сохранению и улучшению RTEM находится здесь.
Ну вроде дозрел до создания отдельной темы по RTEM. Выложу сюда все, что на данный момент выкопано (напомню, в активе имелся весьма урезанный вариант RTEM/VAX V1.0 в виде собранной задачи и shared образ в котором не было ничего кроме RT-11 V4.0C для RTEM, DUP.SAV (адаптированного для RTEM), FIP.SAV, JOAT.SAV и драйвера VS.SYS. Остальных драйверов, увы, не было.
С тех пор RTEM.TSK неоднократно патчился для некоторого приведения в порядок (поддержка Y2K дат, передача RTEM флагов в RT-11 V5 про которые он не знал, замена расширений файлов диска на DSK с SYS [как это должно быть в RTEM V2]). Также был пропатчен JOAT.SAV (расширение виртуальных дисков DSK, DU как допустимое устройство).
Здесь последний вариант RTEM.TSK и RT11SH.DSK с RT-11 V5.7 с поддержкой расширенных номеров устройств, а также драйверами DU: и RK: (не полнофункциональными, но достаточными для работы). DU собран для поддержки номеров устройств 0-17.
	Скрытый текст
	
 Код:
 DIR   .SAV    20P 31-Oct-1998    PIP   .SAV    30P 31-Oct-1998
FIP   .SAV    61P 16-May-2015    DUP   .SAV    52P 27-Feb-2016
JOAT  .SAV    52P 16-May-2015    RESORC.SAV    35P 31-Oct-1998
UCL   .SAV    16P 31-Oct-1998    MACRO .SAV    63P 31-Oct-1998
LINK  .SAV    59P 31-Oct-1998    LIBR  .SAV    24P 31-Oct-1998
CREF  .SAV     6P 31-Oct-1998    FORTRA.SAV   128P 23-Jul-2014
F77   .SAV   327P 23-Jul-2014    PASCAL.SAV    58P 04-Mar-2013
BASIC .SAV    52P 08-Oct-2015    BASPL .SAV   104P 02-Jun-2014
COBOL .SAV   194P 21-Mar-2014    CBLSML.SAV   194P 21-Mar-2014
CBLINK.SAV    47P 21-Mar-2014    CBLIBR.SAV    13P 21-Mar-2014
CLASS .SAV    51P 21-Mar-2014    ISAM  .SAV    72P 21-Mar-2014
ISMBLD.SAV    56P 21-Mar-2014    CBR063.SAV   119P 21-Mar-2014
BATCH .SAV    26P 31-Oct-1998    KED   .SAV    85P 31-Oct-1998
K52   .SAV    81P 20-May-2011    EDIT  .SAV    19P 31-Oct-1998
TECO  .SAV    50P 31-Oct-1998    HELP  .SAV   161P 31-Oct-1998
FILEX .SAV    22P 31-Oct-1998    DUMP  .SAV    10P 31-Oct-1998
BINCOM.SAV    25P 31-Oct-1998    SRCCOM.SAV    26P 31-Oct-1998
SIPP  .SAV    21P 31-Oct-1998    SLP   .SAV    13P 31-Oct-1998
PAT   .SAV    11P 31-Oct-1998    MONMRG.SAV    14P 31-Oct-1998
BUP   .SAV    68P 31-Oct-1998    QUEMAN.SAV    16P 31-Oct-1998
SETUP .SAV    43P 31-Oct-1998    LET   .SAV     6P 31-Oct-1998
SPLIT .SAV     3P 31-Oct-1998    TERMID.SAV     4P 31-Oct-1998
TRANSF.SAV    16P 31-Oct-1998    MDUP  .SAV    22P 31-Oct-1998
CONFIG.SAV    10P 31-Oct-1998    DBGSYM.SAV    10P 31-Oct-1998
INDEX .SAV    11P 31-Oct-1998    INDEXX.SAV    14P 31-Oct-1998
INDEXA.IMG   164P 31-Oct-1998    INDEXB.IMG   165P 31-Oct-1998
INDEX .IDX     7P 31-Oct-1998    SYS   .SAV     3P 30-May-2011
DISASM.SAV     8P 31-Mar-2013    VDT   .SAV     8P 09-Mar-2013
ECHO  .SAV     2P 05-Mar-2016    ERA   .SAV     1P 05-Mar-2016
CVT   .SAV     7P 05-Mar-2016    TTSET .SAV     5P 10-Apr-2015
QUEUE .REL    14P 31-Oct-1998    RTMON .REL     8P 31-Oct-1998
SPOOL .REL    12P 31-Oct-1998    SYSMAC.SML    92P 31-Oct-1998
SYSTEM.MLB   148P 31-Oct-1998    ULBMAC.MLB    16P 24-Oct-1998
CBMAC .MAC    11P 21-Mar-2014    SYSLIB.OBJ    84P 31-Oct-1998
ULBLIB.OBJ    33P 24-Oct-1998    RSXLIB.OBJ    13P 04-Apr-2016
RSXLIB.MLB     6P 04-Apr-2016    PASCAL.OBJ    90P 04-Mar-2013
FORLIB.OBJ   205P 31-Dec-1982    F77OTS.OBJ   135P 22-Apr-2011
F77CVF.OBJ     4P 30-Apr-1984    F77NER.OBJ     1P 30-Apr-1984
F77MAP.OBJ    33P 30-Apr-1984    F77EIS.OBJ     3P 30-Apr-1984
F77RAN.OBJ     2P 30-Apr-1984    F77COM.MSG    14P 20-May-2011
VDT   .OBJ     8P 31-Oct-1998    MBOOT .BOT     1P 31-Oct-1998
MBOT16.BOT     1P 31-Oct-1998    MSBOOT.BOT     4P 31-Oct-1998
MDUP  .MM     72P 31-Oct-1998    MDUP  .MS     72P 31-Oct-1998
MDUP  .MT     72P 31-Oct-1998    MDUP  .MU     72P 31-Oct-1998
CUSTOM.TXT    14P 31-Oct-1998    V5NOTE.TXT    36P 31-Oct-1998
RTEMFB.MAP    39P 06-Apr-2016    RTEMFB.CND     3P 06-Apr-2016
RTEMFB.SYS   108P 06-Apr-2016    SWAP  .SYS    28P 06-Apr-2016
BAM   .SYS     7P 06-Apr-2016    LDM   .SYS    11P 06-Apr-2016
NLM   .SYS     2P 06-Apr-2016    VSM   .SYS     6P 01-Feb-2012
SLM   .SYS    17P 22-Apr-2013    SDM   .SYS    23P 30-Jan-2012
RKM   .SYS     4P 15-May-2015    DUM   .SYS     5P 06-Apr-2016
IND   .SAV    58P 31-Oct-1998    UCL   .DAT     9P 06-Apr-2016
 [свернуть]
 
Немного общей информации. RTEM является программой, выполняющейся под RSX-11M, RSX-11M-PLUS, Micro/RSX, VAX/RSX под управлением которой грузится обычный RT-11. Программа устанавливает вектор SST и перехватывает все возможные варианты синхронных прерываний: trap to 4/10, mmu fault (отрабатывается как trap to 4), IOT, TRAP, BPT/T-bit, FP exception, non-RSX EMT. При возникновении SST эмулируется соответствующее прерывание. Таким образом программе под RTEM кроме обычного функционала RT-11 доступны директивы RSX-11. Также устанавливается AST на незапланированный ввод с терминала, эмулирующее прерывание от клавиатуры, а RMON патчится загрузчиком так, чтобы в тех местах где идет работа с железом или определенными сервисами обращение происходило к соответствующим подпрограммам RTEM. Для RT-11 V4 были отдельные исходники системы для RTEM. В RT-11 V5 загрузчик содержит весь необходимый код и включается при определении опции RTE$M=1.
Связь с RTEM из RT-11 устанавливается через RTEM link area - это вектор ссылок на подпрограммы и данные RTEM. Ссылка на link area надодится по адресу @#250 ($RTELK), адрес @#252 ($RTEID) при этом должен содержать значение 071645 (^RRTE).
Загрузка в RTEM возможна в двух вариантах:- загрузка с использованием shared и private образов (в этом случае shared образ открывается только для чтения, private образ открывается для чтения и записи, а для файлов shared образа начиная со SWAP.SYS и всех идущих за ним создается временный файл куда эти файлы копируются
- загрузка с физического диска с использованием специального драйвера RTEM, эмулирующего драйвер физического устройства (при этом диск может одновременно быть загрузочным диском RT-11 для обычной работы).
При загрузке RTEM читает первичный загрузчик из драйвера системного диска (VSM.SYS или соответствеющего устройства xxM.SYS), читает вторичный загрузчик из блоков 2-5 файла RTEMFB.SYS, устанавливает адрес подпрограммы чтения из первичного загрузчика и остальные данные для вторичного загрузчика (имя драйвера, номер устройства итд). Сам первичный загрузчик устройства RTEM должен только ругаться, что нельзя грузить RTEM на живой машине и останавливаться. В RTEM этот загрузчик не используется.
Смещения RTEM link area и имена которые использует BSTRAP.MAC в RT-11 V5.
 Код:
 006    .$CMKT
010    .$CRTI
012    .$DARL
016    .$FATA
020    .$FORQ
022    .$FPST
026    .$GETE
030    .$GETP
032    .$GTDA
036    .$GTPS
040    .$GTTI
042    .$IDLP
044    .$INTN
050    .$MRKT
052    .$PTPS
054    .$RDKM
060    .$RQSG
062    .$RSCT
064    .$RSTT
066    .$RTIC
070    .$SPL0
072    .$SPL7
120    .$TKS
122    .$TKB
124    .$TPS
126    .$TPB
140    .EXUSE
142    .FPPFL
144    .INTAC
146    .INTLV
150    .LKQUE
152    .PSCLO
154    .RMONS
156    .SAVE3
160    .SYS
162    .TASKS
164    .TIKCT
166    .TTRSE
170    .$ENSY
172    .$FORK
174    .$INTE
176    .$RMP0
200    .$RMP1
202    .$RMP2
204    .$RMP3
 Структура RTEM link area (кроме вышеписанного), известная на данный момент:
 Код:
 000    Адрес таблицы VS$SET дла устройства VS0:
	При загрузке системы из shared образа (LB:[1,1]RT11SH.DSK в RSX-11
	или SYS$LIBRARY:RT11SH.DSK в VMS) по этому смещению располагается таблица:
		000	VS$SSM	Количество сегментов каталога в shared образе
		002	VS$PSM	Количество сегментов каталога в private образе
		004	VS$SDB	Последний блок каталога в shared образе
		006	VS$SFW	Первый R/W блок shared образа (файл SWAP.SYS)
		010	VS$SLW	Последний R/W блок (конец shared образа)
		012	VS$SLB	Последний блок shared образа
		014	VS$PDB	Последний блок каталога private образа
		016	VS$PLB	Последний блок private образа
		020	VS$PHO	Последний открытый сегмент каталога в private образе
		022	VS$PLU	RSX-11 LUN, назначенный private образу
		024	VS$SLU	RSX-11 LUN, назначенный shared образу
		026	VS$TLU	RSX-11 LUN, назначенный временному файлу (копия части
				shared образа, доступная для записи начиная с SWAP.SYS)
		030	VS$SIZ	Размер устройства VS0:
		032	VS$BRO	Смещение для чтения данных (используется загрузчиком)
		034	VS$PT1	Patch space
		036	VS$PT2	-"-
		040	VS$PT3	-"-
002     Адрес подпрограммы, восстанавливающая характеристики терминала и завершающая
	RTEM
004     Адрес подпрограммы для вызова директив RSX-11, требующих динамической памяти RSX:
		JSR	R5,@4(Rx)	;ВЫЗОВ ПОДПРОГРАММЫ
		.WORD	IOSB		;АДРЕС БЛОКА СОСТОЯНИЯ QIO или 0 если нет/не QIO
		DIR$	...		;ВЫПОЛНЕНИЕ ДИРЕКТИВЫ RSX-11
		CALL	@(SP)+		;ВЫЗОВ СОПРОГРАММЫ (C БИТ НА ВХОДЕ ДОЛЖЕН ОТРАЖАТЬ
					;СТАТУС ВЫПОЛНЕНИЯ ДИРЕКТИВЫ
	Подпрограмма сохраняет @#46 ($DSW), дает выполнить директиву (и прочий код для нее),
	в случае ошибки вызванной нехваткой динамической памяти ждет важного события в RSX-11
	директивой WSIG$S и делает повтор вызова директивы. Восстанавливает @#46.
	При возврате случае успеха C=0, в случае ошибки C=1.
014     Адрес подпрограммы поиска RSX-11 LUN, назначенного RT-11 устройству:
		MOV	#^Rddn,R0	;ИМЯ УСТРОЙСТВА
		CALL	@14(Rx)		;ВЫЗОВ ПОДПРОГРАММЫ
	На выходе C=0 если LUN найден (в этом случае R0 содержит LUN) или C=1
	в случае ошибки
024     Адрес подпрограммы получения/обновления даты-времени.
		CALL	@24(Rx)
	На выходе R0 содержит дату в формате RT-11, R1 содержит $DSW от результата
	выполнения GTIM$ (зачем?), R5 указывает на буфер GTIM + G.TIHR. Адрес буфера берется
	из смещения 106 link area.
034     Адрес подпрограммы резервирования RSX-11 LUN для присоединия устройства.
		MOV	#^Rddn,R0	;ИМЯ УСТРОЙСТВА
		MOV	#x,R1		;ЕСЛИ R1=^RRTE - ПОСТОЯННОЕ ПРИСОЕДИНЕНИЕ
					;В ПРОТИВНОМ СЛУЧАЕ ПРИСОЕДИНЕНИЕ ДЛЯ RT-11
					;JOB ДО ВЫХОДА
		CALL	@34(Rx)		;ВЫЗОВ ПОДПРОГРАММЫ
	На выходе C=0 в случае успеха, C=1 в случае ошибки.
046     Адрес подпрограммы прерывания ввода-вывода на RSX-11 LUN.
		MOV	#LUN,R4		;RSX-11 LUN
		CALL	@46(Rx)		;ВЫЗОВ ПОДПРОГРАММЫ
	На выходе C=0 в случае успеха, C=1 в случае ошибки.
056     Адрес подпрограммы отключения RSX-11 LUN и назначение ему SY0: (устройство по умолчанию).
		MOV	#x,R1		;ЕСЛИ R1=^RRTE БЕЗУСЛОВНО ОТКЛЮЧИТЬ LUN
					;В ПРОТИВНОМ СЛУЧАЕ R1 ДОЛЖЕН СОДЕРЖАТЬ НОМЕР
					;ЗАДАНИЯ RT-11 УМНОЖЕННЫЙ НА 2 + 1.
	На выходе C=0 в случае успеха, C=1 в случае ошибки.
074     Адрес DPB для директивы QIOW$
076     Адрес DPB для директивы ESXT$
100	Адрес DPB для QIOW$ с функцией IO.KIL
102	Адрес DPB для QIOW$ с функцией IO.ATA для TI:
106	Адрес 8-словного буфера для GTIM$
110	Некая таблица системных параметров
		000	- флаги
				4	- загружен с shared образа
		030	- максимальный LUN который можно использовать (19. для того RTEM что есть)
	
114	Адрес таблицы LUN. На каждый LUN выделяется 2 слова. Первое слово содержит биты состояния,
	второе - имя устройства RT-11 в RADIX-50 или 0 для файла. Биты состояния:
		100000 - устройство только для чтения
		 40000 - LUN назначен устройству/файлу
		 10000 - shared образ (?)
		   200 - устройство RTEM (?)
		 0-177 - номер задания RT-11 + 1
 Пара слов о драйверах RTEM-11, используемых для эмуляции физических устройств.
В общем случае, это обычные драйвера RT-11, только вместо обращений к регистрам устройств
нужно вызывать директиву QIOW$ для соответствующего устройству LUN и вместо классического прерывания обрабатывать AST (не забывая, что верх стека при этом содержит адрес блока состояния I/O директивы QIOW$).
Драйвер должен сконвертировать номер устройства в имя в RADIX-50 вида ^RRK3 и вызвать подпрограмму, адрес которой записан в RTEM lik area по смещению 14 для поиска LUN, назначенного данному устройству. Если LUN найден - нужно вызывать директиву QIOW$, используя в качестве RSX-11 event flag номер, совпадающий с LUN, указав в качестве AST подпрограммы метку ddINT драйвера.
Подпрограмма обработки прерываний драйвера RTEM (ddINT) вместо использования .DRAST должна сделать следующее:
 Код:
 	RETURN			;ИЛИ BR НА ПОДПРОГРАММУ ОТМЕНЫ I/O (ВЫЗОВ QIOW$ IO.KIL)
ddINT:	TST	(SP)+		;УБРАТЬ ИЗ СТЕКА АДРЕС БЛОКА СОСТОЯНИЯ I/O
	JSR	R5,@$INPTR	;ВЫЗВАТЬ ПОДПРОГРАММУ $INTEN
	.WORD	PRI*40		;ПРИОРИТЕТ ПРОЦЕССОРА (ДЛЯ RTEM ОСОБОГО ФУНКЦИОНАЛА НЕ НЕСЕТ,
				;ОДНАКО ЕСЛИ ОН БУДЕТ БОЛЬШЕ 4, БУДЕТ ЗАБЛОКИРОВАНА ОБРАБОТКА
				;AST ДО ВОЗВРАТА ИЗ ПОДПРОГРАММЫ.
 Загрузчик устройства RTEM должен (как уже писалось выше) просто ругаться на невозможность загрузить RTEM на живом железе. Подпрограмма чтения должна использовать DPB директивы QIOW$ по адресу, записанному в @#772 и подпрограмму выполнения директивы по адресу, записанному в @#774.
Также в загрузчике должен быть подготовлен код для печати сообщений ошибок загрузки в RTEM. Пример загрузчика для драйвера RK в RTEM:
 Код:
         .DRBOT  RK,BOOT1,READ
        .=RKBOOT+40
BOOT1:  JMP     @#BOOT-RKBOOT
        .=RKBOOT+254
READ:   MOV     R0,R3                   ;SAVE BLOCK NUMBER
        MOV     RKBOOT+772,R0           ;GET ADDRESS OF QIOW DPB
        MOV     R2,Q.IOPL(R0)           ;SET BUFFER ADDRESS
        ASL     R1                      ;CONVERT WORD COUNT TO BYTES
        MOV     R1,Q.IOPL+2(R0)         ;SET BYTE COUNT
        MOV     R3,Q.IOPL+10(R0)        ;SET BLOCK NUMBER
        JMP     @rkBOOT+774             ;PERFORM I/O
BOOT:   JSR     R0,BPRINT               ;PRINT ERROR MESSAGE AND HALT
        .ASCII  <CR><0><LF><0>
        .ASCII  /?BOOT-U-Cannot boot RTEM standalone/<CR><LF><LF><200>
.ASSUME . LE RKBOOT+550
        .=RKBOOT+550
BPRINT: TSTB    @#TPS                   ;TERMINAL PRINTER READY?
        BPL     BPRINT                  ;PL = NO
        MOVB    (R0)+,@#TPB             ;PRINT CHARACTER
        BPL     BPRINT                  ;PL = MORE TO PRINT
10$:    HALT                            ;HALT PROCESSOR
        BR      10$                     ;
.ASSUME . LE RKBOOT+570
        .=RKBOOT+570
        JMP     @#BIOERR                ;RTEM BIOERR ENTRY
        .=RKBOOT+576
        JMP     @#REPORT                ;RTEM REPORT ENTRY
        .DREND  RK
 В этом коде загрузчика есть некоторые неточности: с RTEMовских точек входа BIOERR и REPORT нужно отрабатывать вывод средствами RSX, а не ссылаться на аналогичные точки для обычной загрузки. Позже нарисую как должно быть.
- - - Добавлено - - -
Ну вот, вроде основное закончил. Дальше можно мучить тему. Есть еще кое-какая техническая информация вроде формата shared образа (озвучивал ранее кажется в теме про Э85 и DEC Pro), но она не так существенна. Чуть позже напишу о патчах для RT-11 V5.7 которые пришлось наложить, чтобы система нормально грузилась под RTEM (некоторые ошибки тянулись с самого RT-11 V5.0, некоторые (поддержка расширенных unit # на устройстве загрузки) просто не предусматривались ибо RTEM был заброшен раньше RT-11 V5.5, некоторые возможно вызвыны использованием старого RTEM - другого-то пока нет [хотя теперь можно подумать и о написании своего]), но исправления всяко не помешают даже если когда и найдем более поздний.