Так, займемся вертикальными сигналами...
Код:
; кадровая синхронизация
VS CS = true
VS = v3 v4 v5 ~vv v8 rg0
VS = v2 ~v3 v4 v5 ~vv v8 ~rg0
VS = ~v2 ~v3 ~vv ~v4 ~v5 ~v8
; гасящий импульс
BL CS = true
; по строкам - рассмотрены выше
BL = ~h4 ~h5 h6 rg0
BL = ~b3 ~b2 h4 ~h5 h6 rg0
BL = b3 ~h4 ~h5 h6 ~rg0
BL = ~b3 h4 ~h5 h6 ~rg0
BL = b3 ~b2 h4 ~h5 h6 ~rg0
; по кадрам
BL = ~v3 ~vv v4 v5 v8
BL = ~vv ~v4 ~v5 ~v8
; бордюр
HE CS = true
; вертикальные рамки - рассмотрены выше
HE = h4 h5 ~h6 rg0
HE = ~h5 h6
; горизонтальные рамки
HE = ~vv v8
HE = rg0 ~vv
HE = ~rg0 ~vv ~v5 ~v8
HE = ~rg0 ~vv ~v4 v5 ~v8
HE = ~rg0 ~v3 ~vv v4 v5 ~v8
Тут входных сигналов у нас больше - V2, V3, V4, V5, VV=(V6|V7)=~((~V6)&(~V7)), V8, и управляющий RG0 (напомню, 1 - экран ZX, 0 - экраны ATM). Но и структура у них проще - рассмотрев работу счётчиков, можно убедиться, что это простые меандры. Длительность одного полупериода:
V0 - 1 строка
V2 - 4 строки
V3 - 8 строк (одно знакоместо)
V4 - 2 знакоместа
V5 - 4 знакоместа
V6 - 8 знакомест (треть экрана)
V7 - 16 знакомест
V8 - 256 строк
Раз это у нас простые меандры, набор сигналов со счётчиков можно записать как двоичное число - номер строки. Перепишем логические условия, обозначив прямой сигнал как 1, а инвертированный как 0. Неиспользуемые сигналы пометим крестиком. В первую очередь нас интересует сигнал VS - сформированный от него сигнал INT сбрасывает счётчики, соответственно, он и определяет число строк в системе.
Код:
VS: 100111XXX RG0=1 ;312 строк
1001101XX RG0=0 ;316 308 строк
0000000XX ;длина импульса 4 строки
Как видно, в разных видеорежимах число строк разное - в расширенных экранах чуть больше. Не знаю, зачем это сделали, наверное для симметрии положения экранной области на экране. В принципе, для общности можно сделать одинаковое, тем более что нам нужно с запасом пентагоновские 320 строк. У Pentagon INT формируется по фронту кадрового синхроимпульса, а не по спаду, и имеет согласно вышеприведенной таблице длину 16 строк. Дальше я для переделки эти логические условия упростил путём переделки схемы компа: INT оставил как было, а сброс счётчиков сделал по спаду синхроимпульса. (Или я синхроимпульс переносил? Не помню. Надо провода на плате изучать, короче.) Вычитаем, получаем 320-16=304 строки и итоговое условие имеет вид 10011XXXX и все три строчки для вертикальной синхронизации заменяются условием
, которое я и реализовал в хард-логике.
Дальше бордюр.
Код:
HE: 100XXXXXX строки 256-до конца
X00XXXXXX RG0=1 строки 0-63
0000XXXXX \ строки 0-31
00010XXXX RG0=0 строки 32-48
000110XXX / строки 48-55
Получается, что различия в двух режимах - в том, что в расширенном режиме экран расширяется на одно знакоместо (8 строк) вверх, итого получаем 25 текстовых строк.
Ну и гашение.
Код:
BL: 100110XXX ;начинается с 304 строки до синхроимпульса
00000XXXX ;длится 16 строк после СИ
Сделал его по-топорному: полагаем, что строчное гашение равняется строчному синхроимпульсу.
Ну вот вроде и всё почти... Осталось описать, как я переносил сброс счетчиков с переднего фронта синхроимпульса на задний. Это мне уже надо плату из компа вынимать и там провода смотреть. Сигнал Z я не реализовывал - слишком сложно, поэтому оригинальные прошивки с моей заменой больше не работают!
Вот сейчас, набирая этот пост, я понял, что когда-то немного перемудрил со схемой и все можно было сделать еще проще и не вмешиваясь в плату. Господа, напомните: у ATM прерывание по фронту синхроимпульса или по спаду?