Так и IND с любым (ну разумеется если это RT-11 V5). Но думаю у JS те же требования :)
Вид для печати
да! Он шёл как раз в комплекте с 5.1 для ДВК и с 5.0 для УК-НЦ
был ещё его практический клон PW.SYS - я его когда то в школе с ДВКашной дискеты домой себе копировал,
но он 1 в 1 ПАРОЛЬ + КОЛЬЦЕВОЙ ПЕРЕЗАПУСК ЛЮБОГО .SAV
- - - Добавлено - - -
Я когда писал про любой - я имел в виду, что мне не приходилось "генерить" с нуля систему что бы игровой сборник
сделать ))) Я просто отредактировал драйвер на нужный мне файл - в том случает - это игровое меню.
Так нужно чтобы его нельзя было вообще обойти (как гениальную советскую защиту в рафосе которая обрывалась с помощью CTRL/C в момент загрузки системы)? (запуск драйвера командой SET xx ON этого не оьеспечит сам по себе даже если это будет команда которую сам монитор даст вместо запуска стартового файла)
См скрины и описание выше )))
Классная прога да?
Её сочинили что бы MFP или SCE менеджеры покругу крутить под RT-11 !!!
form, если у тебя стоит UKNCBTL возьми любой из сборников игрушек "новоделов" моих и пощупай его в работе,
попробуй обойди ))) Ничего не выйдет. Кстати если сколько там (настраиваемый параметр) раз воодится неправ. пароль
он тупо вылетает в отладку без всяких шансов на запуск кроме как снова начать дискету загружать )))
Но это просто доб. в к описанию классической версии.
- - - Добавлено - - -
вот о том и речь! А тут вместо STARTS.COM в пятом блоке монитора пишем SE JS ON и всё Байтик в шоке до сих пор )))
Как спрашивает оно без стартового файла работает то вообще? )))))))))))))))))
http://archive.pdp-11.org.ru/ukdwk_a...t/Other/40in1/
Подходит и для эмулятора и для живой машинки )))
ага, только нету на SY: ни PIP ни DUP ни DIR ничего вообще нету )
Чёрный экран, приглашение ком.строки и курсор мигает. ) Такое прерывание не позволит ничего сделать кроме как
перезагрузить дискету (ну со сторонней дискеты мучать её никто не запретит никому и никогда).
- - - Добавлено - - -
Я помню ты уже "хвастался", я про эти телеки ничего не знаю (про себя прозвал их "шляндыч") )))
form, это ты можешь ) Только ты ещё должен сориентироваться и понять где и что прервать.
А вот у нас юзер который без инструкции UKNCBTL запустить не может ))) Надо же оберегать
от него пакет программ. К тому же - меню для игр - это только 1 вариант использования.
А если полновесную граф. оболочку под КЦГД накатать поверх RT-11 ?
Вот там и пригодятся
и прочие всякие вещи в консольном окне что бы мелькали )))
Вот для начала драйвер. Не причесывал, для простоты пока работает только в 5.02 и новее. Для включения LOA SH, для выключения UNL SH (если есть возможность ;)). Запускает прогу SY:SHELL.SAV если она есть. Если нету - обычная работа в системе.
Если есть желание - можешь самостоятельно доработать :)Код:.LO SH
.COP/NOPRO PIP.SAV SHELL
Files copied:
DK:PIP.SAV to DK:SHELL.SAV
*
PIP V05.31
*
PIP V05.31
*^C
*^C
*SHELL.SAV/D
*^C
.UNL SH
.
В драйвере никаких хитростей, никаких перехватов векторов. Все документированное-стандартное :)
а где же то самое кольцо??? )))
надо что бы (если нету) он тупо писал - нету!!! нету нету нету нету нету нету нету нету - бесконечно )))
Обычная работа в системе - не надо! )))
- - - Добавлено - - -
он вообще выпадать в систему не должен! он наоборот от этого должен оберегать (от выпадания в систему)
- - - Добавлено - - -
но этот вариант я изучу, спасибо.
- - - Добавлено - - -
забрал из каки вместе с исходником
- - - Добавлено - - -
обращение к SY между сообщениями само собой происходит )
Ну так просто убрать проверку файла и будет бесконечно писать :)
Так даже проще - сразу куча кода высвободится и сохранять регистры не нужно...
- - - Добавлено - - -
Или можно вставить код зачистки нижней памяти с чистым остановом (на ВМ3 правда он по дороге трапнется, но большую часть зачистит, ну а на УКНЦ вчистую отработает) :D
form, кстати говоря - я только сейчас обратил внимание!!!
Смотри - классический JS.SYS какая хитрая скотинка.
Во первых прервать его таки можно, но это его не убивает (если только не выгрузить),
после запуска любой программы он снова ищет свою прогу (значит он что то в памяти в делает с монитором, но не на диске - ибо "не навреди") и сам в себе он строку об ошибке не содержит!
Это KMON вместо него орёт что файла нету !!! (см. скрин выше).
Сейчас правлю исходник SH - переименовал его в SSH - типа Старт Шелл )))
Попробую что получиться, но
1. я понятия не имею что такое ХУК
2. мне то можно .PRINT использовать или нет?
- - - Добавлено - - -
form, НЕТ у меня не блинчик и даже не ком получился.
1. LINK ругнулся на три глобальных метки которые я не трогал !!!
2. теперь по LO SSH MON пишет что команда-инвалид )))
Листинг SSH.MAC
Код:.MCALL .MODULE
.MODULE SSH,VERSION=1,COMMENT=<RT-11 Shell Driver>,AUDIT=YES
$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 SSH,340,0,0,0,0 ;DEFINE DRIVER PARAMETERS
.DRPTR LOAD=SHLOA,FETCH=*NO*,UNLOAD=SHUNL ;DEFINE SERVICE ENTRIES
.DRBEG SSH ;START OF DRIVER CODE
MOV SHCQE,R4 ;GET ADDRESS OF QUEUE ELEMENT
BIS #HDERR$,@-(R4) ;SET HARD ERROR STATUS
.DRFIN SSH ;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$: .PRINT #NSHF ;RESTORE REGISTERS
; MOV (SP)+,R0 ;
; JMP @(PC)+ ;JUMP TO SYSTEM ROUTINE
20$: BR 5$
SHPRI:: .BLKW ;ADDRESS OF SYSTEM .PRINT ROUTINE
SHARE:: .BLKW 3 ;EMT AREA
SHPGM:: .RAD50 /SY SHELL SAV/ ;PROGRAM TO CHAIN TO
.DREND SSH
.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
NSHF: .ASCIZ /?SH-F-File not found SY:SHELL.SAV/
.END
Добавь в начало строчкуЕсли какая-то метка является глобальной, хорошим тоном считается указать ее в списке команды .GLOBL, а не разрешать Макро считать любую неопределенную в тексте метку глобальной.Код:.DSABL GBL
Естественно, SSH.SAV надо переименовать в SH.SYS (SHX.SYS для XM/ZM-монитора)
- - - Добавлено - - -
И еще, перед командой переименования .SAV в .SYS надо подать команду REM SH, а после переименования - команду INS SH
И вообще, собери все (включая компиляцию с линковкой) в один .COM-файл.
Здесь аналогично - драйвер не запрещает прерывание программ по CTRL/C, но в момент когда система должна выдать подсказку команды, драйвер снова запустит заданную прогу.
Можно. Драйвер реагирует только на .PRINT который печатает подсказку KMON.
Драйвер не бывает трехбуквенным - потому и ругается. Трехбуквенный файл .SYS драйвера бывает если в системе установлен суффикс драйвера (в XM/ZM/XB/ZB мониторах например добавляется буква X), но при этом имя драйвера в командах остается двухбуквенным.
Ну так написать надо на какие :)
Но глядя на исходники мельком - опять-таки - обозначение драйвера может быть только двухбуквенным.
Это скорее дань уважения RT-11V4 и более старым - там по умолчанию запрещено было смотреть за пределы исходника. В RSX же к примеру даже самых старых наоборот всегда было разрешено - там это необходимость чтобы распознать основные системные переменные и коды ошибок/функций I.O итд (хотя с помощью кучи макросов можно и вручную поопределять все это [в программах для RTEM так и делаю поскольку RTшный SYSLIB ничего не знает про RSXные символы :)]).
И правильно. Согласись, неприятно узнавать только от линкера о том, что ты, набирая метку, попал не в ту пимпочку!..
Эта необходимость является следствием недоработки. По-хорошему надо было определить все эти дела в какой-то системной макрокоманде (или в нескольких). .MCALL-то ты пишешь? И это бы написал.
- - - Добавлено - - -
(Хотя сравнительно свежие макро понимают .MCALL AUTO, или как там он пишется? Ни разу не пользовался, опять же из околоструктурных соображений. Ну, или следуя правилам хорошего тона.) :)
Это уже вопрос вкуса. Те кто начинал с RSX с этим не согласятся :)
Следуя той же логике про возможность написать, никто не мешает написать .DSABL GBL
.MACLLов и потом вызовов в начале программы может набраться штук 10 только ради того, чтобы определить то, что используется по сути во всех без исключения программах - я бы сказал, что именно это - излишества :)
А, вспомнил. .ENABL MCL
Это позволяет не использовать .MCALL, но это как раз очень вредная фича - на каждый чих будут просматриваться все макробиблиотеки которые используются.
И кстати не всегда сработает. Например с .PRINT в RT-11 такой номер не пройдет - он не подцепится :)
- - - Добавлено - - -
А если еще вспомнить старые компиляторы MACRO-11 в которых символы R0-R5, SP, PC не были определены... Вроде в моей любимой книге Сингера советуют явно определять регистры :)
Что я и посоветовал Хоботу
Так я и сказал, что DEC'овцам надо было объявить эти метки глобальными в нескольких системных макрокомандах. Одна - для ввода-вывода, одна для обработки ошибок и т.д., так, чтобы их набралось с десяток, не больше. Или даже одну, в конце, которая проверит все системные макровызовы, встреченные во всём исходнике и сгенерит все необходимые .GLOBL для тех меток, которые положено использовать тем макровызовам, которые есть в тексте. (И не генерить те, что не положены, если где накосячишь, то линкер пошлёт!..)
Угу. Например ПЛОСовский асм (не макро, макрокоманд он не понимает). Все мои программы тех вреиен начинались: R0=%0 <CR><LF> ... R5=%5<CR><LF> R6=%6 <CR><LF> R7=%7
С переходом на RT-11 этот список сократился до двух последних строчек - про R6 и R7. Поскольку при вызове подпрограммы я на автопилоте писал JSR R7,SUB, при выходе из П/П - RTS R7 и MOV Rn,-(R6) при сохранении регистра. А SP, PC, команды CALL и RETURN я так и не выучил.
DEC с этой командой вытворяет черт-те что в своих системах...
Например если заглянуть в системные программы RSX можно увидеть (справа написано что получится в результате):И только во всех остальных случаях будет обычный JSR PC :)Код:CALL $INTSV,PR5 ; JSR R5,$INTSV
; .WORD PR5
CALL $SAVNR ; JSR R5,$SAVNR
CALL $SWSTK,EXIT ; EMT 376
; .WORD EXIT
- - - Добавлено - - -
:DКод:.BYTE NOP/IOT+SWAB,EMT/BR ;АНАЛОГ МАКРОКОМАНДЫ .EXIT В RT-11
AFZ, я поправлю и на свежую голову (в моём понимании) вечером отпишусь.
Глобальной я называю метки с двойным двоеточием естественно.
Я помню, что все исходники "взрослых программистов" на МАКРО-11 которые
я в детстве разбирал, в шапке всегда содержали .ENABL LC, MCL и .DSABL GBL )
В общем обсуждение интересное получается, по исходнику текущему продолжим позже.
Лады? )
- - - Добавлено - - -
Насчёт 2-ух буквенности в имени драйвера я конечно знал, но видимо основательно забыл ))) Или увлёкся просто )))
Держи на закуску слегка дополненный драйвер (там же). Добавлен грязный хак, запрещающий обрыв по CTRL/C (и вообще клавиатуру). При этом в стартовом файле обязательно должна быть загрузка драйвера - иначе клавиатура просто будет эффективно отключена :)
Не будет работать в многотерминальном RT-11.
Вообще-то в KMON два .PRINT-а после которых стоит команда MOV R5,R5. Второй .PRINT обслуживает подсказки дополнительных вопросов, когда вводится команда без параметров, например ввели COPY и задаётся сначала вопрос "From?". Получается, что драйвер и на этот .PRINT будет реагировать.
В своём драйвере AC я ограничивал диапазон, чтобы реагировало только на запрос командной строки.
Да, но в силу специфики задачи, до другого дело никогда не дойдет :)
Да, если бы удалось заставить KMON спросить скажем "Device?" была бы точно такая же реакция. Но в сущности именно это и требовалось - всегда попадать в определенную программу.
- - - Добавлено - - -
Там специфика другая - нужно было насколько я помню менять именно подсказку команды :)
Интересно, а почему hobot-а не удовлетворил JS.SYS? Так же мой AC.SYS мог запускать SY:ACM.SAV вместо вывода приглашения.
Есть и еще один нюанс который в другом драйвере мог бы резать глаза - это работа с адресами программы. Драйвер проверяет при сборке MMG$T (от этого зависит смещение до сохраненного PC перед EMT), но дальше никаких усилий по преобразованию адреса не выполняет ибо в данном конкретном случае мы имеем дело с KMON который всегда в нижней памяти :)
- - - Добавлено - - -
Наверное когда есть исходники - всегда интересно. Опять же, я вон предложил простой способ заблокировать CTRL/C в момент загрузки :)
Исходники AC.SYS тоже есть в образе sysimage.dsk. Там тоже можно в инсталляционную процедуру вставить блокировку клавиатуры, а по SET AC ON восстанавливать разрешение прерываний. Мой во всяком случае работает и в версии 5.00.
А по поводу исходников JS.SYS - его размер всего 2 блока, вручную дизассемблировать особого труда нет, если уж очень хочется.
А смысл? Я показал направления куда можно копать. Это все совместимо и с 5.0 (при желании можно и для 4.0 сделать, но там придется методику менять - там нет SL magic), только вместо точки входа LOAD нужно сделать подключение вручную через запуск из SET - это несложно. Пусть развлекается :)