Поднимем немного тему... Уже наверное все знают что за сообщение такое - то, что вынесено в заголовок. Суть его состоит в том, что младшие 4 бита слова параметров генерации системы не совпадают с соответствующими битами параметров с которыми был собран драйвер. В некоторых случаях драйвер можно перенастроить без пересборки на новую систему - просто заменить байтик по смещению 60 драйвера, в некоторых нельзя. Попробую вкратце разобрать как сделать драйвер который можно перенастроить таким способом.
Прежде всего драйвер должен содержать полный вектор для вызова системных подпрограмм. Причем никакие(как например написано в HX драйвере) тут не помогут. Точнее помогут частично - предотвратят затирание кода драйвера при загрузке в системе которая поддерживает больше опций чем было указано драйверу при сборке. Но это все - вектор не будет совпадать с реальностью, и попытка перенастроить тот же HX под другие опции обречена на провал в системе с поддержкой расширенной памяти. Поэтому для генерации полного вектора нужно или использовать параметр FORCE=7 в макровызовах .DREND/.DRBOT, или в явном виде определить эти опции:Код:.IIF EQ ERL$G .BlkW 1 .IIF EQ TIM$IT .BlkW 1Но и этого мало. Так будет сформирован полный вектор, но вот беда: с точки зрения системы он меняется в зависимости от параметров генерации:Код:ERL$G = 1 ;FORCE ERROR LOGGING MMG$T = 1 ;FORCE MEMORY MANAGEMENT TIM$IT = 1 ;FORCE DEVICE TIMEOUTОтсюда видно, что .DRAST и .FORK будут нормально работать в любой системе (вектор зполняется системой с конца и вниз), вызовы .TIMIO/.CTIMIO будут нормально работать в системе с поддержкой device timeout, а вот вызов сервиса регистрации ошибок @$ELPTR будет работать только в системе с поддержкой device timeout. Если такой поддержки в системе нет, то значение которое должно оказаться в $ELPTR будет записано в $TIMIT. Аналогично с вызовами для XM/ZM мониторов - в зависимости от поддержки device timeout и error logging вектор будет заполнен либо правильно либо со смещением на 1 или 2 слова для данных подпрограмм. Это нужно учитывать и патчить драйвер в момент загрузки или в момент подстройки под систему.Код:.IF NE MMG$T!<FORCE&2.> $RLPTR::.WORD 0 $MPPTR::.WORD 0 $GTBYT::.WORD 0 $PTBYT::.WORD 0 $PTWRD::.WORD 0 .ENDC .IF NE ERL$G!<FORCE&1> $ELPTR::.WORD 0 .ENDC .IF NE TIM$IT!<FORCE&4.> $TIMIT::.WORD 0 .ENDC $INPTR::.WORD 0 $FKPTR::.WORD 0
В аттаче (упрощенный) пример работающего драйвера терминального порта (собран для 176500/300) на который можно выводить что-то. На ввод не работает, но реагирует на нажатие клавиш (на этом терминале) и приостанавливает/возобновляет вывод. Драйвер работает во всех мониторах RT-11. Для XM/ZM/XB/ZB драйвер должен называться UHX.SYS, для остальных UH.SYS (или UHs.SYS если в системе установлен суффикс s для драйвера). Подстраивается командой SET UH SYSGEN.