Все модели с номерами от 11/45 и выше имеют двойной набор регистров.
Вид для печати
Есть тема по особенностям процессоров.
Изменения BSCLI.MAC для добавления вызова GTIM в BASIC-11/MU BASIC-11. Вызов из BASIC:Где H% и L% - целые переменные для получения старшей и младшей части тиков соответственно.Код:CALL GTIM(H%,L%)
CALL "GTIM"(H%,L%)
GTIM(H%,L%)
Код:FTBL: .WORD GTIMNM
...
AREA: .BLKW 2
TIME: .BLKW 2
GTIMNM: .ASCII <4>/GTIM/
.EVEN
.WORD GTIM
.MCALL .GTIM
GTIM: MOV -2(R5),R4 ;УКАЗАТЕЛЬ НА ДЕСКРИПТОРЫ АРГУМЕНТОВ
CMP #101002,(R5)+ ;ПРОВЕРЯЕМ ЧТО АРГУМЕНТОВ 2
BNE ARGERR ;ОШИБКА АРГУМЕНТОВ
CALL CHECK ;ПРОВЕРЯЕМ ТИПЫ АРГУМЕНТОВ
.GTIM #AREA,#TIME ;ПОЛУЧАЕМ СИСТЕМНОЕ ВРЕМЯ
MOV TIME,@(R5)+ ;ВОЗВРАЩАЕМ СТАРШУЮ ЧАСТЬ
MOV TIME+2,@(R5)+ ;ВОЗВРАЩАЕМ МЛАДШУЮ ЧАСТЬ
RETURN ;ВОЗВРАТ В BASIC
CHECK: CALL @PC ;ДВАЖДЫ ВЫПОЛНЯЕМ КОД НИЖЕ
MOV (R4)+,R0 ;ПОЛУЧАЕМ ТИП АРГУМЕНТА
TSTB R0 ;ЭТО ПЕРЕМЕННАЯ?
BMI ARGERR ;НЕТ
CMPB #23,R0 ;ТИП INTEGER?
BNE ARGERR ;НЕТ
RETURN ;
ARGERR: JMP $ARGER ;ВЫЗОВ ОШИБКИ ARGUMENT ERROR
Я просто скопировал текст этого сообщения в описание к дистрибутиву MUBASIC'a
http://archive.pdp-11.org.ru/ukdwk_a...MU_BASIC11_V2/
надо только прокрутить его и данная шпаргалка ниже добавлена. Как-то так.
---------- Post added at 22:14 ---------- Previous post was at 22:04 ----------
Ну и к обычному BAS11 так добавлено в описание
http://archive.pdp-11.org.ru/ukdwk_a...omplekt/bas11/
form, всё забываю спросить,
можно вот в этом примере
http://pdp-11.org.ru/~form/files/uknc/prun/readme.txt
Надпись разместить с самого начала строки, а не по центру?
За верхнюю строку другой EMT отвечает?
Смотрится конечно симпатично, но мой текст не умещается красиво,
поскольку я ещё и CL.SYS запуская на старте системы, а он так-же
в нижней строке. Сдвинуть бы надпись, я только не понимаю как
она вообще позиционируется?
Да! Работает, я совсем другую функцию для <14.>придумалнадумал ) Тогда кац хере ! )
Цитата:
EMT 52 - вывод строки символов в верхнюю информационную строку.
---------- Post added at 17:29 ---------- Previous post was at 17:26 ----------
Ха! Сейчас побалуюсь )
---------- Post added at 17:37 ---------- Previous post was at 17:29 ----------
Как то так
http://storage4.static.itmages.ru/i/...7c77646aac.png
---------- Post added at 17:38 ---------- Previous post was at 17:37 ----------
prun - вещь! )
Поднимем немного тему... Уже наверное все знают что за сообщение такое - то, что вынесено в заголовок. Суть его состоит в том, что младшие 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.
Ни разу не видел систему, сгенерённую с ERRLOG'ом. В смысле, в работе не видел. Опять же, XM-ные дела - совершенно отдельный вопрос. Вот таймаут - это да, важно. Произвольно взятая система с вероятностью 0.5 может оказаться как с поддержкой таймаута, так и без нее. И именно на ней, чаще всего и возникает конфликт, вынесенный в заголовок.
Я генерил только для интереса посмотреть как работает. И даже драйвер MY с поддержкой логгинга делал. А так - тоже ни разу не видел.
Обычно не делают универсальный XM/не-XM драйвер - зачем держать кучу мусора в памяти. Я лишь для примера показал как можно сделать чтобы и там и там работал.
Фактически 100% именно этот параметр. А попытка подправить драйвер по смещению 60 приводит к затиранию кода программы в не-XM системе с поддержкой (XM всегда с поддержкой). Если же драйвер реально использует поддержку возможно падение также из-за вызова неизвестно чего в системе без поддержки.
Удаление в знак протеста против действий MM
MacBuster, есть загрузчик из Сети в ПЗУ, находится по адресу 164160 -- см. листинги ПЗУ.
http://www.emuverse.ru/wiki/%D0%A3%D...6_ROM_disasm_6
Описание сети Micronet -- но не берусь судить насколько оно адекватно реальности:
http://www.emuverse.ru/wiki/%D0%A3%D...D0%A6_Micronet
Когда-то этот вопрос задавался. Ответ - http://zx-pk.ru/showthread.php?t=159...l=1#post393141.
Удаление в знак протеста против действий MM
Ну прикрутить прямо в корпусе HLK-RM04 модуль можно теоретически. https://www.youtube.com/watch?v=3aMpe5LZCbo
Удаление в знак протеста против действий MM
Если через разъем СА подцепить к УКНЦ какой-нибудь DEQNA/DELQA, то можно использовать простенький TCP/IP (FTP, TELNET клиенты), и мой ETHTIM для синхронизации времени :)
Ну и на остальных также - только переходник нужен будет, для УКНЦ - отдельное питание также, ну и обдув - DELQA по крайней мере греется серьезно.
Удаление в знак протеста против действий MM
Удаление в знак протеста против действий MM
Господа, не будет ли кто-нибудь столь любезен запустить GBENCH.SAV из прилагаемого архива (там же есть исходники) на реальной УКНЦ и запостить сюда результаты?
Там несколько тестов быстродействия, каждый выполняется от 10 до 30 секунд на эмуляторе и выводит попугаи (количество тиков сетевого таймера).
Вложение 57650
А покажите, пожалуйста, пример как писать оверлейные программы с помощью macro/link?
Это довольно подробно описано в руководстве по вышеуказанным программам. Если нет возможности достать родные книги от ДВК - можно воспользоваться их "Достаточно Точными" копиями из комплекта БК0011/М.
Если речь идет о написании софта, заведомо не помещающегося в отведенные RT-11 ~40 кбайт пространства пользователя, тогда этот вопрос должен решаться силами пользователя - т.е. "ручками" подгружаются участки кода, что, соответственно, не прибавляет быстродействия софту, если, конечно, не используется ЭД.
Если речь идет о использовании чрезмерно длинной программы, странслированной с языка высокого уровня - к сожалению, придется так же "ручками" всё подгружать, или даже разбивать прогу на фрагменты - что, соответственно, не фонтан. Это фундаментальные ограничения 16-бит машинок, даже с ДП.
Да, в мануалах описаны ключи ассемблера (параметры секций) и линкера (указываются какие секции оверлейные). Но живого примера я не нашёл. Ткните пожалуйста прям в ссылку и номер страницы. Или прямо вот скажем экзампл с одним main.mac, двумя ovl1.mac, ovl2.mac и скрипт для сборки мне бы очень помог.
Поскольку я не копенгаген в RT-11 и macro-11, вопросы:
1. Хэндлер оверлеев (то есть подгрузка нужных данных с диска в ОЗУ) пишется ручками? Тогда ключи компилятора и всякие поля "оверлейности" в заголовке файла -- чтобы я руками их парсил? Печаль. Мне мечталось, что этим занимается ОС. То есть я её, максимум, вежливо прошу вытеснить один оверлей другим и это всё, что я делаю руками. А скорее, создаётся некая таблица thunk'ов, где чекается в какой оверлей идёт вызов и он подгружается автоматом. И руками вообще ничего делать не надо.
2. Можно ли сделать в macro-11 такой финт, который в других ассемблерах делается директивой .org. Т.е. бинарные данные размещаются последовательно по месту (скажем по адресу "."), а всякие смещения считаются с .org addr.
то есть, например:
Должен сгенерировать объектник, который при линковке будет расположен с абсолютного адреса 1000 (или там, куда попадёт, если не было ". = nnnn"), но содержать инструкцию mov #2000, r0 (ассемблер должен думать, что он генерировал код для адреса 2000).Код:.psect .code, abs
. = 1000 ; это для линкера
.org 2000 ; это для ассемблера
label: mov #label, r0
Как такое делается в macro-11?
3. Почему некоторые LINK.SAV для RT-11 поддерживают опцию /REL, а некоторые нет? Это задаётся на этапе генерации системы? Очень удобная штука для генерации программ для периферийного процессора УКНЦ, поскольку таблица reloc'ов пристёгивается автоматически к выходному файлу. Нет, есть, конечно, способы писать position independent code руками или, там, макросы нагородить для генерации reloc секции. Но зачем, если есть готовый инструмент.
Если что-то не описано в инструктаже - значит, это делается ручками и не поддерживается трансляторами автоматически.
Более подробно может подсказать господин Patron, он практически единственный тут постоянно и в совершенстве владеющий Макро-11.
*
Возможности привести ссылки на инструктаж не имею. Даже экз. инструкций сейчас не в наличии - продал господину SKcorp не так давно.
*
К сожалению, все опытные господа, работавшие годами на Макро под RT-11, не желают светиться в интернете - по крайней мере явным образом.
Я уж массу своих бывших коллег приглашал-приглашал на форумы БК и Z80 - даже отвечать не желают...
Да и что взять с ветеранов - например, автор софта стендов ДВК сейчас в возрасте 76 лет, еле ходит, на вопросы о софте отвечает - "ничего не помню...".
Что первым приходит в голову - сама RT-11, виднее всего это на примере KMON'а. А так - ничего не помню. Когда-то, когда я только изучал RT-11, я на пробу написал оверлейную программку, но увы, ничего не помню, кроме того, что особо сложного ничего не было.
Помню только, что пользовался "зеленой" книжкой (РАФОС).
В RT-11 все довольно примитивно. В линкере перечисляются модули с ключом /O:n (/V:n для XM оверлеев), где n указывает номер сегмента в который отображается код (номера писать в порядке возрастания). Вот вобщем-то и все.
Для примера есть R.MAC - вызывает подпрограммы из оверлеев и печатает данные, переданные ими; и S(1,2,3,4).MAC которые эти данные передают...
R:S1-S4 (содержимое одинаковое, меняем только циферки):Код:.TITLE ROOT - ROOT SEGMENT
.MCALL .EXIT,.PRINT ;СИСТЕМНЫЕ ВЫЗОВЫ
START:: CALL SEG1 ;ВЫЗОВ СЕГМЕНТА 1
CALL SEG2 ;ВЫЗОВ СЕГМЕНТА 2
CALL SEG3 ;ВЫЗОВ СЕГМЕНТА 3
CALL SEG4 ;ВЫЗОВ СЕГМЕНТА 4
.EXIT ;ВЫХОД
PSTAT:: MOV #BUFF,R0 ;АДРЕС БУФЕРА
MOV #FMTS,R1 ;СТРОКА ФОРМАТА
MOV #ARGS,R2 ;БЛОК АРГУМЕНТОВ
MOV (R5)+,@R2 ;СОХРАНЯЕМ НОМЕР СЕГМЕНТА
MOV (R5)+,2(R2) ;СОХРАНЯЕМ СТАРТОВЫЙ АДРЕС СЕГМЕНТА
CALL $EDMSG ;ФОРМАТИРУЕМ
CLRB @R0 ;ПРЕВРАЩАЕМ В ASCIZ
.PRINT #BUFF ;ПЕЧАТАЕМ
RTS R5 ;ВОЗВРАЩАЕМСЯ
BUFF: .BLKB 80. ;БУФЕР
ARGS: .BLKW 2 ;БЛОК АРГУМЕНТОВ
FMTS: .ASCIZ /SEG %D, PC %P/
.END START
Компиляция:Код:.TITLE SEG1
SEG1:: JSR R5,PSTAT ;ПОДПРОГРАММА ПЕЧАТИ
.WORD 1,SEG1 ;НОМЕР СЕГМЕНТА, СТАРТОВЫЙ АДРЕС
RETURN ;ВОЗВРАТ
.END
Простая сборка:Код:.MAC R
.MAC S1
.MAC S2
.MAC S3
.MAC S4
.
Оверлейная сборка (делаем два сегмента [кроме корневого]):Код:.LIN/LINK:RSXLIB R,S1,S2,S3,S4
.RU R
SEG 1, PC 001224
SEG 2, PC 001236
SEG 3, PC 001250
SEG 4, PC 001262
.
Как-то так. Остальное легко понимается :)Код:.LIN/LINK:RSXLIB R/PRO
*S1/O:1
*S2/O:1
*S3/O:2
*S4/O:2
*//
.RU R
SEG 1, PC 003774
SEG 2, PC 003774
SEG 3, PC 004010
SEG 4, PC 004010
.
В первом случае в памяти будет примерно такая картина:Во втором - такая:Код:+--------+
| R |
+--------+
| S1 |
+--------+
| S2 |
+--------+
| S3 |
+--------+
| S4 |
+--------+
| RSXLIB |
+--------+
Код:+--------+
| R |
+--------+
| RSXLIB |
+--------+
| S1/S2 |
+--------+
| S3/S4 |
+--------+
Моя принципиальная ошибка в том, что я считал, что оверлей распространяется на именованную секцию. А это оказывается модуль. То есть, если я правильно понимаю, один оверлейный сегмент не может быть разбит на несколько объектных модулей? Или может? Это, конечно, не принципиально, просто интересно.
В других системах так и есть. В RSX-11 к примеру у сборщика задач целый язык описания оверлеев есть и оперирует он секциями в том числе.
- - - Добавлено - - -
Может. Для этого нужно /O писать последнему модулю в цепочке.
На примере выше:Получили два сегмента, каждый из двух модулей. В данном случае правда смысл потерялся в виду того, что ничего не перекрывается, но как пример сойдет :)Код:.LIN/LINK:RSXLIB R/PRO
*S1,S2/O:1
*S3,S4/O:2
*//
.RU R
SEG 1, PC 003760
SEG 2, PC 003772
SEG 3, PC 004006
SEG 4, PC 004020
.
Вот более интересный пример - в один сегмент два оверлея по два модуля:Код:.LIN/LINK:RSXLIB R/PRO
*S1,S2/O:1
*S3,S4/O:1
*//
.RU R
SEG 1, PC 003760
SEG 2, PC 003772
SEG 3, PC 003760
SEG 4, PC 003772
.
Чем дальше в лес, тем толщепартизаныдокументация :) По соседним темам (и интернету) наскреб подробности про регистр 177704, назначение выводов разъемов XS1/XS2 (ВУ1/ВУ2), сигнал "РЕЖ2" (статья в «Персональный компьютер УКНЦ» №1 1995 год)...
Вопрос про бит 0 регистра 177054 -- он таки сбрасывается или устанавливается по включению питания и RESET?
При включении питания он установлен, в системном ПЗУ нет никаких команд работы с этим битом при инициализации после запуска. Весьма вероятно что он устанавливается по RESET, т.к БМК, где расположен регистр, не обрабатывает сигнал DCLO.
Удаление в знак протеста против действий MM