@Titus, выложи, пожалуйста, схемы ХМ2-001, ХМ2-003 в формате пикада, а то в PDF поиск по названиям сигналов не работает.
Вид для печати
@Titus, выложи, пожалуйста, схемы ХМ2-001, ХМ2-003 в формате пикада, а то в PDF поиск по названиям сигналов не работает.
Описание циклов памяти видеоконтроллера.
Один цикл памяти видеоконтроллера равен 4 тактам PCLK (PCLK - PixelClock). Один такт - это 80нс, или 12.5МГц, или одна точка в высоком разрешении экрана.
Все четные циклы отданы видеоконтроллеру, а нечетные - контроллерам памяти ПП и ЦП, или арбитру ПП и ЦП в составе видеоконтроллера, если это необходимо.
В итоге на 800 горизонтальных точек высокого разрешения (640 видимых точек и 160 точек интервала HBlank) приходится 100 циклов памяти видеоконтроллера. А на один кадр развертки - 100 * 312 = 31200 циклов памяти видеоконтроллера. Учитывая, что за один цикл читается три поля памяти (два плана из ОЗУ ЦП, и один план из ОЗУ ПП), за один кадр видеоконтроллером читается 93600 байт информации.
В дальнейшем, циклом памяти будем называть цикл памяти видеоконтроллера.
Интервал HBlank:
Во время интервала HBlank (точки 640..799, циклы памяти 80..99) для каждой строки происходит два процесса:
1. Регенерация памяти.
2. Считывание новых данных из списка строк ПП.
Причем, считывание новых данных из списка строк ПП происходит в течение всех 312 строк развертки, а не только видимых 288 строк.
Регенерация памяти:
Регенерация памяти происходит прозрачным способом в цикле HBlank (циклы 80..99, всего 20 циклов).
Старший байт адреса - всегда CTR_MEM_ADR_H (регистр адреса строки экрана).
Младший байт адреса изменяется от 0 до 127, и составляется из:
0./VCTR_D3./VCTR_D2./VCTR_D1./VCTR_D0./HCTR_D5./HCTR_D4./HCTR_D3
Таким образом, за каждые 16 линий развертки (0.58мс) будет регенерирована вся память. Исключение составляют линии экрана 304..311 (8 линий развертки), во время которых будет регенерирована лишь половина памяти, после чего начнется следующий кадр, и регенерация возобновится сначала. Таким образом, период регенерации, попавший на последние 8 линий экрана будет длиться не 0.58мс, а 0.29 + 0.58 = 0.87мс. Исходя из вышеперечисленных параметров, подойдет любая память с матрицей 128x512 (т.к. регенерируется только 128 строк памяти), и периодом регенерации >= 0.9мс.
Для ОЗУ ПП циклы 88..95 (8 циклов) - это всегда циклы чтения списка строк экрана.
Таким образом, для ОЗУ ПП:
Циклы 80..87 - это регенерация 8 строк памяти.
Циклы 88..95 - это 8 циклов чтения списка строк.
Циклы 96..99 - это 4 побочных цикла повторной регенерации 4 строк памяти.
Для ОЗУ ЦП:
Циклы 80..87 - это регенерация 8 строк памяти.
Циклы 88..95 - повторная побочная регенерация 8 строк памяти.
Циклы 96..99 - 4 побочных цикла повторной регенерации 4 строк памяти.
Чтение списка строк (циклы 88..95):
Чтение списка строк происходит только из ОЗУ ПП. ОЗУ ЦП в это время повторно регенерируется, как было описано выше.
Адрес элемента списка составляется из битов 15..3 регистра ENTRY_ADR и HCTR_D5.HCTR_D4.HCTR_D3 для четырехсловного элемента списка, и из битов 15..2 регистра ENTRY_ADR и HCTR_D4.HCTR_D3 для двухсловного элемента списка.
Если бит 1 (ENTRY_SIZE) регистра ENTRY_ADR (регистр адреса следующего элемента списка) равен нулю, то циклы 88..91 читают данные в никуда (используется при двухсловном элементе списка).
Если бит 1 (ENTRY_SIZE) равен единице, то в циклах 88..91 читаются два слова четырехсловного элемента списка (используется при четырехсловном элементе списка):
Если бит 2 (ENTRY_DATA_Q2) = 0:
Цикл 88: Чтение регистра CUR_CON_L (младшая часть первого слова регистра управления отображением).
Цикл 89: Чтение регистра CUR_CON_H (старшая часть первого слова регистра управления отображением).
Цикл 90: Чтение регистра DISP_CON_L (младшая часть второго слова регистра управления отображением).
Цикл 91: Чтение в никуда.
Если бит 2 (ENTRY_DATA_Q2) = 1:
Цикл 88: Чтение регистра COL_CON_1_L (младшая часть первого слова регистра управления цветом).
Цикл 89: Чтение регистра COL_CON_1_H (старшая часть первого слова регистра управления цветом).
Цикл 90: Чтение регистра COL_CON_2_L (младшая часть второго слова регистра управления цветом).
Цикл 91: Чтение регистра COL_CON_2_H (старшая часть второго слова регистра управления цветом).
Цикл 92: Чтение регистра МЕМ_ADR_L (младшая часть регистра адреса начала строки).
Цикл 93: Чтение регистра МЕМ_ADR_H (старшая часть регистра адреса начала строки).
Цикл 94: Чтение регистра ENTRY_ADR_L (младшая часть регистра адреса следующего элемента списка).
Цикл 95: Чтение регистра ENTRY_ADR_H (старшая часть регистра адреса следующего элемента списка).
Регистр ENTRY_ADR_L буферизирован. В цикле 94 данные сперва загружаются в регистр ENTRY_ADR_CACHE, а уже в цикле 95 переписываются в ENTRY_ADR_L синхронно с обновлением ENTRY_ADR_H.
Отображение одной строки экрана (точки 0..640, циклы памяти 0..79):
Каждый цикл происходит чтение памяти по адресу CTR_MEM_ADR. Это не зависит ни от разрешения экрана, ни от того, активен ли в данный момент интервал VBlank.
Счетчик CTR_MEM_ADR (адрес строки) загружается из списка строк в конце каждой строки (циклы 92 и 93), и инкрементируется при переходе от одного знакоместа к другому. В зависимости от разрешения экрана - это каждая 8, 16, 32 или 64 точка, что соответствует каждому 1, 2, 4 или 8 циклу памяти. Во время интервалов VBlank и HBlank инкремента не происходит.
Интервал VBlank (строки 288..311):
Интервал VBlank практически не влияет на работу видеоконтроллера, за исключением того, что во время строк 291..293 вырабатытвается синхросигнал V_SYNC, а во время строки 292, и позиции 0..511 (цикл памяти 0..63) выставляется сигнал EVNT (сетевой таймер 50Гц).
Также во время интервалов HBlank и VBlank блокируется инкремент счетчика CTR_MEM_ADR (адрес строки), а видеовыход маскируется, выдавая нули на PL0, PL1, PL2 и Y, и единицы на /P0, /P1, /P2.
Начальное состояние регистров:
В начале каждого кадра по сигналу EVNT (первые 64 цикла 292-й строки) инициализируется содержимое регистров:
1. ENTRY_ADR (регистр адреса следующего элемента списка) = 0x00B8 (курсор выключен, двухсловный элемент списка).
2. ENTRY_ADR_CACHE (буферный регистр для ENTRY_ADR_L) = 0x00 (ненужное действие).
3. CUR_FLIP_TRIGGER - курсор выключен.
4. Регистры палитры COL_CON_1_L, COL_CON_1_H, COL_CON_2_L и COL_CON_2_H инициализируются значениями 0x10, 0x32, 0x54, 0x76 соответственно (все цвета от черного к белому, пониженной яркости).
5. CUR_CON (первое слово регистра управления отображением) = 0x0008 (курсор в 0-й позиции, символьный, цвет черный повышенной яркости).
6. Биты 4 и 5 регистра DISP_CON (второe словo регистра управления отображение) сбрасываются (высокое разрешение), биты 0..2 (эмфазис компонент R, G, B) - без изменения.
Замечание: Если после включения компьютера ни разу не использовать 4-хсловный элемент списка с инициализацией регистра управления отображения, то эмфазис (выделение) цветовых компонент будет установлен как попало.
p.s.: При более рациональном построении видеоконтроллера, гораздо больше циклов памяти могло бы быть отдано ПП и ЦП. Нагрузка на память оправдана только для разрешения 640. В более низких разрешениях память простаивает (циклы чтения идут в никуда). Также циклы памяти HBlank могли бы быть отданы ПП и ЦП.
Titus, не понял отсюда такой момент - влияет ли масштабирование в строке на количество обращений к памяти? Т.е. если все строки будут x2, то значит ли что обращений будет почти вдвое меньше, или столько же?
А, увидел постскриптум, тогда понятно - обращений столько же, экономии нету :-(
Вообще никакой экономии нет ни от чего) Память насилуется и в хвост, и в гриву, и зачастую половина этого насилия вхолостую.
- - - Добавлено - - -
Вот здесь то, о чем ты спрашивал.
Иными словами, если разрешение 640, то мы для каждого байта экрана делаем одно чтение из памяти. Самый рациональный режим. Если разрешение 320, то мы каждый байт читаем два раза. Если 160, то 4 раза, если 80, то 8 раз.
Вопросы к @Titus - у. В ХМ2-001 на элемент Y_MEMORY_A должен приходить инверсный сигнал /INIT или положительный, для обнуления (или установки с учетом выходной инверсии) выхода?
А также сигнал KEY_MISMATCH будет в 1 когда Y_MEMORY_B и Y_MEMORY_C равны?
Особенности работы видеоконтроллера ХМ1-136 по краям кадра на примере режима высокого разрешения 640 точек.
https://pic.maxiol.com/images2/15972...2434844.01.png
Правый край кадра:
Такт 8 (такт 640 HCTR) - Защелкивание в регистрах REG_PLANE0,1,2 последнего байта экрана. Сигнал HBLANK становится активным, но пока что ни на что не действует.
Такт 8-15 - Последовательный вывод точек 0..7 в REG_PAL_ADR.
Такт 15 - По переднему фронту сигнала PSG (при активном HBLANK) устанавливается INIT_BIT_CTR.
Такт 17 - По заднему фронту CLC1 снимается сигнал ENABLE_PLANES.
Такт 18 - Видеопорт выключается.
Левый край кадра:
Такт 8 (такт 0 HCTR) - Снятие сигнала HBLANK.
Такт 15 - Снятие сигнала INIT_BIT_CTR.
Такт 16 - Защелкивание в регистрах REG_PLANE0,1,2 первого байта экрана.
Такт 17 - Установка сигнала ENABLE_PLANES.
Такт 18 - Видеопорт включается.
Реальный вывод изображения задерживается на время 10 пикселей высокого разрешения. Из которых задержка 8 пикселей - это регистры REG_PLANE0,1,2, из которых последовательно выдается регистру палитры 8 пикселей. Задержку на 1 пиксель дает регистр палитры REG_PAL_ADR. И, наконец, задержку на 1 пиксель дает выходной регистр видевыхода REG_VIDEO.
Некоторые дополнения к ХМ2-003.
1. У элемента H40 следует инвертировать выход (внимание для @Ynicky, который делает модель по донепричесанным реверсам).
2. Недокументированный и невыведенный выход UNK активен всякий раз, когда идет обращение к регистру, отсутствующему в ХМ2-003. Это может быть, как просто несуществующий регистр, так и любой регистр в составе другого устройства на шине. Устаналивается по DIN/DOUТ, и сбрасывается при снятии SYNC.
3. Недокументированный выход FD (делитель CLK на 1.5, и выдающий 4.16МГц) я думаю, следует расшифровать, как Frequency Divider.
4. Из-за того, что в режиме ST сигнал RPLY выдается сразу же, возможно не исключен конфликт при доступе к какому-либо регистру или ячейке памяти, на который настроена ловушка адреса. Это надо проверять конкретнее.
5. На мой взгляд, ловушку адреса в чип запихнули только потому, что он полу-пустой. Чтобы хоть чем-то его заполнить, сделали ловушку.
Да, конфликт будет, проверял на реальной УКНЦ. Так как ОЗУ медленное, если ловушка настроена на ячейку ОЗУ с выдачей сигнала ПОРТ, то при чтении этого адреса ловушка быстрее отвечает и читается ноль.
Titus, а у меня в вам вопрос по поводу формирования сигнала ST. В оптимизированной схеме ревизии 19 в контроллере прерываний условием для прерывания служит логическое выражение (SYNC & TRAP_CON_Q0 & IRQ_EN) & ADR_EQUAL, построенное на элементах K14 и K13. Т.е. условие для прерывание вырабатывается тогда когда нужный адрес, активен SYNC, установлены разряды 0 и 8 в регистре 0176644. Здесь я полностью согласен. Условие для выработки сигнала ПОРТ (он же ST) должно быть аналогичным, только при сброшенном нулевом разряде регистра 0176644. Собственно элемент K15 и делает это - SYNC & /TRAP_CON_Q0 & IRQ_EN. Но вот далее элемент K16 почему-то условие с K15 и ADR_EQUAL складывает по ИЛИ. Таким образом ST будет выставляться при любом адресе, когда активен SYNC, а также при запрограммированном адресе, независимо от настроек в регистре 0176644. По логике K16 также должен быть элементом 2И.
Промежуточная версия, т.к. я ее еще оптимизирую и проверяю.
Через какое время после установки активным SYNC, выдаются сигналы DIN и DOUT? Нужны точные растактовки ВМ2.
Здесь точного ответа не будет, т.к. в ВМ2 используется сигнал подтверждения адреса AR. Многое зависит от его длительности.
А так по ТО на ВМ2, которое вы и выкладывали, сигнал DIN устанавливается на ближайшем прямом фронте CLCO после получения сигнала AR. Если AR с практически нулевой задержкой, то один такт CLCO. Диаграммы на рис.15, лист 47. Для записи всё дольше - при нулевой задержке AR после выставления адреса через один такт CLCO адрес снимается, через полтакта выставляются данные, и ещё через такт сигнал DOUT. Диаграммы на рис.16, лист 49.
На УКНЦ соответственно нулевой задержки AR нету, там задержка сделана на цепочке логических элементов и конденсаторов, потому время на разных экземплярах может разнится. Да и на контроллер ЦП поступает тактовая 6,25 МГц, а на сам ЦП 8 МГц, тоже надо учитывать.
Имеется ввиду, что он прямо не используется, SYNC идёт на AR через линию задержки и на внешние разъёмы он не поступает. Если бы он использовался, то любое подключаемое устройство должно было на него отвечать, в качестве примера 1515ХМ1-031. Потому и диаграммы показаны без него. Этот сигнал - особенность ВМ2, в МПИ/QBUS его нет.
Я смотрю по схеме Квант rev 5:
На ЦП SYNC заведен на AR через буферный элемент с открытым коллектором. Это означает, что низкий уровень будет передан без задержки, а высокий с чуть заметной задержкой, зависящей от номинала R3.
А вот на ПП SYNC заведен на цепь задержки на 2-х инверторах и конденсаторе, затем через буферный элемент. Затем уже этот задержанный SYNC поступает на все БМК. А так же через буфер ВП1-055 возвращается на AR.
Таким образом, AR всегда синхронен с SYNC.
А SYNC на ПП зачем-то задержан.
Внимание, вопрос. Зачем на ПП SYNC задержан, а на ЦП нет?
А вот по схеме СЭМЗ интереснее.
Для ПП идет сперва задержка SYNC на двух инверторах и конденсаторе, затем такая же задержка идет для AR. Т.е. имеем двойную задержку, и, видимо, более медленное быстродействие.
- - - Добавлено - - -
Какая схема была первее, СЭМЗ или Квант?
Или, иными словами, что сначала сделали - двойную задержку, или же задержку на 055?
Подытоживаю:
На ЦП задержки между SYNC и AR практически нет.
На ПП (Квант) SYNC задерживается, за ним сразу следует AR без задержки.
На ПП (СЭМЗ) SYNC задерживается, затем AR также задерживается.
- - - Добавлено - - -
Ну и зачем они в СЭМЗ'е тормознули эту линию, если на Кванте все работало? Или что-то не работало, раз отказались от трех буферных линий на 055?
Не согласуется с теорией относительности. Свет тоже имеет конечную скорость. Так что какая-то задержка всё же есть, небольшая, но есть. Но я думаю, если она значительно меньше такта CLCO, то ей можно пренебречь. Но это для ЦП через один логический элемент. А для ПП может получиться так, что эти небольшие наносекунды могут сыграть роковую роль и AR придет сразу же за прямым фронтом CLCO, тогда придётся ждать ещё один такт.
- - - Добавлено - - -
По слухам, на КВАНТЕ часто выходил из строя этот буфер, как раз в районе этих трёх линий. Видал даже фото, где паяли прямые перемычки.
А по тестам скорости вы не помните, СЭМЗы были более тормозными наверное, раз двойная задержка для ПП?