Всё правильно помните. На МС1201.02 программа в ПЗУ на начальном старте считывает по команде RSEL(код 000020) безадресный регистр, младшие биты которого выставляются джамперами. По этим джамперам и осуществляется дальнейший старт.
Вид для печати
У меня появился новый вопрос.
Почему при старте процессор 1806 после выдачи сигнала SEL сразу обращается к адресам 000170, а затем 172, будто у меня прерывание по сигналу HALT? Сама ножка HALT притянута через резистор к питанию. Внешний безадресный регистр =000000. Это из за бита 8=лог.1 в PSW?
Прерывание SEL170 это не только прерывание по входу HALT, но и исполнение команды HALT, её код равен 000000.
- - - Добавлено - - -
Когда процессор на ходится в режиме HALT (бит 8 в PSW установлен в 1), то он не реагирует на состояние ноги HALT.
Выложу. Но у меня сперва вопрос про микросхемы памяти 573РФ5 и им подобные.
Я правильно понимаю, что входа-выхода у них работают так?
Вход адреса:
0 вольт - лог.0
5 вольт - лог.1
Выход данных (открытый коллектор через с подтяжкой):
коллектор открыт - 0 вольт с резистора - лог.0
коллектор закрыт - 5 вольт с резистора - лог.1
То есть перед записью микросхемы мне надо сделать инверсию в таблице и на адрес, и на данные?
У 573РФ5 выход 3 состояния. Но состояние +5в. с малой нагрузочной способностью.
У очищенной РФ5 вроде как FF состояние выхода, что в понятиях ф. Интел +5в.
Адрес начала массива у РФ5 - 0в. на всех адресных выводах.
Текст программы инверсии адреса и данных, от маркера ( адрес 004674, длина 14 слов ( дес. ) ) :
https://pic.maxiol.com/thumbs2/16479...997899101..jpg
Адрес начала массива - 020000, длина массива - 020000 ( 8 Кбайт ).
- - - Добавлено - - -
Вообще, что бы не иметь проблем с контентом ППЗУ, целесообразно шину памяти пропустить через АП9.
Появился новый вопрос:
Почему у ПЗУ в схеме на выходе данных такой дребезг?
https://i.ibb.co/fnhQ8LP/image.png
Вот причина: на ноге AD14 процессор в момент логической "1" выдаёт вот что:
Почему такое может происходить?
https://i.ibb.co/gvRD9Nt/CHj-Zc60i-AHc.jpg
- - - Добавлено - - -
Разобрался. Помехи шли с входной ноги 556РТ4. Она у меня отвечает за выбор RAM или ROM в зависимости от адреса.
Только непонятно, почему помеха идет от входной ноги (A2)? Подтяжка резисторами есть
- - - Добавлено - - -
Кажется, нашел проблему. У меня регистр адреса был подключен неправильно. Не в режиме триггера-защелки, а в режиме "пропустить насквозь/Z" по сигналу SYNC. Вечером проверю работу на ЛИ. Дребезг по шине пропал. Логические уровни улучшились
Итак мне удалось запустить схему. Выражаю огромную благодарность всем тем, кто мне помогал. Но ожидаемо возник еще ряд вопросов:
Безадресный регистр у меня на плате имеет значение 000000 (джамперы выкл.). Соответственно, следующим шагом должно начаться чтение с адреса 000000. С этого адреса у меня начинается область ПЗУ. Заполняю память 573РФ4 для младших байтов, а для старших оставляю пустую ПЗУ с нулями. С двух микросхем на шине получаю:
000000: 000001
000002: 000340
000004-000377: 000000
000400-...: 244 (команды NOP)
Прошивка для "для младшей" половину ПЗУ:
https://i.ibb.co/ZJFw8CX/Dump.jpg
Собственно, проблема: если в адресе 000000 ПЗУ я прописываю значение 000001, то чтение моей основной программы начинается не с адреса 000001, как мне казалось должно было быть (это тест, я знаю, что там должно быть 000340). Процессор берет значение из ячейки ПЗУ 000000 и записывает его в счетчик команд не все 16 бит подряд, а только его младший байт да еще и на место старшего байта PC. В итоге получаем в счетчике не 000001, а 000400 (0000 0001 0000 0000 вместо 0000 0000 0000 0001).
(на рисунке я подписал значения на шине адреса и на шине данных в момент измерения)
https://i.ibb.co/XVpXCW7/1.jpg
Получается, я физически не могу стартовать программу с адреса, меньшего чем 000400. Но в документации про этот момент написано совсем иначе:
https://i.ibb.co/ZLTbgM7/70.jpg
Согласно ТО, R7:= (АВП). То есть 16-ти битный PC должен загружаться 16-ти битным значением из ячейки 000000 параллельным переносом, а не одной его половиной и со сменой мест.
Помогите пожалуйста прояснить этот момент
Адрес в PC (как и в первом слове вектра прерываний) должен быть чётным
- - - Добавлено - - -
И такое впечатление, что перепутаны ПЗУ младшего и старшего байта - тогда объяснимо, почему в PC пишется 400
- - - Добавлено - - -
Как мысль вслух - учитывая быстродействие современных ЭСППЗУ, вполне можно сделать вариант на одном байтовом ПЗУ :)
В случае нечётного адреса либо прерывание(PDP-11)... Либо игнор последнего бита(LSI-11)...
Как в случае 1806ВМ2 - не ведаю точно :(
1801ВМ2-игнор бита. Так что скорее всего адрес 1 воспримется как 0
Но по канону - адрес должен быть чётным.
Нечётный адрес используют только для байтовых инструкций, либо для определения типа процессора или просто грязный код, но на 1801ВМ3 таковой уже не прокатит, будет прерывание. Есть игрушки, кои идут на 1801ВМ2, но на 1801ВМ3 трапаются. Можно свой обработчик повесить ;)
Данные из ячеек читаются корректно и в соответствии с записью в ПЗУ. Я много раз проверял. Подписал на рисунке
- - - Добавлено - - -
Почему же тогда с записи в ПЗУ 000001 программа стартует с 000400, а с записи 000010 стартует с адреса 004000? (измерено)
001 * 400 -> 400
010 * 400 -> 4000
Поменять местами ПЗУ не пробовали?
- - - Добавлено - - -
240*400 -> 1 010 000 000 000 000 120000 CMPB R0, R0 - никаких проблем при выполнении не будет и перейдёт к следующей ячейке
Как я уже написал - такое ВПЕЧАТЛЕНИЕ. Я не утверждаю это. И проверить достаточно просто - поменять местами ПЗУ в панельках и посмотреть, какой адрес будет выставляться на шину процессорм.
- - - Добавлено - - -
Если перепутаны местами именно данные - вполне возможно. И если это так - по прикидками - проц должен выставить после первых двух действий на шину адрес или 0 или 1. Если выставит 0, то будет завис - так как 000001, считанный из ячейки 000000 - это команда WAIT, а с учётом приоритета 7 - никто прервать проц не сможет. А вот если выставит 0000001 - тут я даже не скажу, что будет - это надо знатоков ВМ2 трясти :)
Коллеги, вы что-то путаете. Откуда вообще мог взяться адрес 000001 ? Нулевой адресный бит НЕ ДОЛЖЕН поступать на шину адреса памяти. Единственное место, где он используется для адресации памяти, это блокировка записи "неадресованного" байта при байтовой записи. Пишете четный байт, А0 блокирует запись нечетного; пишете нечетный - А0 блокирует запись четного. Ну, и еще вызывает на "больших" машинках Trap to 4 при попытке обращения к слову по нечетному адресу. И все. А то, что некоторые умельцы, используя тот факт, что LSI-11/03 и LSI-11/23 игнорируют обращение к слову по нечетному адресу, подсовывают туда что-то другое - это ни разу не правильное действие, в нормальных машинках этим не пользуются. Хотя бы из тех соображений, что перейди ты на машинку посерьезнее, и сразу же прилетит птица Обломинго. Хотя бы замени ВМ2 на ВМ3, и все, приплыли.
А при чтении байта по любому адресу, хоть четному, хоть нечетному, читается слово целиком, а процессор, по внутреннему значению бита А0 (а не тому,который выставлен на шину), разбирается, откуда ему брать байт - из [15:8] или из [7:0]. Ну, а при чтении слова по нечетному адресу, младшие машинки LSI-11 просто игнорируют А0, а старшие делают Trap to 4.
- - - Добавлено - - -
Другими словами говоря, у PDP-11 не 64 К байт адресуемой памяти, а именно 32 К слов. Да, с дополнительной возможностью доступа к отдельным байтам, тем не менее! В машинках общего назначения из них 28К отводится под память, 4К - под страницу ввода-вывода. В контроллерных приложениях, естественно, можно сделать и по-другому... НО память у них, по-любому, СЛОВНАЯ!
PDP-11 - словная машина с длинной слова 16-бит...
И счётчик команд(R7 или PC) может быть только чётным. По сему там должен быть 0...
А что у нас по адресу 0... Инструкция с кодом 000001 WAIT
При этом слово состояния процессора 340 или 1110 0000.
У процессора высокий приоритет... и висим...
Это ежели всё работает как задумано...
Тогда откуда 400 берётся? Тут Huta прав, если байты перепутаны - 1 в 400 и превращается, а 10 в 4000 по восьмеричному...
А что у нас по адресу 400??? или 4000???
Возможно влетели в какую-то особенность именно 1806ВМ2, но врядли, так как он почти копия 1801ВМ2. Но это слово "ПОЧТИ"...
Насколько я помню, детально реверсу подвергли именно 1801ВМ2. На 1806ВМ2 столь детально не исследовали. Хотя могу и ошибаться...
Если судить по картинке, то по адресу 400 у них там 240 - или в младшем или в старшем байте. Если (как надо) в младшем - то NOP, а если в старшем (как есть некоторые подозрения) - то CMPB R0, R0 - вполне себе тоже не заковыристая команда, которая может шлёпать, пока адрес не кончится (ака 160000 или до максимума в ПЗУ +2) или пока не налетит на что то другое
Ну упрётся в дыру в адресном пространстве и трапнется...
А что у нас по вектору 4 ??? Опять 0....
А в нуле 1 (WAIT) или 400 (BR 2), в 2 - то ли 340 (SWAB -(R0) и тут зависит от текущего R0), то ли 160000 (SUB R0, R0), а в 4 - 0 (HALT), всё, приплыли :)
Действительно, были перепутаны ПЗУ местами) Всё заработало. Всем еще раз спасибо. Пока разбирался, узнал много нового и нашел косяки на плате
Пора переходить к запаиванию ОЗУ
Вот - предположение было логичным :) Тем более - адрес то на них один и тот же прилетает, а вот данные с них - разные идут.. :)
- - - Добавлено - - -
Я сам сколько раз путал местами - особенно на Falcon-е - снячала фломастером написал - след, пока мокрый был - вроде виден, а высох - и тю тю. Всё собираюсь бумажки приклеить и всё как то руки не доходят :)
И цикл по совету MM тоже прекрасно работает:
start:
nop
br start
Так я проверил работу обоих ПЗУ сразу
Подскажите пожалуйста, как можно осуществить байтовую запись в ОЗУ? Хочу сделать цикл для проверки сигнала WTBT
Спасибо! Работает. Получился цикл "чтение-модификация-запись"
Но у меня в режиме чтения сигнал RPLY снимается после снятия сигнала DIN через интервал длиной в T/2, а в режиме записи после сигнала DOUT через интервал длиной в 1T . То есть в два раза дольше. А как должно быть? И как это может влиять на быстродействие?
UPD: правильнее сказать так: PRLY у меня поднимается по фронту CLCO, но так как длительность DIN короче длительности DOUT, то и возникает такая разница. Чем можно объяснить такой эффект?
https://i.ibb.co/58Sr588/image.png
И вот еще важный вопрос. Почему у меня на шине AD такие вот помехи? Шина подключена к драйверам 1533АП6 с подтяжкой к +5В через резисторы 3,3 кОм
После АП6 помехи становятся еще более ярковыраженнымми/
И как правильно использовать 1533АП6 на шине AD? Нужен ли высокоимпедансный режим в промежутках между циклами адрес/данные?
https://i.ibb.co/Wv7RfmH/Eh50-Nd-Kiskg.jpg
Промаркируйте, пожалуйста, на осциллограмме нежелательные участки.
Что пляшет низ - тонковат общий - для быстрых серий ИС он нужен на типовой ток от единиц ампер ( не как для 561/176 серий ). Это в статике 1806ВМ2 малопотребляющий, а в динамике может хотеть до 1 а. по питанию и общему, иглами по ~5+ нс.
Обращаю внимание, то в 1806ВМ2 встроены 1564АП6, в отличии от 1801-й серии.
Разобрался. Это не помехи. Это на линии AD два сигнала Адрес и Данные идут один за другим и сливаются. Между ними нет интервала, потому что AR ставится не синхронно с SYNC, а позже, по спаду CLCO. А уровень у них разный, потому что они защелкиваются на разных микросхемах
Хорошо ли это SYNC и AR связывать вместе без задержки?
https://i.ibb.co/Wv7RfmH/Eh50-Nd-Kiskg.jpg
Появилась новая проблема. Не могу задать вектор начального пуска.
По сигналу SEL+DIN выставляю на шину AD значение 000400. Уровни нормальные и процессор должен их прочитать и записать в PC. Но следующими двумя циклами процессор пытается прочитать адреса 000 и 002 вне зависимости от того, какой ВНП был выставлен в цикле безадресного чтения. Насколько я понимаю, в первом цикле адресного чтения у меня на шине адреса должен выставиться (продублироваться) адрес SEL(15..8), но этого не происходит. В чем может быть проблема?
https://i.ibb.co/LPy5Vxd/image.png
На данной диаграмме не начальный пуск. Да, сначала читается безадресный регистр SEL, но потом чтение идёт из USER-режима, т.к. сигнал SEL не устанавливается. Если это отработка прерывания, то это прерывание USER-режима. При отработке любого прерывания, независимо от режима, всегда читается безадресный регистр SEL.
Это у меня не прерывание. Это самый старт
Как мне решить проблему? Процессор читает 000000 независимо от SEL на шине AD. А так как по адресу 000000 у меня пусто, то следующими шагами он читает адреса 170 и 172. И дальше все по новой
Не верю. Начальный пуск - это прерывание HALT-режима. И чтение его вектора происходит из памяти HALT-режима, а значит при выдаче адреса будет установлен сигнал SEL, а его там при чтении нету.
- - - Добавлено - - -
Так как схемы не видим, то и невозможно узнать, почему процессор читает одни нули. Каким образом линии AD сажаются на землю при чтении регистра SEL?
Кажется, нащупал проблему. Драйвера не пропускают SEL к процессору