RTEM-11 -- RT-11 под RSX-11M, RSX-11M-PLUS, Micro/RSX, VAX/RSX
Ну вроде дозрел до создания отдельной темы по 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 - другого-то пока нет [хотя теперь можно подумать и о написании своего]), но исправления всяко не помешают даже если когда и найдем более поздний.
Ошибки вторичного загрузчика (и не только его), относящиеся к RTEM:
Код:
.IF NE RTE$M
TST @#CNFMOD
BPL 120$
BIS #<BKSP$!HWTAB$>,DLTCB(R4)
BIC #<CRLF$>,DLTCB(R4)
120$: BIS #<RTEM$>,SYSGEN(R4)
BIT #<1>,@#CNFMOD
BEQ 130$
BIS #<UCF.ON>,CLIFLG-$RMON(R4)
130$:
.ENDC
Если RTEM передал флаг наличия UCF.SAV на диске, загрузчик включает UCF (вариант UCL, выполняющийся до обработки встроенных команд системы). Однако в этом месте R4 содержит собственно адрес RMON и не требует дополнительных смещений (код выше поступает правильно). Выделенная же строка должна выглядеть так:
Код:
BIS #<UCF.ON>,CLIFLG(R4)
Впрочем из-за другой ошибки в RMON этот код все-равно никакого функционала не выполняет поскольку следующий код
Код:
CLIFLG::.BYTE < UCL.ON ! CCL.ON ! DCL.ON ! <UCF.ON*RTE$M> >
просто включает UCF изначально - независимо от того есть UCF.SAV на системном диске или нет. Причем для систем старее 5.6 попытка загрузиться без UCF.SAV приведет к неработоспособности системы - некому будет обрабатывать команды. Должно быть:
Код:
CLIFLG::.BYTE < UCL.ON ! CCL.ON ! DCL.ON >
Еще одна проблема в загрузчике возникает если драйвер с которого грузится RTEM поддерживает расширенные номера устройств (10-77), и система также их поддерживает.
Код:
MOV (R0)+,R2
BNE 10$
MOV #<DRINTN+4>,R0
MOV SYHTOP-<BUFFB-RELLST>,R1
MOV #<$RMON>,R2
ADD R4,R2
ADD R4,R0
MOV -(R0),-(R1)
SUB R2,@R0
MOV @R0,O$FORK(R2)
MOV -(R0),-(R1)
SUB R2,@R0
.ENDC
Поскольку RTEM забросили раньше чем появились расширенные номера устройств, никто не позаботился о такой возможности. Данный код устанавливает точки входа $FKPTR и $INPTR для драйвера, однако драйвер с расширенными номерами устройств содержит 16-словную таблицу после вектора подпрограмм куда данный код и пытается писать точки входа. Для монитора который не поддерживает расширенные номера эта таблица автоматом отсекается всем драйверам где она есть, если же монитор поддерживает их - нужно об этом позаботиться:
Код:
.IF NE RTE$M
MOV (R0)+,R2
BNE 10$
MOV #<DRINTN+4>,R0
MOV SYHTOP-<BUFFB-RELLST>,R1
.IF NE <OWN$ER & UNI$64>
TST @#SY64
BEQ 35$
SUB #<32.>,R1
.ENDC
35$: MOV #<$RMON>,R2
...
И остался еще один косячок, замеченный в USR:
Код:
.IF NE TIME$R
.$UPDA ==: < . + 2>
CALL @#UPDDAT-$RMON
.ENDC
Этот код добавлен в поздних версиях RT-11 и к нему даже был добавлен hook для RTEM, чтобы загрузчик отпатчил вызов, перенаправив его куда нужно. Только вот подпрограммы которая при этом вызывается в RTEM портит регистры которые USR использует для хранения информации о текущей записи каталога (возможно, что для поздних версий RTEM это не так, но у нас пока только RTEM 1.0), что приводит к ошибкам. Решение очевидно:
Код:
.IF NE TIME$R
.IF NE RTE$M
MOV R2,-(SP)
MOV R3,-(SP)
MOV R4,-(SP)
.ENDC
.$UPDA ==: < . + 2>
CALL @#UPDDAT-$RMON
.IF NE RTE$M
MOV (SP)+,R4
MOV (SP)+,R3
MOV (SP)+,R2
.ENDC
.ENDC
На данный момент это все выявленные косяки.
- - - Добавлено - - -
Осталось сказать пару слов о том, что еще нужно доделать:- научить RTEM работе с именованными каталогами в RSX-11M-PLUS, Micro/RSX и P/OS
- правильно передавать флаги SCOPE и UCF в загрузчик (пока всегда передается SCOPE и NO UCF)
- разобрать драйвер VS по косточкам и пересобрать его заново, добавив фичи RT-11 V5
- подправить DUP, чтобы он нормально выполнял SQUEEZE на устройстве VS: (возможно это часть предыдущего вопроса)
- сделать программу UCF для реализации RTEMовских команд (или внести данный функционал прямо в KMON [тем более, что там даже есть NOP-заглушки для такого функционала кое-где]
RTEM LINK AREA И ПРОЧИЕ СТРУКТУРЫ
Что на данный момент известно о RTEM link area (@#250 указывает на эту таблицу). В скобках указан источник информации о названии символа: BSTRAP или DUP. Если написано (X), значит название условное (может не совпадать с прошлыми названиями которые использовались в драйверах).
Код:
VS$SET =: 000 (DUP) ;АДРЕС СТРУКТУРЫ ДАННЫХ VS СИСТЕМНОГО ДИСКА
;ЕСЛИ ЗАГРУЗКА БЫЛА НЕ С ПАРЫ SHARED-PRIVATE
;IMAGE, А С ФИЗИЧЕСКОГО ДИСКА, УКАЗЫВАЕТ НА СТРУКТУРУ,
;ЗАПОЛНЕННУЮ НУЛЯМИ
.$EXIT =: 002 (X) ;АДРЕС ПОДПРОГРАММЫ ВОССТАНОВЛЕНИЯ ТЕРМИНАЛЬНЫХ
;ХАРАКТЕРИСТИК И ВЫХОДА В СИСТЕМУ
.$EXEC =: 004 (X) ;АДРЕС СОПРОГРАММЫ ДЛЯ ВЫЗОВА ДИРЕКТИВ RSX-11,
;ТРЕБУЮЩИХ ДИНАМИЧЕСКОЙ ПАМЯТИ
;(С СОХРАНЕНИЕМ/ВОССТАНОВЛЕНИЕМ @#$UFLOA/$DSW)
;И ОЖИДАНИЕМ ВАЖНОГО СОБЫТИЯ И ПОВТОРОМ В СЛУЧАЕ ОШИБКИ
;ДИРЕКТИВЫ IE.UPN ИЛИ IE.NOD. СТАТУС I/O (ЕСЛИ УКАЗАН IOSB)
;ПРОВЕРЯЕТСЯ.
; XXX - УТОЧНИТЬ МАНИПУЛЯЦИИ ПРИ IE.NOD
;ФОРМАТ ВЫЗОВА:
; JSR R5,@.$EXEC(Rx) ;ВЫЗОВ СОПРОГРАММЫ
; .WORD IOSB ;АДРЕС БЛОКА СОСТОЯНИЯ QIOW
; ;ИЛИ 0 ЕСЛИ НЕ НУЖЕН
; DIR$ ... ;ВЫЗОВ ДИРЕКТИВЫ
; CALL @(SP)+ ;ВЕРНУТЬСЯ В СОПРОГРАММУ
; BCS ERROR ;CS = ОШИБКА ДИРЕКТИВЫ ИЛИ
; ;I/O (ЕСЛИ УКАЗАН IOSB)
.$CMKT =: 006 (BSTRAP) ;АДРЕС ПОДПРОГРАММЫ $CMKT
.$CRTI =: 010 (BSTRAP) ;АДРЕС ПОДПРОГРАММЫ $CRTI
.$DARL =: 012 (BSTRAP) ;АДРЕС ПОДПРОГРАММЫ $DARLN
.$FNDL =: 014 (X) ;АДРЕС ПОДПРОГРАММЫ $FNDLN (X) ДЛЯ ПОИСКА LUN
;УСТРОЙСТВА
;ФОРМАТ ВЫЗОВА:
; MOV #^RDDN,R0 ;ИМЯ RT-11 УСТРОЙСТВА (R50)
; CALL @.$FNDL(Rx) ;ПОИСК LUN
; BCS ERROR ;CS = NOT FOUND
; ;R0 = LUN
.$FATA =: 016 (BSTRAP) ;АДРЕС ПОДПРОГРАММЫ $FATAL
.$FORQ =: 020 (BSTRAP) ;АДРЕС ПОДПРОГРАММЫ $FORQ
.$FPST =: 022 (BSTRAP) ;АДРЕС ПОДПРОГРАММЫ $FPST
.$GTIM =: 024 (X) ;АДРЕС ПОДПРОГРАММЫ $GTIM (X) ДЛЯ ВОЗВРАТА ВРЕМЕНИ И ДАТЫ
;ФОМАТ ВЫЗВА:
; CALL @.$GTIM(Rx) ;ВЫЗОВ ПОДПРОГРАММЫ
; ;R0,R1 = TIME (RT-11)
; ;R2 = DATE (RT-11)
.$GETE =: 026 (BSTRAP) ;АДРЕС ПОДПРОГРАММЫ $GETEN
.$GETP =: 030 (BSTRAP) ;АДРЕС ПОДПРОГРАММЫ $GETP
.$GTDA =: 032 (BSTRAP) ;АДРЕС ПОДПРОГРАММЫ $GTDA
.$ALCL =: 034 (X) ;АДРЕС ПОДПРОГРАММЫ $ALCLN (X)
;ФОРМАТ ВЫЗОВА:
; MOV #^RDDN,R0 ;ИМЯ УСТРОЙСТВА
; MOV #^RRTE,R1 ;ЕСЛИ ^RRTE ДЛЯ СИСТЕМЫ,
; ;ИНАЧЕ ДЛЯ ЗАДАЧИ
; CALL @.$ALCL(Rx) ;ВЫДЕЛИТЬ МЕСТО В ТАБЛИЦЕ
; ;C=0, R0=LUN
; ;C=1 - ОШИБКА
.$GTPS =: 036 (BSTRAP) ;АДРЕС ПОДПРОГРАММЫ $GTPSW
.$GTTI =: 040 (BSTRAP) ;АДРЕС ПОДПРОГРАММЫ $GTTI
.$IDLP =: 042 (BSTRAP) ;АДРЕС ПОДПРОГРАММЫ $IDLP
.$INTN =: 044 (BSTRAP) ;АДРЕС ПОДПРОГРАММЫ $INTN
.$IOKI =: 046 (X) ;АДРЕС ПОДПРОГРАММЫ $IOKIL (X)
;ФОРМАТ ВЫЗОВА:
; MOV #LUN,R4 ;LUN
; CALL @.$IOKI(Rx) ;KILL I/O
; ;ЕСЛИ ЗАГРУЖЕНО С VS
; ;...LUN 2-4 -> 2 (SH)
; ;ПРИ ОШИБКЕ FATAL EXIT
.$MRKT =: 050 (BSTRAP) ;АДРЕС ПОДПРОГРАММЫ $MRKT
.$PTPS =: 052 (BSTRAP) ;АДРЕС ПОДПРОГРАММЫ $PTPSW
.$RDKM =: 054 (BSTRAP) ;АДРЕС ПОДПРОГРАММЫ $RDKM
.$DACL =: 056 (X) ;АДРЕС ПОДПРОГРАММЫ $DACLN (X)
;ФОРМАТ ВЫЗОВА:
; MOV #LUN,R0 ;LUN
; MOV #JOB,R1 ;JOB # OR ^RRTE
; CALL $DACLN ;ЗАКРЫТЬ/ОТКРЕПИТЬ
.$RQSG =: 060 (BSTRAP) ;АДРЕС ПОДПРОГРАММЫ $RQSG
.$RSCT =: 062 (BSTRAP) ;АДРЕС ПОДПРОГРАММЫ $RSCT
.$RSTT =: 064 (BSTRAP) ;АДРЕС ПОДПРОГРАММЫ $RSTT
.$RTIC =: 066 (BSTRAP) ;АДРЕС ПОДПРОГРАММЫ $RTIC
.$SPL0 =: 070 (BSTRAP) ;АДРЕС ПОДПРОГРАММЫ $SPL0
.$SPL7 =: 072 (BSTRAP) ;АДРЕС ПОДПРОГРАММЫ $SPL7
.$QIOW =: 074 (X) ;АДРЕС DPB QIOW$
.$EXST =: 076 (X) ;АДРЕС DPB EXST$
.$QKIL =: 100 (X) ;АДРЕС DPB QIOW$ IO.KIL
.$QATA =: 102 (X) ;АДРЕС DPB QIOW$ IO.ATA
.$FILE =: 104 (X) ;АДРЕС ТАБЛИЦЫ ФАЙЛОВ $FILES (X)
.$TIMB =: 106 (X) ;АДРЕС БУФЕРА GTIM$
=: 110 (X) ;ПАРАМЕТРЫ RTEM
;+00 - BIT 2: 1=ЗАГРУЖЕН С VS
;+02 - ?
;+04 - ?
;+06 - ID СИСТЕМЫ:
; 1 - RSX-11M
; 5 - VAX/VMS
; 6 - RSX-11M-PLUS
; 11 - P/OS
;+10 - БЛОК ОПИСАНИЯ ПРИНТЕРА
;+12 - ||
'+14 - ||
;+16 - ||
;+20 - ||
;+22 - ||
;+24 - ||
;+26 - КОНЕЦ БЛОКА ОПИСАНИЯ ПРИНТЕРА
;+30 - МАКСИМАЛЬНЫЙ НОМЕР LUN
;...
;+40 - ВЕРСИЯ? (^RV1.)
=: 112 (X) ;(ССЫЛАЕТСЯ В СИСТЕМУ) USR?
.$LUNT =: 114 (X) ;АДРЕС ТАБЛИЦЫ LUN $LUNTB (X)
;
;ЭТО ПОДПРОГРАММЫ И ПЕРЕМЕННЫЕ RT-11 КОТОРЫЕ RTEM'ОВСКИЕ ПОДПРОГРАММЫ ПРИ СЛУЧАЕ
;МОГУТ ИСПОЛЬЗОВАТЬ. BSTRAP ЗАПОЛНЯЕТ ДАННЫЕ СМЕЩЕНИЯ ДЛЯ RTEM.
;
.EXUSE =: 140 (BSTRAP) ;АДРЕС EXUSER
.FPPFL =: 142 (BSTRAP) ;АДРЕС FPPFLG
.INTAC =: 144 (BSTRAP) ;АДРЕС INTACT
.INTLV =: 146 (BSTRAP) ;АДРЕС INTLVL
.LKQUE =: 150 (BSTRAP) ;АДРЕС LKQUE
.PSCLO =: 152 (BSTRAP) ;АДРЕС PSCLOK
.RMONS =: 154 (BSTRAP) ;АДРЕС RMONSP
.SAVE3 =: 156 (BSTRAP) ;АДРЕС SAVE30
.SYS =: 160 (BSTRAP) ;АДРЕС $SYS
.TASKS =: 162 (BSTRAP) ;АДРЕС TASKSP
.TIKCT =: 164 (BSTRAP) ;АДРЕС TITCTR
.TTRSE =: 166 (BSTRAP) ;АДРЕС TTRSET
.$ENSY =: 170 (BSTRAP) ;АДРЕС $ENSYS
.$FORK =: 172 (BSTRAP) ;АДРЕС $FORK
.$INTE =: 174 (BSTRAP) ;АДРЕС $INTEN
.$RMP0 =: 176 (BSTRAP) ;АДРЕС $RMON (?)
.$RMP1 =: 200 (BSTRAP) ;АДРЕС $RMON (?)
.$RMP2 =: 202 (BSTRAP) ;АДРЕС $RMON (?)
.$RMP3 =: 204 (BSTRAP) ;АДРЕС $RMON (?)
;
;TASK SST VECTOR. ЭТА ЧАСТЬ, ВОЗМОЖНО, НЕ РЕГЛАМЕНТИРУЕТСЯ СПЕЦИАЛЬНЫМИ СМЕЩЕНИЯМИ,
;НО В ИМЕЮЩЕМСЯ RTEM V1.0 ПО ЭТИМ СМЕЩЕНИЯМ НАХОДИТСЯ ВЕКТОР SST ЗАДАЧИ. ПОСЛЕ ИДУТ
;ВСЕВОЗМОЖНЫЕ DPB ДИРЕКТИВ RSX (ПО БОЛЬШЕЙ ЧАСТИ, НА НИХ ССЫЛАЮТСЯ ДРУГИЕ СМЕЩЕНИЯ).
;
=: 206 (X) ;OD - АДРЕС ПОДПРОГРАММЫ ВЕКТОРА 4
=: 210 (X) ;MP - АДРЕС ПОДПРОГРАМЫ ВЕКТОРА 250
=: 212 (X) ;BE - АДРЕС ПОДПРОГРАММЫ ВЕКТОРА 14
=: 214 (X) ;IO - АДРЕС ПОДПРОГРАММЫ ВЕКТОРА 20
=: 216 (X) ;IL - АДРЕС ПОДПРОГРАММЫ ВЕКТОРА 10
=: 220 (X) ;EM - АДРЕС ПОДПРОГРАММЫ ВЕКТОРА 30 (КРОМЕ EMT 377)
=: 222 (X) ;TR - АДРЕС ПОДПРОГРАММЫ ВЕКТОРА 34 (TRAP 0 ИЗ ОБЛАСТИ
; RTEM ИСПОЛЬЗУЕТСЯ ДЛЯ ПОДПРОГРАММЫ GETPSW RT-11)
=: 224 (X) ;FP - АДРЕС ПОДПРОГРАММЫ FP EXCEPTION
;-----------------------------------------------------------------------------------------------
;ТАБЛИЦА СООТВЕТСТВИЯ RSX-11 LUN УСТРОЙСТВАМ RT-11 (СМЕЩЕНИЕ 114 УКАЗЫВАЕТ НА ЭТУ ТАБЛИЦУ).
;НА КАЖДЫЙ LUN ПРИХОДИТСЯ ПО ДВА СЛОВА (ПЕРВОЕ - СЛОВО СОСТОЯНИЯ, ВТОРОЕ - ИМЯ RT-11 УСТРОЙСТВА В ;RADIX-50).
;СЛОВО СОСТОЯНИЯ ИСПОЛЬЗУЕТ СЛЕДУЮЩИЕ БИТЫ:
100000 - LUN ДОСТУПЕН ТОЛЬКО ДЛЯ ЧТЕНИЯ
40000 - LUN ИCПОЛЬЗУЕТСЯ
20000 - ?
10000 - ?
200 - LUN НАЗНАЧЕН САМИМ RTEM, ЕГО ТРОГАТЬ НЕЛЬЗЯ
;ТАБЛИЦА ФАЙЛОВ (СМЕЩЕНИЕ 104), НА КАЖДЫЙ ФАЙЛ ПРИХОДИТСЯ ПО 23 (ВОСЬМЕРИЧНОЕ) СЛОВ.
;ПЕРВОЕ СЛОВО - СЛОВО СОСТОЯНИЯ:
100000 - ФАЙЛ ОТКРЫТ ТОЛЬКО ДЛЯ ЧТЕНИЯ
40000 - ФАЙЛ ОТКРЫТ
20000 - SHARED? BOOT? (ПРЕДПОЛОЖИТЕЛЬНО ГОВОРИТ О ТОМ, ЧТО СЛЕДУЮЩАЯ ЗАПИСЬ - ЧАСТЬ ЭТОЙ)
400 - ВРЕМЕННЫЙ ФАЙЛ - БУДЕТ УДАЛЕН ПОСЛЕ ОТСОЕДИНЕНИЯ ИЛИ ВЫХОДЯ ИЗ RT1M
200 - ФАЙЛ ОТКРЫТ САМИМ RTEM, ЕГО НЕЛЬЗЯ ТРОГАТЬ
;И ДЛЯ ФАЙЛА И ДЛЯ LUN БИТЫ 0-6 МЛАДШЕГО БАЙТА СОДЕРЖАТ НОМЕР ЗАДАНИЯ RT-11, УМНОЖЕННЫЙ НА 2
;(СМЕЩЕНИЕ $JOBNU [322] ОТ НАЧАЛА RMON) ПЛЮС 1 (ИЛИ 0 ДЛЯ ВНУТРЕННИХ RTEM'ОВСКИХ НАЗНАЧЕНИЙ).
;ОСТАЛЬНЫЕ СЛОВА В ТАБЛИЦЕ:
;+02 РАЗМЕР В БЛОКАХ (ДЛЯ SHARED IMAGE ТУТ ПОЛНЫЙ РАЗМЕР УСТРОЙСТВА VS0:)
;+04 ИМЯ ФАЙЛА В RADIX-50 (ТРИ СЛОВА)
;+12 РАСШИРЕНИЕ ФАЙЛА (RADIX-50)
;+14 НОМЕР ВЕРСИИ ФАЙЛА
;+16 ИМЯ УСТРОЙСТВА (ASCII)
;+20 НОМЕР УСТРОЙСТВА
;ОСТАЛЬНЫЕ СЛОВА ПОКА НЕ ЯСНЫ
В МАССИВЕ ПАРАМЕТРОВ (ДОСТУПНОМ ПО АДРЕСУ ИЗ СМЕЩЕНИЯ 110 В RTEM LINK AREA), ПО СМЕЩЕНИЯМ
10-26 НАХОДИТСЯ БЛОК ОПИСАНИЯ ПРИНТЕРА. ЕГО ФОРМАТ:
10 - ИМЯ УСТРОЙСТВА
12-16 - ID ФАЙЛА КАТАЛОГА В КОТОРОМ БУДЕТ СОЗДАВАТЬСЯ ВРЕМЕННЫЙ ФАЙЛ ДЛЯ СПУЛИНГА
20-24 - UIC В ФОРМАТЕ GGGMMM В КОДЕ ASCII
26 - НОМЕР УСТРОЙСТВА
В RSX-11M-PLUS ВСЕГДА ОТКРЫВАЕТСЯ УСТРОЙСТВО LP КАК ФАЙЛ.
В 11M ЭТО МОЖЕТ БЫТЬ ДИСК С UIC ГДЕ БУДЕТ СОЗДАВАТЬСЯ ВРЕМЕННЫЙ ФАЙЛ
ИЛИ СИМВОЛЬНОЕ УСТРОЙСТВО TT/LP КОТОРОЕ БУДЕТ ОТКРЫВАТЬСЯ
(В ЭТОМ СЛУЧАЕ В RT-11 БУДЕТ ИСПОЛЬЗОВАТЬСЯ ДРАЙВЕР LS).
Вложений: 1
Whole = Shared + Temp + Private
Добавлю-ка в эту тему.
Немного навел порядок в голове относительно организации диска в RTEM при загрузке с пары S+P.
За основу взята пара S (4767+174=4941) + P (494).
Shared образ создавался штатно программой JOAT, private образ штатно создался RTEMом при первом запуске.
Получилась такая картина:
Вложение 62124
В shared образе каталог содержит 31 сегмент, из них используются 3, а остальные 28 выпадают из видимости. Так же из видимости выпадают блоки загрузчиков и home block - они берутся. Последние 174 блока отмечены маркером (SWAP.SYS) и во время работы копируются temp файл.
В private образе под каталог выделен 1 сегмент.
В результате получается системный диск размером 5373 блока с каталогом, состоящим из 4 сегментов.
Суммируя все это получаем требования к shared образу:- shared образ имеет самый обычный каталог
- сегменты должны линковаться по порядку
- первый сегмент каталога в shared образе забивается записями 100000
- все файлы должны иметь статус 102000
- последний используемый сегмент добивается до конца записями 100000
- общее число используемых сегментов не должно быть больше 30
- в области данных не должно быть пустого места
Неиспользованные сегменты из shared образа можно выкусить, поправив ссылки на данные в оставшихся сегментах. Работоспособность при этом сохранится. То есть выделять под каталог 31 сегмент обязательно. Скорее всего JOAT использует стандартный алгоритм инициализации.
Попробовал добавить в shared образ немного пустого места в конце (не внесенного в каталог). Работает, но лишнее место нигде не отразилось во внутренних структурах данных, хотя в принципе такой вариант там предусмотрен судя по всему.