Поправил тайминги на чтение, теперь считывает точно то что записано.. видимо действительно ПЗУ быстрее РАМ, тк из ПЗУ читалось без ошибок.
- - - Добавлено - - -
Спасибо, переделал, снимал после снятия DOUT.
Вид для печати
Как я ранее писал, ОЗУ на ПП восьмибитное. Там слово читается контроллером в два приёма, потому RPLY приходит значительно позже. Но ещё до выставления RPLY контроллер ОЗУ выставляет на шину буферный регистр, сначала в нём появляется младший байт, потом старший.
Кстати можно очистить начало ОЗУ (записать нули) до ячейки 0300, теоретически экран должен погаснуть.
Ну логика там (после подтверждения захвата шины) примерно такая
- Выставили адрес
- Адрес устаканился
- Выставили SYNC
- Подождали энное время
- Выставили данные
- Данные устаканились
- Выставили DOUT
- Запустили таймер (сколько он по времени - надо смотреть спецификацию QBus)
- Ждем или ответа RPLY или истечения таймера
-- если прилетел RPLY
--- снимаем данные, снимаем DOUT
--- снимает SYNС
-- если таймер истек - на шине такого адреса нет
- если цикл на шине закончился - снимаем SACK
Нет, не очистился, стал вот таким: https://cloud.mail.ru/public/4wEN/2zoJbUFGh
Блин, почему-то мейл фото вертикально воткнул.
- - - Добавлено - - -
Пока не делаю, вечно жду ответа (когда буду вылизывать программу сделаю таймер)
Что то мне память царапает, что если перед числом ноль - оно считается записанным в восьмеричной нотации, если 0x (ну это уж точно) - то в шестнадцатиричной.
В MACRO-11 (по умолчанию) - восьмеричное, если после числа точка, то десятичное. Но есть такая директива .RADIX, которая позволяет поменять основание счисления.
Ну стал однородным, так как ещё считываются данные с ОЗУ ЦП при выводе изображения, по идее и его чистить надо. Да и грузить регистры отображения и цвета в видеоконтроллер.
Можно сделать более сложную задачу - записать в ОЗУ ЦП и ПП, но делается это через регистры адреса и данных.
Цикл от адрес 0 до 0277
Записать адрес в регистр 177010
Записать 0 в 177012
Записать 0 в 177014
Конец цикла.
Хоть УКНЦ и аппарат моей юности, но УКНЦ-подобное совсем прошло боком, так что о восьмеричной системе я только слышал..
- - - Добавлено - - -
да там не такая и большая разница, ВМ2 ПП работает на 4МГЦ, СТМка моя на 80.. для эмулятора у меня была разогнана до 120 МГц, вообще она и на 160 работает, но уже УАРТ глючит.
Разница в 20 раз - это совсем мало.. от 3 до 10 команд на асме.
Поля операндов в команде завязаны на трехбитные поля, так что в восьмеричной записи после некоторого количества опыта команды и операнды декодируются в уме влёт. Ни при десятичной, ни при шестнадцатеричной такое не прокатит... Шестнадцатеричное (точнее перевод в десятичное или двоичное в диапазоне B-D) до сих пор на пальцах
- - - Добавлено - - -
Это приличная разница. Грубо - считает ли программа минуту или 10 (даже 5) - заметишь хорошо :)
Это когда у тебя расчеты, а когда у тебя операция 1+5 и записать в ячейку с адресом 0х10000000, вот только она привязана к ноге GPIO и выполняется с частотой 4 МГц - это вообще не разница!!! Тупо не успеешь сделать что-нибудь еще.
- - - Добавлено - - -
Вот странно это... Я перед записью адреса и данных инвертирую биты, тк у УКНЦ инверсная шина..
Вот кусочек кода:
Скрытый текст
"mvn r1,%[data] \n" //set data
"strh r1,[%[portc],ODR] \n"
[свернуть]
mvn это mov сразу с инверсией, а ODR - что положили, то и на выходе, те 1 - высокий, 0 - низкий
- - - Добавлено - - -
Как только отдал ДМА в памяти стало:
Скрытый текст
FFFF FF00 FFFF FF00 FFFF FF00 FFFF FF00
FFFF FF00 FFFF FF00 FFFF FF00 FFFF FF00
FFFF FF00 FFFF FF00 FFFF FF00 FFFF FF00
FFFF FF00 FFFF FF00 FFFF FF00 FFFF FF00
FFFF FF00 FFFF FF00 FFFF FF00 FFFF FF00
FFFF FF00 FFFF FF00 FFFF FF00 FFFF FF00
FFFF FF00 FFFF FF00 FFFF FF00 FFFF FF00
FFFF FF00 FFFF FF00 FFFF FF00 FFFF FF00
FFFF FF00 FFFF FF00 FFFF FF00 FFFF FF00
FFFF FF00 FFFF FF00 FFFF FF00 FFFF FF00
FFFF FF00 FFFF FF00 FFFF FF00 FFFF FF00
FFFF FF00 FFFF FF00 FFFF FF00 FFFF FF00
FFFF FF00 FFFF FF00 FFFF FF00 FFFF FF00
[свернуть]
Тогда ок
Нули и FF - это данные ДО ИНВЕРТИРОВАНИЯ при отдаче на шину или это данные, которые УЖЕ ИНВЕРТИРОВАНЫ и полетели в шину?
Рефреш памяти не работает? Кстати, всякого рода шахматка и полосы тоже на это будут намекать
Попробуйте что нибудь записать, подождать долго, а потом прочитать записанное. Если рефреш не работает, то после задержки (даже без снятия ПДП) прочитается другое
Чтоб не путаться я называю данные так как мы привыкли, те для нас 0 это 0, для УКНЦ это высокий уровень, так что да "данные ДО ИНВЕРТИРОВАНИЯ"
- - - Добавлено - - -
Получил ДМА, записал FF в экранную область, ждал больше минуты считал, считались FF. Как только отдаю ДМА, а потом забираю вновь, читаю а там вместо FFFF уже FF00.
Хотя нет.. Если данные инвертируются при передаче на шину УК-НЦ, то FF на шину полетит как 0, но с точки зрения данных для в ячейку запишется FF, то есть как если бы я написал MOV #377, @#0. И аналогично, хотим записать 0, при передачи на шину он инвертируется, то есть на шину полетит FF, но с точки зрения логики, это как если бы я написал CLR @#0 .... Если только при записи в память контроллер их не инвертирует ещё раз. Как, например, при записи на CF на шину выставилось FF, но записать надо 0, иначе потом на писюке я и прочитаю FF, поэтому контроллер CF данные ещё раз инвертирует...
- - - Добавлено - - -
Занимательно.. Но мыслей нет. А если не записать не FF, а скажем DBE7?
Странно... DBE7 и осталось :( я даже комп включил-выключил, вдруг это была случайность..
- - - Добавлено - - -
Меняю на 0000 или на FFFF, опять картина с изменениями...
- - - Добавлено - - -
Все.. я понял... с 0000 тоже нет изменений, только с FFFF
Как только отдаёте ДМА, то процессор начинает работать дальше, сложно сказать, чего он там выполняет. Можно перед захватом шины его остановить с помощью DCLO, т.е. подать ноль и снять. При этом ACLO трогать не надо. Вот только не уверен, будет ли на остановленном процессоре работать захват шины.
Похоже, что 0000 очищает экран, но не область "атрибутов экрана" (если такая есть у УКНЦ).
- - - Добавлено - - -
Согласен
- - - Добавлено - - -
А вот по идее, если не писать ни чего в область видеобуфера, а просто его считать, что должно быть там при исправном ПП, но не запущенном ЦП? Черный экран, те 0?
Попробовал вот такой эксперимент, забираю ДМА, пишу в видеобуфер А5А5, отдаю дма, нажимаю Сброс, забираю дма, читаю из видеобуфера А5А5! Те он не очищается, а после сброса должен был!
- - - Добавлено - - -
Эх.. а чего он будет очищаться, если у меня 031 дохлая и он в ошибку сваливается?! :(
Это не видеобуфер, это ОЗУ. В УКНЦ структура видеопамяти довольно сложная и располагаться она может в разных местах и не обязательно последовательно. От того как таблицу описания видеострок запрограммируют.
- - - Добавлено - - -
Можете записать 0x9090, должен быть такой же эффект как и на 0xFFFF.
В общем ситуация с моим УКНЦ такая: без работы 031 очищаться экран не будет когда мы записываем туда 0, может потому что ТРАП4, может еще почему, Я сейчас совместил тестер и "эмуль" 031, после отрабатывания эмулятора и получения ДМА заливка в область с о000 по о300 нулями окрашивает экран черным и остается таким после выхода из режима ДМА.
Что дальше делать со своею бедою я не знаю..
Можно ли залить из режима ДМА в облать памяти ЦП то что заливает ПП при старте? Или как-то проверить, что он залил?
В -031 портов много. Ведь это контроллер клавиатуры (регистры 177700, 177702, 177704), программируемый таймер (регистры 177710, 177712, 177714), системный регистр управления 177716. Есть тема по реверс-инжинирингу БМК 1515ХМ1/2 для УКНЦ - https://zx-pk.ru/threads/30964-rever...515khm1-2.html. Там собственно разобрали работу 1515ХМ2-001 - это немного улучшенная версия 1515ХМ1-031, по выводам и программно полностью совместимая, с уменьшенным количеством глюков в программируемом таймере. Схема есть, возможно где-то и будут мелкие ошибки, так что сделать можно.
Alex_K, это специально для вас :) https://cloud.mail.ru/public/cP4h/5sQvgyiT7
- - - Добавлено - - -
Извиняюсь конечно, за столь не качественное видео
А в какой момент запускается ЦП?
Да, пультовый монитор уже должен перекачаться в системное ОЗУ ЦП. Также вероятен сбой памяти в магистрали ЦП.
ZPilot, вы как-то хотели проверить, что закачалось в ОЗУ ЦП. Содержимое можно перекачать по такому алгоритму:
FOR ADDR=070000 TO 077777
0177010 := ADDR
VALUE := 0177014
NEXT ADDR
Т.е. пробежаться по адресам системного ОЗУ ЦП от 070000 до 077777. Регистр 0177010 является регистром адреса, после записи в него в регистре 0177014 появляется значение соответствующей ячейки ОЗУ ЦП.
Да, сделаю обязательно, но для этого нужно немного модифицировать мой "тестер-эмулятор", у меня он сейчас только в режиме эмуляции работает, надо добавить физическую кнопку для выхода в режим тестера. Плюс, я сделал что весь диапазон с 177700 по 177717, те 16 адресов отвечают, надо сделать, чтоб отвечали только те, что вы написали.
Как то так: https://cloud.mail.ru/public/2oU7/4EfkNfD4F
Понятно. Если -031 выпаяли, то сигналы запроса вектора прерывания до 1801ВП1-120 могут не доходить.
Просто если инициализация прошла нормально, то при инициализации текстового терминала в буфер ложится код 014, который очищает экран, тогда очищенный экран должен быть весь синий. Да и СТОП мог произойти как в ЦП, так и в ПП.
Запаял обратно для проверки. Он 100% не рабочий!
Я думаю, что эмулятор отвечает не правильно на какой-то из регистров и ЦП думает, что идет загрузка, скажем из сетевой карты или еще из чего, вот эта надпись появилась случайно, после того как я не правильно сделал программу и СТМ отвечал на запросы к 031 не правильно.. Видимо в очередной раз проскочил СТОП из регистра клавиатуры.
Если выпаивать -031, то на плате надо соединить выводы 31 (IAKI) и 30 (IAKO), иначе не будут проходить запросы вектора прерывания к 1801ВП1-120.