PDA

Просмотр полной версии : Цифровая археология: 1801 и все-все-все



Страницы : 1 2 3 4 5 [6] 7 8 9 10 11

form
30.08.2017, 07:03
И что, нет матерных сообщений от MACRO.SAV ?
А с какой стати?
Совершенно нормальная команда.
Это не какой-нибудь JMP (R2)+ :)

Vslav
30.08.2017, 11:12
А эти nCAS иголки случайно не RC цепочкой должны гаситься?
Теоретически должны. А практически там "иголки" 5-15 нс

- - - Добавлено - - -

Хочу промоделировать в модельсиме и снять диаграммы на реальной МС1201.03 такие циклы:

- цикл чтения DRAM без коррекции, запуск TA
- цикл чтение DRAM без коррекции, запуск DIN
- цикл чтения DRAM, коррекция включена, запуск TA, нет ошибки
- цикл чтения DRAM, коррекция включена, запуск DIN, нет ошибки
- цикл чтения DRAM, коррекция включена, запуск TA, ошибка некорректируемая
- цикл чтения DRAM, коррекция включена, запуск DIN, ошибка некорректируемая
- запись слова DRAM, коррекция выключена
- запись слова DRAM, коррекция включена
- запись младшего байта DRAM, коррекция выключена
- запись старшего байта DRAM, коррекция выключена
- запись младшего байта DRAM, коррекция включена , нет ошибок
- запись младшего байта DRAM, коррекция включена , корректируемая ошибка старшего байта
- запись младшего байта DRAM, коррекция включена, некорректируемая ошибка старшего байта
- чтение ROM
- чтение SRAM
- запись слова SRAM
- запись младшего байта SRAM
- запись старшего байта SRAM

Что-то еще будет интересным и что надо добавить?

A074MO
01.09.2017, 20:46
Мне удалось перенести Ваш проект на EP4CE6
62134
Для оценки скорости загрузил код:


.asect
.=0
start: mov #377, r3
1$: tstb @#177564
bpl 1$
mov #101,@#177566
delay: mov #177777, r2
2$: mov r4, r5
sob r2, 2$
sob r3, delay
br start
Символы выскакивают с периодом 4 сек (15 за минуту).
Прокомментируйте результат.

Patron
01.09.2017, 21:21
Прокомментируйте результат.По моим подсчётам получается 4.2 миллиона пар команд MOV+SOB в секунду. Если MOV выполняется за 8 тактов, а SOB за 16 тактов - значит быстродействие регистровых команд составляет: 12.6 MIPS.

A074MO
01.09.2017, 21:45
Patron, большое спасибо. Получается (8+16)*4,2 соответствует тактовой частоте 100 MHz. А сколько MIPSов у реального 1801вм1 ?

Vslav
01.09.2017, 21:45
значит быстродействие регистровых команд составляет: 12.6 MIPS.
От итоговой частоты проекта зависит. Если сохранились мои исходные 100МГц, то так и есть - 8 тактов на MOV (100/12.6)

A074MO
01.09.2017, 22:02
Vslav, Большое спасибо за проект. При компиляции было предупреждение "Critical Warning: Timing requirements not met", я его погасил уменьшив speedgrade до 7.

Patron
01.09.2017, 23:45
А сколько MIPSов у реального 1801вм1 ?У реального 1801ВМ1 при работе с реальной памятью быстродействие регистровых команд ( 14 тактов частоты 5.3 МГц на команду ): 0.38 MIPS.

MM
01.09.2017, 23:54
А сколько MIPSов у реального 1801вм1 ?
0.50 Млн рег-рег, при 2-х тактах ОЗУ и 4.608 мгц тактовой, см. МС1201.01.
При 0 тактах ожидания и 5 мгц - некотрые экз. проца могут висеть ( схемотехнический баг ? ), а некотрые показать до 0.6 MIPS.
*
Общественность тихо и смиренно ждет, когда же уважаемый господин Вслав сделает таки модуль "1801ВМ1ААА" на 100мгц, пи-то-пин совместимый с оригиналом, с настройкой таймингов МПИ микропеключателями.
Такой модуль необходим для академического разгона всякого старья :v2_dizzy_fire:

Vslav
02.09.2017, 01:28
Починил, наконец, свою МС1201.03. То работала, то не работала. Наконец подохла надежно. Прицепил анализатор - не поднимается AD9. Оказалось 15 Ом на землю. Поиск привел к закоротке дорожки под микросхемой 565РУ5. Теперь можно снимать диаграммы ВП1-119 с живой платы.

- - - Добавлено - - -

А в пультовую RAM как-то можно осуществить запись с монитора? Хотелось бы оттуда тестовые программки позапускать.

Patron
02.09.2017, 01:39
А в пультовую RAM как-то можно осуществить запись с монитора? Хотелось бы оттуда тестовые программки позапускать.Вроде, никак.

Vslav
02.09.2017, 08:18
Вроде, никак.
Эх, поставить бы панельку вместо 1801РЕ2-134, вставить туда РЕ-мулятор и разработать новое пультовое ПЗУ. Но у меня сейчас другая задача.

AFZ
02.09.2017, 10:09
А в пультовую RAM как-то можно осуществить запись с монитора? Хотелось бы оттуда тестовые программки позапускать. С 377-й прошивкой можно. Нужно положить какой-то "парольный" код по адресу 100000, а с адреса 100002 (вроде бы, подробностей не помню, надо смотреть дизасм 377-й) разместить программу, которая будет исполняться в HALT-mode. А из нее можно переслать в ту самую RAM все, что угодно, после чего сбегать туда CALL'ом.

Только для РЕ-мулятора понадобится спец. прошивка: 377-я не содержит памяти с адресами 014000-017776, не отвечает СИПом на эти адреса и не открывает выходные буферы. Как, впрочем, и 134-я.

Vslav
02.09.2017, 11:37
Хорошо видно как на МС1201.03 недостаточно хорошо подавляется CAS в цикле регенерации. Поскольку бывают циклы регенерации с активным WE, то это может вызывать проблемы.

http://s014.radikal.ru/i328/1709/d9/604f7283a6b3t.jpg (http://s014.radikal.ru/i328/1709/d9/604f7283a6b3.png)

Hunta
02.09.2017, 13:31
недостаточно хорошо подавляется CAS в цикле регенерации
Вы про пик nDCAS?
Это снято на реальной плате?
А чем Вы такие данные снимаете-визуализируете?

Vslav
02.09.2017, 15:03
Сигналы D* - взяты с ножек 565РУ5, конкретно DS23. (DRAS с DS9). Да, про пичок на DCAS.
Снято на реальной плате МС1201.03. Плата починена, T4 проходит многократно без ошибок в с коррекцией и без, нормально загружается RT-11
Логический анализатор Acute TL2136, конкретно эти картинки сняты с дискретизацией 200МГц.

PS. Замена 531ИР22 на 1533ИР22 снижает потребление на 100мА на каждую замененную микросхему. В корзине такой плате полегче будет. Осциллограф никаких отличий на шине адреса ОЗУ в сигнала после замены не показал. Все отлично работает, тесты проходят, только греется все на четверть меньше.

Hunta
02.09.2017, 15:23
Vslav, спасибо. В размышлениях - чем мне осциллограф заменить :)

Hunta
02.09.2017, 17:29
Посмотрел. Да... хорошая игрушка. Ценннная, главное :rolleyes:

Vslav
02.09.2017, 18:12
Посмотрел. Да... хорошая игрушка. Ценннная, главное :rolleyes:
Есть варианты попроще и не столь... ценные. :) Для ретро вполне подойдут. А этой игрушкой я иногда там DDRx память подсматриваю, раньше смотрел PCI-66, ATA-133 и всякое попроще. А для современных последовательных интерфейсов другие анализаторы.
PS. А тут у нас целая тема по выбору ЛА была (http://zx-pk.ru/threads/27574-logicheskij-analizator-pomogite-vybrat.html).

Hunta
02.09.2017, 18:53
Чисто технически это для меня хорошая, но не запредельная цена - была б работа :)

А тут у нас целая тема по выбору ЛА была
Загляну, посмотрю, спасибо :)

Vslav
02.09.2017, 21:58
Цифровая археология 1801: северный мост 119 (http://forum.pk-fpga.ru/viewtopic.php?f=43&t=5603)

Разобрался, наконец, досконально как работает 1801ВП1-119. Все триггеры распутал, схему нарисовал внятно, выполнено моделирование. Чтобы убедиться, что получившаяся модель адекватно отображает работу физической микросхемы, были сняты диаграммы с реальной платы МС1201.03. Расписывать работу этой микросхемы можно долго, поэтому в статье ограничился особо интересными (как мне показалось) подробностями и включением оригиналов диаграмм в архив. Может быть позже дополню по результатам обсуждения (если таковое будет).

MiX
03.09.2017, 08:37
Замена 531ИР22 на 1533ИР22 снижает потребление на 100мА на каждую замененную микросхему.
А на КМОПовские м/х заменить никак?, чтоб совсем не грелись. Быстродействия хватить?

только греется все на четверть меньше
531 греются как печки, ппц.

- - - Добавлено - - -


Разобрался, наконец, досконально как работает 1801ВП1-119.
Кстати везде стоят опытные образцы. До серии так и не дошли.

Vslav
03.09.2017, 08:49
А на КМОПовские м/х заменить никак?, чтоб совсем не грелись. Быстродействия хватить?
Можно попробовать 74HCT273, вроде скорости и тока хватает. Но второй раз перепаивать не буду. Сейчас заменено 5 штук 531ИР22 на 1533ИР22, ток платы упал с 3.46 до 2.97A, аптайм уже сутки, все работает нормально.



531 греются как печки, ппц.

Измерения на реальной плате, плата лежит открыто на столе, в комнате +24С:
1801ВМ3 - 44 градуса
1801ВП1-119 - 46 градусов
1801ВП1-065 - 48 градусов
555ВЖ1 - 50 градусов
531ИР22 - от 54 до 58 градусов
531АП2 - 46-48 градусов

Буду корзину с обдувом майстрячить, советские вентили поменяю на что-нибудь новое и тихое.

MiX
03.09.2017, 09:07
Vslav, Какой клок с 531ГГ1?
На ней завален фронт, резистор 100ом между 7 и 16 ногой немного исправляет проблему. Пробовал заменять на SN74S124, там фронт тоже завален.

- - - Добавлено - - -


Можно попробовать 74HCT273
Советских аналогов не было?

- - - Добавлено - - -


Сейчас заменено 5 штук 531ИР22 на 1533ИР22
Осталось ещё 3. :)

Vslav
03.09.2017, 09:15
Какой клок с 531ГГ1?
5.3 МГц где-то.



На ней завален фронт

Да я бы не сказал, у меня на осциллографе все красиво (ножка 60 процессора):
62143



Советских аналогов не было?

Не знаю.



Осталось ещё 3. :)

4, Карл, 4 :)
Есть еще одна 531ИР22 - буфер адреса SRAM.

MiX
03.09.2017, 09:35
Да я бы не сказал, у меня на осциллографе все красиво (ножка 60 процессора):
У меня почему то так.
http://s002.radikal.ru/i198/1709/54/aadf69175430.png (http://radikal.ru)


Есть еще одна 531ИР22 - буфер адреса SRAM.
Она не в таком горячем режиме.

Vslav
03.09.2017, 09:54
Она не в таком горячем режиме.
А от частоты там слабо зависит. Сама схемотехника 531-ой серии в статическом состоянии кушает.
PS. Только что заменил ее на 1533 - еще почти 100мА потребления долой. Замена всех 531ИР22 даст снижения потребления платой до 20 процентов.

- - - Добавлено - - -


У меня почему то так.

Может емкость где большая прикручена?

MiX
03.09.2017, 10:52
Сама схемотехника 531-ой серии в статическом состоянии кушает.
Тогда АП2 долой.


Может емкость где большая прикручена?
Да, сам осциллограф добавлял. Переключил делитель на 10х стало нормально.

http://s48.radikal.ru/i119/1709/5d/9f2847eff976.jpg (http://radikal.ru)

- - - Добавлено - - -


Замена всех 531ИР22 даст снижения потребления платой до 20 процентов.
Для меня главное температурный режим.

MiX
03.09.2017, 14:20
Vslav, Ещё хотел уточнить.


Это у Вас память тормозит. Если ВМ3 успевать кормить инструкциями (ноль тактов ожидания на шине), то на операции регистр-регистр тратится всего 3 тактаКак память может влиять если пересылка идет с регистра в регистр.

Vslav
03.09.2017, 14:28
Как память может влиять если пересылка идет с регистра в регистр.
Выборка кода операции. Вот в этой (http://zx-pk.ru/threads/21192-eksperimentalnye-protsessornye-moduli-2kh1801vm1-i-1801vm2/page6.html) теме я снимал диаграммы с реального ВМ3 на стенде с максимально быстрой памятью внутри FPGA, именно на цепочке исполнения операций регистр-регистр. На выбор слова из памяти нужно три такта, выходит что это минимум для одной инструкции. За сколько тактов реально исполнит инструкцию регистр-регистр внутренний микроавтомат ВМ3 мы пока не знаем, до получения модели по результатам реверса. Но не менее двух тактов (такт декодирования + минимум такт исполнения).

MiX
03.09.2017, 14:45
За сколько тактов реально исполнит инструкцию регистр-регистр внутренний микроавтомат ВМ3 мы пока не знаем
В тесте SPEED есть подсчет операций рег-рег и рег-пам, где данные там отличаются. Значит ОЗУ при рег-рег не участвует.
Так?

Vslav
03.09.2017, 15:10
Значит ОЗУ при рег-рег не участвует.
Так?
ОЗУ или другая память участвует всегда. Процессору надо прочитать из памяти слово кода инструкции для исполнения. Даже если рег-рег исполняется ядром на один такт, но интерфейс обмена читает слово минимум за три такта - то получаем минимальное время исполнения инструкции в три такта.

svinka
03.09.2017, 15:44
Цитата Сообщение от Vslav Посмотреть сообщение
Можно попробовать 74HCT273
Советских аналогов не было?

КР1594ИР22 - аналог импортного 74АСТ373 что еще лучше чем 74НСТ373

74HCT273 опечатка?? это ИР27

Vslav
03.09.2017, 15:48
74HCT273 опечатка?? это ИР27
Да, опечатка. 74HCT373 должно быть.

MiX
03.09.2017, 19:18
74HCT273 опечатка?? это ИР27
Может ИР35? :)

svinka
03.09.2017, 20:33
Может ИР35?
точно! '273 это 'ИР35

AFZ
04.09.2017, 05:33
А, кстати, можно ведь вместо выпаянной 531ИР22 запаять простую китайскую панельку. Не ту, которые в народе зовут "цанговыми", хотя на самом деле они гиперболоидные, а обычную, с контактами из ленточки. Даже 24-ножка свободно садится невзирая на разбег 2.50/2.54, а 20-ножка сядет и не заметит. И микросхема в нее садится, не замечая этого же разбега. А после этого толкай туда свободно на пробу что угодно - хоть 1533, хоть 74ACT, хоть черта в ступе!..

svinka
04.09.2017, 05:54
А, кстати, можно ведь вместо выпаянной 531ИР22 запаять простую китайскую панельку

Конечно да!
Кто мешает тебе запаять панельку китайскую...

Vslav
04.09.2017, 22:05
А такой вопрос, что надо по минимуму реализовать в FPGA-реплике 1201.01?
Понятно что необходимы:
- собственно процессор 1801ВМ1 (полученная модель, не реал)
- память ОЗУ, ПЗУ
- ремаппинг памяти для пультового режима
- 035/065

А дальше? ГМД-70 и ИРПР в каком-то виде должны присутствовать? ПЗУ без них стартанет?

A074MO
05.09.2017, 00:17
У меня сейчас задача - запустить пультовое ПЗУ.


Понятно что необходимы:
-два COM порта
-контроллер SD card с перспективой запуска RT-11
-предусмотреть возможность подключения внешнего чипа SRAM(IS61LV25616AL-10TL)
-модуль сопряжения с QBUS (специально для ММ)

даже самого маленького Циклона хватит для второго процессора
-VT52 ( VGA + PS2)

Patron
05.09.2017, 02:06
А дальше? ГМД-70 и ИРПР в каком-то виде должны присутствовать? ПЗУ без них стартанет?Ответ легко узнать при помощи эмулятора ДВК. Взять любой конфиг, у которого название начинается с "ДВК-1" ( например: ДВК-1_DX.cfg ) и начать отключать в конфиге устройства от шины:


[links]

bus & CPU | CpuBoard | DX | TerminalPort | PrinterPort


- - - Добавлено - - -

У меня запустилось в таком варианте:


bus & CPU | CpuBoard | TerminalPort

Vslav
05.09.2017, 12:29
У меня запустилось в таком варианте:


bus & CPU | CpuBoard | TerminalPort
Это хорошо, а то на ВП1-033 и ВП1-034 меня уже не хватит. 095 и 096 еще сделаю, и на этом с 1801ВП1 собираюсь завязать :)

Titus
05.09.2017, 13:10
И еще ВМ2 хорошо бы доделать)

MM
05.09.2017, 15:13
а то на ВП1-033
033 - базовый контроллер портов. Без него 1801-я серия будет Очень неполная...
В частности, порт принтера на МС1201.01...МС1201.04 управляется именно ей.

AFZ
05.09.2017, 16:44
033 - базовый контроллер портов. Без него 1801-я серия будет Очень неполная... Как сказать... С одной стороны, порты ИРПР сочиняются на счет "раз", просто по спецификации. С другой стороны, в 033-й, кроме портов ИРПР, присутствуют еще и контроллер 16-разрядного интерфейса "туда-сюда" (плата И2 от Э-60?), и интерфейс связи с ГМД7012. Оно нам надо?

Vslav
05.09.2017, 19:09
В частности, порт принтера на МС1201.01...МС1201.04 управляется именно ей.

Никто ничего подключать по ГМД-70 и ИРПР к FPGA реплике точно не будет. На крайний случай можно эмуляцию портов, только внутреннюю часть, сделать.
PS. Ну на самый-самый крайний случай могу фотографии 033 и 034 сделать для желающих. Но сам реверсить не буду точно. Есть более интересные 1811, 1831, 1839 серии.

bigral
05.09.2017, 20:30
Тут вопрос на сколько этот ГМД-70 по протоколу совместим с реальным DEC RX02 (RX01?)? Это интересно потому что на западе народ понаделал эмуляторов этого самого RX02, и в принципе неплохо было бы поиспользовать эти эмуляторы.

svinka
05.09.2017, 22:22
Тут вопрос на сколько этот ГМД-70 по протоколу совместим с реальным DEC RX02 (RX01?)

ВП1-033 "cовместим" с RX01. Драйвер DX

Vslav
05.09.2017, 23:52
А про 095 и 096 только на схеме и в документации на MY можно посмотреть?

MM
06.09.2017, 00:04
А про 095 и 096 только на схеме и в документации на MY можно посмотреть?
К сожалению, да.
Я как-то пару лет назад написал в Зеленоград нашему идейнму боссу ( времен 1980-х ) по части М-ЭВМ, с просьбой поделиться наработкам ( архивом ТО прошивок БМК 1801 и 1806-й, на худой конец - полным перечнем назначений. Так господин стал в переписке "кривить жопой", а в частных беседах с бывшими коллегами заявлял, что "Иванов из П-Посада пытается его посадить за "разглашение"".

MiX
06.09.2017, 00:05
А про 095 и 096 только на схеме и в документации на MY можно посмотреть?
Ещё в книге. (http://ideafix.name/wp-content/uploads/stuff/book99.pdf)

AFZ
06.09.2017, 04:17
А про 095 и 096 только на схеме и в документации на MY можно посмотреть? Я, помнится, кое-что понял про эти ВП-шки, разбирая дизасм 093-й прошивки. Но увы, тогда (в 90-е) эти знания применения не нашли, а сейчас никаких подробностей не осталось.

A074MO
07.09.2017, 20:35
http://savepic.net/9858840m.png (http://savepic.net/9858840.htm)

Пульт заработал. Прошивка "000".

Patron
07.09.2017, 21:31
Пульт заработал. Прошивка "000".В оригинале у пульта платы МС1201.00 есть контроллер с адресом SEL1 == 0177716, подключающий/отключающий ПЗУ пульта вместо шины МПИ по следующему алгоритму:

Во всех режимах по адресам: 0177600..0177677 - видно ОЗУ, по адресам: 0173000..0173777 - видно ПЗУ 000 по смещению 013000..013777.

Если SEL1_BIT_3 == 0 и SEL1_BIT_2 == 0 - по всем остальным адресам видна обычная шина МПИ.
Если SEL1_BIT_3 == 1 - при любом значении SEL1_BIT_2 - по адресам 0160000..0172777 - видно начало ПЗУ 000 по смещению 000000..012777.
Если SEL1_BIT_3 == 0 и SEL1_BIT_2 == 1 - по адресам 0160000..0163777 - видно начало ПЗУ 000 по смещению 000000..003777.

При включении питания: SEL1_BIT_3 = 0 ; SEL1_BIT_2 = 1.

...

Если на шину МПИ повесить ОЗУ по адресам 0160000..0167777 - ПЗУ 000 без проблем загружает RT-11 в эти адреса и обеспечивает нормальное взаимодействие пультового отладчика с адресами в этом диапазоне.

A074MO
07.09.2017, 23:16
Patron, спасибо за комментарий. У меня перед глазами такая табличка

http://savepic.net/9850668.png

Регистр SEL1[3:2] еще не прикрутил. Думаю как приживить IS61LV25616AL-10TL.
Сейчас методом тыка искал кнопки пульта.
Подскажите какие стандартные адрес/вектор для второго COM порта.


Если на шину МПИ повесить ОЗУ по адресам 0160000..0167777 - ПЗУ 000 без проблем загружает RT-11 в эти адреса и обеспечивает нормальное взаимодействие пультового отладчика с адресами в этом диапазоне.

С RT-11 мне помощь клуба очень понадобится.

Patron
08.09.2017, 00:17
Подскажите какие стандартные адрес/вектор для второго COM порта.176560/360

- - - Добавлено - - -


С RT-11 мне помощь клуба очень понадобится.Есть такие темы:

RT-11 для чайников (http://zx-pk.ru/threads/24844-rt-11-dlya-chajnikov.html)

RT-11 Шаг за шагом (книга) Архангельский А.Г. (pdf) (http://zx-pk.ru/threads/27218-rt-11-shag-za-shagom-(kniga)-arkhangelskij-a-g-(pdf).html)

A074MO
10.09.2017, 23:16
Добавил памяти и RT11 загрузилась. Patron, не сочтите за труд, посмотрите лог.
Субъективно обращение к "диску" очень медленно.
Почему у COM порта нет вектора.
Если добавлю второй COM - можно разделить "терминал" и "диск".

Ресурсы FPGA
http://savepic.net/9890417.png

Patron
10.09.2017, 23:40
Субъективно обращение к "диску" очень медленно.Зависит от скорости порта. На скорости 9600 каждые 1024 байта передаются секунду, на скорости 57600 загрузка идёт в 6 раз быстрее, а на скорости 115200 система должна грузиться быстрее, чем с дисковода.

A074MO
10.09.2017, 23:47
а на скорости 115200 система должна грузиться быстрее, чем с дисковода.

У меня были RK11/RK05, по сравнению с ними медленно. Как работает с гибкими дисками я никогда не видел.

Patron
11.09.2017, 00:08
Для более быстрой работы системы - можно реализовать элементарно простой контроллер HD первой версии (http://zx-pk.ru/threads/17277-pomogite-najti-osnovnoj-test-kommand-elektroniki-60.html?p=436263&viewfull=1#post436263). Если на борту есть флеш - минимальный системный диск RT-11 можно организовать прямо там.

- - - Добавлено - - -


У меня были RK11/RK05, по сравнению с ними медленно.Замерил на скорости 57600. Загрузка RT-11 занимает ~ 10 секунд. Загрузка той же системы с RK05 занимает ~ 5 секунд. Получается, что на скорости 115200 работа по HX должна идти со скоростью RK05.

A074MO
11.09.2017, 00:13
Команда DIR исполняется 30 сек


==================== Протокол начат: 11/09/2017 00:09:28 =====================

.DIR
10-Sep-2017
RT11SJ.SYS 78 16-Dec-2012 SWAP .SYS 30 25-Mar-2003
HX .SYS 6 16-Mar-2016 TT .SYS 2 23-Jan-1980
SL .SYS 10 28-Dec-1987 EM .SYS 4 04-Mar-2012
LD .SYS 8 18-Jan-1988 DIR .SAV 19 04-Jul-2002
PIP .SAV 30 31-Oct-1998 DUMP .SAV 9 27-Dec-1983
DUP .SAV 45 27-Dec-1983 UCL .SAV 16 18-Jan-1988
UCL .DAT 9 04-Dec-2011 HAND .SAV 8 08-Nov-2011
HANDLE.SAV 17 06-Sep-1991 EDIK .SAV 22 19-Mar-2003
DAY .SAV 4 13-Apr-2013 DESS .SAV 20 04-Nov-1993
SPEED .SAV 3 28-Nov-1992 MEMORY.SAV 2 03-Sep-1982
KLOP .SAV 13 21-Nov-1988 IND .SAV 58 18-Jan-1988
BINCOM.SAV 24 18-Jan-1988 RESORC.SAV 25 01-Mar-2012
STARTS.COM 1 22-Dec-2012 DHRY .SAV 25 08-Feb-2015
26 Files, 488 Blocks
1098 Free blocks

.
================== Протокол остановлен: 11/09/2017 00:10:00 ==================

Patron
11.09.2017, 00:17
По HX на скорости 57600:


==================== Протокол начат: 11/09/2017 00:16:11 =====================

.DIR
11-Sep-2017
RT11SJ.SYS 78 16-Dec-2012 SWAP .SYS 30 25-Mar-2003
HX .SYS 6 16-Mar-2016 TT .SYS 2 23-Jan-1980
SL .SYS 10 28-Dec-1987 EM .SYS 4 04-Mar-2012
LD .SYS 8 18-Jan-1988 DIR .SAV 19 04-Jul-2002
PIP .SAV 30 31-Oct-1998 DUMP .SAV 9 27-Dec-1983
DUP .SAV 45 27-Dec-1983 UCL .SAV 16 18-Jan-1988
UCL .DAT 9 04-Dec-2011 HAND .SAV 8 08-Nov-2011
HANDLE.SAV 17 06-Sep-1991 EDIK .SAV 22 19-Mar-2003
DAY .SAV 4 13-Apr-2013 DESS .SAV 20 04-Nov-1993
SPEED .SAV 3 28-Nov-1992 MEMORY.SAV 2 03-Sep-1982
KLOP .SAV 13 21-Nov-1988 IND .SAV 58 18-Jan-1988
BINCOM.SAV 24 18-Jan-1988 RESORC.SAV 25 01-Mar-2012
STARTS.COM 1 22-Dec-2012 DHRY .SAV 25 08-Feb-2015
26 Files, 488 Blocks
1098 Free blocks

.
================== Эмуляция прекращена: 11/09/2017 00:16:15 ==================

A074MO
11.09.2017, 00:29
На другом компе на порядок быстрее, я еще замешкался

==================== Протокол начат: 11/09/2017 00:22:45 =====================

.DIR
11-Sep-2017
RT11SJ.SYS 78 16-Dec-2012 SWAP .SYS 30 25-Mar-2003
HX .SYS 6 16-Mar-2016 TT .SYS 2 23-Jan-1980
SL .SYS 10 28-Dec-1987 EM .SYS 4 04-Mar-2012
LD .SYS 8 18-Jan-1988 DIR .SAV 19 04-Jul-2002
PIP .SAV 30 31-Oct-1998 DUMP .SAV 9 27-Dec-1983
DUP .SAV 45 27-Dec-1983 UCL .SAV 16 18-Jan-1988
UCL .DAT 9 04-Dec-2011 HAND .SAV 8 08-Nov-2011
HANDLE.SAV 17 06-Sep-1991 EDIK .SAV 22 19-Mar-2003
DAY .SAV 4 13-Apr-2013 DESS .SAV 20 04-Nov-1993
SPEED .SAV 3 28-Nov-1992 MEMORY.SAV 2 03-Sep-1982
KLOP .SAV 13 21-Nov-1988 IND .SAV 58 18-Jan-1988
BINCOM.SAV 24 18-Jan-1988 RESORC.SAV 25 01-Mar-2012
STARTS.COM 1 22-Dec-2012 DHRY .SAV 25 08-Feb-2015
26 Files, 488 Blocks
1098 Free blocks

.
================== Протокол остановлен: 11/09/2017 00:22:50 ==================

Patron
11.09.2017, 00:51
Тонкость в том, что когда порт системного терминала работает на большой скорости - динамичные игры текстового режима могут потерять играбельность. В такой ситуации возможна модификация эмулятора последовательного порта: "SMART_SPEED_SUPPORT". В режиме SMART_SPEED эмулятор порта анализирует передаваемые байты на присутствие кодов прямого позиционирования курсора. При обнаружении "игрового контента" порт вводит задержку между отправкой байтов и тем самым снижает скорость их передачи до оптимального для игр значения 860 CPS, а при отсутствии "игрового контента" более 500 мс - обнуляет задержку и восстанавливает максимальную скорость.

Vslav
11.09.2017, 10:03
Зависит от скорости порта. На скорости 9600 каждые 1024 байта передаются секунду, на скорости 57600 загрузка идёт в 6 раз быстрее, а на скорости 115200 система должна грузиться быстрее, чем с дисковода.
Мне кажется там хендшейк со стороны PC нормально не срабатывает. Не отрабатывают все эти переходнички USB-UART (да и "честная" 16С550 с включенным FIFO тоже) нормально CTS/RTS. Поэтому при приеме на PDP системе часть символов теряется, происходят повторные запросы. На реальной МС1201.03 на скорости 19200 оно грузится быстрее чем на 57600. На ПЛИС конечно ВМ1 может работать на 100МГц, но непонятно что автор реализовал.

A074MO
11.09.2017, 12:20
непонятно что автор реализовал. Проект полностью Ваш.
В Вашем проекте есть заготовка модуля памяти 8К, я вывел ее из "латентного" состояния и поместил
с адреса 160000. Затем загрузил прошивку пульта, RT11 отказалась грузиться с сообщением "мало памяти". Затем продублировал модуль памяти 16К. Добавил регистр SEL1[3:2], но он ничем не управляет.
Бит 2 ведет себя как обычный бит ячейки памяти. Wishbone мультиплексер вывел в отдельный модуль.
Вот все изменения.

MM
12.09.2017, 14:05
Не отрабатывают все эти переходнички USB-UART (да и "честная" 16С550 с включенным FIFO тоже) нормально CTS/RTS.
На ИБМ ЭВМ управление битами готовности приёмника/передатчика - программное, от сюда всё дерьмо и проистекает.
DECовский выход из ситуации - коммутирование потока данных отдельными командами Он/Офф, не требующими отдельных проволок готовности. Не работает с ФИФО.
( Проверял на DEC - машинках в соединении с Пеньками. )

Vslav
12.09.2017, 14:55
На ИБМ ЭВМ управление битами готовности приёмника/передатчика - программное, от сюда всё дерьмо и проистекает.

А я сейчас рисую нормальный переходник USB-UART на stm32f103. Будет иметь оптроны и гарантировано работать с платами MC1201.xx.

svinka
12.09.2017, 18:35
Вопрос про быстродействие н1806ВМ2, При тактовой (на вход CLK) 5МГц быстродействие такое же как у 1801ВМ2 при тактовой (на вход CLK) 10Мгц???

MM
13.09.2017, 14:48
Вопрос про быстродействие н1806ВМ2, При тактовой (на вход CLK) 5МГц быстродействие такое же как у 1801ВМ2 при тактовой (на вход CLK) 10Мгц???
Если у 1806ВМ2 остекать AR до окончания текущего цикла обмена - то да.
Если не отсекать, использовать подключение как у 1801ВМ2А - 10 мгц = 5.5 мгц 1806ВМ2. Практически надо измерять.
Для 0 тактов ОЗУ.

Vslav
15.09.2017, 16:34
А не подскажете где подробнее про обмен с MY со стороны программы можно посмотреть? У меня проблема обнаружилась - в 095 не сбрасывается бит TR при чтении регистра данных. Сбрасывается или прямой записью нуля со стороны ПП в это бит РК, или записью РД со стороны ЦП. Это так задумано, или мне надо искать где-то ошибку. И вообще там дивно сделано, старший байт РД используется как расширитель адреса при ПДП на системной шине со стороны ПП.

Patron
15.09.2017, 17:21
не сбрасывается бит TR при чтении регистра данныхНи одна команда не требует чтения регистра данных перед началом выполнения, поэтому этот бит обозначает требование записи параметра команды в регистр данных.


http://pic.pdp-11.ru/images/my0.jpg


Подозреваю, что единственная команда, не требующая записи параметра ( "чтение кода состояния" RDERR, двоичный код команды 1001 = 9 ) - не устанавливает бит TR после получения контроллером кода команды.

Vslav
15.09.2017, 17:38
А откуда эта картинка?
Ну ясно, значит документация на 507.03 ошибочно утверждает что TR сбрасывается при чтении регистра данных.

Alex_K
15.09.2017, 17:39
А не подскажете где подробнее про обмен с MY со стороны программы можно посмотреть? У меня проблема обнаружилась - в 095 не сбрасывается бит TR при чтении регистра данных. Сбрасывается или прямой записью нуля со стороны ПП в это бит РК, или записью РД со стороны ЦП. Это так задумано, или мне надо искать где-то ошибку. И вообще там дивно сделано, старший байт РД используется как расширитель адреса при ПДП на системной шине со стороны ПП.
Да собственно так и задумано. Уже есть дизассемблированные версии прошивок КМД у hobot-а в хламничке - http://archive.pdp-11.org.ru/ukdwk_archive/dwkwebcomplekt/KMD_DVK/.
Так что там можно всё посмотреть.
Я тоже когда-то был в сомнении относительно загрузки с КМД на МС1201.02, когда пишут команду 17 в регистры. Если бы по документации TR сбрасывался бы при чтении РД, то и загрузиться было бы невозможно, т.к. в пульте при переходе на 172142 он же сначала читается.

Patron
15.09.2017, 18:16
А откуда эта картинка?Описание КМД (http://mirrors.pdp-11.ru/_pdp-11/grands.land.ru/docs/kmd.djvu) лист 24.

MM
21.09.2017, 02:21
Вопрос к уважаемому Вславу :
1801ВП1-030 в МС1201.01 примерно сколько тактов 1801ВМ1 "задерживает" ?
( Т.е. от момента формировавания ВМ1 сигнала DIN до момента выставки RPLY ВП1-030, без учета регенерации ( "идеальное чтение" ) ).

Vslav
21.09.2017, 09:23
Результаты моделирования такие (циклы 1801ВМ1 моделируются по результатам реверса - ждет два такта активного RPLY, выставляет сигналы с привязкой к CLK):

http://s019.radikal.ru/i619/1709/01/b23baf83e16et.jpg (http://s019.radikal.ru/i619/1709/01/b23baf83e16e.png)

Еще я попытался уплотнить интервалы между циклами чтения - сделал их минимальными, и стало наглядно, что 030-ая не в состоянии выполнять обращения к ОЗУ чаще чем 1/8 от тактовой частоты - у нее просто автомат состояний так построен. На картинке показаны как раз два цикла - первый при завершенном цикле ОЗУ (с паузой между SYNC) и второй цикл быстрый, начинающийся при еще не снятом CAS. Видно что 030 выдает nRPLY с задержкой на такт, именно из-за того что не может начать цикл ОЗУ немедленно.

http://s018.radikal.ru/i523/1709/e5/35f642653ae5t.jpg (http://s018.radikal.ru/i523/1709/e5/35f642653ae5.png)

Patron
21.09.2017, 12:41
я туда png по 25КБ загрузил и выбрал ссылки "на графический файл", но в пределах сессии radikal все опошлил в jpg и своей рекламой.Можно попробовать сервис: pic.pdp-11.ru (http://pic.pdp-11.ru/) - он гораздо дружественнее.

AFZ
21.09.2017, 16:32
1801ВП1-030 в МС1201.01 примерно сколько тактов 1801ВМ1 "задерживает" ? Кстати, в далекие 90-е я клепал какую-то ерунду на ДВК-1 с размещением моей программы в ПЗУ-шках, две РФ2 или РФ5, не помню уже, зато хорошо помню, как меня неприятно удивило тормозное чтение из основной памяти ДВК. Полуотлаженная программа была в ПЗУ, а новые разрабатываемые кусочки подгружались в ОЗУ, где я с ними экспериментировал. Так вот, осциллоскоп показал очень неприглядную картинку - моя ПЗУха сразу отвечала СИПом и цикл обмена был вполне обычным, а вот цикл обмена с ОЗУ был чуть ли не вчетверо длиннее. Втрое точно, а то и с лишним...

Patron
21.09.2017, 18:50
осциллоскоп показал очень неприглядную картинку - моя ПЗУха сразу отвечала СИПом и цикл обмена был вполне обычным, а вот цикл обмена с ОЗУ был чуть ли не вчетверо длиннееЗДЕСЬ (http://zx-pk.ru/threads/14702-raschjot-tochnogo-vremeni-vypolneniya-komand-razlichnymi-protsessorami-arkhitektury-pdp-11.html?p=547835&viewfull=1#post547835) выложены осциллограммы обращения 1801ВМ1 к ОЗУ и ПЗУ, снятые на реальной плате МС1201, работавшей на частоте 5.3 МГц. Там сигнал RPLY от ROM приходит через 2 такта после выставления DIN, а RPLY от ОЗУ приходит через 6 тактов.

Vslav
21.09.2017, 20:03
от ОЗУ приходит через 6 тактов.
На картинках очевидно показан RPLY на ножке самого процессора, задержанный триггером ТМ2 на системной плате, один такт задержки внесен триггером. На осциллограмме "RAM" странно выглядит и снятие RPLY после снятия DIN. Сама ВП1-030 деактивирует RPLY мгновенно - в течение 30-50 нс после снятия DIN.

Еще неясно от чего ВП1-030 тактировалась (это зависит от перемычек S16), от удвоенной частоты процессора? Тогда вообще печалька - на картинке явно процессорная частота, 030-ая тормозит совсем уж странно. А если от 4608 кГц, то привязывать 030 к тактам процессора на картинке не совсем корректно. Тогда вышеприведенный анализ RPLY тоже недостоверный.

Надо будет свою 1201.01 запустить, тоже интересно посмотреть, в том числе сигналы на DRAM, тогда появится привязка к циклограмме 030-ой.

Patron
21.09.2017, 20:53
На картинках очевидно показан RPLY на ножке самого процессора, задержанный триггером ТМ2 на системной плате, один такт задержки внесен триггером.Да - все осциллограммы прямо с ножек процессора. Описание тестов и ссылки на исходники логов осциллографа здесь: Тонкости и толстости ВМ1 (http://bk0010.org/forum/?id=3799&old) - сообщения с датой, начиная с 12.03.2012.

Vslav
21.09.2017, 21:29
Ну понятно, в-общем, надо снимать диаграммы с живой 030-ой, потому что такты процессора - то такое, влияет только на процессор :)

Кстати, хорошо видно как ВМ1 снимает DIN после второго такта активного RPLY. Как SYNC и DIN привязаны к разным фронтам CLC.

Update: с поздним снятием RPLY 30-кой все понятно - на нее DIN, DOUT, WTBT, SYNC задержанные поступают - есть цепи задержки на плате МС1201.01. То есть, на диаграммах нарисован DIN на процессоре, а на 30-ой оно все задержано.

Mixa64
08.10.2017, 23:14
Вот есть вопрос про снятие RPLY и снятие SYNC. В описании цикла чтения в 1801vm1-08.pdf написано, что детектирование неактивного nRPLY происходит по срезу тактового сигнала. Но в реальности, более похоже на то, что детектирование, по крайней мере фиксация первого события, по которому запрещается nDIN, происходит не по срезу, а по факту низкого уровня тактового сигнала в сочетании с чем-то еще. Привожу две картинки, на обеих окончание RPLY расположено между одними и теми же срезами тактового сигнала, но снятие SYNC происходит по разным срезам. Каналы:
1 SYNC
2 DIN
3 RPLY (настоящий RPLY на ноге процессора через последовательный резистор в 1.5 к от этого, с более пологими фронтами, и от этого даже задержан на 20-25 нс)
4 CLK

Вопрос, как там обстоят дела на самом деле?

62469
62468

Vslav
09.10.2017, 00:13
Давайте откроем схему процессора и посмотрим как работает выход nSYNC. Я советую взять бесплатный официальный просмотровщик схем PCAD 200x, там легко можно иcкать компоненты и цепи по названию или позиционному обозначению.

- схема самого вывода на страничке "External Pins", блок с выходными транзисторами T329/T344. управляется двумя внутренними сигналами SYNC_OUT (активный уровень высокий) и nSYNC_ENA (разрешение выхода, активный уровень низкий)
- на страничке "Glue Logic" видно что nSYNC_ENA формируется T16467 и представляет собой инвертированный SYNC_OUT, синхронизированный со срезом CLK. По такой схеме выход nSYNC запрещается по срезу CLK на следующий такт после выдачи высокого уровня на ножке, поэтому для понимания достаточно рассмотреть только цепь SYNC_OUT - нам важен именно момент перехода этого сигнала в низкий уровень - по нему будет сформирован выходной фронт деактивации nSYNC
- SYNC_OUT формируется на той же страничке, T16456. Это инвертированный nQBUS_WIN, синхронизированный тоже по срезу CLK
- nQBUS_WIN формируется RS-триггером на T16473/T16474/T16493/T16494. Нас интересует момент его сброса, осуществляемого высоким уровнем сигнала OE_CLR
- за OE_CLR отвечает логика с выходами на T16256/T16257. Сигнал активен при MJ_RES - этот сигнал у нас появится при истечении тайм-аута шины, также цикл шины закончится при высоком nQBUS_FLAG (этот сигнал уже высокий точно - потому что уже снят nDIN) и высоком QBUS_ACK - вот тут наш интерес
- QBUS_ACK формируется элементом И-НЕ на T16065/T16078/T16079, на входы которого поступает RPLY -
один вход просто защелка по низкому уровню CLK, а второй - синхронизированный выход этой защелки по срезу CLK. Таким образом QBUS_ACK активируется по срезу CLK, если nRPLY был уже неактивен при низком уровне предыдущего такта.

Итого - в описании есть неточность или недосказанность. Деактивация nSYNC происходит по срезу CLK, тут все верно, но детектирование неактивного RPLY происходит по последнему срезу CLK и низкому уровню CLK в предыдущем такте. То есть, комбинации latch и flip-flop. Чтобы процессор определили деактивацию nRPLY, это сигнал должен быть неактивен при срезе CLK, а также при низком уровне CLK в предыдущем такте (можно сказать при предыдущем фронте CLK). Приведенные картинки это подтверждают - снятие SYNC происходит при обнаружении неактивного nRPLY на паре фронт/срез CLK.

Спасибо за замечание, внесу в текст изменения и дополнения. Хорошо что диаграммы правильные (я их рисовал с модели и реального процессора, сравнивал между собой).

Mixa64
09.10.2017, 02:08
Спасибо!
Кстати, RPLY на диаграммах - это ответ от ВП1-030. Пропущенный через D-триггер, тактируемый удвоенной тактовой частотой, фронты тактирования расположены посередине полупериодов тактовой процессора.
Реальный RPLY от нее приходит там, где вертикальная ось координатной сетки прям посередине DIN находится. Снимается же там, где снимается задержанный RPLY, попадает на фронт тактовой D-триггера, отсюда и дрожания заднего фронта задержанного.
На длинной цепочке ADD R0,R0 команда за 10 тактов выполняется. Не такая уж и тормозная ВП1-030 сама по себе.

Vslav
15.11.2017, 16:17
Немножко новостей, чтобы тема не закисала :)

- на ибее куплен и приехал совершенно шикарный моторизованный столик (https://www.ebay.com/itm/282701592926?ul_noapp=true) под микроскоп. Кстати, самый легкий из попадавшихся, весит "всего" 2.4 кг, как бы он мне рельсы на микроскопе на обломал (родной стол весит 800г). Контроллера к нему нет, на ибее валяются по $500, что как бы перебор :)

- на алиэкспресс прикуплен игрушечный CNC - самый убогий типа 1610 (https://ru.aliexpress.com/store/product/2015-New-GRBL-3-Axis-Pcb-Milling-cnc-Machine-1610-Diy-Wood-Carving-Mini-Engraving-Pvc/1941516_32553569537.html). Это - для контролируемого шлифования, куплены разные фетры, пару тонких паст, в том числе алмазная 0.25/0.0 (производитель уверяет что частицы там 250нм), смола для заливки образцов, всякие fixture и прочее. Буду экспериментировать с тонкой шлифовкой. Если успешно научусь, то откроется путь к реверсу многослойных микросхем, типа J11 или нашей серии 1839.

- едет хороший никоновский объектив 40х, с учетом автоматизации стола можно будет снимать все более мелкие технлогии

- под стол и CNC разрабатываю свой контроллер на stm32f207 с блэкджеком и продажными женщинами эзернетом, USB и нормальными шаговыми драйверами (цифровая регулировка тока, режим удержания, настраиваемые таблицы акселерации и прочее), с управлением и конфигурацией через браузер в том числе. Изучаю JS (никогда не работал), возможно буду задавать вопросы по JS/AJAX (Web сервер не нужен, написан свой). Если кто сможет консультировать - было бы здорово.

В-общем, потихоньку процессы идут.

PS. Да, про ВМ2 помню, даже отлаживать начал потихоньку :)

Hunta
15.11.2017, 21:04
Если кто сможет консультировать - было бы здорово
Чем смогу - помогу :)

Patron
16.11.2017, 00:23
так и не смог разобраться (http://bk0010.org/forum/?id=28818), как выцепить только проц из эмулятора ДВКЕсли посмотреть на файлы MPI_VM1_V.h и MPI_VM1_V.cpp - это обёртка для вызова "родной" Verilog-модели ( каталог MPI_module\vm1cpu\ ), взятой из файла VM1CPPr006.rar (http://zx-pk.ru/threads/23978-tsifrovaya-arkheologiya-1801-i-vse-vse-vse.html?p=846960&viewfull=1#post846960)

Всем хороша Verilog-модель, но слишком она медленная, поэтому в файлах MPI_1801VM1.h (http://zx-pk.ru/threads/25252-adapter-shiny-mpi-dlya-emulyatora-dvk-1.html?p=809912&viewfull=1#post809912) и MPI_1801VM1.cpp (http://zx-pk.ru/threads/25252-adapter-shiny-mpi-dlya-emulyatora-dvk-1.html?p=809912&viewfull=1#post809912) находится потактово эквивалентная абстрактная модель с таким же интерфейсом, но в 100 раз более быстрая.

Если вспомнить, как работает модель из файла VM1CPPr006.rar, то легко понять и как работает вызывающая эту модель обёртка.

Но абстрактная модель имеет точно такой же интерфейс, как обёртка для Verilog-модели, поэтому там вообще ничего "выцеплять" не надо - весь внешний интерфейс состоит в обоих случаях из двух строк:


VM1_bus_type *pVM1_bus;
virtual void Clock();

pVM1_bus указывает на массив bool состояний линий шины, а функция Clock() вызывается для эмуляции фронтов тактового сигнала:



void MPI_VM1_V::Clock()
{
getPins();

if( !pVM1_bus->CLC ) core.eval_n( nClk ); //отработаем передний фронт ТЧ
else core.eval_p( nClk ); //отработаем задний фронт ТЧ

nClk++;

setPins();
}

AlexG
16.11.2017, 00:26
мож это и баян и банальность - я не в теме.
однако для cnc
https://github.com/grbl/grbl

Vslav
16.11.2017, 00:47
Всем хороша Verilog-модель, но слишком она медленная
Я вот что подумал - может быть стоит взглянуть на CUDA или OpenCL? Видеокарты то почти у всех есть :)
Сам я пока краешком посмотрел OpenCL - мне для анализа микрокода надо 2G вариантов перебирать и анализировать. i4770 думает на одном потоке минут 15. Можно разбить на 8, но анализ еще хочется усложнить, поэтому и задумался над использованием GPU.

Patron
16.11.2017, 01:05
Я вот что подумал - может быть стоит взглянуть на CUDA или OpenCL?Мне такое не по силам. Можно сделать эмулятор микропрограммного автомата - он должен быть быстрее чистого верилога.

Если смотреть с принципиальной точки зрения - оптимальным решением является максимально быстрый чёрный ящик, все внешние состояния которого всегда потактово эквивалентны Verilog-модели. Созданная мной супер-быстрая абстрактная модель именно такая - она потактово эквивалентна для любой смеси команд и прерываний при любых значениях задержки RPLY ( больше месяца заняло тестирование всех вариантов сочетаний команд, прерываний и задержек ). Но там нет поддержки ДМА, нет эмуляции мега-глюка, нет эмуляции регистров многопроцессорной поддержки и т.п.

Vslav
16.11.2017, 01:35
она потактово эквивалентна
То есть, взяли свою быструю модель и медленную "честную" на базе Верилога, и прогнали сравнения по тактам, а где находили различия - патчили свою быструю модель чтобы появилось соответствие?

Patron
16.11.2017, 13:41
То есть, взяли свою быструю модель и медленную "честную" на базе Верилога, и прогнали сравнения по тактам, а где находили различия - патчили свою быструю модель чтобы появилось соответствие?Более того - для каждой команды с каждым типом адресации и каждой из задержек RPLY от 0 до 6 тактов запускались прерывания всех типов на каждом из тактов выполнения команды. Итоговая абстрактная A-модель потактово эквивалентна V-модели во всех этих случаях.

Если рассмотреть ситуацию в целом - A-модель реализует граф состояний входов и выходов V-модели при помощи машины состояний, осуществляющей переход от одного состояния ( вершины графа ) к другому - при помощи линейной последовательности команд процессора хоста. В момент достижения вершины графа состояние процессора хоста сохраняется, а при приходе следующего фронта эмулируемого тактового сигнала - состояние процессора хоста восстанавливается для текущей вершины графа и выполняется линейная последовательность команд процессора хоста, ведущая к следующей вершине.

Таком метод эмуляции конечного автомата V-модели очевидно является оптимальным ( что подтверждается значительно более высокой скоростью работы ), вопрос лишь в том, насколько тождественны графы состояний A- и V- моделей, поскольку единственным использовавшимся методом сравнения являлся перебор различных последовательных наборов состояний входных сигналов.

Vslav
16.11.2017, 15:03
для каждой команды
Для одной команды это недостаточно. Я почти уверен что времянка может зависеть на такт-другой от предыстории. Ну и, как я понял, фантомных циклов нет? Или получилось сэмулировать?

Patron
16.11.2017, 15:42
Для одной команды это недостаточно.Проверялись все варианты, какие можно вообразить - все наборы предыдущих и последующих команд и т.д и т.п. Количество затраченных на тестирование человеко-часов вероятно превысило продолжительность разработки первой версии ядра Linux.



Ну и, как я понял, фантомных циклов нет? Или получилось сэмулировать?Всё можно легко проверить. Комплект поставки "запускается из коробки" и позволяет получать осциллограммы состояния всех линий МПИ при выполнении любого кода на обеих моделях.

Пока каких-либо расхождений в поведении A- и V- моделей обнаружить не удалось ( кроме заранее известных, вроде отсутствия эмуляции мега-глюка в A-модели ).

Или можно просто заглянуть в исходник A-модели - все отклонения поведения процессора от стандартного там описаны на "нормальном человеческом C-языке" :


//

if( bVM1G ) { nALU_Delay += 3; }
else { nALU_Delay += 8; }

Make_ALU_Delay();

gid
17.11.2017, 11:22
ничего "выцеплять" не надо
К сожалению, для моих целей - надо. Мне нужны максимально упрощенные исходники, не зависящие от UtilsLib.lib
С уменьшенным наследованием от базовых классов, которые мне непонятно, что делают и для меня на начальном этапе избыточны.
Я в общем-то даже не пытался ни собрать исходники, ни редактировать в своих целях. Просто сидел и рассматривал их в редакторе, и приходил в уныние от количества наследования классов. Поскольку некоторых конструкторов базовых классов я так и не нашёл, то решил отложить всё это до лучших времён.
Как мне кажется, в файлах MPI_model.* реализовано именно то, что я долго и безуспешно пытался сделать сам, но так и не смог.
Я хотел взять MPI_Interface, MPI_DeviceClass, потому, что свои мне совершенно не нравятся, взять MPI_1801VM1, по аналогии с MPI_VE_Timer сделать модель ВП1-037 с массивом памяти, запустить всё это и посмотреть, подойдёт ли полученное как основа для эмулятора БК, и стоит ли прилагать усилия дальше. Это было как раз примерно год назад, потом стало не до того.

Patron
18.11.2017, 19:28
К сожалению, для моих целей - надо. Мне нужны максимально упрощенные исходники, не зависящие от UtilsLib.libСделал такой вариант: MPI_API_v1.1 (http://emulator.pdp-11.org.ru/DVK/MPI/distr/MPI_API_v1.1.zip)

Переделка заняла минут 10, всё остальное время ушло на добавление новых устройств для шины МПИ: SEL1, RAM, ROM, DL11, HD.



HD0 attached to [HDSYS.DSK]
MPI_API v1.0 2017

HD Boot-I-Cold boot..

HD (177720) disk driver v1.4 2015
SL V08.00 [SW] Сторожевых С.В. 1988
KZ V01.00 (C) ВЦ МИЭТ, НОЯБРЬ 1987

RT-11SB (Y) V05.07

.SET TT FORM

.SET TT SCOPE

.SET EDIT K52

.SPEED

ТЕСТ БЫСТРОДЕЙСТВИЯ

КОМАНДА СЛОЖЕНИЯ РЕГИСТР-РЕГИСТР
БЫСТРОДЕЙСТВИЕ (ТЫС.ОП./СЕК) 360

КОМАНДА СЛОЖЕНИЯ РЕГИСТР-ПАМЯТЬ
БЫСТРОДЕЙСТВИЕ (ТЫС.ОП./СЕК) 176

.



Как выяснилось, A-модель быстрее V-модели только в 5 раз, но зато как раз получается реальное быстродействие 1801ВМ1.

hobot
18.11.2017, 19:39
Сделал такой вариант: MPI_API_v1.0 (http://emulator.pdp-11.org.ru/DVK/MPI/distr/MPI_API_v1.0.zip)
а можно немного подробнее что это вообще такое? )
Я скачал и ничего не понимаю, папка с какимито исходниками (на СИ?) и образ системы для HD в корне архива?
Честно не понимаю что это и зачем? Возможно я пласт обсуждений какой-то пропустил в очередной раз?

Patron
18.11.2017, 20:18
.

Выложил релиз версии 1.1 с повышенным быстродействием:



HD0 attached to [HDSYS.DSK]
MPI_API v1.1 2017

HD Boot-I-Cold boot..

HD (177720) disk driver v1.4 2015
SL V08.00 [SW] Сторожевых С.В. 1988
KZ V01.00 (C) ВЦ МИЭТ, НОЯБРЬ 1987

RT-11SB (Y) V05.07

.SET TT FORM

.SET TT SCOPE

.SET EDIT K52

.SPEED

ТЕСТ БЫСТРОДЕЙСТВИЯ

КОМАНДА СЛОЖЕНИЯ РЕГИСТР-РЕГИСТР
БЫСТРОДЕЙСТВИЕ (ТЫС.ОП./СЕК) 376

КОМАНДА СЛОЖЕНИЯ РЕГИСТР-ПАМЯТЬ
БЫСТРОДЕЙСТВИЕ (ТЫС.ОП./СЕК) 184

.

- - - Добавлено - - -


а можно немного подробнее что это вообще такое?Это потактовый эмулятор всех сигналов шины МПИ с двумя эмуляторами процессора:

VM1_V - Потактовый эмулятор 1801ВМ1 на базе модели Verilog.

VM1_A - Потактовый эмулятор 1801ВМ1 на базе абстрактной модели.


Всё это нужно только тем, кто хочет сделать собственный потактово точный эмулятор БК-0010/БК-0011. Полная эмуляция каждого такта шины МПИ позволяет добиться абсолютно точных времянок при выполнении любых программ.

Если желания разработать свой собственный потактово точный эмулятор нет - об этом релизе даже думать не надо.

ilynxy
27.12.2017, 15:30
А подскажите пожалуйста про особенности выполнения инструкций которые прерываются по таймауту RPLY для ВМ2 (или ВМ1).
Вот есть инструкция
MOV (R0)+, (R1)+ Если @R0 нормально прокатывает по шине, а @R1 нет (вызывает таймаут). То какие значения регистров будут, когда начнётся выполнение прерывания? Увеличится ли R0 на два, прежде чем трапнет? Или увеличение регистров по автоинкременту происходит после успешных транзакций?
А уменьшение происходит до всех транзакций? То есть, если
MOV -(R0), -(R1) трапает на адресе (R0-2), на входе в прерывание R0 будет уже уменьшен? А R1?
В целом вопрос такой: если выполнение команды прерывается по RPLY, то все регистры остаются в исходном состоянии, как перед выполнением, или автоинкремент/автодекремент выполняется? И PC указывает на команду которая вызвала трап или на следующую? Предполагаю, что на входе в перывание все регистры будут ниходиться в исходном состоянии (как до выполнения инструкции), но хотелось бы авторитетного подтверждения этой догадке.

Patron
27.12.2017, 17:09
Предполагаю, что на входе в перывание все регистры будут ниходиться в исходном состоянии (как до выполнения инструкции)Это справедливо только для второго операнда, если зависание возникло при чтении первого операнда.

Автодекремент регистра операнда всегда выполняется в начале обращения к операнду, до выставления адреса на шину. У процессоров ВМ1 и ВМ2 - автоинкремент регистра операнда выполняется сразу после выставления адреса на шину, у ВМ3 - только после прихода RPLY. Так как первый и второй операнды последовательно обрабатываются одним и тем же блоком микрокода, при зависании чтения первого операнда - до обработки регистра второго операнда дело не доходит.

ilynxy
29.12.2017, 09:58
А вот ещё вопрос: если автодекремент выполняется до выставления адреса на шину, на это наверняка тратится цикл (я так понимаю для инкремента/декремента используется АЛУ)? То есть автодекремент должен быть на такт длиннее автоинкремента (автоинкремент выполняется параллельно с обменом по шине)?

Vslav
29.12.2017, 12:41
А вот ещё вопрос: если автодекремент выполняется до выставления адреса на шину, на это наверняка тратится цикл (я так понимаю для инкремента/декремента используется АЛУ)? То есть автодекремент должен быть на такт длиннее автоинкремента (автоинкремент выполняется параллельно с обменом по шине)?
ЕМНИП, дополнительный цикл не тратится. Цикл АЛУ состоит из двух тактов на самом деле, и строб записи в регистр адреса может вырабатываться до вычисления и после. Если операция с пост-инкрементом, то в регистр адреса записывается значение исходного регистра до его обновления. Если операция с пре-декрементом то регистр адреса получает уже обновленное значение адреса.

PS. Вечером попробую диаграммы с симулятора снять, станет понятнее.

A074MO
15.01.2018, 22:18
Фотоотчет о попытке подружить SRAM и FPGA.
Ver 1 чип IS61LV25616AL-10TL
http://img.radiokot.ru/files/124779/thumbnail/1hds34rl1o.jpg (http://img.radiokot.ru/files/124779/medium/1hds34rl1o.jpg)

Ver 2 чип CY7C1041DV33-15VI

http://img.radiokot.ru/files/124779/thumbnail/1hds35myay.jpg (http://img.radiokot.ru/files/124779/1hds35myay.jpg) http://img.radiokot.ru/files/124779/thumbnail/1hds33ttkv.jpg (http://img.radiokot.ru/files/124779/1hds33ttkv.jpg)

В первом случае чип не подавал признаков жизни.
Во втором случае чип запустился, но на очень низкой частоте ~ 10 MHz.
Код модуля WB - SRAM выложу позже(надо немного причесать).

- - - Добавлено - - -

Код модуля:

module sram_wb_16
(
input wb_clk_i,
input [15:0] wb_adr_i,
input [15:0] wb_dat_i,
output [15:0] wb_dat_o,
input wb_cyc_i,
input wb_we_i,
input [1:0] wb_sel_i,
input wb_stb_i,
output wb_ack_o,
//-----------------------------------
output [17:0] sram_adr,
output sram_nOE,
output sram_nWE,
output sram_nCS,
output sram_nUB,
output sram_nLB,
inout [15:0] sram_data

);
wire w_ena;
wire r_ena;
wire [1:0] ena;
reg [12:0] ack;
reg [15:0] d,r;
assign sram_nCS = 1'b0;
assign sram_nUB = 1'b0;
assign sram_nLB = 1'b0;
assign sram_adr[17:0] = {5'b00000 ,wb_adr_i[13:1]};
assign wb_dat_o = sram_data;
assign w_ena = (wb_we_i & wb_cyc_i & wb_stb_i);
assign r_ena = (~wb_we_i & wb_cyc_i & wb_stb_i);
assign sram_nOE = ~r_ena;
assign sram_data =(w_ena)? wb_dat_i: 16'hzzzz;
assign sram_nWE = ~w_ena;
assign ena = wb_we_i ? wb_sel_i : 2'b11;
assign wb_ack_o = wb_cyc_i & wb_stb_i & (ack[10] );//| wb_we_i);

always @ (posedge wb_clk_i)
begin
ack[0] <= wb_cyc_i & wb_stb_i;
ack[1] <= wb_cyc_i & ack[0];
ack[2] <= wb_cyc_i & ack[1];
ack[3] <= wb_cyc_i & ack[2];
ack[4] <= wb_cyc_i & ack[3];
ack[5] <= wb_cyc_i & ack[4];
ack[6] <= wb_cyc_i & ack[5];
ack[7] <= wb_cyc_i & ack[6];
ack[8] <= wb_cyc_i & ack[7];
ack[9] <= wb_cyc_i & ack[8];
ack[10] <= wb_cyc_i & ack[9];
ack[11] <= wb_cyc_i & ack[10];
ack[12] <= wb_cyc_i & ack[11];
end

endmodule


Может я допускаю какую-то "детскую" ошибку или платку развел неправильно (добавить антизвонные резисторы, терминаторы)

Vslav
16.01.2018, 01:06
Сходу так явной ошибки не видно.
Могу только посоветовать сделать сигналы nOE и nWE регистровыми. Шина WB синхронная, между клоками там может быть любая комбинация сигналов, это надо отсечь. "Звон" - дело такое, можно попробовать последовательные терминаторы Rs на выходах Циклона включить.

ilynxy
16.01.2018, 15:16
Могу только посоветовать сделать сигналы nOE и nWE регистровыми. Шина WB синхронная, между клоками там может быть любая комбинация сигналов, это надо отсечь.
Неплохо бы посмотреть на констрейны, чтобы соотношение времянок setup/hold не нарушалось. И да, нужно делать все входы/выходы регистровыми (деваться всё равно некуда, асинхронная память <-> синхронная шина красиво не решить), latency, конечно, будет один такт, но зато в констрейны влезть будет проще, а то комбинационная логика на концах трудна для отладки.

A074MO
16.01.2018, 22:59
добавил регистры, ситуация улучшилась

module sram_wb_reg
(
input wb_clk_i,
input [15:0] wb_adr_i,
input [15:0] wb_dat_i,
output reg [15:0] wb_dat_o,
input wb_cyc_i,
input wb_we_i,
input [1:0] wb_sel_i,
input wb_stb_i,
output wb_ack_o,
//-----------------------------------
output reg [17:0] sram_adr,
output reg sram_nOE,
output reg sram_nWE,
output reg sram_nCS,
output reg sram_nUB,
output reg sram_nLB,
inout [15:0] sram_data
);
wire w_ena;
wire r_ena;
wire [1:0] ena;
reg [12:0] ack;
reg [15:0] write_reg;

always @ (posedge wb_clk_i)
begin
sram_nOE <= ~r_ena;
sram_nCS <= 1'b0;
sram_nUB <= ~(ena[1]&(w_ena|r_ena));//1'b0;
sram_nLB <= ~(ena[0]&(w_ena|r_ena));//1'b0;
sram_nWE <= ~w_ena;
sram_adr[17:0] <= {3'b000 ,wb_adr_i[15:1]};
wb_dat_o <= sram_data;
write_reg <= wb_dat_i;
sram_nOE <= ~r_ena;
end

assign w_ena = (wb_we_i & wb_cyc_i & wb_stb_i);
assign r_ena = (~wb_we_i & wb_cyc_i & wb_stb_i);
assign sram_data =(w_ena)? write_reg: 16'hzzzz;
assign ena = wb_we_i ? wb_sel_i : 2'b11;
assign wb_ack_o = wb_cyc_i & wb_stb_i & (ack[3] );//| wb_we_i);

always @ (posedge wb_clk_i)
begin
ack[0] <= wb_cyc_i & wb_stb_i;
ack[1] <= wb_cyc_i & ack[0];
ack[2] <= wb_cyc_i & ack[1];
ack[3] <= wb_cyc_i & ack[2];
ack[4] <= wb_cyc_i & ack[3];
// ack[5] <= wb_cyc_i & ack[4];
// ack[6] <= wb_cyc_i & ack[5];
// ack[7] <= wb_cyc_i & ack[6];
// ack[8] <= wb_cyc_i & ack[7];
// ack[9] <= wb_cyc_i & ack[8];
// ack[10] <= wb_cyc_i & ack[9];
// ack[11] <= wb_cyc_i & ack[10];
// ack[12] <= wb_cyc_i & ack[11];
end

endmodule


Тест памяти

@
@T2
ТЕСТ 2
ПАМЯТЬ 020000 -137776
ПАМЯТЬ 000600 -017776

024164

SPEED виснет после цифр 5192

.SPEED

ТЕСТ БЫСТРОДЕЙСТВИЯ

КОМАНДА СЛОЖЕНИЯ РЕГИСТР-РЕГИСТР
БЫСТРОДЕЙСТВИЕ (ТЫС.ОП./СЕК) 10864

КОМАНДА СЛОЖЕНИЯ РЕГИСТР-ПАМЯТЬ
БЫСТРОДЕЙСТВИЕ (ТЫС.ОП./СЕК) 5192

Vslav
17.01.2018, 12:58
Адрес надо раньше чем OE/WR выставлять. И снимать адрес позже, после деактивации OE/WR. Конкретные tsu и th надо в даташите на микросхемы подсмотреть.

A074MO
17.01.2018, 22:41
Vslav, Спасибо, я понял направление. Вот если-бы еще примерчик простенький.

Vslav
18.01.2018, 10:33
Vslav, Спасибо, я понял направление. Вот если-бы еще примерчик простенький.
Еще разрешение выхода данных на такт запаздывает (от w_ena, а надо бы от sram_nWE).
Сходу простой примерчик wishbone <-> SRAM я не нашел в Сети. У меня есть DE1 с памятью SRAM на борту, если будет время, то на выходных могу попровать
перенести проект.

A074MO
27.01.2018, 23:34
В проекте для DE1 ALTERA/INTEL FPGA University Program (https://www.altera.com/support/training/university/materials-computer-systems.html?&ifup_version=12.1) есть пример использования SRAM.
Скачать здесь (ftp://ftp.altera.com/up/pub/Example_Systems/DE1/Basic_Computer_System/).
Мне удалось сократить цикл SRAM на 1 такт что увеличило быстродействие на 10%.
ОЗУ нарастил до 0-157776, прикрутил управление пультовой ром от 177716[3]

assign mx_stb[3] = (wb_stb & wb_cyc & (wb_adr[15:13] == 3'b111)&(~io_page)&(r177716[3])) //pult_rom**********
|(wb_stb & wb_cyc & (wb_adr[15:6] == 10'o1776));

Состояние 177716[3] выведено на светодиод.
В результате SPEED не виснет, но есть интересный эффект.
После запуска RT11 светодиод горит постоянно.

==================== Протокол начат: 27/01/2018 21:38:40 =====================

@
@
@177716/160000
@T2
ТЕСТ 2
ПАМЯТЬ 020000 -157776
ПАМЯТЬ 000600 -017776

024164
@100/000400 102
000102/000000 2
@10000/000000 12701
010002/000000 177560
010004/000000 12702
010006/000000 177564
010010/000000 10100
010012/000000 5003
010014/000000 77301
010016/000000 5212
010020/000000 105712
010022/000000 100376
010024/000000 6300
010026/000000 1005
010030/000000 5012
010032/000000 12700
010034/000000 4
010036/000000 5761
010040/000000 2
010042/000000 42700
010044/000000 20
010046/000000 10062
010050/000000 2
010052/000000 1362
010054/000000 105711
010056/000000 100376
010060/000000 116123
010062/000000 2
010064/000000 22703
010066/000000 1000
010070/000000 101371
010072/000000 23727
010074/000000 140
010076/000000 67503
010100/000000 1006
010102/000000 12737
010104/000000 60527
010106/000000 140
010110/000000 12737
010112/000000 66562
010114/000000 142
010116/000000 5003
010120/000000 5023
010122/000000 113
@5000/000000 73
005002/000000 74316
005004/000000 43556
@10000G
HX 2.2 RT-11 Warm boot..

HX DSK/TTY multiplexer v3.3 2016
SL V08.00 [SW] Сторожевых С.В. 1988

RT-11SJ (Y) V05.04 G

.SE USR NOSWAP

.SE EXIT NOSWAP

.SE TT SCOPE

.LO SL

.SE SL ON

.DAY
Время Дата
21:39:14 27-Янв-2018, Суббота

.MEMORY

low high

0 177410
177560 177570
177600 177720


.SPEED

ТЕСТ БЫСТРОДЕЙСТВИЯ

КОМАНДА СЛОЖЕНИЯ РЕГИСТР-РЕГИСТР
БЫСТРОДЕЙСТВИЕ (ТЫС.ОП./СЕК) 11568

КОМАНДА СЛОЖЕНИЯ РЕГИСТР-ПАМЯТЬ
БЫСТРОДЕЙСТВИЕ (ТЫС.ОП./СЕК) 5344
.SH ALL

RT-11SJ (Y) V05.04 G
Booted from HX0:RT11SJ

USR is set NOSWAP
EXIT is set NOSWAP
KMON is set NOIND
TT is set NOQUIET
ERROR is set ERROR
SL is set ON
EDIT is set KED
KMON nesting depth is 3

LSI 11 or PDP 11/03 Processor
56KB of memory
Extended Instruction Set (EIS)
Extended Arithmetic Element (EAE)
Parity Memory
ECC Memory
VT48 Graphics Display Hardware
50 Cycle System Clock

No SYSGEN options enabled

Device Status CSR Vector(s)
------ ------ --- ---------
HX Resident 177560 000
TT Installed 000000 000
SL 141104 000000 000
EM Installed 000000 010
LD Installed 000000 000

TT
HX (Resident)
HX0 = DK , SY
SL (Loaded)
EM
LD
17 free slots

Job Name Console Level State Low High Impure
--- ---- ------- ----- ----- --- ---- ------
0 RESORC 0 0 Run 000000 141032 N/A

No multi-terminal support

Address Module Words
------- ------ -----
160000 IOPAGE 4096.
156242 HX 431.
145414 RMON 2251.
141076 SL 1127.
131032 USR 2066.
001000 ..BG.. 22541.

No LD units mounted


.ODT

ODT V05.08
*177716/160010
*^C

.
================== Протокол остановлен: 27/01/2018 21:40:46 ==================



- - - Добавлено - - -

Временные диаграммы SRAM

http://img.radiokot.ru/files/124779/thumbnail/1hk5atsok5.png (http://img.radiokot.ru/files/124779/medium/1hk5atsok5.png) http://img.radiokot.ru/files/124779/thumbnail/1hk5at1hfn.png (http://img.radiokot.ru/files/124779/medium/1hk5at1hfn.png) http://img.radiokot.ru/files/124779/thumbnail/1hk5asbgvx.png (http://img.radiokot.ru/files/124779/medium/1hk5asbgvx.png)

При чтении данные на выходе удерживаются до 7 нс после деактивации OE/CE
При записи допускается одновременное снятие данных и WE.

- - - Добавлено - - -

RTL
http://img.radiokot.ru/files/124779/thumbnail/1hk65mtgu5.png (http://img.radiokot.ru/files/124779/1hk65mtgu5.png)

A074MO
07.02.2018, 21:39
Модуль SPI для чтения SPI чипов типа 25f512 и подобных.
регистр команд 177400:
177400[15] выбор чипа CS
177400[7] 1 идет передача
регистр данных 177402:
по записи - передаваемое слово
по чтению - принятое слово
передача запускается обращением по записи к рег данных
http://img.radiokot.ru/files/124779/thumbnail/1i36zdd4lh.png (http://img.radiokot.ru/files/124779/1i36zdd4lh.png)

пример программы:

1 .asect
2 001000 .=1000
3 001000 012700 000100 mov #10,r0 ; число слов 8+2
4 001004 012701 001400 mov #1400,r1 ; команда 03h
5 001010 012702 010000 mov #7774,r2 ; загрузка с 10000 адреса
6 001014 052737 100000 177400 bis #100000,@#177400 ; выбор чипа
7
8 001022 000240 st: nop
9 001024 010137 177402 mov r1, @#177402 ; передаем команду
10 001030 032737 000200 177400 $1: bit #200,@#177400 ;
11 001036 001374 bne $1 ; ждем конца передачи
12 001040 013712 177402 mov @#177402,(r2) ; сохраняем в рам
13 001044 000322 swab (r2)+ ; ?
14 001046 005001 clr r1 ; теперь здесь адрес
15 001050 077014 sob r0, st ; повторяем
16 001052 042737 100000 177400 bic #100000,@#177400 ; снимаем выбор чипа
17 001060 000000 halt



module r177400
(
input sys_init,
input wb_clk_i,
input [15:0] wb_adr_i,
input [15:0] wb_dat_i,
output [15:0] wb_dat_o,
input wb_cyc_i,
input wb_we_i,
input [1:0] wb_sel_i,
input wb_stb_i,
output wb_ack_o,
output [15:0] test0,
output [15:0] test2,
//-----------------------------------
output reg spi_clk_m,
output reg spi_dout_m,
output spi_cs_m,
input spi_din_m,

output k
);

reg start;
wire [1:0] ena;
reg [1:0]ack;
reg [3:0] bit_cnt;
reg [15:0] vm_reg0, vm_reg2, vm_reg4, vm_reg6;
reg [2:0] state;
reg [15:0] rx;


assign spi_cs_m = ~vm_reg0[15];
assign k = ~vm_reg0[7];
assign test0 = vm_reg0[15:0];
assign test2 = vm_reg2[15:0];


assign wb_dat_o = (((wb_adr_i[2:1])==2'b00)? vm_reg0 :16'h0000)
// |(((wb_adr_i[2:1])==2'b01)? vm_reg2 :16'h0000) //vm_reg2
|(((wb_adr_i[2:1])==2'b01)? rx :16'h0000)
|(((wb_adr_i[2:1])==2'b10)? vm_reg4 :16'h0000)
|(((wb_adr_i[2:1])==2'b11)? vm_reg6 :16'h0000);
//----------------------------------------------------------------------
parameter S0 = 0, S1 = 1, S2 = 2, S3 = 3;

reg [3:0] dl;
always @ (posedge wb_clk_i ) begin
dl <= dl+1'b1;
if (sys_init)
begin
vm_reg2 <= 16'o000000;
vm_reg0 <= 16'o000000;
vm_reg0[7]<=1'b0;
state <= S0;
end
if (wb_stb_i & wb_we_i & (wb_adr_i[2:1])==2'b00) vm_reg0[15] <= wb_dat_i[15];
if (wb_stb_i & wb_we_i & (wb_adr_i[2:1])==2'b01) begin vm_reg0[7] <= 1'b1; start <= 1'b1;
if (wb_stb_i & wb_we_i & (wb_adr_i[2:1])==2'b01) vm_reg2 <= wb_dat_i; end

if (dl==4'h0) begin

case (state)
S0: begin if (start==1'b1) begin state <= S1; bit_cnt <= 4'b1111;end else state <= S0; end
S1: begin state <= S2; bit_cnt <= bit_cnt - 1'b1; spi_clk_m <= 1'b1; end
S2: begin if (bit_cnt==4'b1111) state <= S3; else state <= S1; spi_clk_m <= 1'b0; end
S3: begin state <= S0; start <= 1'b0; vm_reg0[7] <= 1'b0;end
endcase
end end

always @ (negedge wb_clk_i )
if (dl==4'h0) begin
spi_dout_m = vm_reg2[bit_cnt];
end

always @ (posedge spi_clk_m)
if (dl==4'h0) begin
rx [15:0] <= { rx[14:0],spi_din_m};
end
//-------------------------------------------------------------------------
assign ena = wb_we_i ? wb_sel_i : 2'b11;
assign wb_ack_o = wb_cyc_i & wb_stb_i & (ack[1] | wb_we_i);
always @ (posedge wb_clk_i)
begin
ack[0] <= wb_cyc_i & wb_stb_i;
ack[1] <= wb_cyc_i & ack[0];
end

endmodule

dk_spb
20.03.2018, 12:29
А может ли кто-нибудь подсказать про ВМ2 серии 1806?
Интересует разгонябельный ли он и что будет с процессором если его некоторое время подержать на сильно завышенной частоте..

MM
20.03.2018, 13:42
разгонябельный ли он
Нет, при +5.00 в.
Однако, топнормы имеют электрограницу переходов +6.00 вольт, что дает возможность добавить по крайней мере 20% частоты при питании +6.00 в.

Проводил опыты над кристаллом ОСМ 1991 г. +5.00 в.:
1. Максимальная долговременная работа под RT-11 - 6.00 мгц.
2. Пуск ( загрузка ) RT-11 , работа 1 мин - 7 мгц.
3. Отсуствие нормального пуска, периодические трап то 4, трап то 10 - 8 мгц.

При этом сам камень был не теплее +10 градусов относительно воздуха.


ИМХО - 1806ВМ2 ----> М1801ВМ1А + 10% по частоте.

dk_spb
20.03.2018, 14:47
MM, А вот есть такой компьютер Союз-Неон ПК-11/16, в котором (по паспорту) Н1806ВМ2 на 8 Мгц. Питание 5 вольт. Это тогда как?

MM
20.03.2018, 15:53
Питание 5 вольт. Это тогда как?
Если это именно так - "продукт кооператива", т.е. самопальное *****.

- - - Добавлено - - -

Сейчас обсудил это с ветераном , работавшим в 1980-х на А. цеховым технологом, с его слов ворота на ПМК были ( при +20 градусов ) :
+4.50 в. - 6 мгц
+4.00 в. - 4 мгц
+6.00 в. - 7 мгц.
Тест длился 0.5 сек.

При термоциклах для "ОС" могли применяться др. ворота.

dk_spb
20.03.2018, 15:56
Вопрос не про субъективное мнение об поделии. Тем более что я как-то не припомню положительных характеристик разработкам Зеленограда из Ваших уст ;-)
Может Вы и правы, речь сейчас не об этом. Речь про два вопроса: гонится или нет, и тут пока две версии: на 8 работает и (Ваша) не гонится совсем. И второй вопрос: если на н1806вм2 дать минут на 5-10 тактовую 25Мгц - как он это переживет, не решит ли что его ласты срочно требуют клея?

MM
20.03.2018, 16:19
Тем более что я как-то не припомню положительных характеристик разработкам Зеленограда из Ваших уст ;-)
Я предпочитаю говорить правду, а не как некотрые "историки" из самого Зеленограда.

Если нужно узнать подробности - поспрашивайте участника форума господина VMP, он типа как разработчик изделий на ВМ2.

dk_spb
20.03.2018, 16:27
MM, Спасибо! Попробую к VMP поприставать.

1Ж24Б
25.03.2018, 11:54
Вопрос по КР1801ВП1-035/-065. В режиме вывода линии AD с открытым стоком или есть внутренняя подтяжка ?

Vslav
25.03.2018, 13:11
На AD есть "подтяжка", это полноценные выходы push-pull, с возможным переводом в третье состояние. На отреверсенных схемах ВП1 такие выводы имеют тип OUTPUT_OE. Если вывод двунаправленный, то еще добавляется компонент INPUT для постоянно работающего ввода. Выходы типа "открытый коллектор" имеют тип OUTPUT_OC, и там на них еще обозначение по ЕСКД нарисовано - ромбик с линией.

MM
25.03.2018, 15:20
В режиме вывода линии AD с открытым стоком или есть внутренняя подтяжка ?
Есть некотрые рекомендации по серии 1801 ( сканы нет возможности привести ).
В них указан экстремально-минимальный резистор подтяжки ( к +5в. ) выводов АДх - 560 ом ( цеховые ворота ), при напряжении не более +1.000 вольт.
( т.е. выходной максимальный ток 0 - не более 8 ма ).
Ток "1" ( уровня, близкого к +5в. ) - не более 2 ма., при напряжении не менее + 3.5 вольт .

Отмечу, что 1801ВП1 требует МПИ с уровнями именно +5в, на МПИ с уровнями +3.3 в. часто не работают ( не опознают адреса ).

- - - Добавлено - - -

Попробовал на днях поразгонять Н1806ВМ2 на минимальной конфе, питание +5.25 вольт.
1. Пуск МС1201.02 - 9 мгц, дальше - фокусы. Тест 3 ПРЦ - может пройти, а может и нет. Тест 2 СОЗУ - может пройти, а может и буквы в сообщении пропускать.
2. Загрузка с эмуля господина Патрона -8.5 мгц, время от времени беспричинные Трап то 4, держится несколько мин.
3. Загрузка с эмуля господина Патрона -8.00 мгц, 5 мин - без ошибок, дальше не пытал.
Сам проц на 8 мгц был порядка +30 градусов, в лаборатории +25 градусов, без теплоотвода, резисторы подтяжки МПИ - 1 ком.
Скорость канала на 065 и МАХ232 - 57600, коаксиальный кабель RS-232 2 метра.

Отмечу, что на стабильность ВМ2 очень влияет форма тактового импульса, и тайминги МПИ отчасти.

dk_spb
25.03.2018, 15:28
Да, у меня на 8 работает стабильно. Только никаких резисторов подтяжки нет. У Н1806ВМ2, судя по описанию (если я ничего не путаю) выводы с тремя состояниями, не ОК.

1Ж24Б
25.03.2018, 21:16
Отмечу, что 1801ВП1 требует МПИ с уровнями именно +5в, на МПИ с уровнями +3.3 в. часто не работают ( не опознают адреса ).
Интересное замечание. Я подключил КР1801ВП1-035 к МПИ через К589АП16, и при работе были случайные ошибки (в каком-то разряде вместо нуля прошла единица), поэтому заподозрил линии AD. Введение подтяжки при помощи сборок резисторов на 10 кОм (других не было) решила проблему.

MM
11.04.2018, 02:14
Вопрос к уважаемому Вславу :
Есть ли выход наружу сигнала встроенного в 1801ВМ1А таймера - т.е. сигнала, когда он таки срабатывает ?

Vslav
11.04.2018, 15:58
Есть ли выход наружу сигнала встроенного в 1801ВМ1А таймера - т.е. сигнала, когда он таки срабатывает ?
Нет, такого сигнала наружу нет, к сожалению.

Vslav
12.06.2018, 10:37
Любопытно, обращение процессора к регистру 177716 зависит от номера процессора в системе только при обращении как к вектору начального старта - то есть стартовый вектор извлекается по адресу 177716 + Ncpu*20. А вот при переходе в пультовой режим и обратно (установка и сброс 3-го бита при пультовых исключениях и возврате по START/STEP) идет всегда фиксированное обращение к 177716, независимо от номера процессора. Ну и стек пультового режима всегда растет вниз начиная с 177700 (при входе в пульт в 177674 записывается PC, в 177676 записывается PSW). Получается, что ресурсы стека и бита 3 не разделены самим процессором и требуют разнесения внешними схемами в многопроцессорной системе.

Vslav
12.06.2018, 14:22
1801ВМ1А и 1801ВМ1Г по-разному обрабатывают исключение зависания шины в пультовом режиме, если установлен бит PSW11. ВМ1А делает коррекцию сохраняемого PC и сохраняет указатель на инструкцию которая вызвала исключение. ВМ1Г коррекции -2 не делает.

Hunta
12.06.2018, 14:46
177716 + Ncpu*20
Если четыре процессора, Ncpu=3 -> 177716 + 3*20 -> 1777776
Или я неправильно помню, и на 1801ВМ1 не предусмотрено четырёх-процессорной системы?..

Vslav
12.06.2018, 14:50
Или я неправильно помню, и на 1801ВМ1 не предусмотрено четырёх-процессорной системы?..
Предусмотрено. А слова состояния по адресу 177776 в 1801ВМ1 - не предусмотрено.
Так что все верно, процессор номер 3 берет стартовое значение PC читая адрес 177776.

Hunta
12.06.2018, 14:51
А слова состояния по адресу 177776 в 1801ВМ1
Семён Семёныч! Забыл про это... Давно с ВМ1 не общался..

Vslav
12.06.2018, 15:51
Хм, а что, при входе в обработчик прерывания или исключения пользовательского режима происходит обнуление старшего байта PSW? Я тут нарыл что микрокод запуска обработчика пользовательского прерывания читает PSW из вектора и затем его старший байт обнуляет. Таким образом PSW10 и PSW11 сбрасываются при входе в обработчик.

Hunta
12.06.2018, 16:34
при входе в обработчик прерывания или исключения пользовательского режима происходит обнуление старшего байта PSW
Скорее всего, это особенность 1801ВМ1. Тот же 1801ВМ3 ведёт себя несколько сложнее.

Vslav
12.06.2018, 17:36
Существенно обновил документ по 1801ВМ1, описан микроавтомат, заполнена таблица микропереходов (хотя описано далеко не все), уже понятно каких инструкций в ВМ1 точно нет - предварительно заполнена также таблица процессорных инструкций. Разобран и описан микрокод процедур начального старта, входа в обработчики пользовательских и пультовых прерываний. Выкладываю предварительную версию от 8-Jun-2018 (http://u.zeptobars.ru/yuot/MISC/1801vm1-15.pdf), потому что пока нет ясности когда у меня будет время и желание заниматься завершением документирования ВМ1.

PS. Буду рад если кто-нибудь этот документ хотя бы полистает и выскажет замечания, уточнения и предложения по его улучшению (в разумных пределах - и на эту то версию уйма времени ушла)

Hunta
12.06.2018, 17:43
Vslav, Вы точно документ выложили? :) 404 ругаицца :)

Vslav
12.06.2018, 17:45
Vslav, Вы точно документ выложили? :) 404 ругаицца :)
Сорри, я на отдыхе - тут инет медленный. Уже точно по ftp докачалось - можно забирать.

AFZ
13.06.2018, 09:56
4. Назначение выводов Нога 5.

Вход запроса на доступ к магистрали для ведущего процессора с аппаратным номером 0, ведущий процессор никогда не использует данный вывод как выход.

Выход запроса на доступ к магистрали для процессоров с номерами 1-3 и других внешних модулей системы Как-то оно не очень. Может лучше так?


Вход запроса на доступ к магистрали для ведущего процессора с аппаратным номером 0 от процессоров с номерами 1-3 и других внешних модулей

Выход запроса на доступ к магистрали для процессоров с номерами 1-3. Ведущий процессор (номер 0) никогда не использует данный вывод как выход.

Vslav
13.06.2018, 12:13
В моем варианте первый абзац описывает функционал для ведущего проца, второй - для ведомых. В предлагаемом варианте - чередование, что не есть совсем гут, хотя оно непринципиально. Дополнение "других внешних модулей" - да, лучше перенести, сделаю.

Инструкция RESET любопытно выполняется - активируется nINIT, потом в R12 заносится 3408, гонятся цикл с декрементом R12 на 2, по достижению нуля снимается nINIT, в R12 снова записывается 3408, цикл с декрементированием повторяется, по достижению нуля запускается выборка и исполнение следующей инструкции.

gid
13.06.2018, 16:52
Спасибо. Я тоже пытался декодировать таблицу микрокода, но понял, что не осилю и забросил. Там у меня получались какие-то очень уж сложные, нетривиальные условия для значений IR чтобы переходить с одного микроадреса на другой.
Поэтому есть предложение, хоть ещё чу-чуточку дополнить таблицу описания переходов между адресами микроинструкций программного автомата 1801ВМ1А, чтобы можно было на основе того, что есть, доделать остальное.
Например, переход с 01 на 31:


[0x01](x0001xxxxx000111 001xxxxx) -> [0x31](0001100110011001001010010100011000)
если опкоды CLR(B),COM(B),INC(B),DEC(B),NEG(B),ADC(B),SBC(B),T ST(B),ROR(B),ROL(B),ASR(B),ASL(B),SXT
с аргументом PC
[0x01](x0001xxxxx000xxx 001xxxxx) -> [0x31](0001100110011101001010010100011000)
если опкоды CLR(B),COM(B),INC(B),DEC(B),NEG(B),ADC(B),SBC(B),T ST(B),ROR(B),ROL(B),ASR(B),ASL(B),SXT
с аргументом R0-R6
Переход с 01 на 37, немного не как у вас:


[0x01](0000000000000001 001xxxxx) -> [0x37](0001100111111111001000110000011100)
если опкод WAIT
[0x01](0000000000000101 001xxxxx) -> [0x37](1111111111111111111110100110011100)
если опкод RESET
[0x01](00000000101xxxxx 001xxxxx) -> [0x37](0001100111011111001010010100011000)
если опкоды CLxx, SExx [000240-000277]
[0x01](0000110100xxxxxx 001xxxxx) -> [0x37](0001101001011011001000110000011100)
если опкод MARK nn
Переход с 01 на 45:

[0x01](0000000001xxxxxx 001xxxxx) -> [0x45](1111111110111010101010111110111101)
если опкоды [000110-000177] - JMP с допустимым аргументом
[0x01](x000xxxxxxxxxxxx 001xxxxx) -> [0x45](0001111110111111011010111110111101)
если опкоды SWAB,CLR(B),COM(B),INC(B),DEC(B),NEG(B),ADC(B),SBC (B),ROR(B),ROL(B),ASR(B),ASL(B),SXT,MFPS
с нерегистровой адресацией (010-077)
[0x01](0000100xxxxxxxxx 001xxxxx) -> [0x45](1111111110111011101010111110111101)
если опкод JSR Rn с нерегистровой адресацией (010-077)
[0x01](x000101111xxxxxx 001xxxxx) -> [0x45](0001111110111111001010111110111101)
если опкод TST(B) с нерегистровой адресацией (010-077)
[0x01](1000110100xxxxxx 001xxxxx) -> [0x45](0001111110111011001010111110111101)
если опкод MTPS с нерегистровой адресацией (010-077)
Переход с 01 на 47:

[0x01](xx0xxxxxxx000xxx 001xxxxx) -> [0x47](0001111111111011011110111110111101)
если опкоды MOV(B),BIC(B),BIS(B) с нерегистровыми адресациями источника и адресацией приёмника PC, и с адресациями -(PC),Rn
и не только.
[0x01](xx0xxxxxxxxxxxxx 001xxxxx) -> [0x47](0001111111111111011110111110111101)
если опкоды MOV(B),BIC(B),BIS(B) с пока не понятными условиями. все те адресации, которые не попадают в предыдущий набор
[0x01](x01xxxxxxx000xxx 001xxxxx) -> [0x47](0001111111111011001110111110111101)
если опкоды CMP(B),BIT(B) условия как для пары предыдущих наборов
[0x01](x01xxxxxxxxxxxxx 001xxxxx) -> [0x47](0001111111111111001110111110111101)
если опкоды CMP(B),BIT(B) условия как для пары предыдущих наборов
[0x01](x110xxxxxx000xxx 001xxxxx) -> [0x47](0001111111111011111110111110111101)
если опкоды ADD,SUB условия как для пары предыдущих наборов
[0x01](x110xxxxxxxxxxxx 001xxxxx) -> [0x47](0001111111111111111110111110111101)
если опкоды ADD,SUB условия как для пары предыдущих наборов
Переход с 01 на 50:

[0x01](x000xx0x11000xxx 001xxxxx) -> [0x50](0001000110011101001010010100111001)
если опкоды SWAB Rn [000300-000306], MFPS Rn [106700-106706]
[0x01](x000xx0xxx000xxx 001xxxxx) -> [0x50](0001000110011001001010010100111001)
если опкоды SWAB PC [000307], MTPS Rn [106400-106407], MFPS PC [106707]
Переход с 01 на 52:

[0x01](xxxxxx0xxx000111 001xxxxx) -> [0x52](1111000111011001101111010101111011)
если опкоды MUL R3,PC[070307], MFPD PC[106507], MTPD PC[106607]
[0x01](xxxxxx0xxx000xxx 001xxxxx) -> [0x52](1111000111011101101111010101111011)
если опкоды MUL R3,Rn[070300-070306], MFPD Rn[106500-106506], MTPD Rn[106600-106606]
Переход с 01 на 7b:

[0x01](x0000xxxxxxxxxxx 001xxxxx) -> [0x7b](1111111111111101110110110110011101)
если команды ветвления
[0x01](x0000xxxxx000xxx 001xxxxx) -> [0x7b](1111111111111001110110110110011101)
если команды ветвления
в скобках слева: ir, mr(без битов адреса ячейки), входные параметры для vm1a_plm, справа - 34-битный выход для vm1a_plm


Т.е. получается частичное декодирование инструкции, и потом переход на следующий адрес и там дальнейшее декодирование и /или обработка. Но вот уже дальше пошли такие диапазоны, что я просто не смог определить маску или несколько масок, по которым бы отлавливать попадающие инструкции. После оптимизации для прошивки ПЛМ там очень уж не очевидные перекрытия стали получаться.

Vslav
13.06.2018, 17:38
После оптимизации для прошивки ПЛМ там очень уж не очевидные перекрытия стали получаться.
Я пошел по пути прослеживания цепочки обработки каждой инструкции. Сначала составляется цепочка микроадресов по которой пробегает автомат для нужной группы опкодов, а потом уже анализируется каждый микроадрес с конкретным кодом инструкции. Очень уж разные действия могут совершаться на конкретном микроадресе в зависимости от содержимого IR. Утилиту для анализа позже выложу, но она совсем непричесанная.

RTI при установленном T в слове состояния PSW, извлекаемом из стека не дает никакого шанса отработать возможным прерываниям - сразу уходит на новый трап 148, даже не грузит слово инструкции. RTT также не дает отработать прерываниям. Еще RTI/RTT обнуляют старший байт PSW, загружаемое из стека значение игнорируется.

Alex_K
13.06.2018, 23:25
Еще RTI/RTT обнуляют старший байт PSW, загружаемое из стека значение игнорируется.
Получается, что старший байт PSW устанавливают только прерывания исключений (160002, 160006, 160012) и команды START/STEP?
Кстати, а команды START/STEP можно исполнять всегда, или существуют какие-либо ограничения (только при установленных битах 10 или 11 в PSW, или чтобы адрес был больше 0160000)?

Vslav
14.06.2018, 08:32
Получается, что старший байт PSW устанавливают только прерывания исключений (160002, 160006, 160012) и команды START/STEP?
Кстати, а команды START/STEP можно исполнять всегда, или существуют какие-либо ограничения (только при установленных битах 10 или 11 в PSW, или чтобы адрес был больше 0160000)?
Да, старший байт PSW не обнуляют только процедуры входа в пультовые обработчики и возврат из них инструкциями START/STEP. Ограничений на исполнение START/STEP никаких не видно, обычные инструкции.

gid
14.06.2018, 10:59
Vslav, что-то не совсем понятно в таблице назначения выходов блока микропрограммного управления.
Там есть биты 11 и 13 обозначенные как PLX, многофункциональные флаги, а ниже описано условие для битов 13 и 14 - если оба единицы - то происходит запись выходов логической матрицы в специальный управляющий вектор.
Вроде как должна быть ещё таблица комбинаций этих трёх битов, которая определяет, когда Y означает регистр, а когда константу.
У меня получилась такая вот, правильная или нет - не знаю.


14 13 11
0 0 0 - Y - регистр
0 0 1 - Y - константа
0 1 0 - Y - константа
0 1 1 - Y - константа
1 0 0 - Y - регистр
1 0 1 - Y - константа
1 1 0 - спец.вектор
1 1 1 - спец.вектор

Как я подозреваю из чтения верилога, там встречается условие (~plr[14] & plr[13]) | plr[11], которое, как я полагаю определяет, что Y является чем-то таким, а условие ~plr[13] & ~plr[11] - что Y является чем-то этаким.

И как бит 14 может быть в управляющем векторе ~MCIR2, если он является стробом для вектора, он же тогда всегда 1 будет? Или я чего-то не понимаю, и в специальный управляющий вектор записывается не то значение, в котором биты 13 и 14 оба единичные, а что-то другое?

Vslav
14.06.2018, 11:50
в котором биты 13 и 14 оба единичные, а что-то другое?
Там опечатка, имелось ввиду вот это:

assign plm1x = plm_ena & ~plm[12] & (plm[11] & plm[13]);
Строб специального вектора если 11 и 13 биты единичные.
Табличку для 14, 13, 11 составить непросто, там много связей, посмотрю что можно сделать.

Update: такая табличка вышла по аргументу Y

14 13 11 Трансляция на шину Y
0 0 0 R0-R13, PSW, Q (зависит от разрядов 28-25)
0 0 1 константа или вектор
0 1 0 константа или вектор
0 1 1 константа или вектор
1 0 0 R0-R13, PSW, Q (зависит от разрядов 28-25)
1 0 1 константа или вектор
1 1 0 R12 (предположительно не используется)
1 1 1 R12 | константа/вектор (предположительно не используется)

gid
14.06.2018, 16:49
Комбинация plr[14] & plr[13] вроде как используется.

assign au_is0 = ~(plr[13] & plr[14] & plr[25] & plr[26] & ~plr[27]);
assign au_is1 = (plr[13] & plr[14] & plr[25] & plr[26] & ~plr[27]);
для определения переставлять ли байты на шине X или нет.
И для определения значений fctl[7..4] с почти этими же комбинациями бит, но это для меня уж совсем таинственные манипуляции в АЛУ. Я там за деревьями леса не вижу. Вообще не понимаю, как эти мельтешения битов превращаются в нормальные арифметические вычисления с флагами результата операции.

А plm и plr в общем случае, для анализа микрокода можно считать, что равны между собой, или бывает что нет?
Я попробовал прикинуть алгоритм, как отслеживать цепочки обработки инструкций, и что-то очень непросто получается. Особенно если не знаешь, какое значение в mr должно быть (кроме поля адреса) и перебираешь их все.

gid
15.06.2018, 13:46
Ещё нашёл ошибку.
В специальном управляющем векторе VSEL задом наперёд написано, и инвертирование не указано.
По коду

if (plm1x)
vsel <= {plr[18], ~plr[20], ~plr[21], ~plr[22]};
18й бит - VSEL[3], ..., 22й - ~VSEL[0]

Vslav
15.06.2018, 14:02
А plm и plr в общем случае, для анализа микрокода можно считать, что равны между собой, или бывает что нет?
Да, для анализа можно считать что совпадают, по факту это одно и то же, просто в разных фазах цикла.
Тут я временно выложил утилитку (http://u.zeptobars.ru/yuot/MISC/DOC/mcode.c) для анализа микрокода, она далеко неполная, корявая, просто костыль, но прохождение инструкций по цепочке микроадресов получается отследить.

Еще приколы встречаются когда оно MCIR по ходу декодирования меняет. Например, одноадресные инструкции в первом такте, если не регистровое обращение, в MCIR пишут 7, кроме TST - для него пишется 5. А в следующем такте декодирования, оно смотрит на этот переданный MCIR и для TST запускает транзакцию чтения, в том время как для остальных - чтения-модификации-записи.

Vslav
15.06.2018, 16:35
Использование транзакций read-modify-write (также известные как DATIO) для CLR(B) и SXT подтверждается. TST(B) использует исключительно чтение (DATI).

- - - Добавлено - - -

Если PC является приемником в одноадресных инструкциях в регистровом режиме (например CLR PC), то регистр инструкции заполняется дважды - первый раз по адресу .+2 (следующая инструкция), второй цикл чтения запускается уже по новому значению PC.

gid
15.06.2018, 20:25
Там почти для всех опкодов, если шесть младших битов == 000111 (число 7), то бит plx[20] == 0 - эта ситуация прослеживается почти в каждом микроадресе, нету в обработке mark, trap, emt и опкодов меньше 7. Как будто, специально отлавливается, но зачем-то распространена на весь микрокод.

Vslav
15.06.2018, 21:05
Там почти для всех опкодов, если шесть младших битов == 000111 (число 7), то бит plx[20] == 0 - эта ситуация прослеживается почти в каждом микроадресе, нету в обработке mark, trap, emt и опкодов меньше 7. Как будто, специально отлавливается, но зачем-то распространена на весь микрокод.

Пока за весь микрокод не скажу, но почти все одноадресные инструкции начинаются так (пример для TST):


if (dd address mode == 0)
01: A = PC
IR preload start, word read start
if (dd register == PC)
01: R12 = PC + 2
31: MCIR = 1012
49: PC = PC & 1777778, assign NZVC
11: next instruction
else
01: PC = PC + 2
31: MCIR = 1012
49: Rd = Rd & 1777778, assign NZVC,
MCIR poll, wait read
01: next instruction
else

Ветвление по address mode сделано совсем ранним, на первом же микроадресе цепочки декодирования, таким образом выделяется отдельная ветка регистровых операций, что позволяет минимизировать число тактов исполнения и ускорить инструкции (уменьшить занимаемое ими число тактов). Причем тут же в первом цикле всегда запускается предвыборка по (PC)+ следующей инструкции. Но на адресе 01 PC уже имеет значение ".+2", если его позволить модифицировать, то инструкции типа ASL PC будут уже работать за значением ".+4". Поэтому если аргумент 0001112, то PC пока не меняем, выполняем саму операцию а потом (на адресе 11) запустим получение следующей инструкции уже по новому значению PC (результату операции). Прикол в том что TST работает по это же ветке, и TST PC будет извлекать следующую инструкцию дважды - получаем фантомный цикл.

Vslav
16.06.2018, 00:07
С MTPS все понятно, никаких сюрпризов - изменяет только младший байт PSW, бит T сохраняет свое значение, при регистровой адресации любого регистра (не только PC) следует фантомный цикл чтения следующей инструкции.


if (dd address mode == 0)
01: A = PC, IR preload start,
word read start, R12 = PC + 2
50: Rd = Rd & ~0000208, Q = Rd
37: PSW[7:0] = PSW[7:0] & 0000208
36: PSW[7:0] = PSW[7:0] | Q
11: next instruction
else
01: MCIR = 1012
switch (dd address mode)
case 0: Rd
45: user exception (0000108)
case 1: @Rd
45: A = Rd, R12 = Rd, byte read start
case 2: (Rd)+
45: A = Rd, Rd = Rd + 1, word read start
55: R12 = Rd – 1
case 3: @(Rd)+
45: A = Rd, word read start, Rd = Rd + 2
4D: wait read, R12 = Q,
A = Q, word read start
case 4: -(Rd)
45: Rd = Rd – 1, A = Rd, byte read start
55: R12 = Rd
case 5: @-(Rd)
45: Rd = Rd – 2, A = Rd, word read start
4D: wait read, R12 = Q
A = Q, word read start
case 6: E(Rd)
45: A = PC, word read start, PC = PC + 2
4C: wait read, R12 = Rd + Q,
A = R12, byte read start
case 7: @E(Rd)
45: A = PC, word read start, PC = PC + 2
4C: wait read, R12 = Rd + Q, A = R12
word read start
4D: wait read, R12 = Q,
A = Rd, byte read start
48: wait read, Q = Q & ~0000208
37: PSW[7:0] = PSW[7:0] & 0000208
36: PSW[7:0] = PSW[7:0] | Q
11: next instruction


- - - Добавлено - - -

MFPS интереснее. Трактуется как байтовая, если приемником является регистр то выполняем знаковое расширение в старший байт регистра аналогично MOVB. Изменяет флаги NZ, V=0. В приемник копируется значение до изменения. Бит T копирует честно.

AFZ
16.06.2018, 04:29
Изменяет флаги NZ, V=0 По идее должно быть и С=0. Так?

Vslav
16.06.2018, 08:01
По идее должно быть и С=0. Так?
Не видно там строба флага C. Не изменяется он, как и в инструкции MOV(B).

MTPS и MFPS обе байтовые. MTPS (R0)+ и MFPS (R0)+ обе изменят R0 на 1.

- - - Добавлено - - -

А инструкция MOV Rs, Rd исполняется 8 тактов - на быстрой шине с максимально быстрым RPLY. Могло бы и быстрее, только долго логика арбитража/захвата шины чешется. Вот так не особо нужная фича многопроцессорности тормозит жизнь изделию в одноядерной конфигурации. Так что - быстродействие ВМ1 на 5МГц 625К операций в секунду, 8 тактов на регистр-регистр.

gid
16.06.2018, 11:42
Vslav, пока я восстанавливал недостающие структуры для mcode.c возникла пара вопросов. Нет ли там опечаток?
В функции static DWORD mc_plm32_vm1(DWORD src)

for (p = plm + MCODE_P_MIN; p < (plm + MCODE_P_MAX); p++)
{
if (((src ^ p->pmask) & p->xmask) == 0) r |= p->s32dw[0];
}
есть некая s32dw[0], которая больше нигде не используется.
А в функции static ULONGLONG mc_plm64_vm1(DWORD src), выше, вместо s32dw[0] используется smask.

В функции void ma_stat(DWORD ma, DWORD na, DWORD mask, DWORD value)
со строки 2192 есть такое:

if (qstby)
{
ps->qstba.count++;
ps->qstba.zero |= src;
ps->qstba.one |= ~src;
}
не должно ли там быть ps->qstby для более корректной статистики?

- - - Добавлено - - -

А что за макрос INPLX?

Vslav
16.06.2018, 13:21
Vslav, пока я восстанавливал недостающие структуры для mcode.c возникла пара вопросов. Нет ли там опечаток?
...
есть некая s32dw[0], которая больше нигде не используется.

Это юнион.
Да тут все свои, не надо стесняться, а просто напомнить забывчивому мне выложить недостающий mcode.h :)
mcode.h (http://u.zeptobars.ru/yuot/MISC/DOC/mcode.h)
mcode.c (http://u.zeptobars.ru/yuot/MISC/DOC/mcode.c)




if (qstby)
{
ps->qstba.count++;
ps->qstba.zero |= src;
ps->qstba.one |= ~src;
}
не должно ли там быть ps->qstby для более корректной статистики?

Да, это косяк, спасибо, поправлю.

Vslav
17.06.2018, 15:43
Полностью микропрограмму 1801ВМ1Г разбирать не буду, разобрал и описал только умножение:


01: MCIR = 1012
if (ss address mode == 0)
7A: R11 = Rr
40: R12 = Rs
else
switch(ss address mode)
case 0: Rs
45: A = R12 = Rs, word read start
58: stop microcode (error)
case 1: RS
45: A = Rs, R12 = Rs, word read start
case 2: (Rd)+
45: A = Rs, Rs = Rs + 2, word read start
55: R12 = Rs – 2
case 3: @(Rs)+
45: A = Rs, word read start, Rs = Rs + 2
4C: wait read, R12 = Q,
A = Q, word read start
case 4: -(Rs)
45: Rs = Rs – 2, A = Rs, word read start
55: R12 = Rs
case 5: @-(Rs)
45: Rs = Rs – 2, A = Rs, word read start
4C: wait read, R12 = Q
A = Q, word read start
case 6: E(Rs)
45: A = PC, word read start, PC = PC + 2
44: wait read, R12 = Rs + Q,
A = R12, word read start
case 7: @E(Rs)
45: A = PC, word read start, PC = PC + 2
44: wait read, R12 = Rs + Q, A = R12
word read start
4C: wait read, R12 = Q,
A = Q, word read start
48: wait read, R12 = Q
//
// Аргументы получены в R11 и R12, можно выполнять умножение
//
// R11 – первый аргумент, R12 – второй
// R8 – старшие 16 бит произведения, R9 – младшие
32: R8 = 0
25: R10 = R11
6E: R9 = 1000008
74: FR C = R11[0], R11 = R11 >> 1
if (FR C)
69: R8 = R8 + R12, assign NZVC
6B: if (V) R8 = ROR(R8) else R8 = ASR(R8), assign NZVC
else
69: R8 = ASR(R8), assign NZVC
77: R9 = ROR(R9)
if (FR C == 0)
75: FR C = R11[0], R11 = R11 >> 1
69: next cycle
else
75: R10 = R10, set FR N
if (FR N)
76: R8 = R8 – R12
else MCIR = 1102
07: Rr = R8
06: R[r | 1] = R9
if (FR N==0 && FR Z==0)
7C: PSW |= 0000018
11: next instruction
else
if (FR N==1)
7C: R12 = R8 - 1777778
if (FR Z==0)
7E: PSW |= 0000018
11: next instruction
else
7E: R9 = R9
7D: PSW |= N ? 0000008 : 0000018
11: next instruction
else
7C: R9 = R9
if (FR N==0 && FR Z==0)
7F: R12 = 0000018, set NZVC
11: next instruction
else
if (FR N==0)
7F: PSW |= 0000008
11: next instruction
else
7F: PSW ^= 0000018, set NZVC
11: next instruction


Заодно пришлось разбираться с кодированием операции сдвигателя на выходе АЛУ.
Видно что длительность умножения варьируется, зависит от числа единичных битов в первом аргументе (каждый единичный бит добавляет два такта). С флагами на выходе вообще мрак творится, непонятно как они отрабатываются. Знаковое умножение - зло :)

- - - Добавлено - - -

Документация на 1801ВМ1 закончена (возможно позже добавлю небольшие подробности по захвату-освобождению шины, когда спаяю двухпроцессорный модуль и сниму реальные диаграммы). Вопросы, замечания, исправления и дополнения всячески приветствуются. Из версии документа убрано слово "предварительный". Версия теперь будет обновляться по дате.

Однокристальный микропроцессор К1801ВМ1. Техническое описание. (https://github.com/1801BM1/cpu11/raw/master/vm1/doc/1801vm1.pdf)

gid
17.06.2018, 18:19
Вот жеж, а я только разбираюсь в коде mcode. И оказалось, что всё гораздо сложнее, чем я себе представлял.
И вот такой момент мне непонятен, насчёт битов 28..25.
в строке 2263 мы получаем значение Y:

tmp = ((plm & (1<<25)) ? 0 : 8)
| ((plm & (1<<26)) ? 0 : 4)
| ((plm & (1<<27)) ? 0 : 2)
| ((plm & (1<<28)) ? 0 : 1);
оно как и положено, инвертировано и биты задом-наперёд, и обозначает номер регистра на шине Y (предположительно).
А потом в строке 2272 берём эти же биты уже как есть

tmp = (plm >> 25) & 0x0F;
и оперируем этим значением, если на шине Y - вектор или константа.

Т.е. получается, что эти биты надо одновременно рассматривать как инвертированные и реверсные и как обычные прямые, в зависимости от комбинации битов 14,13,11? Или тут ошибка?

Vslav
17.06.2018, 18:28
Т.е. получается, что эти биты надо одновременно рассматривать как инвертированные и реверсные и как обычные прямые, в зависимости от комбинации битов 14,13,11? Или тут ошибка?
Если у нас обращение к регистру в блоке РОН, то инвертируем и реверсируем порядок бит - тогда вычисленное в результате значение индекса совпадает с индексом регистра в процессорной инструкции. А если у нас константа или вектор - тогда не реверсируем и не переставляем. Я подумаю как этот момент отразить в доке, там в описании битов 13-14-16-17 табличка есть, внесу и туда уточнение.

gid
17.06.2018, 18:52
Я полагал, что если (((plm & (1<<13)) && !(plm & (1<<14))) || (plm & (1<<11))), то значение константы или вектора задаётся значением VSEL из специального управляющего вектора, или из матрицы прерываний, а в коде программы - значение битов [28:25] используется одновременно и как номер константы/вектора, и как признак константы/вектора

- - - Добавлено - - -

Ещё не хватает таблицы для PLOP.
А ещё вот это вот:


assign au_is0 = ~(plr[13] & plr[14] & plr[25] & plr[26] & ~plr[27]);
assign au_is1 = (plr[13] & plr[14] & plr[25] & plr[26] & ~plr[27]);
always @(posedge pin_clk_n)
begin
if (au_is0)
xreg[15:0] <= x[15:0];
else
if (au_is1)
xreg[15:0] <= {x[7:0], x[15:8]};
yreg <= y;
end

Если биты 13 и 14 оба 1 и на шине Y [x011], то на шине Х переставляются байты местами.

Vslav
17.06.2018, 19:50
Я полагал, что если (((plm & (1<<13)) && !(plm & (1<<14))) || (plm & (1<<11))), то значение константы или вектора задаётся значением VSEL из специального управляющего вектора, или из матрицы прерываний, а в коде программы - значение битов [28:25] используется одновременно и как номер константы/вектора, и как признак константы/вектора

assign vc_vsel = (plr[28:25] == 4'b0010) & ((plr[13] & ~plr[14]) | plr[11]);
assign vc_csel = (plr[28:25] != 4'b0010) & ((plr[13] & ~plr[14]) | plr[11]);

Если 28-25 равно 2, то используется значение записанное в регистре VSEL как индекс вектора
Если 28-25 не равно 2, то используется само значение 28-25 как индекс константы



Ещё не хватает таблицы для PLOP.

Если бы ее еще осмыслить получилось бы :)



Если биты 13 и 14 оба 1 и на шине Y [x011], то на шине Х переставляются байты местами.
Да, это существенно, спасибо, внесу в документ. Подходит в поле управления режима сдвигателя АЛУ, хотя по факту работает схема обмена байт.

gid
05.07.2018, 15:57
Vslav, в таблице прерываний и исключений, на стр. 55 нигде не написано про команду BPT. Она ведь тоже прерывание по вектору 014 делает. Да и в пунктах 8.3, 8.4 про неё ни слова. А с помощью этой команды отличные антиотладочные трюки делаются.

А ещё, команда HALT, если читать эту таблицу, может быть замаскирована битами PSW10, PSW11
Вроде бы это уже обсуждали и выяснили, что HALT в HALT-mode работает как NOP, т.е. ничего не делает или всё-таки что-то делает. Но я просто не в состоянии заново перелопачивать все ветки форумов, чтобы убедиться, так это или я заблуждаюсь, не законспектировал сразу, то всё, через 3 года - фиг найдёшь.
Поэтому или в этой таблице, или в пункте 8.3 нужно как-то описать, что делают прерывания, вызывающие переход в пультовый режим, в самом пультовом режиме, может какими-то простыми словами написать. (кроме совсем очевидных случаев, типа зависаний шины - они как работали, так и останутся работать так, как работали)

Vslav
05.07.2018, 20:45
Vslav, в таблице прерываний и исключений, на стр. 55 нигде не написано про команду BPT. Она ведь тоже прерывание по вектору 014 делает. Да и в пунктах 8.3, 8.4 про неё ни слова. А с помощью этой команды отличные антиотладочные трюки делаются.

Прежде всего - большое спасибо что прочитали и прокомментировали, вместе мы можем существенно улучшить документ.
Да, как-то упустил я BPT в документации, с точки зрения микрокода там все скучно - IOT/BPT/EMT/TRAP все выполняются одинаково, только значение VSEL разное прописывается для последующей обработки.



А ещё, команда HALT, если читать эту таблицу, может быть замаскирована битами PSW10, PSW11

Что имеется ввиду? Там про nIRQ1 написано, но чтобы не было путаницы добавил в таблицу инструкцию HALT, рядышком с добавленной BPT и имеющимся IOT.



Вроде бы это уже обсуждали и выяснили, что HALT в HALT-mode работает как NOP, т.е. ничего не делает или всё-таки что-то делает.

У 1801ВМ1 нет HALT-моде, у него один-единственный режим работы, в документе это в паре мест написано, я добавил еще такой абзац:

Собственно в процессоре 1801ВМ1 нет никаких аппаратных средств или признаков "пультового" режима - процессор всегда работает одинаково. Реализация "пультового" режима заключается в микропрограммном управлении битом 3 во внешнем (по отношению к микросхеме процессора) регистре, расположенном по адресу 1777168. При входе в "пультовый" режим по прерыванию или исключению процессор выполняет операцию чтение-модификация-запись по адресу 1777168, устанавливая бит 3. При возврате из "пультового" режима инструкциями STEP и START происходит аналогичное обращение по тому же адресу со сбросом бита 3. Особенности реализации данного бита могут различаться, например, в системах, построенных на основе 1801ВП1-030, данный бит управляет отображением ПЗУ в области адресов 1600008-1737778, при входе в "пультовый" режим бит 3 будет установлен и по данным адресам будет гарантировано отображено системное ПЗУ, в котором можно разместить гарантировано доступный код обработчика пультового исключения или прерывания.

Поэтому HALT всегда работает одинаково, согласно алгоритму входа в пультовое исключение. Ну и PC не корректируется при входе, поэтому указывает на следующую за HALT инструкцию.



Поэтому или в этой таблице, или в пункте 8.3 нужно как-то описать, что делают прерывания, вызывающие переход в пультовый режим, в самом пультовом режиме, может какими-то простыми словами написать. (кроме совсем очевидных случаев, типа зависаний шины - они как работали, так и останутся работать так, как работали)

В пункте 8.4 все пошагово описано - и кодом и словами. Имхо там сложно что-то добавить, ну нету "пультового" режима в ВМ1, нету :). Команды в "нем" делают все то же самое что и всегда :)

PS. Обновленная документация на 1801ВМ 1 (05-Jul-2018) (https://github.com/1801BM1/cpu11/raw/master/vm1/doc/1801vm1.pdf), имя документа теперь фиксировано, ссылка всегда будет указывать на последнюю ревизию. Также добавлю ссылку в первый пост.

Patron
05.07.2018, 20:50
Собственно в процессоре 1801ВМ1 нет никаких аппаратных средств или признаков "пультового" режима - процессор всегда работает одинаково.Это не совсем так - в HALT-моде (если не ошибаюсь) 1801ВМ1 иначе отрабатывает ошибку зависания шины - выполняет HALT_Trap вместо TrapTo_4.

Vslav
05.07.2018, 20:55
Это не совсем так - в HALT-моде (если не ошибаюсь) 1801ВМ1 иначе отрабатывает ошибку зависания шины - выполняет HALT_Trap вместо TrapTo_4.
У процессора 1801ВМ1 - НЕТ HALT моды. Вообще. Нет никакого бита или флага который указывал бы на различие режимов. Соответственно, ни микрокод, ни матрица приоритезатора прерываний абсолютно не могут ничего знать про "режим" - они ВСЕГДА работают одинаково.

Если есть какие-то ситуации, когда кажется что такой "режим" есть - давайте конкретно обсуждать и развеивать мифы :)

Реакция на зависание шины зависит от битов PSW10 и PSW11, но это не "режим".

Patron
05.07.2018, 21:08
Реакция на зависание шины зависит от битов PSW10 и PSW11, но это не "режим".Если бы PSW не являлось частью процессора - тогда да. Но поскольку PSW - это часть процессора, задающая режимы его работы, то так же как и у 1801ВМ2 - у процессора 1801ВМ1 есть режим пульта, задаваемый битом PSW. В режиме HALT работа процессора 1801ВМ1 кардинально отличается от работы в режиме USER.

Это принципиальный момент, который надо чётко понимать.

Vslav
05.07.2018, 21:25
Если бы PSW не являлся частью процессора - тогда да. Но поскольку PSW часть процессора, то так же как и у 1801ВМ2 - у процессора 1801ВМ1 есть режим пульта, задаваемый битом PSW. В режиме HALT работа процессора 1801ВМ1 кардинально отличается от работы в режиме USER.

Это принципиальный момент, который надо чётко понимать.
Это не режим, аналогичный режиму в ВМ2/ВМ3. Цитата из документа:

PSW10
Модифицирует обработку исключения зависания шины, если данный бит ненулевой, то исключение зависания будет обрабатываться в пультовом режиме по вектору 1600028
Единичное значение бита PSW10 также маскирует следующие прерывания:
- по пропаданию питания (срез на входе nACLO)
- пультовое прерывание nIRQ1
- прерывание от ВЕ-таймера (только К1801ВМ1Г)
- nIRQ2
- nIRQ3
- векторное прерывание nVIRQ
Бит всегда сбрасывается при входе в процедуру обработки прерывания или исключения пользовательского режима, значение бита, читаемое из вектора игнорируется. Поскольку данный бит маскирует асинхронные прерывания пользовательского режима, то его сброс может произойти только по синхронным пользовательским исключениям (ошибки или инструкции вызова исключений).
Бит также всегда сбрасывается при выполнении инструкций RTT и RTI, значение загружаемое из стека игнорируется. Фактически данный бит может быть установлен только при входе в обработчик прерывания или исключения пультового режима (хорошо подходит инструкция HALT), а также при возврате из него инструкциями STEP и START. Инструкция MTPS не изменяет данный бит.

PSW11
Модифицирует обработку исключения зависания шины, если данный бит ненулевой, то исключение зависания будет обрабатываться в пультовом режиме по вектору 1600028, иначе обработка по вектору 0000048 без перехода в пультовой режим
Единичное значение бита PSW11 также запрещает пультовое прерывание nIRQ1.
Бит всегда сбрасывается при входе в процедуру обработки прерывания или исключения пользовательского режима, значение бита, читаемое из вектора игнорируется.
Бит также всегда сбрасывается при выполнении инструкций RTT и RTI, значение загружаемое из стека игнорируется. Фактически данный бит может быть установлен только при входе в обработчик прерывания или исключения пультового режима (хорошо подходит инструкция HALT), а также при возврате из него инструкциями STEP и START. Инструкция MTPS не изменяет данный бит

Эти биты только маскируют некоторые прерывания и меняют характер реакции на исключение зависания шины. Установить их можно только при входе в "пультовое" прерывание или исключение, но долго они установленными не живут - первое же обычное прерывание (для PSW11) или исключение, а также RTI/RTT их обнулит. У ВМ2/ВМ3 есть реальные пультовые режимы, есть физический выход SEL, который зависит от текущего режима и во многих системах управляет адресацией памяти, в этом принципиальная разница. А у ВМ1 PSW10/11 сделаны как вспомогательные, сделаны чтобы "гасить" nIRQ1 - иначе просто невозможно написать для него нормальный обработчик.

- - - Добавлено - - -


В режиме HALT работа процессора 1801ВМ1 кардинально отличается от работы в режиме USER.
Что такого кардинального в том что зависание шины трапается по другому вектору и сохраняет текущий вектор по фиксированному адресу вместо стека? Это единственное существенное отличие. Работа самого ядра, инструкций и прочего никак не меняется.

Patron
05.07.2018, 21:31
Отличие процессора 1801ВМ1 от последующих в том, что разработчики позволили авторам кода ПЗУ самим решать - переводить процессор в режим пульта или нет. При включении питания, двойной ошибке шины и зависании вектора прерывания - процессор загружает новое содержимое PSW из фиксированного HALT-смещения. Если в этом новом содержим PSW установлен бит режима пульта - процессор переходит в режим пульта и начинает отрабатывать обычные зависания шины как двойные.

- - - Добавлено - - -


Что такого кардинального в том что зависание шины трапается по другому вектору и сохраняет текущий вектор по фиксированному адресу вместо стека?А какое отличие в отработке прерывания может быть ещё более кардинальным - это именно типичный режим пульта.

Vslav
05.07.2018, 21:36
При включении питания, двойной ошибке шины и зависании вектора прерывания - процессор загружает новое содержимое PSW из фиксированного HALT-смещения.
Процессор всегда делает это одинаковым способом.
Ну ОК, я не буду спорить. Как по мне - PSW10/11 просто меняют режим обработки зависания шины и все, ну PSW10 дополнительно запрещает прерывания. На кардинальность это, имхо, никак не тянет. Поведение процессора никак не меняется, все инструкции исполняются как обычно. На мой взгляд эти биты - просто костыль для ПЗУ, чтобы работающий в нем код гарантировано никуда не улетал и оставался в своих пределах (произошло зависание - и попадаем на свой же обработчик в ПЗУ). Все описывается в рамках обычных инструкций, никакой невидимой программисту "магии" нету.



А какое отличие в отработке прерывания может быть ещё более кардинальным - это именно типичный режим пульта.

"Типичный" режим пульта - это к DECу - начиная с LSI-11 :) Вот там пульт всем пультам пульт. В ВМ2/ВМ3 есть свой "пульт" который может менять (если внешние схемы корректно обрабатывают выход SEL) карты памяти. Вот это можно назвать "кардинально". А ВМ1 - то такое. Ну одно аппаратное исключение немного по-другому обрабатывает, на полноценный режим не тянет, имхо.

Patron
05.07.2018, 22:23
Все описывается в рамках обычных инструкций, никакой невидимой программисту "магии" нету.Вот такой он - 1801ВМ1. Магии нет, а включаемый битом PSW режим пульта есть.



"Типичный" режим пульта - это к DECу - начиная с LSI-11 :) Вот там пульт всем пультам пульт. В ВМ2/ВМ3 есть свой "пульт" который может менять (если внешние схемы корректно обрабатывают выход SEL) карты памяти. Вот это можно назвать "кардинально". А ВМ1 - то такое. Ну одно аппаратное исключение немного по-другому обрабатывает, на полноценный режим не тянет, имхо.В том всё и дело, что у 1801ВМ1 именно неполноценный режим пульта. Но это именно режим пульта, причём совершенно очевидный - в PSW есть бит, который специально предназначен для установки в коде ПЗУ пульта.

Про типичность такого подхода я погорячился - режим пульта в 1801ВМ1 организован весьма нетипично и крайне неполноценно.

- - - Добавлено - - -

Можно отметить, что все недостатки режима пульта 1801ВМ1 исправлены в 1801ВМ2, но при этом важно понимать (и особенно - с исторической точки зрения), что те убогие полумеры, которые были предприняты при разработке 1801ВМ1 для организации нормальной работы программы ПЗУ пульта - это именно "первая версия режима пульта", а не стандартный набор возможностей для любых целей без учёта уникальных потребностей режима пульта (вроде кардинально иной отработки зависаний).

Alex_K
05.07.2018, 23:23
Можно отметить, что все недостатки режима пульта 1801ВМ1 исправлены в 1801ВМ2, но при этом важно понимать (и особенно - с исторической точки зрения), что те убогие полумеры, которые были предприняты при разработке 1801ВМ1 для организации нормальной работы программы ПЗУ пульта - это именно "первая версия режима пульта", а не стандартный набор возможностей для любых целей без учёта уникальных потребностей режима пульта (вроде кардинально иной отработки зависаний).
Те убогие полумеры - это всё то, что смогли сделать при переделке 1801ВЕ1 в 1801ВМ1. Всё просто - в микрокоде пульт не помещался, пришлось выносить в отдельное ПЗУ. Ну и как смогли - так и сделали. А вот 1801ВМ2 разрабатывался с нуля, там всё учли, но реализацию пульта решили оставить во внешнем ПЗУ, что в принципе и правильно сделали.

CodeMaster
06.07.2018, 10:57
PSW10
Модифицирует обработку исключения зависания шины, если данный бит ненулевой, то исключение зависания будет обрабатываться в пультовом режиме по вектору 1600028

Тут видимо должно быть продолжение "... иначе ..." как и для PSW11?


В том всё и дело, что у 1801ВМ1 именно неполноценный режим пульта. Но это именно режим пульта, причём совершенно очевидный - в PSW есть бит, который специально предназначен для установки в коде ПЗУ пульта.

А есть машины на ВМ1 которые из "пульта" позволяли бы читать/модифицировать память или он так и остался "теоретическим"?

Hunta
06.07.2018, 11:44
У всего семейства процессоров PDP-11 есть как минимум восемь режимов пульта, которые определяются битами приоритета.
Потому что если что то там поставить, то по другому обрабатываются запросы на прерывание.
И для признания этого факта у нас в восемь раз больше причин, чем, скажем, для ВМ1. У которого только 5 или 6 причин наличия режима пульта.

Если следовать логике Патрона.

MM
06.07.2018, 13:03
А есть машины на ВМ1 которые из "пульта" позволяли бы читать/модифицировать память или он так и остался "теоретическим"?
МС1201.01, МС1201 без индекса = НМС1100 - ДВК-1, ранние ДВК-2.
В принципе, БК11М разделяет сигнал "Пульт" ( кнопка "Стоп" ) и трап то 4, особенно в RT-11.

Photocor
20.07.2018, 16:55
Не все чипы обязательно реверсить, например MicROM-ы 581РУ1/2/3 можно попытаться просто прочитать.
Подскажите, пожалуйста, в двух словах: как осуществляется прямое "прочитывание" и почему в одних случаях это возможно, а в других нет? Можно просто ссылкой на статью или ключевые термины. Заранее благодарен.

svinka
20.07.2018, 18:12
почему в одних случаях это возможно,
потому что 581РУ1/2/3- это ПЗУ масочные

Eric Smith считывал и дизассемблировал оригиналы

гуглите "LSI-11 microcode"

forth32
03.08.2018, 12:41
Прошу прощения если скажу глупость, но хотелось бы уточнить одно место в документации. На странице 23 есть такая фраза:

также постоянен адрес ячеек для сохранения/извлечения PC и PSW пультового режима (177764).

Разве этот адрес не 177674? В той же МС1201.01 под адресу 177764 никакой памяти нет вообще.

Hunta
03.08.2018, 13:04
На той же странице


lock:
cmpb spinlock, #1
bne lock
decb spinlock
bne lock
rts PC
unlock:
mov #1, spinlock
rts PC

нужно сделать так:


lock:
asrb spinlock
bcc lock
rts PC
unlock:
mov #1, spinlock
rts PC

Vslav
03.08.2018, 22:14
Разве этот адрес не 177674? В той же МС1201.01 под адресу 177764 никакой памяти нет вообще.
Конечно адрес 1776748, это просто опечатка, спасибо за замечание, исправлю.

- - - Добавлено - - -





lock:
asrb spinlock
bcc lock
rts PC
unlock:
mov #1, spinlock
rts PC

Да, интересный вариант, спасибо, добавлю в документацию. Две инструкции на захват и одна на освобождение - можно функции вообще инлайновыми сделать, в виде макросов, потому что расходы на вызов могут превысить собственно исполнение функций.

Hunta
03.08.2018, 22:33
Да, интересный вариант, спасибо, добавлю в документацию
Ну, вообще-то это не моё изобретение :) DEC, RSX-11M-Plus, PDP-11/74 :) Не берусь утверждать наверняка, но вроде как они эту одну-единственную инструкцию (в процессоре PDP-11/70) сделали работающей в режиме чтение-изменение-запись с блокировкой доступа к шине на всё время выполнения. В старшем байте хранился номер процессора (или 0), который в настоящее время удерживает доступ к блокируемому ресурсу

svinka
22.11.2018, 23:42
Ни в википедии ни в документе реверса не нашел название пластикового корпуса для КР1801ВМ1. Единственное упоминание http://www.155la3.ru/datafiles/kr1801_tu.pdf

Там он называется 2204.42-3

У меня даже есть советская колодка под этот корпус.

Но и в МС1201 и в БК применена своя посадка микросхем серии 1801, где расстояние между противоположными выводами сокращено на 5мм от чертежа такого корпуса. Зачем?

Какая еще есть информация на этот счет???

Есть ли фото промышленной посадки микросхем серии КР1801 без отверстий?

Korchagin
23.11.2018, 00:02
Видел пару лет назад в интернете фото планарной установки КР1801 на некой полуплате ДВК производства какого-то НИИ для своих целей.

MM
23.11.2018, 13:08
Есть ли фото промышленной посадки микросхем
https://pic.maxiol.com/thumbs/1542967623.531453722.5872.jpg (https://pic.maxiol.com/?v=1542967623.531453722.5872.jpg)

Sergei Frolov
23.11.2018, 13:12
Кстати, это тоже калькулятор

AFZ
23.11.2018, 13:19
Мне кажется, или оно действительно занимает больше площади, чем в "шахматном" варианте? Дырок, правда, меньше...

Vslav
24.11.2018, 12:20
Ни в википедии ни в документе реверса не нашел название пластикового корпуса для КР1801ВМ1
Спасибо, добавил в документ. Ожидаются еще небольшие дополнения, чуть попозже выложу.
Update: на гитхабе выложил доку и ее исходники: https://github.com/1801BM1/cpu11/blob/master/vm1/doc/1801vm1.pdf

hobot
25.11.2018, 02:00
пластикового корпуса для КР1801ВМ1

http://pic.pdp-11.ru/images/platabk.jpg

вот стоит что такое вроде на плате что у меня (куплено в Зеленограде,
производство ЕМНИП Армения)

MM
25.11.2018, 02:11
Вообще, посадка советского пластика на поверхность - случай редчайший, еле нашел :v2_dizzy_christmas2 :
https://pic.maxiol.com/thumbs/15323570082309.jpg (https://pic.maxiol.com/?v=15323570082309.jpg)

Vslav
05.01.2019, 01:20
Проект по реверсу всех значимых 1801ВП1 закончен, теперь живет здесь: k1801 (https://github.com/1801BM1/k1801)

Из нового:

закончен реверс 095 и 096, проведено моделирование моста из двух 095 и управляющей 096, с блекджеком и продажными женщинами прерываниями и прямым доступом
переписана документация в формате markdown, в каждом каталоге есть свой readme.md
добавлены цоколевки
добавлены структурные схем для большинства микросхем

Буду рад услышать замечания, принимаются исправления (особенно опечаток) и дополнения.

svinka
05.01.2019, 01:24
еще б ссылки на утилиты конвертирования прошивок из формата шины МПИ в те, что можно посмотреть во вьюере и дизассемблере.
Под linux тоже ....

Vslav
05.01.2019, 01:30
Дополнение:

домен u.zeptobars.ru будет жить еще некоторое время, но больше хостинга материалов там не будет и новых добавляться не будет, если кому что там надо - успейте забрать до закрытия хостинга
я зарегистрировал свой домен и решил вопрос с нормальным хостингом - 1801bm1.com/files, фотографии там уже выложены, буду потихоньку копировать остальное и корректировать ссылки


- - - Добавлено - - -


еще б ссылки на утилиты конвертирования прошивок из формата шины МПИ в те, что можно посмотреть во вьюере и дизассемблере.
Под linux тоже ....
В проекте утилита выложена (https://github.com/1801BM1/k1801/tree/master/rom/rev16), в исходниках под Win32 (и там же есть под него exe). Писалось максимально на портируемом Си, вроде такого:

File->Handle = open(Name, _O_RDONLY | _O_SEQUENTIAL | _O_BINARY, 0);
Поэтому спасение утопающих - дело рук самих утопающих, пересобираешь под Linux, кидаешь pull request и я добавляю твой порт в проект :)

MM
05.01.2019, 01:35
Буду рад услышать замечания
Хотим ВП1-033 !
Хде применялась :
МС1201.х
КЦГД
Самоделы и специфические платы ЧПУ
*
Вообще и 034 желательно, но если сложно - то как-нибуть на ИРочках продержимся...

Vslav
05.01.2019, 01:44
033/034/035 мной к реверсу не планируются - микросхемы достаточно хорошо документированы, функционал более-менее ясен, практического применения в FPGA-based проектах для них не ожидается (ну кому нужен железный ГМД-70 и ИРПР?). Если у кого есть к 033/034/035 реальный интерес - при случае могу сделать и выложить серийные снимки.
PS. У меня пять процессоров PDP-11 пылится в разной степени готовности, поэтому - нет времени на не слишком интересные микросхемы, увы.

MiX
05.01.2019, 15:22
У меня пять процессоров PDP-11 пылится в разной степени готовности
А какие пять? Их всего было четыре- LSI11, F11, T11(использовался в контроллерах), J11.

Hunta
05.01.2019, 15:47
Предполагаю - 1801ВМ1, 1801ВМ2, 1801ВМ3, 581, ....

Vslav
05.01.2019, 17:50
А какие пять? Их всего было четыре- LSI11, F11, T11(использовался в контроллерах), J11.
О-о-о-о, про открытые и тоже пылящиеся кристаллы 1807ВМ1 (T11), и просто пылящиеся 1811 (F11) и 1831(J11) я забыл совсем :)
Тогда получается, что пылится восемь процессоров (не все из них однокристальные и микро, но то такое):

ВМ2, Verilog ждет отладки
ВМ3, 95 процентной готовности схема
581 (LSI-11), схемы готовы
M4, схемы готовы
1807ВМ1 (T11), кристаллы открыты, ждут нового столика
СМ2420, есть прошивки микропрограммы, ПЛМ, схема
1811 (F11), пылятся
1831 (J11), пылятся

Есть определенные планы первые четыре сделать полностью, остальное - будет позже видно.
Ближайшие планы - запускаю 1201.01 на ВМ1, сейчас вот колупаю прошивку 054, оттуда хочу повыкидывать ненужное и вставить загрузчик/драйвер с SD-карты, и
оформляю завершенный проект 1801ВМ1, и есть желание запустить 1801ВМ2.

MiX
05.01.2019, 18:18
О-о-о-о, про открытые и тоже пылящиеся кристаллы 1807ВМ1 (T11), и просто пылящиеся 1811 (F11) и 1831(J11) я забыл совсем
Так это Воронежские процессоры. Я то думал DECовские.


581 (LSI-11), схемы готовы
А микрокод?


сейчас вот колупаю прошивку 054, оттуда хочу повыкидывать ненужное и вставить загрузчик/драйвер с SD-карты
Ну так есть же там колодка для второго ПЗУ. Или -"Мы не ищем лёгких путей"?

Vslav
05.01.2019, 19:32
Так это Воронежские процессоры. Я то думал DECовские.
Ну они очень условно воронежские :)
Ну есть в наличии и F11 и 1811, и J11 и 1831, можно будет посмотреть и сравнить.



А микрокод?

Пока не прочитал, надо считывалку городить, но хочется ее совместить и сделать еще собственно LSI-11 процессор, по типу как модули ВМ1-ВМ3, цепляемые к плате типа DE0. Хотя, может быть, осетра урежу и сделаю просто считывалку 581РУ. По F11 тоже есть шанс прочитать микрокод, там есть хитрый разряд нанокоманды "контроль", надеюсь хотя бы часть микрокода получится прочесть.



Ну так есть же там колодка для второго ПЗУ. Или -"Мы не ищем лёгких путей"?
Ну есть, в FPGA тоже много чего есть, но адресное пространство маленькое, жалко еще 8К откусывать.

MM
05.01.2019, 19:48
Пока...
Лучше нажмите на проект новодела "М1801ВМ3А-100мгц", пин-то-пин совместимый с советским процем.
На модуле установите перемычки множителя и таймингов МПИ.

50 мгц тоже вполне подойдет.:v2_dizzy_eat:

MiX
05.01.2019, 20:11
Ну они очень условно воронежские
Ну есть в наличии и F11 и 1811, и J11 и 1831, можно будет посмотреть и сравнить.
Вскрытие покажет. :)


Ну есть, в FPGA тоже много чего есть, но адресное пространство маленькое, жалко еще 8К откусывать.
Смотря для чего оно нужно, RT11 может загрузится с 20кб. А так да, лучше 8К сохранить.

Manwe
06.01.2019, 20:02
А есть где-нибудь микрокод процессора ВМ1 (в кодах архитектуры Электроника-НЦ или что там внутри) с таймингами?

Vslav
06.01.2019, 20:20
А есть где-нибудь микрокод процессора ВМ1 (в кодах архитектуры Электроника-НЦ или что там внутри) с таймингами?
У 1801ВМ1 нет микрокода как такового, там ПЛМ и конечный автомат. Хотя есть понятие микроадреса и поле NAF (next address field). Но нет последовательного исполнения микроадресов, автоматически uPC = uPC + n не делается, вместо этого происходит uPC = NAF(функция многих параметров).

Грубо говоря, у ВМ1:
- есть конечный автомат на 128 состояний
- номер состояния очень-очень условно можно назвать микроадресом, он не указывает на микроинструкцию
- переходы между состояниями происходят по графам, есть универсальный отмены/сброса
- переход из одного состояния может происходит в много других, в зависимости от условий
- в каждом состоянии может выполняться несколько различных операций одновременно
- обработка одного состояния автомата занимает минимум 2 такта внешней частоты CLC
- переходы между состояниями могут задерживаться в зависимости от условий - неготовность блока обмена с шиной, неготовность блока прерываний, неготовность АЛУ

Все состояния автомата по цепочкам интерпретации команд PDP-11 описаны в документе (https://github.com/1801BM1/cpu11/raw/master/vm1/doc/1801vm1.pdf)
С таймингами сложнее, общие условия я описал - 2 такта на состояние, но есть задержки ожидания готовностей остальных блоков. Так что - возможны варианты.

MiX
06.01.2019, 22:39
я забыл совсем

Фотка (не моя) для хорошего настроения. :)

https://pic.maxiol.com/images/1546803303.3170014816.28ee8b1930f9.jpg

Vslav
06.01.2019, 23:07
Эх, хорошо бы еще в Воронеже поискать фотошаблоны 1831, ну вдруг...
Боб Супник для оригинального J11 шаблоны искать не хочет, говорит, маловероятно что сохранились. Может после реверса LSI-11 интерес поискать появится. Напишу статью на reddit, а там, может, где всплывут у добрых людей.

MM
06.01.2019, 23:41
....поискать фотошаблоны....
Лучше не искать, т.к. могут возбудиться Органы - и на червончик Искателя оправить по "Ленинским местам".
Да, это суровая Российская действительность...

Кто сумневается в строгостях - погуглие, сколько реальных чел мотают срок просто за Лайки и Репосты в соцсетях - их сотни...

( Хотя, с другой стороны, Пусси Риот таки отсудили компенсацию за свой тур по зонам - гуглится ).

MiX
07.01.2019, 13:37
Vslav, А какие мысли насчет схемы считывания 581РУх? Я так полагаю на шину защёлки поставить, но на какой фазе клока выставлять адрес и на какой данные считывать?

Vslav
07.01.2019, 14:18
Vslav, А какие мысли насчет схемы считывания 581РУх? Я так полагаю на шину защёлки поставить, но на какой фазе клока выставлять адрес и на какой данные считывать?
Считывалка 581 штука достаточно простая, там не никаких проблем, просто двунаправленные 3V-5V буфера и втыкается все в DE0. На тактирование ставятся 170АП2. Есть некоторые вопросы по питанию, надо +12V внешние завести (кушает это все многовато), преобразователь в -5V поставить и простую защиту от пропадания минуса и правильного порядка подачи питающих напряжений. Все защелки и прочее реализовать уже в FPGA. Насчет фаз - надо документацию поднимать, смотреть, там несложно. Но хочется же полноценный процессорный модуль на 581. То есть, все 5 наличных микросхем, да чтобы еще четвертую память с FPGA можно было имитировать (ну или все, чего там), да поиграться с микроассемблером и микрокодом. Реальный макет под рукой - вещь при реверсе очень полезная, я на своем живом модуле ВМ1 много разных сомнений разрулил.

MiX
07.01.2019, 17:00
Считывалка 581 штука достаточно простая, там не никаких проблем, просто двунаправленные 3V-5V буфера и втыкается все в DE0. С DE0 это понятно. А имел ввиду без DE0.


Насчет фаз - надо документацию поднимать
А есть такая документация? Кстати 588 где нибудь считаны?

Vslav
07.01.2019, 17:33
Кстати 588 где нибудь считаны?
588? Не знаю. Серия 581 - аналог комплекта MCP-1600 от Western Digital.
Оригинальные CP1631-10 и CP1631-07 (вроде аналоги 581РУ2 и РУ1) прочитаны (https://github.com/brouhaha/lsi11uc). Там же у человека и дизассемблер MCP-1600 (https://github.com/brouhaha/cp16dis) имеется. Ну а найти документацию (https://archive.org/details/bitsavers_westernDig1631BMICROMDec75_1669969/page/n13) на MCP-1631 MicROM - несложно. Вот на F11 почти ничего не сохранилось, а на LSI-11 - валом всего.

Hunta
07.01.2019, 17:37
Насчет фаз - надо документацию поднимать, смотреть, там несложно.
Если речь про 581ИР1-2-3 - в двухтомнике Шахнова есть. Так же как и про 588

Vslav
07.01.2019, 17:39
Если речь про 581ИР1-2-3
РУ, Карл. 581РУ1-2-3. Лучше оригиналы дековские читать, в советских переводах запутано изложено.

Hunta
07.01.2019, 17:42
РУ, Карл. 581РУ1-2-3
Да, описАлся, РУ, конечно :) Именно про них имел ввиду :)

MiX
07.01.2019, 17:51
588? Не знаю.
588ВУ2А-000х

Оригинальные CP1631-10 и CP1631-07
Я про 581.

Vslav
07.01.2019, 20:54
Я про 581
Именно 581РУx пока вроде никто не вычитывал.

MiX
07.01.2019, 22:45
Именно 581РУx пока вроде никто не вычитывал.
Как и 588ВУх.

в двухтомнике Шахнова есть
Да, временная диаграмма на 180 странице.


Оригинальные CP1631-10 и CP1631-07
Хе-хе, похоже что ещё и "фрязинский" завод выпускал.
http://www.chipdb.org/data/media/1027/LSI_12_2_chips.jpg

P.S. Знаю что не фрязинский, просто логотип похожий. :)

bigral
08.01.2019, 02:09
P.S. Знаю что не фрязинский, просто логотип похожий. :)

блин неужели даже логотип украли с запада? гы гы

Vslav
01.02.2019, 00:18
Структурировал проект реплики 1801ВМ1, добавил поддержку платы DE1.
На плате DE0 (Циклон EP3C16-C7) частота достигла 111 МГц, на DE1 (EP2C20-C7) 85 МГц.
Сделана библиотечка модулей, совместимых с Wishbone - UART, timer, портируемая, общая для всех поддерживаемых плат.
Сделан системный контроллер клока и сброса (теперь есть имитация включения питания по долгому нажатию сброса, полностью изолированы тактовые домены - было пару триггеров, это кстати, привело к повышению Fmax).
Так и не смог заставить Quartus нормально генерировать память, в итоге получилось две ветки процессора, переключаемые по параметру компиляции, портабельная имеет параметры похуже чем специализированная с компонентом под конкретную FPGA, для Циклонов 2 и 3 эти компоненты уже написаны и протестированы.
Проект красиво оформлен на гитхабе (ссылка на первой странице темы).
Чуть-чуть осталось - добавить платы DE2-115 и AX309 и можно переходить к ВМ2 :)

Vslav
03.02.2019, 01:08
Чуть-чуть осталось - добавить платы DE2-115 и AX309 и можно переходить к ВМ2 :)

Добавлены DE-115 и AX309 (на Spartan-6), сделаны и протестированы модули регистрового файла на блочной памяти для Cyclone-4 и Spartan-6.

gid
04.02.2019, 09:37
Vslav, или ещё кто опытный, подскажите, что я делаю не так.
Никак не могу забирать изменения из репозиториев на гитхабе. git всегда говорит, что фатал, автоматический мержинг файлед, и сделать ничего не может. Приходится сперва удалять локальную копию и делать заново клон.
Может нужны какие-то хитрые ключи дополнительные? Я обычно использую команду git.exe pull --progress -v "origin", которая нормально забирает все изменения со всех реп, кроме Vslavовских.
В общем-то понятно, что судя по .gitattributes, там бинарники отмечены как текстовые файлы, и мержер на них споткнётся. Но readme.md смержить не может почему?

Vslav
04.02.2019, 11:31
Vslav, или ещё кто опытный, подскажите, что я делаю не так.
...
Но readme.md смержить не может почему?
Ты все делаешь так. Это меня на работе приучили достаточно вольно обращаться с гитом.
У меня в репке идут несколько параллельных проектов - ВМ1, ВМ2, итд. В бранчи их не засунешь, надо копипастить из одного в другой, да и не для того бранчи предназначены. Поэтому для изменения разных проектов собираю в отдельные коммиты - vm1: working commit, vm2: working commit и так далее. Потом когда их много накопилось я их сквошу в vm1: pre-release commit через интерактивный rebase и потом публикую push origin --force. Да, во всех книжках по гиту написано что так делать нельзя, но почти все в сложных проектах это периодически делают, а кто не делает - те давно на геррите сидят :). У меня контрибуторов других пока нет, поэтому для моего проекта это не критично вообще. Когда уже появляется уверенность что изменений не будет то этот коммит фиксируется как vm1: release 1.5a например (именно этот я собираюсь перезаписать, увы, обновились бинарники, жирно 30М лишних в репке держать).
Поэтому изменения надо забирать так:


git fetch --all
git reset --hard origin/master


На будущее - коммиты с тегами xxx: release x.x я буду стараться не изменять.
В итоге получится набор коммитов для нескольких проектов:
vm1: release 1.5a
vm2: release x.x
lsi: release x.x
vm2: release x.x
vm3: release x.x
vm1: working commit
lsi: working commit

PS. ВМ2 чуток позанимался, десяток ошибок в верилоге поправил, парочку на схеме, из сброса уже выходит, опрашивает блок прерываний, но следующую микрокоманду пока не стартует.

Vslav
05.02.2019, 18:23
Вчера исправил еще ошибок в верилоге и успешно йопуну на 1801ВМ2 прошел, сегодня вечером буду продолжать, чегой-то АЛУ мне не нравится.

Titus
05.02.2019, 20:47
Вчера исправил еще ошибок в верилоге и успешно йопуну на 1801ВМ2 прошел, сегодня вечером буду продолжать, чегой-то АЛУ мне не нравится.
Наверное уже скоро ВМ2 будет готов полностью? )

Vslav
05.02.2019, 21:36
Наверное уже скоро ВМ2 будет готов полностью? )
Не, там до лета работы. Пока просто оригинальная модель запускается, со всеми латчами и прочим. Еще тесты гонять, исходников 791402 нигде нету, придется разбирать, потом на синхронную модель переделывать для FPGA.... Много чего еще сделать надо, а времени свободного нету совсем.

Vslav
05.02.2019, 23:46
Сейчас такая последовательность микрокоманд формируется:


1 plm[000076] op2 word ac ACC ACC ------ y --- ----
2 plm[000056] op2 word ac ACC ACC ------ y --- runa
3 plm[000003] op1 word f1 *x PSW 000020 ------ ~y --- ----
4 plm[000042] op1 byte f1 *x QREG 000000 ------ x&y --- ----
5 plm[000037] op1 word f1 *x QREG vector 000000 x+y --- rdat
6 plm[000002] op2 word ac R7 QREG ------ y --- ----

1 - это вход после аппаратного сброса
2 - запуск безадресного чтения вектора начального пуска в буферный регистр данных Qreg
3 - сброс бита T (остальные биты по ходу устанавливаются)
4 - обнуление младшего байта вектора
5 - запуск чтения первого слова вектора
6 - копирование прочитанного в PC

Почему-то не проходит корректно запись в приемники данных.
Но видно что микрокоманды уже осмысленные идут, десятка два ошибок в верилоге поправил, думал уже совсем не взлетит.

PS. йопуна - это безадресное чтение, от сигнала IOP_UNA :)

gid
06.02.2019, 12:19
исходников 791402 нигде нету, придется разбирать
Я когда-то давно дизассемблировал 791402 в IDA. Только мне там всё равно ничего не понятно, поэтому я это просто забросил до лучших времён. Если надо, могу дать хоть идовский файл 791402.i64 (я использую IDA 5.0 x64, более новые смысла нету, там pdp-11 дизассемблируется нисколько не лучше), хоть сгенерированные листинг и асм.

Ещё, кстати, давно ещё, пытаясь разобраться с АЛУ ВМ1, путём всякого рода булевских преобразований, я получил более менее человекопонятный эквивалентный код АЛУ в верилоге.


//__________________________________________________ ____________________________
//
// Control and glue logic
//
assign wait_areg_free = ~plr[23] & (~plr[8] & ~plr[7]); //ожидать освобождения регистра A
assign wait_write_complete = ~plr[23] & ( plr[8] | plr[7]); //ожидать завершения записи на шине МПИ

//если qbus_adr и ожидать ожидать завершения записи на шине МПИ
//или dout_req и ожидать освобождения регистра A
//или ожидать чтение данных на шине МПИ и (TPLM == 2 или iak_flag)
assign alu_qrdy = ~( (qbus_adr & wait_write_complete) // wait for write complete
| (dout_req & wait_areg_free) // wait for areg free
| (~plr[10] & (tplm[2] | iak_flag)) ); // wait for data or vector fetch
........
........
........

//__________________________________________________ ____________________________
//
// ALU function unit
//

// plr[17:13] cl alu_a alu_b alu_c alu_d alu_e alu_x oxy axy h alu
// 00x00 0 ( 1 | 0 ) ( 1 | 0 ) 1 0 x&y x|y x^y x+y А
// 00x01 # 0 ( 1 | 0 ) ( 1 | 0 ) 1 0 x&y x|y x^y x+y А #
// 00x10 0 ( 1 | 0 ) ( 0 | 0 ) 0 0 x&y x x&~y x&~y Л
// 00x11 * 0 ( 1 | 0 ) ( 1 | 0 ) 1 0 x&y x|y x^y x+y А + сдвиг
// 01x00 1 ( 1 | 0 ) ( 1 | 0 ) 1 1 ~x&y ~x|y ~(x^y) y-x А
// 01x01 # 1 ( 1 | 0 ) ( 1 | 0 ) 1 1 ~x&y ~x|y ~(x^y) y-x А #
// 01x10 1 ( 1 | 0 ) ( 1 | 0 ) 0 0 x&y x|y x^y x^y Л
// 01x11 * 1 ( 1 | 0 ) ( 1 | 0 ) 1 1 ~x&y ~x|y ~(x^y) y-x А + сдвиг
// 10x00 0 ( 0 | 1 ) ( 1 | 0 ) 0 0 x&~y x|y y y Л
// 10x01 # 0 ( 0 | 0 ) ( 0 | 0 ) 0 0 0 x x x Л #
// 10x10 0 ( 0 | 0 ) ( 1 | 0 ) 0 0 0 x|y x|y x|y Л
// 10x11 * 0 ( 0 | 0 ) ( 0 | 0 ) 0 0 0 x x x Л + сдвиг
// 11x00 1 ( 0 | 1 ) ( 0 | 1 ) 1 0 x&~y x|~y ~(x^y) x-y А
// 11x01 # 1 ( 0 | 1 ) ( 0 | 1 ) 1 0 x&~y x|~y ~(x^y) x-y А #
// 11x10 0 ( 0 | 1 ) ( 0 | 0 ) 0 0 x&~y x x&y x&y Л
// 11x11 * 1 ( 0 | 1 ) ( 0 | 1 ) 1 0 x&~y x|~y ~(x^y) x-y А + сдвиг
//# - при этом ещё интерпретировать yreg как вектор или константу, а не номер регистра.

//
// ALU controls
//
assign cl_fc = plr[16] & ~(plr[17] & plr[14] & ~plr[13]); //флаг операции вычитания
assign alu_a_fc = ~plr[17]; //флаг прямого y в oxy
assign alu_b_fc = plr[17] & (plr[16] | ~(plr[14] | plr[13])); //флаг инверсного y в oxy
assign alu_c_fc = (plr[17] ^ plr[16]) & ~plr[13] | (~plr[17] & alu_e_fc); //флаг прямого y в axy
assign alu_d_fc = plr[17] & plr[16] & ~(plr[14] & ~plr[13]); //флаг инверсного y в axy
assign alu_e_fc = ~(plr[17] & ~plr[16] | plr[14] & ~plr[13]); //флаг арифметической, а не логической операции
assign alu_x_fc = ~plr[17] & plr[16] & ~(plr[14] & ~plr[13]); //флаг инверсного х
//
// ALU and/or products
//
assign nx = alu_x ? ~xreg : xreg;
assign oxy = nx & ((alu_a ? yreg : 16'o000000) | (alu_b ? ~yreg : 16'o000000));
assign axy = nx | ((alu_c ? yreg : 16'o000000) | (alu_d ? ~yreg : 16'o000000));
//
// ALU selectable function
//
assign h = oxy ^ axy;
// в продукции c каждый бит означает: 1 - при арифметической операции в этом разряде будет перенос. 0 - не будет переноса
assign c = cpred & axy | oxy;
assign cpred = {c[14:0], cl};
// если арифметическая операция, то cpred ^ h - получается арифметическая операция, иначе остаётся h - логическая операция
assign f = alu_e ? (cpred ^ h) : h;
// Вот так это реализуется на Си
// WORD tmp = ~((axy + oxy) + (cl ? 1 : 0));
// WORD c = (tmp & axy) | oxy; //определяем, будет ли перенос в данном разряде при сложении
// тут каждый бит в с означает: 1 - при арифметической операции в этом бите будет перенос. 0 - не будет переноса
// WORD cpred = (c << 1) | (cl ? 1 : 0);
// если арифметическая операция, то cpred ^ h - получается арифметическая операция, иначе остаётся h - логическая операция
// WORD f = alu_e ? (cpred ^ h) : h;


//
// ALU result shifter
//
assign alu_shift[1:0] = {plr[14], plr[13]}; //признак режима сдвига АЛУ, и частично - определитель, как интерпретировать шину Y

//plr[18] == 1 - словная операция, 0 - байтовая
//plr[27] == 1 - сдвиг вправо, 0 - влево
//plr[26:25] - режим сдвига АЛУ
// 00 - арифметический
// 01 - ещё какой-то особенный
// 10 - циклический
// 11 - нет сдвига, доп. операции
assign shift_code[1:0] = {plr[26], plr[25]}; //код вида сдвига
assign fctl[0] = (shift_code == 2'b00); //00 арифметический сдвиг
assign fctl[1] = (shift_code == 2'b01); //01 какой-то особенный сдвиг
assign fctl[2] = (shift_code == 2'b10); //10 циклический сдвиг

// 000 влево, в младший бит вдвигается 0, ASL
// 001 влево, в младший бит вдвигается 0, ASL
// 010 влево, в младший бит вдвигается С, ROL
// 011 нет сдвига, перестановка байт на входе АЛУ с шины X
// 100 вправо, старший бит копируется, ASR
// 101 вправо, в старший бит вдвигается перенос из старшего разряда АЛУ в текущей операции
// 110 вправо, в старший бит вдвигается C, ROR
// 111 нет сдвига
assign au_swapX = ~plr[27] & (shift_code == 2'b11) & (alu_shift == 2'b11); //011 - команда перестановки байтов на шине Х

assign alu_s_fc = (shift_code != 2'b11) & (alu_shift == 2'b11); //признак операции сдвига

assign fbitc = fctl[2] & gpr[14][0]; //если х10 (ROL,ROR), то берём бит C из PSW, иначе 0 (для ASL,ASR и оп. х01)
//а не надо ли тут для операции х01 брать c[0]?
//по аналогии со сдвигом вправо

//если словная операция, то f[8], чтобы при сдвиге не портилось слово.
//если байтовая, то зависит от кода сдвига
assign fbit7 = plr[18] ? f[8] : (fctl[0] & f[7] //арифметический сдвиг, байтовая операция
| fctl[1] & c[7] //сдвиг код 01, байтовая операция
| fbitc); //циклический сдвиг, байтовая операция)

//при байтовой операции старший байт значения не имеет, поэтому
//корректностью результата fbit15 можно пренебречь
assign fbit15 = fctl[0] & f[15] //арифметический сдвиг, любая операция
| fctl[1] & c[15] //сдвиг код 01, любая операция
| fbitc; //циклический сдвиг, любая операция

//если операция сдвига, то если сдвиг вправо, то двигаем по-отдельности байты, если сдвиг влево,
// то двигаем всё слово влево и в мл.бит или С или 0,
//если сдвига нету, то просто f как есть
assign alu = alu_s ? (plr[27] ? {fbit15, f[15:9], fbit7, f[7:1]} : {f[14:0], fbitc}) : f;

//если операция арифметическая, то если словная операция, то c[15] иначе c[7], для логической - 0
assign fmux[0] = alu_e & (plr[18] ? c[15] : c[7]); //перенос при арифметической операции
//если сдвиг вправо, то f[0], а если влево, то если словная операция то f[15], если байтовая, то f[7]
assign fmux[1] = plr[27] ? f[0] : (plr[18] ? f[15] : f[7]); //перенос при сдвигах
//будет ли переполнение в арифметической операции
assign fmux[2] = plr[18] ? (c[14] ^ c[15]) : (c[6] ^ c[7]);

//
// Флаги состояния результата операции АЛУ
//
//если сдвиг, то бит С - из f (результат сдвига), если нет, то результат арифметической операции
assign flag[0] = alu_s ? fmux[1] : (cl ? ~fmux[0] : fmux[0]) ; // C
//если байтовая операция, то старший байт игнорируем, иначе проверяем оба байта
assign flag[2] = (~plr[18] | (alu[15:8] == 8'o000)) & (alu[7:0] == 8'o000); // Z
//если словная операция, то бит 15 иначе бит 7 результата операции
assign flag[3] = plr[18] ? alu[15] : alu[7]; // N
//если операция сдвига, то по сути C ^ N или арифм переполнение. (как-то странно сложно)
//если не сдвиг, то если арифметическая операция, то арифметическое переполнение, иначе 0
assign flag[1] = alu_s ? ((fmux[1] ^ flag[3]) | fmux[2]) : (alu_e & fmux[2]); // V


//
// Original strobes:
//
// assign au_astb = (au_alsl & ~(~plr[14] & plr[13]) & ~plr[23] & (plr[7] | plr[8]))
// | ( ustb & (~plr[14] & plr[13]) & ~plr[23] & (plr[7] | plr[8]));
// assign au_qstbx = (au_alsl & ~(~plr[14] & plr[13]) & ~plr[23] & ~plr[7] & ~plr[8])
// | ( ustb & (~plr[14] & plr[13]) & ~plr[23] & ~plr[7] & ~plr[8]);
//
assign wire3 = (alu_shift == 2'b01) ? ustb : au_alsl;
//если wire3 и ожидать завершения записи на шине МПИ
assign au_astb = wire3 & wait_write_complete; //признак записи результатов в регистр адреса А
//если wire3 и ожидать освобождения регистра A
assign au_qstbx = wire3 & wait_areg_free; //признак записи результатов в регистр Q

//
// X bus (12 entries)
// AU_RSX0 - general purpose regs
// AU_RSX1 - general purpose regs
// AU_QSX - qbus temporary reg
// AU_PSWX - PSW
//
// AU_ALSx - ALU result strobe (writeonly)
// AU_ASTB - A address register (readonly)
// AU_ASTB - A address register (readonly)
// AU_QSTBX - Qbus temporary reg (readonly)
// AU_QSTBX - Qbus temporary reg (readonly)
// AU_IS0 - ALU X argument (readonly)
// AU_IS1 - ALU X argument (readonly)
//
// Y bus, inverted (9 entries)
// AU_RSY0 - general purpose regs
// AU_RSY1 - general purpose regs
// AU_QSY - Qbus temporary reg
// AU_PSWY - PSW
//
// AU_ALSx - ALU result strobe (writeonly))
// AU_VSELY - vector generator (Y-writeonly)
// AU_CSELY - constant generator (Y-writeonly)
// ALU_U - ALU Y argument (readonly)
//
assign x = au_alsl ? (au_alsh ? alu : {8'o000, alu[7:0]}) : xr;
assign y = yr;
//флаг завершения операций в АЛУ и что надо сохранять результаты
assign alu_op_complete = alu_busy_rp & ustb_h;

always @(posedge pin_clk_n)
begin
//
//фиксируем для АЛУ входные параметры с шин X и Y
//
xreg <= au_swapX ? {x[7:0], x[15:8]} : x; //если надо - переставим байты местами
yreg <= y;
//фиксируем условия работы АЛУ
cl <= cl_fc;
alu_a <= alu_a_fc;
alu_b <= alu_b_fc;
alu_c <= alu_c_fc;
alu_d <= alu_d_fc;
alu_e <= alu_e_fc;
alu_x <= alu_x_fc;
alu_s <= alu_s_fc;
//
// ALU general purpose registers
//
//надо сохранять младший байт результата работы АЛУ
au_alsl <= alu_op_complete;
//а если была словная операция - то и старший байт
au_alsh <= alu_op_complete & plr[18];

if (au_astb)
//сохраняем в регистре адреса A текущее содержимое шины X
areg <= x;
end

always @(posedge pin_clk_p)
begin
if (au_alsl) //если операции в АЛУ завершились
freg <= flag; //то фиксируем флаги
end
в этом коде многое инвертировано, в результате шина Y и всё, что с ней связано, получается инвертированным, и нужно ещё в других местах это учесть. Не знаю, как насчёт нужности и полезности на практике, но оно в симуляции работало.

Vslav
06.02.2019, 15:00
Интересно было посмотреть на реализацию, спасибо.
От 791402.idb не отказался бы, все лучше чем голый старт.

gid
06.02.2019, 15:59
Вот 67985

Vslav
07.02.2019, 01:56
Поехал процессор, прочитал начальный вектор, перешел правильно, начал выполнять команды теста вычисления пи, потом где-то упал и стал постоянно чего то с тайм-аутом шины вычитывать. Время запускать 791401 для отладки :)

MM
08.02.2019, 04:01
Время запускать 791401 для отладки
Посоветую "ПЗУ" 055 с расставленными точками останова ( точки ставить в DESS ).
А потом можно плавно переходить к загрузке RT-11 или даже ТМОС.

Vslav
08.02.2019, 20:24
В это сложно поверить, но асинхронная модель 1801ВМ2 прошла заводские тесты 791401 (основные арифметические операции) и 691404 (прерывания и исключения):
- выложил на гитхабе (ссылки в первом посте темы)
- выгрузил все CAD файлы в отдельную репку и сделал ее гит-подмодулем с именем cad11
- репка стала всего 13 мегабайт и исходники и CAD файлы теперь можно выкачивать отдельно
- по факту проект теперь разбит на две репки, одна включена в другую, и можно работать независимо
- теперь можно не злоупотреблять git push origin --force чтобы убирать лишние версии больших CAD файлов

Есть еще странности, почему-то перед прерываниями и исключениями (типа emt) читает безадресно вектор начального пуска.
Для halt и тайм-аутов шины оно так и должно быть, но для обычных векторных прерываний вроде бы нет.

Vslav
13.02.2019, 22:35
1801ВМ2, версия 1.0а:
- пока только асинхронная оригинальная модель, максимально приближена к схеме
- проходит тесты:
- 791401 (базовые команды)
- 791402 (расширенная арифметика - ash, ashc, mul, div)
- 691404 (прерывания и исключения)
- известных на данный момент несоответствий нет

Дополнительно:
- ВМ2 перед каждым прерыванием выполняет безадресное чтение, включая программные. Это написано в документации, на реальном процессоре не проверял.
- ошибку с предвыборкой на модели воспроизвести не удалось, возможно версия кристалла ТР4 ее не содержит, или я тест не смог правильно сообразить. Мой вариант теста смотреть в tst/pcbug.mac

MiX
13.02.2019, 22:46
возможно версия кристалла ТР4 ее не содержит
Это похоже Солнечногорский кристалл. Проверяйте Ангстремовский.

Alex_K
13.02.2019, 23:07
- ошибку с предвыборкой на модели воспроизвести не удалось, возможно версия кристалла ТР4 ее не содержит, или я тест не смог правильно сообразить. Мой вариант теста смотреть в tst/pcbug.mac
Вроде бы, чтобы ошибка была, надо чтобы после выставления сигнала DIN, сигнал RPLY приходил более чем через четыре такта.

- - - Добавлено - - -

Ещё небольшой тестик:


MOV #1,R0
MOV #2,R1
MOV #LABEL,R2
INC R2
MOV #010104,R3
MOV R3,@R2
LABEL: MOV R0,R4
HALT

Какое значение окажется в R4?

Vslav
13.02.2019, 23:22
MOV #1,R0
MOV #2,R1
MOV #LABEL,R2
INC R2
MOV #010104,R3
MOV R3,@R2
LABEL: MOV R0,R4
HALT
Какое значение окажется в R4?

R4 = 1
Запись по нечетному адресу R2 в память прошла не только после предвыборки, но и регистр инструкций успел загрузить и исполнить mov R0, R4.
Оригинальный Вм2 тоже так делает? Там есть компаратор адреса записи, но тут он никак не успел ничего сделать.

Update: Успел бы, но.. Компаратор квадратный, сравниваются все 16 бит PC=RA, нечетный адрес записи обходит компаратор и сброс предвыборки не запускается, лол.

Alex_K
13.02.2019, 23:32
R4 = 1
Запись по нечетному адресу R2 в память прошла не только после предвыборки, но и регистр инструкций успел загрузить и исполнить mov R0, R4.
Оригинальный Вм2 тоже так делает? Там есть компаратор адреса записи, но тут он никак не успел ничего сделать.

Ы-ы-ы, компаратор квадратный, сравниваются все 16 бит PC=RA, нечетный адрес записи обходит компаратор и сброс предвыборки не запускается, лол.
Да, оригинальный ВМ2 делает так же. Если бы не было команды INC R2, то предвыборка сбросилась бы.

Vslav
13.02.2019, 23:44
Вроде бы, чтобы ошибка была, надо чтобы после выставления сигнала DIN, сигнал RPLY приходил более чем через четыре такта.

Есть! Задержал RPLY на 6 тактов CLKI и команда следующая за mov @PC, R4 выполнилась дважды. Регистр инструкций дважды загрузился кодом inc R0 и она дважды выполнилась. В-общем, "солнечногорский" ТР4 тоже с глюком и на модели он подтверждается.

Alex_K
13.02.2019, 23:48
Есть! Задержал RPLY на 6 тактов CLKI и команда следующая за mov @PC, R4 выполнилась дважды. Регистр инструкций дважды загрузился кодом inc R0 и она дважды выполнилась.
В-общем, "солнечногорский" ТР4 тоже с глюком и на модели он подтверждается.
Да, этот глюк довольно многогранный, всё еще зависит от команды, которая находится после MOV @PC,. Тогда с Patron много тестов делали, можно посмотреть, почитать.

Vslav
14.02.2019, 00:08
При медленном RPLY происходит следующее:
- начинает исполняться mov @PC, R4, и в самом начале кастуется префетч (pc2)+ (чтение из памяти) следующей инструкции (inc R0), pc = .+2, pc2 = .+4
- длится чтение из памяти, и в ходе выполнения оно решает откатить pc2 = pc, и это и есть баг
- инструкция заканчивается, префетч заканчивается и на начинает исполняться
- и запускает новый префетч, как обычно (pc2)+, и это будет снова inc R0 :)

- - - Добавлено - - -

Ошибка в запуске чтения данных, там микрокод запускать АЛУ(X=R7, Y=R2, F=X) с записью обратно по шине X, этот строб записи в PC одновременно пишет и в PC2 (так он подвязан).

# plm[77->55] op2 word fr *x **** R7 R2 ------ x --- rdat 000462 000462 000464 ir:011704 7 4 60
То есть получаем:
ALU output = PC;
RA = ALU out;
PC = ALU out;
PC2 = ALU out;
Можно пофиксить при желании.

ra3qdp
14.02.2019, 23:41
1801ВМ2 это просто модернизированный ВМ1 или полностью заново разработанный процессор ?

Vslav
15.02.2019, 11:57
1801ВМ2 это просто модернизированный ВМ1 или полностью заново разработанный процессор ?
Примерно как 80186. Это новый процессор или модернизированный 8086 ? :)
Общего с ВМ1 у ВМ2 очень много, архитектура похожая. Добавлен предварительный декодер инструкций, соответственно микрокод стал другим, добавлена сложная предвыборка, добавлен блок расширенной арифметики. Все это не совсем косметические изменения, имхо.

ra3qdp
15.02.2019, 12:27
Примерно как 80186. Это новый процессор или модернизированный 8086 ? :)
Общего с ВМ1 у ВМ2 очень много, архитектура похожая. Добавлен предварительный декодер инструкций, соответственно микрокод стал другим, добавлена сложная предвыборка, добавлен блок расширенной арифметики. Все это не совсем косметические изменения, имхо.
"ширина"(разрядность) микрокода изменилась ?
блок расширенной арифметики - это логический блок или микропрограмная реализация ?

Hunta
15.02.2019, 13:29
"ширина"(разрядность) микрокода изменилась ?
Если бы внимательно читали ветку, то знали бы - то, что реализовано в ВМ1 - сложно назвать микрокодом, в отличии от ВМ2
https://zx-pk.ru/threads/23978-tsifrovaya-arkheologiya-1801-i-vse-vse-vse.html?p=993768&viewfull=1#post993768

Vslav
15.02.2019, 14:39
"ширина"(разрядность) микрокода изменилась ?
Изменилась, часть полей поменяла назначение, изменилось количество стадий (предекодер появился), ну и это все та же ПЛМ, понятие микрокод чоень условно.


блок расширенной арифметики - это логический блок или микропрограмная реализация ?

Блок это блок, логический, предоставляет пару дополнительных регистров и счетчик. Но работает (управляется) микропрограммой. И может управлять АЛУ совместно с микропрограммой, при выполнении операций расширенной арифметики.

ra3qdp
16.02.2019, 00:01
выходит, что ВМ1 и ВМ2 по устройству микропрограммного управления организованы одинаково и расширенная арифметика - микропрограммная, а не аппаратная.
Кстати - видел формат микропрограмм в котором в каждой команде в явном виде указан адрес следующей микропрограммы. Не зная этого, глядя на схему тоже может показаться.

Vslav
16.02.2019, 18:48
Пофиксил я баг с предвыборкой. Оказалось что оно достаточно критично с скорости шины,
100МГц процессор на SDRAM будет на эту проблему попадать, фикс необходим.

; В процессоре 1801ВМ2 есть ошибка микрокода, наблюдается при следующих условиях:
; - выполняется двухадресная команда
; - источник имеет метод адресации @PC (17 восьмеричное)
; - приемник не имеет индекс, использующий PC (x7)
; - приемник не использует дополнительные слова инструкции (E(Rn), @E(Rn))
; - предвыборка из памяти достаточно медленная (много тактов до RPLY)
; и не успевает завершиться до момента обработки выборки источника
;
; В момент выборки источника происходит передача адреса из регистра PC
; в регистр адреса для выполнения транзакции чтения @PC, при этом PC выдается
; на шину X АЛУ, код операции АЛУ равен X (просто транслировать аргумент X
; на выход) с обратной записью результата в PC/PC1/PC2 (одновременно). При
; этом PC2 получает старое значение PC (PC2 уже был обновлен при запуске
; предыдущей предвыборки PC+2). Если в этот момент предыдущая предвыборка
; на завершена, микрокод не будет рестартовать предвыборку кодом ЧК (io_cmd,
; чтение команды) и извлечение последующих команд будет происходить по
; неверному отстающему значению PC2. Если же предвыборка успела завершиться
; до модификации PC, то микрокод рестартует новую превыборку по PC2 с
; признаком ЧК и далее исполнение команд будет корректны
;
; Предложен и реализован фикс, при выполнении двухадресных команд с методом
; адресации источника @PC и не использовании PC в приемнике, а также
; отсутствии дополнительных слов в инструкции, блокировать запись в PC2,
; тем самым позволяя корректно продолжать предвыборку. Метод более простой
; и предсказуемый с ограниченной областью действия, по сравнению с модификацией
; микрокода и рестартом предвыборки по признаку ЧК (io_rcd)

Может быть позже попробую модифицировать микрокод чтобы он явно рестартовал
предвыборку при адресации источника @PC в двухадресных командах. Запретить запись
PC2 в микрокоде достаточно сложно - придется PC куда-то предварительно копировать
или менять адрес получателя результата АЛУ.

MiX
16.02.2019, 19:52
Пофиксил я баг с предвыборкой. Оказалось что оно достаточно критично с скорости шины,
Сигнал AR как-то влияет?

Vslav
16.02.2019, 20:09
Сигнал AR как-то влияет?
Теоретически должен влиять, так как снижает скорость шины. Для микропрограммного автомата неважно где циклы потеряны - на AR или RPLY.

Alex_K
17.02.2019, 00:06
В теме "Расчёт точного времени выполнения команд различными процессорами архитектуры PDP-11 (https://zx-pk.ru/threads/14702-raschjot-tochnogo-vremeni-vypolneniya-komand-razlichnymi-protsessorami-arkhitektury-pdp-11.html)" начиная со страницы 19 (https://zx-pk.ru/threads/14702-raschjot-tochnogo-vremeni-vypolneniya-komand-razlichnymi-protsessorami-arkhitektury-pdp-11/page19.html) обсуждался глюк с адресацией @PC. Много различных тестов.
P.S. Свои рисунки восстановил.

Vslav
17.02.2019, 00:31
Картинки, увы, все еще недоступны. Читал я ту тему, не очень информативно, подробности выискивать приходится, многие ссылки протухшие. А можно все обнаруженные проблемные инструкции в одном месте собрать? Я бы свое исправление потестировал. Или ничего кроме двухадресных с источником @PC не получилось обнаружить?

Alex_K
17.02.2019, 00:43
Картинки я восстанавливал только с 19-й по 29-ю страницы, ссылки на облако Mail.RU. По данному глюку только адресация @PC в качестве источника в двухадресных командах. По поводу информативности - проблема была обнаружена и исследовалась методом научного тыка с построением различных гипотез. А из команд - есть команда с кодом 030 в режиме HALT. Что она делает описано в моем руководстве по процессору. Естественно алгоритм её исполнения также исследовался методом научного тыка, но вроде всё сходится.
В процессоре 1806ВМ2 этих глюков уже нет.