Уже с версии 5.1 везде в секции RTDATA, но смещения скачут. А вот начиная с версии 5.4 уже всё стандартизировано. Это кстати описано в AA-52861-TC_54relNote_Jun86.pdf.
Вид для печати
Версия 5.4 вообще во многом переломная: в ней впервые появился (в 5.4G) многострочный SL. В ней же появились макрокоманды для драйверов с расширенными номерами устройств (10-77), хотя сами расширенные номера появились только в 5.5.
- - - Добавлено - - -
Можно смело последний читать - там история есть.
В 5.6 вроде подробная была.
Там кстати также называется глава - между 5.0 и 5.5, но по ходу чтения указаны конкретные версии и даже буковки.
- - - Добавлено - - -
Попутно посмотрел, что RTEMовские заточки интегрировали в основной RT-11 начиная с версии 5.02, и ошибки которые были при этом допущены так и остались навсегда нетронутыми :)
Именно так там и написано если читать - конкретные версии (в том числе 5.4 и разные буквы к нему упоминаются не раз).
- - - Добавлено - - -
По хорошему на досуге надо основные изменения с V4.0 записать. А то многое уже забываться стало, а ведь когда-то описание макробиблиотеки (к примеру) содержало приписку FB/XM only на большую часть макрокоманд :)
- - - Добавлено - - -
Сравнил смещения .GVAL для TSX+ и РАФОС/TS - вот где постоянство: ничего не изменилось. Только новое добавилось (ну и где-то подкорректировалось в связи с развитием: например раньше по смещению -6 был признак привилегированности задания, а позже стало указывать на конкретную привилегию SYSPRV, но смысл по сути не изменился) :)
form, вот мои изменения в исходнике SH.MAC
Беда в том, что я основную часть программы просто не понимаю и воспринимаю скорее интуитивно.Код:.MCALL .MODULE
.MODULE SH,VERSION=1,COMMENT=<RT-11 Shell Driver>,AUDIT=YES
.ENABL LC, MCL
.DSABL GBL
$SYPTR =: 54 ;POINTER TO RMON
$E16LS =: 316 ;EMT 340-357 DISPATCH TABLE OFFSET
$KMONI =: 450 ;KMON INDICATOR OFFSET
E6.PRI =: <351-340>*2 ;OFFSET TO .PRINT ROUTINE
.MCALL .ADDR,.CHAIN,.DRDEF ;SYSTEM MACRO CALLS
.MCALL .DSTAT,.EXIT,.LOOKUP ;
.MCALL .LOOKUP,.PURGE,.PRINT ;
.DRDEF SH,340,0,0,0,0 ;DEFINE DRIVER PARAMETERS
.DRPTR LOAD=SHLOA,FETCH=*NO*,UNLOAD=SHUNL ;DEFINE SERVICE ENTRIES
.DRBEG SH ;START OF DRIVER CODE
MOV SHCQE,R4 ;GET ADDRESS OF QUEUE ELEMENT
BIS #HDERR$,@-(R4) ;SET HARD ERROR STATUS
.DRFIN SH ;FINISH I/O
SHINT:: TST @(PC)+ ;RUNNING KMON?
SHKMI:: .BLKW ;
BEQ 20$ ;IF EQ NO
.IF EQ MMG$T
CMP @14(SP),(PC)+ ;CHECK IF PROMPT IS PRINTED
.IFF
CMP @16(SP),(PC)+ ;CHECK IF PROMPT IS PRINTED
.ENDC
MOV R5,R5 ;
BNE 20$ ;IF NE NO
; MOV R0,-(SP) ;SAVE REGISTERS
; MOV R1,-(SP) ;
5$: .ADDR #SHARE,R0 ;POINT TO EMT AREA
.ADDR #SHPGM,R1 ;POINT TO PROGRAM NAME
.LOOKUP R0,#0,R1 ;LOOKUP THE FILE
ROL -(SP) ;SAVE ERROR STATUS
.PURGE #0 ;PURGE CHANNEL
ROR (SP)+ ;RESTORE ERROR STATUS
BCS 10$ ;IF CS FILE NOT FOUND
MOV #500,R0 ;POINT TO CHAIN AREA
MOV (R1)+,(R0)+ ;COPY PROGRAM NAME
MOV (R1)+,(R0)+ ;
MOV (R1)+,(R0)+ ;
MOV (R1)+,(R0)+ ;
.CHAIN ;CHAIN TO PROGRAM
10$: ;MOV (SP)+,R1 ;RESTORE REGISTERS
;MOV (SP)+,R0 ;
20$: .PRINT #FNF
BR 5$
;JMP @(PC)+ ;JUMP TO SYSTEM ROUTINE
SHPRI:: .BLKW ;ADDRESS OF SYSTEM .PRINT ROUTINE
SHARE:: .BLKW 3 ;EMT AREA
SHPGM:: .RAD50 /SY SHELL SAV/ ;PROGRAM TO CHAIN TO
.DREND SH
.PSECT SETOVR
SHLOA:: MOV @R5,R5 ;R5=SHLQE
MOV @#$SYPTR,R4 ;R4=RMON
MOV R4,R2 ;COPY
ADD $E16LS(R4),R4 ;R4=EMT 340-357 DISPATCH TABLE
MOV E6.PRI(R4),R3 ;R3=ADDRESS OF .EXIT ROUTINE
ADD R4,R3 ;
MOV R3,SHPRI-SHLQE(R5) ;STORE IN DRIVER
MOV R5,R3 ;R3=SHINT
ADD #SHINT-SHLQE,R3 ;
SUB R4,R3 ;R3=OFFSET TO SHINT
MOV R3,E6.PRI(R4) ;POINT TO OUR ROUTINE
ADD #$KMONI,R2 ;R2=KMON INDICATOR
MOV R2,SHKMI-SHLQE(R5) ;STORE IN DRIVER
SHXIT:: CLC ;FLAG NO ERROR
RETURN ;RETURN
SHUNL:: MOV @R5,R5 ;R5=SHLQE
MOV @#$SYPTR,R4 ;R4=RMON
ADD $E16LS(R4),R4 ;R4=EMT 340-357 DISPATCH TABLE
MOV E6.PRI(R4),R3 ;R3=ADDRESS OF .EXIT ROUTINE
ADD R4,R3 ;
MOV #SHINT-SHLQE,R2 ;R2=SHINT
ADD R5,R2 ;
CMP R3,R2 ;OUR HOOK SET?
BEQ 20$ ;IF EQ YES
JSR R0,10$ ;NO, SET ERROR MESSAGE
.ASCIZ /?SH-F-Other driver hooks .PRINT - can't unload/
.EVEN
10$: COM (SP)+ ;CLEAN STACK, SET CARRY
RETURN ;RETURN
20$: MOV SHPRI-SHLQE(R5),R5 ;R5=ADDRESS OF SYSTEM .PRINT ROUTINE
SUB R4,R5 ;CONVERT TO OFFSET FROM EMTLST
MOV R5,E6.PRI(R4) ;UNHOOK .PRINT
BR SHXIT ;EXIT
FNF: .ASCIZ /?SH-F-File not found SY:SHELL.SAV/
.END
.LO SH
000066
@
Правильно я понимаю, что драйвер проверяет приглашение и если оно выводится пытается
запустить программу оболочки? Но только всё слишком не явно для меня.
Даже .CHAIN директива описана "не моим" (чит. не простым) способом каким-то?
Буду рад любым комментариям и обсуждению.
- - - Добавлено - - -
увидел только сейчас, забираю
Все это выкинуть, JMP раскоментировать. Тогда будет до бесконечности писать что программы нет (если ее нет). А так получится сбой системы из-за использования вызовов за пределами перехваченного без сохранения регистров. То есть ничего добавлять не надо чтобы до бесконечности писало что программы нету - надо только убрать :)
- - - Добавлено - - -
А так, если когда придется делать что-то в этом роде - в драйвере так не получится. Нужно или во время загрузки подправлять в памяти адреса (но это 5.02 и новее) или использовать .ADDR чтобы на ходу определять адрес.
мне нужны подробности. почему так а не по другому, это одна из причин
почему я AC.SYS до сих пор не переделал, просто потому, что я не могу
разделить ненужный функционал от нужного (точнее я разделяю, но прога
перестаёт работать! "смайл")
я вот протакие вещи совсем совсем не в курсе (самой природы таких ограничений).
ХА! form
, ты будешь смеятся - забрал драйвер который с COM файлом - он так-же выпадает в 066
перезагрузился и у меня висит система ))) То есть приглашение . и всё ничего не печатает,
в смысле на клавиатуру нет реакции ))) это означает что???
В любом случае всем очень благодарен за участие как минимум,
честно сейчас уверен может проще дизасемблировать оригинальный JS.SYS и подсмотреть,
как там эту задачу решили??? Только опять (писал выше) мне дизасм. скажет мало-мало чем (к примеру) form'у )))
Сейчас выкину по последней шпоре, попробую.
Почему и обязательно .CHAIN через регистры? Почему
не
Ладно, сейчас буду править по последней шпоре.Код:/* MOV #^RSY ,@#^O500
MOV #^RSHE,@#^O502
MOV #^RLL ,@#^O504
MOV #^RSAV,@#^O506
.CHAIN
Это ознчает, что в стартовом командном файле нет команды загрузки драйвера - выше писал, что она обязательна :)
Просто больше места займет, а так - пофигу.
Кроме того нужно убрать тестирование KMON indicator - слишком много бардака с ним, да и смысла нет - мы вполне эффективно проверяем его наличие другим способом :)