- Тонкости и толстости ВМ1
-
? nzeemin - 04.01.2010 15:04
Вопрос к знатокам процессора 1801ВМ1.
Пытаюсь разобраться в тонкостях работы, в частности интересуют вопросы:
1. Как такового пультового режима в ВМ1 нет (бит 8 PSW не задействован). Но зато используются биты 10 и 11 PSW, по всей видимости -- для маскирования прерываний. Хотелось бы знать подробно и точно -- что маскируется и в каких случаях.
2. В ВМ1 есть встроенные регистры по адресам 177700 (регистр режима), 177702 (регистр адреса прерывания), 177704 (регистр ошибки). Информации по ним практически никакой, а хотелось бы.
-
? nzeemin - 04.01.2010 16:53
Упоминание регистров 177700, 177702, 177704 есть тут: http://pdp-11.ru/mybk/textbk/FL11M.TXT
Про 177700 там говорится:
"установка битов '0' или '1' приводит к зависанию, а установка бита 2 вводит машину в состояние, аналогичное команде WAIT".
-
? anonymous - 04.01.2010 18:37
Бит 8 - это как пятая нога приказала, у ВМ2 он разработчиками от балды применен, так же, как и соответствующий ему бит 3 в SEL1 у ВМ1. По стандарту технологическая мода процессора обратна коду моды супервизора в регистре состояния и обозначается как зарезервированная DEC комбинация бит 12..15 PSW. Биты 8..10 PSW по стандарту должны позволять самому процессору считывать свой номер в многопроцессорной системе, либо, при использовании общего стека, другим процессорам понять, кто намусорил туда своим PSW.
В пультовый режим процессор ВМ1 переходит, устанавливая бит 3 в регистре SEL1, затем сохраняет содержимое PSW и PC в регистрах копии PSW и PC, это 0177676 и 0177674 соответственно, после чего переходит в пультовую программу по одному из векторов, в зависимости от причины, вектор SEL1[15..8]+2 - по сигналу IRQ1/HALT или команде HALT, SEL1[15..8]+6 - по двойному зависанию, SEL1[15..8]+012 - по ошибке передачи вектора, SEL1[15..8]+0 содержит безусловный переход на стартовый код, потому адреса векторов сдвинуты на 2. Для выхода из пультовой программы используются команды START и STEP, с кодами 012 и 016 соответственно, аналогичные по действию командам RTI и RTT, но по наличию сигнала IRQ1, т.е. если IRQ1 установлен, то выход по STEP загружает PC и PSW из регистров копии, сбрасывает бит 3 в SEL1 и выполняет одну инструкцию, после чего возвращается в пульт, а START перед выполнением инструкции анализирует IRQ1 и возвращает управление в пульт пти его наличии незамедлительно.
Бит 10 в PSW маскирует все прерывания, кроме прерывания по ошибке обращения к каналу, которое модифицирует таким образом, что при обращении к несуществующей ячейке выполняется повторный выход в пультовую программу по вектору SEL1[15..8]+2. Бит 11 в PSW маскирует прерывания по сигналу IRQ1.
Регистры 0177700..0177705 - рудименты процессора 1801ВЕ1, их описание ищите в документации на соответствующий процессор. Биты 0,1,2 регистра режима используются для синхронизации пуска подчиненных процессоров главным процессором в многопроцессорной системе, т.к. блок регистров каждого процессора доступен на шине любому другому процессору вне зависимости от состояния процессора-хозяина.
-
? Alex_K@ - 04.01.2010 19:25
anonymous, а существуют ли какие-либо ограничения на установку и сброс разрядов 10 и 11 в PSW на ВМ1? Ясно, что по команде MTPS их не установить, т.к. она работает только с младшим байтом. А вот возможно ли их установить при исполнении прерываний USER (TRAP4,TRAP10,BPT,IOT,ACLO,EMT,TRAP,IRQ2 и VIRQ) или командами RTI и RTT? Существуют ли ограничения на исполнение START и STEP (ну типа в определенном диапазоне адресов или только при установленном бите 10) или нет?
-
? anonymous - 04.01.2010 20:57
Через 4й вектор они и так устанавливаются в 11й мащине при нажатии СТОП, можете проверить содержимое векторов, расставляемых ее мониторами.
-
? Alex_K@ - 04.01.2010 21:08
Да, там собственно 10-й бит стоит во всех векторах с 4-го по 34-й. А сам процессор его действительно устанавливает? И устанавливаются ли 10-й и 11-й биты по RTI и RTT?
-
? Александр Тишин@ - 04.01.2010 21:42
Если память меня не подводит, то на реальной БК эти биты могла изменять RTT, но не RTI. Но может быть, я чего-то не так делал.
Кстати, а какие начальные значения в 177700-05? RDC их использует в своей антиотладке, с неправильными не работает ничего :(
(дока по 1801ВЕ1 не находтся просто так, увы)
-
? anonymous - 04.01.2010 21:43
Нет, RTI & RTT их не трогают, а START & STEP загружают, сейчас проверил на живом ВМ1, загнав в стек и выдав возврат из прерывания, затем в моде USER записал CRS & CPC и выдал START & STEP, биты установились в соответствии с источником.
-
? anonymous - 04.01.2010 21:45
У меня описания на 1801ВЕ1 нет, т.к. за 14 листков ТУ платить 8000 руб мне жаба не позволяет.
-
? Александр Тишин@ - 04.01.2010 22:00
Жёстко .. Одна книжка из стандарта МПЕГ в два раза дешевле стоит :)
Еслу вас сейчас реал под рукой - не затруднит посмотреть значения регистров?
-
? anonymous - 04.01.2010 22:19
0177700/ 177740
0177702/ 177777
0177704/ 177440
-
? Александр Тишин@ - 04.01.2010 23:13
Спасибо!
К сожалению, видимо ещё баги остались ... буду продолжать отлаживаться
-
? anonymous - 04.01.2010 23:40
Не забывайте еще про странное свойство регистра 0177702 - при записи в него любого значения, он пропадает из адресного пространства до перезапуска процессора.
-
? x - 05.01.2010 01:17
...совецкая электроника настолько сурова... 8-]
-
? SKcorp. - 07.01.2010 17:00
Не до перезапуска.
В Бейсике появляется после конца проги.
Видимо запись и сразу чтение вырубает его, если вставить между ним команду, то все ОК.
¤
Где-то было про загрузку ДВК аналогичное, там вначале вставляли то-ли NOP, то-ли RTI,
иначе не грузилось.
-
? Patron - 03.02.2011 12:16
У меня есть ещё пара вопросов к знатокам реальных осцилограмм шинных циклов 1801ВМ1:
1. Использует ли 1801ВМ1 циклы модификации ( DATIO ) при обращении к операнду-приёмнику таких команд, как INC, ADD, SUB ?
2. Использует ли 1801ВМ1 младший разряд адреса при выводе байта или всегда пишет так же, как и читает - только полными словами ?
-
? anonymous - 03.02.2011 13:45
Patron, ВМ1 выполняет стандартные циклы QBUS.
SKcorp. В ДВК BR вставляется в загрузчик с шаманскими целями, и это касается только ВМ3. А какой программой бейсика удается восстановить отклик регистра? Продемонстрируйте код, пожалуйста, т.к. может мы с вами тогда документацию сможем дополнить. Если существует условие, кроме ресета, о нем никто не знает... Сейчас на двух ВМ1 пошаманил, один в ДВК-1, другой в БК0010 - безрезультатно. (Извините, что через год заметил сообщение.
-
? anonymous - 03.02.2011 13:48
P.S. И с самим ВМ3 это косвенно связано, если не использовать кривые селфтесты из 134й пзу - запускается загрузчик без лишних команд.
-
? Patron - 03.02.2011 14:18
anonymous - У Вас, похоже есть под рукой ДВК-1.. Большая просьба - запустите на ней утилиту определения скорости вывода на терминал CPS.SAV ( http://zx.pk.ru/attachment.php?attachmentid=24669 ). Я сейчас эмулирую ДВК-1 и столкнулся с тем, что при ограничении скорости вывода на эмулируемый терминал до теоретически правильных значений - получается примерно на 50% быстрее, чем нужно для правильной скорости игр типа XONIX.
-
? anonymous - 03.02.2011 16:20
$./vts1
Virtual tape server, $Revision: 2.3.1.5 $
Running command stty -F /dev/ttyS1 19200 cs8
Tape records are:
0 791323.vts
Opening port /dev/ttyS1 .... Port open
@175000G
RT-11FB (S) V05.07
?KMON-F-File not found DK:STRTFB.COM
.sh con
RT-11FB (S) V05.07
Booted from FN0:RT11FB
USR is set SWAP
EXIT is set SWAP
KMON is set NOIND
MODE is set NOSJ
TT is set NOQUIET
ERROR is set ERROR
SL is set OFF
EDIT is set KED
FORTRAN is set FORTRA
KMON nesting depth is 3
CLI is set DCL, CCL, UCL, NO UCF
LSI 11 or PDP 11/03 Processor
56KB of memory
50 Hertz System Clock
Device I/O time-out support
System job support
FPU support
Extended unit support
.r cpseng
CPS - CHECK TERMINAL OUTPUT SPEED
PRESS ANY KEY TO EXIT
CPS: 1736
PROGRAM COMPLETED
-
? anonymous - 03.02.2011 16:23
На "стандартные" 9600 с 19200 не охота перепаивать перемычки лишний раз, плата уж больно старая и красивая :)
-
? Patron - 03.02.2011 18:02
Роскошно!
Понятно, что на скорости 9600 - CPS будет = ~870.
Это в точности равно скорости синхронного последовательного интерфейса с длиной посылки 11бит.
Только уточните - какая использовалась терминальная аппаратура.. Похоже, что у Вашей ДВК-1 в качестве терминала подключена РС, а со стороны ДВК (если я правильно понял) - подключение к последовательному приёмопередатчику на 1801ВП1-35.
...
...
Насчёт обсуждения в начале темы - у меня сильные сомнения в истинности некоторых прозвучавших утверждений:
1. Что бит 10 в PSW маскирует все прерывания, кроме прерывания по ошибке обращения к каналу.
--- Когда я сделал так в эмуляторе ДВК-1 - машина потеряла способность общаться с терминалом в режиме пульта. Не зря же в коде ПЗУ эмулятора пульта - одновременно с битом 10 PSW всегда устанавливаются биты PSW 5,6 и 7, запрещающие внешние прерывания. В результате - содержимое PSW в HALT-моде 1801ВМ1 почти всё время = 02340
2. Что загрузка вектора USER-моды может установить бит 10 PSW, но возврат по RTI очистить этот бит не может.
--- Весьма похоже, что все события USER-моды 1801ВМ1 ( кроме команд START и STEP ) изменяют только младший байт PSW.
-
? anonymous - 03.02.2011 18:39
PC у меня никогда небыло и, надеюсь, не будет. 1801ВП1-035 стоит на самой плате процессора ДВК-1, в качестве терминала подключил и-нетовскую машину сразу для снятия лога.
1) Что бит маскирует все прерывания написано в заводской документации на процессор.
2) Изменяется он при смене режима, которая происходит у БКшки при нажатии на СТОП, т.е. для процессора у нее 4й вектор отрабатывается уже внутри прерывания по останову. Зачем оно нужно - не представляю, т.к. маскирование IRQ1 у нее реализуется записью в 12 бит SEL1. В коде монитора это более нигде не используется, насколько помню.
-
? anonymous - 03.02.2011 18:41
「-- Когда я сделал так в эмуляторе ДВК-1 - машина потеряла способность общаться с терминалом в режиме пульта. 」 - а это с какого перепугу? Пулэтовая пзу прерываниями не пользуется никаким образом.
-
? Patron - 03.02.2011 22:31
Правда Ваша - ошибка была в эмуляторе.
...
Однако, насчёт 10-го бита - есть ещё два вопроса, которые хотелось бы прояснить.
1. Могут ли при установленном 10-м бите PSW выполняться команды типа IOT, BPT или TRAP.
2. Сохраняется ли копия старшего байта PSW ( а значит и 10-й бит ) в стеке при выполнении этих команд. Учитывая, что RTI старший байт PSW из стека не извлекает - его присутствие там не обязательно, хотя и вполне возможно.
Для проверки я написал небольшой тест - VM1S1.SAV ( http://zx.pk.ru/attachment.php?attachmentid=24726 )
У меня в эмуляторе этот тест выдаёт следующее:
-----------------------------------------
.r vm1s11801VM1 System test 1
=====================
177716/160001
PSW/000010
..Press <AnyKey>.. 18
Interrupts count: 1
Mov #357, @#016
BPT
PSW/000357
Mov #2001, @#016
BPT
PSW/000001
Mov #2002, @#177676
START
PSW/002002
..Press <AnyKey>.. 00
Interrupts count: 0Program completed.
¤
-----------------------------------------
Первое ожидание <AnyKey> происходит с разрешёнными прерываниями и прерывается сразу после нажатия на любую клавишу.
Второе ожидание <AnyKey> происходит с установленным 10-м битом PSW и у меня в эмуляторе уже нажатиями не прерывается.
Самое интересное - строчка после "START". Там выводится из стека содержимое PSW, сохранённое командой IOT, выполненной при установленном командой START 10-м бите PSW.
На данный момент, при установленном 10-м бите PSW - мой эмулятор процессора 1801ВМ1 позволяет команде IOT 1) выполниться и 2) сохранить в стеке старший байт PSW.
А как ведёт себя настоящий 1801ВМ1 ?
-
? Patron - 03.02.2011 22:34
Правда Ваша - ошибка была в эмуляторе.
...
Однако, насчёт 10-го бита - есть ещё два вопроса, которые хотелось бы прояснить.
1. Могут ли при установленном 10-м бите PSW выполняться команды типа IOT, BPT или TRAP.
2. Сохраняется ли копия старшего байта PSW ( а значит и 10-й бит ) в стеке при выполнении этих команд. Учитывая, что RTI старший байт PSW из стека не извлекает - его присутствие там не обязательно, хотя и вполне возможно.
-
? Patron - 03.02.2011 22:35
Для проверки я написал небольшой тест - VM1S1.SAV ( http://zx.pk.ru/attachment.php?attachmentid=24726 )
У меня в эмуляторе этот тест выдаёт следующее:
...
.r vm1s1
1801VM1 System test 1
=====================
177716/160001
PSW/000010
..Press <AnyKey>.. 18
Interrupts count: 1
Mov #357, @#016
BPT
PSW/000357
Mov #2001, @#016
BPT
PSW/000001
Mov #2002, @#177676
START
PSW/002002
..Press <AnyKey>.. 00
Interrupts count: 0
Program completed.
-
? Patron - 03.02.2011 22:38
Для проверки я написал небольшой тест - VM1S1.SAV ( http://zx.pk.ru/attachment.php?attachmentid=24726 )
-
? Patron - 03.02.2011 22:41
У меня этот тест выдаёт следующее:
.r vm1s1
1801VM1 System test 1
=====================
177716/160001
PSW/000010
..Press <AnyKey>.. 18
Interrupts count: 1
Mov #357, @#016
BPT
PSW/000357
Mov #2001, @#016
BPT
PSW/000001
Mov #2002, @#177676
START
PSW/002002
..Press <AnyKey>.. 00
Interrupts count: 0
Program completed.
-
? Patron - 03.02.2011 22:48
Первое ожидание <AnyKey> происходит с разрешёнными прерываниями и прерывается сразу после нажатия на любую клавишу.
Второе ожидание <AnyKey> происходит с установленным 10-м битом PSW и у меня в эмуляторе уже нажатиями не прерывается.
Самое интересное - строчка после "START". Там выводится из стека содержимое PSW, сохранённое командой IOT, выполненной при установленном командой START 10-м бите PSW.
На данный момент, при установленном 10-м бите PSW - мой эмулятор процессора 1801ВМ1 позволяет команде IOT 1) выполниться и 2) сохранить в стеке старший байт PSW.
А как ведёт себя настоящий 1801ВМ1 ?
-
? Patron - 03.02.2011 23:01
Самое интересное - строчка после "START". Там выводится из стека содержимое PSW, сохранённое командой IOT, выполненной при установленном командой START 10-м бите PSW.
На данный момент, при установленном 10-м бите PSW - мой эмулятор процессора 1801ВМ1 позволяет команде IOT 1) выполниться и 2) сохранить в стеке старший байт PSW.
А как ведёт себя настоящий 1801ВМ1 ?
-
? Patron - 03.02.2011 23:02
177716/160001
PSW/000010
..Press <AnyKey>.. 18
Interrupts count: 1
Mov #357, @#016
BPT
PSW/000357
Mov #2001, @#016
BPT
PSW/000001
Mov #2002, @#177676
START
PSW/002002
..Press <AnyKey>.. 00
Interrupts count: 0
Program completed
-
? anonymous - 04.02.2011 15:31
.r vm1s1
1801VM1 System test 1
=====================
177716/160001
PSW/000010
..Press <AnyKey>.. 00
Interrupts count: 0
Mov #357, @#016
BPT
PSW/000357
Mov #2001, @#016
BPT
PSW/000001
Mov #2002, @#177676
START
PSW/002002
..Press <AnyKey>.. 00
Interrupts count: 0
Program completed.
-
? anonymous - 04.02.2011 15:32
Странно, форум не работает, не могу запостить лог
.r vm1s1
1801VM1 System test 1
=====================
177716/160001
PSW/000010
..Press <AnyKey>.. 00
Interrupts count: 0
Mov #357, @#016
BPT
PSW/000357
Mov #2001, @#016
BPT
PSW/000001
Mov #2002, @#177676
START
PSW/002002
..Press <AnyKey>.. 00
Interrupts count: 0
Program completed.
-
? anonymous - 04.02.2011 15:32
Странно, форум не работает, не могу запостить лог
-
? anonymous - 04.02.2011 15:33
Три раза постил - ноль реакции, хозяин сайта еще жив тут?
-
? anonymous - 04.02.2011 15:35
Вот тут смотрите http://qbus.narod.ru/0.txt
-
? anonymous - 04.02.2011 15:41
При втором запуске на <press any key> шлепал по пробелу по 1 разу.
-
? Вольк - 04.02.2011 17:36
anonymous, это антиспам фильтр срабатывал, как доберусь до большого компа, подкручу его.
-
? Patron - 04.02.2011 19:27
Супер!
На этот раз я угадал с правильной эмуляцией - все прерывания USER-моды 1801ВМ1 ( и аппаратные и программные ) сохраняют оба байта PSW, но при этом загружают из вектора (при входе) и восстанавливают из стека (при выходе) только младший байт.
...
Есть ещё пара тонких аспектов работы 1801ВМ, которые не отслеживаются официальными тестами:
1. Читает ли команда MFPS значение бита T ?
2. Сохраняется ли отложенный статус T-Трапа, если сразу после выхода из прерывания по RTT с установленным битом T - обслуживается ожидавшее прерывание. Понятно, что это прерывание при входе очищает бит T, а при выходе - восстанавливает из стека. Но завершается оно уже по RTI - когда же будет T-Трап - ДО первой команды или после ?
...
Для проверки этих двух моментов я написал небольшой тест: TTST.SAV ( http://zx.pk.ru/attachment.php?attachmentid=24737 ).
-
? Patron - 04.02.2011 19:42
Ваш листинг второго прогона теста VM1S1.SAV озадачил:
---------------
Mov #2002, @#177676
START
PSW/002002
..Press <AnyKey>.. 18
Interrupts count: 1
---------------
Ожидание второго <AnyKey> происходит с установленным 10-м битом PSW. Как же там могло пройти прерывание от клавиатуры, если установка 10-го бита PSW блокирует все внешние прерывания ?
В эмуляторе я второе ожидание прервать клавишей уже не могу (исправил после Вашего замечания)..
-
? Patron - 04.02.2011 19:46
Ваш листинг второго прогона теста VM1S1.SAV озадачил..
Ожидание второго нажатия происходит с установленным 10-м битом PSW. Как же там могло пройти прерывание от клавиатуры, если установка 10-го бита PSW блокирует все внешние прерывания ?
В эмуляторе я второе ожидание прервать клавишей уже не могу (исправил после Вашего замечания)..
-
? anonymous - 04.02.2011 19:57
А меня не озадачил, и не такие вещи встречаются в описаниях, будем знать. Значит недаром 02340 в векторе, а не просто 02000, когда я свой пульт писал для него, те же значения использовал просто на всякий случай, сделай я по документации - знали бы на 20 лет раньше, что там напутано.
-
? Patron - 04.02.2011 20:42
Однако, этот бит PSW должен блокировать IRQ1. Иначе эмулятор пульта не мог бы работать. Может, в описании процессора с номерами битов напутали.. Чтобы проверить - я приготовил "радикальный" тест PSW 1801ВМ1: VM1PSW.SAV ( http://zx.pk.ru/attachment.php?attachmentid=24742&d=1296840437 ) пытающийся установить в 1 все биты старшего байта PSW, кроме 15-го ( вдруг это недокументированный бит самоликвидации :)
-
? anonymous - 04.02.2011 21:00
Результат в конец того же 0.txt дописал, та же ссылка http://qbus.narod.ru/0.txt
-
? anonymous - 04.02.2011 21:12
Забавные данные, результат добавил к 0.txt, тоже два запуска, без нажатия и с нажатием на клавишу.
-
? anonymous - 04.02.2011 21:17
Я два раза отвечаю, т.к. не перезагружал страницу и когда писал строку со ссылкой, еще не видел, что третий тест готов.
-
? anonymous - 05.02.2011 12:53
И если он блокирует IRQ1, то во время ожидания нажатия не должен на перевод ключа "Пульт" реагировать - третий прогон это не подтверждает.
-
? anonymous - 05.02.2011 13:43
15й я тоже проверил, биты 12..15 устанавливаются и сбрасываются наверное для совместимости со стандартом и ничего не значат. У процессора на базе 1811ВМ1+1811ВУ1 - без микросхемы ДП 1811ВТ1 - тоже эти биты можно шевелить, но пока ДП не установишь, смысла они не имеют и реально никаких режимов не переключают.
-
? Patron - 05.02.2011 14:33
Похоже, что этот бит сбрасывается при обычных прерываниях, поэтому, при ожидании нажатия в тесте - он уже сброшен и ничего не блокирует.
...
Отчёт по результатам тестов:
1. MTPS не пишет бит T, но MFPS его читает.
2. Прерывания, просходящие между выходом по RTT с установленным битом T и первой командой отлаживаемого потока - не изменяют отложенный статус T-Трапа (круто!).
3. Команда START может установить все биты старшего байта PSW, кроме 2х младших ( 8-го и 9-го ).
4. Если обычные прерывания не запрещены - биты старшего байта PSW "живут недолго".
...
Последний пункт есть смысл уточнить - в каких случаях сбрасываются старшие биты PSW.
Для этого мною написан тест VM1PS2.SAV ( http://zx.pk.ru/attachment.php?attachmentid=24774 ).
-
? anonymous - 05.02.2011 16:03
Результат дописал в конец http://qbus.narod.ru/0.txt
-
? Patron - 05.02.2011 18:04
Чудеса..
Но если подумать - велики шансы того, что старшие биты PSW обнуляет любое обращение к PSW по записи (т.е. загрузка PSW при входе в прерывания и команды RTI, RTT, MTPS ).
Для проверки - тест VM1PS3.SAV ( http://zx.pk.ru/attachment.php?attachmentid=24784 ).
В конце теста можно проверить блокировку IRQ1.
-
? anonymous - 05.02.2011 19:23
Тоже в http://qbus.narod.ru/0.txt добавил. Во время ожидания нет реакции ни на клавиатуру, ни на переключатель пульта.
-
? Patron - 05.02.2011 21:37
Аппаратный детектив близок к развязке!
Мы точно выяснили следующее:
1. Первый же вход в прерывание ( как и первая же выполненная команда RTI,RTT ) - сбрасывает ВСЕ старшие биты PSW.
( В такой ситуации отдельная блокировка IRQ1 установкой 11-го бита не имеет смысла - он обнулится после первого же прерывания. )
2. Команды MFPS и MTPS - никак не влияют на старший байт PSW.
3. 10-й бит PSW блокирует IRQ1 и внешние прерывания.
...
Чтобы уточнить роли 10-го и 11-го битов PSW, а также проверить поведение в тех же ситуациях 2-го и 3-го битов SEL1 - я приготовил тест VM1PS4.zip ( http://zx.pk.ru/attachment.php?attachmentid=24790 ).
-
? anonymous - 06.02.2011 05:48
Результат там же, http://qbus.narod.ru/0.txt во время отсчета на клавиатуру реагирует, а на пульт - нет.
-
? Patron - 06.02.2011 15:23
Теперь многое прояснилось.
1. Документация права - 10-й бит PSW блокирует все внешние прерывания, а 11-й бит PSW блокирует только IRQ1.
2. Микропрограмма процессора 1801ВМ1 содержит ошибку, из-за которой старший байт PSW обнуляется при каждом входе в прерывание и каждом выполнении команд RTI (RTT).
3. Причина того, что не все обращения к PSW по записи обнуляют его старший байт ( команды установки битов PSW и команда MTPS старший байт PSW не обнуляют ) состоит (скорее всего) в следующем - команды установки битов ( как и команда MTPS ) используют микрокод команды BISB Src,Rx ( а эта команда оставляет старший байт регистра-приёмника без изменений ), тогда как команды входа в прерывание и команды RTI (RTT) - используют микрокод команды MOVB Src,Rx ( а эта команда обнуляет старший байт регистра-приёмника ).
...
Однако, на "карте функциональности" процессора 1801ВМ1 ещё остались белые пятна..
Интересен ответ на следующие воросы:
1. Сохраняют ли команды загрузки адреса JMP и CALL содержимое младшего бита загружаемого в PC адреса ?
2. Какое значение имеет PC, когда возникает зависание при выборке:
- кода команды;
- первого операнда;
- второго операнда;
- первого непосредственного операнда;
- второго непосредственного операнда;
Чтобы уточнить это - я написал тест TTST2.SAV ( http://zx.pk.ru/attachment.php?attachmentid=24799 ).
-
? Patron - 06.02.2011 15:47
Нашёл ошибку в тесте TTST2.SAV, удалил старый файл и залил новый: http://zx.pk.ru/attachment.php?attachmentid=24800
-
? anonymous - 06.02.2011 16:12
Проверил, результат там же, http://qbus.narod.ru/0.txt
На счет ошибок, так и сам DEC в фирменных процессорах расплодил множество несовместимостей, которые надо учитывать при переносе программ, можно посмотреть на ключи емулятора erzats-11, там после set cpu <model> и затем show cpu видно, какие параметры встают в какие значения для разных процессоров, например такие ключи, казалось бы базовые функции, а меняются от модели к модели:
[NO]ODD Odd address trapping.
[NO]RTIRTT RTI instruction works like RTT (early CPUs).
[NO]SWABV SWAB instruction preserves V bit.
[NO]JMPPLUS2 JMP (R)+ and JSR X,(R)+ jump to incremented value of R (R+2).
[NO]UNDOAUTO Undo mode 2/3 autoincrements on bus error etc.
[NO]DESTFIRST Evaluate destination operand first in dual operand instructions with mode 0 source.
Effect is to use incremented/decremented value of register as source with mode 2-5 destination
using same register, or PC+2 for mode 07 source and mode 67 or 77 destination.
-
? anonymous - 06.02.2011 16:13
Сейчас исправленный вариант запишу и сообщу.
-
? anonymous - 06.02.2011 16:28
Результат исправленного варианта там же, http://qbus.narod.ru/0.txt - дописал в конец после разделителя --- fixed ---
-
? Patron - 06.02.2011 18:15
Полный список всех 56-ти отличий в реализации команд процессорами фирмы DEC можно найти например здесь: http://www.bitsavers.org/pdf/dec/pdp11/1184/EK-1184E-TM-001_Dec87.pdf
( таблица B-3 ).
...
Последний тест показал, что PС успевает увеличиться на 2 перед любым зависанием. Если зависание в команде типа CMP @(PC)+, @(PC)+ возникает при выборке первого операнда - PC указывает на второй операнд (до выборки которого дело так и не дошло).
...
Только что обнаружил интересную тонкость реализации "нечётного PC". Известно, что младший бит адреса ( при выборке слов ) в 1801ВМ1 не используется - поэтому команды MOV WORD,R1 и MOV WORD+1,R1 читают слово первого операнда по одному и тому же адресу. Команды же MOVB WORD,R1 и MOVB WORD+1,R1 читают байт первого операнда по двум последовательным адресам.
Но если значение PC нечётное, то по какому адресу будет прочитан байт первого операнда команды MOVB WORD,R1 ? Ведь адрес источника определяется сложением смещения с содержимым PC. Будет ли последовательность INC PC | MOVB WORD,R1 читать старший байт слова WORD ?
Ответ должен дать тест TTST3.SAV ( http://zx.pk.ru/attachment.php?attachmentid=24808 )
-
? anonymous - 06.02.2011 19:08
Результат в конце http://qbus.narod.ru/0.txt
Было бы очень полезно собрать соответствующие данные для пары 1801ВМ3+1801ВМ4, т.к. оно некоторые вещи делает как 11/34, а некоторые как 11/23+, из-за этого мы в фирменных ОС не имеем поддержки правильной для ДВК-4. Под RT11 и RSX это несущественно (RSX патчилась с другой целью - из-за ошибки с резервными битами MMSR3), а вот именно на тему модели процессора приходилось патчить Ultrix и BSD собирать с правкой кода загрузчика.
-
? Patron - 06.02.2011 20:10
Эхх.. Огорчил меня ВМ1. Если разработчики 1801ВМ1 скопировали такое кривое поведение у LSI-11 - позор на головы дековцев. Из-за того, что нечётное значение PC полностью разрушает работу байтовых команд 1801ВМ1 с относительным методом адресации - режим "нечётного PC" не является прозрачным для программы и не может продуктивно использоваться.
...
Чтобы собрать данные для пары 1801ВМ3+1801ВМ4 в составе ДВК-4 - нужно иметь под рукой ДВК-4. Если у Вас она есть - это вполне возможно.
...
Следующий объект исследования - реверсивный счётчик ( он же ВЕ-таймер ) по адресам 177706..177712.
Чтобы проверить, работает ли этот счётчик на ДВК-1 - я написал тест VM1VE1.SAV ( http://zx.pk.ru/attachment.php?attachmentid=24811 )
-
? anonymous - 06.02.2011 21:59
Запустил, результат дописан в конец того же http://qbus.narod.ru/0.txt
Машинки с ВМ3+ВМ4 конечно же имеются, только программу подготавливать желательно системо-независимую, т.е. для загрузки с адреса 0 в чистую машину, программа сама должна инициализировать вектора прерывания, регистры консоли, таймера и ДП. Управление таймером по стандартному адресу LKS, запуск - установкой бита 6, биты выбора входной частоты и бит признака пропущенного прерывания отсутствуют, бит 7 работает несколько иначе, чем в стандарте: он взводится фронтом сигнала запроса прерывания, а сбросить его надо в 0 записью, у большинства же моделей PDP-11 он сбрасывается автоматически после считывания регистра. Регистры консоли выполнены на обычной ВП1-035, имеется регистр ключей и индикации, но лампочки и тумблеры к нему не подсоединены, зато он используется как порт SPI, потому в него обращаться не надо. - Вот, в кратце, пожелания к программам для ВМ3/4. Памяти на плате, которую предполагаю задействовать на эксперименты, 2Мб, вторая половина адресного пространства пуста, имеется загрузочное пзу 017773000..017773777.
-
? Patron - 06.02.2011 23:54
Отлично!
Когда закончу с модулем эмуляции 1801ВМ1 ( такими темпами - весьма скоро ) и напишу модуль эмуляции 1801ВМ2 - наступит черёд ВМ3 и ВМ4.
А пока - вот тест VM1VE2.SAV ( http://zx.pk.ru/attachment.php?attachmentid=24815 ), который по идее должен ( используя ВЕ-таймер ) определять тактовую частоту ДВК-1.
-
? anonymous - 07.02.2011 13:57
Работа программки зависит от какого-то дополнительного фактора, т.к. я запускал ее и на ДВК-1, где процессор тактируется от RC-генератора, частоту которого я в ближайшее время урочню (точный частотометр на работе только), а частота таймера сетевого определяется кварцевым генератором 4608кГц, выходная частота которого делится внутри ВП1-35, но и на собственноручно доработанной БК0010, где частота процессора равно точно 5МГц (получается делением на 2 сигнала с точного генератора на 10МГц с 6 нулями после запятой), а таймер имеет частоту ровно 50Гц с тремя нулями после запятой. При этом в БК показывается частота 4882кГц, как-то подозрительно это.
Результат - в конце http://qbus.narod.ru/0.txt
-
? anonymous - 07.02.2011 14:12
Попробовал разместить код и стек с адреса 0100000, где в БК намного более быстрая память - на результате ето не отразилось.
-
? anonymous - 07.02.2011 14:15
Извините за опечатки, последние дни все время между разными клавиатурами приходится скакать. :)
-
? Александр Тишин (Sandro)@ - 07.02.2011 14:26
У него там в мегагерце 1024 килогерца, вот и выходит 4.882
-
? Аноним - 07.02.2011 16:06
Да, и правда! 4883*1024 будет как раз 5000192
-
? Аноним - 07.02.2011 16:14
Ну тогда я и не потащу плату на работу лишний раз, значит в ДВК там у меня 5.3МГц на процессоре. И как я не обратил внимания, что там 「CPU Clock/1024000 =」... :)
-
? Patron - 07.02.2011 16:45
Научите меня, как целочисленно умножить крупное 16-разрядное целое на 1.024 и я сделаю более понятный вывод результатов измерения тактовой частоты.
...
Однако, мы забыли проверить, как реагируют атрибуты HALT-моды 1801ВМ1 ( биты ячейки SEL1 и старшего байта PSW ) на команду RESET.
Этот пробел (как и некоторые другие) должен восполнить тест VM1S2.SAV ( http://zx.pk.ru/attachment.php?attachmentid=24830 ).
-
? Александр Тишин (Sandro)@ - 07.02.2011 17:42
Если нигде не накосячил (проверить не смогу до позднего вечера), то умножать на 1.024 надо так (округляет вниз):
;
; Multply r0 by 1.024
;
; 4 decimal places of precision
; assumes that 1.024*65536 = 10000011000100100b
:
;
; r1,r2 are destroyed
;
x1p024: mov r0,r1
swab r1
mov r1,r2
clrb r2
xor r2,r1
;
asl r2
rol r1
add r1,r0
asl r2
rol r1
add r1,r0
bisb r1,r2
swab r2
clrb r1
swab r1
;
add r1,r0
asl r2
rol r1
asl r2
rol r1
asl r2
rol r1
add r1,r0
rts pc
-
? Александр Тишин (Sandro)@ - 07.02.2011 19:26
Ну и разумеется, в спешке забыл про дробную часть аккумулятора. :( Исправляюсь:
;
; Multply r0 by 1.024
;
; 4 decimal places of precision
; assumes that 1.024*65536 = 10000011000100100b
:
;
; r1,r2,r3 are destroyed
;
x1p024: mov r0,r1
swab r1
mov r1,r2
clrb r2
xor r2,r1
;
asl r2
rol r1
add r1,r0
mov r2,r3
asl r2
rol r1
add r1,r0
add r2,r3
adc r0
bisb r1,r2
swab r2
clrb r1
swab r1
;
add r1,r0
add r2,r3
adc r0
asl r2
rol r1
asl r2
rol r1
asl r2
rol r1
add r1,r0
add r2,r3
adc r0
rts pc
-
? Patron - 07.02.2011 20:08
Вот обновлённый вариант измерителя мегагерц - с последним вариантом подпрограммы x1p024:
VM1SPD.SAV ( http://zx.pk.ru/attachment.php?attachmentid=24834 ),
надеюсь, будет работать как надо.
-
? Александр Тишин (Sandro)@ - 08.02.2011 01:29
Проверил. Второй вариант -- правильный. Хотя насчёт 4 знаков я несколько погорячился, для фиксированной точки надо и во входном значении нужное количество знаков иметь :) Вот что значит всё время иметь дело с плавучкой :)
Ещё попробовал округление к ближайшему -- обычно получаются более красивые числа. Для округления нужно перед rts pc добавить такое:
rol r3
adc r0
-
? Александр Тишин (Sandro)@ - 08.02.2011 02:07
Кстати, про таймер. Существует поверье, что 177706 защищён от записи, так что пытаться туда писать -- бесполезно.
-
? Patron - 08.02.2011 11:54
Наиболее точное описание работы ВЕ-таймера можно найти здесь: http://cd.textfiles.com/230/EMULATOR/DIVERSE/BK11/BK11_EML.TXT - в самом низу страницы.
Нужно лишь добавить, что на вход делителя поступает Fclk/128, и уточнить, что "доступ к биту" в архитектуре PDP-11 невозможен. Большинство младших моделей микропроцессоров этой архитектуры (насколько я пониманаю) даже отдельный байт записать не могут, эмулируя байтовые команды при пословном доступе.
В "измерителе мегагерц" я считаю Fclk/1024, поэтому точность измерения можно увеличить почти на порядок, но для этого нужна подпрограмма печати значения беззнакового 32-разрядного целого.
...
На всякий случай повторю ссылку на тест VM1S2.SAV ( http://zx.pk.ru/attachment.php?attachmentid=24830 ).
-
? Александр Тишин (Sandro)@ - 08.02.2011 23:48
Patron, я не очень понимаю, что имеется в виду насчёт "эмуляции байтового доступа". Если речь идёт о том, что при байтовом доступе процессор (или успройство с ПДП) должно запихивать байт в младшие или старшие линии в зависимости от чётности адреса, то это стандартное решение. Во всех (*) шинах с многобайтной архитектурой и индивидуальной записью байтов.
Про таймер: я делал эмуляцию по этой доке, и у меня одна из игрушек сломалась. Kings Valley, если я правильно помню. Подобрал руками режимы, но не уверен, что получилась 100% точна эмуляция. Но таймерный софт теперь работает весь.
Кстати, у меня остался интересный вопрос про предделитель на 128. Интересно, он работает всё время, или при остановленном таймере стоит? Или вообще сбрасывается при остановленном таймере (т.е. начинает счёт во время запуска таймера)? И в каком отношении он находится с битом 0? Этот бит останавливает предделитель, или нет?
(*) Хотя... Моторола вроде как-то родила решение с принудительным запихиванием одиночного байта в младшие разряды.
-
? Александр Тишин (Sandro)@ - 08.02.2011 23:57
(предыдущий ответ написал, не дочитав сообщение до конца) Эээ... так проблема всего-то в ПЕЧАТИ 32-битного числа? Всё остальное готово?
Если да -- дайте отмашку, и я напишу эту подпрограмму. Там минут на 15-20 работы.
-
? Александр Тишин (Sandro)@ - 09.02.2011 00:14
(нет, форуму определённо необходима функция редактирования сообщений!)
Конечно, команд изменения одиночного бита у PDP-11 нету, это не AVR :)
Однако, устройство на шине вполне может следить за тем, изменяет ли запись определённые биты, или нет. И действовать по изменению определённых битов. С практической точки зрения, это всё равно, что запись или сброс отдельных битов. При применении команд BIS/BIC с соответствующей маской.
-
? Александр Тишин (Sandro)@ - 09.02.2011 00:21
Нет, ну это просто праздник какой-то! ©
Конечно, я имел в виду 177710, регистр счетчика, а не 177706, регистр начального значения.
Извините за флуд.
-
? Patron - 09.02.2011 00:42
1. Если предделитель на 128 работает всё время - задержка первого изменения счётчика будет плавать - это элементарно проверяется (включу эту проверку в следующий тест).
2. Обнуляет ли установка 0-го бита ( или даже останавливает ) предделитель - надо проверять только в том случае, если подозрение из п.1 оправдается.
3. Подумайте, в каком виде Вы бы хотели получать результаты измерения мегагерц: 5'000'000 или 5.000000 ( или в каком-то ещё ) - и напишите по подпрограмме вывода беззнакового 32-разрядного целого для каждого из желаемых форматов ( во втором варианте я обычно просто вставляю в выводимую строку точку в 6-й позиции с конца ).
4. Мои претензии к тем описаниям работы ВЕ-таймера, где пишут, что "запись 0-го бита" регистра 177712 перезагружает счётчик - в том, что счётчик перезагружается ПРИ ЛЮБОЙ ЗАПИСИ в регистр 177712. Думаю, что даже если "осуществить доступ" к любому из "висячих" битов старшего байта - счётчик всё равно перезагрузится, потому что процессор 1801ВМ1 (насколько я понимаю) читает и пишет только полными словами.
-
? anonymous - 09.02.2011 00:44
Прошу меня простить за задержку с ответами, я тут немного закрутился в делах и было не до ВМ1.
Александр, "эмуляции байтового доступа" - это когда читается слово, в нем изменяется нужный байт и слово пишется обратно. Меня другое нервирует, а именно, что любая запись у DCT11 предворяется чтением слова по тому же адресу, это не только нелепо с точки зрения оптимизации циклов и соответственно быстродействия, но и не позволяет использовать многие БИС из других МПК без разнесения адресов по записи и чтению, я на эту тему писал в треде по 1807ВМ1, но сейчас макетка на его базе разломана немного в процессе попыток ремонта доставшегося KDF11A, я немного микросхем оторвал с макетки на нужды F11...
Результат теста vm1s2 дописал в конец протокола тестирования, по прежнему адресу, http://qbus.narod.ru/0.txt Там же и измерение тактовой с измененным выводом.
-
? anonymous - 09.02.2011 00:53
「потому что процессор 1801ВМ1 (насколько я понимаю) читает и пишет только полными словами.」 - это неверно, он выполняет нормальные циклы шины, даже более точно, чем фирменные процессоры, которые стали под конец игнорировать установку wtbt в адресной части для пречарджа динамики первого поколения, полагая, что память в этом давно не нуждается.
И совсем другое дело - регистры устройств. Доступ к регистрам только словный, но это не забота процессора, а устройство ответчика пассивного устройства.
-
? anonymous - 09.02.2011 00:58
Подумалось: тест для словной/байтовой работы с регистрами можно выполнить на БКшке, использовав "Блок Нагрузок", записав байт и прочитав регистр, тогда сразу будет видно, что попало в тот байт, который мы не хотели трогать. У меня нет блока нагрузок, надо паять, что в ближайшую неделю не выйдет.
-
? anonymous - 09.02.2011 01:04
10-MHz БКшка на vm1spd показала
1801VM1 Mhz Speed Meter v1.0
177712/177400
CPU Clock = 5'000'000
CPU Clock = 5'000'000
CPU Clock = 5'000'000
CPU Clock = 4'999'000
Press <any_key> to exit..
CPU Clock = 5'000'000
Program completed.
-
? Александр Тишин (Sandro)@ - 09.02.2011 01:14
А, то есть речь идёт про то, не запуляет ли процессор цикл чтение-модификация-запись для замены одного байта при clr/mov? Про байты не знаю, но при clr/mov слова 1801ВМ1 совершенно точно не делает чтения, иначе у БК11М терялись бы символы с клавиатуры при смене экранов/палитр. Адрес регистра ведь тот же самый.
Оригинальный блок нагрузок не поможет. Это же просто зацикливание данных, там не получится отличить Ч-М-З от просто записи. Вот если в него инвертор вставить, это другое дело. Хватит двух бит в младшем и старшем байте.
-
? Patron - 09.02.2011 01:20
В том-то и дело, что тайминги команд, которые показывает 1801ВМ1 - не соответствуют использованию всех циклов шины.
Ниже я напишу несколько тезисов, которые противорчат друг другу, а значит не могут быть истинными одновременно:
1.1. Команда CLRB (R0) использет цикл DATOB
1.2. Команда CLRB (R0) использет цикл DATIOB
1.3. Команда CLRB (R0) использет связку DATI DATOB
1.4. Команда CLRB (R0) использет связку DATI DATO
1.5. Команда CLRB (R0) использет цикл DATIO
Моё мнение - или 1.4 или 1.5
2.1. Команда CLR (R0) использет цикл DATO
2.2. Команда CLR (R0) использет связку DATI DATO
2.3. Команда CLR (R0) использет цикл DATIO
Моё мнение - или 2.2 или 2.3
3.1. LSI-11 и 1801ВМ1 используют одни и те же секции микрокода и для байтовых и для словных команд.
3.2. LSI-11 и 1801ВМ1 не используют запись байтов, поэтому перед записью результата команд CLRB (R0), MFPS (R0) или MOVB (R0),(R0) им приходится считывать слово приёмника, чтобы не испортить соседний байт.
3.3. По причинам 3.1 и 3.2 команды CLR (R0), SXT (R0) и даже MOV (R0),(R0) также считывают слово приёмника перед записью.
4.1 По причинам 3.1, 3.2 и 3.3 - 1801ВМ1 использует при работе памятью только циклы DATI и DATIO ( как вариант - только DATI и DATO ).
-
? Александр Тишин (Sandro)@ - 09.02.2011 01:26
Patron, по пунктам:
1: Ну да, в таком случае будет плавать. И это хорошо бы померить.
3: Мне всё равно, лишь бы читалось. Могу сделать вставку точки и других разделителей, но удобней, конечно, без них.
4: А вот в этом и заключается вопрос. Любая ли запись в 177712 рестартует таймер, или там ещё и данные анализируются. Ну и с предделителем непонятно.
-
? Александр Тишин (Sandro)@ - 09.02.2011 01:34
Стоп! При чём тут микрокод? 1801ВМ1 совершенно точно НЕ использует микрокод LSI-11, у него же совершенно другой микрокомандный автомат !!!
1801ВМ1 ТОЧНО пишет байты. Я делал к нему внешнюю память, и при игнорировании WTBT охреневало всё. Да и зачем ему вывод WTBT, если он работает словами?
Вопрос может быть только в типах циклов, но MOV однозначно использует DATO для приёмника. Насчёт CLR/SXT не уверен.
-
? anonymous - 09.02.2011 03:07
Ни ВМ1, ни KD11 не считывают слово-приемник при байтовых операциях, это вы можете осцилографом пронаблюдать самостоятельно. Как я понимаю, при обнулении байта или слова, сперва обнуляется один из внутренних регистров, доступных только микропрограммно, затем делается пересылка из него.
-
? anonymous - 09.02.2011 03:10
при байтовых операциях, не являющихся модификацией приемника*
-
? anonymous - 09.02.2011 03:12
SXT обязан прочесть аргумент, иначе признаки чего он будет обрабатывать? :)
-
? anonymous - 09.02.2011 03:18
Ой, это я уже во сне... Он же TST не должен делать сам...
-
? Patron - 09.02.2011 13:33
1. Говоря об использовании одних и тех же секций микрокода для выполнения и байтовых и словных команд в 1801ВМ1 - я не имел в виду, что эти секции копируют код LSI.
2. Я полагаю, что T11 ( 1801ВМ7 ) использует для доступа к приёмнику команды MOV связку DATI + DATO, а 1801ВМ1 - цикл DATIO.
3. В документе "У10.170.002 ТО" приведены следующие отличия в выполнении команд процессорами 1801ВМ2 и 1801ВМ1:
3.1. 1801ВМ2 в отличие от 1801ВМ1 использует цикл DATI в команде MTPS.
3.2. 1801ВМ2 в отличие от 1801ВМ1 использует цикл DATO в командах MOV, CLR, SXT.
3.3. Длительность импульса INIT по команде RESET у 1801ВМ2 равняется 105t (CLCI), длительность последующей паузы = 968t (CLCI).
...
4. В связи с этим у меня вопросы:
4.1. Если 1801ВМ1 не использует цикл DATO в командах MOV, CLR и SXT - то в каких командах он этот цикл использует ?
4.2. Зачем 1801ВМ1 использует DATIO в команде CLR (R0), если в команде CLRB (R0) он не нуждается в чтении слова приёмника ( использует DATOB ) ?
4.3. Если, благодаря разделению секций микрокода байтовых и словных команд - процессор 1801ВМ2 получил возможность использовать DATO в команде CLR (R0), означает ли это, что в команде CLRB (R0) 1801ВМ2 ( так же как и 1801ВМ1 ) продолжает использовать DATIO ?
-
? Patron - 09.02.2011 14:11
Алгоритм реакции ВЕ-таймера на любую запись в регистр 177712:
1. Копировать слово из регистра 177706 в регистр 177710.
2. Проверить биты регистра 177712:
2.1. Если bit0 == 0 И bit4 == 1 - начать счёт.
2.2. Если bit0 != 0 ИЛИ bit4 != 1 - ожидать любой записи в регистр 177712.
3. Вернуться к п.1.
-
? Patron - 09.02.2011 16:47
Для проверки стабильности фазы делителя ВЕ-таймера мною написан тест VM1VE3.SAV ( http://zx.pk.ru/attachment.php?attachmentid=24885 ).
-
? Patron - 09.02.2011 17:34
Ответ на вопрос 4.1 (полагаю) такой:
1801ВМ1 может использовать цикл DATO в командах типа JSR, TRAP, HALT.
-
? Patron - 09.02.2011 17:49
Для тех, кому нужен форматный вывод в программах на Macro-11 - предлагаю исходник функций printf(), fprintf() и sprintf() из библиотеки DECUS C: http://bk0010.org/forum/?id=5012
-
? anonymous - 09.02.2011 21:12
Для того, чтоб прекратились гадания на пряничной глазури, я сделал простой тест. К процессору были допаяны RS-триггер с кнопкой, дающий одиночный импульс при нажатии, выход которого был заведен на вход триггера, стробирующего IRQ3 ВМ1, и два элемента 2NOR, по одному входу которых принимался сигнал SEL2 с процессора, а на второй вход были поданы сигналы DIN и DOUT для первого и второго элементов, таким образом на выходах были получены сигналы записи и чтения SEL2. Программная часть теста состояла из двух проверок, для памяти и для регистров процессора, результат оказался, как и следовало ожидать, одинаковым, циклы доступа к собственным регистрам такие же, как и к остальной памяти.
Суть проверки в следующем: программа разрешала прерывания, заносила адрес тестируемой целевой ячейки в РОН и вставала на WAIT, после чего вручную обнулялся счетчик импульсов осцилографа (tektronix 2465bdv), затем выдавалось прерывание по 0270 вектору, обработчик которого состоял из 3 команд - CLR (R1) или MOV R1,(R1), WAIT, RTI. Соответственно регистрировалось количество сигналов записи и чтения, для команды CLR было 3 записи (сохранение PSW и PC, и собстрвенно запись нулей в целевую ячейку) и 5 чтений (загрузка PC и PSW, загрузка кода команды CLR, фиктивное чтение аргумента и загрузка кода команды WAIT). Для инструкции MOV было 3 записи и 4 чтения, как и положено.
Повторение проверки с указание в качестве целевой ячейки SEL2 и подсчет импульсов чтения и записи дали такой же результат: 1RD + 1WR для CLR (R1) и 0RD + 1WR для MOV R1,(R1), для байтовой записи, MOVB R1,(R1), полухены такие же результаты - чтения перезаписываемого адреса он процессор не делает.
-
? anonymous - 09.02.2011 21:38
Кстати, можно было бы мне ранее и припомнить случай, произошедший во время адаптации SCSI-контроллера к БК. Там имеется 32 внутренних регистра микроконтроллера, выполняющего скрипты по обслуживанию команд работы со SCSI-шиной, доступные через один общий адрес, для этого есть регистр-указатель, куда перед обращением к нужной ячейке следует записать ее номер. Однако обычно используется другой прием: обнуляется регистр-указатель и в регистр-буфер пишутся последовательно значения всех ячеек, либо считываются все ячейки 32мя чтениями по одному адресу. Секрет в том, что указатель регистрового файла инкрементируется при каждом любом обращении к регистру-буферу данных. И вот тогда я обнаружил, что комадой CLR доступать к констролеру для очистки нужного регистра нельзя. :)
-
? Patron - 09.02.2011 22:17
Великолепно!
Вот в чём преимущество экспреимента перед чтением документации. Получается, что напрасно в описании 1801ВМ2 цикл DATO в команде MOV заявляется как одно из отличий от 1801ВМ1 :)
Кроме того, становится понятно, что 1801ВМ1 весьма точно эмулирует LSI-11. Там команда MOV является (насколько я помню) единственной "арифметической" командой, выполняющей цикл DATO, а команда MOVB - единственная, выполняющая цикл DATOB.
Кроме того, известно, что команда MTPS у LSI-11 выполняет DATIO. Разработчики 1801ВМ1 были вынуждены воспроизвести и этот закидон. Зато, при разработке ВМ2 - переход к использованию DATI в команде MTPS смог стать "прогрессивным нововведением" :)
...
А вот и первый тест таймингов 1801ВМ1: VM1C1.SAV ( http://zx.pk.ru/attachment.php?attachmentid=24887 ).
-
? Александр Тишин (Sandro)@ - 09.02.2011 22:18
anonymous, отлично! Это всё объясняет.
Ведь MOV r0,(r1) без цикла DATI необходима для работы с периферией, многие железки изменяют состояние при чтении регистров. А вот для CLR, видимо, поленились сделать отдельную ветку микрокода. Надо полагать, SXT тоже читает свой аргумент. И, возможно MFPS.
Интересно, что там с TST,BIT и MTPS? В принципе, если разобраться с этими командами, то никаких вопросов с количеством доступов в память не будет, у всех остальных всё очевидно.
-
? Patron - 09.02.2011 22:44
TST использует DATI ( это, кстати, хорошо видно по таймингам ), уверен, что и TSTB - тоже.
Таймингов BIT у нас пока нет, но если исходить из того, что ВМ1 точно эмулирует LSI-11, то там только MTPS пишет источник после чтения ( использует DATIO ) - то BIT ( как и BITB ) дожен только читать ( т.е. использовать DATI ).
-
? anonymous - 09.02.2011 22:45
Доеду домой - прогоню ваши тесты, это я сейчас на работе развлекался с ВМ1. Эта плата тут живет, на ее базе когда-то хотели тестер для бортового самолетного устройства связи PCI<->МПИ делать, ВМ1 был выбран, т.к. он перед выходом на шину выставляет запрос, в отличие от ВМ2 и ВМ3, которые считают себя главными на шине. Теперь она таким образом доработанная, можно будет и остальные команды проверить на предмет задействуемых циклов, только с ней общаться тяжело - нет пульта у нее.
-
? Александр Тишин (Sandro)@ - 09.02.2011 23:05
да, про байтовые варианты тоже интересно. И хорошо, что напомнили про тесты скорости -- пожалуй, надо бы их доделать до конца :)
-
? anonymous - 10.02.2011 00:43
Запустил оба свежих теста, результат в конце http://qbus.narod.ru/0.txt
-
? anonymous - 10.02.2011 00:53
Запустил я оба по два раза, т.к. обратил внимание, что таймер после включения машины в первом тесте был в случайном состоянии (177706/104014 и 177710/177777), однако затем я увидел, что показания плавают от прохода к проходу, потому и второй тест тоже два раза пустил.
-
? Patron - 10.02.2011 12:21
Отчёт по результатам теста:
1. Данные по команде Return ошибочны. Под эмулятором тест даёт такие же результаты - значит ошибка в логике теста.
2. ВЕ-таймер так же неисчерпаем, как и атом :)))
3. Регистр 177706 после включения питания и до первой записи содержит (как я полагаю) идентификационный (порядковый в партии?) номер процессора, позволяющий членам многопроцессорной конфигурации определить "старшего" в момент пуска.
4. Команда RESET (скорее всего) даёт такой же эффект как и CLR @#177712 (нужно уточнить).
5. Если не трогать бит 0 регистра 177712 - предделитель продолжает работать даже при остановленном таймере (обратное ещё предстоит проверить), поэтому промежуток времени от запуска таймера до первого изменения счётчика нестабилен.
6. При счёте в режиме перезапуска и достижении счётчиком 0-го значения - это значение появляется в регистре счётчика и может быть считано, но хранится там только в течении времени, необходимого на перезапуск таймера, что (судя по всему) приводит к сбою фазы сёта, например так: ( 177706:2 | 177710 : 2=128 ; 1=128 ; 0=40 ; 2=128 ; 1=128 ; 0=40 ) или так: ( 177706:1 | 177710 : 1=128 ; 0=40 ; 1=128 ; 0=40 ; 1=128 ). Продолжительность хранения 0-го значения требуется уточнить.
7. С вероятностью менее 10% последовательность из 128 однотипных команд выполняется на 384 (или около того) процессорных такта дольше.
8. Команды JSR PC и JSR R3 реализуются в процессоре 1801ВМ1 одной и той же микропрограммой.
-
? Patron - 10.02.2011 12:30
Другой вариант интерпретации начального значения регистра 177706.
Это уникальное ( для каждого экземпляра в партии прцессоров ) значение используется для задержки при начальном пуске. Также возможно, что установка одного из битов регистра 177700 приводит к остановке процессора до окончания счёта ВЕ-таймера.
-
? anonymous - 10.02.2011 15:42
А наиболее адекватная интерпретация - триггеры регистра устанавливаются в случайное состояние, в зависимости от дефектов проецирования/травления и особенностей конкретного места, на которое попали, конкретного кристалла. В одной партии процессоры дают и разные и одинаковые значения после включения. В 70-80е годы был выход годных кристаллов 1..10% из партии и серииными номерами не только конкретных кристаллов, но и пластин, никто в Союзе не развлекался.
-
? anonymous - 10.02.2011 15:49
В смысле, серииными номерами на кристале. Их прожигают уже после тестирования кристаллов, либо лазером выжигая специально предназначенные для этого поля-ячейки, либо электрически.
-
? Patron - 10.02.2011 16:23
Насколько мне известно, в отличие от начального значения регистра 177706, разного у разных процессоров - начальное значение регистра 177710 у всех 1801ВМ1 одинаково и равно 177777, всегда отличаясь от начального значения регистра 177706. Это не стыкуется с предположением, что начальные значения указанных регистров формируются на этапе изготовления процессора случайным образом..
...
Дальнейшее исследование работы ВЕ-таймера: тест VM1VE4.SAV ( http://zx.pk.ru/attachment.php?attachmentid=24898 ).
-
? Patron - 10.02.2011 18:03
Исправил и перезалил тест VM1C1.SAV ( http://zx.pk.ru/attachment.php?attachmentid=24901 ).
-
? anonymous - 10.02.2011 22:17
Это как раз полностью его подтверждает, ибо на 0177710 имеются сигналы управления, а 0177706 связан только с внешней шиной.
Результат в конце http://qbus.narod.ru/0.txt
-
? anonymous - 10.02.2011 23:11
А, и еще vm1ve4 умеет, при принудительно включенном таймере, оканчиваться так:
>>> Trap to 004 <<<
PC/004332
>>> Interrupt <<<
1801VM1 VE-Timer Test #4
Turn Timer ON
- и тишина при включенном таймере.
Если ваши программы в моде kernel (и единственной, в которой ВМ1 исполняет программы) выдают сигнал init, то а) исчезают прерывания по 100му вектору б) исчезает системный диск, поэтому после любой команды RESET надо за собой оставлять полный контроль над машиной и не передавать управление ОС. Для восстановления работы таймера после RESETа следует установить в "1" 6й бит LKS, для использования дисковых запросов следует реинициализировать дисковый контроллер, что вряд ли имеет смысл, т.к. это довольно большой кусок кода. Регистр LKS у меня просто встроен в корзину, а не находится на плате, так мне удобнее работать было, когда работа ДВК и PDP-11 была у меня основным источником дохода.
-
? Patron - 10.02.2011 23:53
Третья часть теста 1801VM1 VE-Timer Test #4 - у меня в эмуляторе тоже странно работает - там явно какой-то косяк в коде.
Грешить на RESET не стоит. RESET не может сделать CLR SP или передать управление в буфер строки, а тут явно что-то в этом роде случается.
...
Насчёт регистра LKS у меня вопрос - насколько этот регистр типичен для ДВК-1 ?
У меня в эмуляторе ДВК-1 - тот LTC, который встроен в плату процессора - не имеет регистра на шине. Чтобы получить в эмулируемой мною ДВК-1 таймер с регистором на шине - в эмуляторе нужно отключить таймер, встроенный в плату процессора и подключить эмуляцию дополнительной платы, которая реализует таймер с регистром.
Или я это неправильно делаю ?
Ни разу не встречал в документации ДВК упоминаний о наличии регистра LKS у базового варианта LTC.
-
? anonymous - 11.02.2011 01:13
У стандартной ДВК всех модификаций частота таймера образуется путем деления тактовой частоты последовательного порта в микросхеме самого порта. На выходе делителя стоит элемент из состава одной из буферных микросхем к531АП2 и его выход идет на контакт БА7 корзины. В корзине этот сигнал связан с контактом БА14, который на плате процессора идет на вход одного из буферных элементов к531АП2 и далее, с его выхода, на вход EVNT процессора. Также в корзине этот сигнал соединяется с выходом логического элемента с открытым коллектором, который позволяет посадить сигнал на землю и тем самым воспрепятствовать работе таймера ( вход этого элемента идет к триггеру, управляемому ключем "Таймер"). Так устроен стандартный ДВК.
Но если в такую корзину установить процессор М6 на базе МПК 1811, то он зависает при старте, если таймер выключен таким образом, т.к. ожидает, пока вход таймера вернется в пассивное состояние, в "1". Однако при установке М6 на контакт БА7 не выдается частота таймера, т.к. процессор предполагает, будучи копией фирменного, что частоту таймера будет выдавать блок питания, синхронизируясь от частоты питающей сети (отсюда при генерации ОС берется вопрос/параметр о 50 или 60-герцовом таймере).
Процессор М8 на базе МПК 1831 имеет LKS на борту, имеет и генератор с делителем тактовой частоты, однако по-умолчанию, стандартным способом, т.е. только
установкой 6-го бита LKS, он приводится в состояние ожидания сигнала таймера с контакта БА14, а о способе включения наплатного генератора большинство ОС не знает.
Поэтому частоту таймера, чтоб работать с любым процессором, удобнее получать в корзине. А так как в домашних условиях множество машин для каждой задачи устанавливать не слишком удобно, то были доработаны все имеющиеся корпуса под универсальность - добавлен LKS для программного управления таймером и разведены недостающие в старых моделях сигналы - A18, A19, A20, A21 и IRQ5, IRQ6, IRQ7.
Ни в одной стандартной комплектации ДВК LKS не присутствует, он имеется только опционально в Электронике-60-1 и штатно в Электронике-79 из персоналок на базе обычной "корзины" МПИ.
-
? Patron - 11.02.2011 12:41
Отчёт по результатам тестов:
1. При работе ВЕ-таймера в режиме рестарта - достижение значения 0 для счётчика является недопустимым ( т.к. это значение совпадает с максимальным начальным значением счётчика == 0 ). Появление 0-го значения в промежутке между окончанием счёта и перезагрузкой счётчика - неточность реализации. Перезагрузка счётчика выполняется за несколько (4..10) тактов частоты процессора ( в течение которых значение 0 доступно для считывания ) и не приводит к сбою фазы счёта, поскольку всегда выполняется в начале фазового цикла.
2. При работе ВЕ-таймера в режиме непрерывного циклического счёта значение 0 ничем не отличается от любого другого.
3. Все биты младшего байта регистра 177712 ( включая бит 7 ) могут быть установлены и очищены записью в регистр. Если счёт начат с установленным 7-м битом - этот бит в процессе счёта не сбрасывается.
4. При начальном значении счётчика == 1 работа счётчика в режиме рестарта сводится к копированию этого значения из регистра 177706 в регистр 177710, запускающемуся на каждом 128-м такте частоты процессора. При этом - вероятность обнаружить в счётчике нулевое значение равна 3..8 %.
...
5. Весьма похоже, что при записи в PSW значения 0340 команды SOB, BR, BCS и т.п. выполняются на 3 такта дольше, чем при записи в PSW значения 0. Будет очень любопытно, если обнаружится, что продолжительность выполнения этих команд увеличивается на один такт за каждый из установленных 3-х старших битов младшего байта PSW ( т.е. 7-го, 6-го и 5-го ).
-
? Patron - 11.02.2011 14:40
Дальнейшее тестирование ВЕ-таймера: тест VM1VE5.SAV ( http://zx.pk.ru/attachment.php?attachmentid=24916 ).
-
? Patron - 11.02.2011 18:18
Новый тест таймингов: VM1C2.SAV ( http://zx.pk.ru/attachment.php?attachmentid=24918 )
-
? anonymous - 12.02.2011 01:35
Результат, где и обычно, в конце http://qbus.narod.ru/0.txt
И дописал два раза результаты разных запусков VE5, т.к. распечатка разных прогонов отличается.
-
? anonymous - 12.02.2011 02:05
Нашел абсолютно новую и дохлую плату контроллера дисководов MY второй версии, починил - прогнила от времени и плохой промывки после пайки резисторная сборка и "пропал" один из резисторов в ее составе, подтягивающий шину к "1". Однако она работает нормально только с -091 прошивкой в 1801РЕ2 и зависает с последними версиями, прошитыми в 1801РР1 ( -092 и ее неоффициальный вариант, известный как 93я прошивка, для буферного ОЗУ 2кб, позволяющие читать/писать дискеты, отформатированные и записанные на 8272-совместимом контроллере), как и с копией -091, прошитой в РР1. Это одна из проблем ВМ1, заключающаяся в том, что у него микропрограммы работы с шиной вылетают в зависание полное иногда, если RPLY в цикле обмена сразу устанавливать с DIN/DOUT и сразу снимать - почему-то не умеет он работать с быстрыми устройствами, надо линию задержки вводить, чтоб отсрочить его появление и уход в пассивное состояние, завтра из-за этого порежу плату новенькую, с конвеера только... :( Если заработает, то это снимет проблемы с командой RESET - можно будет ДВК-1 грузить с MY, а значит, переставить его из "крутой" корзины в корпус Электроники-60М, где RESET не убивает контроллер диска и не выключает таймер.
-
? anonymous - 12.02.2011 12:15
Задержка по RPLY не помогла, что еще может быть? Задержка по SYNC?
-
? Patron - 12.02.2011 12:36
Действительно. Если команда RESET сбрасывает оба таймера - определить её продолжительность невозможно.
...
Отчёт по результатам тестов:
1. Продолжительность присутствия значения 0 в регистре 177710 ВЕ-таймера перед его перезагрузкой в режиме счёта с рестартом - примерно 4 такта частоты процессора.
2. Предделитель ВЕ-таймера, дающий опорную частоту счёта Fclk/128 - никогда не останавливается при остановке таймера ( бит 0 не влияет ), поэтому промежуток веремени от начала счёта до первого уменьшения на 1 содержимого регистра 177710 составляет от 1 до 128 тактов частоты процессора ( с равной вероятностью любого из них ).
3. Предположение о зависимости таймингов команд SOB, BR, BCS и т.п. от содержимого PSW не подтвердилось.
...
Очередной тест ВЕ-таймера: VM1VE6.SAV ( http://zx.pk.ru/attachment.php?attachmentid=24927 ).
-
? Александр Тишин (Sandro)@ - 12.02.2011 12:42
anonymous, а по какому фронту клока меняется RPLY? У меня такое чуство, что надо бы его по заднему менять для большеё устойчивости.
Patron, на БК-11М таймер 50Гц для сброса неуязвим :) На ней можно было бы померить.
-
? Patron - 12.02.2011 14:43
Тогда скоро сделаю довольно точный тест таймингов команды RESET.
...
Новый тест таймингов команд процессора 1801ВМ1: VM1C3.SAV ( http://zx.pk.ru/attachment.php?attachmentid=24929 )
-
? anonymous - 12.02.2011 15:58
Александр, он по заднему и меняется, см. ЩИ3.057.136 Э3 лист 1
-
? anonymous - 12.02.2011 16:13
VE6 и C3 запустил, результат - в конец нашего лога дописан, http://qbus.narod.ru/0.txt
-
? anonymous - 12.02.2011 16:35
Наладил механизм переноса программ, вручную отформатировал 1 дискету из пульта, записал на нее ОС и отформатировал вторую, теперь можно и RESETом баловаться.
С РР1 в качестве ПЗУ упорно не хочет плата работать, хоть само пзу переставляю из второй точно такой же платы чужой, надо думать, но пока будем пользоваться дискетами, отформатированными на этой же плате.
-
? Patron - 12.02.2011 19:18
Заключительный (полагаю) тест ВЕ-таймера: VM1VE7.SAV ( http://zx.pk.ru/attachment.php?attachmentid=24934 ).
-
? Patron - 12.02.2011 21:16
Для измерения продолжительности команды RESET потребуется предварительно максимально точно определить число тактов процессора за 50 тиков LTC. Есть алгоритм, позволяющий (в теории) определять частоту процессора с точностью 26 тактов (продолжительность команды MOV (R5),R1 ).
С использованием этого алгоритма написана вторая (пока ещё довольно сырая) версия "измерителя мегагерц": VM1SP2.SAV ( http://zx.pk.ru/attachment.php?attachmentid=24938 ).
-
? anonymous - 12.02.2011 23:06
Так как 0.txt стал уже довольно длинным, начинаем новую жизнь в http://qbus.narod.ru/1.txt старый лог на месте, его не удаляю.
В тесте SP2 значение CPU Clock = скачет периодически с 5.2 на 3.7, на всякий случай старый тест запустил - в нем значение частоты в таких пределах не меняется.
-
? Patron - 13.02.2011 01:02
У меня тоже скачет - примерно один раз из 4-х. Какая-то ошибка в алгоритме. Я в начале программы запускаю счёт в непрерывном циклическом режиме, а прерывание таймера на каждом тике только копирует счётчик и устанавливает флаг для обработчика результатов. Поскольку счёт циклический, а начальное значение счётчика в каждом секундном цикле случайное - то алгоритм обработчика должен многое уметь :)
Похоже, что при каких-то соотношениях начального и конечного значений счёта обработчик даёт явно неправильный результат, а при остальных - более-менее верный.
-
? Patron - 13.02.2011 12:07
Исправил ошибку в "мегагерцометре" и перезалил: VM1SP2.SAV ( http://zx.pk.ru/attachment.php?attachmentid=24951 )
Данный вариант определяет тактовую частоту процессора 1801ВМ1 с точностью Fclk/128 ( предел измерения около 400 МГц ). Поскольку алгоритм уточнения может только уменьшать полученный результат ( в пределах 0 .. 200 t ) - в этом варианте я его отключил. Интересно, какими будут неуточнённые результаты.
-
? Patron - 13.02.2011 12:17
Исправил ещё одну ошибку и опять перезалил: VM1SP2.SAV ( http://zx.pk.ru/attachment.php?attachmentid=24952 ).
-
? Patron - 13.02.2011 12:38
И ещё раз исправил и перезалил: VM1SP2.SAV ( http://zx.pk.ru/attachment.php?attachmentid=24956 ).
-
? anonymous - 13.02.2011 13:43
Результат в конце http://qbus.narod.ru/1.txt
-
? anonymous - 13.02.2011 13:56
У меня сейчас дома очень холодно, частота, наверное, плавать будет с прогревом машины, т.к. генератор без кварцевой стабилизации. Вообще на эту тему есть вариант, как предложил Александр Тишин, с БКшкой, у которой и тактовая известна, и частота таймера образуется делением от того же кварца.
После 10-минутного прогрева уже:
CPU MHz = 5.314048
CPU MHz = 5.313920
CPU MHz = 5.314560
CPU MHz = 5.315072
Press <any_key> to exit..
CPU MHz = 5.314944
В логе, сделанном сразу после включения машины, на ~20кГц меньше было.
-
? anonymous - 13.02.2011 14:47
Через час работы частота держится 5.316..5.317 МГц.
-
? Patron - 13.02.2011 19:35
Готов следующий тест таймингов 1801ВМ1: VM1C4.SAV ( http://zx.pk.ru/attachment.php?attachmentid=24973 )
-
? anonymous - 13.02.2011 21:20
Результат в конце http://qbus.narod.ru/1.txt Перед запуском немного подождал, прогрел. :)
-
? Patron - 14.02.2011 00:05
Интересно.. Результаты каждый раз немного другие, например для команды SOB в разных тестах получается от 22 до 26 тактов.
В новом варианте я изменил алгоритмы для Jmp (R0) ; Call (R0) и дбавил счётчик обработанных прерываний в последнем блоке: VM1C4.SAV ( http://zx.pk.ru/attachment.php?attachmentid=24975 ).
-
? anonymous - 14.02.2011 01:12
Запустил, результат дописал в конец лога. Тактов на инструкцию столько же, лишние такты там на ожидание были при доступе через внешние буфера, сейчас, с одним только MY в корзинке, плата исключительно внутри самой себя шуршит, потому быстрее.
-
? Patron - 14.02.2011 13:41
Повторная проверка подтвердила, что команды Jmp (R0) и Call (R0) действительно выполняются процессором 1801ВМ1 на 3 такта быстрее, чем Jmp (R0)+ и Call (R0)+. Время выполнения команд с 4-м и 5-м способами адресации (декрементными) на один такт дольше, чем со 2-м и 3-м (инкрементными).
А вот с прерываниями не всё ясно. Если обработчик прерывания TTP (по вектору 064) содержит команду BIC #100,@#TTPS - то сколько прерываний TTP должно произойти при выполнении 128 последовательных команд BIS #100,@#TTPS ?
У меня в эмуляторе - 128, в проведённом тесте - 64.
Вот новый вариант теста, в котором после каждой команды BIS #100,@#TTPS стоит NOP :
VM1C4.SAV ( http://zx.pk.ru/attachment.php?attachmentid=24978 ).
-
? anonymous - 14.02.2011 14:16
Результат в конце http://qbus.narod.ru/1.txt
И я и терминал привел в соответствие с оригинальной конфигурацией, сейчас на 9600 работает связь.
-
? Patron - 14.02.2011 17:57
1. По результатам проведённых тестов ВЕ-таймера составлен алгоритм его работы: http://zx.pk.ru/showthread.php?t=15090
2. Установка бита разрешения прерывания в регистре готового устройства вызывает прерывание после завершения следующей ( за BIS #100,@#sr ) команды. Интересно, что произойдёт, если эта "следующая команда" очищает бит разрешения прерывания.
Проверка включена в следующую версию теста: VM1C4.SAV ( http://zx.pk.ru/attachment.php?attachmentid=24979 ).
-
? anonymous - 14.02.2011 19:14
Результат последней модификации теста в конце http://qbus.narod.ru/1.txt - Выпадение ДВК-1 в Пульт с кодом 11 - это ошибка приема вектора прерывания, там у вас команда, убирающая бит 0100, очевидно запрос на прерывание процессор увидел во время выполнения инструкции, а передача вектора не состоялась, т.к. запрос со стороны устройства был отменен.
「2. Установка бита разрешения прерывания в регистре готового устройства вызывает прерывание после завершения следующей ( за BIS #100,@#sr ) команды. 」
- Это "от лукаваго", следует написать, что установка разрешения готового прерывания именно в 1801ВП1-035, т.к. в другом устройстве, где схема запроса организована может быть иначе, скорее всего будет другой результат. Давайте проверим: я воткну в корзинку плату последовательного порта, где интерфейс весь собран на другой микросхеме, адреса ее 0176510..0176517, вектора прерывания 0310..0317, а вы сделаете тест для проверки этого предположения.
-
? anonymous - 14.02.2011 19:21
Или может даже так: анализ запроса на прерывание происходит до выполнения инструкции, а прием вектора откладывается на конец ее исполнения, типичный пример - IRQ1/HALT, если сигнал находится в активном состоянии, то попытка выполнить инструкцию по директиве G вызывает прерывание в пульт до ее выполнения.
-
? Patron - 14.02.2011 20:21
Супер!
В описании 1801ВМ2 сказано, что в отличие от ВМ1 - последовательные команды установки и снятия прерывания приводят к ошибке приёма вектора прерывания. Оказывается, никакого отличия и в этом вопросе нет - ВМ1 ведёт себя точно так же!
Раньше я думал (и в эмуляторе реализовал), что переход в HALT-моду по вектору SEL+012 происходит при входе в прерывание зависания, если в векторе 04 записан несуществующий адрес, а также при любом прерывании, если установлен 10-й бит PSW и в векторе прерывания записан несуществующий адрес.
А теперь похоже, что я ошибался и обычные прерывания переходят в HALT-моду только при снятии прерывания в момент его приёма процессором. Но прерывание зависания точно снять нельзя - как поведёт себя процессор, если в 4-й ячейке записан несуществующий адрес ?
...
По вопросу скорости выставления прерывания устройством.
Если посмотреть (и нарисовать) осцилограмму выполнения команды BIS #100,@#sr, то (как я понимаю) можно заметить, что с момента получения устройством нового содержимого регистра до начала выборки процессором кода следующей команды проходит ..сколько тактов? Ведь устройство получает данные, отставшие (со скоростью света) на время прохождения сигнального пути от процессора. Получив данные - устройство их "анализирует" со скоростью переходного процесса своей логики и выставляет запрос прерывания, который неспеша (со скоростью света) отправляется в обратный путь. Чтобы прервать процессор до начала выполнения им следующей команды - все эти события дожны успеть начаться и завершиться в течении ..какого времени?
...
Анализ запроса на прерывание происходит (при разрешённых прерываниях) до выполенния каждой инструкции и если запрос обнаружен - очередная инструкция не выполняется. Если какая-то инструкция была выполнена процессором при разрешённых прерываниях - это 100% гарантия того, что до её выполнения запрос прерывания не был обнаружен. Команда пульта G выполняется при запрещённых прерываниях и заканчивается командой процессора START, загружающей новое значение PSW. Если в этом новом PSW не установлены биты 7, 10 или 11 - немедленно происходят все ожидавшие прерывания в порядке их аппаратного приоритета.
-
? anonymous - 14.02.2011 20:50
Я не о чистом времени генерации запроса, а о возможной его синхронизации по другим сигналам канала, например есть устройства, по-разному относящиеся к очередности выставления сигналов DIN и IAK в цикле приема вектора.
-
? Patron - 14.02.2011 21:08
Вот тест, проверяющий BiS #100,@#176514 : VM1T1.SAV ( http://zx.pk.ru/attachment.php?attachmentid=24985 )
-
? anonymous - 14.02.2011 22:10
Тест не дал сверхъестественных результатов, дапосан в конец лога.
В конкретной плате, что предложил для теста, известна схема запросчика прерывания, она такова http://img14.imageshack.us/img14/5757/qbusirqlogic.jpg
Как в ВП1-035 устроен этот узел - информации нет, но смотрите на схему: если у нас приходит IAK до DIN, то его распостранение не блокируется и цикл подтверждения могут начать сразу несколько устройств, однако он выставляется процессором и приходит с некоторым опозданием и такой ситуации не происходит. Я о таких вот мелких нюансах и говорил.
Что касается времени процесса, то на самой плате мы в канал получаем VIRQ после записи бита 0100 через 13.8нс плюс линия до выходного буфера, с ее учетом округлим до 15нс, далее следует какое-то время на "накачку" довольно длинной линии в корзине, выходная 16246 имеет задержку распостранения внутри 3..4нс и дает максимальный ток 96мА, сколько на это ей требуется я не измерял, допустим 10нс/вольт, т.е. еще плюс 35нс, после чего запрос приходит на плату процессора, где проходит через DD2, время задержки которой 45нс (она постоянно открыта в данном включении), с которой идет на DD18.2, в коей защелкивается по тактовой процессора и подается на его вход через ~33нс от фронта импульса...
-
? anonymous - 14.02.2011 22:12
дапосан=дописан, буквы из ранее написанного и переделанного затем слова остались.
-
? Patron - 14.02.2011 22:34
Мне до понимания мелких нюансов работы шины пока далеко :)
Однако, вопрос требует формальной ясности - при каких условиях процессор успеет принять запрос прерывания ( вызванного командой BIS #100,@#csr ) до начала выборки следующей команды.
Похоже, что при эмуляции выставления прерываний - есть смысл передавать отдельным аргументом время задержки запроса (включающее время реакции логики устройства на установку бита и время прохождения сигнала по шине) в наносекундах. Но с каким параметром эмулятор процессора должен это значение сравнивать.. У меня есть продолжительность такта в наносекундах. Если переданное время прохождения запроса меньше какой-то доли такта - эмулятор процессора отложит обработку прерывания на следующий шаг. Но на какой коэффициент эмулятору нужно умножить длительность такта, чтобы ( сравнив результат с временем задержки запроса ) определиться конкретно?
-
? anonymous - 14.02.2011 23:07
А что если защелкивание внешнего запроса происходит во внутренний регистр процессора именно на том такте, на котором наш запрос, даже успевший достичь платы процессора за время, меньшее длительности 1 колебания тактовой частоты, попадает только в выравнивающий по тактовым импульсам триггер, ТМ2, DD18.2 по схеме 3.059.069Э3, и потому всякий раз прерывание откладывается на 1 команду? Т.е. что если прерывание надо устанавливать несколько ранее, в середине выполнения предыдущей инструкции.
-
? Patron - 14.02.2011 23:45
Т.е. даже 1801ВМ1, работающий на частоте 100 КГц - всё равно пропустит одну команду после BIS #100,@#csr.
Тогда можно обойтись без передачи времени задержки эмулятору и (при разрешённых прерываниях) задерживать все внешние запросы на один шаг. Причём, если на этом шаге запрос прерывания снимается - на следующем шаге процессор выполняет TrapTo(SEL+012).
А что случится, если следующей командой после BIS #100,@#csr окажется команда MTPS #340..
Думаю, что то же самое, что и при их выполнении в противоположном порядке.
-
? Patron - 14.02.2011 23:51
А что насчёт поведения 1801ВМ1 при обработке прерывания зависания в USER-моде с несуществующим адресом в ячейке 04 ?
Если при этом не произойдёт переход в HALT-моду, то процессор войдёт в цикл бесконечного зависания.
-
? anonymous - 15.02.2011 00:05
Да, пока указатель стека не затрет всю память и не перейдет через 0, после чего возникнет двойная ошибка шины с выходом в пульт, но данные в памяти ниже первоначального значения указателя стека будут утрачены.
-
? anonymous - 15.02.2011 00:18
@4/002016 177000
000006/000000 340
@R6/000416 4
@1000/001000 5737
001002/001002 177000
001004/001004 0
@1000G
177002
@M000013
@R6/177774
@0/001004
000002/000340
000004/177000
@
¤
Коды команды M:
х0 - переключатель пульт, инструкция HALT
х1 - ошибка передачи вектора
х2 - ошибка регенерации озу, в ДВК не реализовано
х3 - двойное зависание
х4 - ошибка микрокода процессора, в ДВК не реализовано
-
? Patron - 15.02.2011 12:07
Точно, по стек я и забыл.
Команда "M" micro-ODT LSI-11 выводит содержимое регистра ошибки процессора. При такой старательной имитации LSI-11 удивительно, как это разработчики не захотели воспроизвести ошибки микрокода и ошибки регенерации :)
Правда, есть небольшое сомнение насчёт честности копирования команды MFPS. Фирма DEC (как мне показалось) гарантирует, что последовательность MTPS R0 | MFPS R0 | ASL R0 | JMP @TABLE(R0) будет выполняться одинаково вне зависимости от состояния бита "T" PSW. У 1801ВМ1 это не так - хотя MTPS у него не пишет бит "T", но MFPS его читает. Совершенная бессмыслица - трудно предположить, что и этот момент копирует поведение LSI-11.
...
Для проверки того, как отреагирует 1801ВМ1 на последовательность команд BIS #100,@#csr | MTPS #340 - я написал небольшой тест: VM1T2.SAV ( http://zx.pk.ru/attachment.php?attachmentid=25002 ).
-
? Patron - 15.02.2011 12:40
Новая версия теста таймингов: VM1C4.SAV ( http://zx.pk.ru/attachment.php?attachmentid=25004 ).
-
? anonymous - 15.02.2011 13:46
Результат в конце http://qbus.narod.ru/1.txt
Кстати, о первоначальной установке таймера, от включения ко включению в 0177706 чередуются значения 104004 и 104014, а в 0177710 иногда оказывается 137777.
-
? Patron - 15.02.2011 15:38
Это лишний раз подтверждает, что ВЕ-таймер так же неисчерпаем, как и атом :)
...
Конфигурация теста 1024 х 64 оказалась слабовата - результаты для IOT и TRAP явно "грязные".
Вот вариант 512 х 180 с новым способом определения продолжительности входа в аппаратное прерывание, не использующим данные о продолжительности входа в программное прерывание : VM1C4.SAV ( http://zx.pk.ru/attachment.php?attachmentid=25006 ).
...
Интересная информация - в документе EK-KXT11-UG : http://bitsavers.trailing-edge.com/pdf/dec/pdp11/1121/EK-KXT11-UG-PR1.pdf ( описание клона LSI-11 на процессоре T-11 ) в таблице "B" перечислены особенности работы SBC-11/21 ( на процессоре T-11 ), LSI-11/2 и LSI-11/23. В частности там указано, что при выполнении команды MOV LSI-11/2 делает DATO, но при выполнении команд MOVB, CLR, CLRB и SXT - связку DATI+DATO.
¤
А что делает 1801ВМ1 при выполнении команды CLR (R0) - DATIO или DATI+DATO ?
-
? anonymous - 15.02.2011 20:29
Результат теста в лог дописал.
MOVB, я же проверял, не делает чтений. Количество SYNC'ов у CLR @R0 завтра посчитаю, сразу напишите, что еще посмотреть на железе.
-
? Patron - 15.02.2011 20:32
Добавил несколько проверок прерываний в тест: VM1T2.SAV ( http://zx.pk.ru/attachment.php?attachmentid=25022 )
-
? anonymous - 15.02.2011 20:43
Проверил, результат в конце http://qbus.narod.ru/1.txt (тоже длинный уже стал лог, скоро в следующий, наверное переберемся)
-
? anonymous - 15.02.2011 20:54
Да, а с какой стати MFPT там? У ВМ1 же она отсутствует в наборе команд, 010й вектор дает.
-
? Patron - 15.02.2011 21:16
MFPT там специально, чтобы сравнить реакцию TrapTo_10 и TrapTo_4 на плохой стек.
...
Относительно желательных проверок на железе.
Надо бы проверить - будет ли задержка обработки прерываний на один шаг, когда процессор работает на низкой тактовой частоте.
...
Последний тест прерываний дал один результат, которого я никак не ожидал.
Оказывается, если выполнить на 1801ВМ1 последовательность команд:
MTPS #340
BiS #100, @#TTPS
Mov #20,-(SP)
Mov #L,-(SP)
RTI
L:
Nop
То перед аппаратным прерыванием произойдут ДВА T-трапа. А ведь обработчик T-трапа завершается командой RTT.
Поскольку в этом обработчике - после второго входа T-бит отменяется, то вполне возможно, что установка бита T в процессоре 1801ВМ1 вообще запрещает прерывания.
...
Ещё одно наблюдение: при входе в TrapTo_10 с плохим стеком и зависании при первой же попытке записи в стек - SP на входе в обработчик TrapTo_4 имеет значение, уменьшенное на 4 относительно начального. Т.е. несмотря на зависание - микропрограмма входа в TrapTo_10 декрементирует SP дважды.
-
? Patron - 15.02.2011 21:34
Многое должен прояснить следующий тест: VM1T3.SAV ( http://zx.pk.ru/attachment.php?attachmentid=25026 ).
-
? anonymous - 15.02.2011 21:53
Готово.
Тест прерываний на низкой частоте пока обещать не могу, надо разбираться, как там плата устроена, что и где резать, и удастся ли это. Проще в БК такой тест реализовать, там и буферов на шине нет, задерживающих сигнал.
-
? Patron - 15.02.2011 22:09
Ну и дела!
Бит "T" у процессора 1801ВМ1 запрещает прерывания - кто бы мог подумать..
...
Главное для теста на низкой частоте ( как я понимаю ) - чтобы процессор был 1801ВМ1. Наверняка тест на БК ничем не хуже. Или реализация приёма запроса прерывания процессором у БК и ДВК сильно отличается ?
¤
-
? anonymous - 15.02.2011 22:20
Отличается только тем, что у БК при ошибке приема вектора будет Trap to 4, т.к пульта нет. А не подойдет ли запрос невекторный? Т.е. если вход таймера соединить с выходом параллельного порта, например.
-
? Patron - 15.02.2011 22:50
Если у БК есть устройства, которые выдают запрос прерывания в ответ на BIS #100,@#csr - организовать векторный запрос не сложнее, чем невекторный. Проверить же есть смысл оба варианта.
...
Если бит "T" запрещает прерывания, то как он взаимодействует с командой WAIT..
Проверку добавил в тест: VM1T3.SAV ( http://zx.pk.ru/attachment.php?attachmentid=25036 ).
-
? anonymous - 16.02.2011 11:27
Результат в конце http://qbus.narod.ru/1.txt
Про CLR @R0 вечером расскажу, уехал проверять. :)
-
? Patron - 16.02.2011 19:15
Получается следующее:
1. Бит 'T' блокирует внешние прерывания.
2. T-трап не может прервать цикл ожидания внешнего прерывания.
3. Цикл ожидания не может завершиться до внешнего прерывания.
4. Цикл ожидания временно отменяет блокировку прерываний битом 'T'.
5. Внешние прерывания имеют более высокий приоритет, чем T-трап.
...
В такой ситуации будет не очень удивительно, если команда WAIT временно отменяет вообще все блокировки прерываний. Также интересно, как проявит себя последовательность BIS #100,@#csr | BIC #100,@#csr при установленном бите 'T'.
Проверки включены в тест: VM1T4.SAV ( http://zx.pk.ru/attachment.php?attachmentid=25071 ).
...
У меня в эмуляторе ДВК-1 этот тест завершается только после IRQ1 + P .
-
? anonymous - 16.02.2011 20:40
Прогоню через некоторое время, а пока делюсь информацией по железу:
- CLR @R0 дает 7 импульсов SYNC, как и MOV R0,@R0, в том моем тесте, то есть:
1) сохраняем PSW
2) сохраняем PC
3) читаем новый PC
4) читаем новый PSW
5) читаем инструкцию
6) делаем DATIO (1 DIN и 1 DOUT импульсы внутри единого SYNC) для CLR или DATO (1 DOUT) для MOV
7) читаем код WAIT
¤
- Прошил в ПЗУ, с распаковкой в ОЗУ при запуске, и запустил также тест прерываний первый, который с FIFO'ванным портом, на частоте процессора 156.25кГц (20МГц/128), пишет ровно то же самое,
1801VM1 Interrupts Test #1
BIS #100,@#176514
NOP
>>> Interrupt <<<
BIS #100,@#176514 x8
>>> Interrupt <<<
>>> Interrupt <<<
>>> Interrupt <<<
>>> Interrupt <<<
Program completed.
-
? Patron - 16.02.2011 21:14
Теперь мы точно знаем, что после команды BIS #100,@#csr - 1801ВМ1 всегда успевает выполнить ещё одну команду до начала обработки запроса прерывания.
Также весьма похоже, что все "арифметические" команды, кроме TST(B), CMP(B), MOV и MOVB - используют DATIO.
Только команда MTPS имеет непонятные тайминги.
-
? anonymous - 17.02.2011 02:24
Результаты записал в http://qbus.narod.ru/1.txt - строка "@ ?" - это принятие в ODT кода пробела, нажатого во время спровоцированного "зависания".
Все прежнее содержимое 1.txt переместил в конец 0.txt
-
? anonymous - 17.02.2011 02:30
А при выполнении MTPS не могли ли они сделать вызов сперва прямой пересылки приоритета в RS, а затем вызов подпрограммой микрокода команд с кодами 0240..0277 для выставления признаков? Весьма странно звучит, но всяко бывает...
-
? Patron - 17.02.2011 12:18
1. Команда WAIT нейтрализует только бит 'T'.
2. Бит 'T' полноценно запрещает прерывания.
3. Весьма похоже, что выполнение всех ожидавших запросов прерывания выполняется до выхода из микропрограммы цикла ожидания. Ведь в момент завершения цикла ожидания восстанавливается блокировка прерываний битом 'T'.
...
Чтобы окончательно убедиться - новый вариант теста: VM1T4.SAV ( http://zx.pk.ru/attachment.php?attachmentid=25091 ).
...
С командой MTPS вопрос в том - какой цикл при обращении к операнду она использует. Если бы команда MTPS использовала DATIO ( как LSI-11 ), то её продолжительность ни при одном способе адресации не могла бы быть меньше, чем у команды CLR.
1801ВМ2 использует в команде MTPS цикл DATI. Вполне возможно, что и 1801ВМ1 - тоже.
-
? anonymous - 17.02.2011 16:43
Результат - в конце http://qbus.narod.ru/1.txt
MTPS использует DATI, я это проверял на том же тесте с доработанной платой, однако была странность одна, она не срабатывала между двумя командами WAIT, что требует уточнения, т.к. ее внутри прерывания я всего один раз попробовал поставить и после уже множества манипуляций с машиной, возможно это было вызвано еще какими-то факторами неучтенными, а с простым запуском в составе линейной последовательности команд она генерирует 1 импульс чтения операнда.
Еще просьба имеется маркировать распечатки при модификации тестов, чтоб потом в логе легко было отыскать распечатку конкретного теста, т.к. с одинаковым именем их много довольно уже расплодилось, в результате чего, при распаковке архивов, я маркирую директории буквами в конце.
$ ls $HOME/vm3test/vm1test/
cps ttst3 vm1c4 vm1c4d vm1ps4 vm1sp2 vm1t2a vm1t4a vm1ve4
timing vm1c1 vm1c4a vm1c4e vm1psw vm1spd vm1t3 vm1ve1 vm1ve5
ttst vm1c2 vm1c4b vm1ps2 vm1s1 vm1t1 vm1t3a vm1ve2 vm1ve6
ttst2 vm1c3 vm1c4c vm1ps3 vm1s2 vm1t2 vm1t4 vm1ve3 vm1ve7
-
? Patron - 17.02.2011 22:16
Тайминги опять не обманули - MTPS использует DATI.
...
Что будет, если в предыдущем тесте прерываний заменить все команды RTT на RTI..
Ответ даст новый тест: VM1T5.SAV ( http://zx.pk.ru/attachment.php?attachmentid=25096 ).
-
? Patron - 17.02.2011 22:42
Подправил и перезалил: VM1T5.SAV ( http://zx.pk.ru/attachment.php?attachmentid=25097 ).
-
? Patron - 17.02.2011 23:00
Исправил и перезалил: VM1T5.SAV ( http://zx.pk.ru/attachment.php?attachmentid=25098 ).
-
? anonymous - 18.02.2011 12:14
Выполнил только последний вариант, предыдущие, как я понимаю, не полноценны и не нужны? Результат - в конце http://qbus.narod.ru/1.txt
-
? Patron - 18.02.2011 18:17
Последние результаты говорят о следующем - хотя прерывание, вызванное командой BIS #100, @#csr происходит только после выполнения следующей команды, если перед этой "следующей командой" происходит другое прерывание, не устанавливающее блокировку прерываний при входе в обработчик - то "наше" прерывание происходит немедленно после входа в обработчик, т.е. ДО выполнения следующей ( за BIS ) команды.
...
Очередная версия теста таймингов: VM1C4.SAV ( http://zx.pk.ru/attachment.php?attachmentid=25110 ).
-
? anonymous - 18.02.2011 20:23
Результат в конце http://qbus.narod.ru/1.txt
-
? Patron - 19.02.2011 13:59
Попробуем определить тайминги команды RESET при помощи теста: VM1RST.SAV ( http://zx.pk.ru/attachment.php?attachmentid=25114 )
-
? Patron - 19.02.2011 14:17
Мы забыли проверить, вылетит ли в пульт последовательность команд BIS #100,@#csr | RESET.
Ответ должен дать тест: VM1T6.SAV ( http://zx.pk.ru/attachment.php?attachmentid=25115 )
У меня в эмуляторе этот тест вылетает в пульт и завершается только после 'P'.
-
? anonymous - 19.02.2011 16:35
У меня оно в пульт вылететь не пожелало, результаты в http://qbus.narod.ru/1.txt
-
? anonymous - 19.02.2011 16:40
С прогревом платы частота увеличивается, надо все же было им кварц предусмотреть, хотя тогда ответственность завода-изготовителя выше: с кварцем все экземпляры обязаны бесперебойно работать на единой частоте, а так в паспорте указан -20+5% допуск, если бы засбоила - опустили бы частоту и все...
-
? Patron - 20.02.2011 00:58
Тестирование показало:
1. RESET отменяет у процессора режим приёма вектора прерывания, поэтому снятие прерывания командой RESET сразу после его установки командой BIS #100,@#csr не влечёт фатальных последствий.
2. Продолжительность команды RESET у процессора 1801ВМ1 превышает продолжительность команды NOP на 720 тактов. ( если Tnop = 14, то Treset = 734 ).
...
Для определения таймингов команды MOV - тест: VM1MOV.SAV ( http://zx.pk.ru/attachment.php?attachmentid=25135 ).
-
? anonymous - 20.02.2011 13:43
Готово, дописал в 1.txt
-
? Patron - 20.02.2011 13:53
А вот и немного подправленный вариант теста: VM1MOV.SAV ( http://zx.pk.ru/attachment.php?attachmentid=25141 ).
-
? anonymous - 20.02.2011 14:28
Запустил, готово.
-
? Patron - 20.02.2011 14:47
Тайминги команд ADD и SUB должен определить тест: VM1ADD.SAV ( http://zx.pk.ru/attachment.php?attachmentid=25143 ).
-
? Patron - 20.02.2011 15:27
В обновлённую версию теста: VM1C4.SAV ( http://zx.pk.ru/attachment.php?attachmentid=25144 ) включено опредление таймингов команды XOR.
-
? anonymous - 20.02.2011 16:15
Прогнал, дописал http://qbus.narod.ru/1.txt
-
? Patron - 20.02.2011 19:24
Ещё два теста (в одном архиве): VM1BIS_&_VM1CMP.zip ( http://zx.pk.ru/attachment.php?attachmentid=25155 ).
-
? anonymous - 20.02.2011 21:21
Результат в конце http://qbus.narod.ru/1.txt
-
? Patron - 21.02.2011 18:23
В описании 1801ВМ1 обнаружил, что при входе в аппаратное прерывание - PSW и PC сохряняются в стеке до начала приёма вектора прерывания.
Значит, при выполнении последовательности BIS #100,@#TTPS | BIC #100,@#TTPS и плохом стеке - до вылета в пульт должно произойти прерывание зависания, которое (по идее) должно отменить приём вектора, а значит - отменить вылет в пульт.
Ничего этого в моём эмуляторе пока не реализовано и новый тест прерываний: VM1T7.SAV ( http://zx.pk.ru/attachment.php?attachmentid=25176 ) завершается так:
MOV #160002,SP
BIS #100,@#TTPS
BIC #100,@#TTPS
001424
@M000011
@R6/160002
@P
Program completed.
-
? anonymous - 22.02.2011 16:22
А у меня снова не желает в пульт падать. :) Результат в конце http://qbus.narod.ru/1.txt
-
? anonymous - 22.02.2011 16:25
Я имел в виду, "А у меня она и не желает в пульт падать."
-
? Patron - 22.02.2011 18:44
1. Зависание при сохранении PSW или PC отменяет приём вектора аппаратного прерывания.
2. Продолжительность входа в аппаратное прерывание значительно превышает продожительность входа в программное прерывание.
Тайминг программного прерывания: Tdati + Tcmd(trap) + Tdato + Tdato + Tdati + Tdati = 80*t
Тайминг аппаратного прерывания: Tdato + Tdato + Tvect + Tdati + Tdati = 92*t
Получается, что на тестируемой машине Tvect = Tdati + Tcmd(trap) + 12*t
Или, говоря простым языком - промежуток между окончанием записи старого PC в стек и началом чтения нового PC из принятого вектора ( т.е. время приёма вектора ) составляет никак не меньше 26*t ( Tnop + 12*t ).
Было бы интересно проверить на аппаратуре - сколько тактов частоты процессора разделяет последнюю запись и первое чтение при входе в векторное прерывание.
...
Для проверки таймингов обращения к различным адресам памяти - тест: VM1C5.SAV ( http://zx.pk.ru/attachment.php?attachmentid=25193 ).
-
? Patron - 22.02.2011 21:51
Только что прочитал в описании 1801ВМ2, что прерывания на следующий шаг отменяет не бит "T", а команда RTT, использующая тот же микрокод, что и команда STEP.
Проведённые тесты не исключают подобной возможности.
Для выяснения истины - тест: VM1T8.SAV ( http://zx.pk.ru/attachment.php?attachmentid=25199 ).
-
? Patron - 22.02.2011 23:20
Дополнил и перезалил: VM1T8.SAV ( http://zx.pk.ru/attachment.php?attachmentid=25203 ).
-
? anonymous - 23.02.2011 11:46
Проверил, дописал в конец лога нашего. Тест по скорости доступа к памяти прогнал и на ДВК, и на БК0010.
-
? anonymous - 23.02.2011 12:00
Пояснение к БКшному логу: память по адресам 0..077777 расположена в динамическом ОЗУ под управлением 1801ВП1-037, дешифрация циклов шины для всех остальных адресов расположена внутри ПЛМ, потому время доступа к ним меньше, чем желает иметь ВМ1, таким образом их времена равны длине минимального цикла, который определяется секвенсором самого ВМ1.
-
? Patron - 23.02.2011 14:23
Тестирование показало:
1. RTT не использует микрокод STEP и не запрещает прерывания на один шаг.
2. Цикл DATI при обращении к ROM короче ( чем при обращении к RAM ) на 5*t, при обращении к регистрам терминала - на 3*t, а при обращении к служебным регистрам процессора - на все 7*t. Эти данные заставляют меня усомниться в том, что синхронная часть цикла DATI ( в рассматриваемом случае ) составляет 7*t. Если у исследуемого компьютера продолжительность цикла DATI при обращении к RAM составляет 13*t ( как следует из проведённых тестов ), то продолжительность обращения к ROM говорит за то, что сумма синхронных частей цикла составляет скорее 6 тактов, чем 7. Иначе получается, что асинхронная задержка обращения к ПЗУ (включая задержку буферного регистра) - меньше, чем продолжительность одного такта (188 нс).
Вообще говоря ( насколько я понимаю ), суммарное число тактов в синхронных частях цикла DATI - величина стандартная для каждой модели процессора. Из описания 1801ВМ1 следует, что каждое чтение из памяти занимает Tmem + 7*t, где Tmem - округлённая ( в большую сторону ) до целого числа тактов задержка выборки адреса ( Tadr - промежуток между DIN и RPLY ) используемой системы памяти.
Поскольку при обращении к служебным регистрам процессора не используется сигнал RPLY - то в этом случае Tadr = 0 и Tmem = 0. Кроме того, отказ от использования RPLY ( по-видимому ) сокращает и синхронную часть цикла чтения.
-
? anonymous - 23.02.2011 14:40
При обращении к служебным регистрам процессора сигнал RPLY используется, соответствующий вывод процессора при этом является выходом и любое другое активное на шине устройство может обращаться к регистрам процессора, как к обычным ячейкам памяти.
-
? Patron - 23.02.2011 17:09
Если при обращении к служебным регистрам используется RPLY, то непонятно за счёт чего может стать короче синхронная часть цикла чтения.
Мы определили, что при чтении содержимого ячейки ОЗУ - цикл чтения продолжается на 7 тактов дольше, чем при чтении служебных регистров. Если асинхронная часть цикла чтения при обращении к служебным регистрам равна 0, а синхронная имеет ту же продолжительность, что и при чтении ОЗУ - то это прямо означает, что округлённая до целых тактов асинхронная часть цикла чтения ОЗУ равна 7 тактам.
В то же время, сравнив тайминги команд со 2-м и 3-м ( или 4-м и 5-м, или 6-м и 7-м ) методами адресации - можно совершенно однозначно заключить, что продолжительность цикла чтения ячейки ОЗУ ( в нашем случае ) равна 13-ти тактам.
Тогда получается, что синхронная часть цикла чтения составляет 6 тактов, а округлённые до целых тактов задержки выборки адреса: для ПЗУ - 2 такта, для регистров порта терминала - 4 такта, для служебных регистров - 0 тактов.
Вроде так..
...
Как выяснилось - протестированы ещё не все особенности работы ВЕ-таймера.
Пробелы должен восполнить тест: VM1VE8.SAV ( http://zx.pk.ru/attachment.php?attachmentid=25221 ).
-
? anonymous - 24.02.2011 01:23
Блок регистров процессора находится на кристалле, но представляет собой отдельное устройство, таким образом процессор делает стандартное обращение в озу и отвечает сам себе, единственное отличие от обращения в память - сигнал PRLY не задерживается на такт триггером его стробирования по тактовой частоте. Однако если RPLY приходит на триггер одновременно с выставлением процессором DIN или DOUT, то длительность циклаполучается точно такой же и при работе с быстрой памятью, именно для этого я приложил распечатку и от БК, которую вы, похоже, проглядели. Именно таким образом и были "малой кровью" реализованы регистры процессора и таймер в БК на базе ВМ3 в начале 90х, когда FPGA еще не были доступны массовому радиолюбителю - ВМ3 обращался просто в регистры ВМ1, у которого всегда стоял активным запрос прямого доступа.
Результат vm1ve8 дописал в конец 1.txt, а старые данные, до теста времени доступа к памяти, переместил в 0.txt
-
? anonymous - 24.02.2011 01:41
И еще при обращении к регистрам, естественно, не участвуют в работе линии задержки на элементах DD5.1-R1-C65-DD9.1, DD5.2-R2-C66-DD9.2 и DD6.1-R3-C67-DD9.3/DD9.4/DD6.2
-
? Patron - 24.02.2011 13:42
1. Правильно ли я понял, что из-за отсутствия задержки RPLY на один такт при обращении процессора к своим служебным регистрам - не только промежуток [установка DIN]-[установка RPLY] становится равным 0, но и завершающая цикл чтения последовательность [снятие DIN]-[снятие RPLY]-[снятие SYNC] - сокращается на один такт ?
2. Верно ли, что продолжительность цикла чтения ( в тактах ) при обращении к служебным регистрам процессора 1801ВМ1 одинакова в любом компьютере ( и в БК, и в ДВК ) ?
3. Если да, то выходит, что увеличенная на 3 такта продолжительность команды MOV (R1),R0 у БК объясняется занятием шины видеоконтроллером после чтения процессором кода команды. Этот так? Если видеоконтроллер занимает шину на 4 такта, то получается, что он это делает сразу после снятия процессором сигнала BSY, которое происходит (если я правильно понял стандарт) за один такт до завершения цикла DATI. Верно ?
4. Если предыдущее верно, то одинаковая продолжительность команды MOV (R1),R0 при обращении к медленному ОЗУ БК и ДВК - результат того, что доступ к медленному ОЗУ БК происходит на 3 такта быстрее, чем в ДВК.
...
Ещё один тест ВЕ-таймера: VM1VE9.SAV ( http://zx.pk.ru/attachment.php?attachmentid=25233 ).
-
? anonymous - 24.02.2011 16:25
1) сокращается не только на такты, но и на время работы указанных выше линий задержки (по схеме 3.059.069Э3)
2) не известно, нужны тесты на железе, учитывая, что конденсаторы в линиях задержки на разных платах из одной партии ДВК-1 стоят разные, возможно, что они подбирались а) по быстродействию конкретной платы (включая общие задержки множетства микросхем) и б) разброс параметров конкретных ВМ1
3) на контроллер памяти/видео БК не заводится BSY, но контроллер обслуживает всегда в первую очередь запрос на доступ к данным от схемы вывода изображения, а если к этому моменту есть запрос от процессора (определяется по наличию SYNC), цикл вывода изображения уменьшается вдвое для выделения времени процессору. Также в БК, на которой производился тест, реализована эмуляция линии задержки по SYNC (DD5.1-R1-C65-DD9.1) цифровым способом, схему посмотреть не могу, т.к. делалось оно в старой версии софта от Xlinx, который еще использовал только схемы, а свежие версии их хлама не поддерживают формат старых проектов и чипы прежних годов выпуска :(
Результат ve9 - в конце http://qbus.narod.ru/1.txt
-
? Patron - 24.02.2011 17:35
9-й тест ВЕ-таймера дал неожиданный результат. Хотя при начале счёта был установлен 3-й бит в регистре 177712 - на момент проверки содержимого этого регистра после завершения счёта в режиме "без перезапуска" - 7-й бит установлен не был.
Ранее мы уже проверили, что при завершении счёта в таком режиме 7-й бит устанавливается.
Получается, что одно из обращений к регистрам 177706 и 177710, предшествоваших проверке содержимого регистра 177712 - привело к сбрасыванию процессором 7-го бита.
Этот момент требует уточнения, которое должен осуществить тест: VM1E10.SAV ( http://zx.pk.ru/attachment.php?attachmentid=25234 ).
...
Вопросы относительно процедуры обращения 1801ВМ1 к своим служебным регистрам:
1. Каким образом на тайминги цикла чтения процессором своих служебных регистров может влиять линия задержки ? Почему процессор обращается сам к себе через внешнюю линию задержки ?
2. Каким образом разброс параметров конкретных экземпляров 1801ВМ1 может повлиять на число тактов, затрачиваемых процессором на цикл чтения своих служебных регистров ? Какая фаза цикла чтения может длиться разное число тактов у разных экземпляров процессора ?
-
? anonymous - 24.02.2011 17:49
Тест прогоню вечером, сейчас убегаю.
1) читайте внимательно ответ, опять перепутали. Влияет на доступ к памяти.
2) Например, фаза накачки/дисчарджа внутренней емкостной шины микрокоманд, см. описание организации кристаллов МПК 581й серии.
-
? Patron - 24.02.2011 19:00
Ну, ошибаться мне свойственно :)
Тем не менее, мы уже выяснили следующее:
1. Никакой цикл DATI, осуществляемый процессором 1801ВМ1 - не может может быть короче цикла чтения служебных регистров ( адреса 177700-177717 ).
...
Остальные вопросы ещё нуждаются в уточнении.
Первый из этих вопросов - что означает одинаковая продолжительность циклов чтения служебных регистров и ячеек быстрой памяти у БК..
Ранее мы уже "постановили", что при обращении к служебным регистрам - сигнал RPLY всегда изменяет фазу одновременно с DIN, тогда как при обращении к памяти ( в случае ДВК ) даже при "мгновенной" выборке адреса в микросхемах памяти - их RPLY всё равно будет отставать на один такт из-за линии задержки. Поэтому, за полный цикл DATI при обращении к памяти "набежит" отставание в 2 такта ( кстати - именно такое отставание при чтении ПЗУ ДВК мы и обнаружили ).
Получается, что к быстрой памяти БК это не относится и её RPLY поступает в процессор с практически нулевой задержкой.
-
? Patron - 24.02.2011 19:27
Исправил и перезалил тест: VM1E10.SAV ( http://zx.pk.ru/attachment.php?attachmentid=25239 ).
-
? anonymous - 25.02.2011 02:39
Запустил последнюю версию, результат - в конце http://qbus.narod.ru/1.txt
Возможно, что в БК RPLY защелкивается фронтом тактовой в противофазе с ДВК, я поищу на работе завтра архидревний софт, которым можно было бы открыть схему ПЛИСки примененной в БК моей. А линия задержки по SYNC видоизменяет только синхронную часть цикла, выдвигая адрес на большее время перед выдачей SYNC. Задержки по DIN и DOUT в БК устранены, там имелись такие же линии на RC-цепях, но они уменьшали стабильность работы при "турбировании" (6МГц) и до контроллера памяти эти сигналы пущены в обход их, задержанные DIN&DOUT подаются только на внешний разъем.
-
? Patron - 25.02.2011 12:00
Очень интересные результаты!
Для продолжения тестирования - дополненный вариант теста: VM1E10.SAV ( http://zx.pk.ru/attachment.php?attachmentid=25245 ).
...
Если тест C5 правильно считает такты, затрачиваемые процессором на выполнение команды MOV (R1),R0 для разных значений R1 ( а весьма похоже, что это так ), то нет никаких сомнений, что цикл чтения быстрой памяти БК выполняется процессором ровно за столько же тактов, что и цикл чтения служебных регистров.
Возможно, это означает следующее:
1. RPLY устанавливается в пределах одного такта от DIN ( установка RPLY проверяется только в начале следующего такта ).
2. RPLY снимается в пределах одного такта от DIN ( снятие RPLY проверяется только в начале следующего такта ).
Отсюда вопрос:
1801ВМ1 проверяет изменение RPLY после изменения DIN - в начале следующего такта или "внутри текущего" ?
Конечно, проверку "внутри такта" можно осуществить при помощи линии задержки тактового сигнала на полтакта, но успеет ли тогда быстрая память БК получить DIN и передать RPLY за эти же полтакта ?
-
? anonymous - 25.02.2011 14:49
Тест запустил, http://qbus.narod.ru/1.txt
Разные сигналы выставляются и принимаются еще и по разным фронтам, так BSY, SYNC и WTBT выставляет процессор по заднему фронту, а DIN и DOUT по переднему.
-
? Patron - 25.02.2011 15:56
Ну, дела!
В тесте 10b - начальное значение 134 ( в младшем байте регистра 177712 ) первый раз превратилось в 114, а второй раз - в 314.
Это при каждом прогоне так или только при первом прогоне после включения компьютера ?
Для дальнейшего исследования - тест: VM1E11.SAV ( http://zx.pk.ru/attachment.php?attachmentid=25254 ).
...
Пришло время рисовать осцилограмму цикла DATI 1801ВМ1 при обращении к служебным регистрам.
Мы знаем, что продолжительность цикла чтения ОЗУ ДВК = 13 тактов, а также, что продолжительность цикла чтения служебных регистров ДВК - на 7 тактов меньше. Значит продолжительность цикла DATI при обращении процессора 1801ВМ1 к своим служебным регистрам составляет 6 тактов. Эти такты нужно подробно расписать. Передние фронты будут: 0.0-1.0-2.0-3.0-4.0-5.0, задние фронты 0.5-1.5-2.5-3.5-4.5-5.5
Итак:
0.0 = ничего не происходит
0.5 = BSY-On ; Addr-On
1.0 = ничего не происходит
1.5 = SYNC-On
2.0 = DIN-On
2.5 = RPLY-On ; Addr-Off
3.0 = Data-On
3.5 = процессор копирует данные
4.0 = DIN-Off
4.5 = RPLY-Off
5.0 = ничего не происходит
5.5 = SYNC-Off ; BSY-Off
-
? Patron - 25.02.2011 16:00
Забыл про снятие данных..
5.0 = Data-Off
-
? anonymous - 25.02.2011 17:43
Результат vm1e11 в http://qbus.narod.ru/1.txt
- перед его запуском, как включил машину, первым делом два раза запустил vm1e10b, распечатка в http://qbus.narod.ru/vm1ve10b.txt
Времянки, которые у меня есть, попробую сосканить у кого-нибудь, своего сканера нет.
-
? anonymous - 25.02.2011 17:46
В описании работы таймера же говорится, что 7й бит начитает работать только со второго раза после включиения питания.
-
? Patron - 25.02.2011 18:28
Тогда понятно, в чём дело с 7-м битом!
...
Те времянки, которые есть в описаниях 1801ВМ1 и в стандарте DEC STD 160 - у меня есть.
Если речь о них - то "осцилограммы" там изображены без жёсткой привязки к последовательным тактам.
Мы же рассматриваем крайний случай самого короткого из возможных циклов DATI - продолжительностью всего 6 тактов.
Спецификация цикла "Ввод" предусматривает следующие обязательные задержки:
1. BSY-On <-> SYNC-On = 1 такт ( >150 нс )
2. SYNC-On <-> Addr-Off = 1 такт ( >100 нс )
3. RPLY-On <-> DIN-Off = 1.5 такта ( >250 нс )
4. SYNC-Off <-> SYNC-On = 2 такта ( >200 нс )
Всем этим условиям предложенный график удовлетворяет.
...
Если поместить в регистры 177706 и 177710 команды MOV (R1),R0 и WAIT, и записать в R1 значение 177706, то, указав 177706 в качестве адреса обработчика прерывания - можно ( на Вашем тестовом стенде ) получить осцилограмму трёх последовательных циклов чтения процессором 1801ВМ1 своих служебных регистров. Если при этом фиксировать графики CLC, SYNC, DIN и RPLY ( а если получится - то и BSY ) - вот это и будет истина в последней инстанции :)
¤
-
? anonymous - 26.02.2011 00:45
В документации на ВМ1 приведены следующие времянки:
http://qbus.narod.ru/1801vm1_021_.jpg
http://qbus.narod.ru/1801vm1_022_.jpg
http://qbus.narod.ru/1801vm1_023_.jpg
http://qbus.narod.ru/1801vm1_024_.jpg
http://qbus.narod.ru/1801vm1_025_.jpg
У меня осенью еще анализатор забрали и нет особой причины производственной пока требовать его обратно у людей, которым он нужнее сейчас, пока есть только осцилограф: могу записать 0777 в 0177706 и посмотреть цикл выборки команды, либо в 0177710 занести 0776, а в 0177706 затем код того же MOV. Но это не ранее понедельника-вторника.
-
? Patron - 26.02.2011 17:23
Хорошие сканы!
Такой вариант диаграмм у меня был только для цикла "Ввод".
Кстати, у "родных" дековских времянок Q-bus есть одна интересная особенность - там присутствует обязательная задержка между снятием DIN и снятием данных устройством, равная t1 ( в нашем случае = 40..70 нс ). В "русифицированном" варианте стандарта Q-bus продолжительность этой задержки не оговаривается.
...
Если осцилограф позволяет определить продолжительность любого отдельного сигнала шины с точностью не хуже половины такта частоты процессора - этого вполне достаточно для измерений.
Поскольку команда BR .-0. выполняется за [ Tdati + 4*t ], то при её запуске в регистре 177706 - можно будет определить ( с точностью не хуже половины такта ):
1. Продолжительность цикла команды.
2. Продолжительность сигнала BSY.
3. Продолжительность сигналов A1 и D1.
4. Продолжительность сигнала SYNC.
5. Продолжительность сигнала DIN.
...
По адресу 173106 в ПЗУ ДВК-1 находится команда START ( код 012 ). Если записать адрес 173106 в ячейку 177674 и передать управление на команду START, то можно зациклить выборку этой команды из ПЗУ. По любопытному совпадению - линия A1/D1 также устанавливается в 1 и в фазе адреса, и в фазе данных при выборке кода команды START по адресу 173106.
...
Относительно 7-го бита регистра 177712.
Понятно, что он начинает "нормально работать" только со второго раза.
А что идёт в зачёт, как тот самый "первый раз"..
Возможны варианты:
1. Любая запись в 177712
2. RESET
3. Любое начало счёта.
4. Любое начало счёта с установленным 3-м битом регистра 177712.
5. Любой переход счёта через 0.
6. Любое завершение счёта "в один проход".
7. Любой переход счёта через 0 с установленным 3-м битом регистра 177712.
8. Только завершение счёта "в один проход" с установленным 3-м битом регистра 177712.
Возможно, есть смысл это уточнить. С данной целью написан тест: VM1E12.SAV ( http://zx.pk.ru/attachment.php?attachmentid=25290 ).
-
? anonymous - 27.02.2011 04:00
Е12 прогнал два раза, результат, где и обычно, http://qbus.narod.ru/1.txt
「А что идёт в зачёт, как тот самый "первый раз".. 」 - 「Нужно учитывать, что при первом, после включения ЭВМ или системного сброса(по DCLO), запуске таймера в данном режиме(bit 02=1), индикация срабатывает только после второго перехода счетчика через ноль, причем независимо от того, работал ли таймер до этого в других режимах.」 (в скобочках мои примечания для восстановления контекста цитаты, после второго прогона нажал сброс и запустил в 3й раз - поведение бита 7 действительно вновь оказалось такое же, как и после включения)
-
? Patron - 27.02.2011 13:32
Значит, если записать в 177706 значение 1 и запустить циклический счёт с установленным 2-м битом 177712 - то ВЕ-таймер быстро "придёт в норму".
Это предположение проверяет тест: VM1E13.SAV ( http://zx.pk.ru/attachment.php?attachmentid=25306 ).
...
Если я правильно понял ( с точки зрения эмуляции ) - сброс по DCLO отличается от включения питания только тем, что содержимое ОЗУ остаётся неизменным.
А какими значениями нужно заполнять ОЗУ для эмуляции его содержимого, устанавливающегося в ДВК-1 после включения питания ?
Если сразу после включения открыть в эмуляторе пульта 0-ю ячейку и несколько раз нажать <ПС> - какие числа появятся на экране ?
-
? anonymous - 28.02.2011 14:27
Запустил, результат в 1.txt
Память оказывается после подачи питания в случайном состоянии, определяемом особенностями кристаллов конкретных микросхем ОЗУ, обычно это "шашечки", у РУ6 они мельче, у РУ5 крупнее, ДВК с РУ3 у меня нет, на моей плате уже РУ6 стоят. Шашечки меняют очередность после каждого адреса, кратного 0200:
000170/177777
000172/000000
000174/177777
000176/000000
000200/000000
000202/177777
000204/000000
000206/177777
...
000370/000000
000372/177777
000374/000000
000376/177777
000400/177777
000402/000000
000404/177777
- и т.д.
-
? a214@ - 28.02.2011 19:29
По SEL1,SEL2 - на внешнюю шину адреса в это же время (по SYNC) тоже РЕАЛЬНО выдаются A0-A15 адреса 177714-177716 или нет ... (понятно что у них уже есть полная дешифрация внутри процессора) - но цикл шины (в частности WTBT по байтовой записи в эти регистры) МОЖЕТ ли быть реализован раздельно (этот вопрос относится только к самому процессору ВМ1 - в стандартной БК такой режим просто Физически (для упрощения) не реализован или такое вообще реально невозможно для ВМ1 - ?
-
? Patron - 28.02.2011 20:58
Обрабатывается ли TrapTo10 в HALT-моде 1801ВМ1 - должен ответить тест: VM1T9.SAV ( http://zx.pk.ru/attachment.php?attachmentid=25353 ).
У меня этот тест завершается только после нажатия 'P' в эмуляторе пульта:
.
MOV #2000,@#177676
START
MOV #160000,@#10
MFPT
160442
@M000010
@P>>> Trap to 004 <<<
Program completed.
-
? anonymous - 28.02.2011 21:35
Так и ведет себя, http://qbus.narod.ru/1.txt
a214: Да, конечно адрес выставляется, иначе бы не работал пультовый отладчик на БК0010 при включении в разъем МПИ - SEL1 выведен туда только в 11й машине, потому для записи и чтения триггера пультового режима производится полная дешифрация адреса, но не выдается ответ, который в данном случае не нужен. Байтовые операции с блоком регистров посмотрю, когда и всю времянку буду проверять, как планировалось выше.
-
? Patron - 01.03.2011 12:19
Тест прерываний VM1T9.SAV показал, что в HALT-моде процессора 1801ВМ1 ( т.е. при установленном 10-м бите PSW ) допускается единственное прерывание - TrapTo_4, которое в этом случае отрабатывается как HALT_Trap ( т.е. с сохранением PC и PSW не в стеке, а в ячейках 177674 и 177676 ) по вектору SEL+02.
Любой другой запуск блока прерываний приводит к выходу из HALT-моды ( т.е. к сбросу 10-го бита PSW ).
-
? alex savelev@ - 02.03.2011 10:25
насчет знаменитых "шашечек" в памяти БК после включения питания, и кратности 200,
ну это верно только отчасти и только для БК0010. На моих двух реальных БК0011, БК0011М картина другая - там не шашечки а скорее длинные "полоски" и пустоты из нулей.
-
? anonymous - 02.03.2011 12:18
alex savelev, читайте внимательно, что написано в посте, на который вы ответили. Ни о каких БК речи не было, исследуется машина ДВК-1 на базе МС1201, естественно, что никакой видеопамяти у нее нет и "знаменитые" шашечки к ней не относятся. Про РУ5, которые в 11й БК, также было сказано, у нее "шашечки" большего размера - потому на экране у вас они видны как полоски. Во многих адресах оказываются коды отличные от этого правила, чаще это последовательность из нулей по большему числу адресов в разряде, чем обычный для данного кристалла размер "шашечек" и вычитываемое значение ячейки отличается от -1, иногда встречаются и такие же нерегулярные единицы в некоторых разрядах.
-
? Patron - 02.03.2011 13:55
Относительно режимов работы процессора 1801ВМ1.
Насколько я понял из результатов тестирования и дизассемблирования ПЗУ ДВК-1 - процессор 1801ВМ1 имеет 3 режима работы ( поддерживаемых на уровне микрокода ).
Условно эти режимы можно обозначить как START-мода, USER-мода и HALT-мода.
1. В START-моду процессор переходит после включения питания и сброса по DCLO - при этом устанавливаются: SEL1 |= BIT_2, PSW = 0340, PC = SEL+00.
2. По своей сути, START-мода - это аппаратно выделенная разновидность USER-моды, отличающаяся только "предварительными установками", перечисленными в п.1
Установка BIT_2 в SEL1 заменяет содержимое адресного пространства USER-моды в диапазоне 160000-163777 содержимым адресного пространства HALT-моды.
3. В HALT-моду процессор переходит при выполнении команды HALT, получении IRQ1, двойном зависании или зависании при приёме вектора прерывания - при этом устанавливается SEL1 |= BIT_3 и выполняется HALT-трап. Установка BIT_3 в SEL1 заменяет содержимое адресного пространства USER-моды в диапазоне 160000-172777 адресным пространством HALT-моды. HALT-трап сохраняет старые значения PC и PSW в ячейках 177674 и 177676 и загружает новые из HALT-вектора по адресу SEL+02, SEL+06 или SEL+12. Новое значение PSW, загруженное из HALT-вектора, должно иметь установленным 10-й бит. В противном случае процессор останется в USER-моде и не будет обслуживать прерывание обычного зависания, как HALT-трап.
4. При выполнении команд START и STEP - процессор 1801ВМ1 сбрасывает BIT_3 в SEL1, но не трогает BIT_2. Поэтому, когда программе эмулятора пульта ДВК-1 требуется выполнить команду START без выхода в USER-моду - перед командой START выполняется команда BIS #4,@#177716, устанавливающая BIT_2 в SEL1 и сохраняющая код эмулятора пульта в адресном пространстве после сбрасывания процессором BIT_3 в SEL1.
5. ПЗУ ДВК-1 содержит:
5.1. 160000-163777 - Программа начального старта и эмуляции пульта.
5.2. 164000-172777 - Подпрограммы тестирования процессора, памяти и портов.
5.3. 173000-173777 - Начальный загрузчик LSI-11 и "TRAP-поле" эмулятора пульта, заполненное командами JSR R0,R0
Поскольку команда JSR R0,R0 выполняется в HALT-моде точно так же, как и команда HALT - надо думать, что разработчики не стали запонять TRAP-поле нулями, дабы не создавать у "продвинутых" пользователей впечатления, будто это место в ПЗУ не используется и по этим адресам можно добавить свой код.
-
? Patron - 02.03.2011 14:29
Или дело в том, что процессор 1801ВМ1 отрабатывает в HALT-моде команду HALT, как NOP...
Для проверки - тест: VM1T10.SAV ( http://zx.pk.ru/attachment.php?attachmentid=25384 ).
При вылете в пульт - тест можно продолжить нажатием 'P'.
-
? anonymous - 02.03.2011 14:50
Результат теста в конце http://qbus.narod.ru/1.txt
Стартовой моды как таковой не существует, процессор стартует всегда в user-моду по адресу, выбираемому из SEL1, бит же пультового режима, для доступа процессора к программе пуска, устанавливается аппаратно по сигналу DCLO, подаваемому также на 30 вывод микросхемы контроллера памяти, 1801ВП1-030, содержащей внутри себя биты 2 и 3 SEL1.
По поводу заполнения остатка адресов в области загрузчика: а в -054 прошивке что записано по этим адресам? Прошивка -054 от -000 отличается наличием загрузчика еще и с КНГМД MX, насколько я помню, однако ее кода у меня нет на руках.
-
? alex savelev@ - 02.03.2011 14:56
насчет ДВК конечно не скажу, но по воспоминаниям о ДВК-2 стоявшей в классе Кувт
память у нее после включения питания также была заполнена вашими "шашечками"
¤
т.е очень весьма похоже на БК. Конечно их не было на экране по причине
другой организации видеопамяти
¤
но в стартовом пульте эти последовательности было видно прекрасно
-
? Patron - 02.03.2011 17:05
Новое открытие!
Весьма похоже, что в HALT-моде 1801ВМ1 только "родное" зависание шины вызывает HALT-трап по вектору SEL+02, тогда как использование команды перехода с регистровой адресацией продолжает вызывать "обычный" TrapTo_4.
...
Кода прошивки -054 у меня нет, но насчёт загрузчика есть уточнение:
1. В диапазоне адресов 173000..173777 расположена ( как я теперь понимаю ) точная копия загрузчика LSI-11, выполняющегося в USER-моде. Команда D0 эмулятора пульта ( в прошивке -00 ) выполняет в HALT-моде такой же код, но расположенный по другим адресам ( 163060..163240 ). Логично предположить, что в прошивке -054 на этом месте закодировали реализацию команды Xn, а команду Dn переделали на START-переход в код загрузчика.
...
Результаты теста T10 заставили меня более внимательно изучить исходник ПЗУ ДВК-1.
Действительно, TRAP-поле загрузчика LSI-11 не используется в эмуляторе пульта ДВК-1. Однако, теперь становится понятно, наколько точно эмулятор пульта ДВК-1 имитирует код micro-ODT LSI-11. TRAP-поле загрузчика LSI-11 заполнено командами JSR R0,R0 скорее всего потому, что это в LSI-11 команда HALT выполняется в HALT-моде как NOP, а команда JSR R0,R0 вызывает HALT-трап. Кроме того, из кода ПЗУ ДВК-1 можно предположить, что micro-ODT LSI-11 использует TRAP-поле загрузчика для внутренних "рекурсивных" вызовов самого себя, осуществляя переходы по адресам 173141, 173541 и 173741. Все эти вызовы тщательно эмулируются кодом ПЗУ ДВК-1, что и ввело меня в заблуждение при первом ознакомлении.
...
Кстати, выяснилось, что помимо хорошо известных кодов ошибки ( 000010, 000011, 000013 ), выводимых по команде 'M' эмулятора пульта - есть ещё один код ошибки ( 000020 ), устанавливаемый micro-ODT LSI-11 при невозможности открыть регистр перфосчитывателя, указанный в команде xxxxxxL.
.
155272
@174000L
163006
@M000020
@P
163010
@P
163012
@
--- Обратно в KMON у меня в эмуляторе уже не выходит.. ---
...
Чтобы окончательно убедиться, что команды перехода с недопустимым методом адресации продолжают вызывать в HALT-моде "обычный" TrapTo_4 - тест: VM1T11.SAV ( http://zx.pk.ru/attachment.php?attachmentid=25385 ).
-
? anonymous - 02.03.2011 19:48
Результат теста в конце http://qbus.narod.ru/1.txt
К сожалению, LSI-11 у меня нет, есть LSI-11/23+ и 11/73 на базе KDF11-AA и KDJ11-A соответственно. KDF11-AA умирает по неизвестной причине, уже менял и процессорную микросборку, и микросборку плавучки, и диспетчер памяти, частично заменил шинные буфера, заменил тактовый генератор, заменил щинник в схеме формирования внутренних задержанных тактовых импульсов. Проявляется деградация, как чтение произвольного кода из памяти при реальном чтении верного кода (навешивал регистр дублирования для проверки), улетания по 0114му вектору при отсутствии активных сигналов DA16/DA17 в фазе данных, фальшивых Trap_to_4 при работе с исправной памятью. (все платы с которыми KDF11-AA сбоит, проверялись теми же тестами с KDJ11-A, причем по 10..27 часов на каждый тест).
-
? anonymous - 02.03.2011 19:52
И, естественно, тестирование на KDJ11-A плат к KDF11-AA производилось без кеширования.
-
? anonymous - 02.03.2011 20:14
Собственно тактовый генератор почему менялся, на его стабильность оказывали влияние процессы в плате; выводы шинного формирователя, в фазе данных читающего ДА16/ДА17, сейчас вообще откусаны, частота снижена с 13.824 до 12.5 МГц, и все равно, тест памяти бегает в лучшем случае часов 5-6, после чего падает... :(
-
? Patron - 02.03.2011 21:48
Для функциональной эмуляции родного дековского ряда - я полагаю, что есть смысл переделать процессорный модуль из SIMH под разрабатываемый мною универсальный API эмуляции. При этом, для добавления режима достоверной эмуляции быстродействия - потребуются максимально точные тайминги всего дековского железа. И ещё весьма пригодятся дампы всех ПЗУ, включая ПЗУ микропрограмм.
...
Что до родной LSI-11, то чем она отличается от процессора М1 "Электроника-60" ?
...
На e-bay есть платы KDF11 по довольно приемлемым ценам: http://shop.ebay.com/i.html?_nkw=KDF11
По ссылке http://shop.ebay.com/i.html?_nkw=LSI11 какой-то тип пытается продать полуплаты LSI-11/02 и LSI-11/23, но просит слишком много :)
-
? Patron - 03.03.2011 18:06
Использование команд JSR R0,R0 в TRAP-поле загрузчика LSI-11 заставляет предположить, что при выполнении команды JSR R0,R0 процессором LSI-11 - адрес возврата успевает "прописаться" в R0 до возникновения прерывания из-за недопустимого способа адресации.
Как ведёт себя в этой ситуации 1801ВМ1 - должен показать тест: TTST5.SAV ( http://zx.pk.ru/attachment.php?attachmentid=25402 ).
-
? anonymous - 03.03.2011 19:22
Запустил, а также запустил на эмуляторе Е11 с установленным типом процессора 11/03, результат одинаков. См. в конце http://qbus.narod.ru/1.txt
-
? anonymous - 06.03.2011 22:37
Цикл обращения к собственным регистрам стандартен, за исключением RPLY
- ответ выставляется одновременно с DIN/DOUT. Рассмотрим цикл 0777 в регистре
0177706 на тактовой 5МГц, т.е. период равен 200нс:
1) через 60нс после заднего фронта очередного тактового импульса (1й) выставляются BSY и адрес
2) через 30нс после заднего фронта следующего (2й) тактового импульса выставляется SYNC
3) через 50нс после переднего фронта следующего (3й) тактового импульса выставляется DIN
4) через 30нс после DIN выставляется RPLY в том же тактовом импульсе
5) через 40нс после RPLY(30нс от заднего фронта того же (3го) тактового импульса) выставляются данные
6) пропускается 1 тактовый импульс (4й)
7) через 60нс от переднего фронта следующего (5й) снимается DIN, был активен 410нс
8) через 40нс после DIN (одновременно с задним фронтом 5го импульса) снимаются RPLY и данные. Т.е. RPLY активен 420нс
9) через 30нс после заднего фронта 6го импульса снимается SYNC. Таким образом SYNC активен 800нс.
10) от снятия SYNC до следующего адреса пропускаются 6 импульсов, 7й будет 1м в новом цикле.
-
? anonymous - 06.03.2011 22:39
Фронты очень пологие, к сожалению, потому до единиц наносекунд их особого смысла измерять нет, началом выходных сигналов я считал середину фронта.
-
? anonymous - 07.03.2011 12:49
Опечатка, имел в виду - началом входных, выходных - начало изменения состояния.
-
? Patron - 07.03.2011 18:56
Для контроля - было бы хорошо в начале измерений точно определять продолжительность цикла команды. Думаю, это удобнее всего делать во время определения продолжительности BSY.
Кстати, в какой момент происходило снятие BSY и какова его измеренная продолжительность ?
То же интересно и относительно адреса. Понятно, что адрес снимался до выставления DIN, но в какой момент ?
Если я правильно посчитал, при циклическом выполнении команды BR в регистре 177706 - на выполнение каждой команды исследовавшийся процессор тратил 12 тактов. Это так ?
Весьма похоже, что если бы снятие RPLY происходило на 10нс быстрее ( т.е. через те же 30нс после DIN, что и установка RPLY ) или на 10нс раньше происходило снятие DIN - цикл DATI сократился бы на целый такт.
-
? anonymous - 08.03.2011 02:21
BSY выставилось после перехода в цикл из ожидания по wait и более не снималось.
Адрес сменялся данными сразу, снятие данных имеет очень пологий фронт, растягивающийся на целый период до снятия SYNC.
Да, получается 12 тактов.
Более сложные команды я не посмотрел пока, меня все время отвлекали работой. :)
-
? anonymous - 08.03.2011 14:11
Я так понимаю, что BSY не снимается вообще, если идет исполнение только кода, без нарушения его внешними запросами или арбитрацией шины.
-
? Patron - 08.03.2011 14:44
Очень любопытно!
Сигнал BSY не снимается процессором 1801ВМ1 в конце цикла "Ввод" - вот и верь после этого временным диаграммам..
Однако, (полагаю) всё равно есть смысл отдельно определять продолжительность выполнения команды на начальном этапе измерений, как расстояние между "одноимёнными" фронтами какого-либо сигнала в двух последовательных командах. Если сигнал BSY для этого не годится, следующий по продолжительности - SYNC.
Прежде чем переходить к командам с операндами - нужно ( на мой взгляд ) выяснить характер распределения суммарной асинхронной задержки DIN<->REPLY ( при обращении к различным типам памяти ) между фазами установки и снятия этих сигналов в цикле DATI.
По адресу 0160110 в ПЗУ ДВК-1 ( с прошивкой -00 ) находится команда JMP (R0) (код 0110). Если зациклить этот код в ОЗУ, ПЗУ и регистре 177706 - можно точно определить, как именно распределяется задержка памяти ( т.е. суммарная длительность промежутков DIN<->REPLY ) между фазами установки и снятия этих сигналов.
...
Проведённые измерения показали, что продолжительность цикла чтения может ( в принципе ) изменяться на целый такт при изменении времени прихода RPLY всего на несколько наносекунд. Это означает, что при определённых условиях - время выполнения команды процессором может случайным образом уменьшаться или возрастать на число тактов, меньшее или равное числу циклов шины, необходимых для выполнения этой команды.
Для начала изучения этого вопроса - статистический тест памяти: VM1C6.SAV ( http://zx.pk.ru/attachment.php?attachmentid=25498 ).
-
? anonymous - 09.03.2011 18:52
Пропустил тест на БК и на ДВК, результат в конце http://qbus.narod.ru/1.txt
-
? Patron - 09.03.2011 21:23
Тест показал, что:
1. Режим Scale=128 ( при котором выполняется последовательность из 128*1 команд и показания счётчика ВЕ-таймера делятся на 1 ) даёт весьма "грязные" результаты.
2. Разброс значений времени выполнения команды MOV (R1),R0 заметно выражен только в медленной памяти БК и составляет 1 такт.
...
Для продолжения тестирования - тест: VM1C7.SAV ( http://zx.pk.ru/attachment.php?attachmentid=25548 ).
-
? anonymous - 10.03.2011 02:50
Готово, распечатка для БК и для ДВК.
-
? Patron - 10.03.2011 12:21
Интересные результаты!
1. При обращении к ОЗУ ДВК - команда Cmp (R1),(R0) выполняется ровно на один цикл DATI дольше, чем команда Cmp (R1),R0 , тогда как при обращении к ПЗУ и служебным регистрам - добавляется (судя по всему) ещё один такт. Это может означать, что при обращении к ОЗУ снятие RPLY запаздывает сильнее, поэтому за время его ожидания операционный блок успевает завершить обработку, тогда как при обращении к ПЗУ и регистрам - RPLY приходит "слишком" быстро и неготовность операционного блока задерживает чтение второго операнда на один такт.
2. Разброс времени выполнения команд не зависит от числа циклов шины и не превышает одного такта.
3. При увеличении числа циклов чтения медленной памяти, осуществляемых в процессе выполнения команды - продолжительность команд БК увеличивается ровно на те же самые 13 тактов, что и у ДВК. При увеличении числа циклов чтения быстрой памяти БК - продолжительность команд возрастает на ту же самую величину 6+1, что и при обращении к служебным регистрам ДВК.
4. Похоже, будто команда Cmp 0(R1),(R0) выполняется на ДВК со "штрафом невзаимности" ( т.е. дополнительной задержкой, вызванной различием способов адресации операндов ) величиной 0..2 такта. Для уточнения этого эффекта - новая версия теста: VM1C7.SAV ( http://zx.pk.ru/attachment.php?attachmentid=25563 ).
-
? anonymous - 12.03.2011 04:12
Тест запустил, http://qbus.narod.ru/1.txt
-
? Patron - 14.03.2011 15:27
23-25-27-29 - такое увеличение продолжительности команды Cmp (R1),R0 - настойчиво заставляет предположить, что задержка выборки адреса практически одинаково влияет на отставание RPLY от DIN и в фазе установки, и в фазе снятия этих сигналов. Интересно, что покажут осцилограммы..
...
А пока - применим статистический метод для измерения таймингов входа в прерывание.
Тест: VM1C8.SAV ( http://zx.pk.ru/attachment.php?attachmentid=25714 ).
-
? anonymous - 14.03.2011 21:02
Тест запустил, http://qbus.narod.ru/1.txt
-
? Patron - 14.03.2011 22:38
Алгоритм расчёта параметра [ IOT + Handler ] в последнем тесте был закодирован с ошибкой.
Исправленный и дополненный вариант теста: VM1C8.SAV ( http://zx.pk.ru/attachment.php?attachmentid=25730 ).
-
? anonymous - 15.03.2011 00:35
Готово.
-
? Patron - 15.03.2011 13:11
Грандиозно! Весьма похоже, что:
1. Продолжительность циклов DATI при обращении к быстрой и медленной памяти БК одинакова.
2. Процессор ВМ1 весьма тщательно "заточен" под работу в двухпроцессорных конфигурациях - об этом говорит одинаковая продолжительность выполнения последовательностей команд RETURN, RTI, IOT и их комбинаций в БК и ДВК ( при любой длине таких последовательностей ), при том что в БК непрерывно выполняется параллельный поток чтения памяти видеоконтроллером. Это прямо означает, что все без исключения захваты шины видеоконтроллером происходят только во время холостых циклов команд и никогда не происходят между завершением одной команды и началом другой.
3. При входе в аппаратное прерывание - БК почти не тратит тактов на приём вектора, поэтому вход в аппаратное прерывание процессора БК происходит быстрее, чем в программное (практически - на время чтения кода команды). В то же время - вход в аппаратное прерывание процессора ДВК занимает примерно на 30 тактов больше, чем продолжительность его входа в программное прерывание, уменьшенная на время чтения кода команды.
-
? Patron - 15.03.2011 13:21
Хотя, если подумать - по пункту 2. далеко не всё так однозначно.
Утверждение было бы справедливым, если бы продолжительность циклов DATI у БК и ДВК была одинаковой.
А если, например, продолжительность цикла DATI у БК меньше, чем у ДВК как раз на то число тактов, которое необходимо видеоконтроллеру для одного доступа к памяти - то последовательное чтение памяти процессором и видеоконтроллером будет занимать у БК как раз столько же тактов, что и один цикл DATI у ДВК - отсюда и одинаковая продолжительность команд при разной скорости памяти.
-
? Аноним - 16.03.2011 00:31
Скорее наоборот, у ДВК длительность больше необходимого - благодаря тому, что контроллер 1801ВП1-030 заточен на работу с 565РУ3, а в БК и ДВК используются гораздо более быстродействующие 565РУ6. 565РУ3 стояли в первой версии платы ДВК-1, НМС111001, под которую и разрабатывался контроллер, в моей же ДВК-1 стоит уже МС1201 - переразведенная под РУ6 версия, но контроллер тот же самый. В последующих моделях на базе ВМ2 используется контроллер 1801ВП1-013, работающий с 565РУ6 изначально и использующий полное их быстродействие.
-
? anonymous - 16.03.2011 00:35
И еще по поводу времянок - что, кроме jmp @rx в памяти/пзу/таймере, посмотреть желательно?
-
? Patron - 16.03.2011 12:07
Исследование таймингов должно дать ответ на следующие вопросы:
1. Чем и как отличаются времянки циклов DATI, DATO и DATIO процессора 1801ВМ1.
2. Как изменяется времянка DATI при чтении из:
2.1. регистра 177706
2.2. ячейки ПЗУ ( напр. 173000 )
2.3. регистра порта ( напр. 177560 )
2.4. ячейки ОЗУ
3. Как изменяется времянка DATO при записи в:
3.1. регистр 177706
3.2. регистр порта ( напр. 177560 )
3.3. ячейку ОЗУ
4. Как изменяется времянка DATIO при обращении к:
4.1. регистру 177706
4.2. регистру порта ( напр. 177560 )
4.3. ячейке ОЗУ
...
Исследование пунктов 3 и 4 требует использования команд типа MOV R0,(R0) и ADD R0,(R0) . В такой ситуации (скорее всего) есть смысл и для исследования пункта 2 использовать не JMP (R0), а CMP R0,(R0) , т.к. это позволит сравнивать не только времянки циклов шины, но и времянки самих команд.
-
? Patron - 17.02.2012 23:18
Выяснилось, что тест взаимодействия аппаратных прерываний и Т-трапа был составлен не вполне корректно.
¤
Вот исправленный вариант этого теста: PDPT1A.SAV ( http://zx.pk.ru/attachment.php?attachmentid=33121 )
-
? Patron - 22.02.2012 13:10
Есть основания полагать, что результаты тестов
1801VM1 Interrupts Test #4
1801VM1 Interrupts Test #5b
неадекватны из-за передачи управления в RMON в обработчике V100.
¤
Исправленные варианты тестов:
1801VM1 Interrupts Test #4с : VM1T4C.SAV ( http://zx.pk.ru/attachment.php?attachmentid=33254 )
1801VM1 Interrupts Test #5с : VM1T5C.SAV ( http://zx.pk.ru/attachment.php?attachmentid=33255 )
-
? anonymous - 23.02.2012 14:29
Я в ноябре по работе перебрался на новое место и все оборудование закопано еще, как только разгребу завалы коробков с железками - проверю.
-
? Patron - 23.02.2012 16:08
Это хорошо!
Надо бы ещё всё же сравнить времянки цикла DATI процессора 1801ВМ1, зациклив команду JMP @R0 в памяти, ПЗУ, ВЕ-таймере и порту какого-нибудь контроллера.
А то наше исследование циклов шины ВМ1 застопорилось на самом интересном месте.
-
? anonymous - 12.03.2012 13:51
Сейчас попался процессор 1983го года выпуска, который BSY убирает. Или цикл был оптимизирован в выпусках последних лет, или в той моей плате не вполне исправный стоит камушек. Нужны другие образцы для выяснения.
Пока платка на руках, попробовал jmp (r0) погонять в памяти, пзу и регистре таймера. Оказалось, тот осцилограф, который на новом месте выдали, в весьма неудобном виде сохраняет информацию, вот результат на пробу http://qbus.narod.ru/jmpr0.tbz сохранял в порядке озу, затем пзу, затем таймер. Останов на 160442, т.к. нажимал сброс, а не стоп.
@1000/177756 777
@1000G
160442
@0/000021 110
@R0/160440 0
@0G
160442
@1000/000777 12737
001002/000000 37
001004/177777 177716
001006/000000 12700
001010/177777 160110
001012/000000 110
@1000G
160442
@177706/104014 110
@R0/160440 177706
@177706G
-
? Patron - 12.03.2012 14:40
Т.е. строчки в файлах .csv типа:
-696.04000E-06, 255, 255
означают:
time == -696.04000E-06
AD0|RPLY|WTBT|DOUT|DIN|SYNC|BSY|CLC == 255
AD15|AD14|AD13|AD5|AD4|AD3|AD2|AD1 == 255
...
Похоже, нужен конвертер. Но в какой формат?
-
? Patron - 12.03.2012 18:24
Здесь примеры конвертации таблицы scope_2.csv : ( http://em-api.narod2.ru/add/scope_2/ )
Вариант 1: ( http://em-api.narod2.ru/add/scope_2/scope_2c.csv.txt )
Вариант 2: ( http://em-api.narod2.ru/add/scope_2/scope_2t.csv.txt )
Вариант 3: ( http://em-api.narod2.ru/add/scope_2/scope_2c.txt )
...
В архиве ( http://qbus.narod.ru/jmpr0.tbz ) присутствует графический файл
scope_1.tif
и 7 пригодных для конвертации таблиц:
scope_2.csv ; scope_3.csv ; scope_4.csv ; scope_5.csv ; scope_6.csv ; scope_7.csv ; scope_8.csv
...
Что именно зафиксировано на каждой из них ?
-
? anonymous - 12.03.2012 18:51
Каждая пара - соответственно времянка для озу/пзу/регистра и на первой паре тренировался, там цикл с BR. В паре один файл показывает сам цикл, второй - пространство между циклами захватывает. Сделано так из-за нежелания осцилографа писать в лог то, что ушло за экран. В меню записи можно выбрать формат, потому графический файл нарисовался - но в нем нет информации о временах, на графическом - цикл с BR.
-
? anonymous - 12.03.2012 18:55
А, нет, там десятка видна в данных - значит тоже jmp @r0. Третий вариант преобразования наиболее нагляден, как мне кажется. Вообще были программки для копания в CSV-логах у Tektronix и Agilent, надо поискать...
-
? Patron - 12.03.2012 19:11
Таким образом:
scope_3.csv + scope_4.csv = jmp @r0 в ОЗУ
scope_5.csv + scope_6.csv = jmp @r0 в ПЗУ
scope_7.csv + scope_8.csv = jmp @r0 в 177706
Правильно?
...
Там в парах насколько точная стыковка?
Если пары идут с "перехлёстом", то после пробной конвертации обеих частей пары - нужно будет их "стыковать", отрезая лишнее.
...
В принципе - скрипт может сразу HTML генерить, тогда вместо звёздочек и точек можно будет показывать фрагменты осцилограммы.
-
? Patron - 12.03.2012 20:59
Посмотрел scope_3.csv и scope_4.csv.
Отсчёты в scope_3.csv идут через 10 нс, а в scope_4.csv - через 5 нс.
Получается, что первый файл в этой паре "обзорный", а второй - "подробный".
-
? Patron - 12.03.2012 21:26
Сконвертировал все таблицы:
( http://em-api.narod2.ru/add/scope_3/ ) ; ( http://em-api.narod2.ru/add/scope_3/scope_3c.txt )
( http://em-api.narod2.ru/add/scope_4/ ) ; ( http://em-api.narod2.ru/add/scope_4/scope_4c.txt )
( http://em-api.narod2.ru/add/scope_5/ ) ; ( http://em-api.narod2.ru/add/scope_5/scope_5c.txt )
( http://em-api.narod2.ru/add/scope_6/ ) ; ( http://em-api.narod2.ru/add/scope_6/scope_6c.txt )
( http://em-api.narod2.ru/add/scope_7/ ) ; ( http://em-api.narod2.ru/add/scope_7/scope_7c.txt )
( http://em-api.narod2.ru/add/scope_8/ ) ; ( http://em-api.narod2.ru/add/scope_8/scope_8c.txt )
-
? Patron - 13.03.2012 01:53
Добавил осциллограммы с сеткой 10 нс:
...
2, 3 и 4 = JMP (R0) в 0000000 ( ОЗУ )
( http://em-api.narod2.ru/add/scope_2/scope_2.html ) - точность 10 нс
( http://em-api.narod2.ru/add/scope_3/scope_3.html ) - точность 10 нс
( http://em-api.narod2.ru/add/scope_4/scope_4.html ) - точность 5 нс
...
5 и 6 = JMP (R0) в 0160110 ( ПЗУ )
( http://em-api.narod2.ru/add/scope_5/scope_5.html ) - точность 10 нс
( http://em-api.narod2.ru/add/scope_6/scope_6.html ) - точность 5 нс
...
7 и 8 = JMP (R0) в 0177706 ( ЦПУ )
( http://em-api.narod2.ru/add/scope_7/scope_7.html ) - точность 5 нс
( http://em-api.narod2.ru/add/scope_8/scope_8.html ) - точность 2 нс
-
? ys05 - 13.03.2012 02:30
Да, интересно, получается в справочнике временная диаграмма дана без учета влияния задержки снятия RPLY в конце цикла - а только с учетом задержки его выставления в начале цикла. Надо уточнять формулы с учетом обоих t(DIN-RPLY). На всякий случай уточню, что из справочника следует, что SYNC выдается по спадам CLC, DIN по фронтам CLC, и RPLY анализируется по фронтам CLC. Это вроде, подтверждается этими осциллограмами. Повторю, на БК RPLY еще проходит триггер, стробируемый спадом CLC. Это вроде, тоже видно на осциллограммах - т.е. насколько я понимаю, эти осциллограммы сняты на БК (или на аналогично включенном ВМ1). В таком случае, мы видим не чистый RPLY (за исключением случая внутреннего регистра ВМ1), а "округленный" до тактовой частоты.
-
? Ал-р - 13.03.2012 05:20
Да, в реал-БК RPLY для искключения проблем со слишком "торопливыми" ВУ правильно привязан к циклам ВМ1.
-
? anonymous - 13.03.2012 08:22
Снимались временные диаграммы на МС1201.1 1983го года выпуска, взятой из стенда для тестирования электронных модулей.
Подвязка к тактовой использовалась во всех попадавшихся мне устройствах с ВМ1, следует она из указания необходимости такой подвязки в ОСТ на ВМ1.
-
? Patron - 13.03.2012 12:36
Добавил сжатые осциллограммы с сеткой 100 нс:
...
2, 3 и 4 = JMP (R0) в 0000000 ( ОЗУ )
( http://em-api.narod2.ru/add/scope_2/scope_2d.html ) - растр 10 нс
( http://em-api.narod2.ru/add/scope_3/scope_3d.html ) - растр 10 нс
( http://em-api.narod2.ru/add/scope_4/scope_4d.html ) - растр 5 нс
...
5 и 6 = JMP (R0) в 0160110 ( ПЗУ )
( http://em-api.narod2.ru/add/scope_5/scope_5d.html ) - растр 10 нс
( http://em-api.narod2.ru/add/scope_6/scope_6d.html ) - растр 5 нс
...
7 и 8 = JMP (R0) в 0177706 ( ЦПУ )
( http://em-api.narod2.ru/add/scope_7/scope_7d.html ) - растр 5 нс
( http://em-api.narod2.ru/add/scope_8/scope_8d.html ) - растр 2 нс
... ... ...
Краткий анализ:
Сравнив графики 4 и 6 можно заметить, что "задержка памяти" имеет две составляющие, а именно: 1) задержка выборки ; 2) задержка прохождения.
Для дальнейшего анализа надо бы разобраться, в какой последовательности устройство устанавливает/снимает данные и RPLY.
На диаграмме из ОСТ II 348.918-83 ( http://em-api.narod2.ru/add/1801vm1_021.jpg ) показано, что снятие/установка RPLY опережает данные, а на наших осциллограммах (насколько я понял) так происходит только при чтении регистров процессора.
Второй вопрос: На графике 4 видно, как линия AD3 активируется через 180 нс после DIN ( и это точно не адрес ). Но если это готовые данные, выставленные контроллером ОЗУ - почему RPLY выставляется только через 1000 нс после данных ?
...
И ещё - мне показалось, что вот такая программа - позволяет, нажав клавишу <H> ( код 0110 ) - зациклить код 0110 в регистре данных клавиатуры:
Mov #177562, R0
CmpB #110, (R0)
BNE .-4.
Jmp (R0)
но у меня в эмуляторе при запуске этой программы в пульте через @1000G - символ G в регистре данных клавиатуры не изменяется несмотря на нажатия клавиш..
-
? ys05 - 13.03.2012 13:16
Вообще, в QBUS данные должны опережать RPLY (может быть возможен вариант одновременности, не помню). И внешние устройства всегда так должны делать, так как RPLY - это именно сигнал ведущему устройству, что данные уже готовы!
Просто в данном случае процессор, как инициатор обмена, имеет некоторый запас в сторону обратного перекоса, что, очевидно, и показано на диаграмме из ОСТ, то есть в предельном случае, даже если данные задержатся на 200нс от RPLY, то цикл все равно будет выполнен правильно. Здесь "200 нс max" надо понимать в том ключе, что возможны и отрицательные величины, то есть -1000нс < 200 нс тоже.
Похоже, в случае с внутренним регистром процессора он формально нарушает временную диаграмму QBUS - такой финт будет работать с ним самим или с внешним ведущим устройством QBUS, также допускающим задержку RPLY "про запас".
-
? Patron - 13.03.2012 13:29
Моя версия огромного запаздывания REPLY контроллера ОЗУ после установки на шину значения бита 3 такая - контроллер ОЗУ извлекает и устанавливает биты по одному и только после установки последнего бита - выставляет RPLY. Надо будет позже это проверить, читая в цикле командой TST (R0) значение 0177777 из ячейки 0000000 и снимая график CLC, DIN, RPLY и AD3 - AD15.
-
? Ал-р - 13.03.2012 15:23
У БК вообще-то нету 0177777 и ячейки 0000000 (адрес 177777 как-бы возможен, но ... :)
" контроллер ОЗУ извлекает и устанавливает биты по одному и ..." - Вы в чьём-то эмуле балуетесь?
-
? anonymous - 13.03.2012 15:52
Patron, как он может биты извлекать, если выходы озу с ним не соединены даже, из него на озу выходят 4 строба записи адреса, два CAS выбирают старший/младший байты, два RAS выбирают банк, т.е. минимальная выбранная часть озу - 8 микросхем. Озу параллельную организацию имеет и из 32 микросхем состоит, выходы двух банков на 16-разрядный буферный регистр приходят. Запись в него и выдачу из него по всем 16 разрядам также стробирует контроллер памяти еще двумя сигналами.
Ал-р, там код 0177777 из ячейки 0 было предложено, а не ячейку 0177777. Сейчас работа есть, как будет окошко - посмотрю.
-
? Patron - 13.03.2012 17:35
Уж очень неожиданно, что при обращении к ОЗУ сигнал RPLY выставляется через 1000 нс после начала выставления данных. Если выяснится, что все биты данных оказываются на шине уже через 200 нс после установки DIN, то тогда и будем думать, зачем контроллеру памяти нужно ждать ещё 1000 нс перед выставлением RPLY.
...
Анализ показал следующее:
1. Состояние шины после снятия сигнала DIN ( назовём это событие DIN0 ) не влияет на "реализацию" кода команды процессором. Для всех трёх рассмотренных случаев - промежуток между DIN0 и началом следующей команды составил 14 тактов ( если считать такт DIN0 нулевым, то первый такт следующей команды будет 15-м ). Т.е. можно утверждать, что время "реализации кода" команды JMP @Rx процессором 1801ВМ1 составляет 14 тактов.
2. Разница в продолжительности выполнения команды JMP @Rx ( как суммы этапов выборки и реализации кода ) полностью определяется интервалом между установкой сигналов DIN и RPLY ( DIN1-RPLY1 ).
...
Итоги таковы ( полная продолжительность команды в тактах обозначена как BSY1-BSY1 ):
JMP @R0 в 0177706 ( ЦПУ ): DIN1-RPLY1== 0 ; BSY1-BSY1 == 18
JMP @R0 в 0160110 ( ПЗУ ): DIN1-RPLY1 == 2 ; BSY1-BSY1 == 20
JMP @R0 в 0000000 ( ОЗУ ): DIN1-RPLY1 == 6 ; BSY1-BSY1 == 24
...
Таким образом, определяющий асинхронный параметр для ПЗУ составил ~ 400 нс, а для ОЗУ ~ 1200 нс.
Далее нам следует понять, какие справочные характеристики протестированных микросхем нужно "взять за основу"и как учесть величину имевшей место при тестировании тактовой частоты, чтобы получить эти самые 400 и 1200 нс, которые и определяют продолжительность выполнения процессором 1801ВМ1 команды JMP @R0 ( как и продолжительность выполнения любой другой команды, содержащей лишь один цикл шины ).
-
? Про время даже меньше чем 1986 (до Васика) - 13.03.2012 19:00
Когда-то было какое-то ВУ-КД через порт УП?
-
? Patron - 14.03.2012 12:28
Исправил эмулятор и прогнал программу зацикливания кода 0110 ( буква 'H' ) в регистре данных клавиатуры:
160442
@1000/177777 12700
001002/000000 177562
001004/177777 22710
001006/000000 110
001010/177777 1375
001012/000000 112737
001014/177777 43
001016/000000 177566
001020/177777 110
@1000G#
177562
@
После запуска программа ожидает появления в регистре 0177562 кода 0110, а дождавшись - выводит на экран '#' и выполняет Jmp @R0
-
? anonymous - 16.03.2012 10:38
http://qbus.narod.ru/cycles0.tbz
Лог с номером 0 - результат 11001 776, где в ячейке 0 177777, а в r0 - 0
логи 1 и 2 - тоже самое, но адрес команды 11001 был в r2 и вместо 776 было 112
логи 3 и 4 - выполнение 110 в регистре клавиатуры терминала
-
? Patron - 16.03.2012 16:37
Осциллограммы с сеткой 100 нс:
...
3 и 4 = JMP (R0) в 0177562 ( регистр данных клавиатуры )
( http://em-api.narod2.ru/add/scope_3a/scope_3d.html ) - растр 10 нс
( http://em-api.narod2.ru/add/scope_4a/scope_4d.html ) - растр 2 нс
...
0 = MOV (R0), R1 ; BR .-2.
( http://em-api.narod2.ru/add/scope_0a/scope_0d.html ) - растр 10 нс
...
1 и 2 = MOV (R0), R1 ; JMP (R2) - объединённый вариант графиков 1 и 2
( http://em-api.narod2.ru/add/scope_1a_2a/scope_1_2d.html ) - растр 10 нс
...
При сохранении нескольких экранов в рамках одного измерения - используемый осциллограф сохраняет "сквозную нумерацию времени", поэтому объединять таблицы легко.
Полностью разъяснилась ситуация с быстрым выставлением данных на шину при зацикливании кода 110.
На самом деле - выставляется предыдущее содержимое буферного регистра, но т.к. читаемая ячейка всё время одна и та же - предыдущие данные в буферном регистре совпадают с читаемыми.
...
Продолжительность команды JMP @R0 при её зацикливании в регистре данных клавиатуры составила 22 такта:
JMP @R0 в 0177562 ( порт ): DIN1-RPLY1== 4 ; BSY1-BSY1 == 22
-
? Patron - 18.03.2012 22:22
После анализа всех доступных измерений таймингов команд процессора ВМ1 у меня возникло ощущение, что доступ к содержимому регистра R0 может ( в некоторых случаях ? ) осуществляться процессором на 1 такт быстрее, чем к R1, R2, R3, R4 и R5.
...
Т.к. "склеивание" таблиц данных последовательных экранов оказалось элементарно простым - предлагаю обнулить регистры R0 и R1, записать 0 по адресу 0, поместить в R2 стартовый адрес, выполнить следующий цикл с шагом выборки 10 нс и сохранить несколько перекрывающихся экранов:
MOV (R0), R4
MOV (R1), R5
JMP (R2)
Затем записать в регистры R1 и R2 адрес 177706, записать 0 по адресу 177706, поместить в R0 стартовый адрес, выполнить следующий цикл с шагом выборки 10 нс и сохранить несколько перекрывающихся экранов:
MOV (R1), R4
MOV (R2), R5
JMP (R0)
-
? Patron - 22.03.2012 13:59
Важный этап исследования - сравнение осциллограмм выполнения типовой регистровой команды ( например: MOV R1,R0 ) при максимальной и нулевой задержке памяти.
Для этого нужно выполнить цикл MOV R1,R0 ; JMP (R2) в памяти и регистрах ВЕ-таймера.
Для запуска цикла в регистрах таймера - используется такой подход:
160442
@177706/104014 112
@177712/177400 0
@177710/000112
@177706/000112 10100
@R2/000000 177706
@R7/160442 177706
@P
177710
@177706/010100
177710/000112
@
Здесь играют роль следующие моменты:
1. При записи 0 в 177712 - содержимое 177706 копируется в 177710.
2. При выполнении команды пульта G - выполняется команда RESET, снова копируюшая 177706 в 177710, поэтому запуск программы в регистрах таймера нужно осуществлять командой пульта P.
-
? tim - 27.05.2012 09:48
А результаты работы за 2 года исследований ВМ1 можно опубликовать как-то в более удобоваримом виде ? С программами, тестами... Стандартные доки видимо не все описывают.
-
? anonymous - 27.05.2012 21:44
Еще не закончили :) У меня сейчас работа все свободное место на всех моих столах занимает, вот сдадим комплекс, будет окошко продолжить эксперименты.
-
? gid - 27.08.2012 14:52
Где-то далеко выше в этой теме говорилось о пультовом режиме ВМ1 и командах STEP и START. Чтобы не искать приведу цитату оттуда: "Для выхода из пультовой программы используются команды START и STEP, с кодами 012 и 016 соответственно, аналогичные по действию командам RTI и RTT, но по наличию сигнала IRQ1, т.е. если IRQ1 установлен, то выход по STEP загружает PC и PSW из регистров копии, сбрасывает бит 3 в SEL1 и выполняет одну инструкцию, после чего возвращается в пульт, а START перед выполнением инструкции анализирует IRQ1 и возвращает управление в пульт пти его наличии незамедлительно."
Т.е. STEP и START анализируют IRQ1, и если он есть - то выполняют свои действия, а если его нет, то что делают?
На БК они вызывают прерывание по вектору 4 независимо от наличия IRQ1, это они делают по разным причинам?
Ещё IRQ1 называют "останов работы процессора", т.е. когда на входе постоянный лог.0 то процессор полностью приостанавливает свою работу, или какие-то циклы выполняются? Хотелось бы подробностей, тем более что если процессор не выполняет никаких команд, не читает ничего с шины АД, то как он в пультовом режиме получает и выполняет команды STEP и START?
-
? Patron - 27.08.2012 17:39
Описание всех тонкостей пультового режима ВМ1 можно прочитать здесь: ( http://zx.pk.ru/showthread.php?t=17277&postid=434967 )
-
? Александр Тишин (Sandro)@ - 27.08.2012 18:03
Там есть небольшая неточность: бит 3 в SEL1 взводится до всех прочих манипуляций (что логично), поэтому в машинах без HALT режима он всё равно будет поднят. В БК это позволяет отличить нажатие на СТОП от прочих причин попадания на 4 вектор.
PS: Перечитал ветку -- получается всё-таки, что материал на этот режим собран весь? Или как?
-
? anonymous - 27.08.2012 19:21
gid:
「Т.е. STEP и START анализируют IRQ1, и если он есть - то выполняют свои действия, а если его нет, то что делают?」
Если нет IRQ1, то обе передают управление программе по адресу из CPC и с приоритетом процессора из CRS.
「На БК они вызывают прерывание по вектору 4 независимо от наличия IRQ1, это они делают по разным причинам?」
Это они делают, т.к. читают CRS которого нет в БК.
「Ещё IRQ1 называют "останов работы процессора", т.е. когда на входе постоянный лог.0 то процессор полностью приостанавливает свою работу, или какие-то циклы выполняются?」
Он переводит процессор в пультовую моду, в которой реализована эмуляция MicroODT. На больших машинах PDP процессор реально при этом вставал в состояние, аналогичное предоставлению DMA, а отладку производила логика пультовой консоли, которая доступала к памяти процессора через захваченную магистраль системы, именно поэтому старые процессоры имели внутренние регистры, доступные для чтения-записи через адресное пространство магистрали.
Именно с тех пор и сохранился рудиментарный термин ОСТАНОВ, на современных процессорах означающий переход процессора на выполнение пультовой микропрограммы(в машинах DEC и их клонах) либо пультовой программы(для серий 1801/1806/1836).
-
? anonymous - 27.08.2012 19:27
Поправка, читают сперва CPC, которого нет в БК.
И при правильно спланированной архитектуре машины, исполнение пультовой программы, за исключением циклов модификации памяти пользователя/системы, не должно вызывать выполнения циклов на шине, но все машинки на серии 1801 максимально упрощены из экономических и габаритных соображений, потому трансляция циклов пультовой моды не блокируется.
-
? gid - 27.08.2012 19:32
А кем и где устанавливается бит 3 ? У ВМ1 ведь нет внутренней реализации регистра SEL1, а в схемах БК ничего подобного описаниям нету.
Судя по схемам БК, как 0010 так и 0011М, там при записи в регистр SEL1 устанавливается в 1, а при чтении, из SEL1, пока конденсатор не успел разрядиться, фиксируется в триггере и передаётся во второй адресный разряд шины данных единица, а если чтение будет позже, когда конденсатор успеет разрядиться, то при чтении из SEL1 в триггере зафиксируется 0 и на шину данных во второй адресный разряд передастся 0. Это он и есть, тот самый третий бит?
И тогда как конкретно на БК, команда HALT или IRQ1 установят бит 3, а STEP и START сбросят бит 3? Подозреваю, все эти манипуляции с битами имеют отношение к чему угодно, только не к БК.
-
? anonymous - 27.08.2012 19:43
В БК 2й разряд SEL1 фиксирует любую запись в этот регистр, взводя триггер D9.1 на неограниченное время, сбрасывается который любым чтением этого регистра. При этом процессор, поймав одну из 4 причин выхода в пультовую моду, микропрограммно читает SEL1, добавляет в него бит 3 и затем пишет полученное значение обратно, кстати именно так отключается реле магнитофона при нажатии на СТОП, всегда установленным 7м битом по чтению, и именно эту запись и фиксирует триггер D9.1. Аппаратно в БК бит 3 не реализован, потому при доработке, добавляющей пультовый режим, следует допаять еще один триггер, выходом которого будет переключаться ПЗУ монитора на ПЗУ пультовой программы.
-
? Patron - 27.08.2012 20:11
Действительно, при переходе в пультовую моду процессор ВМ1 сначала устанавливает бит 3 в SEL1 - описание исправлено.
.
Sandro, я написал тесты для всего, что хотелось знать про режим пульта ВМ1.
Если чего-то не хватает - дополнительно протестируем и узнаем.
Но похоже, что про пультовой режим ВМ1 известно уже всё.
-
? gid - 27.08.2012 21:20
И ещё один уточняющий вопрос.
Ранее говорилось, что бит 11 PSW ВМ1 маскирует IRQ1, а бит 10 - маскирует все прерывания, кроме прерывания по ошибке обращения к каналу. А так как Patron писал, что Процессор 1801ВМ1 выполняет команду HALT, как программное прерывание особого типа, то означает ли это что бит 10 маскирует и HALT? Или он работает одинаково и в HALT и в USER моде?
-
? Patron - 28.08.2012 00:59
В процессоре ВМ1 невозможно запретить/замаскировать любые программные прерывания ( IOT, BPT, TRAP, EMT, HALT ), а также любые внутренние прерывания процессора ( кроме прерывания по вектору 014, которое разрешается/запрещается битом 020 в PSW ).
-
? gid - 28.08.2012 10:01
То есть установка бита 10 PSW ни на что не влияет? Или всё-таки как-то меняет поведение диспетчера прерываний процессора?
-
? Patron - 28.08.2012 11:22
Установка бита 10 PSW (насколько я понимаю) запрещает только те прерывания, которые происходят после поступления в процессор сигналов по линиям VIRQ, IRQ1, IRQ2, IRQ3.
Это все прерывания от внешних устройств, прерывание от таймера и прерывание от кнопки "Пульт".
Запрещает ли бит 10 PSW прерывания по сигналам ACLO и DCLO я не знаю (мы это не проверяли), по идее - не должен.
-
? gid - 03.09.2012 13:37
Я наверно уже надоел c этими STEP/START, но есть ещё не понятный мне момент. Интерпретируя сказанное здесь anonymousом и алгоритм, описанный у Patronа, у меня получаются следующие алгоритмы работы этих команд:
START:
if (IRQ1 active){ //START перед выполнением инструкции анализирует IRQ1
//и возвращает управление в пульт при его наличии незамедлительно
// т.е. ничего не делает?
}
else{ //Если нет IRQ1, то обе передают управление программе по адресу из CPC и с приоритетом процессора из CRS.
//очищает ли бит 3?
MOV @#CPC,PC
MTPS @#CPS
JMP (PC)
}
.
STEP:
if (IRQ1 active){ //если IRQ1 установлен
BIC #10,@#SEL1 //сбрасывает бит 3 в SEL1
MOV @#CPC,PC //выход по STEP загружает PC и PSW из регистров копии
MTPS @#CPS
Execute(PC) //и выполняет одну инструкцию, после чего возвращается в пульт
//тут я думаю, что после выполнения инструкции в CPC и CPS нужно загрузить новые значения, получившиеся после выполнения инструкции, иначе смысл самого этого выполнения теряется.
HALT //и проще всего сделать возврат с пульт - выполнив микрокод команды HALT
}
else{ //Если нет IRQ1, то обе передают управление программе по адресу из CPC и с приоритетом процессора из CRS.
//очищает ли бит 3?
MOV @#CPC,PC
MTPS @#CPS
JMP (PC)
}
Так ли это? Поскольку у ВМ1 нет регистров сохранения PC и PS пультовой моды, то куда происходит возврат в пульт от команды STEP?
.
И второй вопрос. На БК опкоды START - 010, 011, 012, 013 и STEP - 014, 015, 016, 017 при выполнении вызывают одинаковый результат, т.е. на уровне микрокода в ВМ1 эти команды идентичны? В смысле 010 == 011 == 012 == 013 и 014 == 015 == 016 == 017
А 012 и 016 выбраны просто как дань традиции и для совместимости с остальными процессорами семества?
-
? Patron - 03.09.2012 14:58
1.
Утверждение, что команда START перед выполнением анализирует IRQ1 - ОШИБОЧНО.
Команды START и STEP выполняются АБСОЛЮТНО ОДИНАКОВО и при наличии IRQ1 и при отсутствии (алгоритм см. здесь: http://zx.pk.ru/showthread.php?t=17277&postid=434967 ).
Разница лишь в том, что происходит ПОСЛЕ завершения выполнения этих команд ( в зависимости от битов загруженного PSW и активности IRQ1 ).
Если при этом установлен IRQ1, а биты 10 и 11 в загруженном командой значении PSW очищены, то после команды START следующая команда (т.е. та команда, адрес которой команда START поместила в PC) не выполняется, а вместо этого блок прерываний процессора 1801ВМ1 немедленно выполняет HALT_TrapTo_02.
После же команды STEP - работа блока прерываний блокируется на один шаг.
2.
Иногда для упрощения говорят, что если установлен IRQ1, а биты 10 и 11 в загруженном командой значении PSW очищены, то после команды STEP сначала выполнится та команда, адрес которой команда STEP поместила в PC и лишь затем произойдёт HALT_TrapTo_02 - но важно понимать, что на самом деле такое утверждение ОШИБОЧНО. Если за тот шаг, на время которого команда STEP заблокировала работу блока прерываний процессора, сигнал IRQ1 будет снят или выполненной командой будет установлен бит 10 и/или бит 11 PSW, то никакого HALT_TrapTo_02 после завершения следующей за STEP команды НЕ ПРОИЗОЙДЁТ.
3.
MTPS @#CPS --- ОШИБКА
ПРАВИЛЬНО --- [ MOV @#CPS, RS | BIC #01400, RS ]
4.
Опкоды 010, 011, 013, 014, 015, 017 мы не тестировали. Если указанные группы кодов реализуют команды START и STEP - программную модель процессора 1801ВМ1 нужно уточнить.
Откуда информация? Вы сами эти коды тестировали?
-
? gid - 03.09.2012 15:43
Да, сам. Давным давно, когда узнал, что некоторые зарезервированные опкоды вызывают прерывание по вектору 10, а некоторые - по вектору 4. Была таблица, совершенно не помню где, то ли в "ПК БК", то ли в "ВТ и её применение", то ли ещё в каком-то журнале. И я не поленился и проверил каждый опкод, и сам убедился, что так оно и есть. Для меня ещё оставалось загадкой, почему опкод 7 вызывает прерывание 010, а опкоды
010..017 уже - 4, а 020..077 снова - 010. Мне это казалось довольно нелогичным. И только сильно позже, я узнал, что 010..017 - это команды START и STEP.
-
? gid - 03.09.2012 15:51
Забыл, ещё тут http://pdp-11.ru/mybk/doc/PDP11.TXT подтверждение что START - 010, 011, 012, 013 и STEP - 014, 015, 016, 017. Просто там для ВМ2 опкод 012 выделен из остальных STARTов, а 016 - из остальных STEPов, как обстоят дела для ВМ1, вообще нет никакой информации, кроме того, что все они на БК вызывают прерывание по вектору 4
-
? tim - 07.09.2012 21:17
Перечитывая доку на ВМ1 обнаружил, что сигнал INIT маркируется как вход/выход. В каких случаях он работает как вход ?
-
? gid - 07.09.2012 22:14
Когда ВМ1 выполняет команду RESET, он этим сигналом инициализирует все другие устройства, к которым подведён INIT, тут он работает как выход, когда выполняется цикл инициализации процессора, тоже выдаётся наружу сигнал INIT для других устройств, а во всех остальных случаях - как вход, чтобы какое-либо внешнее устройство, например кнопка Ресет, инициализировало сам процессор.
Примерно так.
-
? Patron - 07.09.2012 22:36
Не уверен, что сигнал на входе INIT ресетит процессор 1801ВМ1.
Во всяком случае, по команде RESET процессор не ресетится ( т.е. не переходит в то состояние, которое получает после [ подачи питания ] / [ прихода сигнала DCLO ] ).
Всегда думал, что кнопка [ Ресет ] /[ Сброс ] выдаёт сигнал DCLO.
-
? gid - 07.09.2012 22:47
Верно, тут я ступил, кнопка ресет к сигналу INIT не имеет никакого отношения. Просто на БК INIT как вход похоже не используется, и в этом случае я не могу ничего говорить достоверно, то что я сказал выше, я где-то, когда-то давным-давно прочитал, и за давностью лет мог просто всё переврать.
-
? anonymous - 08.09.2012 08:38
INIT является входом для таймера процессора и возможно еще каких-то бит в системных регистрах, сейчас посадил кнопку на INIT, подачей внешнего сигнала запущенный предварительно внутрипроцессорный таймер останавливается.
-
? tim - 08.09.2012 13:24
Спасибо за эксперимент
-
? tim - 08.09.2012 13:26
А командой RESET таймер тоже останавливается ?
-
? anonymous - 08.09.2012 13:31
Останавливается, конечно.
-
? tim - 08.09.2012 14:35
Т.е. INIT нужно развязывать через резистор как RPLY если есть сигнал от внешнего источника ?
-
? Александр Тишин (Sandro)@ - 08.09.2012 15:11
А прескалер на 128 у него при этом сбрасывается или нет? Если да, то это замечательно -- можно было бы сделать идеальный мультиколор на БК ...
-
? Patron - 08.09.2012 19:52
CLC-счётчик ВЕ-таймера (насколько я помню) по команде RESET и сигналу INIT не обнуляется.
Он обнуляется только при подаче питания и приходе сигнала DCLO.
Проверить это нетрудно. Нужно в цикле SOB считывать значение счётчика запущенного таймера и при его первом изменении ( например, 000000 >> 0177777 ) выходить из цикла и выводить число проходов. Потом прогнать этот тест несколько раз без команды RESET перед циклом SOB и с ней.
-
? anonymous - 09.09.2012 00:57
При останове сигналом INIT, значение счетчика остается такое, каким застал его приход сигнала, младший же байт регистра 0177712 при этом обнуляется.
-
? Patron - 09.09.2012 12:50
Sandro имел в виду не тот счётчик, значение которого доступно в регистре 0177710, а тот (считающий такты CLC), значение которого делится на 128/512/2048, чтобы определить момент декремента регистра 0177710 при запущенном счёте.
Поскольку этот счётчик непрерывно считает такты CLC - промежуток (в тактах CLC) от запуска счёта до первого декремента счётчика ВЕ-таймера строго не определён и обратно пропорционален остатку от деления значения CLC-счётчика (на момент запуска счёта) на 128/512/2048.
Поэтому, точность измерения интервалов времени при помощи ВЕ-таймера не превышает числа тактов CLC, равного значению используемого делителя ( 128 / 512 / 2048 ). Если бы команда RESET обнуляла внутренний CLC-счётчик ВЕ-таймера, то используя эту команду перед запуском счёта - можно было бы синхронизировать CLC-счётчик с процедурой счёта, сделав задержку первого декремента счёта строго определённой.
Как именно обстоит с этим дело у 1801ВМ1 я не уверен.
Вроде, мы это ещё не тестировали.
-
? Patron - 09.09.2012 13:17
Если бы ВЕ-таймер мог сбрасывать свой CLC-счётчик в произвольный момент (а не только при подаче питания), то какой был бы смысл делать это по сигналу INIT и не делать при каждом начале счёта?
-
? Александр Тишин (Sandro)@ - 09.09.2012 14:40
Да, конечно, именно этот счётчик-предделитель я имел в виду.
Насчёт того, почему бы его не сбрасывать по загрузке? Тут, видимо, логика такая может быть: это сделает невозможным счёт длительных интервалов переменной длины без джиттера. Так мы можем загрузить новое значение счётчика без остановки таймера и срыва счёта, пока предделитель после прохода через 0 свои 128 тактов отщёлкивает.
¤
А померить можно и чуть-чуть иначе. Считать в R0 число с момента очередного (последнего) изменения 177710, а в прерывании по 50Гц таймеру ловить, что там вышло. А затем в начало обработчика прерывания вставить RESET. Затем перед ним NOP добавить, потом ещё один. Если будет зависимость -- значит, сбрасывается.
-
? gid - 25.01.2013 10:52
Я тут на досуге адаптировал тесты Patrona VM1C4, VM1ADD, VM1MOV, VM1BIS_&_VM1CMP к БК. Чтобы не требовалось RT-11 и чтобы прога полезала в доступные 16Кб памяти. Из-за отсутствия на БК устройства делающего прерывание по вектору 64 при установке бита 06 в 0177564, последний тест в VM1C4 не работает как надо.
Погонял на БК11М 4МГц и 6МГц. И получил весьма интересные результаты, совершенно отличающиеся от всех теорий, высказываемых по поводу работы ВП1-37.
Получается, что тайминги на БК на 4 и 6 МГц в основном кратны 8, но есть и исключения. формулы расчёта для двух операндных команд трёх видов: для MOV, для CMP,BIT и для BIC,BIS,ADD,SUB.
Жаль что в своё время эти тесты не гоняли на БК10 3МГц, этих данных сильно не хватает для полноты картины.
Результаты здесь http://gray-gid.narod2.ru/f/BK11timings.rar файл .xls, 3й лист, там же исходники тестов.
-
? Patron - 25.01.2013 13:27
Очень интересные результаты.
1. В результатах тестов 4 МГц у CMP 7\7 (похоже) должно быть 96, а не 80 - или там действительно дополнительное обращение к памяти не добавляет тактов.
2. На 6 МГц по сравнению с 4 МГц - в "длинные" команды регулярно вставляются дополнительные задержки (одна или больше) по 8 тактов.
3. Разница в продолжительности команд IOT и TRAP также везде кратна 8 тактам.
-
? Patron - 25.01.2013 13:38
Ещё интересное наблюдение - время реакции контроллера памяти ( промежуток DIN-RPLY ) не зависит от микросхем памяти и тактовой частоты и всегда составляет 8 тактов.
-
? gid - 25.01.2013 13:53
да, для 4 МГц у CMP 7\7 точно 80. это серьёзно выбивается из зависимостей.
Я пробовал подгонять значение tn в формулах из ТО, и вообще ничего не получается.
Особенно сильно выделяются тайминги для BIC,BIS,ADD,SUB
Получается, что для БК формулы из ТО не подходят, там нужны совсем иные коэффициенты tn, с учётом задержки выборки из памяти операндов, вносимой ВП1-37 при обработке видеоциклов + округление до кратного 8 в большую сторону.
-
? Patron - 25.01.2013 14:11
У тестов этого типа есть важная особенность - они выбирают абсолютно минимальное время выполнения тестовой цепочки команд из огромного числа прогонов. Из-за этого (например) для регистровых команд вообще не учитывается степень влияния видеоциклов.
Тут (похоже) нужны более хитрые измерения.
Цепочка команд всегда кратна 128 ( параметр Scale ), при котором значение счётчика ВЕ-таймера равно числу тактов в команде. Для масштабов больших 1 ( Scale = 256, 512, 1024 ) - результат затем делится на коэффициент масштаба ( 2, 4, 8 ). А что если не делить эту величину на коэффициент масштаба - тогда при больших масштабах - остаток от деления значения счётчика ВЕ-таймера на 128 даст число тактов, добавленных контроллером памяти к суммарной продолжительности цепочки команд на всём её протяжении.
-
? Patron - 25.01.2013 14:19
Или я не совсем прав..
Допустим, контроллер памяти вставляет по 8 тактов через каждые 2 команды NOP - тогда продолжительность 128 команд NOP длительностью по 12 тактов + 64 добавки по 8 тактов даст такой же общий результат, как 128 команд по 16 тактов.
Т.е. значение NOP = 16 вполне может означать NOP = 12 + 8/2 ; NOP = 14 + 8/4 ; NOP = 15 + 8/8.
-
? gid - 29.03.2013 14:50
Совершенно случайно возник такой вопрос по HALT режиму ВМ1.
Тут в самом начале говорится, что в HALT режиме вектор прерывания рассчитывается так: SEL1 & 0177400 + число (2, 6, 012 и т.д.)
А в описаниях HALT режима АльтПро говорится, что HALT/IRQ1 вызывает прерывание по вектору 0160002. Поскольку на БК11 в SEL1 по стандарту 0140000 и вроде бы не указывается особо, что при установке HALT режима АльтПро надо в 177716 записывать 160000, то возникает вопрос, где правда? Просто сейчас и в ближайшем будущем нет возможности проверить это на реальном железе.
В ВМ1 в качестве базы берется константа 0160000, а ВМ2 и ВМ3 - уже формируется из содержимого SEL1 ?
-
? Patron - 29.03.2013 17:10
Регистр SEL1 ( насколько я понимаю ) и его использование в режиме HALT есть только в архитектуре ВМ1.
Но при чтении этого регистра процессор 1801ВМ1 устанавливает не адрес на шине, а сигнал на своей ножке SEL1.
-
? MM@ - 29.03.2013 18:23
Очень рекомендую найти Техническое Описание ИС 1801ВМ1 - там все довольно мудрено, и не только в 177716 камень
обращается при останове ( HALT ). 4-й вектор как раз и возникает по ошибке МПИ - из-за отсуствия аппаратуры пульта,
в БК10/11 это до неприличия упрощено. Камни ВМ2 и 3 - в ВМ2 отдельная скрытая векторная таблица есть на все случаи жизни камней ( смайл ).
Кстати, в ВМ2 штатно адресуется 128 Кбайт - за счет наличия рудимента ДП ( бит 8 в состоянии процессора ), обычно эту страничку
используют под теневое ПЗУ и ОЗУ пульта. В ВМ3 вообще целая идеология пульта - там имеются рудименты безграничного
расширения памяти за счет экстравагантных наворотов. Кстати, эти самые навороты содержат достаточно багов - ищите ТО, господа !
*
Кто выложит ТО для 1801ВМ3 - получит от меня в П-Посаде 1 шт. бутылку Российского шампанского. Не путать с этикеткой со списком
команд и выводов - ТО мелким шрифтом набранная книга 0.5 кг весит !
-
? gid - 29.03.2013 18:30
Ну, при обращении по адресу 177716, кроме дин/доут выставляется сигнал на ноге SEL1, т.е. говоря о регистре SEL1 имеется в виду регистр 177716. На БК11 например адрес запуска формируется с помощью элементов D34.3 D34.6, на вход которых подаётся (не DIN & не SEL1)
-
? gid - 29.03.2013 18:39
Никто не будет выкладывать ТО ни на что, т.к. те, кто его имеют, 1) не хотят или не умеют сканировать, 2) не посещают этот ресурс и интернет вообще и даже не в курсе, что ТО кому-то нужно, либо 3) просто жопятся. Иначе давно бы уже ТО лежало в сети.
-
? Patron - 29.03.2013 19:16
Если есть сомнения, что при переходе в режим HALT процессор ВМ1 читает SEL1 - достаточно повесить на эту ножку диод и подать сигнал IRQ1.
Если же таких сомнений на счёт ВМ1 нет, то зачем ему было бы читать SEL1 при получении сигнала IRQ1, если не для того, чтобы определить базу векторов режима HALT..
-
? gid - 29.03.2013 19:52
Есть не сомнение, а просто недопонимание и конфликт данных из разных источников.
Пост anonymous от 04.01.2010 18:37 в этой теме говорит одно, а текст http://pdp-11.ru/mybk/doc/PDP11.TXT говорит другое.
ладно, я поступлю проще для себя. Когда смогу добраться до БК, напишу прогу, включающую режим Hlt11 АльтПро,
по адресам 140002,140004 (SEL1+2) - задам адрес одного обработчика, по адресам 160002,160004 - второго и нажму кнопку СТОП. Где сработает, там и будет правда. Если сработает по адресу 160002, то будем считать, что берётся константа 160000 и не важно, читается регистр 177716 или нет, для эмуляции это непринципиально.
Поэтому, уже чисто для самообразования, хотелось бы знать мнение компетентных людей, откуда берётся число 160000?
-
? Patron - 29.03.2013 21:31
В тексте PDP11.TXT - пропущена сноска, которая есть в оригинале ( http://groups.google.com/group/fido7.mo.dec/browse_thread/thread/6f8ff2b169043cc8/39c33637f8dee4df )
...
* Здесь и далее адpеса системных pегистpов пpиводятся для главного
пpоцессоpа; пpедполагается, что системное пзy pасположено с адpеса 160000.
...
Т.е. на самом деле адрес SEL1 может отличаться от 177716, а база вектров режима HALT - от 160000
-
? MM@ - 29.03.2013 21:44
Вообще-то адрес регистров камня в ВМ1 задается 2-мя ногами - см. ТО ( Гугля в помощь ), с шагом в 000020 - у каждого из 4-х
камней ВМ1 в 4-х процессорной системе свой адрес регистров.
*
Для БК не предлагать включать еще ВМ1 на шину - а то устаните ждать, пока надписи появяться при старте - ДОЗУ тормозит и так как
стояночный тормоз.
-
? gid - 06.04.2013 18:09
Практический эксперимент показал, что для 1801ВМ1 в его так сказать HALT режиме прерывания происходят по адресам 160000+номер. Напр HALT/IRQ1 - по адресу 160002, Независимо от того, каково содержание SEL1.
Читается или нет регистр 177716 сказать не могу, но в реальности его содержимое не важно.
-
? tim - 07.04.2013 07:19
Никто не желает выпустить брошюру по 1801ВМ1 ? Уже столько о нем "открыли", что пора как-то систематизировать мне кажется
-
? Patron - 13.04.2013 02:16
Окончательно прояснилась ситуация с HALT-trap: ( http://zx.pk.ru/showthread.php?postid=592249 )
Действительно - адрес начального пуска не влияет на положение векторов HALT-моды ( их база всегда = 0160000 ).
Это имеет свою логику, т.к. начальный пуск производится в USER-моде и может выполняться из ПЗУ пользователя, тогда как вектора HALT-моды всегда расположены в системном ПЗУ.
-
? MM@ - 13.04.2013 03:00
Очень интересная ссылка. Но вот уважаемый владелец анализатора пишет :"- эмулятор ПЗУ " - а почему у него 1 такт задержка в
эмуляторе ПЗУ на выдачу RPLY ? Современные ИС СОЗУ вроде как все быстрее 80 нс - можно и сразу выставлять RPLY.
Да и поднакрутить 5 мгц не помешает - тогда сразу косяк ВМ1 в виде худосочной МПИ будет заметен. А в диаграмме с чтением 160000 -
самое интересное осталось за кадром справа - когда камень переходит по результатам общения с 160002 ?
*
А вообще порадовала сочная палитра из г. Киева.
*
Очень неплохо бы УКНЦ вскрыть на предмет ревизии главного камня с СОЗУ-0 тактов.
-
? anonymous - 13.04.2013 08:34
Полезнейшее исследование, хорошо, что нашлись исполнители для проверки. У меня с прошлой весны так ни разу руки и не дошли ту ДВК позапускать для снятия времянок - новая работа очень нервная, совсем не удается своими делами позаниматься.
Я все время был уверен, что адреса пультовых векторов ВМ1 плавают вслед за адресом старта, как следовало из описания, которое было в архиве на моем первом месте службы - оказывается, лжеинформация! Но ни разу не сталкивался с конфигурацией, где бы старт и пульт были не в последнем банке и потому не на чем было эти сведения проверить.
Patron, а команда вида MOV (PC),Rx на 1806ВМ2 воздействует таким же образом, как и на 1801ВМ2?
-
? Vslav - 13.04.2013 10:33
Эмулятор ПЗУ, с использованием которого снимались диаграммы, спаян "на коленке" из платы STM32F4 Discovery - то есть реализован чисто программными методами, причем программа была написана буквально за полчаса (прикручена к готовому проекту на STM32) на банальном С и без всяких оптимизаций - там можно и нужно скопировать данные и код в RAM, потому что внутренний флеш STM32 небыстрый, а также переписать на ассемблере. По результатам испытаний макета эмулятора оттрасирована маленькая платка для замены 1801РР1/РЕ2, и делается вариант побольше - для БК-шного разъема МПИ - там уже можно будет прошивку грузить с SD-карты. Планирую при оказии (присоединю к какому своему заказу по работе) эти платы изготовить и тогда уже переработаю программку на штатной схеме. Думаю 5МГц вполне реально.
¤
Рассматривать результаты общения с 160002 бессмысленно, потому что по тому адресу я не поместил никакой код, там прочитался мусор. Вопрос ведь стоял - "куда переходит" :).
¤
УКНЦ мне уже приехали, как ни парадоксально - непокуроченные, даже с заводскими пломбами, но включить пока не смог - "проблема" ~42V. Планирую прикупить мелкий блочок типа meanwell AC220-DC5 - так как внутри только +5В просит, или просто питать от лабораторного. Но я еще с БК-шкой не наигрался, скоро будет еще новодельная 11м от Voland, и еще есть кое-какие планы. Ну и основную работу/семью никто не отменял, так что развлечение с УКНЦ будет нескоро, но обязательно будет :)
-
? SKcorp. - 13.04.2013 11:24
Если не жалко пломбы, то от обычного PC-AT БП прекрасно питается.
-
? Vslav - 13.04.2013 11:46
Одну пломбу расковырял уже, надо же было посмотреть что внутри :). Если бы оно еще рабочее оказалось... Но починить даже интереснее будет.
Там на материнской плате преобразователь +5 -> -12 и +12 стоит (да и те только для С2 нужны), на вход платы только +5В подается - так что запитать от чего угодно можно. Пока унес все УКНЦ (в сумме 30 кг советского железа - еще мониторчик и блок дисководов) в гараж, чтобы не отвлекали.
-
? Patron - 13.04.2013 14:03
anonymous > а команда вида MOV (PC),Rx на 1806ВМ2 воздействует таким же образом, как и на 1801ВМ2?
......................
Нужно поставить 1806ВМ2 на какую-нибудь плату вместо 1801ВМ2 и проверить.
Наверняка, Vslav мог бы приделать его к одной из своих УКНЦ.
............
Алгоритм обработки HALT-trap исправлен: ( http://zx.pk.ru/showthread.php?postid=434967 )
.....
1801ВМ1 проверяет состояние RPLY синхронно и ( насколько я понимаю ) не раньше ближайшего фронта CLK после выставления DIN.
Можно провести исследование этого вопроса, выставляя RPLY с различной задержкой и снимая времянки последовательности NOP, NOP, NOP.
-
? Vslav - 13.04.2013 14:44
На БК RPLY все равно синхронизируется внешним триггером ТМ2, на диаграммах приведен RPLY непосредственно с ноги процессора (выход триггера), а не на выходе эмулятора. Когда буду доводить эмулятор ПЗУ до ума - я вопрос с времянками RPLY еще поизучаю.
Насчет исследования всяких процессоров - я задумал ретро-ферму в виде сменного процессорного модуля на ВМ1/2/3 и буферов преобразователей на 3,3В - чтобы можно было к нормальной мощной ФПГА прицепить. Насчет материнки к такому сменному модулю - пока вопрос открытый, возможно будет цепляться к готовому мощному киту типа DE2-115 или, если будет вдохновение - можно сделать что-то попроще и сильно подешевле (и не так неприятно спалить не очень дешевый кит, который для работы нужен), вроде Speccy-2010. Тогда повторить БК на таком наборе достаточно просто, и оно будет таки на ретро-процессоре, а не банальный ФПГА-новодел. Поскольку модуль сменный - при желании можно вообще всю гамму отечественных компов покрыть - все на 580ВМ80А, на 1810ВМ8х. Ну ессно, реализацию на чисто ФПГА никто не запрещает, более того - можно будет запустить в параллель ретро-проц и ФПГА-реализацию и выполнять потактовое сравнение, на предмет "расовой полноценности" ;). Вообще я себе конечную цель ставлю запустить (ессно собственноручно отсисгенить) RSX-11М 4.x (c которой начинал на СМ-4) на 1801ВМ3 (возможно ФПГА+ВМ3 реализация ДВК?).
Ессно, это все чистое хобби, делается по чуть-чуть, в любой момент может остановиться, поэтому так далеко я не загадываю. Начну с ВМ1 и БК, там видно будет.
PS. Да, и на этом интересном пути рассчитываю на информационную помощь сообщества :)
-
? Patron - 13.04.2013 15:34
Сначала надо сделать супер-быстрый эмулятор пары 1801ВП1-065 на FT2232D.
Вместе с эмулятором ПЗУ он позволит грузить на голых платах любую операционку, у которой есть драйвер TU58.
Для RT-11 есть драйвер HX, который позволяет грузиться через последовательный порт с HX-сервера, имеющего много преимуществ перед TU58.
-
? Vslav - 13.04.2013 16:53
ОК, у STM32Fxx есть UART-ы, возможно получится реализовать одновременную эмуляцию ВП1-035/065. Так же у STM32 есть USB-device, и у меня даже есть готовый стек для COM-over-USB, но в реальном времени его не получится совместить с собственно обработкой МПИ. На плате эмулятора в формате DIP-24 (замена 1801PP1/РE2) есть выход UART на разъем в CMOS-уровнях (только Rx/Tx). На большой плате эмулятора в разъем МПИ впишу FT2232 с дополнительных поддержкой линий квитирования.
-
? Ал-р - 13.04.2013 19:52
А UART-ы то зачем c их бредовыми уровнями в +-12в(+-5в) на расстояниях в 2м (0.5-10м) от другого компа? А USB через МПИ это вАще ... Ж)Ж)Ж)
Прямое подключение БК<->ПиСь тремя проводочками УП-LPT (с уровнями ТТЛ) хоть в соседних квартирах ... (особо боязливые могут одну оптронную мс типа TLxxx-4 поставить для развязки).
-
? anonymous - 14.04.2013 15:06
Patron, кстати, в драйвере винчестера для УКНЦ используются команды с адресацией @PC и в комментариях автор приписывает восхищенное "Это круто !!!". :)
-
? Alex_K@ - 14.04.2013 21:05
Там после этой команды идет MTPS PC, поэтому глюка и не наблюдается. Большие глюки будут, если не нарушается предвыборка и употребляются команды снятия/установки признаков (коды 240-277). Поведение других команд предсказуемо. Например после MOV @PC,R0 команда INC R0 выполнится два раза.
-
? anonymous - 14.04.2013 22:52
И mtps (pc) много применяет автор.
-
? Patron - 14.04.2013 23:23
Выяснилось, что (PC) вызывает глюк только в первом операнде любой команды со вторым операндом R0..R6, поэтому MTPS (PC) или TST (PC) безопасны.
Глюк нейтрализуется нарушением предвыборки ( вроде перехода ), а также (предположительно) любым другим обращением к памяти ( кроме обращения очередной глючной команды ) или любым обращением к PC.
-
? gid - 15.04.2013 10:05
Позапускал тесты таймингов двухоперандных команд в ОЗУ СМК512 (10нс), пока только на 4МГц, поэтому результаты не публикую. Но заметны несколько странностей.
1. С адресациями 1 и 2 у ВМ1 тоже не всё ладно. Если для остальных адресаций минимальная и максимальная выборки результатов в цикле совпадают. То для адресации приёмника 1 разница между мин. и макс. 3..5 тактов, для 2 - 1..3 такта, в зависимости от адресаций источника. Наиболее заметно, если адресация и источника, и приёмника 1, там для CMP получилась разница в 11 тактов.
2. Если при работе в ОЗУ БК таблицы таймингов для BIS/BIC и ADD/SUB различались, то теперь полностью совпадают. Почему ОЗУ БК не любит ADD/SUB и заставляет их выполнятся медленнее, непонятно.
3. Для MOV и MOVB тайминги получаются разные, MOVB выполняется медленнее, остальные байтовые двухоперандные - так же как и словные.
4. Оказалось, что NOP выполняется 9 тактов, а любая двухоперандная команда рег,рег - 8 тактов.
5. Наибольшая странность. Если в ОЗУ БК тайминги адресации 30: @(R0)+ и 37: @#addr совпадали, то в ОЗУ СМК 37 выполняется быстрее 3х и равно таймингу адресации 67.
Отсюда возникает сомнение в равноправности РОН R0..R5 и PC. Вроде бы Patron делал тесты быстродействия для операций в разных комбинациях регистров или нет?
-
? Patron - 15.04.2013 12:13
Завершение цикла шины и выполнение команды идут у процессора 1801ВМ1 параллельно, поэтому при его работе с ОЗУ алгоритм некоторых команд выполняется быстрее, чем завершается последний шинный цикл команды. Это приводит к выравниванию продолжительностей выполнения.
При нулевой задержке RPLY алгоритмические различия между командами проявляются более явно.
-
? gid - 15.04.2013 12:20
Решил внимательней посмотреть исходник, и выяснилось, что тест обращается в ОЗУ БК, напр. в ячейку 0. Так что результаты недостоверны, надо немного поменять алгоритмы и всё начать заново.
-
? Patron - 16.04.2013 14:32
У меня сложилось впечатление, что если снятие сигнала RPLY после снятия DIN / DOUT происходит менее, чем через половину такта - это ( из-за ошибки обработки RPLY в микрокоде 1801ВМ1 ) иногда приводит к зависанию процессора. То же имеет место при установке сигнала RPLY ранее чем через половину такта после установки DIN / DOUT.
Не этим ли вызваны спорадические зависания при обращении к быстрой памяти СМК512 ..
Получается, что чем ниже тактовая частота процессора при неизменной продолжительности задержки RPLY - тем выше вероятность зависания.
Какова у СМК512 задержка снятия/установки RPLY относительно DIN / DOUT ?
-
? MM@ - 16.04.2013 14:57
Висяк ВМ1 никак не может быть связан с чрезмерно быстрым RPLY - на контроллерах с его применением я практиковал выдачу RPLY через
20 нс после поступления DIN-DOUT, и они не висели годами.( Пока не сдал на металл.).
А насчет подачи входов ВМ1 в не на фронтах CLK - что бы не разрушить внутреннюю ДОЗУ ВМ1 - издержки антиквариата.
Кстати, в ВМ2 для этого установлена двойная входная частота и входные защелки по обоим фронтам сигналов.
-
? Patron - 16.04.2013 15:13
Установка и снятие RPLY с недостаточной задержкой могут приводить к зависаниям процессора 1801ВМ1 из-за ошибки в его микропрограмме - именно так утверждают разработчики 1801ВМ1 и именно поэтому не рекомендовано использование 1801ВМ1 без задерживающего триггера на входе RPLY.
Могут - не значит должны. Это вполне может быть связано с наличием/отсуствием лог."1" в каких-то разрядах адреса ( или от их общего количества в адресе ) и не проявляться при обращении к некоторым конкретным адресам.
Если зависаний нет - радуйтесь, если зависания есть - следуйте ТУ.
-
? Vslav - 17.04.2013 10:29
А никто не подскажет где можно посмотреть пример схемы с использованием многопроцессорности ВМ1? Есть желание сделать экспериментальный модуль и поиграться с парой процессоров на общей шине.
-
? Vslav - 13.06.2013 11:37
Пишу HDL-код для своей ретрофермы, начал с модуля 1801ВМ1
С подачей nRPLY на вход ВМ1 сплошные непонятки - есть минимум три разных схемы (про то что nRPLY является выходом при обращении к внутренним регистрам - помню).
1. Опубликована в МПСС, статья "Рекомендации по применению м/с серии 1801" N2 1989.
Там nRPLY может подаваться на процессор в произвольный момент, немедленно по его возникновению на шине, сниматься - только по ниспадающему фронту CLC. Такая схема реализована в МС1201.01. Понятно что схема рабочая.
2. Подача и снятие nRPLY синхронизированы по ниспадающему фронту CLC, такая схема в оригинальных БК-0010/0011М. Тоже, видимо, схема рабочая.
3. В моей БК-0010 "переразведенке" третья схема - подача и снятие nRPLY по произвольному фронту CLC (то есть RPLY снимается по ниспадающему и нарастающему фронту - осциллограммы это подтверждают). Удивительно, но тоже работает нормально.
Я пока склоняюсь к имплементации 1-го варианта - вроде бы должно быть максимальное быстродействие.
Может быть опытные гуру что другое посоветуют?
-
? MM@ - 13.06.2013 11:47
БК10-переразведенка под пленочную клаву отвратительно разгоняется - но при реализации сигнала RPLY по схеме классической БК10
с разъемами Р6-16 разгон возможен неплохой. Ввиду реализации ВМ1 на конденсаторах вместо триггеров возможно, он требует
синхронности по выводу RPLY на частотах больше, чем 3 мгц.
-
? Vslav - 13.06.2013 12:09
У меня "переразведенка" БК-0010.01 под УКНЦ-шную клавиатуру, расположение чипов похожее на БК-0011М (два вертикальных ряда РУ6). Только, естественно, их меньше и менее плотно. RPLY с шины заведен на вход данных 155ИР1, который тактируется тупо 12МГц с генератора. Но, как ни странно - на процессоре соблюдается синхронизация с фронтами CLC 3МГц - с обоими - ниспадающим и нарастающим, задержка RPLY примерно 100 нс от фронта. Если подать 6МГц на проц - то такая схема синхронизации уже не будет работать как задумано.
ОК, для начала тогда сделаю как в обычных БК - синхронизирую подачу-снятие по ниспадающему фронту. А там уже буду оптимизировать - оно недолго же переделать/попробовать что-то новое.
-
? Blink@ - 22.08.2013 20:27
Прива всем.
HALT берёт вектор из 04 и более ниоткуда. Из 177716 проц берёт только биты состояния.
Адрес запуска берётся только от SEL1, внешняк должен сформировать его на шине DIN
Я использовал его для запуска БКшки по адресам своего ПЗУ, добавлением пары негативных единиц.
037 не при делах тут вообще.
RPLY тоже не виновато в зависании проца. Он виснет, если в момент считывания DIN сигнал на шине данных неопределён.
-
? Vslav - 22.08.2013 22:18
Мне кажется все это давно уже жевано-пережевано:
1. -037 "при делах" - она точно формирует физический 0 (старшую логическую единичку) на AD15 при чтении SEL1. Я лично отрывал AD15 на -037 от шины - тогда из SEL1 читался просто 000000.
2. По HALT вектор на самом деле 160002, а на 000004 попадает в БК так как процессор пытается сохранить PC/PSW в регистрах 177674/177676, которых в БК нет, вот оно по зависанию шины (при обращении к 177674) на 000004 и сваливает. И в книжке так ниписано, и на живой БК (с искусственной реализацией 177674/676) попробовано.
-
? Blink@ - 23.08.2013 00:11
Очень странные вещи вы пишете))
Я собирал спецмашинки на ВМ1, за основу взял принципиалку БК10.01, 037 у них не было и всё запускалось как надо.
Довешивал девайсов на новые порты, оттуда и узнал причины зависаний. Пришлось добавлять буферные регистры с защёлками.
По поводу перескока, объясните мне на пальцах, каким образом из 177676 может получаться 04 ???
HALT это по сути IRQ1. С какой стати ей лезть в системное ПЗУ?
Извините, но мне кажется что вы тут совсем заморочились. Всё проще.) 1801ВМ1 вовсе не идентичен PDP-11/04. На какую книжку ссылаемся?
А ваш пример с отрыванием AD15 дичь некорректная. Без обид - на 037 SEL1 не приходит. Так откуда ей знать, с какого адреса идёт чтение, а? ;)
-
? Blink@ - 23.08.2013 00:32
хм... с 037 у меня получился логический абсурд. Извиняйте, видимо память стирается потихоньку. Помню, что старт адрес менялся у меня очень просто, без декодирования адреса, автоматически, при подключении блока в МПИ.
Хочу уточнить, мы (вы) про какой HALT вообще говорим? У меня отладчик всегда верно показывал адрес прерывания по HALT, читая его из стека. От чего бы он ни случался. Хоть 000000, хоть по зависанию хоть по СТОПу.
"Что вы скажете на это?"(с)
-
? Vslav - 23.08.2013 00:39
Нормальные вещи, пару месяцев назад лично проверенные, еще из памяти не выветрилось :)
Вероятно Вы забыли подробности схемы своих "спецмашинок", вероятно там был свой формирователь адреса старта (независимый от -037, каковой есть, например, в 0011М). Моя 0010.01 с поднятой ногой AD15 -037 - стартанула с 000000. Я засомневался что именно -037 формирует старт, пришлось специально убедиться. SEL1 на -037 не приходит, но на нее приходит шина адреса/данных и -037 может самостоятельно выполнить декодирование.
Ну а по HALT - cерия "МикроЭВМ", книга 2, под редакцией Преснухина, там есть табличка 2.3. страничка 56, с прерываниями ВМ1 - приоритеты, вектора, и место для сохранения PC/PSW (в книжке оно называется "вектор текущего процесса"). Почитайте (сканы есть в Сети, а мне повезло - мой экземпляр книжки в гараже сохранился :)) там все подробно написано, именно для ВМ1. И это подтверждается диаграммами, снятыми логическим анализатором на реальной БК-0010.01 - подробности я выкладывал тут: http://zx-pk.ru/showthread.php?t=11557&page=4. На диаграмме видно, что процессор начинает обращаться к 177676 (запись, пытается сохранить текущий PSW, это не системное ПЗУ, это адрес специального системного регистра, которого в БК нет), там возникает тайм-аут - и в итоге выпадает (на БК, где нет 177676, возникает тайм-аут шины) по 000004-му вектору (это уже в диаграмму не попало).
-
? Blink@ - 23.08.2013 08:13
то есть, вы говорите конкретно про команду ЦП HALT. Книгу гляну при случае. Я-то ориентировался по доступным тогда описаниям ВМ1 и PDP-11, ничё такого не заметил.
Проверить всё равно не на чем. Ни БК ни бумаг по тем работам не осталось.
А надобности узнать подробнее теперь и вовсе нет...)
Могу поделиться ещё воспоминаниями По взаимодействию ВМ1 и 037. Если интересно. А то тут некоторые с таймингами морочатся)
-
? Vslav - 23.08.2013 08:30
Ну у меня надобность есть - вероятно в рамках хобби буду повторять МС1201.01 на FPGA. Там придется ВП1-030 реализовывать, и в том числе поддержку пультового режима. Поэтому особенности обработки HALT на ВМ1 мне надо знать.
-
? Blink@ - 23.08.2013 08:50
Удачи.
Меня вот что поражает в этих реинкарнациях - вместо того, чтобы взять "чистую" идею и реализовать нв современной базе, развить, тщательно но тупо повторяют старые штучки со всеми их врождёнными багами и кривостями.
-
? Ал-р - 23.08.2013 09:24
<Blink @ - сегодня 08:50>
И это правильно господа ... Зачем всё это ретро и всякие там музеи - как символ прогресса поставим посреди зала увеличенный N-ядерный-Пень и на нём статуЮ Билла, пусть народ ходит кругами и ждёт очередного безбагового откровения сладкой парочки Интел-Билл, ну и вокруг ещё можно немного посыпать дебильных 8-битных AVR-PIC для контрасту ...
-
? gid - 23.08.2013 09:52
Поправьте меня, если ошибаюсь, но разве не в этой теме, ещё давно выяснили, что IRQ1 и команда HALT работают одинаково, вызывают прерывание по вектору 160002, сохраняя PC, PS в 177676, 177674.
Отличие только в том, что IRQ1 маскируется битом 11 PSW, а HALT не маскируется никак (это конкретно на 1801ВМ1, на ВМ2 и ВМ3 по-другому).
А вектор 4 по справочникам - это зависание при передаче данных по системной магистрали (т.е. не дождались прихода RPLY вовремя) или запрещённые коды в регистре команд (типа JMP R0).
Про то, что 037 формирует стартовый адрес, написано в Книге, наконец ставшей достоянием общественности благодаря severyanin, лист 124, последний абзац.
-
? Blink@ - 23.08.2013 10:22
Ал-р, мне нравится архитектура PDP11 :)
Vslav, Преснухин слишком много книг подписал. Не могу найти именно Вашу. А во всех мне доступных ничего подобного 160002 1777676 не сказано. Более того, это прямо противоречит и техдокам на ВМ1 и Handbook-у PDP-11. Жаль, нет машинки. Взял бы своими руками и глянул бы своими глазами )))
Конечно! Я понимаю, что каким-то образом должна выполняться передача управления ЦП-консоль, многозадачность и многопользовательность а так же это связано с Memory Management в больших ОЗУ
но внятное описание я не вижу нигде.
gid, бох с ним, с запуском. "Как пожелаем, так и сделаем"(с)
Я на практике столкивался с этой бякой - неровность циклов операций. И определил, что вина на 037. Выполняя регенерацию ОЗУ она задерживает ответ процессору. Её циклы RAS CAS не синхронизированы с общим CLC, в этом дело.
Для достоверных тестов тайминга, необходимо тесты прошивать и запускать в ПЗУ. Идея ясна? Я когда-то зашивал подпрограммы звука в ROM и получил чистую полифонию, как на Синклере, а не жуткие обертоны и девиации, как в музЫчках БК )))
У вектора 4 больше функций. Во всяком случае, у оригинального PDP-11.
-
? Vslav - 23.08.2013 10:50
Набираем в Гугле - МикроЭВМ Преснухин Книга 2 и вторая ссылка - нужная.
Я специально сейчас скачал, ссылка рабочая - http://dfiles.ru/files/aovow4g4r
-
? Blink@ - 23.08.2013 11:14
спасибо. скачал, буду морщить мозг. разберусь - отпишусь.
-
? anonymous - 23.08.2013 15:44
Blink, http://qbus.narod.ru/40.jpg & http://qbus.narod.ru/41.jpg
-
? Vslav - 05.09.2013 13:25
Так что там насчет регистров "межпроцессорной связи" у ВМ1 по адресам 0177700..0177704 + N*020 (N-номер процессора) ?
А то мне уже скоро время впаивать второй процессор ВМ1 в свой ретромодуль, а информации никакой по этим регистрам нет?
Никто из ветеранов хотя бы на словах не поделится?
-
? Blink@ - 08.09.2013 20:04
Ну если даже ув.ММ молчит, то кто-ж ответит... )
Вопрос упирается в ТО ВМ1. Во всех книжках описания отрывочны и недостоверны. В той же "МикроЭВМ кн.2" текст такой, будто писала конспект студентка "на слух", не очень понимая смысл. Диких ошибок много :-/
Любую инфу придется проверять "руками", сигнатурными анализаторами и т.п. а не УКНЦ ни даже БК под рукой нет.
-
? MM@ - 08.09.2013 21:10
У меня принцип простой :
Если нет информации / опыта применения - помалкиваю.
Это лучше, чем городить развесистую клюкву по 25-летним воспоминаниям.
-
? Alex@ - 04.10.2013 22:15
177700 -- Регистр режима (РР) ВМ1, читается значение 177740. ("Биты 0,1,2 регистра режима используются для синхронизации пуска подчиненных процессоров главным процессором в многопроцессорной системе, т.к. блок регистров каждого процессора доступен на шине любому другому процессору вне зависимости от состояния процессора-хозяина.")
¤
177702 -- Регистр адреса прерывания (РАП) ВМ1, читается значение 177777. ("странное свойство регистра 0177702 - при записи в него любого значения, он пропадает из адресного пространства до перезапуска процессора")
¤
177704 -- Регистр ошибки (РОШ) ВМ1, читается значение 177440.
http://code.google.com/p/bkbtl/wiki/Ports
-
? Vslav - 05.10.2013 02:32
Да, спасибо. Но эту информацию я, к сожалению видел и она недостаточна для моих целей :(
Пока буду пробовать запустить ведомый процессор записью битов в 177700.
-
? Alex@ - 08.10.2013 05:37
Если расшифруете регистры, расскажите, pls :)
-
? Vslav - 10.10.2013 22:45
Обязательно расскажу :)
-
? anonymous - 11.10.2013 00:20
У меня они стартовали по разным адресам и выходили на зацикливание, после чего каждому в отдельности главный прописывал вектор и дергал прерывание битом в sel2 на нужную программу. Каким-то битом, не помню сейчас, в 0177700 можно было остановить их и затем общим для всех таймерным прерыванием пустить - тогда они четко по номерам начинали брать шину главный-2-3-4-главный-2-3-4-... Я затем снял два, т.к. "ширины" шины по времени не хватало для всех в бк0010, но никакого интересного софта так и не написал под это дело и досконально не исследовал работу каждого бита, переключившись на новую игрушку - вм3/4.
Очень было бы интересно узнать о ваших результатах. =)
-
? anonymous - 31.10.2013 12:28
В теме http://bk0010.org/forum/?id=15292 после обсуждения J11 решил освежить память и посмотрел, как на вм3 было сделано. С RESET все понятно, а вот WAIT в моде USER исполняется у ВМ3. Но с mtps/mfps чудеса какие-то! Словно они в моде USER работают не с RS, а с каким-то байтовым регистром, который ни на что не влияет, и в него признаки не попадают.
@201000/000000 106427
00201002/000000 340
00201004/000000 106727
00201006/000000 177777
00201010/000000 5000
00201012/000000 106727
00201014/000000
00201016/000000 5100
00201020/000000 106727
00201022/000000
00201024/000000 104350
00201026/000000
@P
%1000G
%Q
@ 004142
@201000/106427
00201002/000340
00201004/106727
00201006/177740
00201010/005000
00201012/106727
00201014/000340
00201016/005100
00201020/106727
00201022/000340
00201024/104350
00201026/000000
@201000/106427
00201002/000340
00201004/106727
00201006/177740 0
00201010/005000 777
00201012/106727
@P
%1000G^C
%Q
@ 004142
@201000/106427
00201002/000340
00201004/106727
00201006/000340
00201010/000777
00201012/106727
@
(ctrl+C - по прерыванию от клавиатуры, т.е. там не только признаки не появляются, но и приоритет не меняется, исп. система с 0 приоритетом запускает задачу в USER)
Patron, вы этот вопрос исследовали на ВМ3?
-
? Patron - 31.10.2013 13:24
Про ВМ3 у меня пока информации мало.
Если начинать ВМ3 тестировать, то надо сразу и его модель делать, а к этому я пока не готов.
-
? Smithf937@ - 10.05.2014 22:55
Thanks for the sensible critique. Me & my neighbor were just preparing to do a little research about this. We got a grab a book from our area library but I think I learned more clear from this post. I am very glad to see such wonderful info being shared freely out there. kakekdaacakfegaa
-
? tim - 11.05.2014 16:36
Осторожно, американские агенты добрались и сюда! :)
-
? MM@ - 11.05.2014 16:44
Я как-то около года назад искал инфу по одному вопросу о DEC - ЭВМ, и с удивлением нашел англоязычное зеркало этого форума, с нехилым к-вом подписчиков/просмотров.
*
Жалко, что заграничная паутина уже отрезана - по ссылке англоязычного господина - "невозможно отобразить страницу ..."
*
Для господ из-за границы просьба - в отдельном абзаце публикуйте гуглеперевод своего сообщения на русский, т.к. не все хорошо ботают по фене.
-
? Аноним - 11.05.2014 18:50
Волька! Удаляй спаммерские сообщения ? Smithf937 @ - 10 мая 22:55 и ? Pharmg700 @ - сегодня 15:07
Поломали они твою зашиту ;)
-
? RADIX50 - 11.05.2014 22:57
To: MM @ - сегодня 16:44
RE:"Жалко, что заграничная паутина уже отрезана":
...Что ж с ней случилось-то опять? ))
-
? Дмитрий - 11.05.2014 23:12
>> ...Что ж с ней случилось-то опять? ))
Иван Иванычу кровавая гэбня мерещится, перерезающая инетовский кабель... :)
-
? Дмитрий Николаевич - 12.05.2014 00:21
"Тонкости и толстости ВМ1" ?
Ну предположим...
По ссылке гугольвхроме предлагает пройти на opeyixa1, а там Касперский обнаруживает страшное.
Такшто "заграница" доступна, но завирусована :)
Продолжайте по теме.
-
? Аноним - 12.05.2014 00:39
心と恐怖は1頭に住んでいない
-
? MM@ - 12.05.2014 00:49
А как насчет перевода ?!
*
Знаток такой кодировки у нас тут только один...
-
? tim - 12.05.2014 00:56
Ужас, ужас, заграница наступает !!! говорят уже в магазинах нигде БКшек купить невозможно. Скоро все запретят - скидывайте карточки Visa, товарищи !
-
? Настоящий Анонимус ( из Японии )@ - 12.05.2014 01:57
彼自身の将来を笑うべきではありません。
-
? Макс Багаев - 12.05.2014 05:25
если что, opeyixa2.com свободен для регистрации
¤
а про какие трекеры идет речь ? а то да, надо качнуть пока можно
-
? Дмитрий - 12.05.2014 11:19
>> не открывается без объяснения причин - значит, заграничные сервера уже недоступны.
Прям так и недоступны? Если сайт не открывается, то причин море - перегружен узел на пути к домену, проблемы у провайдера, проблемы у хостера, ДНС тупит с адресом и т.д. и т.п.
-
? Настоящий Анонимус@ - 12.05.2014 11:25
Рутрекер пока качает, но они жестко отказались от поддержки ИЕ8 - только от ИЕ9 и выше.
Неплохо так же работает Хром, даже с ХРюшкой.
( Вообще там ограничение поставили абсолютно исскуственное, которое можно при некотром желании обойти админскими хитростями )
*
Я задался целью скачать один музыкальный сборник начала 1980-х, отмеченный на большинстве заграничных трекеров - как доступный в изобилии. Но ни один сидер не был виден - все по 000000. Видимо, это в соответствии с законом о серверах. Не думаю, что все провайдеры прогнулись - но Мегафон - имеет место быть.
-
? Дмитрий - 12.05.2014 11:30
Забугорный хдбитс открывается без проблем. ЧЯДНТ? Торренты не закроют - мозгов мало. Законотворцы почитали описание протокола и сразу решили - заблочить нет проблем. А вот хренушки... Закрыть могут только железно. А это надо изолировать весь инет ПОЛНОСТЬЮ. А этого не сделают. К тому же они понимают, что даже закрыв инет полностью, они не заставят покупать то дерьмо, авторов которого они защищают. А то прекрасная ситуация получается: как бесплатно музыку/фильмы/элкниги получить, так низзя, это интеллектуальная собственность - покупайте. Раз покупайте - это товар. А некачественный товар, а также товар, который мне не подошел, по закону я могу вернуть и получить все бабки назад. А вот тут-то и порылась собака - низзя вернуть, это не товар. Зашибись! Как продавать - это товар, а как вернуть бабло - сразу "не товар". Вот когда сделают, что я могу вернуть бабло за не понравившийся фильм/альбом/книгу, вот тогда и буду покупать лицензии. А пока нам втюхивают шлак, то авторов это не заставит "производить" лучше.
-
? tim - 12.05.2014 12:23
Ну вот прямо как по Станиславскому - ну не верю! Уж сколь редкая музыка до сих пор доставаема, кино неформатное, книги, если уж были оцифрованы - если не нашел за день, то за пару недель уж точно. Если это не КГБшный секрет, а какой собственно музыкальный сборник разыскивается ?
-
? Настоящий Анонимус@ - 12.05.2014 12:51
К сожалению, у меня нет доступа к закрытым трекерам - но там этот сборник точно имеется.
«Rockit» — B.T. & The City Slickers (обработка классического трека Херби Хэнкока) . Эта версия трека выпускалась лишь один раз в 1984 году на американском сборнике «Electric Breakdance».
Интересен весь сборник - в 1986 г. у меня была плохая его копия. Нужен именно во FLAC или др. некомпресс.
*
Еще вопрос по Рутрекеру - заприметил, что там есть 2 режима отображения списков "форумов" - который с количеством сидеров/личеров ( там меню бооольшое ), и альтернативный - краткий, к-во предложений - меньше в разы, размер файла не показывается...
Так самое интересное, что оба варианта могут быть возможны во время одного и того же посещения сайта Рутрекер - возможно, это связано с динамически изменяющимся IP ?
¤
-
? tim - 12.05.2014 14:09
К рутрекеру у вас доступ есть? Вот ваша музыка http://rutracker.org/forum/viewtopic.php?t=3456873
-
? Аноним - 14.05.2014 20:56
Как же вы задолбали, спамеры гребаные...
-
? Дмитрий - 14.05.2014 20:57
Это я был...
-
? Нелюбитель спама - 15.05.2014 05:50
Тутова не виагра нужна, а презервативы для извращенцев !
Мешками ! Стойкие к паяльнику !
-
? MSV - 16.05.2014 00:01
Вариант борьбы со спаммерами - временно запретить имена, не содержащие наших азбучных: а-я.
-
? european - 16.05.2014 00:15
Я есть сам покупайт полкило Вигра тутова : "http://hannamaarilatvala.com/" .
Очень рекомендайтен !! Ин посилька были подарок - мешочек кокса и билет в Ленинграйд !
А в поддоне посилка - Ифон5 !
Я есть вери довольно !!!
*
MSV ! Покупайт - покупайт ! Вам десцент 12.1 % !!! Фрее постампт !
-
? MSV - 16.05.2014 00:36
Уговорили, отрезать пулл иностранных IP адресов - лучший вариант.
-
? Волька - 16.05.2014 12:39
Видимо спамер использует браузерный движок для отправки сообщения, тогда поступлю так, если в сообщении будут HTML ссылки, оно будет блокироваться.
-
? Нелюбитель спама@ - 17.05.2014 03:51
А почему бы не удалить и " Сialis " с его лавочкой виагры ?
-
? european - 17.05.2014 04:02
Go to : http://www.westmed.ru/services/plastic/breastup/
-
? severyanin - 17.05.2014 11:35
не, здесь в основном не та аудитория, а слава Кончиты нас не прельщает
-
? MM@ - 01.06.2014 05:43
Благодарю господина tim за ссылку от 12 мая 14:09.
По результатам прослушиваний оказалось, что левый канал завален по ВЧ - т.е. писали с катушки, и об этом говорит и отсуствие сигнала с 15 кгц вообще - видимо, шумы чистили со щелчками винила. При длине композиции 3:59 после 3:15 непроработаны эффекты - либо авторы постебались по остальным трекам оригинального автора в упомянутом альбоме 1983 г.- приделали немного каши.
*
Интересно, кто-нибуть экспериментировал на БК/ДВК с написанием чего-либо похожего на настоящую WAV - музыку, или с обработкой таковой ? Например, ввод - вывод семплов и т.п. ?
-
? anonymous - 01.06.2014 09:31
У нас народ экспериментировал в начале 90х, делали из контроллера ацп/цап авиационного звуковушку, отключая таймеры, запускаемые по датчику перехода через 0 напряжения запитки СКТ и подавая на стробы частоту от быстрого таймера, который до 100кГц может выдавать (программировали на 25кГц для речи и 50 для музыки), оцифровка 12 бит. Софт крутился в вычислителе МВ26, на базе процессора 1806ВМ2. Ни софта, ни исходников, ни схем не сохранилось. Платы такие эксплуатировались в БВУТ/БВУП ИЛ-96, была ли их замена в летающих экземплярах на что-то более новое или импорт произведена - не знаю, по окончании работ по теме часть стендов отправилась на территорию Алмаза, а часть - куда-то в домодедово.
-
? anonymous - 01.06.2014 09:37
P.S. в личных завалах хлама только сам МВ26 сохранился http://qbus.narod.ru/mv26.jpg
-
? anonymous - 01.06.2014 10:06
Поговорил с бывшим коровкером, он настаивает, что формат был с компрессией - если несколько выборок подряд шли с погрешностью в 2 бита, то в результирующий файл писалась последовательность из указания количества одинаковых преобладающих выборок. Код 0 был зарезервивован для таких целей, после него количество одинаковых значений писалось. ОЗУ основное для записи данных было спаяно проводками из кеша от 486го компа выгоревшего, 256кб + 22кб набортной памяти МВ26.
-
? anonymous - 01.06.2014 10:16
Еще подробности, писал на диск второй вычислитель, цифровал первый. Те 4шт 537РУ9, ближе к разъему, это - двухпортовая память - она отрабатывает с арбитрацией по WRQ1/2-WACK и висит с адреса 0160000 в 64кб-пространстве адресном ВМ2, блок данных для записи на диск клался туда, а второй МВ26 уже писал на диск, чтоб первый не прерывал оцифровку.
-
? SKcorp. - 01.06.2014 11:46
Да на БК полно WAV-плееров и есть трекерный редактор, в котором в кач-ве инструментов те самые сэмплы.
Все это выводится через COVOX.
-
? severyanin - 01.06.2014 12:54
Симпатичный
-
? Smithd163@ - 10.06.2014 20:43
Thanks for this article. I'd also like to express that it can often be hard if you are in school and simply starting out to initiate a long credit standing. There are many students who are just trying to endure and have an extended or favourable credit history are often a difficult matter to have. dkcbedaekggegcke
-
? wm - 31.10.2014 17:35
Здравствуйте всем. Может кто подскажет, что делает MFPS R0 со старшим байтом регистра R0 на реальной БК (и вообще документировано ли это для PDP/LSI-11)? В младший байт сохраняются флаги, а старший - очищается, знаково-расширяет младший, не изменяется?
-
? anonymous - 31.10.2014 19:02
@1000/000000 106700
001002/000000
@RS/000344 340
@R7/160020 1000
@P
@ 001004
@RS/000350
@R0/177740
-------------------------------
@1000/106700 12737
001002/000000 177740
001004/000000 177676
001006/000000 12737
001010/000000 2000
001012/000000 177674
001014/000000 16
001016/000000
@2000/000000 106700
002002/000000
@1000G
@ 002004
@RS/176350
@R0/177740
---------------------------
@1002/177740 10340
@RS/176350 0
@1000G
@ 002004
@RS/010350
@R0/177740
---------------------------
@RS/010350 0
@1002/010340 0
@1000G
@ 002004
@RS/000004
@R0/000000
@
-
? gid - 31.10.2014 19:32
Где-то уже писали, что в 1801ВМ1 MFPS/MTPS используют микрокод MOVB вместо MOV, поэтому MFPS R0 эквивалентно MOVB PSW,R0
Выше это показано на практике.
-
? wm - 31.10.2014 20:01
Большое спасибо, тогда понятно, почему новый тест процессора с MFPS R0 ; ADD R0,R5 у меня показывал ошибку даже после NOP :) Хотя все же интересно, это жестко где-то документировано или особенности реализации, оставленные на усмотрение. Но все равно такое поведение наиболее логично, конечно.
-
? Vslav - 31.10.2014 20:30
Надеюсь скоро закончить распознавание схемы 1801ВМ1, осталось чуть меньше тысячи транзисторов. Там уже буду переносить в верилог и сам микрокод разбирать. Отрохов сказал что разработка полностью оригинальная и формат микрокоманд свой собственный, не содран с LSI-11, поэтому мне самому интересно :)
-
? anonymous - 31.10.2014 20:37
Vslav, про регистры, которые кроме таймера и sel1/2 имеются, есть уже что?
-
? anonymous - 31.10.2014 20:39
В смысле, 0177700..0177704
-
? Vslav - 31.10.2014 21:12
Да кое-что есть, но пока еще не все.
По 177702 записывается адрес и у процессора генерируется прерывание. RPLY при обращении к этому регистру формируется только собственно при возникновении этого стартового прерывания, поэтому если процессор пишет сам себе то RPLY может не сформироваться (висим на DATO переход на микропрограмму прерывания невозможен), типа регистр "отпал". Приоритерный шифратор прерываний я нарисовал, но надо переводить в логическую форму (верилог и моделировать), так сложно сказать что он точно делает.
177704 - это регистр ошибок, пока не все ясны, надо тоже моделировать, я их пока обозвал типа unknown_exception. Часть ясна - двойная ошибка, тайм-аут шины, нечетный адрес (забанена), прерывание таймера (тоже забанено), ACLO (фронт/срез - два отдельных запроса) и прочее.
По 177700 еше не все биты разобрал, как раз эта часть осталась, сразу там неясно было что делает, поэтому я начал с понятных вещей - ввода-вывода, таймера, ПЛМ, прерывания, АЛУ, сейчас вот макароны управляющей логики остались.
-
? Vslav - 31.10.2014 21:14
Кстати в регистре режима 177700 - 4-ый и 5-ый биты - номер процессора. Ведомый процессор также не обрабатывает VIRQ - тоже забанено
-
? gid - 31.10.2014 22:18
А возможно ли на основе полученных данных, провести реверсивный анализ отрезанных / заблокированных / неиспользованных функциональных блоков, и как-то узнать, по каким причинам это было отрезано: как излишество, или просто не осилили, или изменилась линия партии и поставленные задачи? Можно ли получить представление о том, что бы получилось на выходе, если бы всё отключенное (или хотя бы самое полезное) работало бы? Нечто уникальное или монстр, нафаршированный всякими фичами, но малопригодный в применении?
Хотя, я подозреваю, что часть того, что было начато, но не доделано, и осталось в виде огрызков-рудиментов, было реализовано позже в ВМ2, ВМ3.
Вот по мне например, то, что убрали прерывание от нечётного адреса - хорошо, это дало некоторые уникальные возможности в программировании. А то, что убрали прерывание от ВЕ таймера - плохо. Штука-то полезная. Правда, наверно потому и убрали, что оно при том устройстве таймера, что есть сейчас, случалось бы слишком часто и быстродействия процессора бы хватало только лишь на обработку прерывания и ни на что другое.
-
? Vslav - 31.10.2014 22:32
Кое-что отрезанное определить можно, но там не так уж функционально много. В-основном, пока видны неиспользуемые прерывания/исключения. Почему было отрезано - можно только гадать. Ну есть еще разработчики на связи (в теме на ixbt "История отечественных микропроцессоров"), можно у них спросить. Схему я рисую полную, в том числе и "забаненные" транзисторы, там уже коммьюнити пусть думает почему и как. Но монстра с фичами точно не вырисовывается :). Пока процессор выглядит попроще чем LSI-11, ждем разборки микрокода.
Еще вероятно что при анализе микрокода вылезет что-нибудь недокументированное. Процессор вообще сложнее для реверса чем ВМ80А именно из-за микрокода, его надо расшифровать, а то не сразу ясно как оно работает, так что тут этап моделмирования и тестирования обещает быть долгим.
-
? gid - 31.10.2014 23:53
Тему на ixbt читал, там Отрохов на подобные конкретные вопросы отвечает, что либо не помнит, либо отсылает к непосредственным проектировщикам, проектировавшим ВМ1. На эту тему можно вообще серьёзный исторический труд написать, не думаю, что кто-то захочет ради моего досужего любопытства вспоминать, что да как там было. Я бы на их месте точно бы поленился.
[Еще вероятно что при анализе микрокода вылезет что-нибудь недокументированное.]
Если только сделанное, но выключенное, как бы про запас.
Поведение-то процессора достаточно хорошо изучено. Никаких недокументированных команд, как Z80 тут быть не может.
Могут быть такие вещи как описано в http://zx-pk.ru/showpost.php?p=591840&postcount=36 - попытка записи по адресу 154731 - возможная ошибка проектирования, что-то типа использования не инициализированной переменной, когда в регистре в результате гонок ли, либо ещё каких-то условий фиксируется мусор/случайное значение и оно попадает на линии адрес/данные.
¤
¤
-
? litwr2@ - 01.11.2014 11:00
Ассемблер PDP-11 кое в чем не плох, но в нем есть несколько туповатых вещей:
1) Чудовищный синтаксис для JMP и вдвойне для JSR! Почему можно написать просто BR LABEL, но нужно писать JMP @#LABEL?! Такой ерунды, насколько знаю нигде больше нет.
2) PC - это РОН! 3ачем писать JMP @#LABEL, не лучше ли и понятнее MOV #LABEL,PC? Зачем вообще нужнa команда JMP, когда есть такой MOV, который даёт больше возможностей?
3) Команда XOR неполная - работает только с регистром.
4) Нет команды типа 80x86 LEA для загрузки эффективного адреса. Что-то типа LEA RAX,[TAB+6*RBX+RAX] или *LEA* @6(R1),R2.
5) Кто-нибудь использовал синтаксис JSR Rn,LABEL при n не равном 7? Только не надо про общающиеся сопроцессы, которых никто не сделал.
6) 3наковое расширение Rn при MOVB source,Rn делает замороченным использованием старшего байта.
Будет интересно узнать и про другие "толстости".
-
? litwr2@ - 01.11.2014 11:06
> Никаких недокументированных команд, как Z80 тут быть не может.
Недавно ММ в ветке
http://bk0010.org/forum/?id=19380
писал обратное.
-
? Аноним - 01.11.2014 11:22
>3наковое расширение Rn при MOVB source,Rn
Неудобно для программирования на Асм, но очень удобно для C-компиляторов - для приведения signed char к signed int при вычислении выражений.
-
? TheGWBW@ - 01.11.2014 11:43
Боюсь, что писать придётся MOV #LABEL-2, PC. Я бы все же использовала JMP. Оно и нагляднее в листинге...
-
? litwr2@ - 01.11.2014 12:29
> писать придётся MOV #LABEL-2, PC
Именно, MOV #LABEL,PC - его можно и в листинге писать как JMP, потому как JMP и есть.
-
? anonymous - 01.11.2014 12:55
1) br label и jmp label относительную адресацию используют, а jmp @#label - абсолютную, первые две используются для адресации внутри программы, которая размещается в любых адресах и заранее не известно, в каких она будет исполняться, а третья запись из нее позволяет передавать управление на точки входа с фиксированными адресами, например в пзу.
2) mov поганит признаки, а jmp - нет.
3) битиков не хватало
4,5) jsr с регистром произвольным чаще всего и используется вместо lea. Для jsr r7,label в macro11 используется запись call label. Разница между @#label, @label и label - таже, что и для jmp.
-
? gid - 01.11.2014 13:00
>>? litwr2 @ - сегодня 11:00
Вы просто не умеете его готовить. Синтаксис ассемблера PDP-11 просто красота, по сравнению с синтаксисом x86.
По сути ассемблер PDP-11 - это тот же машкод, просто записанный в человекопонятной форме.
¤
1) Почему можно написать просто BR LABEL, но нужно писать JMP @#LABEL?!
Пишите себе спокойно JMP LABEL никто вам ничего не скажет, это нормальная конструкция, допускаемая синтаксисом.
К тому же BR LABEL и JMP LABEL это две разные команды, у каждой из которых есть свои преимущества и применяя их не от балды, а строго там, где надо, получите преимущество.
¤
2) не лучше ли и понятнее MOV #LABEL,PC?
Нисколько не лучше. MOV в отличии от JMP изменяет признаки NZV, где вы видели команду перехода, изменяющую признаки, и портящую весь алгоритм. До такого даже в IBM не додумались.
¤
3) Радуйтесь, что хоть такая есть, в некоторых процессорах даже такой нету.
¤
4) Потому что не нужна, есть же MOV, с его помощью можно загрузить что угодно, куда угодно.
¤
5) Да. Все использовали. Это очень удобно, когда нужно передать подпрограмме указатель на массив данных, идущих сразу за командой. И вернуться из подпрограммы за конец этого массива, чтобы продолжить выполнение. Есть ещё более другие специфические способы применения.
¤
6) Знаковое расширение крайне полезно при арифметических операциях short int + char, а они возникают постоянно из-за того, что 64кб адресное пространство нужно использовать как можно более эффективно.
¤
>>? litwr2 @ - сегодня 11:06
[Недавно ММ в ветке ... писал обратное.]
Ничего он там не написал. Про какие такие допинструкции речь? О чём например вам хотелось бы узнать?
У ВМ1 есть диапазоны зарезервированных опкодов, вызывающих прерывание по вектору 10, но реализованных в других PDP-11 процессорах
000007 - команда MFPT
000020-000077 - спец команды всяких разных процессоров PDP-11. У разных процов могут выполнять разные действия.
000210-000227 - спец команды LSI-11
000230-000237 - команда SPL
006500-006577 - команда MFPI
006600-006677 - команда MTPI
007000-007777 - что-то типа пользовательского диапазона. туда каждый мог при желании насовать чего-то своего
076000-076777 - CIS - диапазон коммерческих инструкций
106500-106577 - команда MFPD
106600-106677 - команда MTPD
107000-107777 - нет данных, но скорее всего тоже пользовательский диапазон
070000-073777 - диапазон EIS (кроме XOR,SOB)
075000-075777 - и диапазон FIS
170000-177777 - FPU - расширенный набор команд арифметики с плавающей точкой.
Все остальные опкоды принадлежат вполне себе многажды везде описанных команд. Кроме разве что
000010-000013 - START
000014-000017 - STEP
Хитрые, мало кому известные команды, предназначенные для работы с пультовым режимом. Но поскольку у ВМ1 пульт не получился, а команды уже были, то о них просто решили умолчать. Хотя они работают, кривовато, как и сам как бы пульт в ВМ1. В бытовом применеии бесполезны.
-
? anonymous - 01.11.2014 14:03
Еще чуть не забыл, в кучу к lea : в макрорасширениях есть команда вида .addr и я свою писал еще к ней без точки версию, первая работает в 64к, она вычисляет и помещает адрес объекта/метки первого аргумента в приемник (второй аргумент), при этом еще можно флаг третьим аргументом указать для сохранения прежнего значения второго аргумента, а я дописывал ее для получения физического 22-разрядного адреса по виртуальному, учитывая содержимое и номера регистров ДП.
-
? Vslav - 01.11.2014 22:01
Совершенно замечательная статья, вносит ясность с маркировкой ВМ1, с фотографиями ТУ
http://sovietcpu.com/articles/69-label-1801
-
? litwr2@ - 01.11.2014 22:03
Благодарности за информацию.
>Синтаксис ассемблера PDP-11 просто красота, по сравнению с синтаксисом x86.
Не так всё просто. Наличие инструкций типа CMPXCHG, XADD, ... делает x86 менее привлекательным, но мощь, продуманность архитектуры для работы с закэшированной памятью (пересылки память-память и косвеннокосвенная адресация в этом смысле менее эффективны) - большой плюс. Хотя если бы не политика больших вентиляторов и малокультурность неангличан, то скорее всего самой популярной архитектурой была бы RISC.
> Для jsr r7,label в macro11 используется запись call label
А для RTS PS - RETURN ;-) Но push/pop надо самим замакросить.
>br label и jmp label относительную адресацию используют, а jmp @#label - абсолютную
В этом и главный вопрос. JMP LABEL и JMP @#LABEL делают одно и тоже (для программ с фиксированным адресом загрузки), но ассемблер по разному генерирует код для компоновщика и, почти уверен, что JMP @#LABEL быстрее. Bсё же абсурдно писать прямой переход через синтаксис косвенной адресации. И что значит JMP #LABEL (выполняется как NOP!)?
Глупо выглядит, что одинаковые переходы пo-разному описываются
BR LABEL
LABEL: NOP
JMP @#LABEL
такого маразма точно нигде нет. И речь не о том, что BR и JMP разные команды, а о том, что одинаковые переходы выглядят по-разному. В JMP стоит косвенная адресация, которой фактически нет. Ну как нормальному программеру объяснить, что MOV r1,pc - это переход по содержимому регистра r1, но почему-то JMP R1 писать нельзя, а нужно JMP @r1? Кстати, MACRO11 для BR сразу генерирует конкретный код, а для JMP LABEL нет, хотя тут то же смещение только длиннее.
> У ВМ1 есть диапазоны зарезервированных опкодов
Благодарен за столь информативное сообщение, но хотелось бы побольшие именно про ВМ1. Часть опкодов (умножение, деление?) делают прерывание, часть - это таинственный пульт, который никак невозможно использовать. Есть ли что-нибудь ещё, что хоть как-то можно применить?
>в макрорасширениях есть команда вида .addr
С макрорасширениями что угодно можно написать и даже ассемблер x86. :-) Проблема в том, что медленно. Иногда одна команда ВМ1 десяток и больше команд z80 заменяет, но даже в этом случае циклов процессору нужно лишь ненамного меньше и так получается не всегда, а скорее редко, например, когда идет работа с байтами, z80 явно обгоняет. Или вот нужен косвенный переход. На z80
LD HL,(ADDR)
JP (HL) - 20 тактов и 4 байта, на 6502 JMP (ADDR) - 5 тактов и 3 байта, на 8086
JMP word [ADDR] - 22 такта и 4 байта, на ВМ1
MOV @#ADDR,R1
JMP @R1 - нельзя почему-то сразу через память, 6 байтов и тактов на БК наверное не менее 40.
-
? Аноним - 01.11.2014 23:15
C какой целью офтоппно литературно писательски сравниваются ассемблерные команды z80 и ВМ1?
-
? TheGWBW@ - 02.11.2014 00:33
Нормальный программер поймёт, что копирование СОДЕРЖИМОГО регистра R1 в регистр Счётчика машинных команд (и данных) программы как следствие приведёт к переходу программы к исполнению с адреса (R1)+2 и может изменить флаги состояния NZV, а использовать JMP R1 не имеет смысла, ибо программе незачем храниться в регистре R1, но содержимое R1 можно использовать как значение адреса для перехода в команде JMP @R1... Как то так и объяснить :)
¤
¤
-
? Дмитрий - 02.11.2014 01:20
>> но ассемблер по разному генерирует код для компоновщика и, почти уверен, что JMP @#LABEL быстрее.
>> Кстати, MACRO11 для BR сразу генерирует конкретный код, а для JMP LABEL нет, хотя тут то же смещение только длиннее.
Что вы там курите? JMP LABEL - 000167,смещение до адреса LABEL / JMP @#LABEL - 000137,адрес LABEL. BR используется для коротких переходов, JMP для длинных.
¤
>> Глупо выглядит, что одинаковые переходы пo-разному описываются
Глупо нечто подобное писать. Абсолютная адресация используется для вызова кода ВНЕ тела программы, к примеру, в ПЗУ (то бишь куда ни загрузи, вызов будет всегда туда куда нужно), относительная же - для перехода ВНУТРИ тела программы, куда BR "не достанет".
-
? Дмитрий - 02.11.2014 01:25
>> почему-то JMP R1 писать нельзя, а нужно JMP @r1
А где ваш вайн по поводу вами же приведенного?
¤
>> LD HL,(ADDR)
>> JP (HL)
¤
Почему не JP HL???
¤
Кстати, могу ошибаться, но прямой переход JP ADDR будет быстрее, чем через HL.
-
? gid - 02.11.2014 11:57
>>? litwr2 @ - 1 ноября 22:03
[Не так всё просто.]
Я имел в виду не мощь процессорной архитектуры, а именно синтаксис - однозначную сопоставимость ассемблерной команды генерируемой ей машинному году.
¤
[И что значит JMP #LABEL (выполняется как NOP!)]
Вам просто повезло, что она у вас выполнилась как nop. На самом деле эта команда выглядит вот так:
пусть LABEL=177000
001000: 127
001002: 177000
опкод 127 делает переход на адрес 1002 (выполняется микрокод T<-PC; PC+=2; PC<-T; содержимое PC на момент выполнения - 1002). следующей за JMP #LABEL выполняется команда .WORD LABEL и уж тут как повезёт, кому будет эквивалент NOP, а кому и прерывание 4 или 10, или вообще какая-нибудь магия.
¤
[почему-то JMP R1 писать нельзя, а нужно JMP @r1]
Потому что JMP R1 - это переход в R1, что технологически невозможно, РОН - это не ОЗУ, а JMP @r1 - это переход по адресу. который содержится в R1.
¤
[Кстати, MACRO11 для BR сразу генерирует конкретный код, а для JMP LABEL нет, хотя тут то же смещение только длиннее]
Дмитрий выше уже ответил, а я дополню. Вообще говоря BR - это команда ветвления, просто ветвление безусловное, а JMP - это команда перехода. И смещения у них вычисляются принципиально по разному. MACRO11 - двухпроходный ассемблер, поэтому смещения команды ветвления назад всегда можно вычислить в первом проходе, а ветвление вперёд - нет, оно как и для JMP с адресациями 6 и 7 вычисляется во втором проходе, когда уже известно, куда переходить и смещение можно вычислить.
¤
¤
[Благодарен за столь информативное сообщение, но хотелось бы побольшие именно про ВМ1]
Так это и было именно про ВМ1, если было про другие процессоры, диапазонов зарезервированных команд было бы чуточку меньше, или больше.
[Часть опкодов (умножение, деление?) делают прерывание]
Естественно делают, иначе как бы можно было бы программно эмулировать работу этих команд там, где они не реализованы (умножение, деление конкретно на ВМ1)
[таинственный пульт, который никак невозможно использовать]
Можно. Как это сделать, описано в этой теме. Просто нужно набраться терпения и внимательно прочитать её всю, можно пропуская оффтоп.
¤
[MOV @#ADDR,R1
JMP @R1 - нельзя почему-то сразу через память]
Почему нельзя? Можно: JMP @ADDR - действие будет именно такое же - переход по адресу, который содержится по адресу ADDR.
¤
И вообще, все ваши проблемы возникают из-за недостаточного понимания сути адресаций, и где какую следует применять.
-
? Аноним - 02.11.2014 13:06
>при арифметических операциях short int + char
int = 16-bit signed на 16-битных архитектурах (равно машинному слову). т.е. short особо не нужен в данном контексте. тип char может иметь знак, а может не иметь (зависит от компилятора). MOVB удобен только для signed char. не удобен для unsigned char, поск.требует доп.операции по маскированию знаковой части.
-
? litwr2@ - 02.11.2014 23:30
> BR используется для коротких переходов, JMP для длинных.
Именно! В этом и толстость. Речь идёт об одинаковом типе переходов. Например, в x86 есть JMP с 8/16/...-разрядными смещениями, но это одна команда в разных видах - чётко и логично. Ассемблер должен сам для коротких выбирать машинный код BR, а для длинных JMP. А он, наоборот, по-разному даже код для компоновщика для них делает!
>Абсолютная адресация используется для вызова кода ВНЕ тела программы, к примеру, в ПЗУ (то бишь куда ни загрузи, вызов будет всегда туда куда нужно), относительная же - для перехода ВНУТРИ тела программы, куда BR "не достанет".
Пустая догматика! Многие (большинство) программ для БК грузятся с фиксированного адреса и программеру нужно лишь, чтобы ассемблелер сделал максимально эффективный код. Нужен ему переход на метку L он и пишет JMP L. Вы предлагаете же какое-то "пультовое мышление". Очевидная толстость и рудимент ископаемых систем.
> могу ошибаться, но прямой переход JP ADDR будет быстрее, чем через HL.
Именно ошибаетесь. В 2.5 раза JP ADDR 10 тактов, JP (HL) - 4. Это связано с тем, что для первой команды нужно целых три байта из памяти выбрать, а у второй - 1.
> JMP #LABEL
Ха-ха! :-) Очень интересно! Получается, что JMP в таком случае не обрабатывает аргумент совсем?! Неладно как-то эту команду сделали. Было бы естественно и логично, если бы это был переход по абсолютному адресу.
> MACRO11 - двухпроходный ассемблер
Это солидный фирменный ассемблер, он должен быть многопроходным - за два прохода всего не разрешить. И BR может переходы делать и вперёд и назад. Повторю, не нахожу разницы между JMP L или BR L кроме длины смещения. Генерировать принципиально разный код в таких ситуациях скорее толстость.
>Так это и было именно про ВМ1
Но вы там столько разных команд упомянули, явно не БКшных... Собираюсь почитать про пульт. Что же это за такое, никому не нужное, но присутствующее? Сегодня уже поздно - день пролетел. :-(
>Почему нельзя? Можно: JMP @ADDR
Ну что вы хотите от человека, решившего устроить себе БК-тур с месяц назад? :-) Кое-что ускользнуло. Тут ещё проблемка, ADDR берётся относительным, а MACRO11, которым пользуюсь, не делает тут сразу код, а передаёт компоновщику, которого нет в комплекте с МАКРО11 и вообще нигде нет. :-(
-
? MM@ - 03.11.2014 00:00
Нормальный кодер пишет перемещаемый код. Самоделкин - пишет др. варианты.
*
Интел-машкод родился на DEC-ЭВМ ( в 1971...1974 г. ) и не мог ему быть похожим именно по патентным соображениям.
Т.е. уродство машкода Интел-камней - исключительно для того, что бы DEC в свое время не скушала Интел ( а она и не думала это делать , т.к. с объемами до 1991 г. была больше на полпорядка, чем Интел ).
К сожалению, журнала "Электроникс" США периода 1960-1985 г. не сохранил, а то бы и отсканить статейки на эту тему не поленился бы.
( На даче воры лет 10 назад свиснули это дело, в т.ч. драгоценный номер за 1960-е г., в идеальном состоянии . Если кто понимает, о каком номере я здесь упомянул - можете даже и написать. ).
-
? Дмитрий - 03.11.2014 00:47
>> Ассемблер должен сам для коротких выбирать машинный код BR, а для длинных JMP. А он, наоборот, по-разному даже код для компоновщика для них делает!
Никто ничего не должен. Ассемблер только переводит мнемонику в машкод. Написано BR - генерим код для него. Слишком далеко? Выдаем ошибку - мол, автор, меняй-ка BR на JMP, далековато для BR.
¤
>> Именно ошибаетесь. В 2.5 раза JP ADDR 10 тактов, JP (HL) - 4. Это связано с тем, что для первой команды нужно целых три байта из памяти выбрать, а у второй - 1.
Ага, а кто выбор адреса в HL будет плюсовать? Вами же написано, что цепочка LD+JP 20 тактов. Прямой же JP 10 тактов. И???
¤
>> Многие (большинство) программ для БК грузятся с фиксированного адреса и программеру нужно лишь, чтобы ассемблелер сделал максимально эффективный код. Нужен ему переход на метку L он и пишет JMP L.
Угу, только программеру надо вызвать код из ПЗУ, чтобы не писать его в тело программы. Если вы не в курсе, то в то время каждый байт был на счету и извращались как могли, чтобы втиснуть код в отведенные 15кб. Отладчики же вообще (практически) всегда были перемещаемые. Так что в теле программы пишется JMP LABEL. Вызов же из ПЗУ - JMP @#LABEL. При таком способе куда программу не загрузи - всегда вызов будет в нужное место. Относительный же вызов кода ПЗУ из тела будет правильно работать только по тому адресу, на который скомпонована программа. Перемести ее и все полетит к чертям, ибо вызов уйдет на другой адрес. Так что не надо наводить тень на плетень и придумывать новые законы вселенной.
¤
>> Генерировать принципиально разный код в таких ситуациях скорее толстость.
Разные команды - разный код. Чего тут непонятно?
¤
>> Ну что вы хотите от человека, решившего устроить себе БК-тур с месяц назад?
Ну так а какого лешего вы тут втираете всем новые постулаты? Удобно/неудобно, такой/не такой код. Им все пользовались очень долго и только у вас он вызвал эти непонятные чувства. Вам не кажется, что дело не в коде, а вашем его непонимании?
-
? Ал-р - 03.11.2014 01:12
<litwr2>
Какой-то бред от лоха со сравнением ВМ1 и Z80, x86 - это разные процессоры разных производителей и сравнивать по типу ... а вот если бы да кабы ... рак на горе свисьнул :)
BR - команда короткого перехода содержащая относительный адрес(смещение) в самом слове команды, длина (вместе со смещением) всегда одно слово
JMP - универсальная команда на переход любой длины с разными вариантами адресации, длина команды 1-2-3 слова в зависимости от режима адресации
Профессионалы писали перемещаемые программы и драйвера, юзеры и халтурщики абы как лмшь бы както работало
Классический пример халтуры - все ПЗУ БК (Мониторы, Бейсики, ПЗУ-КД)
-
? MM@ - 03.11.2014 07:49
Почему ПЗУшки на БКшке халтурные - т.к. на БК изначально не было идеолога, прямо с Зеленограда.
Вместо того, что бы сделать простой филиал RMON от RT-11 , не портящим адреса 0-400, сделали развесистую убогость на целых 20000, причем даже без возможности ввода программ ( это о 017 прошивке ).
Более того, зачем-то присобачили 8-битный код дисплея, тогда как на всех порядочных DEC - ЭВМ коды 7-ми битные.
*
На форуме ixbt господин Отрохов прямо написал, что была цель - максимально дешовый аппарат. Съэкономили замечательно - и кодов в строке - 64, вместо стандартных 80, и время выборки ДОЗУ растянуто ( искуственно ) офигенно, а о размере памяти - вообще ...
Я там прямо спросил - это была маркетинговая цель, что бы развести линейки более-менее нормальных ДВК и уе..щных БК - типа не ответили, т.е. согласились с такой постановкой вопроса. ( ДВК-2 ( НМС1100 ) в 1983 г. стоила более 15.000 руб , а БК10 - 450 руб ).
*
Считается, конечно, что именно УКНЦ является первым бытовым СТАНДАРТНЫМ , совместимым программно с ДВК, компом, с аппаратными 80-ю кодами в строке - но аппаратец слегка запоздал ( 1987 г. ). Кстати, вроде как УКНЦ делал тот же автор, что и БК10, руководствуясь списком претензий недовольных БК10 юзверей.
-
? Ал-р - 03.11.2014 09:31
Монитор БК - студенческая курсовая, а потом Монитор ещё криворуко ковыряли - выложенный в сети ассемблерный текст не совпадёт с реальным Монитором (если его дизасемблировать).
-
? gid - 03.11.2014 10:27
>>? litwr2 @ - 2 ноября 23:30
[Ха-ха! :-) Очень интересно! Получается, что JMP в таком случае не обрабатывает аргумент совсем?!]
JMP и не должен обрабатывать аргументы. Он как и JSR обрабатывает адреса аргументов. Т.е. производит на одну операцию меньше при разборе адресации и регистра. Это довольно тонкий нюанс, на котором я, увлёкшись копипастой, запнулся в эмуляторе.
JMP #LABEL делает именно то, что вы от него просите. Адресация 27 означает переход по адресу, который содержится в регистре 7, после чего сделать инкремент регистра 7. В регистре 7 на момент исполнения содержится адрес аргумента команды JMP, а именно адрес ячейки, в которой содержится значение #LABEL.
Т.е. этой командой вы просите выполнить опкод #LABEL как машинную инструкцию. И только от значения LABEL, зависит, что при этом произойдёт.
¤
[Повторю, не нахожу разницы между JMP L или BR L кроме длины смещения]
А я повторю, что это абсолютно разные команды, просто в определённых случаях делают одно и тоже.
Вот попробуйте с помощью BR перейти по адресу, который содержится в РОН. И не сможете, а JMP может.
¤
[Но вы там столько разных команд упомянули, явно не БКшных]
Используемый в БК процессор принадлежит семейству DEC PDP-11, следовательно все команды семейства DEC PDP-11, потенциально исполнимы на БК, просто практически все не аппаратно, а путём программной эмуляции.
Речь ведь шла о неких недокументированных командах, вот я ответил, что недокументированных команд у ВМ1 нет вообще, всё хорошо задокументировано - почти всё - резервные коды. Но ведь нужно эти резервные коды как-то называть? Поэтому используется терминология DEC PDP-11.
Есть правда один нюанс - одни и те же команды на разных типах процессоров семейства DEC PDP-11 выполняются по разному. Некоторые с ошибками, некоторые - как нужно. Вот тут и проявляются разные тонкости, которые надо учитывать при программировании под какой-то конкретный тип процессора.
Как например в ВМ1 MFPS/MTPS из-за недочёта работают только с младшим байтом PSW. Но эта тонкость, и многие другие уже описаны в этой теме давным давно.
------------------------------
Не соглашусь, что на БК все ПЗУ халтурные.
Я дизассемблировал мониторы БК10, БК11 и БК11М. По впечатлениям сложившимся у меня от этого:
монитор БК10 - курсовая, как уже отметил Ал-р, человек писавший это не очень хорошо был знаком с процессором ВМ1 и его особенностями. Код писался как по учебнику. Всё просто и незатейливо.
монитор БК11 - откровенная халтура, код уныл и ужасен. И такое ощущение, что писался он на коленке в DESS. Такая отписка для галочки. До конца я дизассемблировать его я так и не смог.
монитор БК11М - красота и загляденье. Чувствуется, что писал человек, хорошо знакомый с повадками ВМ1, и умеющий программировать. Там применялись такие приёмы, что я просто получал удовольствие от дизассемблирования.
Единственное, что портит всю картину - злоупотребление макросами, из-за которых код распухает довольно сильно. Ведь можно было спокойно выделить однообразный код в подпрограммы.
И какое-то маниакальное нежелание исправлять ошибки в исходниках и перекомпилировать их заново. Нет, нужно обязательно править код в отладчике, ставя какие-то заплатки и уродовать код. Неужели процесс компиляции был настолько долгим по времени, что его избегали и старались применять как можно реже?
-
? litwr2@ - 03.11.2014 12:49
> Нормальный кодер пишет перемещаемый код. Самоделкин - пишет др. варианты.
Извините, но это позиция мечтателя и доктринёра. Политика нравится? :-) Абсолютное большинство программ на БК грузится с фиксированного адреса - это факт. Перемещаемость должна обеспечиваться иначе - это свойство ОС, её загрузчиков и компоновщиков.
> Интел-машкод родился на DEC-ЭВМ
Вы в это верите?! А в зелёных человечков? :-) Интел-ассемблер очень отличается от ДЕК-ассемблера. Вот Моторола 6809, 680x0, 6502 - те много прямиком позаимствовали, хотя даже они не смогли удержаться на 8-ой системе, которую, кстати, в ДЕК использовали потому, что считали, что 8-е числа ближе к 10-м и поэтому естественнее, упёрто не понимая, что 8-е и 16-е нужны вместо 2-х, а не 10-х. Влияние ДЕК было велико (GNU ассемблер до сих пор, наперекор Интел, использует по умолчанию ДЕКоподобный синтаксис для X86!), но не стоит его преувеличивать. Был ДЕК, были и другие, ДЕК ушёл...
> уродство машкода Интел-камней
Имеете в виду, если сразу в бинарных кодах писать, как ископаемые программеры первых поколений? :-) А журналы все в ГПНТБ можно вытащить, да и наверное много где ещё, если поискать.
> Ассемблер только переводит мнемонику в машкод
Да, плохой ассемблер так и делает, а хороший подберёт ту, что лучше подходит. А если нужна для какой-то прередкой особености именно неоптимальная, то для этого предлагаются специальные средства.
> меняй-ка BR на JMP, далековато для BR
Код опять поменяли, BR стал подходить и как быть автору? После каждого изменения все проблемные JMP менять на BR и ждать вердикта? ;-)
>а кто выбор адреса в HL будет плюсовать?
Вы понимаете, что пишите? В HL уже загружен адрес, JP просто переносит HL в PC. Косвенность обеспечивается на этапе загрузки HL из памяти за 16 тактов.
>только программеру надо вызвать код из ПЗУ, чтобы не писать его в тело программы
JMP ADDR и JMP @#ADDR занимают одинаковый размер и вторая инструкция вроде быстрее должна быть. Вы о том, что для вызова ПЗУ нельзя использовать BR? И как на первых БК можно было такое представить при том, что программа в нижних адресах, а ПЗУ в верхних?! И что мешало для экономии ценных слов и увеличения скорости все JMP addr в перемещаемой программе, где возможно, заменить на BR ADDR?
> Им все пользовались очень долго и только у вас он вызвал эти непонятные чувства. Вам не кажется, что дело не в коде, а вашем его непонимании?
Есть такое выражение "закостенеть в невежестве". :-) Не всё, что казалось когда-то правильным, было правильным на самом деле. Вспомните мир 30 лет назад. Вперёд, к победе коммунизма! :-) И дело не в туповатых лозунгах, а в том каков был культурный уровень людей, которым ЭТО было нужно. К сожалению, уровень культуры растет очень медленно. Проще собакам подражать, облаять, послужить, ... :-( Не претендую на знание всех тонкостей программирования БК, потому тут и беседую. Интересна точка зрения специалистов старой школы. Но как вы знаете, Платон мне друг... :-) Пользуюсь, случаем поблагодарить gid за полезную и интересную информацию.
> JMP - универсальная команда на переход любой длины с разными вариантами адресации, длина команды 1-2-3 слова в зависимости от режима адресации
JMP на 3 слова?! Это как? Розовые слоны уже побежали? :-)
> халтуры - все ПЗУ БК (Мониторы, Бейсики, ПЗУ-КД)
Все плохии, кроме Вас. Так? :-)
> на БК изначально не было идеолога
Вот-вот! Мечтаете о Карле Марксе для БК? :-) Классная идея. Сделать дрянь, но что бы авторитет сказал, не дрянь, а народ поверит - авторитет же! ИМХО, работать нужно было хорошо, а не по-собачьи хозяина искать.
> присобачили 8-битный код дисплея
И это плохо?! Люди время опередили (В Линукс 8-й бит нормально заработал только к концу 90-х), а вы их собачите. :-(
> кодов в строке - 64, вместо стандартных 80, и время выборки ДОЗУ растянуто ( искуственно ) офигенно, а о размере памяти - вообще
Для компьютеров такого класса и 64 с эмуляцией 80 - очень неплохо. Посмотрите на зарубежные компьютеры такого же класса первой половины 80-х. Обычно 32 или 40 знаков. Тут и Эппл, и Атари, и Коммодор, и Спектрум, и ... И размер памяти соответствовал. Вот замедленность памяти действительно рекордная, но вы сами писали, что её качество было очень низким (CAS ...). Сам помню знакомого, который в конце 80-х расширял память зарубежным компам нашими ОЗУ - подходила одна из 4-5. В ДВК вся элементная база гораздо дороже, хотя цена все равно была какая-то слишком высокая. Может через неё и связанную с ней цену на IBM PC и вышли на первоначальное накопление капитала? :-)
> это абсолютно разные команды
Мы похоже немного о разном. Вы о машинном коде, а вам об ассемблере. На уровне машинных кодов BR и JMP совершенно разные, но на BR LABEL и JMP LABEL абсолютно делают одно и тоже для небольших смещений. Почему же МАКРО11 для JMP именно в этом конкретном случае делает принципиально другой код для обработки компоновщиком? Явная недоделка или идеологическая упёртость. Зачем выпячивать эту искусственную разницу? Толстость на все 100%.
По поводу команд типа JMP @R1... Тут кто-то много писал про вызовы ПЗУ по фиксированным адресам в перемещаемых программах. Но JMP @R1 как раз и не подойдёт в этом случае! Нужно, например, вызвать подпрограмму, адрес которой в слове по адресу 120330 (PRT1 в ANDOS) и как это сделать в перемещаемой программе одной командой? Никак или через mov #@r1,pc - oб этом и писал. ;-)
> монитор БК11М
Может его готовеньким с Электороники-60 взяли?
-
? MM@ - 03.11.2014 12:50
Насчет правок ( ПЗУ ) в отладчике.
Да, это практиковалось.
Использовались до дыр затертые РФ3 ( их остался примерно полкило мешок, сданный на металл в 2008 г. ) , а для БК11М - РР1.
Для БК11М правили примерно под 50 перешивок, и осталось порядочно дерьма - например, нечетные слова кое-где, из-за которых нельзя переключать страницы памяти с пульта в ВМ3, хотя уже тогда предполагалось сделать 324, 325 базовыми и для БК100.
Да если начать копать ошибки - их много, самый развесистый пример - БК11 - БК11М ( исправленная БК11 ).
ИМХО - в БК11М надо было ограничится 1 шт. ПЗУ, по типу как в БК10, но без всяких там псевдотелеграфов на 177716, строки табуляции и графических режимов, да и не портить адреса 0-400. Решение этого вопроса возникло в 2-й редакции БК100 - СОЗУ небольшого объема ( 2 шт. 537РУ17 - пульт ).
*
Почему правили без перекомпиляции - потому что правил электронщик, его цель была - отладить, и MACRO-11 для него - чужая страна.
-
? MM@ - 03.11.2014 13:07
Насчет идеологии - если найдется рисовальщик, будет и БК11М3 - там будет достаточный простор для идеологии - она будет сменной ( в батарейном СОЗУ ). То, чего нельзя сменить - будет приделано сбоку ( конкретно - сверху, плата дисплея ). Этим можно будет решить вопрос о 80-ти кодах в строке и ПС/2 клаве ( возможно, местечка хватит и на ПС/2 мышку - её эмуляции по адресу 177714 ).
Конструктив получится достаточно дорогим, и будет, скорее всего, продаваться как чистая плата - т.к. монтировать/отлаживать неделю забесплатно я не в состоянии. Сейчас видится цена чистой платы дисплея - 1500 руб ( ДПП, огромная ).
Материнки ( для БК11М3 ), 6СПП - порядка $150 ( чистая ). Плата дисплея подойдет и к БК11М.
-
? Дмитрий - 03.11.2014 13:32
>> Да, плохой ассемблер так и делает, а хороший подберёт ту, что лучше подходит.
Ну вот вы так хорошо отзываетесь об х86 инструкции JMP - она у вас вообще уникальная. А вы глубже заглядывали? JMP SHORT имеет опкод 0xEB, JMP - 0xE9, JMP FAR - 0xEA. Ничего не напоминает? Dfv кажется странным, что в БК разные команды имеют разные опкоды, а тут одна и та же команда имеет разные опкоды. Считайте, что это зарезервированный макрос: BR = JMP SHORT, JMP = JMP FAR.
¤
>> Код опять поменяли, BR стал подходить и как быть автору? После каждого изменения все проблемные JMP менять на BR и ждать вердикта? ;-)
Бред несведущего человека...
¤
>> Вы понимаете, что пишите? В HL уже загружен адрес, JP просто переносит HL в PC. Косвенность обеспечивается на этапе загрузки HL из памяти за 16 тактов.
Вы сами-то поняли какую хрень вы сейчас написали? Для того, чтобы перейти по адресу в вашем случае надо сначала загрузить HL адресом, а потом перейти по этому адресу по JP. ЭТО СВЯЗАННЫЕ команды в данном случае. Значит и время выполнения надо складывать, ведь в HL может быть ЛЮБОЕ значение. JMP сразу грузит адрес в PC, а ваша цепочка сначала грузит адрес в HL, а потом шлет его в РС. Так что JP ADDR будет быстрее и занимать в памяти будет на 1 байт меньше, чем ваша цепочка.
¤
>> Вы о том, что для вызова ПЗУ нельзя использовать BR?
В 99% случаев BR не достанет, ибо перемещение возможно, грубо говоря, на 256 слов в обе стороны от адреса команды.
¤
>> И что мешало для экономии ценных слов и увеличения скорости все JMP addr в перемещаемой программе, где возможно, заменить на BR ADDR?
Внимательно прочитайте, что делает команда BR и как формируется ее опкод. Потом посмотрите на JMP и ее опкод + (ВНИМАНИЕ!) на формирование второго слова (в случае LABEL и @#LABEL) и все поймете. Не поймете - тогда лучше забейте.
¤
>> Не всё, что казалось когда-то правильным, было правильным на самом деле.
Что в данном вопросе неправильно? Была куча ассемблеров, со своими достоинствами, недостатками, приемами и ошибками. Напишите свой, который будет учитывать длину перехода и подставлять нужную инструкцию. В чем проблема? Раздуть срач на ровном месте? Вам это удалось...
-
? Дмитрий - 03.11.2014 13:38
Ребят, не кормите больше этого тролля - он и так толстый. Он еще прикопается к условным переходам и будет троллить, что БК гогно - нет команд условного дальнего перехода и вызова п/п и переход BNE LABEL1 на LABEL1: JMP LABEL2 для реализации дальнего условного перехода неприемлем по решению съезда компартии. :)
-
? gid - 03.11.2014 14:35
litwr2, вам надо обрести внутренний покой и постичь дзен архитектуры PDP-11.
Здесь всё не так, как в других архитектурах.
[Перемещаемость должна обеспечиваться иначе - это свойство ОС]
Нет. Здесь это свойство архитектуры, обусловленное наличием двух видов адресаций - абсолютной и относительной. Программист сам выбирает, будет ли его программа перемещаемой или нет. Если программа будет работать по фиксированному адресу, ОС никаким образом не сможет заставить её работать по другому адресу.
¤
[Да, плохой ассемблер так и делает, а хороший подберёт ту, что лучше подходит.]
В таком случае, лучший ассемблер - это Си.
А здесь ассемблер - это просто ассемблер. Это прямой транслятор человекопонятного машинного кода, чем по сути и является язык ассемблера, в простой машинный код. И ничего он не должен решать и додумывать за программиста.
¤
[JMP ADDR и JMP @#ADDR занимают одинаковый размер и вторая инструкция вроде быстрее должна быть]
да, быстрее на 2 такта. Если это критично, просто не злоупотребляйте джампами.
¤
[Мы похоже немного о разном. Вы о машинном коде, а вам об ассемблере]
Ассемблер не является языком высокого уровня, к нему неприменимы требования, предъявляемые к ЯВУ, и его вообще нельзя рассматривать в отрыве от машинного кода.
¤
[Нужно, например, вызвать подпрограмму, адрес которой в слове по адресу 120330 (PRT1 в ANDOS) и как это сделать в перемещаемой программе одной командой?]
Есть разные способы. Если хочется компактности, можно пренебречь перемещаемостью.
Если хочется непременно перемещаемости, то одной командой не обойтись.
Если вызовы используются слишком часто, то проще скопировать таблицу адресов подпрограмм в свою перемещаемую таблицу одноразовым инициализационным кодом, а уже потом использовать её, обходясь одной командой.
-
? Санёк - 03.11.2014 14:39
Он не тролль, он энтузиаст-БК-шник, только они тут пишут. Без них тут только среднестатические мужики сурово молчать останутся, под пиво и водочку.
-
? Аноним - 03.11.2014 15:22
Вот настоящий энтузиатс-БК-шник http://radikal.ru/users/Vslav#alb=Microscope&rnd=1
Остальные сурово тролят под пивко и водочку.
-
? Vslav - 03.11.2014 17:10
Ну блин. Хорошо что я там Home Video свое не выложил :)))
-
? gid - 03.11.2014 17:19
>>? litwr2 @ - 2 ноября 23:30
[а MACRO11, которым пользуюсь, не делает тут сразу код, а передаёт компоновщику, которого нет в комплекте с МАКРО11 и вообще нигде нет.]
Как-то это странно. На большинстве RTшных дисков, где находится MACRO.SAV обычно находится и компоновщик LINK.SAV и всякие другие полезные штуки.
Или вы пользуетесь каким-то другим макро11?
-
? anonymous - 03.11.2014 19:52
gid, видимо, у litwr2 версия на сях сделанная, типа http://www.dbit.com/pub/linux/macro11/
-
? litwr2@ - 03.11.2014 23:07
>Так что JP ADDR будет быстрее и занимать в памяти будет на 1 байт меньше, чем ваша цепочка.
Дмитрий, вы бы так не торопились. Разговор был про косвенную адресацию при безусловном переходе на разных системах. LD HL,(ADDR) JP (HL) - это именно косвенный переход на z80, а вы почему-то на прямой соскочили.
>Напишите свой, который будет учитывать длину перехода и подставлять нужную инструкцию.
Были бы время и нужда, пришлось бы писать. А так лишь отметил толстость в теме "толстости и тонкости".
>Если программа будет работать по фиксированному адресу, ОС никаким образом не сможет заставить её работать по другому адресу.
Писал о том, что объектный модуль может быть настроен компоновщиком на произвольный адрес загрузки. Интересно, как на первых Юниксах программы грузились? Жаль, Брухис и Вакуленко скорее всего свою работу не доделают. :-(
> Это прямой транслятор человекопонятного машинного кода
Это не совсем так. Обсуждали команду JMP для x86 - многие ассемблеры подставляют именно оптимальную. Даже на 8-битных ассемблерах для 6502 адрес когда надо заменяется на короткий. Другое дело, об этом уже писал, что должен был способ форсировать ассемблер понимать некоторые места буквально. Ассемблер может предоставлять очень непростые возможности, например, см. http://en.wikipedia.org/wiki/High_Level_Assembly
Ассемблер отличается от языков программирования высокого уровня только явной привязкой к конкретной аппаратуре. А машинный бинарный код - это и есть аппаратура. Есть тут разница. Да вы и сами не можете, не знать. Одно слово скажу пока - метки.
>Вот настоящий энтузиатс-БК-шник
Интересно, но непонятно, что там. Так и не удалось уговорить Voland'a сделать БК, которую можно сразу использовать, хотя согласился сам наладить питание. :-( Слишком много материализма, уважаемые господа. Это наверное главная проблема. Не подойти к БК без паяльника. А материя без информации - это просто пыль средневзвешенная в бесконечном объеме. Вот пишут, электронщик коды ОС правил - УЖАС! Но такова вся страна и это началось задолго до СССР. Ещё Петр 1 или даже до него богословие в России развивать запретил. Дескать, немногих умных иностранцы научат, а прочим солдатам-служакам ни к чему лишнее. С компьютерами обозначилась явная вторичность материи, что всё и обрушило. Мораль сей басни: меньше паять, больше программ делать. :-)
>Или вы пользуетесь каким-то другим макро11?
Работаю в кросс-средствами под Линуксом. С указанным anonymous МАКРО11. Компоновщик пришлось самому делать, если кому очень надо, могу выложить. Если надо не очень, то лучше не связываться, у меня он всё компонует, но без документации и требует иногда понимания к своей работе. ;-) RT11 не подходит, т.к. пишу утилитку под АНДОС.
И хватит некоторым тролльствовать. :-)
-
? Аноним - 04.11.2014 00:07
+1000 litwr2 иди отсюда и тролль своего работодателя :)
-
? Дмитрий - 04.11.2014 00:14
>> Писал о том, что объектный модуль может быть настроен компоновщиком на произвольный адрес загрузки.
А как ее скомпоновать на новый адрес, если автор исходников/объектников не приложил? Перемещаемой программе пофиг на адрес, на который ее компоновали. Ее можно загрузить на любой свободный адрес и она заработает. Неперемещаемую так не загрузишь - работать она не будет. В современных ОС все программы перемещаемые.
¤
>> это именно косвенный переход на z80, а вы почему-то на прямой соскочили.
А для чего вам этот изврат? Использовать прямой переход не судьба? Вам уже говорили, что загрузкой адреса в регистр вы портите признаки, а они могут понадобиться в том коде, куда вы прыгаете по JP. Я понимаю, когда подобное используется для перехода по таблице функций в зависимости от принятого параметра (номера функции). Берется адрес таблицы функций и по номеру вычисляется адрес перехода, который и грузится в HL. Далее выполняем JP и оказываемся в нужной функции. Тогда это оправдано. А тупо заменять JP ADDR связкой LD+JP бред.
-
? litwr2@ - 04.11.2014 08:47
>Вам уже говорили, что загрузкой адреса в регистр вы портите признаки
Что с вами не так... :-( В архитектуре Интел и Зилог при загрузке регистра признаки НИКОГДА не устанавливаются. Что вы там заменяете? О чем вы пишите? Зачем нужны косвенные переходы?! В современных ОС перемещаемость обеспечивает именно ОС своей архитектурой и загрузчиком программ и никаких усилий программеру тут прикладывать не надо.
-
? Аноним - 04.11.2014 13:00
А компилятор? Кто Relocation Table генерирует, ОСь разве? В принципе компилятору никто не мешает сгенерировать код + Relocation Table + загрузчик программы (фиксящий адреса) даже в случае .bin-файлов БК. ОСь тут строго не обязательна. И никаких усилий от программера это тоже не потребует. И наоборот, кто сказал, что в голом АСМ-е под Win никаких усилий по перемещаемости от программера не требуется? Нельзя написать под винтел неперемещаемый код, чтоль? Типа перехода по абсолютному адресу?
-
? litwr2@ - 04.11.2014 13:36
> Нельзя написать под винтел неперемещаемый код, чтоль?
Практически никак, может только какими-то супертрюками. Попробуете, например, в лоб селектор сменить сработает защита и получите прерывание, т.е. программа просто не будет работать. Переход по абсолютному адресу даже в ДОС команда полуподпольная, фирменные ассемблеры типа Турбо её никогда не поддерживали. В современных ОС всё такое сразу присекается или надо иметь привелегии ядра, т.е. быть частью ОС. Да и под ДОС программеру про перемещаемость можно было почти не думать. Кстати в современных ОС вся память плоская и переходы абсолютные - это абсолютная обыденность. ;-)
Про "голый АСМ" не совсем понимаю, что вы хотите?
> В принципе компилятору никто не мешает сгенерировать код + Relocation Table + загрузчик программы (фиксящий адреса) даже в случае .bin-файлов БК.
Об этом и писал. Но ОС даёт стандартный интерфейс для такого, иначе в каждой программе нужно будет иметь как бы микро ОС. В ДЕКовской архитектуре и раздражает более неумелая реализация перемещаемости (интелцы с сегментными регистрами тут явно обошли), о которой программеру нужно постоянно думать.
-
? Аноним - 04.11.2014 14:00
Ахахахаха! Особенно плоская память в процессе выполнение которого распараллелено по множеству ядер! Перестаньте кормить этого жирного троля! Пусть идёт учиться в MIT там его научат родину любить :)
-
? Дмитрий - 04.11.2014 15:12
>> Что с вами не так... :-( В архитектуре Интел и Зилог при загрузке регистра признаки НИКОГДА не устанавливаются. Что вы там заменяете?
Что-то мы удалились от темы в оффтоп. Мы в теме про БК, не про интел/з80. З80 я давно занимался и кое-что забыл (не мудрено без практики). На данный момент мне плевать что там делает интел или зилог. В БК команда MOV меняет признаки в зависимости от загружаемого значения. Вы же изначально спрашивали про асм БК. Вернемся к теме.
¤
>> В ДЕКовской архитектуре и раздражает более неумелая реализация перемещаемости (интелцы с сегментными регистрами тут явно обошли), о которой программеру нужно постоянно думать.
Использование относительной адресации в БК обеспечивает перемещаемость. Загрузить относительный адрес в регистр проще простого: или с помощью .addr, или связкой MOV PC,R0 / ADD (PC)+,R0 / .WORD @LABEL+2. Макрос делает это автоматически. И о чем тут думать? Никаких микро-ОС, никаких reloc-таблиц, никаких загрузчиков.
-
? Аноним - 04.11.2014 15:42
>Об этом и писал. Но ОС даёт стандартный интерфейс для такого, иначе в каждой программе нужно будет иметь как бы микро ОС.
Небольшой загрузчик, который корректирует адреса по таблице - всего лишь. Но такая таблица накладна при небольших размерах памяти - всего лишь :) Никакой оси тут не нужно.
¤
>Практически никак, может только какими-то супертрюками.
>Переход по абсолютному адресу даже в ДОС команда полуподпольная,
Ерунда:)
¤
>селектор сменить сработает защита и получите прерывание
>неумелая реализация перемещаемости (интелцы с сегментными регистрами тут явно обошли)
А причем сегменты интел-архитектуры к перемещаемости кода? Есть, например, 32-битный сегмент, покрывающий всю RAM машины. Если программист напишет код, жестко привязанный к определенным адресам в пределах сегмента, то чем сегментая организация поможет разместить этот код в другом месте в пределах сегмента? Зачем, собственно, нужна Relocation Table в EXE-файлах, если есть всякие там сегменты, а?
-
? anonymous - 04.11.2014 16:09
Кстати, relocation table и в RT11 используется в исполняемых файлах. Файлы типа .REL её имеют, это формат для системных и основного заданий. А .SAV - формат для фонового и виртуального заданий.
-
? Аноним - 04.11.2014 16:55
>Кстати, relocation table и в RT11 используется в исполняемых файлах.
Если её не грузить в память, а читать с диска в процессе коррекции адресов, то объем памяти не проблема, конечно.
¤
-
? litwr2@ - 04.11.2014 19:56
> изначально спрашивали про асм БК
He cпрашивал! Работал с ассемблером и решил обсудить его толстости. Привёл пример того, на на ВМ1 с "навороченной" адресацией с косвенным переходом хуже, чем на простеньком 6502, а вы стали 2*2 в 3*3 превращать.
> Использование относительной адресации в БК обеспечивает перемещаемость.
Это понятно, но простые решения не всегда лучшие. И зачем очевидные вещи писать?
> Ерунда:)
Совести хоть немножко осталось? Или лишь бы потроллить? :-( Попробуйте для TASM набрать что-то типа JMP 2000h:0...
> 32-битный сегмент
Смех один невесёлый. :-( Гав-гав?
Начало у этой темы очень занимательное. Про пультовый режим, неизвестные флажки... Оказывается на ВМ1 есть флажки с номерами, большими 7... Может тем, кому по-существу нечего сказать, вспомнить лучшие слова Людвига Витгенштейна и помолчать, не портить содержание своим недержанием?
-
? Дмитрий - 04.11.2014 20:04
>> на ВМ1 с "навороченной" адресацией с косвенным переходом хуже, чем на простеньком 6502
facepalm... Зачем ВМ1 косвенный переход для обычного случая, когда относительный проще и удобнее? 2х2 в 5х5 превращаем?
-
? Дмитрий - 04.11.2014 20:06
>> решил обсудить его толстости
До конца не вникнув в тонкости. Ну-ну и сразу троллинг начинаем?
-
? Аноним - 04.11.2014 20:40
В приличкой компании таких тролей как litwr2 с канделябром знакомят :)
-
? Аноним - 04.11.2014 21:08
> Ерунда:)
>Совести хоть немножко осталось? Или лишь бы потроллить? :-( Попробуйте >для TASM набрать что-то типа JMP 2000h:0...
А причем тут TASM? Вы лучше код DOS-программ посмотрите. JMP F000:E05B, кстати, обычно самая первая исполняемая инструкция при старте компьютера. И почему именно межсегментный (дальний) переход упоминается? MOV EBX,1000h; JMP [EBX]; тоже вполне себе переход по абсолютному адресу. А не относительному (по отношению к IP).
¤
> 32-битный сегмент
>Смех один невесёлый. :-( Гав-гав?
Не понял, в чем смех. Сегменты бывают 16-битные и 32-битные. Сегментные регистры (селекторы сегментов) - 16-битные.
-
? litwr2@ - 04.11.2014 22:41
>Кстати, relocation table и в RT11 используется в исполняемых файлах.
Вот о том и речь! Боюсь задеть идеалы юности некоторых, но куда деваться? Относительная адресация кроме случая экономии памяти на кототких переходах бесполезна. Медленнее и нужна только вирусам и хакерским выкрутасам недоученных программеров.
Дмитрий, в том что вы пишите есть вроде бы какая-то рациональная часть, но или вы её так тщательно укрываете несдержаностью и неясностью или её может и нет - никак не могу понять вашей позиции. Попробую последний раз с надеждой, что вы хороший человек... Вот вы пишите: "Зачем ВМ1 косвенный переход для обычного случая, когда относительный проще и удобнее?" Вопрос был ИЗНАЧАЛЬНО поставлен о том, что НЕТУ у ВМ1 нормального косвенного перехода, что выглядит ТОЛСТЫМ при наличии косвенно-косвенной адресации. Привёл пример, когда нужно было вызвать конкретную функцию АНДОС... Это всё. Вы стали писать, что в z80 прямой переход быстрее косвенного, потом, что косвенный совсем не нужен и т.п.
> Ну-ну и сразу троллинг начинаем? В приличкой компании таких тролей как litwr2 с канделябром знакомят :)
Если вы не тролли, то, уважаемые господа, может к сути? В чем претензии?
> А причем тут TASM?
А при том, что не берут многие ассемблеры такую команду и её приходится опкодом вводить. Неужели это не даёт право называть такие команды полуподпольными?
> MOV EBX,1000h; JMP [EBX]
И какие проблемы может вызвать такой переход в ОС? Сработает (почти наверняка) защита памяти, программа вылетит. Можно ли писать с подобнымми инструкциями программы, подразумевая их загрузку по конкретному адресу? Это какое-то лото будет получаться. :-) Или придётся на уровне ядра ОС делать поддержку загрузки таких кодов, что-то типа курьёзного кораблика в бутылке. Да, получается, что неперемещаемый код написать можно, если иметь целью его написать. Всякие бесполезные бесмыслицы можно на любом языке написать, только зачем их обсуждать как что-то того требующее?
Что до сегментов, то писалось про современные ДЕК-машинам реальности, писал конкретно про ДОС, где программеру про перемещаемость думать не надо, всю перемещаемость делают именно сегментные регистры. В Линукс, Виндуз и прочих "тяжёлых" ОС программерам эти регистры нужны только при написании самой ОС и только для начальной установки, к перемещаемости они уже никакого отношения не имеют.
-
? Дмитрий - 05.11.2014 01:47
>> что НЕТУ у ВМ1 нормального косвенного перехода
У многих старых процов его нет. На косвенном переходе свет клином сошелся? Кстати, можно взглянуть на кусок кода, где вам просто настоятельно потребовался косвенный переход? А то так рассуждать не видя причины сложновато. Может вы пошли по неверному направлению?
-
? litwr2@ - 05.11.2014 20:54
> Может вы пошли по неверному направлению?
Благодарю за поддержку. Уже намекал, почему выложил информацию о "толстостях". Пишу программку и там они повылазили. Решил обсудить... Ассемблер достаточно гибкий язык и если не работает так, то заработает слегка иначе. Вопрос возник по практическим делам (типа ограниченность XOR), но хотелось разобраться и с эстетикой. Некрасиво для меня JMP @#ADDR для абсолютного перехода, какая-то тут искусственная громоздкость с "собачкой": везде (x86, z80, 6502, 6809, ...) пишут просто типа JMP ADDR. Если кто захочет коды помочь улучшить, то предполагаю такую возможность предоставить, но тяжело это очень, поэтому не рассчитываю. Сам тут собаку съел... Хотя некоторых тонкостей ВМ1 возможно ещё не уловил.
А история повторяется. :-) В x86-64 появилось опять АВТОМАТИЧЕСКОЕ знаковое расширение старших 4-х байт, что как и на БК не даёт их всегда использовать для байт, а также универсальная ОТНОСИТЕЛЬНАЯ адресация как и на ВМ1, например, MOV AL,[RIP+80]
Кстати, на х86 можно писать, например, JMP AX или JMP R9, что аналогично JMP @R5 на ВМ1. DEC во многом были первыми...
Извиняюсь, если написал что-то не то или как-то не так. Всё же более 25 лет с БК дел не имел.
-
? Дмитрий - 05.11.2014 23:41
>> Некрасиво для меня JMP @#ADDR для абсолютного перехода
А связка MOV @#ADDR, R1 / JMP (R1) просто прекрасна. Нет, она просто идиотская. Додуматься использовать ее вместо прямого указания адреса в JMP @#ADDR надо еще суметь. Все с вами ясно. Тролль высшей марки. Слились на просьбе предоставить кусок кода. Сразу съехали и стали извиняться. Да еще более 25 лет с БК дела не имели. Походу вы про него совсем недавно узнали, о чем и проговорились (БК-тур месяц назад).
-
? Аноним - 05.11.2014 23:55
Этот троль отрабатывает зарплату из госдепа! Не кормите его!
-
? gid - 06.11.2014 07:55
>>? litwr2 @ - 5 ноября 20:54
[Некрасиво для меня JMP @#ADDR для абсолютного перехода]
Не нравится, не пишите так
[везде (x86, z80, 6502, 6809, ...) пишут просто типа JMP ADDR]
На БК тоже пишут именно так, когда хотят писать так.
И если уж используете MACRO11, заставьте его самого определять тип адресации 3 или 6, он это умеет, если его хорошенько об этом попросить. Правда код сильно замусоривается командами .ENABL, .DSABL, но тут уж или шашечки, или ехать.
¤
связка MOV @#ADDR, R1 / JMP (R1) эквивалентна JMP @ADDR.
А JMP @#ADDR эквивалентна связка MOV #ADDR, R1 / JMP (R1).
Собаки рулят.
-
? litwr2@ - 06.11.2014 19:18
Кажется понял, негласными установками и силами нескольких круглосуточных троллей, никакой даже минимальной критической позиции по БК не допускается. Извиняюсь, не знал. Но надо было такое в каких-нибудь правилах форума написать, а так облаяли и только тем и объяснили - не по-людски это как-то. :-(
> На БК тоже пишут именно так, когда хотят писать так.
Ho oзначает это не совсем то. С МАКРО11 проблем нет... Вы очень помогли разобраться с JMP #ADDR и с некоторыми другими вещами...
> JMP @#ADDR эквивалентна связка MOV #ADDR, R1 / JMP (R1).
Так, если не морочиться флажками и скоростью.
> MOV @#ADDR, R1 / JMP (R1) эквивалентна JMP @ADDR.
Не знаю, что и думать, но не вполне так и об этом уже выше писалось. :-( MOV @ADDR, R1 / JMP (R1)
¤
¤
-
? Аноним - 06.11.2014 19:35
Ты невоспитанный жирный троль! Таким нигде не комфортно ни в жизни ни на форумах! Таких никто не любит! Плачь троль плачь!
-
? foot - 06.11.2014 21:09
>>? litwr2 @ - 6 ноября 19:18>>
>>а так облаяли и только тем и объяснили - не по-людски это как-то. :-( >>
Не нравится - не ходи сюда. Никто тебя не звал.
-
? gid - 06.11.2014 22:18
>>? litwr2 @ - сегодня 19:18
[никакой даже минимальной критической позиции по БК не допускается]
Ваши здесь высказывания в большей мере не критика, а детское нытьё. И ассемблер вам не тот, и делает не то, что вам хочется, и архитектура PDP-11 не такая, и адресации не правильные.
PDP-11 - вымерший динозавр, а БК - вообще частный случай, и его надо принять как есть, работать с тем, что есть. Потому что ничего уже не изменить. Либо вообще бросить это занятие и не заморачиваться.
¤
[Не знаю, что и думать, но не вполне так и об этом уже выше писалось. :-( MOV @ADDR, R1 / JMP (R1)]
Не знаю что там не так, только что проверил в эмуляторе, всё так, как я написал. Но MOV @ADDR, R1 / JMP (R1) - это переход по адресу, который находится по адресу, который находится по адресу ADDR - совершенно избыточная конструкция. Если у вас возникают такие конструкции, то у вас что-то неладно с алгоритмом. Если @ADDR эквивалентно сишному **ptr и вполне оправдано, - это адрес адреса аргумента, довольно часто используемая конструкция, то MOV @ADDR, R1 / JMP (R1) - это ***ptr - адрес адреса адреса аргумента. Нормальные люди такого не используют, просто не доводят алгоритм до такого состояния.
-
? litwr2@ - 07.11.2014 17:48
>Ваши здесь высказывания в большей мере не критика
А вам этот неинтерпесный цирк и несмешной клоун или несколько нравятся? Заговорили о компьютерной теме на компьютерном форуме и вдруг лай и хай... Кому это надо? Вам?
>MOV @ADDR, R1 / JMP (R1)
Т.е. это не JMP @ADDR? :-(
-
? foot - 08.11.2014 01:18
Нет, это JMP @@ADDR :D
-
? TheGWBV@ - 08.11.2014 18:04
litwr2, вот тут неплохое учебное пособие по методам адресации https://yadi.sk/i/-iKJ99jDcaHmX
сама им пользовалась в 1990-е при освоении программирования БКашки в машинных кодах и на ассемблере...
-
? litwr2@ - 08.11.2014 18:59
3амутил что-то... Зарёкся не использовать относительной адресации, а тот втянулся в разговор больше меры вне своей компетенции... А книжка есть, лет 20 лежит. Жалко по 11М такой не написали.
-
? TheGWBV@ - 08.11.2014 19:29
litwr2, по 11М не успели написать... в 1996 году братишка уже пересел с БКашки на Pentium-133, в Quake играться :)
а я ещё до лета 1998 года пользовалась БК0011М и Vortex-ом для набивки-печати курсовых и диплома...
-
? litwr2@ - 10.11.2014 19:06
[Не по теме] Свою курсорсовую в 90-м делал на Коммодоре без диска, с магнитофоном и струйным принтером от БК. :-) В 1996 P133 - это было серьёзно, сам до следующего века на 120-й 4-е. С 1997 переводил хозяйство на Линукс. И пусть 3000 лет измений нет - http://www.youtube.com/watch?v=wD7DDasDukk - маленькое счастье побыть немного с Биллом мало что меняет. ;-/
-
? Аноним - 10.11.2014 19:37
▐▀ Конечная цель всего этого хобби - максимум поднять RSX-11 на плате FPGA, на точной реплике 1801ВМ3 или J11/1831ВМ1, а минимум - RT11 на ДВК разных модификаций, аналог МС1201.01 ▄▌
Сурово.
-
? Билл Гейтс - 10.11.2014 21:26
Я приложил к ним ногу, первой пинок назад, второй пинок вперед.
-
? litwr2@ - 06.12.2014 14:59
Вот ещё одну толстость нашёл - у XOR и ADD нет байтовых вариантов. Если знать чётность операнда, с ХОR можно сладить и с ADD иногда, но как быть, если адрес вычисляется? Явная толстость.
-
? Дмитрий - 07.12.2014 14:29
>> как быть, если адрес вычисляется? Явная толстость.
Никакой толстости. Адрес всегда 16-битный. Для чего нужны байтовые операции с адресом - что, уже для ADD #6,SP словная ну никак не подходит? Вот и вычисляйте без байтовых вариантов. А про XOR уже писали - не хватило битов для адресации, поэтому источник оставили просто регистром.
¤
PS: Кстати, забыли SUB - там также нет байтового варианта.
-
? litwr2@ - 07.12.2014 14:51
Хранится массив байт, надо к каждому что-то добавить или схорить. Адрес байта вычисляется через переменную. Как быть и без толстого кода?
-
? litwr2@ - 07.12.2014 14:56
Кстати, ошарашен операциями типа ADD #10,#100 - ну и ну! И кто ж такое мог придумать и тем более ещё использовать?!
-
? Ал-р - 07.12.2014 16:35
А как Вы предполагаете сколько советскому программисту нужно было употребить C2H5OH чтобы такой команд написять? :)
-
? Дмитрий - 07.12.2014 20:08
>> Как быть и без толстого кода?
Ну бывает. Как уж тут без издержек производства. Нет ничего идеального. Где-то чем-то приходится жертвовать. В данном случае извлекать байт в регистр, работать с ним, потом писать обратно. Хотя можно и без извлечения, маску/добавляемое сдвигать на 8 бит при нечетном адресе. Первый проще, второй - более громоздкий.
-
? Дмитрий - 07.12.2014 20:09
Кстати, поХОРить массив можно и словами - быстрее в 2 раза будет.
-
? Дмитрий - 07.12.2014 20:13
>> ошарашен операциями типа ADD #10,#100
А чего стоит операция xor eax,eax для очистки регистра? Сложно было ввести команду обнуления?
-
? Аноним - 10.12.2014 01:27
@Smeagol. Поздравляю с открытием! Я про это тут писал лет, наверное 10 тому назад. :D Только, ваша загадка кривая. Катлер не был архитектором RSX, он был одним из разработчиков. А в VMS он действительно был архитектором и ведущих разработчиком. Можно было RSX в вашей загадке поменять на XBOX для забавы. Потому как он руководил разработкой Оси для XBOX'а тоже. Причем, еще год назад в свои 70 лет он еще писал код. Что, кстати, видно по картинке в википедии. Железный дядька. Есть книга с его биографией и историей разработки Win NT. Мало того, что он программист от бога, он еще умеет зажигать. Книга на английском называется "Showstopper!". Подробности про вызов стриптизерш (читай проституток) на рабочее место, когда программисты практически уже жили в офисе, доводя Win NT до ума, мне больше всео понравились. :D
-
? Александр...@ - 10.12.2014 02:40
Пардон, за мумсор в ветке, но раз уж пошел такой базар. Загадка. Что общего между iPhone'ом и БК-0010? :D
-
? litwr2@ - 10.12.2014 20:38
Клавиатура БК очень своеобразная... Может есть какой материал по тому как с ней работать и по подробнее, с тонкостями? Автоповторов нет, но есть клавиша ПОВТ, выдающая код 1 (CУ A?) в клавиатурный порт, - получается работает только через ПО, запомнившего последнюю нажатую клавишу? Можно ли обнаружить АР2 событие как-то через порт, а не через специальное прерывание 274? Заранее благодарен за ответ.
-
? Ононим - 10.12.2014 23:29
А какую задачу может решить бутылка водки, которую не может решить бутылка виски? И наоборот? Зачем разные сорта спиртного, если для "накачаться алкоголем" достаточно одного? И вообще, смешно, когда какой-то стьюдент критикует разработчика ОСей. Что стьюдент сам-то написал?
-
? Ононим - 11.12.2014 00:23
Студент, предьяви результат. Где ТВОЙ софт или ТВОЙ хард, студент? Если нет такого, то иди в баню со своими смешками.
-
? litwr2@ - 16.01.2015 18:37
Нашёл ещё одну "толстость" - бесполезную команду MARK. Её можно использовать, например, так
push r5
push параметр1
...
push параметрN
mov #13*256+2*N,R5 ;13 - код MARK
jsr r5,proc
...
proc: ...
jmp (sp)
Но такой же эффект получается и без MARK
push параметр1
...
push параметрN
push #N ;необязательно для примера, но число параметров знать полезно
call proc
add #2*N+2,SP
...
proc: ...
return
Во-втором случае есть и преимущкства: регистр R5 остаётся свободным, быстрее - не надо МАRK исполнять. Не случайно эту команду, как писал Леонид Брухис, нигде не используют и номер кода у неё соответствующий.
-
? anonymous - 17.01.2015 02:43
「push #N ;необязательно для примера, но число параметров знать полезно」
Количество параметров обязательно надо засовывать, ведь если возврат происходит не туда, откуда был вызов, то вычищение стека желательно в самой функции производить, особенно, если переменное число параметров функция имеет. А MARK да, странная команда, самая редкоиспользуемая, это в литературе по БК/ДВК часто подмечают.
-
? litwr2@ - 17.01.2015 17:52
>Количество параметров обязательно надо засовывать
Необязательно, их можно через стек из Add достать.
>переменное число параметров функция имеет
Нечто с фиксированной точкой входа, с переменным числом параметров в стеке и неопределенной точкой выхода - это что-то только отдалённо похоже на функцию.
Много в ассемблере ДЕКа каких-то мусорных команд. Все (кроме mtps) одноадресные с операндом типа # и все двухадресные со вторым операндом названного типа. Доктринеры какие-то придумывали. Вот что значит монополия - застой и догматизм. Но, конечно, и внешний блеск, который может быть весьма ярким.
Ещё, но тут не уверен, косвенная косвенность в адресации кажется редко нужной. Во многих языках программирования, начиная с паскаля, это даже запрещено делать напрямую. С трудом представляю задачу, где бы это было часто нужно. Вызовы типа CALL @address, которые почему-то ещё и перемещаемые, полезны, но что-то ещё кроме типа MOV R2, @0(R1) (тут хотелось бы просто MOV R2,@@R1) с ненулём кажется экзотичным -- как часто нужно работать с адресами таблиц адресов?
-
? anonymous - 17.01.2015 18:31
Операнды # - это частный случай косвенно-регистровой адресации, где регистром PC выступает, т.к. регистры равнопарвны, но писать
mov (pc)+,(pc)+
.word 1,0
длиннее, чем mov #1, #0 - потому такую запись и ввели.
Со смещениями работать очень часто приходится, в предыдущем посте про передачу параметров через стек вы сами такой пример привели. В C и фортране во всех функциях так доступ к спискам аргументов сделан, кстати. Через индексную адресацию. После вызова функции/процедуры делается вызов CSV$, после которой $5 указывает на сохраненный $5, за которым адрес возврата лежит и далее список аргументов.
-
? litwr2@ - 17.01.2015 20:40
Согласен, что косвенная косвенность иногда полезна, но редко. А что касается кодов, похожих на
mov (pc)+,(pc)+
.word 1,0
то не знаю, как это может быть полезным. Выглядит чудовищно. :-)
-
? litwr2@ - 17.01.2015 21:42
Хотя придумал, где #-адресация может быть полезной. Пишем, например,
var = label + 2
label:
ADD #5,#0
и имеем обычную переменную var, которую где-то в коде увеличивают, например, на 5! Экономия памяти на слово и на одно косвенное обращение меньше. Не случайно ДЕК в лидерах был.
-
? Александр...@ - 17.01.2015 22:31
Сомневаюсь в практической ценности такой адресации, т.к. менять данные в исполняемом сегменте было дурным тоном до прихода MMU и конвейерных процессоров. "#" - это всего лишь макро (PC)+ и ничего более. Т.е. подобную мнемонику придумали не разработчики адресации и процессора. А последние думали в первую очередь об опыте реализации компиляторов на предыдущих поколениях процессоров DEC'а. Кстати, посмотрите на систему команд PDP-8 и 10, чтобы понять, почему разработчики 11-й, универсальной машины, разошлись на полную катушку. :)
-
? litwr2@ - 18.01.2015 08:10
Дурной тон... Вы гуманитарий? Инженер души человеческой? :-) Ещё бы программу КПСС вспомнили. Техника должна просто хорошо работать. Более экономное и быстрое использование памяти всегда полезно, а некрасивости можно скрыть специальными директивами транслятору. Но с промытыми мозгами современных технологий, где на развитие процессоров тратят в 100 раз больше, чем памяти, конечно проще раствориться в коллективном бессознательном. Сам только через месяц понял оригинальность подхода ДЕК. ;-)
И какая разница макро (pc)+ или #-адресация? Главное функциональность. А вы работали в ДЕК в 60-е или общались с такими, чтобы с уверенностью говорить что там было и почему?
-
? Александр...@ - 18.01.2015 08:35
Извините, вы про что? Какие КПСС о какие берега и какие развития процессоров? Я говорю про конкретную вещь. Об архитектуре процессоров будущего поколения уже тогда задумывались и понимали, что динамически исполняемый код не есть хорошо. Про синтаксис "#" адресации я тоже по-моему ясно написал. Какая на фиг функциональность!? Какой ДЕК 60-х? Вы вобще о чем и откуда свалились?
-
? gid@ - 18.01.2015 10:03
>>? Александр... @ - 17 января 22:31
[менять данные в исполняемом сегменте было дурным тоном до прихода MMU и конвейерных процессоров]
Наверное не ДО, а ПОСЛЕ. Т.к. именно конвееризация стала ставить требование не модифицировать код и не размещать данные в исполняемом сегменте, а до конвееризации и повсеместного распространения MMU, не возбранялось хранить код и данные в одной куче. Хотя и говорилось, что так делать не нужно.
¤
Вообще-то динамический самомодифицирующийся исполняемый код - это очень хорошо. Любой вирусописатель это вам подтвердит.
Это и антиотладка, и полиморфизм, и компактный код. А так же такой код принципиально не может осмыслить большинство классических программистов, для которых смешивание исполняемого кода и данных в одном сегменте - кощунство. Это сильно повышает ЧСВ людей, умеющих писать подобные программы. Верх мастерства - программа, в которой разные участки в разных условиях используются либо как код, либо как данные.
-
? Александр...@ - 18.01.2015 10:34
> Вообще-то динамический самомодифицирующийся исполняемый код - это очень хорошо. Любой вирусописатель это вам подтвердит.
Кто-то спорит об этом? Только разговор не об этом.
-
? litwr2@ - 19.01.2015 09:08
>динамически исполняемый код
Почему динамический? Писал о том, что повторять истины, верные только для процессоров с конвейером команд, но неверные для эпохи ДЕК, скорее неправильно. Intel x86 ММU, кстати, использовало разделение кодов на исполнимые и нет только в старой сегментой модели, в современной его нет. Использование #-адресации для хранения данных -- неплохой механизм оптимизации для архитектур тех лет, когда памяти было очень мало. Мне кажется если прогонять программы через такой оптимизатор возможно с профайлером, то это в среднем даст 5% ускорения и 5% уменьшения размера кода.
Но если это не считать полезным, то тогда #-адресация в большинстве случаев получается, подтверждая начальную установку, просто мусор, жертва абстрактой идеи полной ортогональности.
-
? Дмитрий - 19.01.2015 09:54
>> тогда #-адресация в большинстве случаев получается просто мусор
Это не мусор, а само собой получившееся. Адресацию # (27) использовали только в источнике и крайне редко в приемнике. Если это работает, то пользуйтесь. Кажется неправильным - не используйте. Также и с командой MARK - мне ее наличие не мешает, хотя логика работы, мягко скажем, кажется бесполезной. И я ее никогда не использовал. Мне вот непонятна логика разработчиков х86 - зачем применять медленный xor eax,eax, когда достаточно было бы написать коротко и быстродейственно clr eax? Имхо, это пережиток прошлого. На БК тоже можно написать XOR R0,R0 вместо CLR R0.
-
? litwr2@ - 19.01.2015 15:36
> медленный xor eax,eax
Чем же медленная? Быстрее команды нет. :-) И на БК xor r0,r0 должно исполнять примерно столько, сколько clr r0. CLR хороша только для очистки одной ячейки памяти, не надо задействовать регистр. Можно ещё sub r0,r0. ;-)
-
? Дмитрий - 19.01.2015 15:47
>> Чем же медленная? Быстрее команды нет.
Смеетесь? Сами подумайте, что быстрее - обнуление всех битов или логическая операция над каждым битом?
¤
>> И на БК xor r0,r0 должно исполнять примерно столько, сколько clr r0
Вы не понимаете. XOR двухоперандная команда, а CLR - однооперандная. Первая изначально выполняется дольше, чем вторая. У меня нет под рукой таблиц времени исполнения команд, чтобы выдать вам конкретные цифры.
-
? litwr2@ - 19.01.2015 21:45
Лень в таблицы посмотреть? Для вас свои представления важнее фактов? Для БК таблицы http://vak.ru/doku.php/proj/bk/1801vm-series
-
? Дмитрий - 19.01.2015 22:16
>> Лень в таблицы посмотреть?
Кто вам сказал, что эти таблицы - истина в последней инстанции? У Зальцмана были другие. Но не факт, что обе верны. Где-то на форуме были таблицы реально измеренных некоторых команд. К сожалению, у меня нет конкретных цифр (и Зальцмана тоже не могу найти, хотя точно помню, что были), чтобы сравнить. Если время равное - ну что ж, тогда я неправ, бывает. Я давно не брался за асм БКшки, мог какие-то моменты и забыть.
-
? Дмитрий - 19.01.2015 22:46
Таки был неправ - в этой же теме http://qbus.narod.ru/0.txt - там есть тайминги с разными способами адресации. XOR/CLR имеют одинаковое время с методом адресации 0. А по логике XOR против обнуления битов регистра должна выполняться немного дольше. Оказалось не так.
-
? Ал-р - 21.01.2015 22:11
Тут дело не в человеческо-ассемблерной логике - XOR в челоческом понимании это сложная команда а CLR это фю... Но процессор выполняет не ассемблерные команды а машинный код через матрицу-дешифратор, если представить про заскок в мозгах разработчиков то CLR могла быть и в пару раз длительнее XOR ...
-
? Ал-р - 09.02.2015 00:17
Способы адресации. Функции способов адресации (и механизма ...
... или (Присутствовавший на чествовании Кенена в его родном ауле ...) или (Отказ от бумажного журнала внес перемены в жизнь педа...)
- И не надо три раза повторять как для тупых -
- англоязычные чукчи свою Гуглю не знают?
-
? Patron - 10.03.2015 15:46
Возникли вопросы по работе процессора 1801ВМ1 с шиной МПИ :
1. На что влияет сигнал BSY, какие устройства и зачем его принимают ?
2. В какой момент процессор отвечает на сигнал DMR - после любого снятия SYNC или только перед выборкой кода очередной команды ?
-
? Vslav - 10.03.2015 18:27
По результатам исследования ВМ1А:
- вывод BSY является исключительно выходом типа "открытый сток"
- BSY выставляется по спаду CLK за такт до ниспадающего фронта SYNC
- BSY снимается вместе с SYNC
- внутри процессора активный BSY влияет только на анализ реакции входа RPLY
¤
Ведущий процессор (аппаратный номер 0) c постоянно деактивированным DMGI (ножка 5 на +5В) отвечает на DMR выставлением низкого DMGO при каждом завершении транзакции на МПИ - по нарастающему фронту DIN или DOUT. А ведомый процессор, который получает шину, в свою очередь дополнительно ждет отсутствия RPLY и SYNC на шине перед началом своей транзакции
-
? Patron - 10.03.2015 20:07
Кстати, разные ревизии 1801ВМ1 по-разному управляют сигналом BSY - одни снимают BSY вместе с SYNC, а другие ( более поздние? ) снимают BSY только если есть DMR ( в справочнике Шахнова за 1988 г. описано именно такое поведение BSY ). Похоже, что в ранних ревизиях 1801ВМ1 сигнал BSY генерировался с учётом возможности многопроцессорной работы, а в поздних - только для управления усилителями магистрали.
-
? Vslav - 11.03.2015 00:00
В той ревизии которую отреверсили, BSY тоже снимается и ставится не без участия DMR, но там еще несколько сигналов участвуют и фазы такие как написано в предыдущем посте. К многопроцессорности BSY получается никким боком, потому что это исключительно выход. Еще момент - физически наружу DMR выставляет только ведомый процессор, на ведущем этот выход блокирован.
А вот реальная странность, которую показывает вытащенная схема - это то что готовность формируется по первому фронту CLK при наличии DOUT и RPLY, что приводит к тому что импульс записи, например, в 177716 становится всего полтакта (200 нс при 5МГц). Возможно, тут уже быстродействие схемы сказывается и она просто не успевает выставить RPLY/DOUT и его же обработать. Реальные осциллограммы показывают что надо таки два фронта CLK для фиксации готовности. Или это ревизия кристалла такая, ошибку я долго предполагал, искал, но вроде все сфотано/вытащено верно.
-
? Аноним - 11.03.2015 00:29
Забавная странность маркировка процессора содержит три точки и сам он в пластике или это уже не вспомнить?
-
? MM@ - 11.03.2015 05:06
Насчет 3-х точек - зависит от даты выпуска процессора, примерно до 1989 г. - буква "В", до 3 мгц, без расширения арифметики.
От 1989 г. ( приблизительно ) - буква "Г", до 4.70 мгц, с арифметическими добавками.
Определить довольно просто :
Если это просто буква "В" - на команду "Умножить" процессор выдаст прерывание по 10 вектору, а если не выдаст - значит, буква "Г".
Однако, не вся буква "Г" хорошо идет на 6 мгц.
Дата введения изменений ТУ не во всех заводах одинаковая - подробности обычно писали в извещениях, прикладываемых к каждой партии ИС.
-
? tim - 14.03.2015 00:44
>? Vslav - 11 марта 00:00
>В той ревизии которую отреверсили, BSY тоже снимается
Будет ли обнародовано описание ВМ1 на Verilog ?
-
? Vslav - 14.03.2015 10:20
Уже публикуется, ход реверса: http://zx-pk.ru/showthread.php?t=23978
Асинхронная модель полностью готова, сейчас работа над утаптыванием снхронной в FPGA идет. Обем модели заводские тесты 791401 и 791404 проходят успешно.
-
? tim - 14.03.2015 23:56
Уважаемо, спасибо за такой труд !
-
? Аноним - 27.03.2015 14:02
@Vslav
Вы только модель одного ВМ1 утаптываете или уже созрели до мысли утоптать модель четырех ВМ1 в связке с куском шины и блоком памяти?
-
? Vslav - 27.03.2015 14:32
После того как модель будет адаптирована к Wishbone проблем сделать систему с N процессорами (N может быть от 1 до сколько ресурсов хватит - боьше 4 в том числе) особых нет. Это как на Си разработать сложную структуру, задать тип, а потом объявить массив из них. В принципе уже сейчас можно сделать модель на Q-bus из 4-х процессоров и памяти в связке, но пока сосредоточен на выходе хоть чего-то работающего на реальной FPGA. Как будет готова Wishbone-модель, буду делать БК-001x на ее основе, плюс вариант на модулях с парой реальных ВМ1.
-
? Вольдемар - 09.04.2015 22:43
Ну коль здесь медикаменты продоют, тоже по-продаю :
Спирт Экстра-96, канистра 10 литров, 2000 руб. Проезд : Митино, хоздвор, продавцы у машин. В воскресенье не работаем.
-
? Аноним - 10.04.2015 00:36
В деревне как-то свет отключился трактор столб задел так сосед в генератор чистый спирт залил чтобы футбол досмотреть под пиво дешевле ГСМ получается :-)
-
? Вольдемар - 10.04.2015 01:38
А футболисты в телеке потом прямо бегали, не качались ?
-
? bk-m - 10.04.2015 08:50
Волька - ну когда уже наконец будет регистрация, может всякие козлы замонаются пере-регистрироваться и писаться (из такой штуки между ног) под разными имями ???
-
? Аноним - 10.04.2015 11:41
Тут и так народ мало уже что-то пишет, а с регистрацией будет как у Воланда на форуме. Совсем редко кто писАться будет, нет? Или есть надежда на наплыв посетителей с новыми идеями, достойными обсуждения- после ввода регистрации?
-
? sam@ - 10.04.2015 12:10
Я думаю регистрация - нужна. Хоть я и редко захожу на форум, больше по RRS читаю. НО в последнее время наплыв придурков уже достал.
-
? sam@ - 10.04.2015 12:10
Я думаю регистрация - нужна. Хоть я и редко захожу на форум, больше по RSS читаю. НО в последнее время наплыв придурков уже достал.
-
? sam@ - 10.04.2015 12:10
Я думаю регистрация - нужна. Хоть я и редко захожу на форум, больше по RSS читаю. НО в последнее время наплыв придурков уже достал.
-
? sam@ - 10.04.2015 12:10
Я думаю регистрация - нужна. Хоть я и редко захожу на форум, больше по RSS читаю. НО в последнее время наплыв придурков уже достал.
-
? sam@ - 10.04.2015 13:19
Извите коллеги, но похоже не только регистрация нужна, а еще отлов всех багов. Отправлял сообщение один раз - пришло аж 4шт! :(
-
? bk-m - 10.04.2015 16:37
не надо слишком часто на ввод нажимать, и я писал про регистрацию для защиты от козлов
НОРМАЛЬНЫХ тут настолько мало осталось - зарегиться это просто тьфу ...
¤
-
? SPY - 10.04.2015 17:18
Может, скинемся хозяину форума на регистрацию ?
Я могу положить 100 руб на телефон, кто еще скока ?
¤
Троллей меньше станет на порядок как минимум !
-
? Аноним - 10.04.2015 18:18
Положу 111 руб на телефон хозяину форума если после того как предыдущий оратор положит ему 100 руб он не введет регистрацию ;-)
-
? Аноним - 10.04.2015 20:03
Троллей меньше на порядок? Тут троллей нет вроде, иногда народ шутит просто. А вот пользователей может уменьшится. Ну не увеличится же? Или сторонники регистрации обещают, что после этого будут писАть часто и интересно, и народ потянется?
-
? Вольдемар - 10.04.2015 22:09
Предлагаю объявить аукцион на должность модератора , после устройства регистрации.
Ставлю 121 рубль ( на телефон ) !
Кто больше ?
-
? Аноним - 11.04.2015 00:16
122 руьоя против!
https://youtu.be/G081hD0nwWE?list=PLg9qDwfqf0vmQjHiWZ-1UYaWFKKORw1pV
-
? электорат - 11.04.2015 00:31
Взяткам нет, выборам за заслуги да.
-
? Вольдемар - 11.04.2015 01:15
Ставлю 158 руб ( на телефонъ ) !
-
? Волька - 11.04.2015 01:55
Сейчас разгребу дела, и буду новый форумный движок писать, с регистрацией и автобаном, мне и для других проектов этот движок нужен. Сейчас даже нет времени установить новый каталог программ Voland-у, но скоро время появится на всё это.
-
? Вольдемар - 11.04.2015 02:37
Я выйграл со ставкой 158 руб ?
-
? litwr2@ - 11.04.2015 08:17
> Уже публикуется, ход реверса: http://zx-pk.ru/showthread.php?t=23978
Пользуюсь случаем выразить восхищение. А регистрация это ерунда - кто-то хочет в Начальника поиграть? Нужна только защита от роботов.
Нашлось опять после месяцев перерыва время немного побэкашить. И сразу обнаружились толстости. В бейсике (ПЗУ и дисковом для АнДОС) БК нет команд DEC (обратной к HEX$), INSTR (приведена в диковенном формате в описании 0008-01.35.04 для БК0011, но в ПЗУ бейсика ее нет), RESUME, LEFT$, ...
-
? Дмитрий - 11.04.2015 16:32
>> БК нет команд DEC (обратной к HEX$)
Была VAL$, но работала только с десятичными цифрами.
¤
>> LEFT$
MID$. Для выделения части строки справа приходилось извращаться с ней же - RIGHT$ не было.
-
? litwr2@ - 12.04.2015 15:56
Так и пишу MID$(A$,1,n) вместо LEFT$(a$,n) и MID$(a$,len(a$)-n+1) вместо RIGHT$(a$,n). Можно добавить RIGHT/LEFT, но как-то это бэкашности убавляет. :-) Писали раньше мастера без них.
С форумом что-то не так - не рассылает ответы на емыл.
-
? Дмитрий - 13.04.2015 11:06
>> Можно добавить RIGHT/LEFT, но как-то это бэкашности убавляет.
Нужно. Забейте вы на бкшность. Старые исходники программ не пострадают, новые будут с новым функционалом. Хотя я хз нужен ли кому-нибудь сейчас бейсик БК?
-
? litwr2@ - 13.04.2015 18:31
Не буду их делать. Цель - общение с духами БК, а RIGHT и LEFT их отпугнут. Другое дело INSTR и DEC - эти пришлось добавить - как же без них. :-)
-
? Дмитрий - 13.04.2015 20:09
>> а RIGHT и LEFT их отпугнут.
А с фига ли баня-то сгорела? :) MID-то никуда не денется, а значит => только MID, только хардкор!
-
? Аноним - 22.04.2015 00:45
http://www.3dnews.ru/913037
Процессор VIP-1 стал первым российским 40-нм чипом
-
? Аноним - 22.04.2015 15:01
Тайваньским.
-
? Аноним - 22.04.2015 15:01
Тайваньским.
-
? Макс Багаев@ - 24.04.2015 08:16
гы
ядро ARM Cortex-A9
те даже ядра своего сделать не смогли.
-
? litwr2@ - 01.05.2015 17:46
Господа, кто-нибудь пробовал сделать макрос типа
.macro superjmp label
.if gt label-.-nnn
...
чтобы он при вызове superjmp label если получается раскрывался в BR label, а если нет, то в JMP @#label? У меня не получилось. :-( Мнение - из-за того, что МАКРО-11 только 2-проходный - нужен 3-й проход.
-
? прохожий - 02.05.2015 11:24
>>? litwr2 @ - 1 мая 17:46
Делаете обертку типа Wrap relative jumps.
Огласите весь список(макрос), пожалуйста!
-
? прохожий - 02.05.2015 11:59
Лень писать на Macro-11,но вы пробовали при вызове макроса перед меткой ставить знак $.
-
? прохожий - 02.05.2015 12:05
superjmp $label
-
? litwr2@ - 02.05.2015 12:51
Пробовал код
.radix 10
.dsabl gbl
.asect
.=512
.macro superjmp l
.if gt l-.-248
br l
.endc
.endm
¤
start: superjmp l1
.rept 125
nop
.endr
l1: nop
.end
Вылетает с ошибкой ***ERROR Illegal symbol definition L1 - эта L1 смещается при вставке макроса и ассемблер не знает, что делать. С $ не работает - ***ERROR Bad .IF expression - в документации такое использование доллара не обнаружил, там только локальные метки должны заканчиваться $.
-
? litwr2@ - 02.05.2015 12:54
Если 248 заменить на 250, то сработает, но BR уже не вставится.
-
? прохожий - 02.05.2015 14:46
>>знак $
это в старом тоже самое что #.
Попробывал - просто использовал .if вместо вызова макроса. Результат тот же. Опретор условной комиляции с метками,видимо, не работает.
-
? прохожий - 02.05.2015 16:27
У Гилла А. в учебнике по ассеблеру pdp-11 есть подобный пример на странице 145.Все работает. Только метка должна стоять раньше макроса. Похоже,я был не прав,на самом деле оператор не работает с еще не объявленными до его использования метками. Ваше мнение где-то рядом с истиной.
-
? прохожий - 02.05.2015 17:13
Все что я написал ранее - ерунда,проблема здесь: l-.-nnn . Ассемблер не понимает когда получается отрицательное значение при участии метки. Если просто взять отрицательное значение(вычисляемого выражения без участия метки),то все нормально.
Кстати,вот пример у Гилла:
¤
.macro branch x
.if lt,.-x-255.
br x
.iff
jmp x
.endc
.endm
-
? litwr2@ - 02.05.2015 19:02
Получается можно сделать только superjumpback. :-( Лучше, чем ничего, но какая-то обидная слабинка у вроде бы лучшего фирменного ассемблера.
-
? прохожий - 02.05.2015 21:13
Похоже,Владимир,действительно метка при втором проходе смещается,у меня такое подобное было в avrasm2,долго мучился.
¤
Попробуйте это:
¤
.macro superjmpforward l
.if gt,l-.-255.
br 22 ;от фонаря
nop ;дополняет до четырех байт
.iff
jmp 33 ;от фонаря; 4 байта
.endc
.endm
¤
...
¤
start: superjmpforward l1
.rept 125
nop
.endr
l1: nop
-
? litwr2@ - 02.05.2015 22:40
Благодарю, Уважаемый анонимный прохожий, но какой смысл от такого "супера"? 4 байта заменяем на 4. Не тянет МАКРО-11 - не случайно ДЕК накрылся - плохо работали.
-
? litwr2@ - 03.05.2015 10:00
Частично pешил проблему внешним awk-сценарием, работающим через листинг.
-
? Аноним - 03.05.2015 10:56
>>Частично pешил проблему внешним awk-сценарием, работающим через листинг.
Интересно, покажите, если можно.
¤
Так думается, что для данных проблем нужно использовать какой-то очень мощный препроцессор, не знаю. Говорят m4, но он сложный.
-
? прохожий - 03.05.2015 16:06
>>? Аноним - сегодня 10:56
>>Говорят m4
Ерунда.Вы не понимаете это ведь фактически создать интерпретатор с языка ассемблера,чтобы посчитать расстояние из условного оператора до метки.Посмотрел в википедии - да,по тьюрингу полный,можно даже программировать на нем.Но нафиг это надо.
-
? litwr2@ - 03.05.2015 17:02
Сделал такую программку - jmp2br.awk:
#changes JMP@# to BR if it is possible
#usage: awk -bf jmp2br.awk FILE.lst >FILE.asm
#this program is for gawk variant of awk
BEGIN {print ".radix 10\n.dsabl gbl\n.asect"}
{
r = ""
if (index($0, $2) == 10 && substr($0, 41) != "") {
r = substr($0, 41)
if ($3 == "000137") {
distance = strtonum("0" $4) - strtonum("0" $2)
t = $0
gsub("^.*@#", "", t)
if (distance < 0 && -distance <= 254 || distance > 0 && distance <= 258)
r = "BR " t
}
}
else if (index($0, $2) == 41 && $2 ~ /:/)
r = substr($2, 1, index($2, ":"))
if (r != "") print r " ;" NR
}
Добавить убирание относительного JMP несложно, добавлением ветви с кодом "000167", - там даже не нужно будет смещение считать. Макропроцессор тут ни причём, тут нужна арифметика и язык типа аука, перла, рубина, пхп, ... Сам сценарий привязан к табуляции листинга: в 10-й позиции адрес команды/данных, в 41-й текст исходника. Есть ограничения, например, перед JMP (в одной с ним строке) не должно быть метки. Конечно, radix 10 - необязателен.
-
? litwr2@ - 03.05.2015 17:03
Плохо, что форумное форматирование сгубило отступы. :-( Ввести бы тег типа <code>...
-
? Аноним - 14.05.2015 17:34
Пробелы в начале строки съедаются нехорошо ;-(
-
? litwr2@ - 16.05.2015 07:45
Приведённый сценарий не всегда справляется с директивой '.if' - подправил это и сделал структуру более пригодной для расширения новыми директивами - выложено вместе с бейсиком.
Ещё толстость маленький размер каталога диска на БК в самой популярной системе: 112 записей на 800К общего объема нестыкуются. Для примера на самом популярном домашнем ПК Коммодоре (выпускался с 1981 по 1993) диск был на 170К, но размер каталога 144 (для диска на 800К, каталог - 292). На последнем успешном 8-битном ПК Амстраде размер диска 180К, а каталога 64. Но в АнДОС понравились каталоги - если хватает памяти, то это лучше, чем в ФАТе.
-
? марсианин - 16.05.2015 12:16
А у меня вопрос,я на живую не пробывал(лень),если скрипт .if затирает,то endc отается,так? Я лишь часок поразбирался с awk,может я чего-то не доглядел?
-
? марсианин - 16.05.2015 13:40
все нормально работает - не доглядел.А в комментариях после инструкции зачем номер строки добавляете,он нужен?
-
? litwr2@ - 17.05.2015 14:43
Номер строки в комментах - для игнорирования или для анализа - пища дотошным. :-)
-
? anonymous - 26.05.2015 18:25
ММ, вы на zx-pk спросили у Vslav про вектор таймера в ВМ1Г, он вам ответил, что вектор - 0270, тогда получается, что он тот же самый, что и от параллельного порта БК11М (IRQ3, 33 нога процессора)? Я на zx-pk не зарегистрирован и ВМ1Г у меня в запасниках нет для проверок.
-
? gid@ - 26.05.2015 19:01
Я тоже озадачился, и задал вопрос. Ждём прояснения ситуации
-
? Vslav - 26.05.2015 19:04
Да, пока 270 - это значение вытащенное по результатам реверса. Но тест проходит гладко - таймер генерирует прерывание, оно попадает на матрицу, матрица вектор не вырабатывает, она вырабатывает 4-х битный индекс для таблички. Табличка (генератор векторов и адресов) содержит 13 констант, они все известны -
160002, 160006, 160012б, 177716, 000004, 000010, 000014, 000020, 000024, 000030, 000034, 000100 и 000270. То есть никакого нового вектора в ВМ1Г не добавлено, я табличку в ВМ1Г специально перепроверял, может что и просмотрел, но вероятность небольшая. Также матрица вырабатывает 3-битный индекс для сброса запроса - и этот сброс точно попадает на запрос таймера, вероятность что неправильно разобрана матрица тоже небольшая. Но - да, надо перепроверить на реальном процессоре, мне пока негде.
¤
Мой тест, запустить и посмотреть куда улетит:
¤
entry: mov #stack, SP ;
mov #0, @#TCSR ;
mov #2, @#TLIM ;
mov #24, @#TCSR ;
mtps #0 ;
wait ;
br entry ;
-
? of@ - 28.05.2015 13:35
It'll also save a lot of cash and time for those on a restricted budget who
-
? of@ - 28.05.2015 13:36
It'll also save a lot of cash and time for those on a restricted budget who
-
? MM@ - 28.05.2015 13:43
Господа, дайте ссылки на фото 1801ВМ1Г - как он выглядит реально ?
-
? anonymous - 28.05.2015 18:02
В ответе вам на zx-pk Vslav дал ссылку на статью, http://zx-pk.ru/showpost.php?p=805998&postcount=598 , там имеется фото по крайней мере одного ВМ1Г - 89 год и 4 точки, керамика. Если верить информации из ТУ, новые процессоры (1990г и далее) ВМ1Г маркировались 2 точками, но насколько заводы соблюли это - не известно, надо брать процессоры 90го и далее годов с 2 точками и проверять.
-
? Vslav - 28.05.2015 19:07
Я декапил пластиковую микросхему с эмблемой "Смерть и Голод" и маркировкой 1801ВМ1 9011 с двумя точками и это оказался именно Г.
¤
Пластиковый: http://s020.radikal.ru/i720/1505/45/85687c5b1adf.jpg
Керамический: http://s017.radikal.ru/i433/1505/88/4942dfb1eba8.jpg
-
? Vslav - 28.05.2015 19:09
В предыдущем посте керамика оказался 1801ВМ1А
¤
Вот 1801ВМ1Г: http://s017.radikal.ru/i427/1505/c4/488ec4793e7e.jpg
-
? MM@ - 28.05.2015 21:44
Ладно, могу типа такого попробовать подключить :
http://itmages.ru/image/view/1683482/89cd9eca
Но на снимке - "говнопроцессор".
-
? anonymous - 23.11.2015 21:07
Patron, я проверил на БК0010 с пультом http://zx-pk.ru/showthread.php?t=23978&page=80&p=843153&viewfull=1#post843153
¤
@1000/000000 110700
001002/000000 110701
001004/000000
@R0/157776 0
R1/161241 0
@1000G
-- nazhal halt --
@ 001000
@R7/001000
R0/000002
R1/000002
@1000/110700 5000
001002/110701
001004/000000 5200
001006/000000
@R0/000002 0
R1/000002 0
R2/177777
@1000G
@ 001010
@R0/000002
R1/000004
@1000/005000
001002/110701
001004/005200 12701
001006/000000 5200
001010/000000 5700
001012/000000
@R0/000002 0
R1/000004 0
@1000G
@ 001014
@R0/000001
R1/012701
@0/000000 110701
000002/000000 137
000004/000000 6
000006/000000
@136/000000 1
000140/000000
@0G
-- nazhal halt --
@ 000141
@R0/000001
R1/000002
@R7/000141
@RS/000340
@
-
? Patron - 24.11.2015 16:18
Есть ещё один момент, который не мешает проверить на реальной конфигурации с ВМ1 и портом терминала.
Давным-давно мы выяснили, что в ходе выполнения последовательности :
..........
BIS #100,@#177564
NOP
..........
прерывание по вектору 064 происходит после выполнения команды NOP
Недавно стало ясно, что это вызвано тем, что проверка состояния IRQ для активации блока прерываний следуюущей команды производится процессором 1801ВМ1 в цикле DATIO до фазы записи.
Но в цикле DATO проверка состояния IRQ производится процессором ВМ1 в момент снятия сигналов BSY и SYNC, что в принципе даёт порту терминала где-то 4 такта, чтобы успеть выставить IRQ до начала выборки следующей команды.
Чтобы проверить, успевает ли реальный порт терминала успеть выставить IRQ до начала следующей команды - можно выполнить последовательность :
..........
MOV #100,@#177564
NOP
..........
и проверить адрес возврата в стеке, после остановки процессора командой HALT в обработчике прерывания по вектору 064.
Для осуществления аналогичной проверки из-под RT-11 написан тест: [ http://emulator.pdp-11.org.ru/misc/IRQT1.zip ]
Результаты прогона теста на платах с ВМ2 и ВМ3 можно посмотреть здесь: [ http://zx-pk.ru/showthread.php?t=18184&p=842770 ]
-
? anonymous - 24.11.2015 21:00
Patron, у меня так вышло:
@157774/177777 5020
157776/177400 776
@R0/016040 0
@157774G
@ 157776
@1000/000000 12706
001002/000000 1000
001004/000000 12700
001006/000000 1400
001010/000000 12720
001012/000000 240
001014/000000 20027
001016/000000 160000
001020/000000 1373
001022/000000 106427
001024/000000
001026/000000 12700
001030/000000 100
001032/000000 12701
001034/000000 177564
001036/000000 12737
001040/000000 50011
001042/000137 1400
001044/000014 137
001046/000000 1400
001050/000000
@1000G
@ 000002
@R6/000774 @
000774/001404
@1400/050011
001402/000240
001404/000240
@1040/050011 10011
@1000G
@ 000002
@R6/000774 @
000774/001402
@1400/010011
001402/000240
001404/000240
@
-
? anonymous - 24.11.2015 21:04
На ВМ1, естественно. Лог подчистил, 137 в 1042 - результат пропуска кода при наборе, возврат на редактирование вырезал из текста.
-
? Patron - 24.11.2015 23:04
Получается, что терминальный порт успел выставить IRQ до конца цикла DATO и прерывание произошло сразу после MOV #100,@#177564
Возможно, другой результат при тестировании ВМ2 объясняется более высокой тактовой частотой ВМ2, оставляющей порту меньше времени на "упреждающее" выставление IRQ.
-
? Manwe@ - 11.08.2018 16:45
Будут ли работать команды START и STEP на БК0011М с контроллером SMK-512 в Halt-режиме этого контроллера?
-
? gid - 11.08.2018 17:10
будут. при условии, что вы знаете как работают эти команды. т.е. перед использованием их, вы уже зашли в пультовый режим.
-
? BD - 11.08.2018 18:53
"Примочки" от ММ позволяют это сделать. УТК, УТК-2..
http://zx-pk.com/forum/viewtopic.php?t=10086&f=4
Но зачем? ))
- << Форум