В принципе мне не нужны, т.к. вскрыты и отреверсены.
Вид для печати
@Titus, Будет время, поправь нумерацию выводов в 120й.
CPU:
DOUTC=>4
DINC=>5
INITC=>9
IAKOC=>8
ARC=>12
RPLYC=>11
PPU:
SYNCP=>30
INITP=>35
DOUTP=>32
A0=>33
A1=>28
https://pic.maxiol.com/images2/15956...151951582..png
Наименования сигналов:
ACT_WRITE - устанавливается по фронту записи в регистр октета. Сбрасывает по CLCA3_F3 (фаза завершения).
CLCA3_F1 - фаза F1. Передача данных видеоконтроллеру, аналогично записи в регистр планов 1 и 2.
CLCA3_F2 - фаза F2. Запись данных плана 0 в ОЗУ ПП.
RQ - сигнал запроса обмена с видеоконтроллером. Повторяет CLCA3_F1.
CC0 - сигнал запроса записи в планы 1 и 2. Повторяет ACT_WRITE.
Описание:
Запись в регистр октета (адрес 177024) начинается по переднему фронту DOUT. Одновременно с этим устанавливается сигнал подтверждения записи RPLY. Таким образом, запись в регистр октета имеет для процессора нулевую задержку. Одновременно с этим устанавливается сигнал CC0. Также во время активного DOUT производятся логические операции с младшим байтом, выставленным на шине AD0..AD7. Назовем этот байт OCTET.
1) if (MASK_Q0 == 1), then PLANE0_DATA = (OCTET & INC_COLOR_Q0) | (~OCTET & [PAPER_H_Q12.Q8.Q4.Q0.PAPER_L_Q12.Q8.Q4.Q0])
2) if (MASK_Q1 == 1), then PLANE1_DATA = (OCTET & INC_COLOR_Q1) | (~OCTET & [PAPER_H_Q13.Q9.Q5.Q1.PAPER_L_Q13.Q9.Q5.Q1])
3) if (MASK_Q2 == 1), then PLANE2_DATA = (OCTET & INC_COLOR_Q2) | (~OCTET & [PAPER_H_Q14.Q10.Q6.Q2.PAPER_L_Q14.Q10.Q6.Q2])
В итоге в регистрах данных планов, для которых MASK_Qx = 1, защелкиваются новые вычисленные значения.
По отрицательному фронту CLCA (такт 4) устанавливается сигнал RQ.
По положительному фронту CLCA (такт 8) на шину A0..A7 выводится содержимое регистра PLANE2_DATA.
Через пол-такта (такт 8.5) на шину D0..D7 выводится содержимое регистра PLANE1_DATA.
Еще через пол-такта по внутреннему сигналу видеоконтроллера A_D_LATCH (такты 9 и 10), содержимое шин A0..A7 и D0..D7 защелкивается видеоконтроллером с шин AG0..AG7 и DG0..DG7 в регистрах DC_H, и DC_L, соответственно.
Через один такт (такт 12) шины A0..A7, D0..D7 освобождаются для видеоконтроллера на 4 такта, сигналы RQ, CC0 переводятся в неактивное состояние.
По положительному фронту CLCA начинается процесс записи данных PLANЕ0 в ОЗУ ПП. Сигнал WE установлен, что означает запись в ОЗУ.
Такт 16 - на шину A0..A7 выводится младшая часть адреса планов PLANE_ADR.
Такт 16.5 - на шину D0..D7 выводятся данные регистра PLANE0.
Такт 17 - видеоконтроллером устанавливается сигнал RAS, по которому в ОЗУ защелкивается адрес строки (младшая часть адреса планов).
Такт 17.5 - на шину A0..A7 выводится старшая часть адреса планов PLANE_ADR.
Такт 18 - устанавливается сигнал CAS, по которому в ОЗУ защелкивается адрес столбца (старшая часть адреса планов).
Такт 19.5 - снимается сигнал RAS, по которому данные запоминаются в ОЗУ.
Такт 20 - завершение процесса.
Шины A0..A7, D0..D7 освобождаются, сигналы CAS и WE снимаются.
- - - Добавлено - - -
Спасибо за наблюдательность. Иногда не обращаю внимания на номера ножек, т.к. они в глаза не бросаются, номера и номера)
1801ВП1-120-Optimized - rev 15
- - - Добавлено - - -
Замечу, что рисуя диаграммы, я параллельно исправляю какие-то ошибки или неточности в оптимизированных схемах, так что если кто-то (например, @Ynicky) строит FPGA-модель по ним, то надо иметь это в виду.
https://pic.maxiol.com/images2/15956...151951582..png
Наименования сигналов:
ACT_WRITE - устанавливается по фронту записи в регистр адреса планов. Сбрасывает по CLCA4_F5 (фаза завершения).
CLCA4_F1 - фаза F1. Адрес планов записывается в видеоконтроллер.
CLCA4_F2 - фаза F2. Чтение данных плана 0 из ОЗУ ПП.
CLCA4_F3 - фаза F3. Чтение данных планов 1 и 2 из видеоконтроллера.
Описание:
Запись в регистр адреса планов (адрес 177010) начинается по переднему фронту DOUT. Одновременно с этим устанавливается сигнал подтверждения записи RPLY. Таким образом, запись в регистр адреса планов имеет для процессора нулевую задержку. Во время активного DOUT данные с шины AD0..AD15 защелкиваются в регистре адреса планов PLANE_ADR.
По отрицательному фронту CLCA (такт 4) устанавливается сигнал RQ.
По положительному фронту CLCA (такт 8) на шину A0..A7 выводится старшая часть регистра адреса планов PLANE_ADR.
Через пол-такта (такт 8.5) на шину D0..D7 выводится младшая часть регистра адреса планов PLANE_ADR.
Еще через полтора такта (такт 10) содержимое шин A0..A7 и D0..D7 защелкивается видеоконтроллером с шин AG0..AG7 и DG0..DG7 в регистрах DC_H, и DC_L, соответственно.
Через один такт (такт 12) шины A0..A7, D0..D7 освобождаются для видеоконтроллера на 4 такта, сигнал RQ переводится в неактивное состояние.
По положительному фронту CLCA начинается процесс чтения данных из ОЗУ ПП в регистр PLANE0_DATA.
Такт 16 - на шину A0..A7 выводится младшая часть адреса планов PLANE_ADR.
Такт 17 - видеоконтроллером устанавливается сигнал RAS, по которому в ОЗУ защелкивается адрес строки (младшая часть адреса планов).
Такт 17.5 - на шину A0..A7 выводится старшая часть адреса планов PLANE_ADR.
Такт 18 - устанавливается сигнал CAS, по которому в ОЗУ защелкивается адрес столбца (старшая часть адреса планов). В течение активного сигнала CAS данные с шины D0..D7 защелкиваются в регистре плана 0 (PLANE0_DATA).
Такт 19.5 - снимается сигнал RAS.
Такт 20 - завершение процесса чтения.
Шины A0..A7 освобождается, сигнал CAS снимается.
Устанавливаются сигналы RQ и CC1.
Такт 24..26 - данные планов 1 и 2, предоставленные видеоконтроллером, защелкиваются с шины D0..D7 в регистре PLANE1_DATA, и с шины A0..A7 в регистре PLANE2_DATA, соответственно.
- - - Добавлено - - -
Не смотря на то, что задержка (latency) записи в регистры октета, планов 1&2, адреса планов нулевая, пропускная способность (throughput) для этих команд значительно ниже.
Подробней можно расписать только зная точную растактовку ВМ2, а также особенности работы контроллеров памяти ПП и ЦП.
Однако, знание нюансов работы контроллеров и процессора, значительно увеличивает возможность оптимизации работы с графикой УКНЦ по скорости.
Скрытый текст
Описание:
Запись в регистр плана 0 (адрес 177012) начинается по переднему фронту DOUT. Если контроллер все еще занят операциями записи в регистр октета или в регистр адреса планов, то начало записи в регистр плана 0 задержится до окончания последнего цикла CLCA предыдущей операции. Во время всего активного цикла DOUT данные с шины AD0..AD7 защелкиваются в регистре плана 0 (PLANE0_DATA).
В последнем такте отрицалельного фронта CLCA (такт 7) происходит подготовка данных для записи.
По положительному фронту CLCA начинается процесс записи данных PLANЕ0 в ОЗУ ПП. Сигнал WE установлен, что означает запись в ОЗУ.
Такт 8 - на шину A0..A7 выводится младшая часть адреса планов PLANE_ADR.
Такт 8.5 - на шину D0..D7 выводятся данные регистра PLANE0.
Такт 9 - видеоконтроллером устанавливается сигнал RAS, по которому в ОЗУ защелкивается адрес строки (младшая часть адреса планов).
Такт 9.5 - на шину A0..A7 выводится старшая часть адреса планов PLANE_ADR.
Такт 10 - устанавливается сигнал CAS, по которому в ОЗУ защелкивается адрес столбца (старшая часть адреса планов).
Такт 11.5 - снимается сигнал RAS, по которому данные запоминаются в ОЗУ.
Если была запись байта (WTBT = 1), то:
Такт 12 - выдается сигнал RLPY, а также освобождаются шины A0..A7, D0..D7, сигналы CAS и WE снимаются.
В ответ на сигнал RPLY, процессор снимает сигнал DOUT.
Если же была запись слова (WTBT = 0), то происходит полный повтор предыдущего цикла CLCA, записывается по тому же адресу тот же самый байт.
В такте 20 выдается сигнал RLPY, а так же освобождаются шины A0..A7, D0..D7, сигналы CAS и WE снимаются.
В ответ на сигнал RPLY, процессор снимает сигнал DOUT.
Замечание: Словная запись в регистр плана 0 является побочным эффектом использования механизма словной/байтовой записи в память. Двойная запись одного и того же байта по тому же адресу связана с тем, что при записи в регистр плана 0 не задействован механизм поочередной записи младшего/старшего байта по последовательным адресам.
Диаграммы байтовой и словной записи полностью идентичны записи в регистр плана 0.
Описание:
Запись в ОЗУ ПП начинается по переднему фронту DOUT. Если контроллер все еще занят операциями записи в регистр октета или в регистр адреса планов, то начало записи в ОЗУ задержится до окончания последнего цикла CLCA предыдущей операции.
В последнем такте отрицалельного фронта CLCA (такт 7) происходит подготовка данных для записи.
Запись байта (WTBT = 1):
По положительному фронту CLCA начинается процесс записи данных в ОЗУ ПП. Сигнал WE установлен, что означает запись в ОЗУ.
Такт 8 - на шину A0..A7 выводится младшая часть адреса (LATCH_ADR).
Такт 8.5 - на шину D0..D7 выводятся данные с AD0..AD7, если запись по четному адресу, и данные с AD8..AD15, если запись по нечетному адресу.
Такт 9 - видеоконтроллером устанавливается сигнал RAS, по которому в ОЗУ защелкивается адрес строки (младшая часть адреса).
Такт 9.5 - на шину A0..A7 выводится старшая часть адреса (LATCH_ADR).
Такт 10 - устанавливается сигнал CAS, по которому в ОЗУ защелкивается адрес столбца (старшая часть адреса).
Такт 11.5 - снимается сигнал RAS, по которому данные запоминаются в ОЗУ.
Такт 12 - выдается сигнал RLPY, а также освобождаются шины A0..A7, D0..D7, сигналы CAS и WE снимаются.
В ответ на сигнал RPLY, процессор снимает сигнал DOUT.
Запись слова (WTBT = 0):
По положительному фронту CLCA начинается процесс записи младшего байта в ОЗУ ПП. Сигнал WE установлен, что означает запись в ОЗУ.
Такт 8 - на шину A0..A7 выводится младшая часть адреса (LATCH_ADR). Младший бит принудительно равен 0.
Такт 8.5 - на шину D0..D7 выводятся данные с AD0..AD7.
Такт 9 - видеоконтроллером устанавливается сигнал RAS, по которому в ОЗУ защелкивается адрес строки (младшая часть адреса).
Такт 9.5 - на шину A0..A7 выводится старшая часть адреса (LATCH_ADR).
Такт 10 - устанавливается сигнал CAS, по которому в ОЗУ защелкивается адрес столбца (старшая часть адреса).
Такт 11.5 - снимается сигнал RAS, по которому данные запоминаются в ОЗУ.
Такт 12 - шины A0..A7, D0..D7 освобождаются для видеоконтроллера на 4 такта, сигналы CAS и WE снимаются.
По положительному фронту CLCA начинается процесс записи старшего байта в ОЗУ ПП. Сигнал WE установлен, что означает запись в ОЗУ.
Такт 16 - на шину A0..A7 выводится младшая часть адреса (LATCH_ADR). Младший бит принудительно равен 1.
Такт 16.5 - на шину D0..D7 выводятся данные с AD8..AD15.
Такт 17 - видеоконтроллером устанавливается сигнал RAS, по которому в ОЗУ защелкивается адрес строки (младшая часть адреса).
Такт 17.5 - на шину A0..A7 выводится старшая часть адреса (LATCH_ADR).
Такт 18 - устанавливается сигнал CAS, по которому в ОЗУ защелкивается адрес столбца (старшая часть адреса).
Такт 19.5 - снимается сигнал RAS, по которому данные запоминаются в ОЗУ.
Такт 20 - выдается сигнал RLPY, а также освобождаются шины A0..A7, D0..D7, сигналы CAS и WE снимаются.
В ответ на сигнал RPLY, процессор снимает сигнал DOUT.
- - - Добавлено - - -
Я думаю, что практически нет смысла использовать запись в регистр плана 0, если видео-ОЗУ расположено в доступной части ОЗУ ПП (ниже адреса 0x8000, или же ниже адреса регистров 0xFE00, если страницы ОЗУ спроецированны в верхнюю память). И тут несколько причин:
1. Байтовая запись медленная из-за фиктивного чтения.
2. Словная запись медленная, т.к. занимает двойное время, но записывает один байт.
3. И, наконец, запись в регистр адреса планов (а ведь туда надо записать адрес) - это ОЧЕНЬ МЕДЛЕННАЯ операция, требующая чтения ОЗУ ПП, ОЗУ ЦП, и при этом еще и подтормаживающая в это время ЦП.
Словом, я бы рекомендовал программистам никогда не использовать запись в регистр планов 0.
Вообще, к разработчикам механизма работы с ОЗУ много вопросов. Я бы назвал придуманные ими конструкциями сложными, косячными и местами бесполезными. Множество ресурсов потрачено на регистровый доступ к памяти, и при этом вообще не предусмотрен никакой автоинкремент адреса. Относительно неплохие графические возможности без механизма быстрой переброски данных - это товарный поезд с дрезиной вместо тепловоза. А ведь в эти самые же потраченные ресурсы ПЛМ вполне можно было напихать подходящие для быстрой работы функции. Но, похоже, действительно, компьютер был задуман как чисто учебный, но никак не игровой.
Медлительность сохранится и при прямой записи. При байтовой записи также будет фиктивное чтение, а чтение из ОЗУ всегда будет за два прохода, надо два байта прочесть, медленно однако. Запись тоже будет за два прохода, т.к. ОЗУ стоит на одной ноге. Да и к тому же при маппинге страниц ОЗУ на адреса выше 0100000, ПЗУ выше 0120000 не отключить, соответственно можно только применять команды MOV(B), CLR(B).
Не соглашусь. С точки зрения программиста колоссальная разница.
Если я использую регистровый механизм, я сперва даю команду записи в регистр адреса планов (а это >24 тактов ожидания ПП, и дополнительно 8 тактов торможения ЦП), затем команду записи в регистр плана 0 (а это 16 тактов ожидания, если запись словная). И при этом мы записали всего ОДИН байт!
Тогда как записывая просто в память мы тратим лишь 16 тактов ожидания (при словной записи), и при этом получаем два записанных байта.
Почувствуйте разницу, как говорится. Ради этого стоит разместить видеоОЗУ в доступной части ОЗУ ПП (ниже 0xA000).
- - - Добавлено - - -
Кстати, почему с 0xA000? У нас же системное ПЗУ начинается с 0x8000, а не с 0xA000. Ну и понятно, что хоть читаться будет ПЗУ, но писаться будет в ОЗУ, при соответствующем маппинге страниц верхнего ОЗУ.
Да, призываю в тему @Vslav'а за уточнением.
Как раз оказывает. Если при чтении будет выставлен WTBT, то контроллер ОЗУ ПП ответит иначе, а именно прочитает один байт, как и при записи.
Titus,Цитата:
Сигнал «Байт» (WTBT) используется в двух случаях: при передаче
адреса, когда сигнал «Байт» указывает, что дальше будет следовать операция
вывода, а не ввода, и при передаче данных, когда этот сигнал указывает, что
выводится байт, а не слово.
https://pic.maxiol.com/images2/15956...1951582.01.png
Описание:
Чтение из ОЗУ ПП начинается по переднему фронту DIN. Если контроллер все еще занят операциями записи в регистр октета или в регистр адреса планов, то начало чтения ОЗУ задержится до окончания последнего цикла CLCA предыдущей операции. На шину AD0..AD15 выставляется предыдущее слово прочитанное из памяти, и сохраненное в регистрах MEM_HIGH/MEM_LOW.
В последнем такте отрицалельного фронта CLCA (такт 7) происходит подготовка данных для чтения.
Чтение из ОЗУ всегда словное:
По положительному фронту CLCA начинается процесс чтения младшего байта из ОЗУ ПП.
Такт 8 - на шину A0..A7 выводится младшая часть адреса (LATCH_ADR). Младший бит принудительно равен 0.
Такт 9 - видеоконтроллером устанавливается сигнал RAS, по которому в ОЗУ защелкивается адрес строки (младшая часть адреса).
Такт 9.5 - на шину A0..A7 выводится старшая часть адреса (LATCH_ADR). С этого момента шина данных D0..D7 выводится на AD0..AD7.
Такт 10 - устанавливается сигнал CAS, по которому в ОЗУ защелкивается адрес столбца (старшая часть адреса). После чего ОЗУ выставляет на шину данных D0..D7 значение из памяти.
Такт 11.5 - снимается сигнал RAS.
Такт 12 - шина A0..A7 освобождается для видеоконтроллера на 4 такта, сигнал CAS снимается, данные с шины D0..D7 защелкиваются в регистре MEM_LOW.
По положительному фронту CLCA начинается процесс чтения старшего байта из ОЗУ ПП.
Такт 16 - на шину A0..A7 выводится младшая часть адреса (LATCH_ADR). Младший бит принудительно равен 1.
Такт 17 - видеоконтроллером устанавливается сигнал RAS, по которому в ОЗУ защелкивается адрес строки (младшая часть адреса).
Такт 17.5 - на шину A0..A7 выводится старшая часть адреса (LATCH_ADR). С этого момента шина данных D0..D7 выводится на AD8..AD15.
Такт 18 - устанавливается сигнал CAS, по которому в ОЗУ защелкивается адрес столбца (старшая часть адреса). После чего ОЗУ выставляет на шину данных D0..D7 значение из памяти.
Такт 19.5 - снимается сигнал RAS.
Такт 20 - шина A0..A7 освобождается, сигнал CAS снимается, данные с шины D0..D7 защелкиваются в регистре MEM_HIGH. На шине AD0..AD15 находится слово, прочитанное из ОЗУ. Выдается сигнал RPLY, в ответ на который процессор считывает данные с шины AD, и снимает сигнал DIN. Шина AD освобождается.
Как видно из графиков, данные на шине AD в процессе чтения меняются следующим образом:
Начало чтения (DIN установлен) - на шине AD0..AD15 выставляется предыдущее слово, прочитанное из ОЗУ.
Такт 9.5 - на шине AD0..AD7 - мусор, копируемый с D0..D7, AD8..AD15 - предыдущее значение.
Tакт 10..11 - на шину AD0..AD7 выставляется значение из памяти (младший байт), AD8..AD15 - предыдущее значение.
Такт 17.5 - на шине AD8..AD15 - мусор, копируемый с D0..D7, AD0..AD7 - младший байт.
Такт 18..19 - на шину AD8..AD15 выставляется значение из памяти (старший байт), AD0..AD7 - младший байт.
У меня это тоже получалось. Ставил опыты, делал маппинг ОЗУ при подключенном ПЗУ. И у меня было прочитано сложенное по ИЛИ значение ячейки ПЗУ и предыдущего чтения с ОЗУ, иногда прочитывался младший байт. При этом чувствовалось влияние предвыборки 1801ВМ2, т.к. в значение предыдущего чтения ОЗУ попадала следующая команда.
Из интересного осталось чтение регистра октета 0177024. При его чтении значения регистров данных планов 0177012 и 0177014 просто раскидываются в регистры кода цвета фона 0177020 и 0177022.
Этого нельзя делать, т.к. спрайтовый механизм используется для вывода символов. А при выводе символов цвет фона постоянный, регистры кода цвета фона 0177020 и 0177022 загружаются постоянными значениями. Если бы они загружались всё время при записи регистра адреса, то для вывода символа перед очередной записью в регистр октета всё время пришлось бы грузить регистры кода цвета фона. Вывод символов был бы очень медленным.
Для вывода на постоянном фоне не нужна загрузка планов из памяти, при установке нового адреса планов. Это совершенно лишнее медленное действие.
В общем, как не крути - косячно придумано.
Тогда уж следовало сделать так - при чтении октета - грузить планы из памяти. А при установке нового адреса планов, ничего не грузить. Но уже как сделано, так сделано.
Да как ни крути, установка адреса планов никак не должна автоматически загружать планы из памяти.
И, конечно, опционально иметь автоинкремент.
Еще остается под вопросом проверка на коллизию с окончанием записи в планы 1 и 2, которая, как видно из схемы, не проверяется. Т.е. более длинные команды - запись в регистр октета, и адреса планов проверяются, а запись в регистр планов 1 и 2, которая имеет нулевую задержку по RPLY, но при этом занимает дополнительный цикл CLCA, не проверяется.
Надо проверить, что будет, если эта команда еще не закончилась, а к контроллеру поступил новый запрос.
- - - Добавлено - - -
Я так думаю, что предполагается, что процессор просто не успеет в течение цикла CLCA запросить следующее чтение у контроллера.
Так сделали, чтобы РД читались быстрее. Занесли в РА адрес, далее контроллер ПП его сам передаёт видеоконтроллеру, он читает данные и передаёт контроллеру ПП. Остаётся прочесть РД. А так при чтении РД будут запрашиваться данные через видеоконтроллер, придётся ждать.
Так чтение данных ОЗУ при чтении РД сделано в контроллере ЦП, регистры 0176640/0176642. Но тут к самому контроллеру прикручена память, никакого запроса через видеоконтроллер делать не надо.
Сам ПП не приостанавливается. Приостановится может обращение к ОЗУ, а если программа исполняется в системном ПЗУ, то особых проблем нет.
- - - Добавлено - - -
Об этом давно говорили большевики.
- - - Добавлено - - -
Titus, а когда вы узнали про раритетные регистры? 35 лет назад?
- - - Добавлено - - -
Titus, ещё просьба по описанию записи в регистр октета и регистр адреса планов.
1. Регистр октета. Не расписаны назначения CLCA3_F0 и CLCA3_F3. И на диаграмме почему-то CLCA2_F4 вместо CLCA3_F3.
2. Регистр адреса планов. Не расписаны назначения CLCA4_F0, CLCA4_F4 и CLCA4_F5. И на диаграмме почему-то CLCA2_F5 вместо CLCA4_F5.
Причесал, исправил, сделал схему красивенькой.
1515ХМ1-032-Optimized - rev 43.pdf
1515ХМ1-032-Optimized - rev 43.sch (P-CAD 2006)
- - - Добавлено - - -
F0 - разрешает шинам D и A работать на вывод.
F3 - сброс автомата
- - - Добавлено - - -
F0 - разрешает шине A работать на вывод.
F4 - разрешает запись в регистры планов 1 и 2.
F5 - сброс автомата.
- - - Добавлено - - -
Нет, несколько лет назад, на форуме)
- - - Добавлено - - -
Значит общее поле сознание дает одинаковые результаты)
- - - Добавлено - - -
Работу из ПЗУ я вообще не рассматриваю, т.к. с точки зрения программиста оно для меня не интересно, т.к. оно написано уже сто лет назад. Я пишу программы, которые работают из ОЗУ. А оно приостанавливается, а значит и приостанавливается ПП.