Просмотр полной версии : Программирование на УКНЦ как?
Страницы :
1
2
3
[
4]
5
6
7
Это же песочница ! ))) Регистровая ))
Вот я и говорю )))
---------- Post added at 06:26 ---------- Previous post was at 06:25 ----------
Пользовательская программа не мешает системе, система знает что там кто то работает - ну может и не знает к примеру ) Это не слишком важно. Сбоя нет. Основные регистры (штатные) никто не портит !!!
К примеру МНОГОТЕРМИНАЛЬНЫЙ ПАСКАЛЬ или какая-то обучающая система для класса терминалов )))
Пользовательская программа не мешает системе, система знает что там кто то работает - ну может и не знает к примеру ) Это не слишком важно. Сбоя нет. Основные регистры (штатные) никто не портит !!!
К примеру МНОГОТЕРМИНАЛЬНЫЙ ПАСКАЛЬ или какая-то обучающая система для класса терминалов )))
Система просто не знает ничего про второй набор регистров и потому никак на них не реагирует. Переключись на второй набор в программе и все системные вызовы в RT-11 будут ограничены последним содержимым R0 которое было установлено до переключения. :)
Далее, хорошо если программа, а если программы? ;) тогда они друг другу просто начнут мешать, используя второй набор регистров (система-то их не сохраняет при переключении контекста).
---------- Post added at 09:36 ---------- Previous post was at 09:33 ----------
МНОГОТЕРМИНАЛЬНЫЙ ПАСКАЛЬ
Есть MU-BASIC для RT-11. По сути это обычный BASIC-11, но одновременно обслуживающий много терминалов. Там еще есть всякие фичи на тему защиты и то чего так не хватает Patron'у - возможность управлять режимами терминала и проверять нажатие клавиши независимо от чтения символа с нее :)
Будет время - попробую запустить в RT-11 V5.
Повспоминал трудное детство, деревянные игрушки... Запустил MU/BASIC в RT-11 V5.7... Допинать немного, пропатчить и можно сделать УКНЦ/ДВК вариант с двухтерминальной системой :)
Система просто не знает ничего про второй набор регистров и потому никак на них не реагирует. Понятно, это появилось "на излёте" PDP-11, хотели, как лучше. В юзермоде свой набор регистров, для юзерских программ, у системы - свой, сохранять юзерские надо только когда переключаешься между разными разделами, задачами, или как их назвать, а если задача прервалась, что-то там в системе сделалось, и та же задача запустилась продолжаться, то системе и вспоминать не надо о юзерских регистрах. Но это требовало глубокой переработки всех ОС, которые, к тому же, могли оказаться несовместимыми с предыдущим софтом, в общем, спустили это дело на тормозах... Впрочем, экономия вряд ли получилась бы слишком большой - маловато их, регистров. Вот в ДОСе системы-360, там да, выйти из аппендикса ввода-вывода через EXT01 или EXT03 - две большие разницы, второй, с переключением контекста был чуть ли не втрое-вчетверо длиннее.
Далее, хорошо если программа, а если программы? тогда они друг другу просто начнут мешать, Опять же понятно, если система не навязывает жесткий порядок использования дополнительных регистров, то каждый из юзеров, естественно, все сделает по-своему...
---------- Post added at 13:54 ---------- Previous post was at 13:50 ----------
Это возможность процессора - второй набор регистров R0-R5. Кстати, второй набор регистров R6 (SP) и R7 (PC) есть в любой машинке с ДП.
В юзермоде свой набор регистров, для юзерских программ, у системы - свой
Такого и не планировалось и не делалось :)
Для разных режимов свой SP. Регистры R0-R5 и R0'-R5' они общие для всех режимов. Набор R0'-R5' используется прошивками загрузчиков-диагностики на машинах которые поддерживают двойной набор регистров.
Опять же понятно, если система не навязывает жесткий порядок использования дополнительных регистров, то каждый из юзеров, естественно, все сделает по-своему...
Система просто понятия не имеет что такое вообще возможно - затраты на разборки с типом процессора и выяснением можно ли использовать второй набор регистров себя не оправдают - проще просто считать, что их нет, а если пользователь их всеже использует - это его проблемы, системе он этим не повредит :)
Тем более, что даже если второй набор регистров использовать - его точно также нужно будет сохранять (в довесок к первому набору который уже сохраняется).
---------- Post added at 13:56 ---------- Previous post was at 13:56 ----------
Кстати, второй набор регистров R6 (SP) и R7 (PC) есть в любой машинке с ДП.
R7 (PC) нету. В том числе на машинках с двойным набором регистров :)
К слову, на машинках с двойным набором регистров на всех режима вообще три, а не два, и SP'а там тоже три :)
К слову, на машинках с двойным набором регистров на всех режима вообще три, а не два, и SP'а там тоже три Угу, вспомнил. Kernelmode, supervisor и usermode. Просто ни разу не имел дела с подобными машинками, вот и не сразу вспомнил.
Такого и не планировалось и не делалось Что планировалось - мы знать не можем, но общетеоретические соображения предполагают именно такое использование раздельных наборов регистров. А что получилось, мы видим... Повторюсь, это всё пошло на излёте. В 80-е. Уже вовсю производились мотороллеры 68000, которые при внешней 16-разрядной шине данных и 24-разрядной алресной внутри были 32-разрядными, да и сама DEC массово клепала VAX-11, не говоря о Intel 80x86 и нашествии писюков.
Если бы второй набор регистров был предложен вместе с ДП, вот тогда бы все это реализовали в полном объеме, а так, этот второй набор регистров - не более, чем попытка догнать уже ушедший поезд...
Угу, вспомнил. Kernelmode, supervisor и usermode. Просто ни разу не имел дела с подобными машинками, вот и не сразу вспомнил.
Могу запустить на консоль по телнету :)
Что планировалось - мы знать не можем
Очень многое можем и знаем, но это другая история, не относящаяся к теме :)
а так, этот второй набор регистров - не более, чем попытка догнать уже ушедший поезд...
а так это полезная фича, использующаяся там где это нужно и ничем не отстающая в этом плане от возможностей других (включая вышеперечисленное) процов ;)
---------- Post added at 14:39 ---------- Previous post was at 14:35 ----------
В 80-е
В 70е если на то пошло - возможности очень старые.
К слову, напомню весьма интересный фавкт: официальный PDP-11 выпускался (вместе с системами) аж до 2003 года. VAXы давно померли к тому времени :)
Тем более, что даже если второй набор регистров использовать - его точно также нужно будет сохранять (в довесок к первому набору который уже сохраняется) Только при смене задачи - если будет продолжаться только что прерванная - не надо
Только при смене задачи - если будет продолжаться только что прерванная - не надо
Ну разумеется при смене задачи. А это значит, что надо предусмотреть и область сохранения для каждой задачи - уже достаточные накладные расходы особенно в рамках RT-11...
Но... Однако мы что-то далеко вышли за пределы темы :)
В 70е если на то пошло - возможности очень старые. Где? В какой модели?
Где? В какой модели?
Все модели с номерами от 11/45 и выше имеют двойной набор регистров.
А это значит, что надо предусмотреть и область сохранения для каждой задачи - уже достаточные накладные расходы особенно в рамках RT-11... А это, в общем-то, аксиома для любой многозадачки.
Однако мы что-то далеко вышли за пределы темы Угу. Куда бы с этим податься?..
Угу. Куда бы с этим податься?..
Есть тема (http://zx-pk.ru/showthread.php?t=18184) по особенностям процессоров.
Есть тема по особенностям процессоров. Там и ответил
тогда они друг другу просто начнут мешать
а как же очередь задач, неужели не успеют строку из R0' вывести пака сосед туда
таблицу рекордов скидывать пытается ))) В общем я наверное просто неправильно
себе общую схему работы представил...
Изменения BSCLI.MAC для добавления вызова GTIM в BASIC-11/MU BASIC-11. Вызов из BASIC:
CALL GTIM(H%,L%)
CALL "GTIM"(H%,L%)
GTIM(H%,L%)Где 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
Изменения BSCLI.MAC для добавления вызова GTIM в BASIC-11/MU BASIC-11
Я просто скопировал текст этого сообщения в описание к дистрибутиву MUBASIC'a
http://archive.pdp-11.org.ru/ukdwk_archive/dwkwebcomplekt/MU_BASIC11_V2/
надо только прокрутить его и данная шпаргалка (http://zx-pk.ru/showpost.php?p=834042&postcount=766) ниже добавлена. Как-то так.
---------- Post added at 22:14 ---------- Previous post was at 22:04 ----------
Ну и к обычному BAS11 так добавлено в описание
http://archive.pdp-11.org.ru/ukdwk_archive/dwkwebcomplekt/bas11/
form, всё забываю спросить,
можно вот в этом примере
http://pdp-11.org.ru/~form/files/uknc/prun/readme.txt
Надпись разместить с самого начала строки, а не по центру?
За верхнюю строку другой EMT отвечает?
Смотрится конечно симпатично, но мой текст не умещается красиво,
поскольку я ещё и CL.SYS запуская на старте системы, а он так-же
в нижней строке. Сдвинуть бы надпись, я только не понимаю как
она вообще позиционируется?
Надпись разместить с самого начала строки, а не по центру?
Первый байт в строке - номер позиции.
За верхнюю строку другой EMT отвечает?
Наверное. Я не искал :)
Первый байт в строке - номер позиции.
Да! Работает, я совсем другую функцию для <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/15/1028/s_1446043004_2334035_7c77646aac.png (http://itmages.ru/image/view/3143997/7c77646a)
---------- Post added at 17:38 ---------- Previous post was at 17:37 ----------
prun - вещь! )
Поднимем немного тему... Уже наверное все знают что за сообщение такое - то, что вынесено в заголовок. Суть его состоит в том, что младшие 4 бита слова параметров генерации системы не совпадают с соответствующими битами параметров с которыми был собран драйвер. В некоторых случаях драйвер можно перенастроить без пересборки на новую систему - просто заменить байтик по смещению 60 драйвера, в некоторых нельзя. Попробую вкратце разобрать как сделать драйвер который можно перенастроить таким способом.
Прежде всего драйвер должен содержать полный вектор для вызова системных подпрограмм. Причем никакие
.IIF EQ ERL$G .BlkW 1
.IIF EQ TIM$IT .BlkW 1 (как например написано в HX драйвере) тут не помогут. Точнее помогут частично - предотвратят затирание кода драйвера при загрузке в системе которая поддерживает больше опций чем было указано драйверу при сборке. Но это все - вектор не будет совпадать с реальностью, и попытка перенастроить тот же HX под другие опции обречена на провал в системе с поддержкой расширенной памяти. Поэтому для генерации полного вектора нужно или использовать параметр FORCE=7 в макровызовах .DREND/.DRBOT, или в явном виде определить эти опции:
ERL$G = 1 ;FORCE ERROR LOGGING
MMG$T = 1 ;FORCE MEMORY MANAGEMENT
TIM$IT = 1 ;FORCE DEVICE TIMEOUT
Но и этого мало. Так будет сформирован полный вектор, но вот беда: с точки зрения системы он меняется в зависимости от параметров генерации:
.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
Отсюда видно, что .DRAST и .FORK будут нормально работать в любой системе (вектор зполняется системой с конца и вниз), вызовы .TIMIO/.CTIMIO будут нормально работать в системе с поддержкой device timeout, а вот вызов сервиса регистрации ошибок @$ELPTR будет работать только в системе с поддержкой device timeout. Если такой поддержки в системе нет, то значение которое должно оказаться в $ELPTR будет записано в $TIMIT. Аналогично с вызовами для XM/ZM мониторов - в зависимости от поддержки device timeout и error logging вектор будет заполнен либо правильно либо со смещением на 1 или 2 слова для данных подпрограмм. Это нужно учитывать и патчить драйвер в момент загрузки или в момент подстройки под систему.
В аттаче (упрощенный) пример работающего драйвера терминального порта (собран для 176500/300) на который можно выводить что-то. На ввод не работает, но реагирует на нажатие клавиш (на этом терминале) и приостанавливает/возобновляет вывод. Драйвер работает во всех мониторах RT-11. Для XM/ZM/XB/ZB драйвер должен называться UHX.SYS, для остальных UH.SYS (или UHs.SYS если в системе установлен суффикс s для драйвера). Подстраивается командой SET UH SYSGEN.
Ни разу не видел систему, сгенерённую с ERRLOG'ом. В смысле, в работе не видел. Опять же, XM-ные дела - совершенно отдельный вопрос. Вот таймаут - это да, важно. Произвольно взятая система с вероятностью 0.5 может оказаться как с поддержкой таймаута, так и без нее. И именно на ней, чаще всего и возникает конфликт, вынесенный в заголовок.
Ни разу не видел систему, сгенерённую с ERRLOG'ом.
Я генерил только для интереса посмотреть как работает. И даже драйвер MY с поддержкой логгинга делал. А так - тоже ни разу не видел.
Опять же, XM-ные дела - совершенно отдельный вопрос.
Обычно не делают универсальный XM/не-XM драйвер - зачем держать кучу мусора в памяти. Я лишь для примера показал как можно сделать чтобы и там и там работал.
И именно на ней, чаще всего и возникает конфликт, вынесенный в заголовок.
Фактически 100% именно этот параметр. А попытка подправить драйвер по смещению 60 приводит к затиранию кода программы в не-XM системе с поддержкой (XM всегда с поддержкой). Если же драйвер реально использует поддержку возможно падение также из-за вызова неизвестно чего в системе без поддержки.
MacBuster
27.02.2016, 13:22
Удаление в знак протеста против действий MM
MacBuster, есть загрузчик из Сети в ПЗУ, находится по адресу 164160 -- см. листинги ПЗУ.
http://www.emuverse.ru/wiki/%D0%A3%D0%9A%D0%9D%D0%A6_ROM_disasm_6
Описание сети Micronet -- но не берусь судить насколько оно адекватно реальности:
http://www.emuverse.ru/wiki/%D0%A3%D0%9A%D0%9D%D0%A6_Micronet
Когда-то этот вопрос задавался. Ответ - http://zx-pk.ru/showthread.php?t=15947&p=393141&viewfull=1#post393141.
MacBuster
28.02.2016, 10:51
Удаление в знак протеста против действий MM
Мысль следующая: попробовать попасть в современную локальную сеть с УК-НЦ прямо через СА с каким-нибудь переходником, типа RS232-USB или RS232-Ethernet.
http://zx-pk.ru/showthread.php?t=15947&page=14
http://zx-pk.ru/showthread.php?t=20753&page=8
Мысль следующая: попробовать попасть в современную локальную сеть с УК-НЦ прямо через СА с каким-нибудь переходником, типа RS232-USB или RS232-Ethernet..
Ну прикрутить прямо в корпусе HLK-RM04 модуль можно теоретически. https://www.youtube.com/watch?v=3aMpe5LZCbo
MacBuster
29.02.2016, 09:58
Удаление в знак протеста против действий MM
Мысль следующая: попробовать попасть в современную локальную сеть с УК-НЦ А какой вообще сетевой функционал доступен для машинок без ДП, где единственная нормально работающая ОС - RT-11SJ/FB и, в частности, для УКНЦ?
А какой вообще сетевой функционал доступен для машинок без ДП, где единственная нормально работающая ОС - RT-11SJ/FB и, в частности, для УКНЦ?
Если через разъем СА подцепить к УКНЦ какой-нибудь DEQNA/DELQA, то можно использовать простенький TCP/IP (FTP, TELNET клиенты), и мой ETHTIM для синхронизации времени :)
Ну и на остальных также - только переходник нужен будет, для УКНЦ - отдельное питание также, ну и обдув - DELQA по крайней мере греется серьезно.
MacBuster
08.05.2016, 13:51
Удаление в знак протеста против действий MM
Я знаю о разных схемах вроде бы одной модели машины и даже видел платы УКНЦ с панельками под мс ПЗУ. Вопрос такой - менялась ли версия прошивки ПЗУ УКНЦ в зависимости от года выпуска и завода, где плата собиралась? К чему может привести изменение ПЗУ, будет ли все работать или как в спектрумах появится несовместимость из-за того, что там были вполне конкретные адреса подпрограмм и если что-то смещалось, то часть программ работать уже не желала. Я бы с большим удовольствием избавился от стартового меню и заменил бы на что-то другое, скажем, процедуру печати твердой копии экрана.
Менялась.
Смотря как поменяешь. Если оставить точки входа подпрограмм и EMT, то работать будет.
MacBuster
09.05.2016, 09:59
Удаление в знак протеста против действий MM
Господа, не будет ли кто-нибудь столь любезен запустить GBENCH.SAV из прилагаемого архива (там же есть исходники) на реальной УКНЦ и запостить сюда результаты?
Там несколько тестов быстродействия, каждый выполняется от 10 до 30 секунд на эмуляторе и выводит попугаи (количество тиков сетевого таймера).
57650
А покажите, пожалуйста, пример как писать оверлейные программы с помощью macro/link?
А покажите, пожалуйста, пример как писать оверлейные программы с помощью macro/link?
Это довольно подробно описано в руководстве по вышеуказанным программам. Если нет возможности достать родные книги от ДВК - можно воспользоваться их "Достаточно Точными" копиями из комплекта БК0011/М.
Если речь идет о написании софта, заведомо не помещающегося в отведенные RT-11 ~40 кбайт пространства пользователя, тогда этот вопрос должен решаться силами пользователя - т.е. "ручками" подгружаются участки кода, что, соответственно, не прибавляет быстродействия софту, если, конечно, не используется ЭД.
Если речь идет о использовании чрезмерно длинной программы, странслированной с языка высокого уровня - к сожалению, придется так же "ручками" всё подгружать, или даже разбивать прогу на фрагменты - что, соответственно, не фонтан. Это фундаментальные ограничения 16-бит машинок, даже с ДП.
Это довольно подробно описано в руководстве по вышеуказанным программам. Если нет возможности достать родные книги от ДВК - можно воспользоваться их "Достаточно Точными" копиями из комплекта БК0011/М.
Если речь идет о написании софта, заведомо не помещающегося в отведенные RT-11 ~40 кбайт пространства пользователя, тогда этот вопрос должен решаться силами пользователя - т.е. "ручками" подгружаются участки кода, что, соответственно, не прибавляет быстродействия софту, если, конечно, не используется ЭД.
Если речь идет о использовании чрезмерно длинной программы, странслированной с языка высокого уровня - к сожалению, придется так же "ручками" всё подгружать, или даже разбивать прогу на фрагменты - что, соответственно, не фонтан. Это фундаментальные ограничения 16-бит машинок, даже с ДП.
Да, в мануалах описаны ключи ассемблера (параметры секций) и линкера (указываются какие секции оверлейные). Но живого примера я не нашёл. Ткните пожалуйста прям в ссылку и номер страницы. Или прямо вот скажем экзампл с одним main.mac, двумя ovl1.mac, ovl2.mac и скрипт для сборки мне бы очень помог.
Поскольку я не копенгаген в RT-11 и macro-11, вопросы:
1. Хэндлер оверлеев (то есть подгрузка нужных данных с диска в ОЗУ) пишется ручками? Тогда ключи компилятора и всякие поля "оверлейности" в заголовке файла -- чтобы я руками их парсил? Печаль. Мне мечталось, что этим занимается ОС. То есть я её, максимум, вежливо прошу вытеснить один оверлей другим и это всё, что я делаю руками. А скорее, создаётся некая таблица thunk'ов, где чекается в какой оверлей идёт вызов и он подгружается автоматом. И руками вообще ничего делать не надо.
2. Можно ли сделать в macro-11 такой финт, который в других ассемблерах делается директивой .org. Т.е. бинарные данные размещаются последовательно по месту (скажем по адресу "."), а всякие смещения считаются с .org addr.
то есть, например:
.psect .code, abs
. = 1000 ; это для линкера
.org 2000 ; это для ассемблера
label: mov #label, r0
Должен сгенерировать объектник, который при линковке будет расположен с абсолютного адреса 1000 (или там, куда попадёт, если не было ". = nnnn"), но содержать инструкцию mov #2000, r0 (ассемблер должен думать, что он генерировал код для адреса 2000).
Как такое делается в 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, я на пробу написал оверлейную программку, но увы, ничего не помню, кроме того, что особо сложного ничего не было.
Помню только, что пользовался "зеленой" книжкой (РАФОС).
А покажите, пожалуйста, пример как писать оверлейные программы с помощью macro/link?
В RT-11 все довольно примитивно. В линкере перечисляются модули с ключом /O:n (/V:n для XM оверлеев), где n указывает номер сегмента в который отображается код (номера писать в порядке возрастания). Вот вобщем-то и все.
Для примера есть R.MAC - вызывает подпрограммы из оверлеев и печатает данные, переданные ими; и S(1,2,3,4).MAC которые эти данные передают...
R:
.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
S1-S4 (содержимое одинаковое, меняем только циферки):
.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 |
+--------+
В RT-11 все довольно примитивно. В линкере перечисляются модули с ключом /O:n (/V:n для XM оверлеев), где n указывает номер сегмента в который отображается код (номера писать в порядке возрастания). Вот вобщем-то и все.Моя принципиальная ошибка в том, что я считал, что оверлей распространяется на именованную секцию. А это оказывается модуль. То есть, если я правильно понимаю, один оверлейный сегмент не может быть разбит на несколько объектных модулей? Или может? Это, конечно, не принципиально, просто интересно.
оверлей распространяется на именованную секцию
В других системах так и есть. В 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
.
shattered
15.09.2016, 21:51
Определить может только драйвер какого-то устройства. Например теоретически можно определить, что воткнута кассета ПЗУ, контроллер винча или ЭД от ЭР. При этом даже можно определить к каком слоте. А окно подставляет сам драйвер. Система умеет работать только с кассетой ПЗУ (соответственно контроллер винча тоже делает так, чтобы его ПЗУ подставлялась в окно).
Про биты 1-3, а лучше 0-3. Они соответствуют сигналам на шине с CE0 по CE3. А уж аппаратура использует их по своему усмотрению. Единственно в УКНЦ используется сигнал CE0, по нему можно включать и отключать системное ПЗУ в "окне" 100000-117777. Сигнал CE3 поступает на один слот прямо, на другой через инвертор, благодаря этому устройство имеет свой адрес слота, а так бы пришлось вводить джампер на самом устройстве. Обычно CE3 используется для выбора устройства в слоте. А с помощью CE1 и CE2 в кассете ПЗУ (классической) выбирается какой банк подставлять в окно, комбинация 00 запрещает подстановку, а с помощью 01, 10 и 11 можно выбрать нужный банк.
Чем дальше в лес, тем толще партизаны документация :) По соседним темам (и интернету) наскреб подробности про регистр 177704 (http://zx-pk.ru/threads/18027-emulyator-uknts-emustudio/page17.html), назначение выводов разъемов XS1/XS2 (http://y-salnikov.github.io/uknc_sd_fdd/2015/09/!doc_errors) (ВУ1/ВУ2), сигнал "РЕЖ2" (статья в «Персональный компьютер УКНЦ» №1 1995 год (http://uknc.narod.ru/Doc/PK_UKNC_1-95.doc))...
По соседним темам (и интернету) наскреб подробности про регистр 177704
А в СЭМЗ-овской схемотехнике через этот регистр устанавливается скорость последовательного порта.
shattered
17.09.2016, 15:07
Вопрос про бит 0 регистра 177054 -- он таки сбрасывается или устанавливается по включению питания и RESET?
При включении питания он установлен, в системном ПЗУ нет никаких команд работы с этим битом при инициализации после запуска. Весьма вероятно что он устанавливается по RESET, т.к БМК, где расположен регистр, не обрабатывает сигнал DCLO.
MacBuster
01.10.2016, 12:09
Удаление в знак протеста против действий MM
Напомните, пожалуйста, как перехватить обратный ход луча (начало кадра) - есть где-нибудь пример?
Прерывание от таймера 50Гц синхронно с кадровой разверткой.
MacBuster
01.10.2016, 14:44
Удаление в знак протеста против действий MM
Что надо сделать, я помню. Мне надо посмотреть как это сделать.
Как перехватить прерывание таймера 50Гц? Да очень просто, надо в ячейку памяти с адресом 0100 положить адрес своей подпрограммы обработки. Старый адрес надо запомнить, чтобы переходить на него после своей обработки и после его восстановить.
MacBuster
01.10.2016, 20:13
Удаление в знак протеста против действий MM
shattered
01.10.2016, 20:38
У каждого -- свой таймер, так что нет, не все равно :) Источник прерываний у них один, подключается и отключается раздельно через биты 8, 9 регистра 177054 на шине ПП
MacBuster
24.01.2017, 10:06
Удаление в знак протеста против действий MM
вывод звука на какой-нибудь муз сопроцессор
Хрень делается элементарно, вместо СА на шину ЦП. Можно адаптировать софт от БКшки, если повесить музычку на адрес 177714 ( как в БКшке ).
В основном по софту - коррекция по быстродействию, а так же подгонка под требования RT-11 ( т.е. косметика ). Сложнее будет с графикой для музычки от БК - там прямой совместимости не особо.
Базовую Э3 подключения сопра лучше взять от Э3 господина Воланда и его новодела БК0011М.
MacBuster
28.01.2017, 00:45
Удаление в знак протеста против действий MM
«за бесплатно».
Ну если так - тогда есть поле для опытов. Делаем на ВП1-065 частоту 7.5 мгц, скорость выставляем как для 19200, получаем итоговую 31.25 кбод. На выход телеграфа ( RS232 ) прикручиваем первую попавшуюся MIDI-игрушку (или 26-пин модуль для звуковых карт, ему, правда, понадобится плюс и минус 15 вольт ). Это конечно при условии , что софт тоже возникнет сам по себе и бесплатно. Зато "Саунд" будет вполне себе достойный, не мышиные скрипы от ЭВМ 1980-х.
MacBuster
28.01.2017, 09:12
Удаление в знак протеста против действий MM
Исходник и готовый .SAV программы MEMMAP -- сканер портов, подобный IOSCAN (спасибо MiX за наводку):
http://www.classiccmp.org/PDP-11/RT-11/freeware/sigtapes/11s113/schor1/memmap.mac
http://www.classiccmp.org/PDP-11/RT-11/freeware/sigtapes/11s113/schor1/memmap.sav
MacBuster
16.03.2017, 23:27
Удаление в знак протеста против действий MM
shattered
17.03.2017, 01:33
Странное дело, вот эта команда что делает?
8 бит управляет прохождением прерываний от источника к ПП. 9 бит, соответственно, к ЦП. Сигнал active low, так что все верно -- 0 = разрешены.
MacBuster
17.03.2017, 10:18
Удаление в знак протеста против действий MM
MacBuster
18.03.2017, 00:29
Удаление в знак протеста против действий MM
Подскажите, каким образом из ЦП можно напечатать что-нибудь в служебной или информационной строке?
Попробовал через EMT 52, что-то у меня так не получилось.
Подскажите, каким образом из ЦП можно напечатать что-нибудь в служебной или информационной строке?
Только прямой записью в память через устройство доступа, но там есть ограничения. Пример есть в драйвере CL.
ЦП можно напечатать что-нибудь в служебной или информационной строке?
МОЖНО же необходимый высоты-ширины спрайт повесить прямо по адресу экранному?
- - - Добавлено - - -
Пример есть в драйвере CL.
что то он каким-то раритетным получился. исходников нет.
CL.SYS только в составе собранных систем попадается в архиве.
Отдельного реализа "в упор не вижу" (
исходников нет
Если не найдутся, ближе к вечеру доостану из 11/83.
Если не найдутся, ближе к вечеру доостану из 11/83.
у меня нет - пнул все виды поиска ) у меня только собранный .SYS вариант - я помню публикацию и комментарий,
что будет работать только в системе 5.2 и старше (но вот не помню был ли там исходник?)
Уважаемые знатоки!
Имеется вот такой результат компиляции:
RT-11 LINK V05.45 Load Map Saturday 01-Apr-2017 19:38 Page 1
EXPRES.SAV Title: EXPRES Ident:
Section Addr Size Global Value Global Value Global Value
. ABS. 000000 001000 = 256. words (RW,I,GBL,ABS,OVR)
MAIN 001000 026600 = 5824. words (RW,I,GBL,REL,OVR)
START 001000
TILES 027600 022022 = 4617. words (RO,D,LCL,REL,CON)
Z27040 027600 Z27700 030440 Z30300 031040
Z31200 031740 Z31240 032000 Z31264 032024
Z34604 033424 Z37006 037426 Z41210 043430
Z43412 047432 Z44274 051034
DSECT 051622 024720 = 5352. words (RW,D,LCL,REL,CON)
Y00000 051634 Y01106 052742 Y02506 054342
Y04106 055742 Y24000 065742 Y34377 076341
STACK 076342
Transfer address = 000001, High limit = 076540 = 16048. words
Здесь секция MAIN -- это собственно код, TILES -- константные данные.
Секция DSECT -- это переменные и массивы, которые нужны уже только после запуска.
Сейчас вся секция DSECT -- это нули, и она включена в SAV-файл, что собственно только расходует лишние блоки на диске.
Внимание, вопрос:
Как сделать так чтобы секция DSECT могла использоваться в программе как и сейчас -- т.е. чтобы под неё выделялась память, но чтобы она НЕ включалась в готовый SAV-файл?
Сам код выглядит так:
.TITLE EXPRES
.MCALL .EXIT
.CSECT MAIN
START::
...
.PSECT TILES,RO,D
.INCLUDE /TILES.MAC/
.PSECT DSECT,RW,D
...
STACK:: .BLKW 100 ; Под стек
.END
Как сделать так чтобы секция DSECT могла использоваться в программе как и сейчас -- т.е. чтобы под неё выделялась память, но чтобы она НЕ включалась в готовый SAV-файл?
В RT-11 наверное никак - там линкер автоматом включает в SAV все, что декларировалось - независимо от использования (в отличие от RSX к примеру - там метка сама по себе еще не основание считать, что это часть файла). Как вариант - сделать пустую секцию в конце программы, а после вызывать .SETTOP для проверки места или в XM мапить окно.
Секция DSECT -- это переменные и массивы, которые нужны уже только после запуска.
Сейчас вся секция DSECT -- это нули, и она включена в SAV-файл, что собственно только расходует лишние блоки на диске. Да, помнится, после ассемблера Системы-360 мне тоже сильно не хватало аппарата фиктивных секций - не столько для экономии места, сколько для манипулирования разнообразными таблицами, которые расположены не здесь в программе, а где-то в другом месте. В Системе-360 все просто: описал таблицу в отдельном DSECT'е, занес ее адрес в какой-то регистр, сделал для этого регистра USING на начало этой фиктивной секции и пиши имена полей из таблицы, как будто это твои переменные.
А здесь - изба фигвам. Регистров мало (у Системы-360 их 16), привязка какой-то секции к регистру не предусмотрена, такой стиль программирования (очень удобный, кстати) здесь просто не предусмотрен.
Для работы с таблицами я, помнится, сочинил какую-то макрокоманду, которая позволяла компактно описать таблицу, присваивая именам ее полей значения смещений от ее начала, после чего пользовал их в явном виде (типа MOV NAME1(R5),R0, здесь NAME1 - имя какого-то поля из таблицы, начальный адрес которой лежит в R5), что явно лучше, чем MOV 12(R5),R0. А вот в том виде, в каком эта задача поставлена, она не решается вообще...
MacBuster
02.04.2017, 10:24
Удаление в знак протеста против действий MM
CL.SYS только в составе собранных систем попадается в архиве.
Что-то подзабыл про CL. Выложил сюда (http://pdp-11.org.ru/~form/files/pdp-11/uknc/cl.mac).
MacBuster
12.04.2017, 00:24
Удаление в знак протеста против действий MM
MacBuster, посмотрел! Красиво и цвет радует - фиолетовый не обычный для УК-НЦ по определению, правда при рендеринге и расширению приближённому к реальному монитору планетку плющит сбоков и по Y растягивает до
яйцевидной формы.
MacBuster
06.08.2017, 20:12
Удаление в знак протеста против действий MM
Как сделать так чтобы секция DSECT могла использоваться в программе как и сейчас -- т.е. чтобы под неё выделялась память, но чтобы она НЕ включалась в готовый SAV-файл?
Поздно увидел... Ну, может ещё пригодится. Я делал примерно так:
.MACRO $COMMON NAME=<.$$$$.>
.PSECT 'NAME', RW, D, OVR, GBL
.ENDM $COMMON
.MACRO $CODE
.PSECT $CODE$, I, RO
.ENDM $CODE
.MACRO $IDATA
.PSECT $IDATA, D, RW
.ENDM $IDATA
.MACRO $PDATA
.PSECT $PDATA, D, RO
.ENDM $PDATA
.MACRO $ASCII
.PSECT $ASCII, D, RO
.ENDM $ASCII
.MACRO $VBOT
.PSECT .99997, D, RW
.ENDM $VBOT
.MACRO $VIRT
.PSECT .99998, D, RW
.ENDM $VIRT
.MACRO $VTOP
.PSECT .99999, D, RW
.ENDM $VTOP
.MACRO $USER
.ENDM $USER
.MACRO VINIT
.SAVE
$VIRT
.IF NDF ..VB.
..VB. =: .
..VC. = ^O<0>
.MACRO $VSET
.BLKW
.MACRO $VSET
.ENDM $VSET
.ENDM $VSET
.IFF
.IF NE ..VC.
..VB. =: .
.WORD ..VC.
..VC. = ^O<0>
.ENDC
.MACRO $VSET
.ENDM $VSET
.ENDC
.RESTORE
.ENDM VINIT
.MACRO V.EVEN
..VC.=<..VC.+^O<1>>&^C<1>
.ENDM V.EVEN
.MACRO V.ODD
..VC.=<..VC.&^C<1>>+^O<1>
.ENDM V.ODD
.MACRO V.BLKW LAB LEN=<1>
VALLOC LAB LEN WORDS
.ENDM V.BLKW
.MACRO V.BLKB LAB LEN=<1>
VALLOC LAB LEN BYTES
.ENDM V.BLKB
.MACRO VALLOC LAB LEN UNIT
.SAVE
$VIRT
LAB =: ..VB.+..VC.
.IF NB LEN
.IF IDN <LEN>, <BYTE>
$VSET
..VC.=..VC.+^O<1>
.RESTORE
.MEXIT
.ENDC
.IF IDN <LEN>, <WORD>
.IIF NE ..VC.&^O<1> .ERROR ; ODD count
V.EVEN
$VSET
..VC.=..VC.+^O<2>
.RESTORE
.MEXIT
.ENDC
..VM.=^O<0>
.IIF IDN <UNIT>, <BYTES> ..VM.=^O<1>
.IIF IDN <UNIT>, <WORDS> ..VM.=^O<2>
.IF EQ ..VM.
.ERROR ; Invalid units - 'UNIT'
.RESTORE
.MEXIT
.ENDC
.IF EQ ..VM.-^O<2>
.IIF NE ..VC.&^O<1> .ERROR ; ODD count
V.EVEN
.ENDC
$VSET
..VC.=<'LEN'>*..VM.+..VC.
.ENDC
.RESTORE
.ENDM VALLOC
.MACRO $ORDER
.SAVE
$CODE
$ASCII
$PDATA
$IDATA
$USER
$VBOT
$VIRT
$VTOP
VINIT
.RESTORE
.ENDM $ORDER
.MACRO ADJUST
.SAVE
$PDATA
.EVEN
$IDATA
.EVEN
$ASCII
.EVEN
$VIRT
V.EVEN
.RESTORE
.ENDM ADJUST
Библиотечные функции
; 00009
.INCLUDE /LB:[MACROS]MACROS.MAC/
MODULE VM0, VER=03, LIBR=YES, COMM=<Подпрограммы виртуальной памяти>
.IIF DF R$$T11 FROM SYSMAC IMPORT .SETTOP
.IIF DF R$$11M FROM SYSMAC IMPORT GREG$S, EXTK$S
EXPORT QUALIFIED VTOP, INIVM, CLRVM, CLRMEM
;+
;
; INIVM - Инициализация системы вирт. памяти
; Вход:
; Выход:
; VTOP - Первый неиспользуемый байт памяти
;
;
; CLRVM - Обнуление вирт. памяти
; Вход:
; Выход:
;
;
; CLRMEM- Обнуление области памяти
; Вход:
; R1 - Стартовый адрес
; R2 - Длина в байтах
; Выход:
;
;-
$IDATA
VTOP: .BLKW
$VBOT
BOT:
$VTOP
TOP:
MOV #240, INIVM ; !!! NOP !!!
MOV #207, INIVM+2 ; !!! RTS %7 !!!
MOV #BOT, VTOP
PUSH R0
MOV #TOP, R0
SUB #BOT, R0
IF RESULT IS EQ THEN
POP R0
RETURN
END
.SAVR1
ASR R0
MOV #BOT, R1
CLR R2
THRU R0
ADD (R1)+, R2
END
.IF DF R$$T11
ADD #TOP-2, R2
.SETTOP R2
IF R2 HIS R0 THEN
ADD #2, R2
MOV R2, VTOP
END
.ENDC
.IF DF R$$11M
ADD #TOP, R2
MOV #TOP, R3 ; получить размер задачи в памяти
GREG$S , R3 ; от Executive'а
MOV G.RGRS(R3), R3
ASH #6, R3 ; в байты
SUB R2, R3
NEG R3
ADD #100, R3 ; выравнивание
ASH #-6, R3 ; в кол-во 100(8) байтных блоков
EXTK$S R3 ; расширить
MOV #TOP, R3 ; получить новый размер задачи
GREG$S , R3 ; от Executive'а
MOV G.RGRS(R3), R3 ; в R1
ASH #6, R3 ; в байты
CMP R3, R2 ;
.ENDC
POP R0
RETURN
PROCEDURE INIVM
BEGIN
JMP TOP
END INIVM
PROCEDURE CLRVM
BEGIN
PUSH <R1, R2>
MOV #BOT, R1
MOV VTOP, R2
SUB R1, R2
ADD #2, R2
CALL CLRMEM
POP <R2, R1>
RETURN
END CLRVM
PROCEDURE CLRMEM
BEGIN
PUSH <R1, R2>
IF #1 SET.IN R1 THEN
CLRB (R1)+
DEC R2
END
ASR R2
ROL -(SP)
THRU R2
CLR (R1)+
END
ROR (SP)+
IF RESULT IS CS THEN
CLRB (R1)+
END
POP <R2, R1>
RETURN
END CLRMEM
END VM0
.END
Пример использования
;
; MODULE VM0
;
PROCEDURE INIVM EXTERNAL
PROCEDURE CLRVM EXTERNAL
$VIRT
V.BLKW ELDEST REST
V.BLKW ELD NCODES
V.BLKB CHARS REST
V.BLKB CHAR NCODES
V.EVEN
...
PROCEDURE MAIN
BEGIN
CALL INIVM
ON.ERROR THEN
PRINT$ #PRFX, #'$
PRINT <Не хватает памяти>, #'+
EXIT$S
END
LOOP
CALL CLRVM
...
END
END MAIN
- - - Добавлено - - -
Ещё мне память подсказывает, что вроде начиная с какой версии MACRO-11 появилась .VSECT, с аналогичным поведением (место в готовой проге не выделяется), но.. надо вспоминать - так ли это и как работать...
- - - Добавлено - - -
Или это было с прицелом на FORTRAN с VIRTUAL объявлением под RSX...
- - - Добавлено - - -
Не, похоже такое мог делать только компилятор с FORTRAN. MACRO послал :)
- - - Добавлено - - -
А вот в том виде, в каком эта задача поставлена, она не решается вообще...
Никогда не говори Никогда :)
Подскажите, пожалуйста,
В разделе УК-НЦ, в папке Alphaprog, на образе sysimage.dsk
(ух! какая легенда чуете? как в сказке да?) есть исходник программы
(C) by Alex_K
SCAN .MAC 3 12-Sep-1994
- сканкоды кнопок УК-НЦ читает вроде бы, но там комментариев нет,
программа написана на МАКРО-11 естественно ) Эти дискеты прилагались
к ранним версиям UKNCBTL когда-то )
добрый вечер.
подскажите как сделать или есть ли шаблончик для вывода на экран содержимого двух ячеек памяти или регистров в бинарном виде, а следом в строке в О виде.
чтобы как то так:
регистр1, ячейка1 0110100001101010 64152
регистр2, ячейка2 1110100011111111 164377
шаблончик
.TITLE TEST
.MCALL .EXIT,.PRINT
START:: MOV #DATA,R5
CALL PRDAT
.EXIT
PRDAT:: CALL @PC ;PROPAGATE CODE TWO TIMES
MOV #BUFF,R0 ;BUFFER ADDRESS
MOV @R5,R1 ;VALUE
MOV #16.,R2 ;BIT COUNT
10$: CLR -(SP) ;INIT CHAR
ROL R1 ;SHIFT OUT
ROL @SP ;SHIFT IN
BIS #'0,@SP ;CONVERT TO ASCII
MOVB (SP)+,(R0)+ ;PUT INTO BUFFER
SOB R2,10$ ;TO NEXT BIT
MOVB #<' >,(R0)+ ;SPACE
MOV (R5)+,R1 ;VALUE
CLR R2 ;SUPPRESS LEADING ZEROS
CALL $CBOMG ;CONVERT TO ASCII
CLRB @R0 ;MAKE ASCIZ
.PRINT #BUFF ;PRINT
RETURN ;RETURN
DATA: .WORD 64152,164377
BUFF: .BLKB 80.
.END START
.EX TEST
0110100001101010 64152
1110100011111111 164377
.
Подпрограмма $CBOMG есть в родном SYSLIB от RT-11. Если вместо CLR R2 сделать перед вызовом MOV PC,R2, то ведущие нули подавляться не будут.
есть в родном SYSLIB от RT-11
в какой книге они описаны?
в какой книге они описаны?
В RTшном руководстве по системной библиотеке $CBOMG не описан. Он просто есть как минимум начиная с RT-11 V5.0. Описание есть в RSXовском руководстве по SYSLIB. Для простоты вот хелп по нему - больше по сути и не нужно ничего:
>HELP SYSL CBOMG
Convert binary to octal magnitude
Input: Output:
R0 = Address of output buffer R0 = Points to next byte in output
buffer after converted string
R1 = Binary value to be converted
R2 = Zero suppression flag:
R2 = 0 => Suppress leading zeros
R2 = 1 => Do not suppress leading zeros
Call:
CALL $CBOMG
>
Здесь написано про R2=0 или 1, но на самом деле 0 и не 0 :)
- - - Добавлено - - -
Если что, я портировал в свое время самые интересные подпрограммы из RSX, в теме софта можно поискать RSXLIB. Там много полезного уже готового :)
- - - Добавлено - - -
Небольшое упрощение:
PRDAT:: CALL @PC ;PROPAGATE CODE TWO TIMES
MOV #BUFF,R0 ;BUFFER ADDRESS
MOV @R5,R1 ;VALUE
MOV #16.,R2 ;BIT COUNT
10$: MOVB #'0,@R0 ;INIT CHAR
ROL R1 ;GET BIT
ADCB (R0)+ ;CONVERT TO ASCII
SOB R2,10$ ;TO NEXT BIT
MOVB #<' >,(R0)+ ;SPACE
MOV (R5)+,R1 ;VALUE
CLR R2 ;SUPPRESS LEADING ZEROS
CALL $CBOMG ;CONVERT TO ASCII
CLRB @R0 ;MAKE ASCIZ
.PRINT #BUFF ;PRINT
RETURN ;RETURN
Если что, я портировал в свое время самые интересные подпрограммы из RSX, в теме софта можно поискать RSXLIB. Там много полезного уже готового
спасибо
Если что, я портировал в свое время самые интересные подпрограммы из RSX, в теме софта можно поискать RSXLIB. Там много полезного уже готового
http://archive.pdp-11.org.ru/ukdwk_archive/ukncbtlwebcomplekt/Other/form_rsxlib2/
осталось найти
Описание работы с лексическим разбором
можно найти в
RSX-11M/M+/MicroRSX/IAS I/O
Operations Reference Manual.
и по идее счастье должно наступить:)
осталось найти
RSX-11M-PLUS and Micro/RSX I/O Operations Reference Manual (http://bitsavers.trailing-edge.com/pdf/dec/pdp11/rsx11/RSX11Mplus_V4.x/5/AA-JS16A-TC_RSX-11M_PLUS_and_Micro_RSX_IO_Operations_Reference_Man ual_Sep87.pdf)
7 глава
добрый вечер.
сегодня разбирался с программой
.TITLE TEST
вроде всё понятно, но.....
CALL @PC ;PROPAGATE CODE TWO TIMES
если убрать то выведет одну строку
а вот добавить третью четвёртую у меня не получилось
сильно чайника не пинайте:) ну не понял
После строчки CALL @PC ещё строчка CALL @PC
Только срабатывать будет степень двойки количество раз - 1, 2, 4, 8 и т.д.
Вроде не ошибся :)
если убрать то выведет одну строку
а вот добавить третью четвёртую у меня не получилось
Если 4 строки, то просто два раза CALL @PC. В любом случае всегда можно убрать его в принципе и в цикле вызывать столько раз сколько адресов нужно :)
и в цикле вызывать столько раз сколько адресов нужно
такая мысль проскакивала.....:) но не задержалась.....
Что то типа
START:: MOV #DATA,R5
MOV #100500, R4 ; это типа стописоттыщ раз :)
10$: CALL PRDAT
DEC R4 ; или вместо этой и следующей инструкций SOB R4, 10$
BNE 10$
.EXIT
попробованы все варианты-работают
спасибо
добрый вечер
есть очень маленькая программка и ведёт она себя непонятно
ввод 3 символов, запись их в буфер, печать буфера, возврат на ожидание ввода.
.MCALL .TTYIN,.PRINT,.EXIT
TEST: .TTYIN BUFF1
.TTYIN BUFF1+1
.TTYIN BUFF1+2
.PRINT #BUFF1
BR TEST
.EXIT
BUFF1: .BLKB 3
.END TEST
так выглядит запущенной, 000-111-222-444-введённые символы, остальное печать их, первая и четвёртая печать правильная.
.SET EDIT K52
.SET SL ON
.DAY
Время Дата
18:13:44 01-Окт-2017, Воскресенье
.R TST3
000
000
111
1
11
222
22
2
444
444
окно дизассемблера, 1042 1043 1044-байты буфера. видно что в 1042 пишется 15 вместо 60 первый символ второго ввода, а вот почему непонятно.
001000 [000004] EMT 340
; 000032:000000 -> PSW
; PSW :000004 -> 000776:001000
; PC :001002 -> 000774:136530
; 000030:143446 -> PC
001002 [000000] BCS 001000
001004 [000000] MOVB R0, 001042 ; R0 : 060 -> 001042
001010 [000000] EMT 340
; 000032:000000 -> PSW
; PSW :000000 -> 000776:000000
; PC :001012 -> 000774:001002
; 000030:143446 -> PC
001012 [000000] BCS 001010
001014 [000000] MOVB R0, 001043 ; R0 : 060 -> 001043
001020 [000000] EMT 340
; 000032:000000 -> PSW
; PSW :000000 -> 000776:000000
; PC :001022 -> 000774:001012
; 000030:143446 -> PC
001022 [000000] BCS 001020
001024 [000000] MOVB R0, 001044 ; R0 : 060 -> 001044
001030 [000000] MOV #546., R0 ; 001032:001042 -> R0
001034 [000000] EMT 351
; 000032:000000 -> PSW
; PSW :000000 -> 000776:000000
; PC :001036 -> 000774:001022
; 000030:143446 -> PC
001036 [000000] BR 001000
001000 [000000] EMT 340
; 000032:000000 -> PSW
; PSW :000000 -> 000776:000000
; PC :001002 -> 000774:001036
; 000030:143446 -> PC
001002 [000000] BCS 001000
001004 [000000] MOVB R0, 001042 ; R0 : 015 -> 001042
001010 [000000] EMT 340
; 000032:000000 -> PSW
; PSW :000000 -> 000776:000000
; PC :001012 -> 000774:001002
; 000030:143446 -> PC
001012 [000000] BCS 001010
001014 [000000] MOVB R0, 001043 ; R0 : 012 -> 001043
001020 [000000] EMT 340
; 000032:000000 -> PSW
; PSW :000000 -> 000776:000000
; PC :001022 -> 000774:001012
; 000030:143446 -> PC
001022 [000000] BCS 001020
001024 [000000] MOVB R0, 001044 ; R0 : 061 -> 001044
001030 [000000] MOV #546., R0 ; 001032:001042 -> R0
001034 [000000] EMT 351
; 000032:000000 -> PSW
; PSW :000000 -> 000776:000000
; PC :001036 -> 000774:001022
; 000030:143446 -> PC
001036 [000000] BR 001000
001000 [000000] EMT 340
; 000032:000000 -> PSW
; PSW :000000 -> 000776:000000
; PC :001002 -> 000774:001036
; 000030:143446 -> PC
001002 [000000] BCS 001000
001004 [000000] MOVB R0, 001042 ; R0 : 061 -> 001042
001010 [000000] EMT 340
; 000032:000000 -> PSW
; PSW :000000 -> 000776:000000
; PC :001012 -> 000774:001002
; 000030:143446 -> PC
001012 [000000] BCS 001010
001014 [000000] MOVB R0, 001043 ; R0 : 061 -> 001043
001020 [000000] EMT 340
; 000032:000000 -> PSW
; PSW :000000 -> 000776:000000
; PC :001022 -> 000774:001012
; 000030:143446 -> PC
001022 [000000] BCS 001020
001024 [000000] MOVB R0, 001044 ; R0 : 015 -> 001044
001030 [000000] MOV #546., R0 ; 001032:001042 -> R0
001034 [000000] EMT 351
; 000032:000000 -> PSW
; PSW :000000 -> 000776:000000
; PC :001036 -> 000774:001022
; 000030:143446 -> PC
001036 [000000] BR 001000
001000 [000000] EMT 340
; 000032:000000 -> PSW
; PSW :000000 -> 000776:000000
; PC :001002 -> 000774:001036
; 000030:143446 -> PC
001002 [000000] BCS 001000
001004 [000000] MOVB R0, 001042 ; R0 : 012 -> 001042
001010 [000000] EMT 340
; 000032:000000 -> PSW
; PSW :000000 -> 000776:000000
; PC :001012 -> 000774:001002
; 000030:143446 -> PC
001012 [000000] BCS 001010
001014 [000000] MOVB R0, 001043 ; R0 : 062 -> 001043
001020 [000000] EMT 340
; 000032:000000 -> PSW
; PSW :000000 -> 000776:000000
; PC :001022 -> 000774:001012
; 000030:143446 -> PC
001022 [000000] BCS 001020
001024 [000000] MOVB R0, 001044 ; R0 : 062 -> 001044
001030 [000000] MOV #546., R0 ; 001032:001042 -> R0
001034 [000000] EMT 351
; 000032:000000 -> PSW
; PSW :000000 -> 000776:000000
; PC :001036 -> 000774:001022
; 000030:143446 -> PC
001036 [000000] BR 001000
001000 [000000] EMT 340
; 000032:000000 -> PSW
; PSW :000000 -> 000776:000000
; PC :001002 -> 000774:001036
; 000030:143446 -> PC
001002 [000000] BCS 001000
001004 [000000] MOVB R0, 001042 ; R0 : 062 -> 001042
001010 [000000] EMT 340
; 000032:000000 -> PSW
; PSW :000000 -> 000776:000000
; PC :001012 -> 000774:001002
; 000030:143446 -> PC
001012 [000000] BCS 001010
001014 [000000] MOVB R0, 001043 ; R0 : 015 -> 001043
001020 [000000] EMT 340
; 000032:000000 -> PSW
; PSW :000000 -> 000776:000000
; PC :001022 -> 000774:001012
; 000030:143446 -> PC
001022 [000000] BCS 001020
001024 [000000] MOVB R0, 001044 ; R0 : 012 -> 001044
001030 [000000] MOV #546., R0 ; 001032:001042 -> R0
001034 [000000] EMT 351
; 000032:000000 -> PSW
; PSW :000000 -> 000776:000000
; PC :001036 -> 000774:001022
; 000030:143446 -> PC
001036 [000000] BR 001000
001000 [000000] EMT 340
; 000032:000000 -> PSW
; PSW :000000 -> 000776:000000
; PC :001002 -> 000774:001036
; 000030:143446 -> PC
001002 [000000] BCS 001000
001004 [000000] MOVB R0, 001042 ; R0 : 064 -> 001042
001010 [000000] EMT 340
; 000032:000000 -> PSW
; PSW :000000 -> 000776:000000
; PC :001012 -> 000774:001002
; 000030:143446 -> PC
001012 [000000] BCS 001010
001014 [000000] MOVB R0, 001043 ; R0 : 064 -> 001043
001020 [000000] EMT 340
; 000032:000000 -> PSW
; PSW :000000 -> 000776:000000
; PC :001022 -> 000774:001012
; 000030:143446 -> PC
001022 [000000] BCS 001020
001024 [000000] MOVB R0, 001044 ; R0 : 064 -> 001044
001030 [000000] MOV #546., R0 ; 001032:001042 -> R0
001034 [000000] EMT 351
; 000032:000000 -> PSW
; PSW :000000 -> 000776:000000
; PC :001036 -> 000774:001022
; 000030:143446 -> PC
001036 [000000] BR 001000
001000 [000000] EMT 340
; 000032:000000 -> PSW
; PSW :000000 -> 000776:000000
; PC :001002 -> 000774:001036
; 000030:143446 -> PC
001002 [000000] BCS 001000
001004 [000000] MOVB R0, 001042 ; R0 : 015 -> 001042
001010 [000000] EMT 340
; 000032:000000 -> PSW
; PSW :000000 -> 000776:000000
; PC :001012 -> 000774:001002
; 000030:143446 -> PC
001012 [000000] BCS 001010
001014 [000000] MOVB R0, 001043 ; R0 : 012 -> 001043
001020 [000000] EMT 340
ведёт она себя непонятно
По умолчанию посимвольный ввод отключен, а эхо символов включено. Чтобы получить то, что хочется нужно установить биты TTSPC$ (10000) и TCBIT$ (100) в слове $JSW (44), например так:
.ASECT
.=44
.WORD 10100
.PSECT
TEST: ...
- - - Добавлено - - -
Непонятно зачем .EXIT если до него дело не дойдет никогда, а так же буфер не годится для .PRINT - не зарезервировано место для завершающего нуля, и в теории строка может оказаться очень длинной (хотя в данном конкретном случае выравнивание автоматически зарезервирует этот байт) :)
спасибо, эхо нужно :)
Непонятно зачем .EXIT если до него дело не дойдет никогда
осталось от предыдущей версии программки
эхо нужно
Тогда TTSPC$ не нужно устанавливать, а TCBIT$ нужно.
спасибо
эхо появилось и ошибки вывода тоже.
Лучшая книга (http://pdp-11.org.ru/~form/files/pdp-11/singer.rar) (на мой взгляд - может потому что первая была) по ассемблеру PDP-11, там в том числе вроде нюансы .TTYIN/.TTYOUT разбираются.
- - - Добавлено - - -
ошибки вывода
Ну так в программе получается и эхо символов работает и потом вывод символов делается еще раз :)
спасибо. видел ваше упоминание о книге раньше:)
скачал, листаю, книга написана в повествовательной форме поэтому человеком понимается лучше(начинающим) чем сухие справочники
- - - Добавлено - - -
Ну так в программе получается и эхо символов работает и потом вывод символов делается еще раз
в общем понятно, а вот в частности.....
эхо печатается чтоб видно было что печатаем, логично? а буфер куда я сложил напечатанное портится-непонятно:)(может буфер кривой??? по другому нужно делать наверно) печать я использовал для проверки буфера на предмет правильности заноса туда символов, а так по задумке буфер с символами будет использоваться для перехода к подпрограммам
портится
Ничего вроде не должно портиться (случай когда посимвольный ввод выключен не в счет - там ввод начинается только по CR, а это два байта в RT-11 которые так же введутся через .TTYIN).
Ничего вроде не должно портиться
кроме символов которые ввожу, автоматом вводятся CARR RETN 15 и LINE FEED 12 (взято и книги по ссылке выше:) )
вот они и портят картину
автоматом вводятся CARR RETN 15 и LINE FEED 1
Они вводятся не автоматом, а по нажатию CR. Если включить посимвольный ввод, нажимать CR не нужно и тогд не должно быть их.
в том то и дело что нужно CR нажимать по условию задачки
если добавить два TTYIN для CR LF и буфер+ 2 байта то вроде как и работает:)
по идее мне нужна подпрограмма ввода команд и переходов по ним к другим подпрограммам
нужно CR нажимать по условию задачки
Тогда надо учесть, что CR такой же символ как и любой другой и его надо считать, а в RT-11 кроме того автоматически генерится LF который тоже надо выбрать. Так что программу нужно переделать чтобы символы вводились не в фиксированные места буфера, а вычитывались по одному, анализировались и уже потом записывались если нужно. Ну или (если задача не состоит в том, чтобы разобраться с .TTYIN) можно просто воспользоваться макровызовом ввода строки .GTLIN :)
(если задача не состоит в том, чтобы разобраться с .TTYIN) можно просто воспользоваться макровызовом ввода строки .GTLIN
спасибо за наводку
- - - Добавлено - - -
а вычитывались по одному, анализировались и уже потом записывались если нужно.
с TTYIN который для одного символа даже не представляю как это можно сделать, вводить после каждого символа CR нужно, а мне надо три или больше ввёл а потом CR
Идея. Приблизительно. Могу быть ошибки, поскольку по памяти, проверить под рукой не на чем :)
mov #buf, r5
loop: .ttyin
movb r0, (r5)+
cmpb r0, #15
beq eloop
cmp r5, #buf3
blo loop
eloop: clrb (r5)
.print #buf
mov #buf, r5
br loop
buf: .blkb 3
buf3: .blkb 3
- - - Добавлено - - -
Да, и если действительно LF генерится (не помню) - надо добавить его получение
Вот такой расширенный вариант программы с демонстрацией разного функционала. Посимвольный ввод, эхо печатаем сами, пищим при ошибках, стираем по DEL, работаем в TSX, отрабатываем CTRL/C.
.TITLE TTYIN -- ВВОД ЧЕРЕЗ .TTYIN
.MCALL .EXIT,.GVAL,.HERR,.PRINT ;СИСТЕМНЫЕ МАКРОСЫ
.MCALL .SCCA,.SERR,.TTYIN,.TTYOUT ;...
;+
;СЛОВО СОСТОЯНИЯ ЗАДАНИЯ И ЕГО БИТЫ
;-
$JSW =: 44 ;СЛОВО СОСТОЯНИЯ ЗАДАНИЯ
TTSPC$ =: 10000 ;БИТ СПЕЦИАЛЬНОГО РЕЖИМА
TCBIT$ =: 100 ;БИТ ЗАПРЕТА ОЖИДАНИЯ
;+
;ФИКСИРОВАННЫЕ СМЕЩЕНИЯ RMON
;-
$TSXLC =: -4 ;СМЕЩЕНИЕ ДО СПЕЦСИМВОЛА (TSX)
;+
;СИМВОЛЫ
;-
ETX =: 3 ;CTRL/C
BEL =: 7 ;BELL
BS =: 10 ;BACKSPACE
CR =: 15 ;CR
DEL =: 177 ;DEL
.ASECT
.=$JSW
.WORD TTSPC$!TCBIT$ ;ИНИЦИАЛИЗАЦИЯ JSW
.PSECT
START:: .SERR ;ЗАПРЕТ ОСТАНОВА ПО ОШИБКАМ
;В ДАННОМ СЛУЧАЕ ВОЗМОЖНА ОШИБКА
;НЕВЕРНЫЙ EMT
;+
;В TSX-PLUS И РАФОС/TS ПО УМОЛЧАНИЮ ЗАПРЕЩЕН ПОСИМВОЛЬНЫЙ ВВОД,
;И ПРОГРАММА ОСТАНОВИТСЯ ДО НАЖАТИЯ КЛАВИШИ АКТИВАЦИИ (НАПРИМЕР CR).
;СЛЕДУЮЩИЙ КОД ВКЛЮЧИТ ПОСИМВОЛЬНЫЙ РЕЖИМ И ЗАПРЕТИТ ОСТАНОВ.
;
;ВЫЗЫВАЕМЫЙ НИЖЕ EMT ЗАПРАШИВАЕТ НОМЕР ЛИНИИ В TSX-PLUS И РАФОС/TS.
;В RT-11 БУДЕТ ОШИБКА. ТАКИМ СПОСОБОМ СИСТЕМЫ МОЖНО РАЗЛИЧАТЬ.
;-
MOV #AREA,R0 ;R0->БУФЕР С КОДОМ ФУНКЦИИ
EMT 375 ;ВЫЗОВ ФУНКЦИИ
BCS 10$ ;ЕСЛИ C УСТАНОВЛЕН - ЭТО НЕ TSX
.GVAL #AREA,#$TSXLC ;ПОЛУЧАЕМ КОД СПЕЦСИМВОЛА
MOVB R0,TSSET ;ОБНОВЛЯЕМ ФУНКЦИОНАЛЬНУЮ СТРОКУ
MOVB R0,TSSET+2 ;...
.PRINT #TSSET ;ПЕЧАТАЕМ
10$: .HERR ;РАЗРЕШАЕМ ОСТАНОВ ПО ОШИБКАМ
.SCCA #AREA,#FLAG ;РАЗРЕШАЕМ ПЕРЕХВАТ CTRL/C
15$: MOV #BUF,R1 ;R1->АДРЕС БУФЕРА
MOV #BUFLEN,R2 ;R2->РАЗМЕР БУФЕРА
20$: .TTYIN ;ВВОД СИМВОЛА
CMPB #CR,R0 ;CR?
BEQ 60$ ;ДА
CMPB #ETX,R0 ;CTRL/C?
BEQ 70$ ;ДА
CMPB #DEL,R0 ;DEL?
BEQ 80$ ;ДА
CMPB #<' >,R0 ;ПЕЧАТНЫЙ СИМВОЛ?
BLOS 40$ ;ДА
;+
;ПРИ НЕПРАВИЛЬНОМ ВВОДЕ ПИЩИМ.
;-
30$: .TTYOUT #BEL ;ЗВЯК
BR 20$ ;И ОБРАТНО
40$: TST R2 ;БУФЕР ЗАПОЛНЕН?
BEQ 30$ ;ДА
MOVB R0,(R1)+ ;СОХРАНЯЕМ СИМВОЛ
DEC R2 ;R2->ОСТАТОК МЕСТА В БУФЕРЕ
50$: .TTYOUT ;ЭХО
BR 20$ ;И ОБРАТНО
60$: .TTYIN ;ВЫБИРАЕМ LF
CLRB @R1 ;ЗАВЕРШАЕМ СТРОКУ
.PRINT #CRLF ;ПЕРЕВОДИМ СТРОКУ НА ЭКРАНЕ
.PRINT #STR ;ПЕЧАТАЕМ РЕЗУЛЬТАТ
BR 15$ ;РЕСТАРТ
70$: .PRINT #CRLF ;ПЕРЕВОДИМ СТРОКУ НА ЭКРАНЕ
.EXIT ;ВЫХОДИМ
80$: CMP #BUFLEN,R2 ;ЕСТЬ ЧТО УДАЛЯТЬ?
BEQ 30$ ;НЕТ
INC R2 ;R2->ОСТАТОК В БУФЕРЕ
DEC R1 ;R1->УКАЗАТЕЛЬ НА БУФЕР
.PRINT #BACK ;СТИРАЕМ СИМВОЛ НА ЭКРАНЕ
BR 20$ ;И ОБРАТНО
AREA: .BYTE 0,110 ;БУФЕР ФУНКЦИЙ RT-11
FLAG: .BLKW ;ФЛАГ CTRL/C (ПЕРЕСЕКАЕТСЯ С AREA!)
STR: .ASCII /CTPOKA: / ;ЗАГОЛОВОК СТРОКИ ДЛЯ ПЕЧАТИ
BUF: .BLKB 3 ;БУФЕР
BUFLEN =: .-BUF ;РАЗМЕР БУФЕРА
CRLF: .BYTE 0 ;ЗАВЕРШАЮЩИЙ БАЙТ И CRLF
BACK: .ASCII <BS>/ /<BS><200> ;СТРОКА СТИРАНИЯ СИМВОЛА
TSSET: .ASCII <DEL>/S/<DEL>/U/<200> ;СТРОКА НАСТРОЕК TSX
.END START ;КОНЕЦ
Идея. Приблизительно
Вот такой расширенный вариант программы
спасибо за примеры
добрый вечер.
заинтересовала подпрограмма форматирования данных $EDMSG http://zx-pk.ru/threads/10718-soft-dlya-dvk-pdp11.html?p=583948&viewfull=1#post583948
где нибудь в природе существует пример как её использовать?
где нибудь в природе существует пример как её использовать?
Я использовал в разных программах, в разделе софта выкладывал. Можно в RSXовском руководстве по библиотеке (http://bitsavers.trailing-edge.com/pdf/dec/pdp11/rsx11/RSX11Mplus_V4.x/4a/AA-JS75A-TC_RSX-11M-PLUS_and_Micro_RSX_4.0_System_Library_Routines_Ref erence_Manual_Aug87.pdf) еще посмотреть.
- - - Добавлено - - -
Или на CTAKAH зайти, навскидку куча примеров находится:
>GRE EDMSG LB:[12,10]*.MAC
File DU:[12,10]AS3OV.MAC;1:
ARGBLK: .BLKW 10. ; DATA BLOCK FOR $EDMSG
CALL $EDMSG ; FORMAT THE TEXT
CALL $EDMSG ; FORMAT THE TEXT INTO OUTPUT STRING
CALL $EDMSG ; MOVE IT TO OUTPUT
CALL $EDMSG ; FORMAT TEXT INTO OUTPUT
MOV HDRTAB(R0),R1 ; POINT TO INPUT STRING FOR $EDMSG
CALL $EDMSG ; FORMAT THE HEADER
File DU:[12,10]DEVOV.MAC;2:
CALL $EDMSG ; edit part I of the message ;DC419
560$: CALL $EDMSG ; and do $EDMSG ;DC419
MCR>ABO GRE
>
23:40:42 Task "GRET51" terminated
Aborted via directive or CLI
>
Я использовал в разных программах, в разделе софта выкладывал. Можно в RSXовском руководстве по библиотеке еще посмотреть.
Или на CTAKAH зайти, навскидку куча примеров находится:
спасибо.
адрес СТАКАНА тоже в теме софта?
- - - Добавлено - - -
Можно в RSXовском руководстве по библиотеке еще посмотреть.
нашлось пару примеров
адрес СТАКАНА тоже в теме софта?
ВВВ сервер с описанием пока в процессе пересборки. Вход телнетом на rsx.pdp-11.org.ru, там командой "HEL GUEST/" вход в систему.
и заблудился
Там HELP есть. Многие DCL команды похожи на RT-11, в частности, всякие DIR, TYPE. Можно печатать постранично с ожиданием (TY/PA) нечто вроде unix'ового more, можно более навороченно смотреть постранично (VTL) - нечто вроде unixового less, ну и GRE - нечто вроде UNIXового GREP. Вполне достаточно чтобы примеры смотреть :)
DIR
её пробовал:)
беда....
MCR -- Not logged in
хотя ранее что то работало
MCR -- Not logged in
Ну так писал же - надо войти командой "HEL GUEST/" :)
- - - Добавлено - - -
Кстати там и RT-11 есть локальный :)
Запускается командой "RTE /VS", выход из него обратно "BY" или если все совсем плохо, то CTRL/P.
Ну так писал же - надо войти командой "HEL GUEST/"
:) Семён-Семёныч
- - - Добавлено - - -
Запускается командой "RTE /VS", выход из него обратно "BY"
работает:)
- - - Добавлено - - -
Вполне достаточно чтобы примеры смотреть
как добраться до них? :)
- - - Добавлено - - -
EDMSG
очень похож на printf :)
как добраться до них?
Это название команд :)
Это название команд
понятно
нашлось вот такое
HELP SYSL subname
- - - Добавлено - - -
>GRE EDMSG LB:[12,10]*.MAC
по команде нашлось несколько файлов
а вот вывести не получается:(
а вот вывести не получается
худо-бедно-с горем-пополам:) удалось вывести на терминал-вопрос снимается
а то я вчера уже хотел к вам в скайп ломиться:)
а где то можно эти *.mac файлы скачать? у вас на сайте???
а где то можно эти *.mac файлы скачать? у вас на сайте???
Можно взять любой дистрибутив RSX которые есть в интернете, можно включить лог в эмуляторе терминала и распечатать на экран, можно выкачать по кермиту или залить по FTP куда-нибудь (клиент FTP там есть).
Можно взять любой дистрибутив RSX которые есть в интернете
http://pdp-11.org.ru/files.pl -----здесь нашлось:)
плагин не видит образы
можно включить лог в эмуляторе терминала
подключился через http://zx-pk.ru/threads/20092-emulyator-terminala-tipa-vt52.html
на rsx.pdp-11.org.ru IP постоянный?
плагин не видит образы
Ну, логично, наверно :)
на rsx.pdp-11.org.ru IP постоянный?
Да.
Если подключиться эмулятором ДВК вместо эмулятора терминала (вторым терминальным портом), то можно выходить в RSX через VTCOM и копировать файлы с помощью команды TRA:
>TRA /HE
Abstract TRANSFER - native file transfer utility, copies files between a
RSX-11M/M-PLUS system and a RT-11 system linked by a hard-wired
connection or by a modem and a telephone line.
Command TRANSFER input-filespec[/qualifier...]
Syntax [output-filespec[/qualifier...]]
Semantics Following file types default to "ascii":
.ANS .BAK .BAS .BAT .BLI .B16 .B2S .B32 .C .CBL
.CMD .COM .COR .CTL .DAT .DBL .DDF .DIF .DIR .DMP
.DOC .FOR .FTN .H .LIS .LOG .LST .MAC .MAP .MAR
.MEM .ODL .PAS .REQ .RNO .R16 .R32 .S .SLP .SRC
.TEC .TES .TXT
Following file types default to "binary":
.BIN .LDA .OBJ .STB
All other file types default to "image".
Qualifiers TRANSFER utility qualifiers are:
/ASCII[:n] Copies files in "ascii" mode, regardless of file type. If n is
specified, fixed length records of length n are generated.
/BINARY[:n] Copies files in "binary" mode, regardless of file type. If n is
specified, fixed length records of length n are generated.
/FORTRAN[:n] Copies files in "ascii" mode, regardless of file type and sets
Fortran carriage control. Used when outputting to Files-11
volumes.
/HELP Provides limited information in use of TRANSFER utility
/IMAGE[:n] Copies all files in "image" mode. If n is specified, fixed
length records of length n are generated. The default value
for n is 512.
/LOG Creates a log of names and sizes of all files copied.
/PROGRESS[:n] Causes TRANSFER to show file transfer progress every n records
or blocks while copying a file. The default value for n is 10.
/PROMPT Causes TRANSFER to explicitly prompt for command parameters.
/REMOTE Indicates direction of file transfer (identifies REMOTE file).
/STATISTICS Causes TRANSFER to show file transfer statistics.
/TERMINAL Indicates direction of file transfer (identifies REMOTE file).
/VERSION Causes TRANSFER to display utility version.
>
Если подключиться эмулятором ДВК вместо эмулятора терминала (вторым терминальным портом), то можно выходить в RSX через VTCOM и копировать файлы с помощью команды TRA:
круто:)
через DVK_IP.cfg???
через DVK_IP.cfg???
У меня не нашлось такого конфига в примерах.
через DVK_IP.cfg
не получается
как задействовать второй терминал?
не получается
Было бы странно если бы получилось с использованием того, чего нет :)
Сейчас подготовлю систему (там кроме всего прочего нужен родной драйвер и программа которых нет в комплекте эмулятора).
Было бы странно если бы получилось с использованием того, чего нет
:)
Выложил здесь (http://pdp-11.org.ru/~form/files/pdp-11/dvk/emul/) образ диска и конфиги для подключения к CTAKAHу через VTCOM. В логе пример скачивания файла.
Выход в командный режим VTCOM - CTRL/P.
HD V2.0 CSR=177720, 22-bit controller
RT-11XM (S) V05.07
.TTSET /SL
.R DATE
?DATE-I-Time source: RT-11
?DATE-I-Date & time: 6-OCT-2017 18:26:59
.VTCOM
>HEL GUEST/
RSX-11M-PLUS V4.6 BL87 [1,54] System CTAKAH
6-OCT-17 18:27 Logged on Terminal TT53: as GST21
Good Evening
,;,
O(o o)O
+---ooO-----------Ooo------------------------------------------------+
| # # # W E L C O M E T O |
| # ## ## |
| #### #### #### # # ### # ### #### # # ### # # |
| # # # # # # ### # # # # # # # # # # # # |
| # # # # # # # # # # # # # # # # |
| #### #### #### ### ### # ### # ##### # # ### |
| # # # |
| # # CTAKAH:: RSX-11M-PLUS V4.6 #### |
+--------------------------------------------------------------------+
Last interactive login on Friday, October 6, 2017 18:23:25 (TT53:)
Last batch login on Friday, August 4, 2017 08:12:49
$ @LB:[1,2]SYSLOGIN.CMD
Last batch login on Friday, August 4, 2017 08:12:49
See http://pdp-11.org.ru/~form/ctakah.html for more information.
$ TRA LB:[12,10]SAVSIZ.MAC/AS SAVSIZ.MAC/TER
$ LO
$ @LB:[1,2]SYSLOGOUT.CMD
$ @ <EOF>
$
Connect time: 0 hrs 1 mins 26 secs
CPU time used: 0 hrs 0 mins 4 secs
Task total: 24
Have a Good Evening
06-OCT-17 18:28 TT53: logged off CTAKAH
$
TT::VTCOM> EX
.DIR SAVSIZ
06-Oct-2017
SAVSIZ.MAC 50 06-Oct-2017
1 Files, 50 Blocks
4370 Free blocks
.
Скорость эмуляции (CPU MIPS Limit) должна стоять 2000. Если будет меньше - будут теряться символы, посылаемые RSX (есть вариант драйвера XL, поправленный Patron'ом, который не теряет), если больше - VTCOM не сумеет определить наличие таймера (патч есть для VTCOM, но лень вытаскивать).
спасибо:)
вроде получилось... по вашему примеру скопировал файл
при запуске ругается на VT52 в консоле эмулятора, надеюсь это не страшно????
ругается на VT52 в консоле эмулятора
Нет информации на тему о чем ругается :)
В любом случае, требуется последняя версия эмулятора ДВК (система сгенерирована с "верчением лампочек" во время простоя, а эта фича есть только в последней версии эмулятора, но без лампочек тоже жить можно) :)
щас будет:)
хотя постойте.... я использую предпоследнюю версию, наверно поэтому и ошибки...
- - - Добавлено - - -
запустил на новом---лампочки глаз радуют:)
лампочки глаз радуют
Еще бы - в 22 веке тоже любили (http://pdp-11.org.ru/~form/files/pdp-11/dvk/emul/VIDEO0251.mp4) :D
тоже любили
очень похоже:)
- - - Добавлено - - -
добрый вечер.
есть программа у меня, она используется для проверки различных узлов в оборудовании под управлением ДВК-3М
очень хочется разобрать её на атомы для понимания как и что там работает, да боюсь моих познаний не хватит:)
что нужно: в идеале превратить в исходник, это наверно крайне сложно, даже скорее невозможно!!!!
или хотя бы в удобоваримый для понимания вариант:код-данные-емт(ввод-вывод) итд итп......
таких программ в комплекте штук 8 разных, одна из них рабочая, остальные тестовые-проверочные, комплектов 4 штуки, в принципе они однотипные но имеются различии.
программа
Нифига себе программа: 44Kb без оверлеев :)
Обращается к какой-то железяке по адресу 167002, надо знать что там должно быть.
Нифига себе программа: 44Kb без оверлеев
:) это ещё не самая маленькая
Обращается к какой-то железяке по адресу 167002, надо знать что там должно быть
там тёмный лес.....:) к589 мпу через интерфейс ну и кучка плат которая напрямую через и2 и дешифратор адресов
- - - Добавлено - - -
по 167002 один бит вроде проверяется, это чтобы стартануть и не вылететь, точнее проверяется готовность 589мпу к обмену
Еще пример - использование прерываний в фортрановской программе.
Коментарии в ассемблерном коде.
В данном примере прога тупо крутится в цикле, печатая всякую фигню, при нажатии CTRL/C выходит.
а как то можно этот пример посмотреть?
мне нужно немного другое, по CTRL/B выйти из цикла в определённое место в программе, программка на ассемблере.
а как то можно этот пример посмотреть?
Если ссылки нет (возможно был аттач файла), то не сохранилось.
по CTRL/B выйти из цикла
CTRL/B не лучшая комбинация для RT-11 - в FB/XM/ZM монторах она используется.
Также нежелательно использовать CTRL/A (редкий случай - поддержка графдисплея), CTRL/F (FB/XM/ZM), CTRL/O, CTRL/Q, CTRL/S, CTRL/X (FB/XM/ZM) - они тоже используются в RT-11, некоторые варианты невозможно перехватить стандартными средствами.
Нежелательно также использовать CTRL/P - его часто используют по умолчанию терминальные программы (VTCOM например) и RTEM-11.
Кроме того в "наших| ФОДОСах была привычка заменять стандартный CTRL/O на CTRL/D :)
CTRL/B не лучшая комбинация для RT-11 - в FB/XM/ZM монторах она используется.
мне для SJ,
ничего не сохранилось:(
мне для SJ
Лучше не закладываться на SJ, а просто учитывать возможные варианты. :)
А то потом рождаются мифы о том, что где-то TAB стирает символы по дороге на экране и тому подобное только от того, что не были учтены варианты :)
ничего не сохранилось
Ну в сущности связь фортрана с ассемблером очень проста, а работа с прерываниями требует большой аккуратности. Ну и нужно помнить, что большая часть фортрановских операций ввода-вывода не повторновходимы, а значит их нельзя использовать в обработчике прерывания.
Ну в сущности связь фортрана с ассемблером очень проста,
ассемблер, фортрана пока не будет
крутится цикл- нажали комбинацию- перешли на нужное место в программе(ввод, печать итд итп)
Лучше не закладываться на SJ
задача узкая из моих:)
крутится цикл- нажали комбинацию- перешли на нужное место в программе(ввод, печать итд итп)
Ну так ничего сложного: нужно включить посимвольный режим и запрет ожидания - недавно показывал пример, в нужном месте делать проверку с помощью .TTINR - если ничего не нажато (установлен бит C), просто идти дальше, если нажато - смотреть что (вернет в R0) и реагировать соответственно. :)
недавно показывал пример,
хороший пример, ещё раз спасибо:) и за подсказку тоже
- - - Добавлено - - -
с помощью .TTINR
TTYIN для этой цели не подходит????
TTYIN для этой цели не подходит?
.TTYIN будет ждать пока клавиша не будет нажата
.TTINR ждать не будет и установит бит C если ничего не нажато, что позволяет использовать его для проверок не мешая выполнению программы
.TTYIN будет ждать
.TTINR ждать не будет
спасибо
MacBuster
19.10.2017, 20:59
Удаление в знак протеста против действий MM
добрый день.
вот здесь http://zx-pk.ru/threads/15587-programmirovanie-na-uknts-kak.html?p=378045&viewfull=1#post378045
команда *TEST=TEST файл LST генерит? и сразу распечатывает?
в эмуляторе V05.06R и вышеуказанная команда создаёт только OBJ файл, что соответствует описанию.
наверно что то где то смонтировано как в кино??? :)
.ru du1:macro
*
MACRO V05.03b
*TEST=TEST
AQ 7 000010 012767 000000 000000G MOV #^X55AA,R0
I 9 000016 374 324 317 TEXT: .ASCIZ /|TO ?ROSTO TEKST DLQ ?/
000021 040 322 317
000024 323 324 317
000027 040 324 305
*TEST=TEST файл LST генерит? и сразу распечатывает?
Автораспечатки в RT-11 в принципе нет, а чтобы получить файл листинга - надо попросить его сделать. В CSI строке это будет второй выходной файл, в команде MACRO нужно указать опцию /LIST[:file].
То, что показано - это распечатка ошибки на экран которая есть когда нет файла листинга и ее нет когда файл листинга есть (в этом случае ошибки показываются в нем).
понятно, спасибо
проверил, внёс ошибки в мак файл и ошибки напечатались:)
MacBuster
28.10.2017, 02:26
Удаление в знак протеста против действий MM
В архиве исходник, sav
причём уже переименованы не по RT-11 ) МакБастер RT-11 в тайне ненавидит - это факт! )
для выполнения в ПП УКНЦ
Я сложил в одну кучу (http://pdp-11.org.ru/~form/files/pdp-11/uknc/prun/) все, что касается ПП на УКНЦ.
Там последний PRUN (http://zx-pk.ru/threads/12877-soft-dlya-uknts.html?p=893429&viewfull=1#post893429) для упрощения запуска на ПП и несколько простых программ (некоторые собраны, некоторые только в исходниках):
KBFIX - исправление "залипания" клавиш дополнительной клавиатуры в режиме ДКЛ /у кого хоть раз залипла девятка в K52 после часа работы, тот поймет ;)/
NOALF - еще одна затычка - отключение клавиши АЛФ нафиг - кто как, а я частенько в нее попадал вместо shift :)
PPCP - пример программы которую можно запускать как в RT-11 так и на ПП
PPTEST - пример программы для ПП которая после выполнения сама себя выгружает
Ну и IOSCAN (http://zx-pk.ru/threads/10718-soft-dlya-dvk-pdp11.html?p=721628&viewfull=1#post721628) в комплекте содержит вариант для ПП.
Пример исходника рудиментарной программы для выполнения в ПП УКНЦ на ассемблере:
sampleuknc.zip
Может пригодится кому для освоения программирования. Делает следующее:
- Загружает код в ПП,
Вроде бы есть документация "Работа с внешними устройствами". Там подробно объяснено, что сначала надо запросить блок памяти, получив его адрес. А уже затем загрузить в ОЗУ ПП и дать команду на выполнение. В примере грузится строго по адресу 30000. А если мы запускаем из-под RT-11 и до этого уже что-то загрузили, то всё будет потёрто.
По поводу подпрограммы посылки адреса блока параметров по каналу К2: после посылки четырех байтов надо обязательно дождаться установки флага готовности, это свидетельствуют о том, что блок параметров обработан процессом канала К2 и выполнен.
Что-то в качестве примера:
BLK: .WORD 0,32,0,0,0
BLK0: .WORD BLK,-1
CHAN2: MOV #BLK0,R0
MOV #5,R1
BR 2$
1$: MOVB (R0)+,@#176676
2$: TSTB @#176674
BPL 2$
SOB R1,1$
RETURN
START: MOV #777,AA
MOVB #1,BLK+1
MOV #<$END-$BEGIN>,BLK+6
CALL CHAN2
TSTB BLK
BEQ 1$
.PRINT #WARN
.EXIT
1$: MOVB #20,BLK+1
MOV #$BEGIN,BLK+6
MOV #<$END-$BEGIN>,BLK+10
CALL CHAN2
MOVB #30,BLK+1
CALL CHAN2
AA: BR .
MOVB #2,BLK+1
CALL CHAN2
.EXIT
$BEGIN:
...............
MOV #AA/2,@#177010
MOV #NOP,@#177014
RETURN
$END:
WARN: .ASCIZ /?SCAN-F-No memory for load/
MacBuster
28.10.2017, 11:57
Удаление в знак протеста против действий MM
доброе утро.
есть ли возможность так организовать печать в программе на терминал при которой: очищается экран, печатаются строки с информацией, печатаются строки с информацией на том же месте ?????
Что то типа такого, насколько мне не изменяет память
Но если выводимая строка статуса может быть разной длины - нужно учесть это и затирать хвост предыдущего вывода
.PSECT CODE
;....
.PRINT #Mess
;....
.PSECT DATA
Mess: .ASCII /Message/<15><200>
есть ли возможность так организовать печать в программе на терминал при которой: очищается экран, печатаются строки с информацией, печатаются строки с информацией на том же месте ?????Можно использовать коды управления терминалом типа VT52.
Курсор в верхний левый угол: <033>H
Очистить экран ниже курсора: <033>J
Очистить строку после курсора: <033>K ( если чистить сразу весь экран - очищать отдельные строки уже не надо и наоборот ).
Программа, выводящая строки на экран таким способом - может выглядеть так:
;
.MCall .Print, .Exit
START:
Mov #75., R2
2$:
.Print #Scr
Clr R0
1$: SOB R0, 1$
IncB Byte1
IncB Byte2
IncB Byte3
IncB Byte4
SOB R2, 2$
.Exit
Scr: .ASCII <33>/H/<33>/J/<12>/Str1: /
Byte1: .ASCII /0/<15><12><12>
.ASCII /Str2: /
Byte2: .ASCII /0/<15><12><12><12><12>
.ASCII /Str3: /
Byte3: .ASCII /0/<15><12><12><12><12><12><12><12><12><12><12>
.ASCII /Str4: /
Byte4: .ASCIZ /0/
.End START
;
А, да .PRINT, а не .TTYOUT, поправил :)
Можно использовать коды управления терминалом типа VT52
вполне похоже на то что мне нужно:)
ещё раз спасибо за пример
доброе утро.
подскажите как лучше реализовать:
есть команды сом1 сом2 сом3......сомN, также эти команды могут содержать перед собой кол-во повторов 888сом1 333сом2 222сом3......111сомN и пакетный вариант 888сом1,333сом2, 222сом3,......111сомN-последний вариант наверно из области фантастики:)
команды нужно декодировать и в результате получить переход на нужную подпрограмму.
подскажите как лучше реализовать:
каждый из вариантов оформить отдельной процедурой избегая глобальных переменных во внутренних циклах.
каждая процедура отдельный режим работы из меню? как-то так.
каждая процедура отдельный режим работы из меню?
да
в общем я понимаю как и что должно работать по моей задумке.....
проблема в реализации.
допустим я введу через .GTLIN 222сом1 - мне нужно команду декодировать, разделить количество повторов от команды, в случае пакета команд после исполнения первой перейти на вторую, третью итд итп
gfd71, я не задавал вопрос я предложил как оформить )
?
знак вопроса для меня - всегда знак вопроса:)
gfd71, я не задавал вопрос я предложил как оформить )
знак вопроса для меня - всегда знак вопросаон для всего абзаца.
Через GTLIN что то дебри какие-то получаются, почему бы перестать работать с RT-11 уже на самом раннем этапе и делать все остальные манипуляции внутри интерфейса для Оператора?
я на ощупь предлагаю, поскольку мне страшно подумать что вы подразумеваете
под "декодировать" ) скорее всего моё предложение не реализуемо окажется как только всплывут детали-подробности...
Через GTLIN что то дебри какие-то получаются
допустим я введу через .GTLIN
варианты могут быть разными, я ещё пока не определился
опишите ваши три режима в виде блок схемы (хотя бы для себя) 333 - кол-во циклов независимых
я так понял что 1 случай когда этот параметр одинаков для всех команд
второй когда растёт некая прогрессия для каждой следущей команды
пакетный режим подробнее и в виде блок схемы
- - - Добавлено - - -
ещё важный момент - вложенность или ожидание окончания предыдущего цикла????
- - - Добавлено - - -
я бы запускал один какой-то единый справочник-командер
где можно менять параметры и запускать руками нужные режимы работы
т.о. всё отладить, а потом уже можно автоматизировать кусками )))
- - - Добавлено - - -
программисты профессионалы наверняка могут изящнее что то написать.
com1 исполнится процедура соответствующая команде, 10com1 - десять раз исполнится нужная процедура, 10com1,20com2 - десять раз первая процедура, двадцать раз вторая процедура
блок схемы рисовать - нормального редактора пока не нашёл:)
ещё важный момент - вложенность или ожидание окончания предыдущего цикла????
последовательно, пока не подразумевается переход куда то в зависимости от исполнения предыдущего, хотя вполне возможно когда нибудь..........
я бы запускал один какой-то единый справочник-командер
во-во, он самый, наверно это то что мне нужно
было бы здорово шаблончик на macro11
блок схемы рисовать - нормального редактора пока не нашёл
подскажу - простой карандаш и тетрадка в клетку )
По поводу команд - не сразу сообразил - в RT-11 если не ошибаюсь команды не могут начинаться с цифр !!!
во-во, он самый, наверно это то что мне нужно
было бы здорово шаблончик на macro11
готового шаблона нет и быть не может, я вообще не думаю что писать интерфейсы на ассемблере это удобно...
любой простой интерфейс с выводом пунктов по координатам на экран и какой-то "курсор" управления
выбором нужного пункта - вроде бы ничего сложного.
RT-11 если не ошибаюсь команды не могут начинаться с цифр !!!
в пользовательской программе а не ОС
я вообще не думаю что писать интерфейсы на ассемблере это удобно...
возможно вы правы:) паскаль не знаю вообще, фортран проходил 27 лет тому назад:)
так что у меня есть только macro11
готового шаблона нет и быть не может,
есть к примеру программа TSTDW в ней как раз стрелочный интерфейс, возможно имея исходник, можно было бы приспособить......
подскажу - простой карандаш и тетрадка в клетку )
:) и это в 21веке
любой простой интерфейс с выводом пунктов по координатам на экран и какой-то "курсор" управления
выбором нужного пункта - вроде бы ничего сложного.
просто - это когда знаешь-умеешь-делал-(не)получилось итд итп.....
командная строка -компактна-информативна-многовариантна, стрелки итд итп-нет:)
так что у меня есть только macro11
это на кванте то? у вас даже "турбо-паскаль" там есть )
Си есть и OMSI-Pascal у вас то же есть - я не агитирую я факты констатирую.
и это в 21веке ага - самый удобный прибор при разработке любой сложности.
что бы чётко выделить какой блок уже написан и на каком этапе что куда ветвиться - простейшая блок схема ИМХО,
как же без неё???
командная строка -компактна-информативна-многовариантна, стрелки итд итп-нет
как вы озаглавите пункт выбора режима работы настолько он и будет информативен
далее по схеме - запускается нужная процедура при выборе определённого пункта (можно отдельный файл с диска запускать, а переменных глобальных значения хранить (и контрольную копию) во внешних файлах), сама процедура может иметь входящих и вых. параметров (по ТЗ) и нужные уточнения в диалоговом режиме вводит Оператор по запросу программы. Диалоговый интерфейс. На ассемблере мне было бы муторно такое писать )
- - - Добавлено - - -
просто со строками работа та ещё волокита
пункт меню - выбрал - жмыкнул ввод
это на кванте то? у вас даже "турбо-паскаль" там есть )
Си есть и OMSI-Pascal у вас то же есть - я не агитирую я факты констатирую.
"у меня"- это имеется ввиду то , что хоть как то что то могу делать
а так в природе много что есть..... всё не изучишь:)
как же без неё???
Лехко. Даже на MACRO-11. Если мне нужна блок-схема - значит, я пока сам не понял, чего хочу. Значит - пишем формальное описание.
просто со строками работа та ещё волокита
Кому как.
пункт меню
попробуйте выбрать из командного файла - когда нужно автоматизировать процесс
gfd71, если меня кто не опередит - примерно через час сброшу заготовку
есть команды сом1 сом2 сом3......сомN, также эти команды могут содержать перед собой кол-во повторов 888сом1 333сом2 222сом3......111сомN и пакетный вариант 888сом1,333сом2, 222сом3,......111сомN-
Задача для табличного разборщика который есть в RSXLIB :)
Но можно и проще подпрограммами оттуда же. Например если команды состоят из 3х букв, то можно делать так: конвертируем число, если ошибка - считаем 1, конвертируем 3 символа RSDIX-50, если ошибка - ошибка и есть, в противном случае поиск по таблице.
если меня кто не опередит - примерно через час сброшу заготовку
буду благодарен даже если опередит:)
Задача для табличного разборщика который есть в RSXLIB
TRAPS-?
мне его с моим английским и прочими навыками год наверно осваивать:)
Но можно и проще подпрограммами оттуда же. Например если команды состоят из 3х букв, то можно делать так: конвертируем число, если ошибка - считаем 1, конвертируем 3 символа RSDIX-50, если ошибка - ошибка и есть, в противном случае поиск по таблице.
по подробней можно?
- - - Добавлено - - -
TRAPS
если он, то разве в RT11 он имеется?
если он, то разве в RT11 он имеется?
Он есть в RSXLIB для RT-11 - для того и перетаскивал туда самое полезное чтобы жизнь облегчить :)
Он есть в RSXLIB для RT-11
у меня вот это есть
Обновление библиотеки RSXLIB. (RSXLIB 2.0)
Добавлены макрокоманды и подпрограмма лексического
разбора строк (ISTAT$, STATE$, TRAN$). Сама библиотека
соответственно разделилась на две библиотеки:
объектную (RSXLIB.OBJ) и макробиблиотеку (RSXLIB.MLB).
Что то типа такого. Сегодня проверить, чего я там накропал - не могу, возможно, получится завтра.
;
; .PSECT DATA,RW
;
;; Имена команд
;CMD1: .ASCIZ /COM1/
;CMD2: .ASCIZ /COM2/
; .EVEN
;; Ссылка на процедур (порядок тот же, как и в именах команд)
;METH1: .WORD RMETH1
;METH2: .WORD RMETH2
;
;; Описатель - команда-процедура. Окончание - нулевое слово
;DESC: .WORD CMD1
; .WORD METH1
; .WORD CMD2
; .WORD METH2
; .WORD 0
;
; .PSECT CODE,RO
;
; MOV #CMD, R0 ; Строка команды в формате .ASCIZ
; MOV #DESC, R1 ; Дескриптор команд-процедур
; CALL PARSE
;
PARSE::
MOV R1, -(SP) ; Сохраним описатель команд
LOOP: TSTB (R0) ; Дошли до конца строки команд
BEQ EXIT ; Да - выход
CMPB (R0), #', ; Нет. Разделитель команд?
BNE NCOMMA ; Нет - дальше повторитель-команда или команда
INC R0 ; Пропуск запятой
BR LOOP ; Дальше по командной строке
NCOMMA:
CLR R3 ; Повторитель команды
DIG: CMPB (R0), #'0 ; Цифра?
BLO NDIG ; Нет - дальше пошла команда
CMPB (R0), #'9 ; Цифра
BHI NDIG ; Нет - дальше пошла команда
MUL #10., R3 ; Предыдущее*10
SUB #'0, R3 ; Минус код ASCII минус код нуля
MOVB (R0)+, R2 ; Очердной символ-цифра
ADD R2, R3 ; Плюс следующаяя цифра в коде ASCII
BR DIG ; Смотрим дальше
NDIG: TST R3 ; Повторитель задан?
BNE SCMD ; Да - ищем команду
INC R3 ; Нет - но один раз команду выполнить надо
SCMD: MOV (SP), R1 ; Описатель команд
MOV R0, -(SP) ; Начало имени команды
LCMD: MOV (R1)+, R2 ; Имя следующей команды. Описатель закончился?
BEQ ECMD ; Да - (тут в принципе можно вставить переход на обработку ошибки)
MOV (R1)+, R5 ; Процедура, её выполняющая
MOV (SP), R0 ; Начало имени команды - для очередного сравнения
SCMP:
TSTB (R0) ; В конце строки (окончание имени команды)?
BEQ CCHECK ; Да
CMPB (R0), #', ; Запятая (тоже окончание имени команды)?
BEQ CCHECK ; Да
TSTB (R2) ; Имя команды в описателе закончилось (а в строке команды - нет)?
BEQ LCMD
CMPB (R0)+, (R2)+ ; Символ тот же?
BEQ SCMP ; Да, продолжаем сравнение
BR LCMD ; Нет - смотрим следующую команду
CCHECK: TSTB (R2) ; В строке команда закончилась. А в описателе?
BNE LCMD ; Нет - не та команды
CALL MCMD ; Да - выполнить связанную с ней процедуру
ECMD: TST (SP)+
BR LOOP
EXIT: TST (SP)+
RETURN
MCMD: CALL $SAVAL
CALL (R5)
RETURN
;
;В принципе, стандартная процедура сохранения восстановления всех регистров,
;но с этим кодом процедура становится самодостаточной.
;Можно выкинуть :)
;
$SAVAL: MOV R4,-(SP)
MOV R3,-(SP)
MOV R2,-(SP)
MOV R1,-(SP)
MOV R0,-(SP)
MOV 12(SP),-(SP)
MOV R5,14(SP)
JSR PC,@(SP)+
MOV (SP)+,R0
MOV (SP)+,R1
MOV (SP)+,R2
MOV (SP)+,R3
MOV (SP)+,R4
MOV (SP)+,R5
RETURN
спасибо:)
мне наверно тоже только завтра получится
Пока не за что - проверить не успел. Но идеи достаточно простые - есть риск, что ошибок - не много :)
Ещё нашёл любопытные шпаргалки и обсуждения (не совсем по вопросу, там немного другое).
http://zx-pk.ru/threads/15587-programmirovanie-na-uknts-kak.html?p=562811&viewfull=1#post562811 - вот отсюда и дальше подряд можно читать по смыслу.
Очень полезная у нас тут тема, очень полезная )
form, пользуясь случаем вопрос : как этот "особый режим или параметр" включить\применить для
.EXIT, что бы на выходе команду выполнить \ передать монитору?
http://zx-pk.ru/threads/15587-programmirovanie-na-uknts-kak.html?p=562909&viewfull=1#post562909
или выдать какой-то BYE-BYE (был и такой пример) при любом (даже аварийном) завершении исполняемой программы. (шпору вот на второй случай не нашёл, но помню ты давал там пример с трапом вроде, возможно в теме Паскаля, а не в этой).
Очень полезная у нас тут тема, очень полезная )
согласен на все 300% :)
Но идеи достаточно простые - есть риск, что ошибок - не много
вскрытие покажет:)
хотя текущее обсуждение и не имеет именно к тонкостям программирования под УК-НЦ никакого отношения.
Правильнее было бы это в теме ув. MM например прочитать, ну да ладно. УК-НЦ = продолжает выполнять учебную миссию, а RT-11 и макро-11 и там и там одни и те же (железные тонкости и различия (и наличие ПП) в обсуждении роли пока не играют).
у меня вот это есть
Оно и нужно :)
Вот пример программы:
.TITLE COM -- РАЗБОР КОМАНД
.MCALL .EXIT,.GTLIN,.PRINT ;СИСТЕМНЫЕ МАРКОСЫ
.MCALL ISTAT$,STATE$,TRAN$ ;МАКРОСЫ ТАБЛИЧНОГО ПАРСЕРА
START: MOV #BUFF,R4 ;БУФЕР ДЛЯ ВВОДА
MOV R4,R3 ;КОПИРУЕМ АДРЕС
.GTLIN R4,#PROMP ;ЧИТАЕМ СТРОКУ
10$: TSTB (R3)+ ;КОНЕЦ СТРОКИ?
BNE 10$ ;ПОКА НЕТ
SUB R4,R3 ;ВЫЧИСЛЯЕМ ДЛИНУ...
DEC R3 ;...СТРОКИ
BEQ START ;ЕСЛИ ПУСТАЯ СТРОКА - НА НАЧАЛО
MOV #KEYTB,R2 ;АДРЕС ТАБЛИЦЫ
MOV #STATE,R5 ;НАЧАЛЬНАЯ ТОЧКА РАЗБОРА
CLR R1 ;ПРОВЕРЯТЬ ДО ПОЛНОГО СОВПАДЕНИЯ
CLR CMDSB ;ИНИЦИАЛИЗАЦИЯ ПАРАМЕТРОВ
MOV #1,CMDCT ;...
CALL .TPARS ;РАЗБОР СТРОКИ
BCC 20$ ;ПЕРЕХОД ЕСЛИ УСПЕШНО
.PRINT #ESYNT ;СИНТАКСИЧЕСКАЯ ОШИБКА
BR START ;НА НАЧАЛО
20$: CALL @CMDSB ;ВЫЗОВ ПОДПРОГРАММЫ КОМАНДЫ
BR START ;НА НАЧАЛО
;
;ПОДПРОГРАММА СОХРАНЕНИЯ КОЛИЧЕСТВА ВЫПОЛНЕНИЙ КОМАНДЫ
;
COUNT:: MOV .PNUMB,CMDCT ;СОХРАНЯЕМ ЧИСЛО
BNE 10$ ;ЕСЛИ НЕ НОЛЬ - ОК
ADD #2,@SP ;ИНАЧЕ ОШИБКА
10$: RETURN ;ВОЗВРАТ
.ENABL LSB
COM1: MOV #1,ARGS ;ЭТО ПОДПРОГРАММА COM1
BR 10$ ;...
COM2: MOV #2,ARGS ;ЭТО ПОДПРОГРАММА COM1
10$: MOV CMDCT,ARGS+2 ;КОЛИЧЕСТВО ВЫПОЛНЕНИЙ
MOV #BUFF,R0 ;БУФЕР
MOV #FMTS,R1 ;СТРОКА ФОРМАТА
MOV #ARGS,R2 ;АРГУМЕНТЫ
CALL $EDMSG ;ФОРМАТИРУЕМ СТРОКУ
CLRB @R0 ;ПРЕВРАЩАЕМ В ASCIZ
.PRINT #BUFF ;ПЕЧАТАЕМ
RETURN ;ВОЗВРАТ
.DSABL LSB
;
;ПРАВИЛА РАЗБОРА КОМАНДЫ
;
ISTAT$ ISTAT,KEYTB
STATE$ STATE
TRAN$ $DNUMB,CMD,COUNT ;ДЕСЯТИЧНЫЙ НОМЕР КОЛИЧЕСТВА ПОВТОРЕНИЙ
TRAN$ $LAMDA,CMD ;ИЛИ НИЧЕГО
STATE$ CMD
TRAN$ "COM1",EOL,,COM1,CMDSB ;КОМАНДА COM1
TRAN$ "COM2",EOL,,COM2,CMDSB ;КОМАНДА COM2
STATE$ EOL
TRAN$ $EOS,$EXIT ;КОНЕЦ СТРОКИ
STATE$ ;КОНЕЦ ТАБЛИЦЫ
CMDCT: .BLKW ;СЧЕТЧИК ПОВТОРЕНИЙ
CMDSB: .BLKW ;АДРЕС ПОДПРОГРАММЫ КОМАНДЫ
ARGS: .BLKW 2 ;БЛОК АРГУМЕНТОВ $EDMSG
BUFF: .BLKB 81. ;БУФЕР КОМАНДЫ/ВЫВОДА
FMTS: .ASCIZ /Command: COM%M, Count: %M/
PROMP: .ASCII /->/<200>
ESYNT: .ASCIZ /Syntax error/
.END START
Вот результат выполнения:
.MAC RSXLIB/LIB+COM/OBJ
.LIN COM,RSXLIB/LIB
.RU COM
->COM1
Command: COM1, Count: 1
->234COM2
Command: COM2, Count: 234
->KAKA
Syntax error
->0COM2
Syntax error
->
спасибо
для меня такое сваять проблематично:)
Что то типа такого.
вот пытаюсь собрать
?LINK-W-Undefined globals:
RMETH2
RMETH1
хотя они находятся за .WORD
- - - Добавлено - - -
Вот пример программы:
собрал-запустил-работает, спасибо ещё раз:)
осталось самое малое разобраться как оно работает и применить:)
разобраться как оно работает
В данном случае под статом CMD перечисляются команды (в кавычках), предпоследний параметр - адрес подпрограммы, последний - куда этот адрес кладется (выше по нему делается вызов подпрограммы). В общем случае, статы идут последовательно друг за другом пока токены отвечают правилам, указанным в TRAN$, так же можно указать явно следующий стат (обязательно если нужно проверить несколько вариантов совпадений на одном уровне). А вообще это проще попробовать чем объяснить - благо примеров много :)
ну общем я понимаю как оно работает:) но..... дьявол кроется в мелочах
А вообще это проще попробовать чем объяснить - благо примеров много
на CTAKAHЕ?
на CTAKAHЕ?
И там есть и в RT-11 V5.7 source kit вроде что-то было.
CTAKAH сейчас в процессе обновления, появится чуть позже.
RT-11 V5.7 source kit
наверно я что то пропустил:)
направьте на путь истинный:)
- - - Добавлено - - -
.MCALL .MODULE
.MODULE TPARS,VERSION=03,COMMENT=<Finite State Parser>,IDENT=NO,GLOBAL=.TPAR
оно?
оно?
Это сам модуль парсера. Кто его пользует - не знаю, поиском можно найти.
- - - Добавлено - - -
Вот где еще пример ипользования парсера есть - команднострочный калькулятор-конвертер (http://zx-pk.ru/threads/10718-soft-dlya-dvk-pdp11.html?p=860838&viewfull=1#post860838) из DECовского TSXа от RSX (ну собственно на СТАКАНе он тоже есть).
gfd71, это не полностью законченный пример, это скорей - библиотечная процедура, которой на вход нужна определённая инфа (примерный вид которой я показал). К сожалению, пока времени крайне мало, но в субботу смогу и проверить и нарисовать законченный пример использования.
это скорей - библиотечная процедура
это я понял:)
вот здесь возмущение
METH1: .WORD RMETH1
METH2: .WORD RMETH2
gfd71, на образе дискеты для ДВК, что я вам скидывал должен быть текстовый файл MACMIS.LST где расшифрованы ошибки при прогоне через MACRO.SAV? Если нету, его легко в архиве по оглавлению найти.
там скорее не ошибка, а ворнинг, SAV собирается
?LINK-W-Undefined globals:
RMETH2
RMETH1
если я правильно понимаю что то нужно добавить:)
Добавить процедуры, которые вызываются для команд :)
Проверил. Пару ошибок нашёл. Программа в данном варианте различает большие маленькие буквы! Если не требуется, нужна правка :)
Вроде как рабочий пример:
.TITLE TEST
.MCALL .GTLIN, .PRINT, .EXIT
.PSECT DATA,RW
CMDBUF: .BLKB 81. ;Буфер команды
PROMPT: .ASCII /CMD>/<200>
; Имена команд
CMD1: .ASCIZ /COM1/
CMD2: .ASCIZ /COM2/
.EVEN
; Описатель - команда-процедура. Окончание - нулевое слово
DESC: .WORD CMD1 ; Имя
.WORD RMETH1 ; Ссылка на процедуру
.WORD CMD2
.WORD RMETH2
.WORD 0
.PSECT CODE,RO
START: .GTLIN #CMDBUF, #PROMPT
MOV #CMDBUF, R0 ; Строка команды в формате .ASCIZ
MOV #DESC, R1 ; Дескриптор команд-процедур
CALL PARSE
.EXIT
.PSECT DATA,RW
MESS1: .ASCIZ /COM1/
MESS2: .ASCIZ /COM2/
.EVEN
.PSECT CODE,RO
RMETH1: .PRINT #MESS1
RETURN
RMETH2: .PRINT #MESS2
RETURN
;------------------------------
;
; .PSECT DATA,RW
;
;; Имена команд
;CMD1: .ASCIZ /COM1/
;CMD2: .ASCIZ /COM2/
; .EVEN
;
;; Описатель - команда-процедура. Окончание - нулевое слово
;DESC: .WORD CMD1 ; Имя
; .WORD RMETH1 ; Ссылка на процедуру
; .WORD CMD2
; .WORD RMETH2
; .WORD 0
;
; .PSECT CODE,RO
;
; MOV #CMD, R0 ; Строка команды в формате .ASCIZ
; MOV #DESC, R1 ; Дескриптор команд-процедур
; CALL PARSE
;
PARSE::
MOV R1, -(SP) ; Сохраним описатель команд
LOOP: TSTB (R0) ; Дошли до конца строки команд
BEQ EXIT ; Да - выход
CMPB (R0), #', ; Нет. Разделитель команд?
BNE NCOMMA ; Нет - дальше повторитель-команда или команда
INC R0 ; Пропуск запятой
BR LOOP ; Дальше по командной строке
NCOMMA:
CLR R3 ; Повторитель команды
DIG: CMPB (R0), #'0 ; Цифра?
BLO NDIG ; Нет - дальше пошла команда
CMPB (R0), #'9 ; Цифра
BHI NDIG ; Нет - дальше пошла команда
MUL #10., R3 ; Предыдущее*10
SUB #'0, R3 ; Минус код ASCII минус код нуля
MOVB (R0)+, R2 ; Очердной символ-цифра
ADD R2, R3 ; Плюс следующаяя цифра в коде ASCII
BR DIG ; Смотрим дальше
NDIG: TST R3 ; Повторитель задан?
BNE SCMD ; Да - ищем команду
INC R3 ; Нет - но один раз команду выполнить надо
SCMD:
MOV (SP), R1 ; Описатель команд
MOV R0, -(SP) ; Начало имени команды
LCMD: MOV (R1)+, R2 ; Имя следующей команды. Описатель закончился?
BEQ ECMD ; Да - (тут в принципе можно вставить переход на обработку ошибки)
MOV (R1)+, R5 ; Процедура, её выполняющая
MOV (SP), R0 ; Начало имени команды - для очередного сравнения
SCMP:
TSTB (R0) ; В конце строки (окончание имени команды)?
BEQ CCHK2 ; Да
CMPB (R0), #', ; Запятая (тоже окончание имени команды)?
BEQ CCHK1 ; Да
TSTB (R2) ; Имя команды в описателе закончилось (а в строке команды - нет)?
BEQ LCMD
CMPB (R0)+, (R2)+ ; Символ тот же?
BEQ SCMP ; Да, продолжаем сравнение
BR LCMD ; Нет - смотрим следующую команду
CCHK1: INC R0 ; Пропустить запятую
CCHK2: TSTB (R2) ; В строке команда закончилась. А в описателе?
BNE LCMD ; Нет - не та команды
CALL MCMD ; Да - выполнить связанную с ней процедуру
ECMD: TST (SP)+
BR LOOP
EXIT: TST (SP)+
RETURN
MCMD:
CALL $SAVAL
MLOOP: MOV R3,-(SP)
CALL (R5)
MOV (SP)+, R3
SOB R3, MLOOP
RETURN
;
;В принципе, стандартная процедура сохранения восстановления всех регистров,
;но с этим кодом процедура становится самодостаточной.
;Можно выкинуть :)
;
$SAVAL: MOV R4,-(SP)
MOV R3,-(SP)
MOV R2,-(SP)
MOV R1,-(SP)
MOV R0,-(SP)
MOV 12(SP),-(SP)
MOV R5,14(SP)
JSR PC,@(SP)+
MOV (SP)+,R0
MOV (SP)+,R1
MOV (SP)+,R2
MOV (SP)+,R3
MOV (SP)+,R4
MOV (SP)+,R5
RETURN
;----------------------------------------------------
.END START
Результат:
.RU TEST 2COM1,1COM2
COM1
COM1
COM2
.RU TEST 2COM1,0COM2
COM1
COM1
COM2
.RU TEST 2COM1,3COM2,COM3
COM1
COM1
COM2
COM2
COM2
.RU TEST 2COM1,3COm2,COM3
COM1
COM1
.
Сама процедура парсинга - нет. Появился код, демонстрирующий, как использовать :)
?LINK-W-Undefined globals:
то что вы приводите - это на уровне уже LINKа, я просто напомнил где у вас по первичному транслятору шпаргалка по обозначениям ошибок лежит. )
я просто напомнил
повторю свою благодарность:)
с ошибками разбираюсь если что по PDP-11 MACRO-11 Language Reference Manual
а тут на родном языке, так что ещё раз спасибо
а тут на родном языке, так что ещё раз спасибо
http://zx-pk.ru/threads/20444-pascal-macro11-(uknts-dvk).html?p=558147&viewfull=1#post558147
http://zx-pk.ru/threads/20444-pascal-macro11-(uknts-dvk).html?p=580988&viewfull=1#post580988
- - - Добавлено - - -
плюс я что то выдрал для себя, плюс форум, плюс огрызочки шпор которые на живую машинку на дискете для себя тащил, всё это как-бы в рамках АРХИВ+ФОРУМ разбросано.
http://zx-pk.ru/threads/20444-pascal-macro11-(uknts-dvk).html?p=642328&viewfull=1#post642328
http://zx-pk.ru/threads/20444-pascal-macro11-(uknts-dvk).html?p=693329&viewfull=1#post693329
Может кому пригодится.
Получение следующего числа псевдо-случайной последовательности.
Переведено с кода Z80, исходник в комментариях.
; Routine: Get pseudo-random number, result in R3
LA270:
MOV L5C76, R2 ; A270 LD DE,($5C76) ; Read RND SEED variable
MOV R2, R3 ; A274 LD H,E
SWAB R3
BIC #377, R3
ADD #375, R3 ; A275 LD L,$FD
MOV R2, R0 ; A277 LD A,D
SWAB R0
BIC #177400, R0 ; A278 OR A
SUB R2, R3 ; A279 SBC HL,DE
SBCB R0 ; A27B SBC A,$00
SUB R2, R3 ; A27D SBC HL,DE
SBCB R0 ; A27F SBC A,$00
; A281 LD E,A
BIC #177400, R0 ; A282 LD D,$00
SUB R0, R3 ; A284 SBC HL,DE
BHIS LA289 ; A286 JR NC,$A289
INC R3 ; A288 INC HL
LA289: MOV R3, L5C76 ; A289 LD ($5C76),HL ; Write RND SEED variable
RETURN ; A28C RET
L5C76: .WORD 123456 ; Pseudo-random seed
MacBuster
29.12.2017, 23:34
Удаление в знак протеста против действий MM
Где бы посмотреть пример работы с каталогом? Сначала получить число файлов на диске и последовательно прочитать их описатели (имена со всеми свойствами).
есть исходники DIR.SAV с комментариями по содержанию и сборке
ссылка строго временная => http://archive.pdp-11.org.ru/vid/dir.rar
Где бы посмотреть пример работы с каталогом?
Код под PDP?
Где бы посмотреть пример работы с каталогом?
Самое простое - исходники DIR иди BSTRAP.MAC от дистрибутива системы. Так же есть в библиотеке SYSLIB готовый набор подпрограмм для работы с каталогами, поиска по звездочкам итд (насчет версии RT-11 в какой появилось не уверен, но работать будет в любой после сборки). Пример на ассемблере есть в RT–11 System Macro Library Manual (http://bitsavers.trailing-edge.com/pdf/dec/pdp11/rt11/v5.6_Aug91/AA-PD6LA-TC_RT-11_System_Macro_Library_Manual_Aug91.pdf) (искать по слову GTDIR). Пример на фортране и описание подпрограммы есть в RT–11 System Subroutine
Library Manual (http://bitsavers.trailing-edge.com/pdf/dec/pdp11/rt11/v5.6_Aug91/AA-PD6MA-TC_RT-11_System_Subroutine_Library_Manual_Aug91.pdf).
MacBuster
30.12.2017, 16:50
Удаление в знак протеста против действий MM
С этого - исходников DIR - я начал, но исходников не нашёл.
??? там же (http://zx-pk.ru/threads/15587-programmirovanie-na-uknts-kak.html?p=943213&viewfull=1#post943213) прямая ссылка на архив с файлами ??? или что то не так ???
MacBuster
07.03.2018, 20:56
Удаление в знак протеста против действий MM
MacBuster, да, сначала стартует ПП.
Адрес старта определяется через регистр SEL, в результате получается 160300.
В памяти ПП в это время во все окна включено ПЗУ -- с адреса 100000 и до портов.
Затем ПП готовит память и запускает ЦП.
Дизасм ПЗУшки есть тут: http://www.emuverse.ru/wiki/%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D 1%8F:%D0%A3%D0%9A%D0%9D%D0%A6
- - - Updated - - -
; Старт ПП
160300 MOV @#172660, R4
160304 CLR R0
160306 MOV R4, SP
160310 BMI 160464
160312 BIT #000020, @#177716
160320 BEQ 160332
160332 MOV #000040, @#177716 ; Останов ЦП
160340 JSR PC, 173252
; Начало выполнения подпрограммы
173252 MOV #070000, @#177010 ; Установка адреса в регистр адреса планов: 070000 * 2 = 160000
173260 MOV #160000, R1 ; Адрес источника
173264 MOV #005305, R0
173270 MOV (R1)+, @#177014 ; Копирование двух байт из ПЗУ ПП в ОЗУ ЦП
173274 INC @#177010 ; Переход к следующему адресу
173300 SOB R0, 173270
173270 MOV (R1)+, @#177014 ; Следующая итерация цикла
173274 INC @#177010
173300 SOB R0, 173270
173270 MOV (R1)+, @#177014
173274 INC @#177010
173300 SOB R0, 173270
...
MacBuster
07.03.2018, 21:24
Удаление в знак протеста против действий MM
randomizer
05.04.2018, 23:58
Не так давно обзавёлся рабочей машинкой. Существует довольно много сборников с игрушками, а если какой нибудь готовый набор для разработки?
Лично меня интересует C и MACRO-11. Последние версии или может наилучшие, русский язык не принципиально - английского достаточно.
В 1801ВМ2 реализованы наборы комманд EIS и FIS, любопытно используются ли они C компилятором или в макроопределениях MACRO-11? Или может существуют библиотеки расчитанные на расширенный набор комманд?
А имеет ли значение какую версию RT-11 использовать?
Оказывается GNU C до сих пор поддерживает PDP-11 ! Есть ли у кого опыт использования его для компиляции?
randomizer, все свои проекты под PDP-11 я разрабатываю используя "Эмулятор RT-11" от Patron: http://zx-pk.ru/threads/24755-emulyator-rt-11.html
То есть, редактирую исходники на MACRO-11 в привычном редакторе.
Компилирую и линкую через "Эмулятор RT-11", пример командного файла: https://github.com/nzeemin/uknc-highwayencounter/blob/master/!compilelink.bat
Запускаю в своём эмуляторе UKNCBTL, файл программы заносится в образ дискеты утилитой rt11dsk: https://github.com/nzeemin/uknc-highwayencounter/blob/master/!runukncbtl.bat, активно использую встроенный отладчик.
Также иногда запускаю в эмуляторе EmuStudio от Titus: https://github.com/nzeemin/uknc-highwayencounter/blob/master/!runemustudio.bat
И уже когда практически всё готово, прошу hobot запустить на реале.
а если какой нибудь готовый набор для разработки?
к сожалению движок не требующий предварительной загрузки доп.ПО состоящий из редактора спрайтов + библиотеки процедур и функций для работы со спрайтами и шрифтами + шапка (шапки) для исходников программ на MACRO-11
--- Зеленоградская разработка для УК-НЦ + всё связанное с ней ПО утеряно.
В данный момент есть несколько вариантов требующие предварительного запуска специализированного ПО.пример.-UKLOAD.SAV (http://zx-pk.ru/threads/13568-diskety-s-softom-dlya-uknts.html)
, это стандартный набор для УЧЕБНОГО КЛАССА (один из самых первых учитывая ориентированность на
НГМД-6022 )ю
- - - Добавлено - - -
А имеет ли значение какую версию RT-11 использовать?
младше чем RT-11 v5.4G SJ - нет смысла использовать. Есть несколько специализированных
отечественных сборок монитора (версия RT-11CD и RT-11QQ > первая строго для УК-НЦ, вторая
очень стабильна на УК-НЦ, но это старые системы.
Проверка на совместимость (возможность совместного запуска "работы"),наверное в диапазоне
версий 5.0 и до самой последней RT-11.
Оказывается GNU C до сих пор поддерживает PDP-11 ! Есть ли у кого опыт использования его для компиляции?
http://archive.pdp-11.org.ru/ukdwk_archive/ukncbtlwebcomplekt/Cc_rafos_UKNC/
http://archive.pdp-11.org.ru/ukdwk_archive/ukncbtlwebcomplekt/Other/FCU_Shurick_inc/READE.html
А имеет ли значение какую версию RT-11 использовать?
Последняя, принятая Честными военпредами - RT11SJ V5.00 ( 1988 г. )
Если есть интерес повылавливать мутные баги самописателей ОС - начинайте с V5.02
randomizer
06.04.2018, 16:51
А какие существенные отличия есть между версиями?
Особенно с точки зрения разработчика? Да и в принципе, чем может быть полезна RT-11 кроме обеспечения работы с файлами и запуска программ?
А какие существенные отличия есть между версиями?
Особенно с точки зрения разработчика?
Системный драйвер от SJ V5.00 не загружает V5.07
Да и в принципе, чем может быть полезна RT-11 кроме обеспечения работы с файлами и запуска программ ?
Она обеспечивает взаимозаменяемость железа на всей линейке DEC-16 бит.
Т.е. где-то всего 32 Кбайт ОЗУ + аппаратный терминал + магнитофон с ДУ, а где-то дискеты пристроены, а где-то и IDE винчестер.
А в др. месте - вообще нет терминала - только сканируемый на видеовывод участок ОЗУ ( как в БК11, Э-85 ).
И могут быть самые разные клавы, в т.ч. экстравагантные .
Системный драйвер от SJ V5.00 не загружает V5.07
Отлично загружает даже от V4.0.
Все дело в кривых руках: conflicting sysgen options? - да фигня, поправлю оффсет 60 и будет работать (разработчики-то идиоты, просто так проверку сделали), ух-ты, в .DRDEF видно 240 вначале - это ж NOP, сделаю-ка .=.-2 - вот экономии будет! (примеры реальные - с этого форума взяты) итд...
А если следовать руководствам разработчика, то как-то все работает и проблем не наблюдается :)
А вот наоборот - вполне возможна проблема в виду отсутствия нужного функционала (точек входа LOAD/UNLOAD, поддержки регионов для драйвера итд). Но с точки зрения разработчика (вопрос по сути про это был) проблемы нет :)
Отлично загружает даже от V4.0.
Все дело в кривых руках: conflicting sysgen options? - да фигня, поправлю оффсет 60 и будет работать (разработчики-то идиоты, просто так проверку сделали), ух-ты, в .DRDEF видно 240 вначале - это ж NOP, сделаю-ка .=.-2 - вот экономии будет! (примеры реальные - с этого форума взяты) итд...
А если следовать руководствам разработчика, то как-то все работает и проблем не наблюдается :)
А вот наоборот - вполне возможна проблема в виду отсутствия нужного функционала (точек входа LOAD/UNLOAD, поддержки регионов для драйвера итд). Но с точки зрения разработчика (вопрос по сути про это был) проблемы нет :)
Т.е. господин form предлагает на каждый маразматический патч самописцев ядра ОС перекомпилировать дрова от V5.00, которые по 20 лет работали в оборудовании, принятом еще Честными военпредами ?
перекомпилировать дрова
В том и суть - ничего не надо перекомпилировать если драйвер писался изначально нормально (и его потом руками не "совмещали"). Вопрос был про с точки зрения разработчика - так вот с точки зрения разработчика разницы не будет в этом плане в принципе. Но ясен пень, если один криво написанный драйвер (а то и вовсе написанный правильно, но потом шаловливыми ручками "поправленный") вдруг перестал работать (а несколько сотен других прекрасно работают), то идиоты - разработчики системы, а не криворукие писатели/передельщики драйвера...
Проблема еще и том, что нет возможности верифицировать контент RT11SJ крайних версий - по экстремально элементарной причине отсуствия Бренд 5.25 привода. Выданный пару недель назад МС5310 я сразу отправил к собирателям ценностей , т.к. архивные дискеты его не потерпят.
Как считаю архив - порадую общественность дезасмом MACRO-11 и тестером МС1201.04, и еще ИксТри чем.
randomizer
08.04.2018, 14:04
На самом деле, задавая вопрос о версии RT-11 я подразумел RT-11 на УКНЦ и только. Просто возможно что с более поздними версиями доступны более мощные инструменты разработки, например C круче оптимизируещий код, в таком духе.
А в целом, гланое что было больше доступого ОЗУ для программы пользователя. А, да, ещё поддержка дат третьго тысячелетия.
- - - Добавлено - - -
Для начала, всё же буду пробовать задействовать gnu C, всё таки только у современных компиляторов наиболее мощные оптимизаторы.
например C круче оптимизируещий код
C круче (чем DECUS) оптимизирующий код есть, но он генерит только программы для XB/ZM/ZB/ZM мониторов, то есть для УКНЦ никак.
А в целом, гланое что было больше доступого ОЗУ для программы пользователя
Чтобы было больше ОЗУ нужно писать на ассебмлере (благо он достаточно простой). Был язык PL-11 - похож на паскаль, но по сути тот же ассемблер с элементами высокого уровня, но к сожалению нашел только описание, компиляторов не видел после 80 годов.
, да, ещё поддержка дат третьго тысячелетия.
Даты в RT-11 поддерживаются до 2099 года. Дальше если только самостоятельно изобретать что-то :)
Вроде даже кто-то делал что-то на эту тему.
gnu C
С этим сложно. Он есть только как кросс-компилятор, позволяющий компилить программы для 2BSD, то есть УКНЦ опять мимо.
у современных компиляторов наиболее мощные оптимизаторы
Тормоза в УКНЦ/БК настолько ужасны, что может помочь разве что ручная правка кота. Причем капитальная.
Вот, например, я писал где-то здесь на форуме, что БК11М имеет быстродействие 276 т.рег-рег.
Это значит, что переслать слово из адреса Х ДОЗУ в адрес У ДОЗУ можно не быстрее 90 т. в 1 сек.
В УКНЦ надо померить - если есть желающие, могу опубликовать текст теста, понадобится секундомер ( есть в любом сотовом телефоне )
могу опубликовать текст теста
Ну так тема есть на предмет измерения быстродействия - туда его!
На самом деле, задавая вопрос о версии RT-11 я подразумел RT-11 на УКНЦ и только. Просто возможно что с более поздними версиями доступны более мощные инструменты разработки, например C круче оптимизируещий код, в таком духе.
А в целом, гланое что было больше доступого ОЗУ для программы пользователя. А, да, ещё поддержка дат третьго тысячелетия.Так вот, как раз на УКНЦ с ее ВМ2 новые ОС только уменьшаю доступное пользователю ОЗУ. Для того, чтобы получить больший объем ОЗУ нужен процессор с ДП и бОльшим объемом памяти на борту, чтобы запустить монитор XM, который даст виртуальной задаче хоть полные 64К ОЗУ, а при грамотном использовании специфических средств XM и больше. Чего на УКНЦ нет и не будет. То есть, лучший выбор для УКНЦ по этим параметрам - RT-11 SJ V 5.00-5.01. Только вот с датой будет пролёт. А выбрать что-то с поддержкой правильных дат - так памяти пользователя будет заметно меньше.
Ну, и про инструменты разработки. Все компиляторы, работающие под RT-11, спокойно работают под любой ее версией, по крайней мере начиная с 4.х - точно. Да, макробиблиотека для MACRO-11 привязана к версии ОС, но это актуально только при программировании драйверов внешних устройств, так сказать, прикладные системные вызовы изменились очень мало и, если не пользоваться чем-то слишком продвинутым, полученная программа также заработает под любой RT-11.
Тест быстродействия , можно набирать в любом месте ОЗУ, или даже прошить в ПЗУ.
Сначала запустить такой вариант - будет работать примерно минуту :
001000 : 012700 000100 005001 010203 010203 010203 010203 010203
001020 : 010203 010203 010203 077111 077013 000000
Потом - его мод - отличие всего в 1 слове , займет примерно 10 сек.:
001000 : 012700 000100 005001 010203 010203 010203 010203 010203
001020 : 010203 010203 010203 077101 077013 000000
Измерить результат в секундах по останову.
randomizer
08.04.2018, 15:33
Похоже что то не так с тестом. Он не останавливается, а после нажатия стоп прерывается по адресу 001336
https://image.ibb.co/ePJV1c/Screenshot_20180408_151312.png
Похоже что то не так с тестом. Он не останавливается
Может, подождать 3 мин ?
Текст верный...
randomizer
08.04.2018, 16:50
Хм, ждал 10 минут пока что то произойдёт запустив первый вариант, и 5 минут второй.
А что должно произойти по завершении теста? Возврат в отладчик?
Возврат в отладчик?
Ладно, припишите с 1032 адреса " 012737 000101 177566 000777 " - напечатать "А" и зависнуть.
Видимо, в 4-м векторе было некорректное содержание, и ход программы направлялся в Лес.
randomizer
08.04.2018, 18:02
Ничего не изменилось https://image.ibb.co/fPf5jx/Screenshot_from_2018_04_08_17_30_16.png
- - - Добавлено - - -
gnu C
С этим сложно. Он есть только как кросс-компилятор, позволяющий компилить программы для 2BSD, то есть УКНЦ опять мимо.
А вот здесь (http://ancientbits.blogspot.com/2012/07/programming-barebones-pdp11.html) человек описывает процесс получения исполняемого кода используя GCC. Дальше, в коментариях он пишет что и сишную библиотеку он собрал, правда пользы от нее мало оказалось - после линковки с функцией spintf обнаружилось что код не влазит в адресное пространство PDP11 :)
- - - Добавлено - - -
у современных компиляторов наиболее мощные оптимизаторы
Тормоза в УКНЦ/БК настолько ужасны, что может помочь разве что ручная правка кота. Причем капитальная.
Как минимум использовать для прототипирования, с последующим добавления асемблеровских вставок в борьбе за такты начиная с критичных мест.
Ничего не изменилось
А запускать с 1000 адреса пробовали ?
А вот здесь человек описывает процесс получения исполняемого кода используя GCC.
Там нет получения исполняемого кода RT-11.
Там генерится (как я и говорил) UNIXовый a.out, а потом сторонней утилитой преобразуется в LDA формат чтобы грузиться в голый эмулятор (без операционной системы). Можно записать этот код на перфоленту и грузить с нее на живой машине которая поддерживает загрузку с нее. Ну в принципе, я писал утилиту для загрузки LDA файла из под RT-11 (разумеется сама система в памяти при этом уничтожается), есть подобная и в комплекте РАФОСа.
Если же говорить об операционной системе, то данный метод можно применить для написания программ под XXDP где используется LDA формт, а роль операционной системы минимальна :)
Так как привез из деревни УКНЦ решил запустить тест.
Первый вариант: 01 мин. 03 сек., с учетом моей реакции
Второй вариант: 00 мин. 15 сек., с учетом моей реакции
Все на реальном железе.
Первый вариант: 01 мин. 03 сек., с учетом моей реакции
Второй вариант: 00 мин. 15 сек., с учетом моей реакции
Считаем :
Чистый ход 48 сек, исполнено 33.55 млн рег-рег, итого конвеерное быстродействие - около 700 т. рег-рег
Команды SOB 4.19 млн шт. за 15 сек - 280 т. шт./1 секунда ( 1 команда SOB физически в проце выполняется отдельно в 2 машинструкциях - вычитает 1 и ветвится ).
randomizer
08.04.2018, 21:05
А запускать с 1000 адреса пробовали ?
Обижаете. Делаю 1000 <ИСП>, машинка перестаёт реагировать на клавиши, ничего не дождавшись жму <СТОП>
- - - Добавлено - - -
Там генерится (как я и говорил) UNIXовый a.out, а потом сторонней утилитой преобразуется в LDA формат чтобы грузиться в голый эмулятор (без операционной системы). А чисто в теории, что нужно чтобы код запускался под RT-11? Возможно ли сделать утилиту которая будет подготавливать код?
Возможно ли сделать утилиту которая будет подготавливать код
Формат LDA простой - ничего сложного не будет
А чисто в теории, что нужно чтобы код запускался под RT-11?
Нужно собрать программу в формате SAV.
Возможно ли сделать утилиту которая будет подготавливать код?
В принципе можно сделать конвертер a.out в SAV, но смысла особого не будет: программу нельзя будет собрать с библиотеками (она ведь уже собрана), соответственно системные вызовы и подпрограммы будут недоступны, а без этого нет и смысла в запуске программы в системе.
Разве что написать нужные библиотеки вручную на том же gas, но тогда проще с самого начала писать на MACRO-11 :)
добрый вечер.
подскажите как правильно вернуться из TRAP 4 в тело программы ?
подскажите как правильно вернуться из TRAP 4 в тело программы ?
Сохранить програмные PC и PS из @SP и 2(SP) для исследования, записать новые для возврата в точку восстановления, сделать RTI.
Если конечно речь идет о прерывании по 4 вектору, а не о команде "TRAP 4" - там ответ очевиден :)
как правильно вернуться из TRAP 4
Из за чего возможен TRAP 4?
Сохранить програмные PC и PS из @SP и 2(SP) для исследования, записать новые для возврата в точку восстановления, сделать RTI.
куда их можно-нужно сохранить?
вектор конечно
пример было бы здорово)
я поместил в 4 адрес 2000 адрес а в 6 240, подсмотрел в блокноте старых ремонтников И2
Из за чего возможен TRAP 4?
при обращении к устройству нерабочему, в моём случае И2 плата, программка нужна для ремонта последней
Из за чего возможен TRAP 4?
Вероятные причины возникновения :
1. Неисправность МПИ, или переразгон проца.
2. Фокусы с ЕЦЦ 1801ВП1-119
3. Отсуствует регистр на МПИ, или идет отладка такового.
*
Пример поиска регистра 177714 на УКНЦ, ЦП :
001000 : 013727 000004 000000 013727 000006 000000 012737 001100
001020 : 000004 012737 000340 000006 013727 177714 000000 032737
001040 : 000200 177564 001774 012737 000100 177566 013737 001004
001060 : 000004 013737 001012 000006 000000
001100 : 013737 001004 000004 013737 001012 000006 032737 000200
001120 : 177564 001774 012737 000101 177566 000000
Если есть регистр 177714 по чтению, напечатает "@", а если нет - "А". При этом стек углубится на 4 байта ( зависит от железа проца и М-ЭВМ ).
Что конкретно делает программа :
1.Сохраняет текущие значения вектора 4 в словах 1006 и 1012
2.Записывает в 4 слово адрес прерывания по 4 вектору ( 1100 ), и слово состояния проца при этом ( 340 - аппаратные прерывания пользователя запрещены )
3.Читает слово 177714, пытаясь скопировать его содержимое в слово 1034. Если это удается, восстанавливает сохраненные значения 4 и 6 слов, рисует на терминале символ "@".
4.Если происходит прерывание в адрес 1100, то программа восстанавливает содержание 4 и 6 слов, и рисует на терминале символ "А".
Указатель стека R6 при этом находится на минус 4 позиции относительно входа в данную программу.
- - - Добавлено - - -
Установка R6 в классические "001000"
012706 001000
*
Тест наличия регистра 177714 на МПИ :
001000 : 012737 001100 000004 005000 013727 177714 000000 077004
001020 : 012737 000007 177566 000137 001006
001100 : 012706 001000 000137 001000
В начале программы в 4 -й вектор записывается слово 1100 - куда передать управление при зависании МПИ.
Потом очищается R0 и делается чтение регистра 177714 в слово 1014, при достижении 65536 успешных попыток чтения воспроизводится звонок ( кот 7 ) на терминале, далее управление передается на адрес 1006.
В адресе 1100 R6 ставится на место - на слово 001000, и программа перезапускается.
Вероятные причины возникновения :
1. Неисправность МПИ, или переразгон проца.
2. Фокусы с ЕЦЦ 1801ВП1-119
3. Отсуствует регистр на МПИ, или идет отладка такового.
Вопрос был не про это. От чего возникает Trap4 в принципе - я прекрасно знаю. Вопрос был о причине у спрашивающего - в зависимости от этого может быть разная реакцию - не тупо в лоб ответом - возврат из любого прерывания - RTI. Который в общем случае - неверный
- - - Добавлено - - -
При этом стек углубится на 4 байта
Что то мне на память не приходят варианты, когда при прерывании в стек не кладутся два слова - PC и PSW до прерывания
Что то мне на память не приходят варианты, когда при прерывании в стек не кладутся два слова - PC и PSW до прерывания
Восстановление питания ;)
Правда прерыванием его можно назвать только с натяжкой :)
Ну или если считать от потери питания - тогда будет полноценное прерывание.
Восстановление питания
Исходная фраза:
зависит от железа проца и М-ЭВМ
И как поведение системы при восстановлении питания завист от проца и ЭВМ?
Исходная фраза
Выше не читал - времени мало :)
Выше не читал
Значит, вопрос актуален. Мне действительно интересно - есть ли в реакции на прерывания на семействе совместимых (и не очень) с PDP-11 особенности, связанные с нестандартным поведением - то есть когда на стек кладутся не два слова (PC, PSW) и/или не в том порядке ((SP) -> PC, 2(SP) - PSW).
Про особенности при наличии двух или трёх режимов работы процессора (kernel, supervisor, user) - знаю.
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot