Программно-аппаратное формирование видеосигнала

Печатные платы, программируемая логика, разработка и изготовление аппаратуры

Moderator: Shaos

User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

Lavr wrote:PS. И вот ещё что вспомнилось, подумав... Я запускал эмулятор Шевцова
на 286-й машине 20 МГц, всё работало, чуть тормозя, а в эмуляторе - не
только ВВ55, но и весь "Специалист МХ". А тут на 30 МГц только ВВ55 не
тянет, странно...
Ты не забывай, что вся трудность как раз не в эмуляции ВВ55, а в скорости выдачи данных. Напомню:
1. Цикл обращения в ВВ55. ВМ80 активирует строб примерно на 1-1,5 такта F2 (проверял осциллом, когда свой SVGA Spec делал). При условии, что у Специалиста F2=2МГц, и данные должны быть выданы до перехода 0=>1 на F2, то времени у нас от 500нс до 250нс. Не густо, если учесть что у AVR 1MIPS и он работает на 16МГц, то получается примерно 62,5нс на команду. Стало быть, в 250нс уместится всего 4 команды (в 500 8 соответственно, но мы учитываем наитяжелейший случай). А теперь вспомним время реакции на прерывание - кто-то тут говорил 4 такта (те самые 4 инструкции, не?). Выход: аппаратный слэйв порт (как у 8042) или более быстрый камень (ATXMega, например, или Cortex STM32, но тут вообще комбайн намутить можно).
2. Как происходит опрос ВВ55, в частности клавы? Выставляем 0 на матрицу и сразу же читаем ее. Итог: последовательность STA/LDA. Между фактическими обращениями всего 4 такта, правильно (цикл M1 от LDA). Так сколько времени на апдейт данных? Вывод: нужно заранее хранить все возможные данные от матрицы, чтобы тупо выдавать их по таблице лукапа. А это 2^12 ячеек на 6 бит (первый режим опроса) или 2^6 ячеек на 12 бит (второй вариант опроса), мы же все еще про спец говорим, правильно? Справедливо заметить, что клавиатура Ориона и РК в этом отношении максимально выгодна: всего 256 ячеек на каждый вариант.
Это 2 критических узла эмулятора клавиатуры на ВВ55. Все остальное время можно кушать данные с PS2, парсить их, строить таблички и т.д. и т.п.

PS Как жуткий вариант, можно использовать CS как запрос на прерывание, а потом тупо следить за битами RD/WR в однокомандном цикле (фактически 2 команды, т.к. 2 бита). Может проканать.
User avatar
Lavr
Supreme God
Posts: 16699
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

2_HardWareMan

А может поступить как с дисководом в "Спеце"? При обращении к ВВ55 - вешаем
процессор программно по HOLD, готовим ему данные клавы, подставляем и
программно отпускаем HOLD. Это не затормозит всё шибко, но и "вешаться" по
скорости не придётся. HOLD - программно от PIC, чтоб не вешаться аппаратно насмерть
при различных сбоях.

PS. Или аппаратно всёж - раз ты говоришь реакции не хватает, но не триггером,
а одновибратором через ИЛИ. Одновибратор - задержал по HOLD процессор,
если мы получаем прерывание - подтверждаем HOLD уже программно через вывод
PIC. Если мы через PIC не удержим, то одновибратор отпустит HOLD.
А можно притормозить по READY - он на то и сделан, а окончательно уцепить
за HOLD.
User avatar
shoorick
Doomed
Posts: 487
Joined: 05 Nov 2007 05:08
Location: Украина

Post by shoorick »

может, замутить клаву спецу на.... 72/4= на 18 561КТ3? а чё? двунаправленные ключи :) не уверен, но думаю, что наскребу :)
User avatar
Lavr
Supreme God
Posts: 16699
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Galaksija на К580ВМ80?

Post by Lavr »

Lavr wrote:задумка есть вот какая:
По кадровому импульсу К580ВМ80 получает видео-INT. Заканчивает текущую
инструкцию и переходит к обработке прерывания. По характерным сигналам
схема на триггере вырабатывает сигнал WAIT и этим тормозит процессор.
Процессор молотит такты ожидания, выдерживая гашение по кадру.
Начало строки развёртки перебрасывает триггер, отпускает процессор
в работу и вот тут-то он...

выполняет по прерыванию команду JMP 9000H (или в видео-ОЗУ на начало).
На время действия прямого кадрового хода отдельным сигналом надо переключить
схему так, чтобы процессор при обращению к области видео-ОЗУ считывал
инструкцию NOP. То есть - он выдал адрес 9000Н и дал строб чтения RD, но
данные пошли не к процессору, а на регистр видео-сдвига.

По NOP К580ВМ80 ничего не делает и далее выставит адрес 9001Н . Возможно
надо точно тайминги посмотреть и для синхронности тормозить проц через
WAIT.
После того как проц во время действия прямого кадрового хода переберёт
весь видео-буфер, читая псевдо-NOP, сигнал начала обратного хода
развёртки по кадру снова разрешит процу обращаться к памяти как обычно.

Вроде как всё правильно. Параметры экрана, конечно, надо подсчитать.
Организация получится: 9000Н, 9001Н, 9002Н ... - в первой строке, и т.д.
Г-н petrenko напомнил мне о моей ностальгии по Galaksija на К580ВМ80, и я
устыдился, и решил просчитать растр хотя бы ориентировочно...

Ориентируемся, что команду NOP процессор К580ВМ80 выполняет за 4 такта.
Учтём параметры полного телевизионного сигнала системы SECAM:
Image

• Номинальная длительность строки Н = 64 мкс;
• Длительность гасящего импульса строк а = 12 мкс;
- (Откуда видимая часть строки = 48 мкс )

Рассмотрим для набор тактовых частот: 48 мкс / (4 такта * 1/F мкс)
F=2.0МГц 4 такта по 500нс = 2000нс = 2.000мкс - 24 символа в строке Кварц- 8 МГц
F=2.5МГц 4 такта по 400нс = 1600нс = 1.600мкс - 30 символов в строке Кварц- 10 МГц
F=2.7МГц 4 такта по 370нс = 1481нс = 1.481мкс ~ 32 символа в строке Кварц- 10.8 МГц
F=3.0МГц 4 такта по 333нс = 1332нс = 1.333мкс ~ 36 символов в строке Кварц- 12 МГц
F=3.5МГц 4 такта по 286нс = 1143нс = 1.143мкс ~ 42 символа в строке Кварц- 14 МГц
F=4.0МГц 4 такта по 250нс = 1000нс = 1.000мкс - 48 символов в строке Кварц- 16 МГц


Что мы имеем: экстремальные режимы (F=3.5МГц, F=4.0МГц) не всякий К580ВМ80
осилит, поэтому F=2.7МГц и 32 символа в строке - вполне удобный выбор.
(Напомню, у оригинальной Galaksija - видеорежим: только текстовый, 32 х 16 символов,
матрица 8 х 13 точек)

По стандарту развёрток как в "Специалисте", видимых строк у нас было 256,
а гасящий составлял: 3584 мкс / 64 мкс = 56 строк при полном числе строк растра - 312.

Если взять матрицу поскромнее, чем у Galaksija - 8 х 10 точек, получим 32 х 25 символов
на экране.
По стандарту Galaksija (32 х 16 символов) можем взять матрицу 8 х 16 точек! :o
Ну и промежуточные варианты есть...

Но надо помнить, что в случае такого схемотехнически нищебродского компьютера,
процессор выполняет полезную работу только во время обратного хода по кадру! :o
Поэтому имеет смысл число видимых строк в растре и подсократить...

У Galaksija их видимых - всего 208.

Вот такие предварительные ориентировочные расчеты... :wink:
iLavr
User avatar
Shaos
Admin
Posts: 24096
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

А мне чего-то кажется, что количество микросхем логики для отработки этих фейковых нопов будет соизмеримо с количеством микросхем для честной работы с видеопамятью мимо процессора, нет? Вот если бы проц заставить самому выталкивать 8-пиксельные кусочки в обработчике строковых прерываний - например так:

Code: Select all

LXI H, video-mem ; address of current line
LXI D, video-out ; address instead of port
; 19 ticks to send byte
MOV A,M ; 7
STAX D ; 7
INX H ; 5
; 19 ticks to send another byte
MOV A,M ; 7
STAX D ; 7
INX H ; 5
.... ; etc
С маппингом портов в адресное пространство вроде получается на 3 такта быстрее, чем с реальными портами. Выходит, что один проц, работающий на 2.5 МГц, успевает только 6.3 байта заслать в видимой части строки (это только 50 пикселов). А если поставить 4 процессора, у которых обработчики строковых прерываний будут разнесены по времени на 5 тактов друг от друга? Т.е. в первом процессоре обработчик прерывания сразу начинает молотить байтами, во втором в обработчике стоит одна команда MOV A,A (задержка на 5 тактов), в третьем - две (10 тактов), а в четвёртом - три таких команды (15 тактов). Каждый проц будет иметь в своей видеопамяти каждый четвёртый байт видео со смещением. Единственная проблема в том, что у нас 19 тактов шаг, а не 20 - возможно придётся тормозить процы ради вывода оставшихся пикселов (либо ставить 8085-е у которых INX H занимает 6 тактов, а не 5 как у 8080). И нам надо 8 бит сдвигать побитно на экран каждые 5 тактов - тогда получится 24*8=192 пиксела в строке...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16699
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

> А мне чего-то кажется, что количество микросхем логики для отработки этих фейковых нопов будет соизмеримо с количеством микросхем для честной работы с видеопамятью мимо процессора, нет?

Мне так не кажется - я даже это примерно представляю. Но, конечно, надо бы прорисовать схемотехнику...
Тем не менее, я вижу - это проще, чем счётчики и мультиплексоры...

Другой вариант - это заюзать второй 580ВМ80, как длинный счётчик... :wink:
Ну надо разочек это попробовать! Все говорят, а никто не пробовал! :roll:

580ВМ80 на типичных частотах - не лучший вариант делать выдачу в порты... :(
Ну разве что трюки с PUSH, как чистят экран в "Специалисте" - но выдача неравномерна.
Z80 в этой роли куда лучше, И ТО В НЁМ НЕ БЕРУТ БАЙТ В [А]!!!
iLavr
b2m
Devil
Posts: 907
Joined: 26 May 2003 06:57

Post by b2m »

Ещё вариант: можно сделать, чтобы чтение из видео-памяти автоматически записывало данные в сдвиговый регистр. Тогда достаточно MOV A,M / INX H (12 тактов) При 2.5Мгц получим ровно 10 символов :)
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
b2m
Devil
Posts: 907
Joined: 26 May 2003 06:57

Post by b2m »

Lavr wrote:Мне так не кажется - я даже это примерно представляю.
Можно использовать не только NOP. Есть куча команд, которые выполняются за 4 такта, арифметика, например. Т.е. достаточно зафиксировать D7=1 D6=0 D0=1 на шине данных процессора. Вот только, как элегантнее решить это для двунаправленной шины - вопрос.
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
b2m
Devil
Posts: 907
Joined: 26 May 2003 06:57

Post by b2m »

Например, если для шины данных используется двунаправленный буфер (а без него никак не "отрезать" данные из ОЗУ), то её можно подтянуть к еденице, а для D6 использовать логический элемент с ОК, на вход которого подать сигнал чтения и управления этим режимом.
Last edited by b2m on 06 Sep 2012 23:44, edited 1 time in total.
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
User avatar
Lavr
Supreme God
Posts: 16699
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

b2m wrote:Можно использовать не только NOP. Есть куча команд, которые выполняются за 4 такта, арифметика, например. Т.е. достаточно зафиксировать D7=0 D6=1 D0=1 на шине данных процессора. Вот только, как элегантнее решить это для двунаправленной шины - вопрос.
NOP - самый элегантный схемотехнически - это притянуть все данные резисторами
к шине "0".
Резисторами - чтобы STATUS-у не мешать на шине данных.

Другие варианты - сложнее схемотехнически.

NOP - делает всё автоматически. КОП - считывается на шину данных. Регистр сдвига -
хапнул его.
Но мы обманули проц - подсунули NOP - значит инкремент адреса, и процесс повторяется.

Чем-то напоминает принцип работы контроллера ПДП...
Last edited by Lavr on 06 Sep 2012 23:49, edited 2 times in total.
iLavr
b2m
Devil
Posts: 907
Joined: 26 May 2003 06:57

Post by b2m »

Lavr wrote:притянуть все данные реисторами к шине "0".
Ну или так :)
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
User avatar
Lavr
Supreme God
Posts: 16699
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

b2m wrote:
Lavr wrote:притянуть все данные реисторами к шине "0".
Ну или так :)
Согласись - что другие команды аппаратно "подсунуть" труднее...
iLavr
b2m
Devil
Posts: 907
Joined: 26 May 2003 06:57

Post by b2m »

Хотя, мне больше нравится притягивание шины к еденице. Тогда нет проблем с генерацией кода команды для прерывания RST 7. Или ты как-то иначе хотел прерывание делать? :)
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
User avatar
Lavr
Supreme God
Posts: 16699
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

b2m wrote:Хотя, мне больше нравится притягивание шины к еденице.
Ты немного не понял идею. К "0" всё будет притянуто не всегда, а через вентиль -
все резисторы за нижний конец - (NOP).
А в другом случае этот же вентиль - тянет все резисторы к "1" - RST7 !!! :lol:
Элегантная схемотехника? :wink:
iLavr
User avatar
Shaos
Admin
Posts: 24096
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

b2m wrote:Ещё вариант: можно сделать, чтобы чтение из видео-памяти автоматически записывало данные в сдвиговый регистр. Тогда достаточно MOV A,M / INX H (12 тактов) При 2.5Мгц получим ровно 10 символов :)
Действительно - так не на много сложнее будет ;)
10 символов шириной 6 пикселов сгенерирует один процессор, а ещё 10 - второй процессор, т.е. всего 20 - с этим уже можно жить :)
Можно поддержать как текстовый режим, так и графический (но из каждого байта будет использоваться только старшие 6 битов для отображение шести точек на знакоместо или 120 пикселов по горизонтали)
А количество строк можно сделать настраиваемым (программно ведь генерим : )
Я могу попробовать построить такое на макетке в качестве разминки перед созданием nedoPC-580, причём можно сделать так, чтобы на этом двухголовом монстрике мог запускаться тот же многозадачный софт...

P.S. Вот кстати мои экспериментально подтверждённые растактовки видеосигналов NTSC и PAL для 10-мегагерцового пиксельклока:
viewtopic.php?t=8388&start=40 (для 2.5-мегагерцового монстрика надо всё делить на 4)
Я начну с NTSC - будет 20x25 текстовый режим и 120x200 графический - причём по вертикали можно будет уменьшать...

P.P.S. Продолжение в топике nedoPC-280
Last edited by Shaos on 07 Sep 2012 21:54, edited 1 time in total.
Я тут за главного - если что шлите мыло на me собака shaos точка net