Очень просто: обнаружив такую ситуацию просто ничего не делаем и возвращаемся туда откуда пришли. При этом RESORC покажет что FIS есть, а теоретическая программа которая ждет реального результата в такой ситуации так и так получит кривой.
Вид для печати
Нет - в такой ситуации EM.SYS будет передавать управление на системный обработчик Trap to 010 - это более совместимо.
...
Компилируя вчера EM.SYS v1.0 я столкнулся с любопытной деталью - при компиляции и линковке программами от RT-11 v05.04 - код в нулевом блоке драйвера оказался на одно слово ближе к началу, нежели при сборке в RT-11 v05.07
Т.е. никакие .ASECT не "спасли" - код лёг в разные ячейки.
О совместимости тут даже речи не идет. Если прога начнет работать с FIS, обнаружив, что он есть и трапнется на операции которая в теории тоже есть, поверь, совместимее оно не будет ;)
Втыкание кода .ASECTами в "неиспользуемые" ячейки в принципе криво. Из-за таких извратов драйвер (даже с точки зрения RT-11 V5.02) оказывается часто с вложенным незапланированным функционалом или как к примеру родной WD с его ".=.-2" после DRBEG, оказывается эффективно превращен в драйвер от RT-11 V4.
---------- Post added at 16:20 ---------- Previous post was at 16:16 ----------
Если уж тут говорить о совместимости - правильнее сделать FP exception :)
---------- Post added at 16:25 ---------- Previous post was at 16:20 ----------
И если уж на то пошло, то с точки зрения вычислительной программы, вероятность такого кода все-таки равна нулю.
Поскольку сейчас я переделываю драйвер EM.SYS, то вынужден решать как раз эту проблему. При сборке в RT-11 v05.07 - неудачно расположенный код оказывается заменён на разную служебную информацию.
Я правильно понимаю, что наиболее совместимо линковать драйвер, как обычный файл .SAV ?
Для драйвера нужно /NOBITMAP делать.
---------- Post added at 16:36 ---------- Previous post was at 16:33 ----------
А вообще, если взялся переделывать драйвер, лучше выкинуть уродсткое .ASECTство и сделать нормальные оверлеи SETовские если вдруг по какой-то причине что-то не влезает. Хотя там вроде не так много всего чтобы не влезало.
---------- Post added at 16:56 ---------- Previous post was at 16:36 ----------
Нефиг вообще лезть в 200/202 если не нужна прога инсталяции.Код:.ASECT
.=200
NOP
RETURN
Код
Упрощаем до...Код:FINDRV:
MOV PC, R0
ADD #DEVNAM-., R0
MOV PC, -(SP)
ADD #AREA-., (SP)
Код:JSR R1,10$
.RAD50 /EM/
.BLKW 4
10$: MOV R1,R0
TST (R1)+
MOV R1,@SP
---------- Post added at 17:04 ---------- Previous post was at 16:56 ----------
Неясно зачем стек попается - DSTAT при ошибке его также сдвинет.
Код:O.GOOD: CMP (PC)+,(PC)+
OO.BAD: TST (SP)+
O.BAD: SEC
RETURN
---------- Post added at 17:08 ---------- Previous post was at 17:04 ----------
Уже поправил - я правильно прочитал - там криво :)
Видимо автор исходил из того, что если система не суппортит .DSTAT - выбрать аргумент. Но во-первых его суппортят все RT-11 как минимум начиная с версии 3, во-вторых при неподдерживаемом вызове RT-11 не выставляет C.
---------- Post added at 17:10 ---------- Previous post was at 17:09 ----------
Да, это правильный код.
---------- Post added at 17:12 ---------- Previous post was at 17:10 ----------
Еще упростить как я нарисовал, код подсократится на слова 3-4 :)
Кстати даже как написано топорно можно было сократить на слово - незачем несколько раз подряд MOV PC,Rx делать :)
Хотя нет - тут не поможет - мало раз делается :)
Это фрагмент из первой версии драйвера. Потом авторы совместными усилиями всё запутали.
---------- Post added at 13:21 ---------- Previous post was at 13:13 ----------
Похоже, что вот этот код неправильный:
При отсутствии FPP - BIS #EIS$,CONFIG не отменяется перед выходом.Код:O.ON:
CALL FINDRV
TST R1 ; Если драйвер уже загружен,
BNE L1$ ; напечатать об этом
MOV @#SYSPTR, R0
BIS #EIS$,CONFIG(R0) ; включить EIS
.IF DF FPP
BIT #FPP$,CONFG1(R0) ; Ошибка, если нет FPP.
BNE 2$
JSR R0,3$
.ASCIZ /?EM-F-Use FPP/
.EVEN
3$: .PRINT
MOV (SP)+,R0;
BR O.BAD
Я бы сказал, что устанавливать его в принципе надо перед тем как уже запустился в работу. @#SYSPTR эффективно можно заменить на @R3 в данном случае. Еще ошибка: драйвер исходит из того, что EIS в принципе не поддерживается, а если он таки поддерживается и драйвер по сути эмулировал FIS, то при выключении его конфиг покажет что поддержки нет.
---------- Post added at 17:29 ---------- Previous post was at 17:27 ----------
А, не, он там что-то пытается учинить разборками с прерываниями... Даже копаться лень :)