Просмотр полной версии : Реверс-инжиниринг УКНЦ (1515ХМ1&2, 1801ВП1, 1801ВМ2)
Страницы :
[
1]
2
3
4
5
6
7
5 лет назад (нифига себе время летит), в теме Цифровая археология: 1801 и все-все-все (https://zx-pk.ru/threads/23978-tsifrovaya-arkheologiya-1801-i-vse-vse-vse/page18.html) с легкой руки нашего замечательного специалиста Vslav'a, я начал заниматься реверсом 1515ХМ2-001 (https://ru.wikipedia.org/wiki/1515%D0%A5%D0%9C1) (Обновленная версия КА1515ХМ1-031, с исправленными ошибками (https://zx-pk.ru/threads/20673-chem-otlichalis-ka1515khm1-031-i-1515khm2-001.html)). В ней находится звук, таймер, контроллер клавиатуры от всеми нами любимой УКНЦ. Отреверсив около 25% чипа, я забросил это дело на неопределенный срок, и подняв недавно материалы, обнаружил, что многое подзабылось, а заметки, сделанные по данному проекту, слишком лаконичны, чтобы легко вьехать в тему снова. Поэтому прежде всего я решил формализировать то, что наработал тогда, и перевести заметки в легко понимаемый вид.
https://pic.maxiol.com/images2/1573293706.1504841820.logic.png
Триггеры:
https://pic.maxiol.com/images2/1573294038.1504841820.dtriggerone.pnghttps://pic.maxiol.com/images2/1573294216.1504841820.dtriggeroner.pnghttps://pic.maxiol.com/images2/1573294411.1504841820.dtriggerones.pnghttps://pic.maxiol.com/images2/1573294449.1504841820.dtriggeredger.pnghttps://pic.maxiol.com/images2/1573294518.1504841820.dtriggeredges.pnghttps://pic.maxiol.com/images2/1573294540.1504841820.dtriggeredgers.png
https://pic.maxiol.com/images2/1573295237.1504841820..png
Архив с оригинальным и оптимизированным реверсом 1515ХМ1,2 для P-CAD качать здесь. (https://yadi.sk/d/fMu4EZT0IzbOvg)
Очень занимательно.
Потом тогда можно ее в ПЛИС запихнуть :)
Очень занимательно.
Потом тогда можно ее в ПЛИС запихнуть :)
Я думаю, да. Хотя я чисто эмуляторщик, а не ПЛИС'щик.
ВМ2 в верилоге у нас есть благодаря Vslav'у. И некоторые другие чипы от УКНЦ отреверсены.
А вот таймер на УКНЦ всегда был черным ящиком со множеством непонятных нюансов. И без реверса его никак не повторить.
NEO SPECTRUMAN
13.10.2019, 14:55
Итак, под спойлером:
за одно
запили "словарик" для желающих реверсить :v2_dizzy_vodka3:
ато принципиальные схемы элементов вроде как есть по разным местам
https://upload.wikimedia.org/wikipedia/commons/a/ab/NMOS_NOR.png
как может выглядить отдельный транзистор (вид сбоку) тожо везде есть
а вот как это безобразие в сборе обычно выглядит на фотках сверху чот не особо то много есть
https://upload.wikimedia.org/wikipedia/commons/a/aa/NOR_gate_layout.png
ато принципиальные схемы элементов вроде как есть по разным местам
Твои вентили - это Н-МОП технология. А в 1515ХМ2 - К-МОП.
Потом тогда можно ее в ПЛИС запихнуть
Можно сделать даже комби-вариант - по аналогии с 1201.2018 - вся логика внутри FPGA, снаружи два ВМ2
- - - Добавлено - - -
Вдогонку - плюс этого варианта - можно поставить ОДНУ восьмибитную ЭСППЗУ - и не гонятся за шестнадцатибитными
NEO SPECTRUMAN
13.10.2019, 15:31
Твои вентили - это Н-МОП технология. А в 1515ХМ2 - К-МОП.
в педивикиях местами по 5 вариантов
включая вообще варианты на одних диодах по моему...
- - - Добавлено - - -
это Н-МОП технология
а я совсем не умею читать :)
- - - Добавлено - - -
а так я не имею малейшего понятия
чего ожидать под каплей
дайшоты тожо неизвестно когда предвидятся...
Подьехал D-Тиггер B - самый сложный из всех элементов в данной БМК. В отличие от D-Триггера A, он защелкивает сигнал не по уровню CLK, а по фронту.
Добавил в первый пост все распознанные базовые логические элементы при реверсе 25% схемы.
Интересный победитель в номинации 'нерациональная избыточность'.
Мало того, что есть транзисторы, посаженные затворами на плюс. Так еще и в целом транзисторов значительно больше, чем надо для реализации данной логической ячейки.
http://b.radikal.ru/b35/1910/d3/8f41a55b6409t.jpg (http://radikal.ru/big/jgra7v9hgappk)
Интересно, что в 1515ХМ2-001 (в отличие от, например, -003) занята логическими ячейками абсолютно вся рабочая площадь кристалла. Ни единого свободного местечка не осталось. Внимание, вопрос - как можно было так впихнуть четко заданную схему в стандартный кристалл, чтобы занять ровно-ровно всю площадь?
посаженные затворами на плюс.
Это просто еще один дополнительный логический вход на который подали "высокий".
Я бы сказал что это часть ячейки 629.
Интересно, что в 1515ХМ2-001 (в отличие от, например, -003) занята логическими ячейками абсолютно вся рабочая площадь кристалла.
Ни единого свободного местечка не осталось. Внимание, вопрос - как можно было так впихнуть четко заданную схему в стандартный кристалл, чтобы занять ровно-ровно всю площадь?
XM2 это не БМК, это полноценный ASIC, хотя и построенный на библиотеке ячеек от ХМ1. Поэтому ХМ2 не имеет сформированный матрицы ячеек, и размер кристалла можно изменять динамически. Логично, что схема занимает весь кристалл, а бомба всегда падает в эпицентр :)
PS. Надо в пикаде создать библиотеку ячеек, с реальной топологией, а не просто УГО, там все для этого есть. И нумерацию распознать и писать выводы как в книжке - это отличная база.
XM2 это не БМК, это полноценный ASIC, хотя и построенный на библиотеке ячеек от ХМ1. Поэтому ХМ2 не имеет сформированный матрицы ячеек, и размер кристалла можно изменять динамически. Логично, что схема занимает весь кристалл, а бомба всегда падает в эпицентр
Я тоже подумал, что только такой ответ и остается.
Нет ли фотки хотя бы кусочка ХМ1, чтобы посмотреть, чем они отличаются?
- - - Добавлено - - -
PS. Надо в пикаде создать библиотеку ячеек, с реальной топологией, а не просто УГО, там все для этого есть. И нумерацию распознать и писать выводы как в книжке - это отличная база.
А смысл? Для составления схемы мне УГО полностью хватает.
- - - Добавлено - - -
Это просто еще один дополнительный логический вход на который подали "высокий".
Я бы сказал что это часть ячейки 629.
Кстати, мы эту ячейку уже обсуждали в другой теме, она входит в состав управляемого делителя частоты на 2.
http://s019.radikal.ru/i637/1412/99/d30c8a38765f.png
Хотя, думали, что это одновибратор.
Нет ли фотки хотя бы кусочка ХМ1, чтобы посмотреть, чем они отличаются?
Увы, микроскоп сейчас разобран. XM1 выглядит в масштабе примерно как 1801ВП1 - заранее сформированная матрица ячеек, а схема реализуется в слое металла.
XM2 же выглядит как набросанные ячейки, а не матрица одинаковых.
А смысл? Для составления схемы мне УГО полностью хватает.
Смысл что время бежит быстро, а ты идешь очень сложным и затратным путем.
А я давно тебе предлагаю облегчить жизнь :)
И к тому же ты изобретаешь велосипед - ячейки с готовой цоколевкой описаны в книжки, а ты придумываешь свои обозначения.
Кстати, мы эту ячейку уже обсуждали в другой теме, она входит в состав управляемого делителя частоты на 2.
Скорее всего этот делитель и есть комбинация ячеек а не одна специальная (dedicated) ячейка.
Посмотрел что у меня осталось от 1515:
- 4 шт 1515ХM1-32
- 1 шт 1515ХМ1-31
Есть еще какие-то открытыте кристаллы, но они грязные, часть поколотые - очень плохо оно в димесульфиде вскрывалось.
Увы, микроскоп сейчас разобран. XM1 выглядит в масштабе примерно как 1801ВП1 - заранее сформированная матрица ячеек, а схема реализуется в слое металла.
XM2 же выглядит как набросанные ячейки, а не матрица одинаковых.
Это очень хорошо, что ячейки в ХМ1 прибиты намертво. Значит достаточно один раз нарисовать шаблон с ними, а потом просто соединять в зависимости от версии кристалла.
Смысл что время бежит быстро, а ты идешь очень сложным и затратным путем.
А я давно тебе предлагаю облегчить жизнь
И к тому же ты изобретаешь велосипед - ячейки с готовой цоколевкой описаны в книжки, а ты придумываешь свои обозначения.
Как я уже говорил - для меня это единственный интересный путь.
Ячейки из книжки довольно условно совпадают с теми, что я нахожу здесь. Поэтому нет смысла подписывать цоколевку по книжке. Да подпиши я ячейки так же, как в книжке, это бы не ускорило мою работу, а скорее наоборот. Поэтому, для себя я иду наиболее простым путем. В пикаде составил библиотеку ячеек, кидаю их на схему и соединяю. Все просто. Вчера целый столбец доделал, примерно 60 ячеек. Уже 5 из 19 столбцов готово.
- - - Добавлено - - -
Скорее всего этот делитель и есть комбинация ячеек а не одна специальная (dedicated) ячейка.
Как раз специальная. Т.е. она составлена из отдельных ячеек, но видно, что это цельный шаблон, и имеет связи между собой внутри тела ячеек, а не дорожками вокруг.
- - - Добавлено - - -
Скорее всего этот делитель и есть комбинация ячеек а не одна специальная (dedicated) ячейка.
Как раз специальная. Т.е. она составлена из отдельных ячеек, но видно, что это цельный шаблон, и имеет связи между собой внутри тела ячеек, а не дорожками вокруг.
У меня ещё вопрос, а после составления схемы как будет проходить верификация?
Это же не проц на котором можно просто имеющиеся тесты прогнать.
Встретился удивительный D-триггер не имеющий ни входа S, ни R. Т.е. его нельзя предустановить подобным способом.
- - - Добавлено - - -
У меня ещё вопрос, а после составления схемы как будет проходить верификация?
Это же не проц на котором можно просто имеющиеся тесты прогнать.
Я думаю, что тоже можно написать специальные тесты.
У меня уже были тесты для проверки и детектирования ХМ1/ХМ2 таймера.
А если знать точную структуру, то и точный тест написать можно.
Встретился удивительный D-триггер не имеющий ни входа S, ни R. Т.е. его нельзя предустановить подобным способом.155ТМ5, 155ТМ7
155ТМ5, 155ТМ7
Не в том плане, что они уникальны, а в том, что не очень хорошо, когда есть ячейки, которые не сбрасываются по ресету, и могут находиться в произвольном состоянии. Но надо смотреть, как они включены в схеме целиком, разумеется.
Значит достаточно один раз нарисовать шаблон с ними
Нет. Один раз можно сделать предварительную разметку в топологии, согласно моему подходу. А у тебя не получится нарисовать сетку, потому что УГО-шки все сильно разные, и они должны следовать логике схемы, а не физическому размещению, иначе схема вырвиглазная будет. Собственно для 1801ВП1 я сетку и нарисовал в топологии, берешь новую микросхему ВП1, натягиваешь на секту за пару часов, еще часов 10-20 рисовка топологии, абсолютно без напряга, мимодумно, потом еще часов 10 накидываешь ячейки из библиотеки (ага, 300-400 шт), и опа - получается готовая вырвиглазная схема, но все проводники уже подключены, остается только медитировать, осознавать и приводить схему в нормальное состояние. С автоматической верификацией LVS (layout vs schematic). И это все на потоке - одинаково для всей серии.
Как я уже говорил - для меня это единственный интересный путь.
Это очень тяжелый путь. Так ты еще 6 микросхем ХМ1 планируешь, тут как раз автоматизация нужна, а у тебя совсем уж "закат солнца вручную". Реверс жрет дохрена времени, а уж если путь сознательно удлинят....
Ячейки из книжки довольно условно совпадают с теми, что я нахожу здесь.
Я не знаю насчет 1515, и особенно ХМ2, но для серии 1801 ячейки совпали все. Было с полдюжины опечаток, но все разрулилось.
Поэтому нет смысла подписывать цоколевку по книжке.
Был такой мужик - Ричард Фейнман. Профессор физики, дважды нобелевский лауреат, и вообще - умный человек, автор книжки "Вы, конечно, шутите, мистер Фейнман". В школе он увлекся математикой и не понравилась ему стандартная математическая нотация. Изобрел свою, типа ему удобную и вовсю ей пользовался. И тут понадобилось ему задачку с одноклассниками обсудить, начал он свои закорючки писать - и не понял его никто. Дик был парень умный, выводы сделал быстро, и далее стал использовать стандартную нотацию :)
Это притча такая, о пользе принципа "to be on the same page"
В пикаде составил библиотеку ячеек, кидаю их на схему и соединяю.
А на топологию кидать еще проще. С автоматическим соединением цепей - кинул, и все само прицепилось, ага.
ет. Один раз можно сделать предварительную разметку в топологии, согласно моему подходу. А у тебя не получится нарисовать сетку, потому что УГО-шки все сильно разные
Для такого случая можно нарисовать одинаковые.
Словом, мне сложно что-то сказать о ХМ1, т.к. я их попросту не видел.
- - - Добавлено - - -
накидываешь ячейки из библиотеки (ага, 300-400 шт), и опа - получается готовая вырвиглазная схема, но все проводники уже подключены, остается только медитировать, осознавать и приводить схему в нормальное состояние.
Вполне верю, что твой подход более быстрый. Но раз уж я начал эту микросхему так, нет смысла на пол-дороге менять коней.
Да, и ячеек тут >1100, а не 300-400. Да и ложатся сразу в читабельном и понятном глазу виде. А если накиданы абстрактные топологические, то их еще, наверное, придется какое-то время в порядок приводить, чтобы схема стала читабельной.
- - - Добавлено - - -
В школе он увлекся математикой и не понравилась ему стандартная математическая нотация. Изобрел свою, типа ему удобную и вовсю ей пользовался. И тут понадобилось ему задачку с одноклассниками обсудить, начал он свои закорючки писать - и не понял его никто. Дик был парень умный, выводы сделал быстро, и далее стал использовать стандартную нотацию
Это притча такая, о пользе принципа "to be on the same page"
Я бы не сказал, что это мой случай) Я использую самую, что ни на есть стандартную систему обозначений, которая понятна любому школьнику. А то, что промежуточные этапы у тебя одни, у меня другие - на вид конечного продукта не влияет.
- - - Добавлено - - -
6 столбцов из 19!
Жопа только в том, что если по высоте (максимально допустимой в PCAD) все элементы вмещаются, то по ширине на одном листе уместится только 10-11 столбцов из 19. А на другой лист переносить кучу связей это брррр! Лишает всякой наглядности. И как расширить лист по ширине более, чем 60000.0mil, вряд ли это возможно.
Понятно, что надо было сразу рисовать в более мелком масштабе, но кто же знал, что не поместится)
Доделал 7-й ряд из 19.
На всякий случай вот (https://yadi.sk/d/4GFatXGXSRdDLA) схема, чтобы не потерялась.
- - - Добавлено - - -
Глянул фотки 1801ВП1, которые выкладывал Vslav.
Как там можно разглядеть ячейки? Качество фоток такое, что глаза сломаешь. Не сравнить с фотками ХМ1515. Хорошо, что 1801ВП1 уже все отреверсены.
Ну и ячеек там штук 300, а в ХМ1515 раза в 4 больше.
155ТМ5, 155ТМ7
это не триггера. Это защелки, latch у буржуев
- - - Добавлено - - -
могу дать на реверс ХМ2-001 ХМ2-003
ХМ1-136 нет лишних
могу дать на реверс ХМ2-001 ХМ2-003
ХМ1-136 нет лишних
ХМ2-001 и ХМ2-003 уже сфотографированы хорошо.
Остальных нет.
Вот схема в формате pdf (пока что это только 1/3).
Можно я немножко пропиарюсь? ;-)
Подскажите какие еще бывают 1515хм http://oldpc.su/articles/re2/1515.html
Сегодня 8 столбцов из 19.
Интересные встретились в этот раз аналоговые, вернее двунаправленные мультиплексоры, которые стоят не в составе D-триггеров (как обычно), а уже по прямому своему назначению - переключать источники сигнала. (мультиплексоры в столбец не вошли, т.к. вставил позже).
Работы было поменьше, т.к. в этом ряду куча триггеров, а они сочетают в себе по 4-6 ячеек, что разрежает схему и ускоряет реверс.
- - - Добавлено - - -
Интересно, что означает выход EP, который на схеме УКНЦ никуда не подключен?
И зачем на линии OUT4 (/ALCO) - резистор?
Схема конечно вырви-глаз, на на выходах X из кучи элементов виден дешифратор. Также линии Y действительно являются входами-выходами, режим переключается битом 8 в регистре 0177700, а данные для вывода записываются в регистр 0177704, естественно в ТО это не отражено.
P33 = выход X0, P61 = вход EXT, P62 = выход OUT4.
- - - Добавлено - - -
Интересно, что означает выход EP, который на схеме УКНЦ никуда не подключен?
Это как раз вывод режима линий Y, фактически значение бита 8 регистра 0177700. Данная линия используется в СЭМЗ-овской схемотехнике для настройки скорости последовательного порта.
P33 = выход X0, P61 = вход EXT, P62 = выход OUT4.
Это я уже позже подписал, когда мультиплексоры дорисовывал, просто не стал заново pdf делать)
Можно кратко обрисовать назначение выводов ХМ2-001?
- - - Добавлено - - -
Также линии Y действительно являются входами-выходами, режим переключается битом 8 в регистре 0177700, а данные для вывода записываются в регистр 0177704, естественно в ТО это не отражено.
Эта информация может быть чем-то полезна нам?
- - - Добавлено - - -
Схема конечно вырви-глаз
Разумеется, схему нужно будет потом причесать. А сейчас она повторяет топологию кристалла.
Эта информация может быть чем-то полезна нам?
А как же, делаешь реверс-инжиниринг, разбираешься в схеме, а там в есть регистры и битики в регистрах, которые в ТО не описаны.
А как же, делаешь реверс-инжиниринг, разбираешься в схеме, а там в есть регистры и битики в регистрах, которые в ТО не описаны.
Я имею в виду - информация о двунаправленности Y.
Я имею в виду - информация о двунаправленности Y.
В КВАНТ-овской схемотехнике это не используется, а в СЭМЗ-овской можно переключать скорость последовательного порта.
- - - Добавлено - - -
Можно кратко обрисовать назначение выводов ХМ2-001?
1 - выход SND, выход звука, формируется битами 7-12 регистра 0177716
2 - вход-выход IO1, бит 4 регистра 0177716
3 - вход-выход IO2, бит 5 регистра 0177716
4 - выход OUT3, бит 3 регистра 0177716
5 - выход OUT2, бит 2 регистра 0177716
6 - выход OUT1, бит 1 регистра 0177716
7 - вход DOUT (МПИ)
8 - вход SYNC (МПИ)
9 - вход-выход AD0 (МПИ)
10 - вход-выход AD1 (МПИ)
11 - вход-выход AD2 (МПИ)
12 - вход-выход AD3 (МПИ)
13 - вход-выход AD4 (МПИ)
14 - вход-выход AD5 (МПИ)
15 - вход-выход AD6 (МПИ)
16 - вход-выход AD7 (МПИ)
17 - вход-выход AD8 (МПИ)
18 - вход-выход AD9 (МПИ)
19 - вход-выход AD10 (МПИ)
20 - вход-выход AD11 (МПИ)
21 - вход-выход AD12 (МПИ)
22 - вход-выход AD13 (МПИ)
23 - вход-выход AD14 (МПИ)
24 - вход-выход AD15 (МПИ)
25 - выход AR
26 - вход DIN (МПИ)
27 - выход RPLY (МПИ)
28 - выход IRQ, подключается битом 13 регистра 0177716
29 - выход VIRQ (МПИ)
30 - выход IAKO (МПИ)
31 - вход IAKI (МПИ)
32 - общий (земля)
33 - выход X0, биты 4-6 регистра 0177702 через дешифратор
34 - выход X1, биты 4-6 регистра 0177702 через дешифратор
35 - выход X2, биты 4-6 регистра 0177702 через дешифратор
36 - выход X3, биты 4-6 регистра 0177702 через дешифратор
37 - выход X4, биты 4-6 регистра 0177702 через дешифратор
38 - выход X5, биты 4-6 регистра 0177702 через дешифратор
39 - выход X6, биты 4-6 регистра 0177702 через дешифратор
40 - выход X7, биты 4-6 регистра 0177702 через дешифратор
41 - вход-выход Y1, вход биты 0-3 регистра 0177702, выход бит 14 регистра 0177704
42 - вход-выход Y2, вход биты 0-3 регистра 0177702, выход бит 13 регистра 0177704
43 - вход-выход Y3, вход биты 0-3 регистра 0177702, выход бит 12 регистра 0177704
44 - вход-выход Y4, вход биты 0-3 регистра 0177702, выход бит 11 регистра 0177704
45 - вход-выход Y5, вход биты 0-3 регистра 0177702, выход бит 10 регистра 0177704
46 - вход-выход Y6, вход биты 0-3 регистра 0177702, выход бит 9 регистра 0177704
47 - вход-выход Y7, вход биты 0-3 регистра 0177702, выход бит 8 регистра 0177704
48 - вход-выход Y8, вход биты 0-3 регистра 0177702, выход бит 7 регистра 0177704
49 - вход-выход Y9, вход биты 0-3 регистра 0177702, выход бит 6 регистра 0177704
50 - вход-выход Y10, вход биты 0-3 регистра 0177702, выход бит 5 регистра 0177704
51 - вход-выход Y11, вход биты 0-3 регистра 0177702, выход бит 4 регистра 0177704
52 - вход-выход Y12, вход биты 0-3 регистра 0177702, выход бит 3 регистра 0177704
53 - вход-выход Y13, вход биты 0-3 регистра 0177702, выход бит 2 регистра 0177704
54 - вход-выход Y14, вход биты 0-3 регистра 0177702, выход бит 1 регистра 0177704
55 - вход-выход Y15, вход биты 0-3 регистра 0177702, выход бит 0 регистра 0177704
56 - выход EP, режим линий Y, бит 8 регистра 0177700
57 - вход INIT (МПИ)
58 - вход CLC, тактовая частота
59 - вход DCLO (МПИ)
60 -
61 - вход EXT, бит 0 регистра 0177716
62 - выход OUT4, бит 15 регистра 0177716
63 -
64 - питание +5В
Я думаю, потом в таком формате можно на отдельном листе переносить причесанные и распознанные фрагменты схемы:
http://b.radikal.ru/b31/1910/b2/7a0e646394c2.png
1 - выход SND, выход звука, формируется битами 7-12 регистра 0177716
2 - вход-выход IO1, бит 4 регистра 0177716
...
Какие из них активны в нуле, а какие в единице? Понятно, что AD - инверсные, т.е. перед ними можно написать /AD.
А линии X и Y? А другие?
Добавился 9-й ряд (из 19).
Из новенького - появился новый тип триггера (теперь у нас 4 типа D-триггеров и один RS-триггер), а так же отдельно стоящие двунаправленные мультиплексоры о которых я говорил раньше.
Первый раз мне встретился элемент, который по выходу ни с чем не соединен.
Это инвертор K10. На него приходит, но никуда не уходит)
http://c.radikal.ru/c29/1910/28/077c666a50a9.png
Возможно все соединялось ручками, а не каким-то САПР'ом, который подчищает всякие тупики и оптимизирует.
К слову об оптимизации - встречается немало мест, где стоят лишние неоптимизированные элементы.
Возможно все соединялось ручками, а не каким-то САПР'ом
предположи учитывая дату разработок (лет за 7-10) до начала серийного производства - инструментарий разработчиков - я стоя аплодирую авторам ангстремовских камушков
- - - Добавлено - - -
что то с клавиатурой УК-НЦ 7007 и правда беда какая то (((
Возможно все соединялось ручками, а не каким-то САПР'ом, который подчищает всякие тупики и оптимизирует.
К слову об оптимизации - встречается немало мест, где стоят лишние неоптимизированные элементы.
Как вариант "так сделано специально" для выполнения задержек.
про инструментарий всё равно интересно, неужели руками ?
https://pic.maxiol.com/thumbs2/1571818832.1520060733.3983659542.jpg (https://pic.maxiol.com/?v=1571818832.1520060733.3983659542.jpg&dp=2)
К слову об оптимизации - встречается немало мест, где стоят лишние неоптимизированные элементы.
Скорее всего это остатки ячеек или их неиспользуемые выходы.
Производители полупроводников разрабатывают библиотеку функциональных ячеек, выполняют опытно-конструкторские работы, изготавливают все ячейки по данному техпроцессу, тестируют физические параметры в широком диапазоне напряжений и температур, скоростные параметры, паразитные значения. А дальше - усе, физдизайн ячейки менять не моги, оно входит в PDK. Торчит из ячейки лишняя нога? Откусим? А кто будет отвечать если там резонанс какой вылезет или паразитку неправильно моделирование посчитает? Кто будет за комплект масок платить (я думаю они и на Ангстреме несильно дешевые) ? Поэтому ячейки в дизайн идут "как есть", никто на этом уровне не играется. Разработка микросхем с готовым PDK это уже ближе к разработке печатных плат - есть набор элементов - соединяй их, да и усе. Потом LVS, извлечение паразиток, физ моделирование.
Как вариант "так сделано специально" для выполнения задержек.
Какие-то для формирования задержек, какие-то для увеличения нагрузочной способности.
А некоторые видел абсолютно ляповые и излишние.
Ну и эта, тупиковая, которую просто либо отключили в итоге, либо забыли как-то еще.
Как тебе такое, Илон Маск?
http://b.radikal.ru/b42/1910/0d/3d8f169349c8.png
"Исправить по быстрому" ? без "глобальной" переделки...
"Исправить по быстрому" ? без "глобальной" переделки...
Исправить что и зачем?
ХЗ. Что и на что.
В 90-х я помню как плисы рисовались. DOS4GW + SVGA + РУКАМИ указывалось как соединялся КАЖДЫЙ логический элемент с другим (НЕ ИЛИ И). и также вручную производилась оптимизация разводки по времянкам (те по схеме топологии руками выбирались нужные дорожки). так что "по быстрому" и не такие "чудеса" могли быть нарисованы.
также вручную производилась оптимизация
Вот я тоже, глядя на это, подозреваю, что все разводилось ручками и никакой автоматической оптимизации не было.
Вернее, трассировка была, конечно, автоматической, но именно автоматической логической оптимизации, я думаю, что не было.
В 90-х
да какие вга-досы? эти камушки проектировали в течении 80-х, в 90-е их уже с производства снимали )
Читайте внимательно. Я писал про ПЛИСЫ а не про ХМ
:)
а ХМ еще "древнее". в 80-е наверно только хт и были для избранных. так-что "хандмаде", только харкор.
CodeMaster
23.10.2019, 16:23
а ХМ еще "древнее". в 80-е наверно только хт и были для избранных.
Были другое железо и софт в те времена. Вот тут (https://zx-pk.ru/threads/24333-istoriya-zavoda-quot-protsessor-quot-g-voronezh.html?p=822281&viewfull=1#post822281) предпоследний абзац. Я-то в живую этого не видел (а кто видел тех видать уже нет с нами), но похоже на САПР.
меня машинка заинтриговала
https://pic.maxiol.com/thumbs2/1571837251.1520060733.09b7afad5aa740orig.jpg (https://pic.maxiol.com/?v=1571837251.1520060733.09b7afad5aa740orig.jpg&dp=2)
персоналка, одноплатная в правильном таком корпусе и на плакате видно, что дисковод как минимум заявлен,
красотень?
оффтоп: у нас в конторе я видел "тумбочку" возможно чтото типа VAX. говорили что на них разрабатывали аналоговые/цифровые(?) микросборки/микросхемы(?).
меня машинка заинтриговала
https://pic.maxiol.com/thumbs2/1571837251.1520060733.09b7afad5aa740orig.jpg (https://pic.maxiol.com/?v=1571837251.1520060733.09b7afad5aa740orig.jpg&dp=2)
персоналка, одноплатная в правильном таком корпусе и на плакате видно, что дисковод как минимум заявлен,
красотень?
По микросхемами это ж dec pro-380
Готов 10 столбец из 19. Преодолен 50%-й рубеж, а так же переход на второй лист. Что было одно из самых кропотливых. Сделал так, чтобы в PDF, если просматривать по две страницы сразу, схема была единой и удобной.
Из интересного - еще один тип триггеров (это уже даже не интересно, просто запутывает распознавание, т.к. можно вместо одного впилить другой). Ну и штуки 3-4 тупиковых инвертора, которые до сих пор никогда бесхозными не встречались, а тут сразу несколько.
Добавился 11-й столбец из 19. Достаточно насыщенный.
Из новенького - еще один тип триггера (сколько можно?) - самый большой из встречающихся, D-Trigger с обоими выводами R и S.
А так же новый элемент - 2ИЛИ, 2ИЛИ, И-НЕ.
Добавился 11-й столбец из 19. Достаточно насыщенный.
А что за PXX на самом верху на второй странице?
Выводы 60 и 63 действительно никуда не подключены?
А что за PXX на самом верху на второй странице?
Выводы 60 и 63 действительно никуда не подключены?
PXX - это еще не подключенный порт, который будет в следующих столбцах.
Да, 60 и 63 никуда не подключены.
- - - Добавлено - - -
Вот будет интересно, если в чипе найдется что-то такое, о чем никто не знал)
Вот будет интересно, если в чипе найдется что-то такое, о чем никто не знал)
Вот по выводам самое интересное впереди - шина МПИ. А там дешифраторы адреса, понятно где какие регистры, все битики.
А по поводу, о чем не знали.
В ТО не был описан регистр 0177704, и соответственно бит 8 регистра 0177700. В старом ТО упоминается бит 13 регистра 0177716, который переключает векторные прерывания 304 и 310 на вывод IRQ, действительно работает.
Вот по выводам самое интересное впереди - шина МПИ. А там дешифраторы адреса, понятно где какие регистры, все битики.
Шина МПИ - это самый последний столбец)
IRQ же у нас ни к чему не подключено. Как и AR. Для чего они?
IRQ же у нас ни к чему не подключено. Как и AR. Для чего они?
По старому ТО при установке бита 13 регистра 0177716 векторные запросы 304 и 310 должны были идти на вывод IRQ, вместо VIRQ. А вывод IRQ должен был быть подключен на вход HALT ПП. Так что в этом случае прерывалась бы по прерыванию HALT. Прерывалось бы всегда, независимо от установки бита 7 в PSW, такое вот высокоприоритетное, маломаскируемое прерывание. Данная идея по HALT реализована вроде в Союз-Неон при эмуляции регистров терминала.
А вывод AR, это скорее всего Address Response, что-то вроде аналога RPLY, но только для SYNC, нужен для процессора 1801ВМ2, ну и 1806ВМ2. Но подача ответа AR для процессоров в УКНЦ сделана другим способом.
В ТО не был описан регистр 0177704
А что же, сканированием регистров раньше его не замечали? Или замечали, но не знали, что он означает?
А что же, сканированием регистров раньше его не замечали? Или замечали, но не знали, что он означает?
Ну почему-же не замечали? Замечали, и в ТО было описано, что регистр 177704 есть РЕЗЕРВ, формируется сигнал СИП. И более ничего. Соответственно первый раз я его заметил когда дизассемблировал ПЗУ УКНЦ, это было еще в начале 90-х прошлого века. По команде BIT #10000,@#177704 я понял, что опрашивается состояние перемычки контроллера дисковода. Ибо в том же ТО в пояснении к таблице 2 было описано, что коды по линии Y3 формируются коммутацией перемычки в контроллере дисковода. Далее Arseny на своем сайте uknc.narod.ru (http://uknc.narod.ru) выложил схему УКНЦ с СЭМЗ-овской схемотехникой. Вот там скорость последовательного интерфейса регулировалась через линии Y и использовался ранее не задействованный вывод EP. Ну а потом когда в инете появилось разнообразное ПО, то были программы поддержки джойстика, контроллер которого был сделан на 1515ХМ1-031, также была программа изменения скорости последовательного интерфейса. Программки маленькие, даже дизассемблировать не надо было, достаточно было просмотреть все в DESS. Вот таким образом и пришло понимание работы регистра 0177704, ну и узнал о неописанном в ТО бите 8 регистра 0177700.
Arseny на своем сайте uknc.narod.ru выложил схему УКНЦ с СЭМЗ-овской схемотехникой.
Можно прямую ссылку на СЭМЗ-схему?
Можно прямую ссылку на СЭМЗ-схему?
Cхема СЭМЗ (https://forum.maxiol.com/index.php?act=Attach&type=post&id=9396)
Можно прямую ссылку на СЭМЗ-схему?
http://uknc.pdp-11.ru/Strelets/index.htm. Принципиальная Схема компьютера (документ 3.059.316 Э3 в формате djvu).
Cхема СЭМЗ
По-моему самая стандартная, которая везде. Схема КВАНТ и то реже встречается.
По-моему самая стандартная, которая везде. Схема КВАНТ и то реже встречается.
Вот только сам КВАНТ как-то почаще встречается. Да и различия у схем есть.
Сегодняшнее обновление - 12-й столбец из 19.
продолжает славные традиции 11-го столбца, только более насыщенный и больше связей (викторина - а ну-ка, не запутайся в паутине).
Интересно, что /IAKO - это комплиментарный выход, а /VIRQ - это открытый коллектор.
продолжает славные традиции 11-го столбца, только более насыщенный и больше связей (викторина - а ну-ка, не запутайся в паутине).
Кто распутывать будет?
Интересно, что /IAKO - это комплиментарный выход, а /VIRQ - это открытый коллектор.
Ну так и должно быть. Ответ на прерывание (IAKI, IAKO) идет последовательно по элементам в соответствии с приоритетом. А VIRQ параллельно все сходятся в одну точку.
Кто распутывать будет?
Я же)
Но сейчас задача не запутаться при отрисовке схемы, чтобы не наплодить косяков.
Конечно, перепутать логические элементы и инверсные/прямые выходы легче, чем связи, но все же.
- - - Добавлено - - -
Ну так и должно быть. Ответ на прерывание (IAKI, IAKO) идет последовательно по элементам в соответствии с приоритетом. А VIRQ параллельно все сходятся в одну точку.
Я же не PDP-шник, я не знаю нюансов) Я даже не знаю, как работает шина МПИ)
- - - Добавлено - - -
Я, например, не понимаю, чем авария сетевого питания отличается от аварии источника питания)
Я же не PDP-шник, я не знаю нюансов) Я даже не знаю, как работает шина МПИ)
Я, например, не понимаю, чем авария сетевого питания отличается от аварии источника питания)
ГОСТ 26765.51-86 Интерфейс магистральный параллельный МПИ системы электронных модулей. Общие требования к совокупности правил обмена информацией (с Изменением N 1) (http://docs.cntd.ru/document/1200023350)
Кто у нас в УКНЦ формирует адреса векторных прерываний, какой чип, или какие?
Кто у нас в УКНЦ формирует адреса векторных прерываний, какой чип, или какие?
Если прерывания по VIRQ, то адрес вектора передает само устройство, которое это прерывание и запросило. 1515ХМ2-001 передает по запросу IAKI три вектора - 300, 304, 310. Эти вектора должны быть записаны как константы в самом 1515ХМ2-001.
Почему на обеих схемах - Квант и СЭМЗ, EXT соединен с OUT2 напрямую,
тогда как на схеме от Micka', которую он перерисовывал с платы КВАНТ ревизия 5, они соединены через дополнительную цепочку с триггером?
Я, например, не понимаю, чем авария сетевого питания отличается от аварии источника питания)АИП Н (на самом деле - это К ПОСТН В, постоянное питание в норме, высокий) выполняет те же функции, что и RESET у обычных процессоров. У Э-60 он поступает на "Сброс микроканала" - полный общий сброс всего процессора Э-60 при низком уровне на нем. А АСП Н (К ПИТН В) выполняет две функции - во первых, при запуске он делается высоким через 70 мс после снятия АИП Н (появление высокого К ПОСТН В), что он при этом делает в процессоре, я точно не знаю но запускается нормальная работа. И, во-вторых, при пропадании сети, он снимается первым и вызывает прерывание по вектору 24, сигнализируя системам реального времени, что сеть пропала и надо срочно останавливать критичные процессы, бо через 10 мс может пропасть питание. Ну, и, через 10 мс (или позже - когда банки в БП разрядятся до порога работоспособности стабилизаторов), появится АИП Н (снимется К ПОСТН В), процессор станет на сброс, а затем пропадет питание.
- - - Добавлено - - -
А сигнал К СБРОС Н сбрасывает не ЦП, а только периферию, по инициативе ЦП, и то не всю - кое-что сбрасывается не по этому сигналу, а по пропаданию К ПОСТ Н В (АИП Н) т.е. сбрасывается только вместе с ЦП. Пример - регистр принятых данных ВП1-035/065, может быть и в сабжевых чипах что-то такое есть...
Столбец 13 из 19. Весьма насыщенный.
Интересно, что принцип тактирования триггеров включенных каскадно, в этой части схемы отличается. Как будто делал другой человек.
В основном двухполярный тактовый сигнал для тактирования триггеров получали на двух последовательных инверторах со средним отводом. Даже если этот двухполярный сигнал уже имелся в наличии, т.к. снимался с выхода другого триггера, а у триггера всегда двухполярный сигнал в наличии по умолчанию.
А в этой части схемы сигнал так и берется - с двухполярного выхода другого триггера, как положено по всем законам оптимальности.
Почему это пишу, т.к. на моей схеме этого всего не видно, ввиду того, что тактирование я сразу упаковываю внутрь триггера, и рисую уже обычный однополярный вход тактирования.
NEO SPECTRUMAN
28.10.2019, 02:46
т.к. на моей схеме этого всего не видно,
а потом не окажется что это какаято хитрая задержка чтоб... ?
а потом не окажется что это какаято хитрая задержка чтоб... ?
Нет, не окажется, т.к. гипотетическую хоть сколько-нибудь значащую задержку, дающую рассинхрон входного мультиплексора тактирования, использовать нельзя, ибо закоротится вход D с промежуточным выходом. Можешь посмотреть схему триггера в первом посте.
- - - Добавлено - - -
Или ты имел в виду задержку тактирования триггера вообще? Не думаю, что один-два лишних каскада что-то существенное дадут, особенно на фоне построения этой схемы вообще.
14-й столбец из 19.
Куча паутины. На схеме это уже не так видно, т.к. что-то убралось внутрь триггеров, но на топологии можно запуться.
Из новенького - новый логический элемент, не встречавшийся ранее в схеме. Это обычное 3ИЛИ. Что дополнительно наводит на предположение, что эту часть схемы делал другой человек (что, впрочем, не имеет никакого значения).
Тдам! Столбец 15 из 19.
Из интересненького - видимо, еще один человек поучаствовал в проекте. В этом столбце используются 3И-НЕ с обьединеными входами, в роли типа как мощного буфера. Хотя, в библиотеке элементов есть мощные буфера с 2-кратной и 4-кратной нагрузочной способностью. Да и назвать мощным такое использование 3И-НЕ можно условно, т.к. умощняется только верхний каскад, а нижний слабее слабого.
Ну и вторая новинка - это два отдельных инвертора друг за другом, хотя, опять же, в библиотеке есть подобная конструкция в виде одной логической ячейки.
Замечу, что сейчас реверсить стало попроще/побыстрее, потому что:
1. Опыт.
2. Все элементы помню на память, как выглядят, какие входы, какие выходы, и как называются.
3. Перестали встречаться новые элементы, которые приходилось расшифровывать и описывать.
Почему на обеих схемах - Квант и СЭМЗ, EXT соединен с OUT2 напрямую,
тогда как на схеме от Micka', которую он перерисовывал с платы КВАНТ ревизия 5, они соединены через дополнительную цепочку с триггером?
Триггер стоит в схеме изм4 и его нет в схеме изм6.
изм4 и его нет в схеме изм6.
Что такое 'изм4' и 'изм6'?
Изменение, по всей видимости. У них писали Ver или Rev, а у нас Изм.
Изменение, по всей видимости. У них писали Ver или Rev, а у нас Изм.
Это я догадался)
Я намекаю на то, где посмотреть схемы с этими изменениями? )
Это я догадался)
Я намекаю на то, где посмотреть схемы с этими изменениями? )
В главном штампе первого листа. Левый верхний угол.
70532
А вот старая схема изм4:
https://cloud.mail.ru/public/57YP/skE45yesc
А вот старая схема изм4:
Какие у тебя есть еще схемы? Выкладывай)
И хорошо сканированную доку по 1515ХМ1 тоже)
Пока сделал скан ТУ на КА1515ХМ2 (80 МБ).
https://cloud.mail.ru/public/a4iR/3x2iG3jSj
Ynicky, не XA, а XM !!!
http://archive.pdp-11.org.ru/BIBLIOTEKA/KA1515XM2TU/
Пока сделал скан ТУ на КА1515ХА2.
https://cloud.mail.ru/public/a4iR/3x2iG3jSj
Пишут, что в ХМ1 - 15200 элементов. Что-то я сомневаюсь.
Если брать примерно 1100 логических ячеек, то получается по 13 транзисторов на ячейку. Это очень жирновато, в реальности намного меньше.
CodeMaster
02.11.2019, 13:40
Что-то я сомневаюсь.
Да уже по ВМ1 же определили что транзисторов меньше. Толи врагов запутывали, толи отчитывались за финансирование.
Да уже по ВМ1 же определили что транзисторов меньше. Толи врагов запутывали, толи отчитывались за финансирование.
А чего было заявлено для ВМ1, и сколько в итоге оказалось?
CodeMaster
02.11.2019, 15:59
А чего было заявлено для ВМ1, и сколько в итоге оказалось?
Я не помню, это надо у Вячеслава спрашивать. Мне просто помница, что он в теме про реверс ВМ писал, что по факту оказалось меньше.
Извиняюсь перед теми, кто ждет, что следующий ряд не перевожу. Работа, понимаешь.
Отсканировал КА1515ХМ1 технические условия, справочный лист и др.
Так как все было в одной папке, сделал один файл (110 МБ).
Сканировал в цвете, 150 точек на дюйм. Никакой обработки не делал.
Просьба к Hobot-у продублировать документ на своём сайте.
https://cloud.mail.ru/public/4HDb/4fxNkVyLE
http://hobot.pdp-11.ru/BIBLIOTEKA/%ca%c01515%d5%cc1TU/KA1515XM1TUSL.pdf
После некоторого перерыва 16-й столбец из 19.
Весьма интересная линия задержки(?) Q37.R20.Q2 в цепи /RPLY.
Выглядит весьма странновато)
Столбец 17 из 19!
Из интересненького:
1. Впервые встретился RS-триггер с инверсными входами, т.е. построенный не на элементах '2ИЛИ-НЕ', а на элементах '2И-НЕ'. Сходу чуть не перепутал его со стандартным, т.к. очень похожи внешне. Пришлось прошерстить всю схему, и проверить, не перепутывал ли ранее. Нет, все окейно.
2. Начинают вырисовываться дешифраторы и всякое интересненькое.
И... столбец 18 из 19!
Из интересненького:
Даже невооруженным глазом четко прорисовывается регистр счетчика таймера. Видно, как в него загружается значение, и как каскадно соединены триггеры счетчика.
Избыточность, на мой взгляд, большая. Если все упаковать в функциональные блоки - регистры, счетчики, дешифраторы - схема станет очень читаемой и понятной. Но это второй этап.
В размер аттача на форуме схема уже не влезает (лимит 640Кб), поэтому размещаю на Яндекс-диске (https://yadi.sk/d/IQl47ZcD8u683g).
Заметки по реверсу 1515ХМ2-001:
По нумерации ячеек:
1. В нумерации отсутствуют буквы 'I' и 'O', чтобы не путать с единицей и нулем.
2. В первых столбцах присутствуют несколько номеров вида C6a, C21a, D3a, D3b.
3. Всего в матрице 1296 логических ячеек.
Порты (всего 60):
Замечание: не все входы и выходы портов могут быть задействованы.
1. Двунаправленных портов с комплиментарным выходом: 21 (P1, P9-P24, P28, P30, P56, P62).
Каждый порт содержит 4 мощных транзистора, 2 сверхмощных и 1 резистор.
2. Двунаправленных портов с открытым коллектором: 31 (P2-P6, P25, P27, P29, P33-P55).
Каждый порт содержит 4 мощных транзистора, 1 сверхмощный и 1 резистор.
3. Входы: 8 (P7, P8, P26, P31, P57-P59, P61).
Каждый порт содержит 4 мощных транзистора и 1 резистор.
Итого, порты содержат 60 резисторов, 240 мощных транзисторов и 73 сверхмощных транзистора (в сумме 313 транзисторов)
Итак - финальная версия первого этапа реверса 1515ХМ2-001 (https://yadi.sk/d/YM0A5X8vHDyOcw).
Разумеется, могут быть ошибки и все такое прочее.
В архиве, схема для P-CAD, и схема в виде PDF.
В логических элементах много избыточности. Явно была библиотека различных блоков типа - регистра, счетчика, буфера и т.д. Т.е. никто не делал эту схему на уровне триигеров и простейших логических элементов. А автоматической оптимизации логики у САПР'а скорее всего не было. Отсюда и избыточность.
В общем, реверсить было явно сложнее и дольше, чем делать эту схему)
Немножко живой математики.
Логические элементы:
* НЕ: 2 транзистора - 115 штук + ~4 штук тупиковые
* НЕ x 2: 4 транзистора - 87 штук
* НЕ x 4: 8 транзисторов - 32 штуки
* НЕ-НЕ: 4 транзистора - 22 штуки
* 2И-НЕ: 4 транзистора - 149 штук
* 2ИЛИ-НЕ: 4 транзистора - 102 штуки
* 3И-НЕ: 6 транзисторов - 40 штук
* 3ИЛИ-НЕ: 6 транзисторов - 44 штуки
* 3ИЛИ: 8 транзисторов - 1 штука
* 4И: 10 транзисторов - 49 штук
* 4ИЛИ: 10 транзисторов - 9 штук
* НЕ-2И (кое-где оптимизирован до 2И): 10 транзисторов (из них 2 посажены на землю) - 2 штуки
* 2И,2И-2ИЛИ-НЕ: 8 транзисторов - 17 штук
* 2ИЛИ,2ИЛИ-2И-НЕ: 8 транзисторов - 1 штука
* 2MUX1: 4 транзистора - 3 штуки
+ НЕ-НЕ: 4 транзистора - 2 штуки
* BUF (НЕ-НЕ): 4 транзистора - 14 штук
* RS-Trigger A: 8 транзисторов - 38 штук
* RS-Trigger B: 8 транзисторов - 1 штука
* D-Trigger-One: 12 транзисторов (3 ЛЯ) - 63 штуки
+ НЕ-НЕ: 4 транзистора - 63 штуки
* D-Trigger-One-R: 14 транзисторов (3 ЛЯ) - 28 штук
+ НЕ-НЕ: 4 транзистора - 28 штук
* D-Trigger-One-S: 14 транзисторов (3 ЛЯ) - 1 штука
+ НЕ-НЕ: 4 транзистора - 1 штука
* D-Trigger-Edge-S: 24 транзистора (5 ЛЯ) - 19 штук
+ НЕ-НЕ: 4 транзистора - 19 штук
* D-Trigger-Edge-R: 24 транзистора (5 ЛЯ) - 3 штуки
+ НЕ-НЕ: 4 транзистора - 3 штуки
* D-Trigger-Edge-RS: 28 транзисторов (5 ЛЯ) - 12 штук
+ НЕ-НЕ: 4 транзистора - 1 штука
Всего 1277 элементов (6064 транзисторов + около 80 недосчитались)
+ 313 транзисторов на порты,
Итого: ~6457 транзисторов.
Потерянные элементы:
1296 - 1277 = 19 недосчитались
Где могли недосчитаться.
Скорее всего при подсчетах элементов не учел что-то, что упаковалось в более крупные, или промахнулся при подсчетах.
Напомню, что в официальной документации заявлено 15200 элементов (вентилей). 15200 против реальных 6457. Как тебе такое, Илон Маск?
Замечу, что для ХМ2-000 (тестовая микросхема) там заявлено вообще 23550 вентилей.
А вообще, ХМ2-001 самая жирная из всех ХМ2. В ХМ2-002 по документации 14800 вентилей, а ХМ2-003 - 12100 вентилей.
Небольшое дополнение к вопросу - откуда в схеме тупиковые элементы (https://zx-pk.ru/threads/30964-revers-inzhiniring-bmk-1515khm1-2.html?p=1030996&viewfull=1#post1030996), а так же логическая избыточность (https://zx-pk.ru/threads/30964-revers-inzhiniring-bmk-1515khm1-2.html?p=1031017&viewfull=1#post1031017).
Я думаю, что это так же появилось в следствие того, что проектировщики оперировали крупными блоками, в составе которых в обязательном порядке находилось определенное количество элементов. И если какие-то выходы блока не использовались, то появлялись такие тупиковые инверторы. Т.е. САПР эти элементы автоматически не обрезал.
Тоже самое с логической избыточностью в тактовом генераторе. Там используются два специфических триггера, модифицированных дополнительным элементом НЕ-2И в управляемые делители на 2. И элемент E55, который должен был бы по логики выкинуться, просто находился внутри этого управляемого делителя.
Обновил в первом посту библиотеку элементов. Теперь она включает в себя подробные схемы всех элементов, встретившихся в ХМ2-001.
Картинки залил вместо рекламного радикала на https://pic.maxiol.com/ по совету Hobot'а.
Ув. доктор г.к. Titus, можно простой популистский вопросец - вот вы узнали, что хотели про начинку этой
схемы, эти знания помогут в доработке эмулятора УК-НЦ ?
Ув. доктор г.к. Titus, можно простой популистский вопросец - вот вы узнали, что хотели про начинку этой
схемы, эти знания помогут в доработке эмулятора УК-НЦ ?
Всякий раз читая твое 'г.к.' произношу это как 'Горячего копчения')))
Я еще не все узнал, а только перевел схему с кристалла в понятный человеку вид. Но не каждому человеку. Теперь надо перевести в понятный каждому)
Разумеется, это поможет доработать все имеющиеся в мире эмуляторы УКНЦ, а так же создать реплику микросхемы, если кто захочет)
Вопрос - как положено маркировать регистры, в которые можно загружать/читать значение, а так же значение которого может декрементироваться по такту?
Я обозвал входы D0..D11, выходы Q0..Q11, вход загрузки L, вход тактирования C, а на регистре написал REG, а под ним -1.
Это корректно?
Начал переводить схему в понятный вид.
Постепенно убираю с первых двух листов элементы и переношу их на третий, упаковывая в регистры, счетчики и все такое прочее логически связанное и понятное.
1515ХМ2-001-Optimized - rev 4 (https://yadi.sk/d/SxWXupmvIOMxYQ)
Сделал дешифрацию регистров.
Интересно, что подтверждение /RPLY для разных регистров сделано по-разному.
Для записи в буферный регистр таймера, и для чтения из регистра текущего значения - отдельно, и по-разному.
А для всех остальных регистров одинаково.
Итак, новая версия (https://yadi.sk/d/ekiV9iHLzCCh2Q).
На третьем листе добавилось много чего интересненького.
Равно, как и второй лист схемы заметно поредел.
Все регистры на запись сделал.
41 - вход-выход Y1, вход биты 0-3 регистра 0177702, выход бит 14 регистра 0177704
42 - вход-выход Y2, вход биты 0-3 регистра 0177702, выход бит 13 регистра 0177704
Вот здесь не так.
Потом выложу схему, посмотрите.
Вопрос - как положено маркировать регистры, в которые можно загружать/читать значение, а так же значение которого может декрементироваться по такту?
Я обозвал входы D0..D11, выходы Q0..Q11, вход загрузки L, вход тактирования C, а на регистре написал REG, а под ним -1.
Это корректно?
Это называется счетчик. В советских схемах обозначался CT. Вход загрузки обозначали либо C, либо PE. Счетчиков должно быть два. Первый это счетчик таймера (работает по декременту), а второй счетчик клавиатуры (работает по инкременту, читается чтением регистра 0177702).
- - - Добавлено - - -
Вот здесь не так.
Потом выложу схему, посмотрите.
Возможно. Я делал описание в соответствии с выводами Y3-Y15. А Y1 и Y2 в схеме УКНЦ нигде не используются.
После анализа всех регистров доступных на запись - неизвестных битов и регистров не обнаружено) Все, как в документации, плюс добавки из этой темы.
Интересно, что подтверждение /RPLY для разных регистров сделано по-разному.
Для записи в буферный регистр таймера, и для чтения из регистра текущего значения - отдельно, и по-разному.
А для всех остальных регистров одинаково.
Все остальные регистры отвечают на чтение и запись. Регистры 0177702 и 0177714 отвечают только на чтение, регистр 0177712 отвечает только на запись.
- - - Добавлено - - -
Оказывается ответ AR на SYNC только для своих регистров, я думал общий, сделан специально для 1801ВМ2.
В какой ситуации активны все три сигнала DIN, DOUT и SYNC?
В какой ситуации активны все три сигнала DIN, DOUT и SYNC?
Ни в какой.
Ни в какой.
Тогда что вы скажете на это?
https://pic.maxiol.com/images2/1573497819.1504841820.01.png
Как видно по схеме, по сигналу INIT некая внутренняя частота выбирается равной 1/24 CLC
Однако, если /DIN, /DOUT и /SYNC в нуле, то система переключается на частоту CLC.
Тогда что вы скажете на это?
Я скажу, что как-то странно по схеме формируется сигнал /RPLY_COMMON. Он отвечает, когда ни один регистр не выбран. Может там где нибудь инвертор забыт.
Я скажу, что как-то странно по схеме формируется сигнал /RPLY_COMMON. Он отвечает, когда ни один регистр не выбран. Может там где нибудь инвертор забыт.
Проверю.
Полярность сигнала - это то, что легче всего напутать. Однако и заметить тоже легче, если знаешь, как система должна работать.
Но я спрашивал про другой кусочек.
Но я спрашивал про другой кусочек.
В QBUS (МПИ) такого нет. SYNC активен только во время адресного обмена. Соответственно во время обмена могут устанавливаться либо DIN, либо DOUT, но никак не вместе. DIN используется также во время запроса вектора прерывания, а также в процедуре чтения безадресного регистра, в этих случаях SYNC неактивен.
В QBUS (МПИ) такого нет. SYNC активен только во время адресного обмена. Соответственно во время обмена могут устанавливаться либо DIN, либо DOUT, но никак не вместе. DIN используется также во время запроса вектора прерывания, а также в процедуре чтения безадресного регистра, в этих случаях SYNC неактивен.
Тогда зачем это сделали на схеме?
- - - Добавлено - - -
Я скажу, что как-то странно по схеме формируется сигнал /RPLY_COMMON. Он отвечает, когда ни один регистр не выбран. Может там где нибудь инвертор забыт.
Да, проверил, действительно инверсию потерял. Вход 2 Q71.Q72 должен быть инверсным.
- - - Добавлено - - -
Сегодняшняя версия: https://yadi.sk/i/lhLhx9ZhmhUbOw
Из интересненького:
1. Некоторые биты в регистрах сбрасываются по INIT, а некоторые по DCLO, а некоторые вообще не сбрасываются, что совершенно неочевидно без реверса.
2. Много чего еще интересненького.
SYNC активен только во время адресного обмена.
Насколько мне помнится, SYNC активен во время всего цикла адресного обмена.
Выставляется адрес, выставляется SYNC, дальше задержка, снимается адрес,
если чтение - выставляется DIN, ждётся RPLY, устройство выставляет данные, выставляет RPLY, снимаются SYNC, DIN, снимаются данные, RPLY
если запись - выставляется DOUT, устройство выставляет данные, выставляет RPLY, снимаются SYNC, DOUT, снимаются данные, RPLY
Ну и может ещё выставляться WTBT, а при отработке прерывание не выставляется адрес
Насколько мне помнится, SYNC активен во время всего цикла адресного обмена.
Ну собственно я так и говорил. А кроме чтения и записи есть еще чтение-модификация-запись. Выставляется адрес, потом по DIN читаются данные, небольшая пауза для обработки данных в процессоре, запись по DOUT. В этом цикле SYNC также активен во время всего адресного обмена, а адрес выставляется только один раз.
Кстати по схеме правильно формируются сигналы чтения и записи регистров. Учитывается не только выбор регистра и тип операции (чтение/запись), но и чтобы все это проходило при активном SYNC. Есть правда одно НО при формировании RPLY, если производились операции с разрешенным регистром, то его адрес останется в буфере LATCH_ADDRESS. Будет следующим циклом на шине чтение вектора прерывания, то по DIN будет выставлено RPLY, т.к. в буфере LATCH_ADDRESS разрешенный адрес.
Есть правда одно НО при формировании RPLY, если производились операции с разрешенным регистром, то его адрес останется в буфере LATCH_ADDRESS. Будет следующим циклом на шине чтение вектора прерывания, то по DIN будет выставлено RPLY, т.к. в буфере LATCH_ADDRESS разрешенный адрес.
И что это может дать на практике?
И что это может дать на практике?
Выставление RPLY, на шине AD в этом случае ничего не будет выставлено. Есть вероятность прочтения с шины нулевого вектора. В УКНЦ есть такое - если не вставить дискету в привод и запустить загрузку с этого привода, то через какое-то время ПП может вылететь в СТОП, вот только по какому адресу не помню.
Тогда запишем тройной DIN, DOUT, SYNC в коллекцию загадок)
Это называется счетчик. В советских схемах обозначался CT. Вход загрузки обозначали либо C, либо PE. Счетчиков должно быть два. Первый это счетчик таймера (работает по декременту), а второй счетчик клавиатуры (работает по инкременту, читается чтением регистра 0177702).
Похоже, счетчиков поболее, чем два)
Этот, например, по INIT устанавливается в 0x0F, затем декрементируется, и дает сигналы на 0x04 и на 0x02. Зачем - еще не смотрел. Думаю, что это что-то в цепи тактирования клавиатуры.
https://pic.maxiol.com/images2/1573515694.1504841820.01.png
Тогда запишем тройной DIN, DOUT, SYNC в коллекцию загадок)Может там не ИЛИ, а И ? Неактивные все три эти сигнала означают, что шина МПИ свободна и ее можно отдать, например, по DMA. Ну, или еще кому-нибудь внутреннему, например, второму процессору.
- - - Добавлено - - -
Оказывается ответ AR на SYNC только для своих регистров, я думал общий, сделан специально для 1801ВМ2.Естественно. То, что на плате, воспринимает адрес достаточно быстро, а воткнутое в слот, теоретически, может и не торопиться...
Может там не ИЛИ, а И ? Неактивные все три эти сигнала означают, что шина МПИ свободна и ее можно отдать, например, по DMA. Ну, или еще кому-нибудь внутреннему, например, второму процессору.
Нет, проверил. Четко 3ИЛИ-НЕ.
- - - Добавлено - - -
Как предположение - какой-то отладочный режим, который активируется этими тремя сигналами, что переключает внутренний генератор (чего-то там), с 1/24 clk на clk.
Интересный нашел счетчик в цепи клавиатуры. Он тоже 4-х-разрядный, декрементивный. Интересно, то младший бит у него устанавливается по DCLO, а три старших по INIT)
А вот так выглядит регистр данных клавиатуры.
Как я уже говорил выше, интересно сделан сброс одного из битов по DCLO.
Регистр состоит из двух независимых счетчиков.
https://pic.maxiol.com/images2/1573582321.1504841820.01.png
А вот так выглядит регистр данных клавиатуры.
Как я уже говорил выше, интересно сделан сброс одного из битов по DCLO.
Регистр состоит из двух независимых счетчиков.
При изменении состояния клавиш счетчики должны "замораживаться". Плюс к тому же клавиши на одной линии Y не различаются. Так что кроме счетчиков должны быть схемы сравнения с состоянием линий X и Y, и в случае изменения счетчики должны быть "заморожены" и выставлен бит готовности в регистре 0177700.
А на счет, почему где-то сброс по INIT, а где-то по DCLO, я думаю, что это было связано с тем, где и как удобнее было трассировать эти линии.
Как у нас происходит сброс системы, в какой последовательности идут сигналы и кем выдаются?
Как у нас происходит сброс системы, в какой последовательности идут сигналы и кем выдаются?
В ПП DCLO возникает при включении питания. Когда установлен DCLO процессор вместе с ним устанавливает и INIT. Потом INIT можно установить отдельно командой RESET.
В ПП DCLO возникает при включении питания. Когда установлен DCLO процессор вместе с ним устанавливает и INIT. Потом INIT можно установить отдельно командой RESET.
Т.е. можно управлять INIT-ом программно. Очень хорошо. Это значит можно написать тест, который проверит, сбросился ли бит по INIT или нет)
Сегодняшняя версия (https://yadi.sk/d/epKMrNrz3F6eFg).
Основная схема на 1 и 2 страницах все редее, и редее)
Ух, и непростое это занятие собирать дешифраторы, особенно на 4->16, которые разбросаны по всей схеме.
Да еще при составлении дешифратора нашел ошибки в основной схеме, которые допустил еще 5 лет назад)
- - - Добавлено - - -
На вскидку - совершенно не сложно собрать аналог 1515ХМ2-001 на рассыпухе)
Может быть вообще всю УКНЦ на рассыпухе)
А уж в плис упихать и подавно можно.
Я смотрю, на линию Y можно не только писать через 177704, но и читать ее через этот же регистр.
Я смотрю, на линию Y можно не только писать через 177704, но и читать ее через этот же регистр.
Я об этом давно говорил. Этим методом читается состояние перемычки контроллера дисковода. Если перемычка есть, то она сажает линию Y3 на землю. Этим же регистром пользуется и драйвер джойстика JOYST.SAV, который обслуживает контроллер джойстика, собранный с использованием 1515ХМ1-031.
Этим же регистром пользуется и драйвер джойстика JOYST.SAV, который обслуживает контроллер джойстика, собранный с использованием 1515ХМ1-031.
ХМ1-031 - тоже имеет все эти порты в обе стороны, или же отличается от ХМ2-001 значительно?
Ух, и непростое это занятие собирать дешифраторы, особенно на 4->16, которые разбросаны по всей схеме.
А для чего дешифратор на линии Y, вроде опрос идет по линиям X, а с Y считываются результаты. Хотя по значению счетчика должны проанализироваться конкретная линия Y в данный момент.
Вот еще интересно, как контроллер различает отжатие всех клавиш на линии Y, чтобы передать код отжатия?
- - - Добавлено - - -
ХМ1-031 - тоже имеет все эти порты в обе стороны, или же отличается от ХМ2-001 значительно?
Вероятно тоже, т.к. вывод EP был и на 1515ХМ1-031.
До подробностей еще не дошел, но дешифраторы уже можно посмотреть на сегодняшней версии: https://yadi.sk/i/KIbu6T_h8WcBWw
- - - Добавлено - - -
Вообще, на мой взгляд, используются БМК в УКНЦ просто расточительно)
Этот опрос клавиатуры любой уважающий себя спектрум делает программно. А тут больше половины чипа на 6000 транзисторов на клавиатуру угрохали.
NEO SPECTRUMAN
14.11.2019, 06:12
Вообще, на мой взгляд, используются БМК в УКНЦ просто расточительно)
Этот опрос клавиатуры любой уважающий себя спектрум делает программно. А тут больше половины чипа на 6000 транзисторов на клавиатуру угрохали.
дай угадаю
нажатие 2-х клавишь при этом он не обрабатывает?
и ВСЁ идет лесом...
Этот опрос клавиатуры любой уважающий себя спектрум делает программно
А любой уважающий себя PDP-11 не тратит на это (программные) ресурсы, перекладывая работу на железо.
И УК-НЦ построено по принципам PDP, а не Спектрума.
SuperMax
14.11.2019, 08:12
До подробностей еще не дошел, но дешифраторы уже можно посмотреть на сегодняшней версии: https://yadi.sk/i/KIbu6T_h8WcBWw
- - - Добавлено - - -
Вообще, на мой взгляд, используются БМК в УКНЦ просто расточительно)
Этот опрос клавиатуры любой уважающий себя спектрум делает программно. А тут больше половины чипа на 6000 транзисторов на клавиатуру угрохали.
для начала надо отделить мухи от котлет
1. спектрум это игровое изделие, сугубо. да, используемый процессор z80 хорош для своего времени.
2. PDP-11 это серьезные машины, которые летали в космос, управляли ракетами, подводными лодками, истребителями и атомными электростанциями. посмотрите на ТУ 1806ВМ2 - там типовые ускорения 500G и разовые 1500G - догадаетесь для каких целей такие процессоры ?
лет 10 назад видел вакансию в канаде - требовался специалист поддержки управления АЭС на PDP-11 тк до 2050ого года ее не планируется менять на что-то другое.
следствие из этого - для игрового изделия вполне допустимо работать с клавиатурой программно, а вот для серьезной машины нет.
У УКНЦ и так целый второй процессор для обслуживания перефирии есть.
У УКНЦ и так целый второй процессор для обслуживания перефирии есть.
И если учесть количество периферии, который он обслуживает в реальном времени - тратить ресурсы на (программный) опрос клавиатуры - глупость.
Black Cat / Era CG
14.11.2019, 09:30
1. спектрум это игровое изделие, сугубо.
Нет. Спектрум это дешевый комп для обучения и дома.
"Игровым" он стал только благодаря низкой цене и отсутствия необходимости лицензирования софта. Ничего игрового внутри него нет. Если он и "игровой", то скорее вопреки своим потрохам, а не наоборот.
Не ожидал холиварчика на эту тему и в этой теме) думалось, что все согласятся с нерациональностью железа УКНЦ и его фактической эффективности/быстродействия)
дай угадаю
нажатие 2-х клавишь при этом он не обрабатывает?
и ВСЁ идет лесом...
А вот и не угадали. Возможно одновременное нажатие клавиш, которые расположены на разных линиях Y, с Y3 по Y15, итого до 13 клавиш.
2. PDP-11 это серьезные машины, которые летали в космос, управляли ракетами, подводными лодками, истребителями и атомными электростанциями. посмотрите на ТУ 1806ВМ2 - там типовые ускорения 500G и разовые 1500G - догадаетесь для каких целей такие процессоры ?
PDP-11 - серьезные, надежные, но УКНЦ к этой надежности и серьезности не имеет никакого отношения.
Это школьный компьютер.
Кстати, на 1801ВМ2 никакого грифа секретности не стоит? Не возьмут нас за попу, за то, что мы его тут на форуме реверсили?
- - - Добавлено - - -
И если учесть количество периферии, который он обслуживает в реальном времени - тратить ресурсы на (программный) опрос клавиатуры - глупость.
Чего он такого обслуживает в реальном времени? )
Не ожидал холиварчика на эту тему и в этой теме) думалось, что все согласятся с нерациональностью железа УКНЦ и его фактической эффективности/быстродействия)
С точки зрения PDP-11 вполне рационально. Ведь есть еще RSX-11M, там драйвера не должны подвешивать систему при работе с устройствами, дал команду, установил флаг прерывания. Устройство отработало, запросило прерывание, обработал прерывание, получил результат.
К тому же в УКНЦ на ПП висят куча устройств, надо всё обработать и ничего не подвесить. С точки зрения программной обработки клавиш - это клавиатура МС7004 на ДВК. Там прошивка в микроконтроллере действительно программно опрашивает клавиатуру, формирует коды нажатия и отжатия, и даже по последовательному порту также программно общается со скоростью 2400 бод.
Там прошивка в микроконтроллере действительно программно опрашивает клавиатуру, формирует коды нажатия и отжатия, и даже по последовательному порту также программно общается со скоростью 2400 бод.
Это я знаю, я же писал эмуляцию ее тоже)
Другое дело, что в ДВК только один процессор, а клавиатуру опрашивает, скажем, 580ВМ80.
А тут два процессора, и такую мелкую функцию, как опрос, вполне он мог бы делать.
А тут два процессора, и такую мелкую функцию, как опрос, вполне он мог бы делать.
Один процессор центральный, архитектура адресного пространства которого соответствует архитектуре PDP-11, в данном случае LSI-11. Потому он не может заниматься клавиатурой. Второй, периферийный, является контроллером всех устройств. Действительно, можно было бы сделать опрос программно, но много нажатий клавиш могли и упустить, распухла бы программа в ПЗУ, а там и так 31,5 Кб забит почти под завязку. Так что была возможность, её и реализовали, впихнули оба процессора в моноблок. А если УКНЦ сделать на рассыпухе, то какого объёма нужен шкаф?
А если УКНЦ сделать на рассыпухе, то какого объёма нужен шкаф?
Я думаю, что небольшого. Жирных чипов там не так уж много, а все эти 1801ВП1 значительно скромнее по содержимому.
- - - Добавлено - - -
Действительно, можно было бы сделать опрос программно, но много нажатий клавиш могли и упустить, распухла бы программа в ПЗУ, а там и так 31,5 Кб забит почти под завязку.
Не согласен. Опрос клавиатуры - вещь простейшая и копеечная. Хоть с отжатиями, хоть с многонажатиями.
В качестве примера где есть один процессор, он и центральный, он и периферийный - это Союз-Неон ПК-11/16. Но его архитектура немного не соответствует LSI-11, вся программная эмуляция выполняется в HALT-режиме.
В качестве примера где есть один процессор, он и центральный, он и периферийный - это Союз-Неон ПК-11/16. Но его архитектура немного не соответствует LSI-11, вся программная эмуляция выполняется в HALT-режиме.
Это опять же не наш случай. У нас их два)
Кстати, еще один кирпич в огород нерациональности - это 8-битная шина у ПП. 8-битная! Убийца быстродействия и пропускной способности.
NEO SPECTRUMAN
14.11.2019, 13:09
Не согласен. Опрос клавиатуры - вещь простейшая и копеечная. Хоть с отжатиями, хоть с многонажатиями.
+100500
при такой дубовосте применяемого *****кодинга
затраченное время на опрос - капля в море
и кого это оно должно вешать?
это быстрей прерывание от клавиатуры что нибудь повесит
Кстати, еще один кирпич в огород нерациональности - это 8-битная шина у ПП. 8-битная! Убийца быстродействия и пропускной способности.
А вот здесь я полностью согласен. В своё время, исследуя контроллер дисковода, я писал программы чтения дорожки целиком после форматирования. Так программу пришлось сильно оптимизировать, загнать многие значения в регистры, иначе за 64 мкс не успевал обработать данные с контроллера, программа же находилась в ОЗУ ПП.
Да и к тому же это должно усложнить контроллер 1515ХМ1-032 (1515ХМ2-002), ведь чтение слова производится за два приема.
Вот мне непонятно, зачем они сделали 8 бит? Раз они так разбрасываются БМК-шками, чего стоило 16-бит устроить для ПП?
Вот мне непонятно, зачем они сделали 8 бит? Раз они так разбрасываются БМК-шками, чего стоило 16-бит устроить для ПП?
Предполагаю, что это связано со структурой видеопамяти - 3 плана. Ведь чтение и запись можно делать через спрайтовый механизм, это усложняло бы работу с одним планом на аппаратном уровне. К тому же видеоконтроллер также читает данные с трех планов по одному адресу.
ведь чтение слова производится за два приема.
На плате 1201.2018 стоит восьми битное ПЗУ, чтение слова из которого производится за один такт процессора.
Так что не обязательно - всё зависит от соотношения скорострельностей процессора и памяти.
И из-за хорошего быстродействия памяти - усложнение местного контроллера шина - копеечное.
Да скорее всего хотели сэкономить на памяти. Хотя я схему не видел, не уверен, что в этом дело.
Ну, или почти разгадана, осталось немного мелкой логики.
После перевода логики контроллера клавиатуры из гигантской запутанной паутины в осмысленный вид, от первой страницы схемы осталось практически ничего.
https://yadi.sk/i/D-I2cU2nlzdiZg
Ну, или почти разгадана
что то ощущения эпичности\грандиозности происходящего нет.
какая там тайна у клавиатуры? слишком большой буфер на
отправку "нажатой клавиши" на терминал - это есть, остальное
вряд ли такая уж тайна...
- - - Добавлено - - -
Зеленоградские программисты полностью подчиняли себе клавиатуру УК-НЦ без всяких расчленёнок МС ))) Все серые и красные кнопки, просто исходников увы не сохранилось...
Вот мне непонятно, зачем они сделали 8 бит? Раз они так разбрасываются БМК-шками, чего стоило 16-бит устроить для ПП?
наверно не влезало на плату 4 линейки ру5 да еще и цена возросла бы, может плату пришлось бы городить 4-х слойную или 2 платы одна над другой как в пк8000, все еще усугубилось тем что они хотели жЫрную инженерную графику что конечно с такими тормозными процессорами совсем печально медленная штука
Этот документ нужно сканировать?
70669
Этот документ нужно сканировать?
Обязательно нужно!
1515ХМ1. Инструкция по разработке МБИС с применением САПР (66 МБ).
https://cloud.mail.ru/public/4TW3/4D7nKBzsh
1515ХМ1. Инструкция по разработке МБИС с применением САПР
ребята, подскажите как уменьшить вес? это нереально много для ч\б страничек, то же касается и пред. сканов,
слишком вес зашкаливает...
CodeMaster
15.11.2019, 20:42
слишком вес зашкаливает...
У меня браузер дохнет на 4-й странице.
У меня браузер дохнет на 4-й странице.
в настройках измени "предпросмотр" на всегда сохранять и настрой вменяемую "карантин" папку для сохранение из веб. С локального диска всё норм, но заливать такой объём в библиотеку архива грустнее грустного...
пред. сканы лились час почти - да ну! ещё и связь рвётся постоянно...
- - - Добавлено - - -
там пред. сканы то же были 109 и 80 кило - не хилО ?
1515ХМ1. Инструкция по разработке МБИС с применением САПР (11 МБ).
https://cloud.mail.ru/public/5tQa/5orNmgrCq
- - - Добавлено - - -
КА1515ХМ1 технические условия, справочный лист и др. (20 МБ).
https://cloud.mail.ru/public/3qmT/ouV5hXXDv
В качестве примера где есть один процессор, он и центральный, он и периферийный - это Союз-Неон ПК-11/16. Но его архитектура немного не соответствует LSI-11, вся программная эмуляция выполняется в HALT-режиме.Справедливости ради нужно сказать, что и у Неона опросом клавиатуры также занимается отдельный контроллер i8279. Причем у этого чипа ограничение есть в размере матрицы клавиатуры: 8х8, а клавиш там заметно больше. Вот и при нажатии тех, которым не повезло быть в числе первых 64 имитируется одновременное нажатие двух клавиш (повбывав бы!).
Что касается 8 бит шины, то может быть расчет использование БИС серии К580. Ну и печатная плата проще...
Ynicky, а ХМ2 маленький будет? )
Теперь полностью собрана система тактирования клавиатуры.
Таким образом, часть с клавиатурой готова, и можно полюбоваться на этого монстра.
Много чего там интересного.
Например, счетчик Y тактируется частотой 1/8 CLK1_24,
а счетчик X тактируется по-разному:
1. Если SYNC акивен, а DIN и DOUT неактивны, то тактирование X переключается на 1/8 CLK1_24.
2. Если SYNC и DIN, активны, а DOUT неактивен, то тактирование X переключается на 1/128 CLK1_24.
Да, и разумеется, так и осталась загадка, зачем при одновременно активных SYNC, DIN и DOUT (что по словам опытных PDP-шников быть не может, и, возможно, сделано для тестового режима), тактирование клавиатуры убыстряется в 24 раза до следующего INIT.
https://yadi.sk/i/GYDCS2mBaZ6OuQ
Скан ТУ на КА1515ХМ2 (17,5 МБ).
https://cloud.mail.ru/public/3XpT/2V1mL78B8
счетчик X тактируется по-разному:
1. Если SYNC акивен, а DIN и DOUT неактивны, то тактирование X переключается на 1/8 CLK1_24.
2. Если SYNC и DIN, активны, а DOUT неактивен, то тактирование X переключается на 1/128 CLK1_24.
Да, и разумеется, так и осталась загадка, зачем при одновременно активных SYNC, DIN и DOUT (что по словам опытных PDP-шников быть не может, и, возможно, сделано для тестового режима), тактирование клавиатуры убыстряется в 24 раза до следующего INIT.
Скорее всего это сделано для контроля кристалла на стендовой аппаратуре. Подключили питание, подключили тактовый генератор, управляем по SYNC, DIN, DOUT, INIT, и смотрим, что творится на выходах X.
И по поводу тактирования счетчика X - неправильно написали. Надо так:
1. Если SYNC неактивен, DIN и DOUT активны (запрещённая комбинация в МПИ), то тактирование X переключается на 1/8 CLK1_24.
2. Если SYNC и DIN неактивны, а DOUT активен (запрещённая комбинация в МПИ), то тактирование X переключается на 1/128 CLK1_24.
И кстати по INIT тактирование также переключается на 1/128 CLK1_24, что и должно быть, это со старшего разряда счетчика Y.
И по поводу тактирования счетчика X - неправильно написали. Надо так:
Да, поспешил, на полярность не посмотрел.
Значит эти две комбинации запрещенные.
Да еще третья, где активны SYNC, DIN и DOUT.
Получается три комбинации запрещенных для стенда.
- - - Добавлено - - -
Что у нас известно про неиспользуемый бит 13 регистра управления (177716)?
Что у нас известно про неиспользуемый бит 13 регистра управления (177716)?
Вроде писал здесь (https://zx-pk.ru/threads/30964-revers-inzhiniring-bmk-1515khm1-2.html?p=1031367&viewfull=1#post1031367) и здесь (https://zx-pk.ru/threads/30964-revers-inzhiniring-bmk-1515khm1-2.html?p=1031381&viewfull=1#post1031381). Но повторюсь.
В старом ТО упоминается бит 13 регистра 0177716, который переключает векторные прерывания 304 и 310 на вывод IRQ, действительно работает.
По старому ТО при установке бита 13 регистра 0177716 векторные запросы 304 и 310 должны были идти на вывод IRQ, вместо VIRQ. А вывод IRQ должен был быть подключен на вход HALT ПП. Так что в этом случае прерывалась бы по прерыванию HALT. Прерывалось бы всегда, независимо от установки бита 7 в PSW, такое вот высокоприоритетное, маломаскируемое прерывание.
Кстати, совершенно непонятно, зачем при активном EP в порт Y выводят не только значение регистра KBD_BUS, но еще и сигнал KBD_BUS_READ, который никогда не может быть активным при выводе в порт, т.е. всегда будет давать единицу.
- - - Добавлено - - -
А, нет. Вру, конечно. При активном EP он постоянно будет тусоваться на порту.
Видимо, Y1 и Y2 тоже в этом случае для каких-то отладочных целей используется.
А, нет. Вру, конечно. При активном EP он постоянно будет тусоваться на порту.
Видимо, Y1 и Y2 тоже в этом случае для каких-то отладочных целей используется.
А что, записал в порт Y (0177104) с установленным EP, тут же сделал его чтение, ну и при чтении проскочил строб KBD_BUS_READ, типа того, что данные выставлены, можно записать.
Но в СЭМЗ-овской схемотехнике в качестве строба используется именно EP.
Интересное декодирование происходит сигнала с магнитофона со входа EXT.
Интересное декодирование происходит сигнала с магнитофона со входа EXT.
Должно же учитываться изменение уровня сигнала. По изменению уровня должен перезагружаться счетчик таймера из буфера, да и замораживаться регистр текущего значения таймера.
Должно же учитываться изменение уровня сигнала. По изменению уровня должен перезагружаться счетчик таймера из буфера, да и замораживаться регистр текущего значения таймера.
Да, все это идет куда-то к таймеру)
- - - Добавлено - - -
Стал разбираться - что за странный алгоритм декодирования сигнала с магнитофона.
Оказалось, две линии перепутал на стыке двух страниц) Но теперь исправил)
- - - Добавлено - - -
В общем, все просто. Любая смена фронта на EXT, дает короткий импульс на выходе декодера.
Ширина импульса равна одному полу-периоду тактовой частоты таймера, которая, в свою очередь, выбирается программно.
Впрочем, я еще пока не знаю, куда этот импульс идет, и важна ли его ширина вообще.
Однако, т.к. декодер тактируется частотой таймер, а определение перепадов импульсов синхронно с ней, то чем меньше частота, тем хуже разрешающая способность декодера, и есть вероятность пропуска коротких импульсов на EXT. Что, впрочем, может тоже не важно для магнитофонной записи)
Вы будете смеяться, но пока я не нашел, чтобы таймер останавливался иначе, кроме, как нулевому биту регистра состояния таймера)
https://pic.maxiol.com/images2/1573978729.1504841820.01.png
Добавилась схема тактирования таймера и кое-что еще.
https://yadi.sk/i/ZpBnW8vHUFnN4w
Пока что логика такая:
Постоянная автозагрузка буферного регистра в регистр текущего значения идет, если:
1. TMR_STATE_Q0 = 0 (режим СТОП таймера)
2. TMR_STATE_Q0 = 1 (режим ПУСК таймера), SYS_CON_Q13 = 0 (зарезервированный бит), и TMR_CUR = 0 (регистр текущего значения таймера равен нулю).
Так же идет однократная загрузка буферного регистра в регистр текущего значения, если определена смена фронта на входе EXT (магнитофон), и TMR_STATE_Q0 = 1 (режим ПУСК таймера).
Логики остановки счета таймера иной, кроме как по TMR_STATE_Q0 = 0 (режим СТОП таймера), не обнаружено.
Вы будете смеяться, но пока я не нашел, чтобы таймер останавливался иначе, кроме, как нулевому биту регистра состояния таймера)
А собственно сам таймер никогда и не останавливается (кроме как режим СТОП), замораживаться должен регистр текущего значения (который 0177714).
Ура! Значит я все правильно расшифровал)
Разобрал все до винтика.
Интересно, но в чипе НЕТ никакого механизма задания адресов векторов прерываний, которые различны для разных событий.
На все три типа прерывания он отвечает /VIRQ и /IAKO.
Где же задается вектор?
Где же задается вектор?
Вектор выставляется по сигналам DIN и IAKI, если конечно был запрошен по VIRQ. Так как вектора 300, 304 и 310, то на землю обязательно сажаем AD07 и AD06, а там в зависимости от ситуации AD03 или AD04, или ничего.
Точно. Не обратил внимания, что вектор выставляется всего несколькими битами)
Итак, чуть более, чем за месяц, вычерпано 10000 ведер воды сложной, но интересной работы.
Итак, вашему вниманию предлагается полностью распознанная и приведенная в человеческий вид внутренняя схема 1515ХМ2-001 (https://yadi.sk/i/XLIQ0UCwYjMrdQ).
Теперь все секреты и нюансы ХМ2-001 понятны каждому порядочному УКНЦ-шнику.
И одной тайной УКНЦ стало меньше.
Конечно, никаких секретных регистров или бит не обнаружено, но множество нюансов работы теперь видны, как на ладони.
Разумеется, всякие ошибки и замечания (а они будут) пишем сюда.
- - - Добавлено - - -
Вроде писал здесь и здесь. Но повторюсь.
В старом ТО упоминается бит 13 регистра 0177716, который переключает векторные прерывания 304 и 310 на вывод IRQ, действительно работает.
Замечу, что ничего подобного бит 13 не делает, а просто блокирует возникновение события обнуления таймера.
LeoN65816
19.11.2019, 08:39
Безусловно проведена огромная работа, результаты очень знАчимы. Искренний респект тебе!
Маленькая ложка дёгтя к бочке мёда: очень такие красивые диаграммы состояний сигналов на схеме. Однако, они не совсем соответствуют действительности - повсюду асинхронные схемы, каждый из элементов имеет некоторую задержку срабатывания, плюс линии внутренних соединений также вносят свои задержки, сотвественно реальные диаграммы будут иметь приличные задержки и иголки (некоторые сигналы есть функция регистров и комбинаторики), которые тоже надо учитывать...
Повторюсь: огромный, тяжёлый, значительный труд. Очень знАчимый вклад в расшифровке "чёрного ящика". Уважуха! :v2_dizzy_punk:
PS. Уважаемые модераторы и администраторы, а нельзя ли и у нас на форуме ввести подобную (https://www.phantom.sannata.org/app.php/flair#flair5) систему поощрений? Работа Titus-а сразу же "тянет" на золотую дискетку.
Работа Titus-а сразу же "тянет" на золотую дискетку. ИМХО:
Титус за прежние заслуги по теме PDP и ДВК\УК-НЦ уже признан званием доктор гонорис кауза,
теперь только в кремль и за заслуги перед Отечеством, лично от президента - ниже планку опускать нельзя!!!
Теперь все секреты и нюансы ХМ2-001 понятны каждому порядочному УКНЦ-шнику.
И одной тайной УКНЦ стало меньше.
Теперь дело за малым - реверс 1515XM1-032, 1515XM2-003 и 1515XM1-036 как минимум. И тогда глядишь УКНЦ в формате mITX станет для некоторых реальностью :)
Маленькая ложка дёгтя к бочке мёда: очень такие красивые диаграммы состояний сигналов на схеме. Однако, они не совсем соответствуют действительности - повсюду асинхронные схемы, каждый из элементов имеет некоторую задержку срабатывания, плюс линии внутренних соединений также вносят свои задержки, сотвественно реальные диаграммы будут иметь приличные задержки и иголки (некоторые сигналы есть функция регистров и комбинаторики), которые тоже надо учитывать...
Основная цель реверса - это восстановить точную схему работы чипа на логическом уровне.
Чтобы любой человек мог взглянуть и понять - ага, вот так и так оно работает.
Чтобы, если кто захочет, мог упрятать схему в ПЛИС и получить полностью совместимую реплику.
Что касается задержек и иголок.
1. Внутренние тактовые частоты чипа столь малы, по сравнению с задержками на вентилях, что задержкой распространения сигнала, я думаю, точно можно пренебречь. Кроме того, разработчики, разумеется, тоже все это учитывали.
2. Внутренние иголки так же скомпенсированы разработчиками, иначе триггеры и другие элементы с потенциальными иголками в местах расхождения протифовазных сигналов, нещадно бы глючили.
3. Внешние иголки скорее всего тоже отсутствуют, т.к. смотри пункт 2. Кроме того, емкость затворов выходных ключей столь массивна, что вряд ли успевает перезаряжаться какими-нибудь 5нс иголками.
Словом, на мой взгляд нет смысла учитывать наносекундные погрешности ни для эмуляции, ни для репликации, ни для понимания.
А кому интересно - есть неоптимизированная схема первого этапа реверса, есть фотка кристалла)
p.s.: Кстати, на шине AD_OUT сигналы должны обьединяться по OR, а не просто тупо электрически. Дорисую в следующей версии, чтобы все было точно.
- - - Добавлено - - -
Теперь дело за малым - реверс 1515XM1-032, 1515XM2-003 и 1515XM1-036 как минимум. И тогда глядишь УКНЦ в формате mITX станет для некоторых реальностью
Для малого нужно чтобы наш товарищ Vslav нафоткал эти чипы как мининмум.
А как максимум - сфоткать все чипы.
В идеале - сфоткать редкие чипы ХМ2-002 и раритетный ХМ1-033, чтобы понять, как был устроен прототип УКНЦ.
Вопрос к Alex_K - что у нас интересненького в ХМ2-003 (ХМ1-039)?
- - - Добавлено - - -
Глянул на ХМ2-003. В отличие от ХМ2-001, где необозначенные выводы (2 шт) просто не были заведены на кристалл, в ХМ2-003 необозначенные выводы (1 шт) на кристалл заведены.
Вид портов следующий:
1. Входы - 10, 13, 16-20, 51-53
2. Выходы с открытым коллектором - 12, 15, 21
3. Выходы комплиментарные - 11, 14, 22-23, 42-50, 54-56
4. Входы-выходы с открытым коллектором - 41
5. Входы-выходы комплиментарные - 1-9, 24-31, 33-40, 57-63
Необозначенный вывод номер 21 (выход с открытым коллектором).
Итак, вашему вниманию предлагается полностью распознанная и приведенная в человеческий вид внутренняя схема 1515ХМ2-001 (https://yadi.sk/i/XLIQ0UCwYjMrdQ).
А там реально внутри шина с 3-состояниями (на ADn)?
Или таки честный мультиплексор ?
А там реально внутри шина с 3-состояниями (на ADn)?
Или таки честный мультиплексор ?
Имеется в виду выходной каскад AD? Да, там с тремя состояниями.
Есть еще внутренняя шина AD_OUT.
Там все источники складываются по OR (это я еще добавлю в схему). Но помешать друг другу они не могут, потому что одновременно активен может быть только один из них.
- - - Добавлено - - -
Исправил недочеты (https://yadi.sk/i/CaSrhe0Qu7N6VA) и по мелочам шлифанул.
Теперь на внутреннюю шину данные смешиваются, как и положено по OR, через мегабуфер высотой в 7 этажей) Т.е. регистров)
Можно было бы, конечно, с учетом того, что регистры никогда не пишутся на внутреннюю шину одновременно, нафантазировать псевдо-Z состояние на этой шине, но это было бы неправдой. Так что пусть будет 7 этажей)
Есть еще внутренняя шина AD_OUT.
Там все источники складываются по OR
Да, я спрашивал про AD_OUT. Меня удивило наличие шины с третьим состоянием внутри КМОП-микросхемы.
Теперь на внутреннюю шину данные смешиваются, как и положено по OR, через мегабуфер высотой в 7 этажей) Т.е. регистров)
Тогда и "OE" надо переименовывать в "&". Улетаем в полный нестандарт. Люди вне контекста схему сходу не поймут.
Тогда и "OE" надо переименовывать в "&". Улетаем в полный нестандарт. Люди вне контекста схему сходу не поймут.
Зачем? OE - это не третье состояние, а разрешение вывода. Если запрещено, то на выходе ноль.
Зачем? OE - это не третье состояние, а разрешение вывода. Если запрещено, то на выходе ноль.
Это же не буфер, это просто элементы И.
Это же не буфер, это просто элементы И.
Давай уточним, про какую именно микросхему ты говоришь.
Давай уточним, про какую именно микросхему ты говоришь.
Про BUF_TMR_CUR, BUF_SYS_CON и так далее вниз.
Про BUF_TMR_CUR, BUF_SYS_CON и так далее вниз.
Так это самые обычные буфера.
Микросхема U9, которая обьединяет шины по 'ИЛИ', стоит после них, и не имеет входов OE.
Так это самые обычные буфера.
А что такое "обычный" буфер ? 155ЛН4 это обычный буфер? Совпадает с твоим функционалом?
Буфер - это то, что не выполняет никакой логической функции. В крайнем случае инверсия.
Внутри этих блоков выполняется логическое И, причем один из входов (OE) - размножается.
В итоге мультиплексор нарисован вообще непонятно как. И было (до коррекции) вообще печально - все
выходы "буферов" просто тупо соединялись в шину. Проблема в том, что в таком виде утрачивается
информация об исходном построении схемы.
1. Мои буфера BUF_TMR_CUR, BUF_SYS_CON и т.д. не выполняют никакой логической функции.
2. Логическую функцию - обьединение по 'ИЛИ' выполняет U9.
Мои буфера
>в части значений используется вариант склонения по типу 1a с формами множественного числа: бу́феры, бу́феров и т. д. (данный вариант не признан нормативными словарями).
Злые языки говорят что это как раз наш случай, мы же не про анатомию ;-)
бу́феры, бу́феров и т. д. (данный вариант не признан нормативными словарями).
Учитывая повышенное внимание, прикованное к ним, это именно буферА)
1. Мои буфера BUF_TMR_CUR, BUF_SYS_CON и т.д. не выполняют никакой логической функции.
Выполняют. Логическое "И" со входом OE.
"Ты суслика видишь? А он - есть".
Выполняют. Логическое "И" со входом OE.
"Ты суслика видишь? А он - есть".
Вот ты про что)
Я думаю, что если я вместо OE напишу &, то это запутает людей больше, чем OE.
OE ассоциативно всем понятно. Никто, кроме тебя, даже не спросил, что это и зачем)
Вот ты про что)
OE ассоциативно всем понятно. Никто, кроме тебя, даже не спросил, что это и зачем)
OE - Output Enable - "Разрешение выхода", обычно это относится к разрешению выходного драйвера, выход из высокоимпедансного состояния.
И была шина нарисована, как это можно было понимать иначе, как буферы с 3-им состоянием?
OE - Output Enable - "Разрешение выхода", обычно это относится к разрешению выходного драйвера, выход из высокоимпедансного состояния.
И была шина нарисована, как это можно было понимать иначе, как буферы с 3-им состоянием?
Нет смысла ссылаться на версию схемы, где все выходило в одну шину, т.к. это был незаконченный вариант.
Альтернативы названию OE -я не вижу. Во всяком случае знак '&' точно запутает. Да, чаще всего OE используется для перевода выходов в 3-ье сотояние. Но вполне себе стандартны микросхемы, использующие OE для перевода выходов в 0 или 1 (в зависимости от полярности). Например 74151.
Во всяком случае знак '&' точно запутает.
С моей точки зрения знак '&' уже ничего не запутает, все украдено запутано до нас заменой кучки элементов "И" на невнятный "буфер". Общая картинка как бы стала лучше (для человека в контексте), а вот суть потеряна.
С моей точки зрения знак '&' уже ничего не запутает, все украдено запутано до нас заменой кучки элементов "И" на невнятный "буфер". Общая картинка как бы стала лучше (для человека в контексте), а вот суть потеряна.
Приведи пример, где микросхемы имеют вход обозначенный, как '&'.
Приведи пример, где микросхемы имеют вход обозначенный, как '&'.
Я утверждал что "&" хуже не сделает (в шутку).
Я не утверждал что "&" поможет.
Если делать правильно (с моей точки зрения) - то надо вернуть схемы "И", это отобразит суть.
Забавно, что если переводить схему в верилог, то там эти "И" будут явно указаны.
В "честной" поячеечной схеме эти "И" тоже будут видны.
А вот на твоей промежуточной схеме - их нет, они неочевидны.
Впрочем, проект твой, так что, конечно, я ни на чем не настаиваю.
Обновленная версия (https://yadi.sk/d/WcMeAEsDv1p7Yw).
В том числе и с учетом замечаний Vslav'а, по поводу уточнений, связанных с внутренней структурой управляемых буферов.
Так же оптимизирован и переструктуирован контроллер клавиатуры, ввиду того, что у него были части, которые вообще никак не сказывались на функциональности, т.к. обладали логической избыточностью. Например, в RS-триггере сбрасывался бит только в том случае, если он установлен. Тогда как это условие никак не влияет на результат, потому что установлен бит или нет, в итоге он все равно сбрасывается.
Тактовая частота контроллера клавиатуры CLK_KBD = 1/24 CLC. CLC = 6.25МГц (0.16мкс). Таким образом, период CLK_KBD = 3.84мкс. Из CLK_KBD формируется рабочая тактовая частота CLK_KBD1_16 = 1/16 CLK_KBD (период 61.44мкс), а так же вспомогательные фазы CLK_KBD_0B и CLK_KBD_0D.
Счетчик CTR_KBD_Y, управляющий сканированием столбцов Y, тактируется CLK_KBD1_16, и считает циклически от 0 до 0x0F.
Счетчик CTR_KBD_X, управляющий бегущим нулем на X, тактируется CLK_KBD1_16 * 16 (983.04мкс), считает циклически от 0 до 0x0F, причем, счет 0..0x7 - фаза нажатия клавиш, счет 0x08 - фаза отжатия клавиш, 0x09..0x0F - холостая фаза.
Таким образом, один полный цикл опроса клавиатуры занимает 15728.64мкс (15.728мс), что равно почти целому кадру развертки.
На каждый счет CTR_KBD_X, приходится полный цикл сканирования столбцов Y (1..15, 0-й столбец отсутствует).
Код нажатой клавиши в регистре KBD_DATA формируется из текущего состояния обеих счетчиков. Старший полубайт - это счетчик CTR_KBD_X, младший полубайт - это счетчик CTR_KBD_Y.
Остановка тактовой частоты CLK_KBD происходит по событию KEY_READY, которое, в свою очередь, формируется по заднему фронту события KEY_MISMATCH, которое формируется всякий раз при нажатии или отжатии клавиши.
По чтению регистра данных клавиатуры KBD_DATA, снимается событие KEY_READY, и тактовая частота запускается заново.
Бегущий ноль на линии X промодулирован частотой CLK_KBD1_16. Т.е. активен во время низкого уровня CLK_KBD1_16.
В этой же тактовой фазе активен сигнал на выходе дешифратора DC_CTR_Y, который управляет сканированием линий Y.
Основные модули контроллера:
Y_MEMORY_A, Y_MEMORY_B и Y_MEMORY_C - регистры, запоминающие столбцы Y, в которых нажата хотя бы одна клавиша.
Y_MEMORY_A - отражает текущее состояние столбцов, т.к. целиком очищается перед фазой сканирования, а устанавливается во время фазы сканирования.
Y_MEMORY_B - отражает суммарное предыдущее и текущее состояние столбцов с нажатыми клавишами. Регистр не очищается после предыдущего цикла, а устанавливается аналогично Y_MEMORY_A во время фазы сканирования. Очистка Y_MEMORY_B происходит копированием содержимого Y_MEMORY_A во второй фазе цикла.
Y_MEMORY_C - хранит предыдущую копию Y_MEMORY_B, и обновляется в тактовом цикле CLK_KBD_0D. На основе разницы Y_MEMORY_B и Y_MEMORY_C формируется событие нажатия/отжатия клавиши KEY_MISMATCH.
Главный цикл опроса клавиатуры состоит из трех фаз - фазы определения нажатия клавиши, фазы определения отжатия клавиши, и холостой фазы.
Первая фаза - определение нажатия клавиш (счетчик CTR_KBD_X = 0x00..0x07):
В активной фазе CLK_KBD1_16 (CLK_KBD1_16 = 0) схемой COL_Y_COMP сигнал на выходе дешифратора сравнивается с входами порта Y. В случае наличия на соответствующeй линии нуля (нажата клавиша на пересечении ряда X, и столбца Y), в регистрах Y_MEMORY_A и Y_MEMORY_B устанавливается бит соответствующий столбцу Y. Если обновленное содержимое Y_MEMORY_B отличается от значения, зафиксированного в предыдущем цикле в Y_MEMORY_C, то возникает событие KEY_MISMATCH.
По окончанию активной фазы CLK_KBD1_16, снимается сигнал с линий X, вследствие чего пропадает сигнал и на линиях Y. Также отключается дешифратор DC_CTR_Y, управляющий компаратором COL_Y_COMP.
После этого следует короткий импульс тактового цикла CLK_KBD_0D, записывающий текущее значение Y_MEMORY_B в регистр последнего значения Y_MEMORY_C, вследствие чего отключается событие KEY_MISMATCH, если оно было активно. По снятию события KEY_MISMATCH активизируется событие KEY_READY, останавливающее тактирование CLK_KBD, предлагая программе считать из регистра KEY_DATA код нажатой клавиши. После чтения кода клавиши, тактирование CLK_KBD возобновляется.
Вторая фаза - определение отжатия клавиш (счетчик CTR_KBD_X = 0x08):
В активной фазе CLK_KBD1_16 (CLK_KBD1_16 = 0) на линии X0 так же появляются тактовые импульсы CLK_KBD1_16, что является побочным эффектом и не используется. Схема сравнения COL_Y_COMP отключена.
По окончанию активной фазы CLK_KBD1_16, следует короткий импульс тактового цикла CLK_KBD_0B, по которому в регистре Y_MEMORY_B сбрасывается текущий бит, если сброшен такой же бит в регистре Y_MEMORY_A.
Таким образом, если Y_MEMORY_B все еще помнит клавишу, нажатую в предыдущем цикле, а в текущем цикле она была отпущена (отсутствует в Y_MEMORY_A), возникает событие KEY_MISMATCH.
После этого следует короткий импульс тактового цикла CLK_KBD_0D, по которому сбрасывается бит в регистре Y_MEMORY_A, соответствующий линии Y. Т.е. фактически происходит очистка Y_MEMORY_A перед следующим циклом.
Также переписывается Y_MEMORY_B в Y_MEMORY_C, вследствие чего отключается событие KEY_MISMATCH, если оно было активно. По снятию события KEY_MISMATCH активизируется событие KEY_READY, останавливающее тактирование CLK_KBD, предлагая программе считать из регистра KEY_DATA код отжатой клавиши. После чтения кода отжатия клавиши, тактирование CLK_KBD возобновляется.
Третья фаза - холостая (счетчик CTR_KBD_X = 0x09..0x0F):
В этой фазе так же появляется бегущий ноль на линиях X, промодулированный по CLK_KBD1_16, однако это никак не используется.
Влияние EP на опрос клавиатуры:
EP также, как и активное событие KEY_READY, блокирует установку нажатой клавиши в регистрах Y_MEMORY_A и Y_MEMORY_B в первой фазе цикла опроса. Следует заметить, что блокировка по KEY_READY является излишней, т.к. во время события KEY_READY тактовая частота контроллера клавиатуры остановлена.
Помимо этого, EP запрещает бегущий ноль на линиях X.
Также, EP разрешает вывод регистра KBD_BUS на линии Y. Кроме содержимого KBD_BUS (линии Y3..Y15), на линию Y2 выводится тактовая частота контроллера клавиатуры CLK_KBD, а на линию Y1 - сигнал чтения регистра KBD_BUS.
Условно недокументированные особенности, возможности и ошибки:
1. Поскольку код нажатия клавиши формируется в момент фактического нажатия, когда счетчики Y и X указывают на конкретную клавишу, в регистре KBD_DATA формируется полный код нажатой клавиши.
Однако, код отжатия клавиши формируется уже после фактического отжатия клавиши, когда счетчик Y указывает на актуальный столбец, а счетчик X указывает на ряд 0. Поэтому в регистре KBD_DATA формируется неполный код отжатия клавиши, по которому можно определить лишь столбец Y, в котором отпущены все клавиши, но не ряд X.
2. Из регистра KBD_BUS (177704) можно считывать состояние порта Y в реальном времени.
3. Из регистра KBD_DATA (177702) можно считывать текущее состояние счетчиков CTR_KBD_X и CTR_KBD_Y. Причем, учитывая, что чтение счетчиков никак не синхронизировано с тактовой частотой контроллера клавиатуры, не исключена возможность чтения счетчиков в промежуточной фазе счета, когда одна часть счетчика уже установлена, а другая нет. Для того, чтобы понять, возможно ли такое попадание в середину фазы счета, надо изучать всю схемотехнику УКНЦ в целом.
4. Если в течение одного цикла счетчика CTR_KBD_X нажаты и удерживаются две и более клавиши в одном столбце, то первое чтение KBD_DATA, даст код первой зафиксированной в столбце клавиши. Вторая и остальные нажатые в этом цикле, и в этом столбце клавиши, определены не будут. Т.е. фактически одновременное нажатие нескольких клавиш в столбце может привести к потере события нажатия одной из них.
5. Возможно написание собственного опроса клавиатуры, т.к. программно доступны счетчики X, Y, и состояние порта Y. На практике же такой опрос будет очень медленным, из-за того, что полный цикл сканирования клавиатуры равен почти 16мс, что сопоставимо с размером одного кадра развертки (20мс).
6. Все биты счетчиков CTR_KBD_X и CTR_KBD_Y сбрасываются по INIT, за исключением бита 0 счетчика CTR_KBD_X, который сбрасывается по DLCO.
7. Следует заметить, что схема опроса клавиатуры имеет немалую логическую избыточность, и на втором этапе реверса оптимизирована.
Вопрос к Alex_K - что у нас интересненького в ХМ2-003 (ХМ1-039)?
Все еще актуален вопрос.
Вопрос к Alex_K - что у нас интересненького в ХМ2-003 (ХМ1-039)?
Контроллер ОЗУ и адресного пространства ЦП, частичный компаратор адресов для каналов K0, K1, K2 для 1801ВП1-120, регистры доступа к планам 0176640 и 0176642, ловушка адреса. Вроде всё. Контроллер ОЗУ и адресного пространства ПП поинтереснее будет.
- - - Добавлено - - -
Обновленная версия
А зачем в схеме в скобках (ХМ1-031)? Ведь там реальная схема может отличаться.
- - - Добавлено - - -
Условно недокументированные особенности, возможности и ошибки:
1. Поскольку код нажатия клавиши формируется в момент фактического нажатия, когда счетчики Y и X указывают на конкретную клавишу, в регистре KBD_DATA формируется полный код нажатой клавиши.
Однако, код отжатия клавиши формируется уже после фактического отжатия клавиши, когда счетчик Y указывает на актуальный столбец, а счетчик X указывает на ряд 0. Поэтому в регистре KBD_DATA формируется неполный код отжатия клавиши, по которому можно определить лишь столбец Y, в котором отпущены все клавиши, но не ряд X.
Ну эта особенность описана в самом ТО, так что секретом не является.
2. Из регистра KBD_BUS (177704) можно считывать состояние порта Y в реальном времени.
Да, это в ТО не описано. Но я об этом писал неоднократно. Перед чтением кода нажатой клавиши можно прочесть регистр 0177704 и узнать на каких линиях Y ещё нажаты клавиши при "замороженном" X.
3. Из регистра KBD_DATA (177702) можно считывать текущее состояние счетчиков CTR_KBD_X и CTR_KBD_Y. Причем, учитывая, что чтение счетчиков никак не синхронизировано с тактовой частотой контроллера клавиатуры, не исключена возможность чтения счетчиков в промежуточной фазе счета, когда одна часть счетчика уже установлена, а другая нет. Для того, чтобы понять, возможно ли такое попадание в середину фазы счета, надо изучать всю схемотехнику УКНЦ в целом.
А при чем тут схемотехника УКНЦ? Просто написать программу, которая в большой буфер будет последовательно считывать регистр 0177702. А потом проанализировать. Следующие значения должны быть на один больше, если не так, то попали на момент изменения счетчиков.
4. Если в течение одного цикла счетчика CTR_KBD_X нажаты и удерживаются две и более клавиши в одном столбце, то первое чтение KBD_DATA, даст код первой зафиксированной в столбце клавиши. Вторая и остальные нажатые в этом цикле, и в этом столбце клавиши, определены не будут. Т.е. фактически одновременное нажатие нескольких клавиш в столбце может привести к потере события нажатия одной из них.
Тоже в ТО не описано. Но об этом я также писал, что одновременное нажатие клавиш на одной линии Y не распознается.
5. Возможно написание собственного опроса клавиатуры, т.к. программно доступны счетчики X, Y, и состояние порта Y. На практике же такой опрос будет очень медленным, из-за того, что полный цикл сканирования клавиатуры равен почти 16мс, что сопоставимо с размером одного кадра развертки (20мс).
А вот это не понял. Ведь регистр 0177702 можно только читать, его нельзя писать.
Контроллер ОЗУ и адресного пространства ЦП, частичный компаратор адресов для каналов K0, K1, K2 для 1801ВП1-120, регистры доступа к планам 0176640 и 0176642, ловушка адреса. Вроде всё. Контроллер ОЗУ и адресного пространства ПП поинтереснее будет.
Контроллер ОЗУ ПП еще не сфоткан)
- - - Добавлено - - -
А зачем в схеме в скобках (ХМ1-031)? Ведь там реальная схема может отличаться.
Так написано на кристалле, поэтому тоже обозначил. Разумеется схема ХМ1-031 будет отличаться. Надо пометить на схеме, что это все же обновленная версия ХМ1-031.
- - - Добавлено - - -
Тоже в ТО не описано. Но об этом я также писал, что одновременное нажатие клавиш на одной линии Y не распознается.
Тут надо уточнить, что одновременное в смысле момента нажатия. А вот нажатые неодновременно, но удерживаемые одновременно - распознаются.
- - - Добавлено - - -
А вот это не понял. Ведь регистр 0177702 можно только читать, его нельзя писать.
Ну да. Мы можем всегда прочитать значение X, Y и состояние входов Y.
Тут надо уточнить, что одновременное в смысле момента нажатия. А вот нажатые неодновременно, но удерживаемые одновременно - распознаются.
Не распознаются, если стоят на одной линии Y. Я писал программу SCAN.SAV, которая показывает скэн-коды клавиш, можете попробовать на реальной УКНЦ.
- - - Добавлено - - -
Ну да. Мы можем всегда прочитать значение X, Y и состояние входов Y.
И смысл? Программный опрос это когда я устанавливаю значение линий X и после прочитываю состояние линий Y, и уже на основе анализа полученной информации определяю какая клавиша нажата. А здесь можно только следить за счетчиком X, а установить его нельзя. Да и при нажатии клавиши происходит "заморозка" счета.
И смысл? Программный опрос это когда я устанавливаю значение линий X и после прочитываю состояние линий Y, и уже на основе анализа полученной информации определяю какая клавиша нажата. А здесь можно только следить за счетчиком X, а установить его нельзя. Да и при нажатии клавиши происходит "заморозка" счета.
Счет можно размораживать сразу же после заморозки.
Программно отслеживая можно самим следить, какие клавиши нажаты, какие отжаты. Однако, как я уже писал, это не будет неэффективно, т.к. очень медленно.
- - - Добавлено - - -
Не распознаются, если стоят на одной линии Y. Я писал программу SCAN.SAV, которая показывает скэн-коды клавиш, можете попробовать на реальной УКНЦ.
Может быть вы пробовали на ХМ1-031? На нем вполне может различаться не только таймер, но и контроллер клавиатуры.
Может быть вы пробовали на ХМ1-031? На нем вполне может различаться не только таймер, но и контроллер клавиатуры.
Сейчас попробовал на 1515ХМ2-001, всё точно так же.
Сейчас попробовал на 1515ХМ2-001, всё точно так же.
Рассмотрю этот момент.
Рассмотрю этот момент.
Там же целых три регистра памяти состояния линий Y. Тем более при отрицательном значении счетчика (когда установлен X3) реально сканирования линий Y не проводится, а сравнивается предпоследнее и последнее сканирование. И если ранее была нажатая клавиша на линии Y, а потом её не стало, то и формируется код отжатия.
И если ранее была нажатая клавиша на линии Y, а потом её не стало, то и формируется код отжатия.
Правильно. Но я говорю не о фиксации отжатия, а о фиксации нажатия нескольких клавиш на линии Y.
Правильно. Но я говорю не о фиксации отжатия, а о фиксации нажатия нескольких клавиш на линии Y.
Titus, может быть мы друг друга не понимаем. Приведу конкретный пример. На одной линии Y6 находятся клавиши АР2, ТАБ, УПР, ГРАФ, АЛФ, 0(доп), .(доп), ВВОД(доп). Я нажимаю АР2 и получаю код нажатия 006. Не отпуская её последовательно друг за другом я нажимаю клавиши ТАБ, УПР, ГРАФ, АЛФ, 0(доп), .(доп), ВВОД(доп). При этом никаких кодов нажатия не получаю. У нас нажаты все восемь клавиш на линии Y6, получили код нажатия только самой первой нажатой клавиши. Теперь последовательно отпускаем клавиши в такой же последовательности, что и нажимали. Первой отжимаем АР2, соответственно никакого кода отжатия не получим, т.к. нажаты ещё семь клавиш. И только тогда, когда отожмем последнюю клавишу ВВОД(доп), линия Y6 полностью освободится, тогда получим код отжатия 0206.
- - - Добавлено - - -
Счет можно размораживать сразу же после заморозки.
Программно отслеживая можно самим следить, какие клавиши нажаты, какие отжаты. Однако, как я уже писал, это не будет неэффективно, т.к. очень медленно.
Тут есть ещё один очень неприятный момент. Вывод на дешифратор DC_CTR_X стробируется сигналом CLK_KBD1_16. В момент "заморозки" останавливается генератор и по идее на линии CLK_KBD1_16 должен остаться низкий уровень, соответственно на выбранной линии X должен остаться низкий уровень и можно прочесть текущее состояние линий Y. А без "заморозки" во время чтения линий Y можно попасть в другой полупериод сигнала CLK_KBD1_16, соответственно на линиях X не будет "бегущего нуля", соответственно с линий Y прочтутся одни нули.
И только тогда, когда отожмем последнюю клавишу ВВОД(доп), линия Y6 полностью освободится, тогда получим код отжатия 0206.
Проверю, напишу.
Alex_K, в силу этой особенности тетрис2 Петра Высотина рассчитанный на 2-ух игроков на одной машине - малоиграбельным получился...правда там есть режим 1-го игрока (это с пакета "ИГРУШКА-3" (1993г.), который в коммерческом виде не обнаружен и по отдельности не все игры с него есть, там был ещё "СпейсБэттл" )
https://pic.maxiol.com/thumbs2/1574424032.787614904.20191122115910065.png (https://pic.maxiol.com/?v=1574424032.787614904.20191122115910065.png&dp=2)
Тут есть ещё один очень неприятный момент. Вывод на дешифратор DC_CTR_X стробируется сигналом CLK_KBD1_16. В момент "заморозки" останавливается генератор и по идее на линии CLK_KBD1_16 должен остаться низкий уровень, соответственно на выбранной линии X должен остаться низкий уровень и можно прочесть текущее состояние линий Y.
Заморозка происходит в фазе CLK_KBD_0D, когда линии X неактивны. Поэтому на них ничего не останется.
Заморозка происходит в фазе CLK_KBD_0D, когда линии X неактивны. Поэтому на них ничего не останется.
Увы, на практике это не наблюдается. Набил в ОЗУ ПП маленькую программку, которая при установке бита готовности клавиатуры прочитывает сначала с регистра 0177704 состояние линий Y, а потом с регистра 0177702 код клавиши. Так вот, при "замороженном" счетчике активна линия Y нажатой клавиши.
Программка набивается с адреса 024000, результаты пишет, начиная с адреса 025000. Запускать с адреса 024000 нажатием пробела (особенность пультового отладчика ПП). Выход - отжатие СТОП, если начнется автоповтор, то ещё раз нажать СТОП.
MTPS #200 24000: 106427 000200
MOV #25000,R3 24004: 012703 025000
1$: TSTB @#177700 24010: 105737 177700
BPL 1$ 24014: 100375
MOV @#177704,R0 24016: 013700 177704
MOV @#177702,R1 24022: 013701 177702
CMP R1,#204 24026: 020127 000204
BEQ 2$ 24032: 001405
TSTB R1 24034: 105701
BMI 1$ 24036: 100764
MOV R0,(R3)+ 24040: 010023
MOV R1,(R3)+ 24042: 010123
BR 1$ 24044: 000761
2$: HALT 24046: 000000
Увы, на практике это не наблюдается. Набил в ОЗУ ПП маленькую программку, которая при установке бита готовности клавиатуры прочитывает сначала с регистра 0177704 состояние линий Y, а потом с регистра 0177702 код клавиши. Так вот, при "замороженном" счетчике активна линия Y нажатой клавиши.
И это проверим.
Вопрос - в какой момент процессор в цикле записи во внешнее устройство, снимает свои данные с шины? По началу RPLY или окончанию? Или еще в какой-то момент?
Вопрос - в какой момент процессор в цикле записи во внешнее устройство, снимает свои данные с шины? По началу RPLY или окончанию? Или еще в какой-то момент?
По началу RPLY с небольшим запаздыванием. Снимаются данные и сигнал DOUT. Устройство в ответ должно снять RPLY.
Вопрос - в какой момент процессор в цикле записи во внешнее устройство, снимает свои данные с шины? По началу RPLY или окончанию? Или еще в какой-то момент?
Внешнее, память - без разница
Проц выставил адрес, выставил SYNC, подождал, снял адрес, выставил данные, выставил DOUT
Устройство по SYNC определило свой адрес, по DOUT прочитала данные, выставила RPLY
Проц снимает данные, DOUT и снимает SYNC
Устройство по снятию DOUT снимает RPLY
- - - Добавлено - - -
По началу RPLY с небольшим запаздыванием.
Думаю, зависит от скорострельности.
Пардон, написал DIN, на самом деле DOUT
Поправил
Увы, на практике это не наблюдается. Набил в ОЗУ ПП маленькую программку, которая при установке бита готовности клавиатуры прочитывает сначала с регистра 0177704 состояние линий Y, а потом с регистра 0177702 код клавиши. Так вот, при "замороженном" счетчике активна линия Y нажатой клавиши.
Проверил правильность схемы от G19 до выходов X - все точно.
Т.е. при 0 на выходе G19, выходы X неактивны.
Видимо, надо проверить до G19.
А не может ли просто линия Y не успеть разрядиться, ведь клавиатура - это изрядная емкость? Попробуйте в тест поставить значительную задержку между заморозкой и чтением Y.
И еще можно попробовать после заморозки установить EP = 1, чтобы гарантированно отключить X, и прочитать Y.
Только надо не забыть перед этим записать в KBD_BUS нули, чтобы Y не притянулся на землю.
- - - Добавлено - - -
Обновленная версия схемы 1515ХМ2-001-Optimized - rev 49 (https://yadi.sk/d/ZpNVf6Ur3KPrTg)
Нарисованы дополнительные диаграммы работы таймера, и исправлены мелкие косметиеческие недочеты.
Тактовая частота таймера CLK_TMR задается двумя битами регистра состояния таймера TMR_STATE[1..2]. В зависимости от их состояния, частота тактирования таймера может быть выбрана: CLК1_3, CLK1_6, CLK1_12 и CLK1_24. Что соответствует периодам: 0.48мкс, 0.96мкс, 1.92мкс и 3.84мкс. Из частоты тактирования таймера выделяется основная частота CLK_TMR1_4, и несколько вспомогательных фаз этой частоты. Частота CLK_TMR1_4 равна CLK_TMR / 4, поэтому периоды счета таймера будут: 1.92мкс, 3.84мкс, 7.68мкс и 15.36мкс соответственно. Учитывая, что скважность CLK1_3 равна 66.6%, итоговая ширина фазовых импульсов при данной тактовой частоте таймера будет отличаться от CLK1_6, CLK1_12 и CLK1_24, скважность которых равна 50%.
Один период CLK_TMR1_4 можно условно разделить на 8 тактов (0..7).
Такт 0:
Если разрешена загрузка буферного регистра в счетчик (в режиме остановки таймера, либо по событиям TMR_ZERO_EVENT или EXT_EVENT), то в этом такте происходит копирование буферного регистра LATCH_TMR_BUF в счетчик CTR_TMR_CUR.
Так же, если в предыдущем такте был активен сигнал TMR_BUF_WRITE (запись в буферный регистр), то происходит одновременная загрузка буферного регистра новым значением, и загрузка этого же значения в счетчик.
Если же сигнал TMR_BUF_WRITE стал активен в этом такте, то его действие откладывается до следующего такта, равно как и ответ RPLY.
Такт 1..7:
Возможна свободная загрузка в буферный регистр LATCH_TMR_BUF по TMR_BUF_WRITE.
Такт 2..3:
Никаких действий не совершается.
Такт 4:
Если таймер в режиме счета, то по переднему фронту такта происходит вычитание единицы из содержимого счетчика.
Такт 5:
Если регистр текущего значения LATCH_TMR_CUR до этого такта не находился в режиме чтения по TMR_CUR_READ, а так же регистр текущего значения не был заморожен по TMR_CUR_FREEZE, то в этом такте содержимое счетчика CTR_TMR_CUR переписывается в регистр текущего значения LATCH_TMR_CUR.
Если сигнал TMR_CUR_READ стал активен в этом такте, то его действие откладывается до следующего такта, равно, как и ответ RPLY.
Такт 0..4, 6..7:
Возможно свободное чтение регистра текущего значения LATCH_TMR_CUR по TMR_CUR_READ.
Такт 6:
Никаких действий не совершается.
Такт 7:
Если счетчик запущен и в этом такте равен нулю, а так же SYS_CON[13] = 0, то по переднему фронту такта формируется событие TMR_ZERO_EVENT. Если же SYS_CON[13] = 1, то выставляется сигнал IRQ (который в УКНЦ не используется). Снимается IRQ однократной установкой SYS_CON[13] = 0.
Также в этом такте формируется событие EXT_EVENT, если с предыдущего такта было изменение уровня на входе EXT.
По окончанию событий TMR_ZERO_EVENT или TMR_ZERO_EVENT (по заднему фронту такта 7) формируются события TMR_ZERO_READY и EXT_READY, соответственно. При наличии хотя бы одного из них, формируется событие TMR_CUR_FREEZE, замораживающее регистр текущего значения таймера. Сбрасываются события TMR_ZERO_READY и EXT_READY по чтению регистра текущего значения таймера.
Если произошло событие TMR_ZERO_EVENT, и при этом уже установлен TMR_ZERO_READY (т.е. не был прочитан замороженный регистр текущего значения таймера), то выставляется бит TMR_STATE[3] (TMR_OVER), который сбрасывается по чтению регистра состояния таймера TMR_STATE.
Особенности работы таймера и ошибки:
1. При записи значения в буферный регистр LATCH_TMR_BUF в режиме остановленного счета, с вероятностью 1/8 цикл записи может быть продлен до одиного такта таймера. Что соответствует 0.32мкс, 0.48мкс, 0.96мкс и 1.92мкс, или же 2, 3, 6 и 12 такта ПП, соответственно.
2. При чтении регистра текущего значения LATCH_TMR_CUR, с вероятностью 1/8 цикл записи может быть так же продлен, как и в пункте 1, в независимости от того, идет счет или нет.
3. При остановленном таймере, цикл продвижения значения от записи в буферный регистр LATCH_TMR_BUF до регистра текущего значения LATCH_TMR_CUR следующий. После записи значения в буферный регистр LATCH_TMR_BUF, продвижение его в счетчик CTR_TMR_CUR может задержаться на время до 8 тактов таймера. Дальнейшее продвижение числа в регистр текущего значения LATCH_TMR_CUR задержится еще на 5 тактов таймера. Если же в момент продвижения числа в LATCH_TMR_CUR, была попытка читать регистр текущего значения, то продвижение числа задержится еще на 8 тактов. И так может происходить до бесконечности, если перед тактом копирования числа в LATCH_TMR_CUR, было произведено чтение регистра текущего значения.
4. Весьма подозрителен тот факт, что при записи в буферный регистр LATCH_TMR_BUF, сигнал записи REG_BUF_LOAD может быть продлен на 1 такт таймера, относительно окончания сигнала TMR_BUF_WRITE. Таким образом, сигнал TMR_BUF_WRITE может пропасть, ввиду окончания записи процессором данных на шину, т.к. по записи в LATCH_TMR_BUF устанавливается RPLY, а в регистр LATCH_TMR_BUF все еще будет записываться состояние шины. И чем больше период тактирования таймера, тем вероятность данной ошибки выше. Максимальная задержка записи может быть 12 тактов ПП.
Рекомендации по работе с таймером:
1. При остановленном таймере записывать новое значение в буферный регистр при минимальном периоде тактирования таймера (2мс).
2. Не насиловать регистр текущего значения постоянными чтениями, особенно при большом периоде тактирования таймера, чтобы дать содержимому счетчика переписаться в регистр текущего значения.
А не может ли просто линия Y не успеть разрядиться, ведь клавиатура - это изрядная емкость? Попробуйте в тест поставить значительную задержку между заморозкой и чтением Y.
После проверки установки бита готовности клавиатуры вставил задержку из двух команд CLR R2 / SOB R2,. . Ничего не изменилось. Считываются состояния линий Y.
Тогда надо проверить с активным EP.
Тогда надо проверить с активным EP.
С активным EP из регистра 0177704 при "замороженном" счетчике клавиатуры всё время считывается 020000. Т.е. линия Y2 висит на земле (сигнал CLK_KBD), и это если перед этим в регистр 0177704 записали нули. При записи в 0177704 всех единиц считывается 037777.
С активным EP из регистра 0177704 при "замороженном" счетчике клавиатуры всё время считывается 020000. Т.е. линия Y2 висит на земле (сигнал CLK_KBD)
Окей, значит EP действует как положено. Надо проверять линию CLK_KBD1_16.
- - - Добавлено - - -
Да, похоже, перепутал полярность CLK_KBD1_16, когда счетчик из отрицательного переделывал в положительный)
Значит надо будет переписать описание с учетом этого.
- - - Добавлено - - -
Нет, не перепутывал) Еще страннее)
- - - Добавлено - - -
Нашел. У микросхемы Y_MEMORY_C вход C должен быть инверсный.
Нашел. У микросхемы Y_MEMORY_C вход C должен быть инверсный.
И что это даёт?
И что это даёт?
Другой принцип работы) Надо проанализировать)
Как я и говорил - перепутать полярность - это бич подобного реверса)
Однако, и выявляется легко тестами или логически.
В общем да, полярность CLK_KBD1_16 была перепутана из-за того, что счетчик сначала был с отрицательным счетом, а я его переделал в положительный.
Кроме того, вместо /CLK_KBD_0B на COMP_ENABLE почему-то был заведен KEY_READY. Я еще удивился, зачем оно так, т.к. ничего не делает.
А теперь все встало на свои места. И теперь клавиатура работает именно так, как говорил Alex_K, т.е. при заморозке на линиях X все еще находятся активный сигнал.
Интересно, что контроллер прекрасно работал и в прежней перепутанной версии, но немного по другому.
- - - Добавлено - - -
Titus, может быть мы друг друга не понимаем. Приведу конкретный пример. На одной линии Y6 находятся клавиши АР2, ТАБ, УПР, ГРАФ, АЛФ, 0(доп), .(доп), ВВОД(доп). Я нажимаю АР2 и получаю код нажатия 006. Не отпуская её последовательно друг за другом я нажимаю клавиши ТАБ, УПР, ГРАФ, АЛФ, 0(доп), .(доп), ВВОД(доп). При этом никаких кодов нажатия не получаю.
Да, по схеме все так и есть.
В общем да, полярность CLK_KBD1_16 была перепутана из-за того, что счетчик сначала был с отрицательным счетом, а я его переделал в положительный.
Кроме того, вместо /CLK_KBD_0B на COMP_ENABLE почему-то был заведен KEY_READY. Я еще удивился, зачем оно так, т.к. ничего не делает.
А теперь все встало на свои места. И теперь клавиатура работает именно так, как говорил Alex_K, т.е. при заморозке на линиях X все еще находятся активный сигнал.
А улучшенная и дополненная схема будет выложена?
Да, разумеется, попозже.
а слабо кнопку reset на плате "перепрограммировать" ;-)
Признак, по которому можно определить, что пересидел за реверсом ХМ2-001, это когда в новостях аббревиатуру EP (Единая Россиия) автоматически читаешь, как EP - бит разрешения вывода на шину Y)))
https://pic.maxiol.com/images2/1574513102.1504841820.01.png
Благодаря тестам Alex_K, нашел ошибку в полярности сигнала тактирования клавиатуры, и переписал описание.
Исправленная схема (https://yadi.sk/i/-fRBJbwdoX3_AQ)
Тактовая частота контроллера клавиатуры CLK_KBD = 1/24 CLC. CLC = 6.25МГц (0.16мкс). Таким образом, период CLK_KBD = 3.84мкс. Из CLK_KBD формируется рабочая тактовая частота CLK_KBD1_16 = 1/16 CLK_KBD (период 61.44мкс), а так же вспомогательные фазы CLK_KBD_0B и CLK_KBD_0D.
Счетчик CTR_KBD_Y, управляющий сканированием столбцов Y, тактируется CLK_KBD1_16, и считает циклически от 0 до 0x0F.
Счетчик CTR_KBD_X, управляющий бегущим нулем на X, тактируется CLK_KBD1_16 * 16 (983.04мкс), считает циклически от 0 до 0x0F, причем, счет 0..0x7 - фаза нажатия клавиш, счет 0x08 - фаза отжатия клавиш, 0x09..0x0F - холостая фаза.
Таким образом, один полный цикл опроса клавиатуры занимает 15728.64мкс (15.728мс), что равно почти целому кадру развертки.
На каждый счет CTR_KBD_X, приходится полный цикл сканирования столбцов Y (1..15, 0-й столбец отсутствует).
Код нажатой клавиши в регистре KBD_DATA формируется из текущего состояния обеих счетчиков. Старший полубайт - это счетчик CTR_KBD_X, младший полубайт - это счетчик CTR_KBD_Y.
Остановка тактовой частоты CLK_KBD происходит по событию KEY_READY, которое, в свою очередь, формируется по заднему фронту события KEY_MISMATCH, которое формируется всякий раз при нажатии или отжатии клавиши.
По чтению регистра данных клавиатуры KBD_DATA, снимается событие KEY_READY, и тактовая частота запускается заново.
Бегущий ноль на линии X промодулирован частотой CLK_KBD1_16. Т.е. активен во время низкого уровня CLK_KBD1_16.
В этой же тактовой фазе активен сигнал на выходе дешифратора DC_CTR_Y, который управляет сканированием линий Y.
Основные модули контроллера:
Y_MEMORY_A, Y_MEMORY_B и Y_MEMORY_C - регистры, запоминающие столбцы Y, в которых нажата хотя бы одна клавиша.
Y_MEMORY_A - отражает текущее состояние столбцов, т.к. целиком очищается перед фазой сканирования, а устанавливается во время фазы сканирования.
Y_MEMORY_B - отражает суммарное предыдущее и текущее состояние столбцов с нажатыми клавишами. Регистр не очищается после предыдущего цикла, а устанавливается аналогично Y_MEMORY_A во время фазы сканирования. Очистка Y_MEMORY_B происходит копированием содержимого Y_MEMORY_A во второй фазе цикла.
Y_MEMORY_C - хранит предыдущую копию Y_MEMORY_B, и обновляется в тактовом цикле CLK_KBD_0D. На основе разницы Y_MEMORY_B и Y_MEMORY_C формируется событие нажатия/отжатия клавиши KEY_MISMATCH.
Главный цикл опроса клавиатуры состоит из трех фаз - фазы определения нажатия клавиши, фазы определения отжатия клавиши, и холостой фазы.
В свою очередь, один период CLK_KBD1_16 можно разделить на 16 тактовых циклов 0..15.
Первая фаза - определение нажатия клавиш (счетчик CTR_KBD_X = 0x00..0x07):
Такт 0..7:
Ничего не происходит.
Такт 8..15:
На линии X, адресуемой счетчиком CTR_KBD_X, появляется активный ноль.
На линиях Y, электрически связанных (вследствие нажатия клавиш) с активной линией X, появляются активные нули.
Такт 11:
Схемой COL_Y_COMP сигнал на выходе дешифратора сравнивается с входами порта Y. В случае наличия на соответствующeй линии нуля (нажата клавиша на пересечении ряда X, и столбца Y), в регистрах Y_MEMORY_A и Y_MEMORY_B устанавливается бит соответствующий столбцу Y. Если обновленное содержимое Y_MEMORY_B отличается от значения, зафиксированного в предыдущем цикле в Y_MEMORY_C, то возникает событие KEY_MISMATCH.
Такт 13:
В этом такте текущее значение Y_MEMORY_B переписывается в регистр последнего значения Y_MEMORY_C, вследствие чего отключается событие KEY_MISMATCH, если оно было активно. По снятию события KEY_MISMATCH активизируется событие KEY_READY, останавливающее тактирование CLK_KBD, предлагая программе считать из регистра KEY_DATA код нажатой клавиши. После чтения кода клавиши, тактирование CLK_KBD возобновляется.
Такт 15:
В конце этого такта (говоря иначе, в начале такта 0) снимается сигнал с линий X, вследствие чего пропадает сигнал и на линиях Y. Также отключается дешифратор DC_CTR_Y, управляющий компаратором COL_Y_COMP.
Вторая фаза - определение отжатия клавиш (счетчик CTR_KBD_X = 0x08):
Такт 0..7:
Ничего не происходит.
Такт 8..15:
На линии X0, появляется активный ноль.
На линиях Y, электрически связанных (вследствие нажатия клавиш) с линией X0, появляются активные нули,
что является побочным эффектом, ввиду того, что схема сравнения COL_Y_COMP отключена.
Такт 11:
В этом такте в регистре Y_MEMORY_B сбрасывается текущий бит, если сброшен такой же бит в регистре Y_MEMORY_A.
Таким образом, если Y_MEMORY_B все еще помнит клавишу, нажатую в предыдущем цикле, а в текущем цикле она была отпущена (отсутствует в Y_MEMORY_A), возникает событие KEY_MISMATCH.
Такт 13:
В этом такте сбрасывается бит в регистре Y_MEMORY_A, соответствующий линии Y. Т.е. фактически происходит очистка Y_MEMORY_A перед следующим циклом.
Также переписывается Y_MEMORY_B в Y_MEMORY_C, вследствие чего отключается событие KEY_MISMATCH, если оно было активно. По снятию события KEY_MISMATCH активизируется событие KEY_READY, останавливающее тактирование CLK_KBD, предлагая программе считать из регистра KEY_DATA код отжатой клавиши. После чтения кода отжатия клавиши, тактирование CLK_KBD возобновляется.
Третья фаза - холостая (счетчик CTR_KBD_X = 0x09..0x0F):
Такт 0..7:
Ничего не происходит.
Такт 8..15:
В этом такте так же появляется ноль на линиях X, однако это никак не используется.
Влияние EP на опрос клавиатуры:
EP блокирует установку нажатой клавиши в регистрах Y_MEMORY_A и Y_MEMORY_B в первой фазе цикла опроса.
Помимо этого, EP запрещает бегущий ноль на линиях X.
Также, EP разрешает вывод регистра KBD_BUS на линии Y. Кроме содержимого KBD_BUS (линии Y3..Y15), на линию Y2 выводится тактовая частота контроллера клавиатуры CLK_KBD, а на линию Y1 - сигнал чтения регистра KBD_BUS.
Условно недокументированные особенности, возможности и ошибки:
1. Поскольку код нажатия клавиши формируется в момент фактического нажатия, когда счетчики Y и X указывают на конкретную клавишу, в регистре KBD_DATA формируется полный код нажатой клавиши.
Однако, код отжатия клавиши формируется уже после фактического отжатия клавиши, когда счетчик Y указывает на актуальный столбец, а счетчик X указывает на ряд 0. Поэтому в регистре KBD_DATA формируется неполный код отжатия клавиши, по которому можно определить лишь столбец Y, в котором отпущены все клавиши, но не ряд X.
2. Из регистра KBD_BUS (177704) можно считывать состояние порта Y в реальном времени.
3. Из регистра KBD_DATA (177702) можно считывать текущее состояние счетчиков CTR_KBD_X и CTR_KBD_Y. Причем, учитывая, что чтение счетчиков никак не синхронизировано с тактовой частотой контроллера клавиатуры, не исключена возможность чтения счетчиков в промежуточной фазе счета, когда одна часть счетчика уже установлена, а другая нет. Для того, чтобы понять, возможно ли такое попадание в середину фазы счета, надо изучать всю схемотехнику УКНЦ в целом.
4. Из-за того, что контроллер запоминает лишь столбец Y, но не запоминает ряд X, при одновременном нажатии нескольких клавиш, возможно получить код лишь первой из них. При отпускании всех нажатых клавиш в столбце, получаем код, содержащий информацию только о столбце Y.
5. Возможно написание собственного опроса клавиатуры, т.к. программно доступны счетчики X, Y, и состояние порта Y. На практике же такой опрос будет очень медленным, из-за того, что полный цикл сканирования клавиатуры равен почти 16мс, что сопоставимо с размером одного кадра развертки (20мс).
6. Все биты счетчиков CTR_KBD_X и CTR_KBD_Y сбрасываются по INIT, за исключением бита 0 счетчика CTR_KBD_X, который сбрасывается по DLCO.
7. Следует заметить, что схема опроса клавиатуры имеет немалую логическую избыточность, и на втором этапе реверса оптимизирована.
Как по стандарту положено запрашивать векторные прерывания VIRQ, и как идет ответ по цепочке IAKI и IAKO?
Малоинформативно, но все же:
1515ХМ2-003 (https://yadi.sk/i/LEQsy0kjOL6YrQ) - столбец 1 из 14
Из интересненького:
1. Встретился загадочный элемент 2И-НЕ (https://zx-pk.ru/threads/23978-tsifrovaya-arkheologiya-1801-i-vse-vse-vse.html?p=1036125&viewfull=1#post1036125). Сперва показалось, что это висящий в воздухе вход. Потом заметил, что он посажен на плюс.
Выходит, что разработчики не применяли библиотечного элемента 'инвертор' (как в ХМ2-001), а использовали части других элементов. В первом ряду мне встретились в этой роли 2И-НЕ, и НЕ-НЕ со средним отводом.
2. Библиотечные элементы триггеров используются иначе. В случаях, когда в триггере не нужен вход S или R, используются не урезанные элементы без данных входов, занимающие меньше места, а полноценные, у которых данные входы просто посажены на землю. Возможно, это сделано в силу того, что места в данном кристалле больше, чем достаточно, и не было смысла особо экономить на размере элемента.
3. Столбцов в ХМ2-003 меньше, чем в ХМ2-001 (14 против 19). И заполнение столбцов не всегда до самого низа.
4. На фотографии кристалла отчетливо видны зоны с N-проводимостью (красноватые) и P-проводимостью (зеленоватые). Никакого практического смысла это в данном случае не имеет, т.к. логически понятно, где какие зоны. Однако, на фотографии ХМ2-001 эти зоны по цвету не различались абсолютно.
т.к. логически понятно, где какие зоны. Однако, на фотографии ХМ2-001 эти зоны по цвету не различались абсолютно.
Потому что это планарная технология - шара, реверсится по одной-двум фото. Вот с ТТЛ/ТТЛШ так уже не получится, там зоны легирования в глубине, не видно ничего.
Как по стандарту положено запрашивать векторные прерывания VIRQ, и как идет ответ по цепочке IAKI и IAKO?
Не совсем понятен вопрос про стандарт. Но если устройству необходимо обслужить прерывание, то оно на вывод VIRQ сажает активный низкий уровень. Т.к. это выход с открытым коллектором, то со всех устройств они сходятся в одну точку на вход процессора VIRQ. Если вопрос в том, в каком случае выставлять VIRQ, то обычно если устанавливаются оба бита - разрешения прерывания и готовности. Если какой-то из этих битов становится нулевым, то запрос на прерывание снимается. Также снимается запрос на прерывание после передачи вектора, несмотря на то, что биты разрешения прерывания и готовности ещё установлены. Для этого обычно служит триггер блокировки VIRQ, в 1515ХМ2-001 это M5, M8 и K4, которые устанавливаются при передаче вектора по сигналу RPLY. Сбрасываются блокираторы в случае сброса бита готовности, хотя могут быть варианты, когда сбрасываются сбросом не только готовности, но и сбросом разрешения прерывания (логическое И битов готовности и разрешения прерывания), что более верно.
А вот сигнал IAKI/IAKO идет последовательно по цепочке приоритета. То устройство, которое ближе к процессору, то более приоритетно. Своя цепочка приоритетов существует и внутри устройства, если оно передает несколько векторов. Соответственно, то устройство, которое требует прерывания, и которое получило сигнал IAKI, прекращает его трансляцию на выход IAKO. После удовлетворения прерывания трансляция возобновляется. В 1515ХМ2-001 запрет трансляции IAKI делается элементами M3, M6, L1. По приоритету - самое приоритетное прерывание по внешнему событию, затем по обнулению таймера, ну и самое неприоритетное - клавиатура. А через N4, L8, L2 идет не только формирование и вектора и сигнала ответа RPLY, но через них же устанавливается и блокиратор VIRQ.
Потому что это планарная технология - шара, реверсится по одной-двум фото. Вот с ТТЛ/ТТЛШ так уже не получится, там зоны легирования в глубине, не видно ничего.
Я не понял) ХМ2-001 и ХМ2-003 - одинаковые технологии, а на фотках у одного видны зоны P и N, а у другого не видны.
- - - Добавлено - - -
Соответственно, то устройство, которое требует прерывания, и которое получило сигнал IAKI, прекращает его трансляцию на выход IAKO.
Меня именно этот механизм и интересовал) Кто выдает IAKI изначально, как оно идет, и когда должно закончится и кем.
Это мне было нужно, чтобы правильно описать прерывания ХМ2-001 )))
Меня именно этот механизм и интересовал) Кто выдает IAKI изначально, как оно идет, и когда должно закончится и кем.
Изначально его выдает процессор во время цикла запроса вектора прерывания, только там он называется IAKO. Когда я выкладывал собственные исследования по процессору 1801ВМ2 (https://zx-pk.ru/attachment.php?attachmentid=29838&d=1318165329), где его описал, там же есть и описания всяких циклов шины.
Читайте книги, они рулез! В частности, тот самый документ 3.858.382 "Центральный процессор М2. ТО и инструкция по эксплуатации". Там все это расписано в подробностях и с времянками. Времянки на стр. 38, текстовое описание на стр 37-40, описание схемы для этого дела на стр. 213-215, стр. 214 - сама схема. В своё время (где-то 83-84) мне этих материалов вполне хватило для сочинения большого количества разных плат, все работали без вопросов. В той же книге есть подробные описания всех циклов шины и куча других материалов.
Когда я выкладывал собственные исследования по процессору 1801ВМ2, где его описал, там же есть и описания всяких циклов шины. Фундаментальный труд. Только бОльшая часть этих материалов есть в том самом документе. И они (материалы) ни разу не противоречат документу. (В скобках замечу, что, если бы оно противоречило, это бы значило, что 1801-й микропроцессор сделан неправильно. Чего, естественно, нет.) А меньшая относится специфически к 1801ВМ2, вроде начального пуска в Halt-Mode.
Только бОльшая часть этих материалов есть в том самом документе. И они (материалы) ни разу не противоречат документу.
Естественно не противоречат. В качестве первоисточника для описания функционирования шины и описания системы команд использовалась книга И.В. Захарова "Техническое обслуживание и эксплуатация микроЭВМ "Электроника-60М". А уж всякие тонкости реализации команд - это уже всякие тесты, в том числе и в HALT-режиме, благо пультовый отладчик у УКНЦ очень удобный и позволяет запустить программу как в USER, так и в HALT.
Новый столбец - 2 из 14.
Из интересненького:
1. Часть триггеров тактируется отрицательным фронтом, а часть положительным. В ХМ2-001 такого разброса не было. Да и вообще, явно разные люди делали.
2. Попался двунаправленный мультиплексор, но после ХМ2-001 - это уже не новость.
3. Методика управления тактированием триггеров другая, чем в ХМ2-001, что тоже говорит об ином разработчике.
4. Встретился триггер, у которого вход D посажен на землю прям внутри блока.
Вопрос к Alex_K - что означают выводы ХМ2-003?
- - - Добавлено - - -
Итак, суммарное итоговое описание:
Тактовая частота таймера CLK_TMR задается двумя битами регистра состояния таймера TMR_STATE[1..2]. В зависимости от их состояния, частота тактирования таймера может быть выбрана: CLК1_3, CLK1_6, CLK1_12 и CLK1_24. Что соответствует периодам: 0.48мкс, 0.96мкс, 1.92мкс и 3.84мкс. Из частоты тактирования таймера выделяется основная частота CLK_TMR1_4, и несколько вспомогательных фаз этой частоты. Частота CLK_TMR1_4 равна CLK_TMR / 4, поэтому периоды счета таймера будут: 1.92мкс, 3.84мкс, 7.68мкс и 15.36мкс соответственно. Учитывая, что скважность CLK1_3 равна 66.6%, итоговая ширина фазовых импульсов при данной тактовой частоте таймера будет отличаться от CLK1_6, CLK1_12 и CLK1_24, скважность которых равна 50%.
Один период CLK_TMR1_4 можно условно разделить на 8 тактов (0..7).
Такт 0:
Если разрешена загрузка буферного регистра в счетчик (в режиме остановки таймера, либо по событиям TMR_ZERO_EVENT или EXT_EVENT), то в этом такте происходит копирование буферного регистра LATCH_TMR_BUF в счетчик CTR_TMR_CUR.
Так же, если в предыдущем такте был активен сигнал TMR_BUF_WRITE (запись в буферный регистр), то происходит одновременная загрузка буферного регистра новым значением, и загрузка этого же значения в счетчик.
Если же сигнал TMR_BUF_WRITE стал активен в этом такте, то его действие откладывается до следующего такта, равно как и ответ RPLY.
Такт 1..7:
Возможна свободная загрузка в буферный регистр LATCH_TMR_BUF по TMR_BUF_WRITE.
Такт 2..3:
Никаких действий не совершается.
Такт 4:
Если таймер в режиме счета, то по переднему фронту такта происходит вычитание единицы из содержимого счетчика.
Такт 5:
Если регистр текущего значения LATCH_TMR_CUR до этого такта не находился в режиме чтения по TMR_CUR_READ, а так же регистр текущего значения не был заморожен по TMR_CUR_FREEZE, то в этом такте содержимое счетчика CTR_TMR_CUR переписывается в регистр текущего значения LATCH_TMR_CUR.
Если сигнал TMR_CUR_READ стал активен в этом такте, то его действие откладывается до следующего такта, равно, как и ответ RPLY.
Такт 0..4, 6..7:
Возможно свободное чтение регистра текущего значения LATCH_TMR_CUR по TMR_CUR_READ.
Такт 6:
Никаких действий не совершается.
Такт 7:
Если счетчик запущен и в этом такте равен нулю, а так же SYS_CON[13] = 0, то по переднему фронту такта формируется событие TMR_ZERO_EVENT. Если же SYS_CON[13] = 1, то выставляется сигнал IRQ (который в УКНЦ не используется). Снимается IRQ однократной установкой SYS_CON[13] = 0.
Также в этом такте формируется событие EXT_EVENT, если с предыдущего такта было изменение уровня на входе EXT.
По окончанию событий TMR_ZERO_EVENT или TMR_ZERO_EVENT (по заднему фронту такта 7) формируются события TMR_ZERO_READY и EXT_READY, соответственно. При наличии хотя бы одного из них, формируется событие TMR_CUR_FREEZE, замораживающее регистр текущего значения таймера. Сбрасываются события TMR_ZERO_READY и EXT_READY по чтению регистра текущего значения таймера.
Если произошло событие TMR_ZERO_EVENT, и при этом уже установлен TMR_ZERO_READY (т.е. не был прочитан замороженный регистр текущего значения таймера), то выставляется бит TMR_STATE[3] (TMR_OVER), который сбрасывается по чтению регистра состояния таймера TMR_STATE.
Особенности работы таймера и ошибки:
1. При записи значения в буферный регистр LATCH_TMR_BUF в режиме остановленного счета, с вероятностью 1/8 цикл записи может быть продлен до одиного такта таймера. Что соответствует 0.32мкс, 0.48мкс, 0.96мкс и 1.92мкс, или же 2, 3, 6 и 12 такта ПП, соответственно.
2. При чтении регистра текущего значения LATCH_TMR_CUR, с вероятностью 1/8 цикл записи может быть так же продлен, как и в пункте 1, в независимости от того, идет счет или нет.
3. При остановленном таймере, цикл продвижения значения от записи в буферный регистр LATCH_TMR_BUF до регистра текущего значения LATCH_TMR_CUR следующий. После записи значения в буферный регистр LATCH_TMR_BUF, продвижение его в счетчик CTR_TMR_CUR может задержаться на время до 8 тактов таймера. Дальнейшее продвижение числа в регистр текущего значения LATCH_TMR_CUR задержится еще на 5 тактов таймера. Если же в момент продвижения числа в LATCH_TMR_CUR, была попытка читать регистр текущего значения, то продвижение числа задержится еще на 8 тактов. И так может происходить до бесконечности, если перед тактом копирования числа в LATCH_TMR_CUR, было произведено чтение регистра текущего значения.
4. Весьма подозрителен тот факт, что при записи в буферный регистр LATCH_TMR_BUF, сигнал записи REG_BUF_LOAD может быть продлен на 1 такт таймера, относительно окончания сигнала TMR_BUF_WRITE. Таким образом, сигнал TMR_BUF_WRITE может пропасть, ввиду окончания записи процессором данных на шину, т.к. по записи в LATCH_TMR_BUF устанавливается RPLY, а в регистр LATCH_TMR_BUF все еще будет записываться состояние шины. И чем больше период тактирования таймера, тем вероятность данной ошибки выше. Максимальная задержка записи может быть 12 тактов ПП.
Рекомендации по работе с таймером:
1. При остановленном таймере записывать новое значение в буферный регистр при минимальном периоде тактирования таймера (2мс).
2. Не насиловать регистр текущего значения постоянными чтениями, особенно при большом периоде тактирования таймера, чтобы дать содержимому счетчика переписаться в регистр текущего значения.
Тактовая частота контроллера клавиатуры CLK_KBD = 1/24 CLC. CLC = 6.25МГц (0.16мкс). Таким образом, период CLK_KBD = 3.84мкс. Из CLK_KBD формируется рабочая тактовая частота CLK_KBD1_16 = 1/16 CLK_KBD (период 61.44мкс), а так же вспомогательные фазы CLK_KBD_0B и CLK_KBD_0D.
Счетчик CTR_KBD_Y, управляющий сканированием столбцов Y, тактируется CLK_KBD1_16, и считает циклически от 0 до 0x0F.
Счетчик CTR_KBD_X, управляющий бегущим нулем на X, тактируется CLK_KBD1_16 * 16 (983.04мкс), считает циклически от 0 до 0x0F, причем, счет 0..0x7 - фаза нажатия клавиш, счет 0x08 - фаза отжатия клавиш, 0x09..0x0F - холостая фаза.
Таким образом, один полный цикл опроса клавиатуры занимает 15728.64мкс (15.728мс), что равно почти целому кадру развертки.
На каждый счет CTR_KBD_X, приходится полный цикл сканирования столбцов Y (1..15, 0-й столбец отсутствует).
Код нажатой клавиши в регистре KBD_DATA формируется из текущего состояния обеих счетчиков. Старший полубайт - это счетчик CTR_KBD_X, младший полубайт - это счетчик CTR_KBD_Y.
Остановка тактовой частоты CLK_KBD происходит по событию KEY_READY, которое, в свою очередь, формируется по заднему фронту события KEY_MISMATCH, которое формируется всякий раз при нажатии или отжатии клавиши.
По чтению регистра данных клавиатуры KBD_DATA, снимается событие KEY_READY, и тактовая частота запускается заново.
Бегущий ноль на линии X промодулирован частотой CLK_KBD1_16. Т.е. активен во время низкого уровня CLK_KBD1_16.
В этой же тактовой фазе активен сигнал на выходе дешифратора DC_CTR_Y, который управляет сканированием линий Y.
Основные модули контроллера:
Y_MEMORY_A, Y_MEMORY_B и Y_MEMORY_C - регистры, запоминающие столбцы Y, в которых нажата хотя бы одна клавиша.
Y_MEMORY_A - отражает текущее состояние столбцов, т.к. целиком очищается перед фазой сканирования, а устанавливается во время фазы сканирования.
Y_MEMORY_B - отражает суммарное предыдущее и текущее состояние столбцов с нажатыми клавишами. Регистр не очищается после предыдущего цикла, а устанавливается аналогично Y_MEMORY_A во время фазы сканирования. Очистка Y_MEMORY_B происходит копированием содержимого Y_MEMORY_A во второй фазе цикла.
Y_MEMORY_C - хранит предыдущую копию Y_MEMORY_B, и обновляется в тактовом цикле CLK_KBD_0D. На основе разницы Y_MEMORY_B и Y_MEMORY_C формируется событие нажатия/отжатия клавиши KEY_MISMATCH.
Главный цикл опроса клавиатуры состоит из трех фаз - фазы определения нажатия клавиши, фазы определения отжатия клавиши, и холостой фазы.
В свою очередь, один период CLK_KBD1_16 можно разделить на 16 тактовых циклов 0..15.
Первая фаза - определение нажатия клавиш (счетчик CTR_KBD_X = 0x00..0x07):
Такт 0..7:
Ничего не происходит.
Такт 8..15:
На линии X, адресуемой счетчиком CTR_KBD_X, появляется активный ноль.
На линиях Y, электрически связанных (вследствие нажатия клавиш) с активной линией X, появляются активные нули.
Такт 11:
Схемой COL_Y_COMP сигнал на выходе дешифратора сравнивается с входами порта Y. В случае наличия на соответствующeй линии нуля (нажата клавиша на пересечении ряда X, и столбца Y), в регистрах Y_MEMORY_A и Y_MEMORY_B устанавливается бит соответствующий столбцу Y. Если обновленное содержимое Y_MEMORY_B отличается от значения, зафиксированного в предыдущем цикле в Y_MEMORY_C, то возникает событие KEY_MISMATCH.
Такт 13:
В этом такте текущее значение Y_MEMORY_B переписывается в регистр последнего значения Y_MEMORY_C, вследствие чего отключается событие KEY_MISMATCH, если оно было активно. По снятию события KEY_MISMATCH активизируется событие KEY_READY, останавливающее тактирование CLK_KBD, предлагая программе считать из регистра KEY_DATA код нажатой клавиши. После чтения кода клавиши, тактирование CLK_KBD возобновляется.
Такт 15:
В конце этого такта (говоря иначе, в начале такта 0) снимается сигнал с линий X, вследствие чего пропадает сигнал и на линиях Y. Также отключается дешифратор DC_CTR_Y, управляющий компаратором COL_Y_COMP.
Вторая фаза - определение отжатия клавиш (счетчик CTR_KBD_X = 0x08):
Такт 0..7:
Ничего не происходит.
Такт 8..15:
На линии X0, появляется активный ноль.
На линиях Y, электрически связанных (вследствие нажатия клавиш) с линией X0, появляются активные нули,
что является побочным эффектом, ввиду того, что схема сравнения COL_Y_COMP отключена.
Такт 11:
В этом такте в регистре Y_MEMORY_B сбрасывается текущий бит, если сброшен такой же бит в регистре Y_MEMORY_A.
Таким образом, если Y_MEMORY_B все еще помнит клавишу, нажатую в предыдущем цикле, а в текущем цикле она была отпущена (отсутствует в Y_MEMORY_A), возникает событие KEY_MISMATCH.
Такт 13:
В этом такте сбрасывается бит в регистре Y_MEMORY_A, соответствующий линии Y. Т.е. фактически происходит очистка Y_MEMORY_A перед следующим циклом.
Также переписывается Y_MEMORY_B в Y_MEMORY_C, вследствие чего отключается событие KEY_MISMATCH, если оно было активно. По снятию события KEY_MISMATCH активизируется событие KEY_READY, останавливающее тактирование CLK_KBD, предлагая программе считать из регистра KEY_DATA код отжатой клавиши. После чтения кода отжатия клавиши, тактирование CLK_KBD возобновляется.
Третья фаза - холостая (счетчик CTR_KBD_X = 0x09..0x0F):
Такт 0..7:
Ничего не происходит.
Такт 8..15:
В этом такте так же появляется ноль на линиях X, однако это никак не используется.
Влияние EP на опрос клавиатуры:
EP блокирует установку нажатой клавиши в регистрах Y_MEMORY_A и Y_MEMORY_B в первой фазе цикла опроса.
Помимо этого, EP запрещает бегущий ноль на линиях X.
Также, EP разрешает вывод регистра KBD_BUS на линии Y. Кроме содержимого KBD_BUS (линии Y3..Y15), на линию Y2 выводится тактовая частота контроллера клавиатуры CLK_KBD, а на линию Y1 - сигнал чтения регистра KBD_BUS.
Условно недокументированные особенности, возможности и ошибки:
1. Поскольку код нажатия клавиши формируется в момент фактического нажатия, когда счетчики Y и X указывают на конкретную клавишу, в регистре KBD_DATA формируется полный код нажатой клавиши.
Однако, код отжатия клавиши формируется уже после фактического отжатия клавиши, когда счетчик Y указывает на актуальный столбец, а счетчик X указывает на ряд 0. Поэтому в регистре KBD_DATA формируется неполный код отжатия клавиши, по которому можно определить лишь столбец Y, в котором отпущены все клавиши, но не ряд X.
2. Из регистра KBD_BUS (177704) можно считывать состояние порта Y в реальном времени.
3. Из регистра KBD_DATA (177702) можно считывать текущее состояние счетчиков CTR_KBD_X и CTR_KBD_Y. Причем, учитывая, что чтение счетчиков никак не синхронизировано с тактовой частотой контроллера клавиатуры, не исключена возможность чтения счетчиков в промежуточной фазе счета, когда одна часть счетчика уже установлена, а другая нет. Для того, чтобы понять, возможно ли такое попадание в середину фазы счета, надо изучать всю схемотехнику УКНЦ в целом.
4. Из-за того, что контроллер запоминает лишь столбец Y, но не запоминает ряд X, при одновременном нажатии нескольких клавиш, возможно получить код лишь первой из них. При отпускании всех нажатых клавиш в столбце, получаем код, содержащий информацию только о столбце Y.
5. Возможно написание собственного опроса клавиатуры, т.к. программно доступны счетчики X, Y, и состояние порта Y. На практике же такой опрос будет очень медленным, из-за того, что полный цикл сканирования клавиатуры равен почти 16мс, что сопоставимо с размером одного кадра развертки (20мс).
6. Все биты счетчиков CTR_KBD_X и CTR_KBD_Y сбрасываются по INIT, за исключением бита 0 счетчика CTR_KBD_X, который сбрасывается по DLCO.
7. Следует заметить, что схема опроса клавиатуры имеет немалую логическую избыточность, и на втором этапе реверса оптимизирована.
Векторное прерывание VIRQ может формироваться тремя источниками:
1. Прерывание по перепаду сигнала на входе магнитофона EXT (событие EXT_READY, бит разрешения EXT_IRQ_EN)
2. Прерывание по обнулению таймера (событие TMR_ZERO_READY, бит разрешения TMR_ZERO_IRQ_EN)
3. Прерывание по изменению состояния клавиатуры (событие KEY_READY, бит разрешения KBD_IRQ_EN)
Принцип формирования вектора для всех трех источников одинаков.
1. По активному сигналу DIN фиксируется запрос прерывания источником.
2. По активным сигналам DIN и IAKI, на шину выдается вектор прерывания. При этом так же снимается запрос прерывания от источника.
Адреса векторов в порядке убывания приоритета:
EXT_READY - вектор 310
TMR_ZERO_READY - вектор 304
KEY_READY - вектор 300
Блин. Приклеилось к предыдущему посту. Придется подождать, пока кто-то напишет свой пост, и перепостить.
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot