На форуме уже пролетала мысль заюзать быстрый PIC и эмулировать КР580ВВ55 в целом. Это, конечно, самое красивое решение. Однако, скорость чипа должна быть большой, чтобы на лету брать и отдавать данные. В итоге, пока ни к чему не пришли. Я предлагаю более дешевый (но одновременно и более громоздкий) подход. Допустим, нам незачем эмулировать ВВ55, тем более, эта самая ВВ55 уже стоит в системе. Нам достаточно правильно выставлять сигналы на ее портах. А с этим справится даже АТ89С51. Но, есть засада. Как узнать, какой порт в какую сторону смотрит? Ведь выяснилось, что у Специалиста софт крутит портом как хочет. Значит, надо хранить состояние направления! Но как его получить? Вот тут и есть засада.
На самом деле, все слово состояния нам смотреть и не надо. Порт управления содержит следующие биты:
Code: Select all
Бит Описание
D0 Порт C (0-3): 1 вход, 0 выход
D1 Порт В: 1 вход, 0 выход
D2 Режим: 0 MODE0, 1 MODE1
D3 Порт C (4-7): 1 вход, 0 выход
D4 Порт А: 1 вход, 0 выход
D5 Режим: 0 MODE0, 1 MODE1 (при D6=0)
D6 Режим: 0 MODE0/MODE1, 1 MODE2
D7 =1
Бит Описание
D0 Значение бита порта С
D1 \
D2 Адрес бита порта С
D3 /
D4 X
D5 X
D6 X
D7 =0

Полярность сигнала сброса совпадает у ВВ55 и АТ89С51, это хорошо. Так же, после сброса ВВ55 находится на входе, поэтому регистр (выполнен в виде 4х D-триггеров) устанавливается в 1. Ну а дальше, мы просто отслеживаем ситуацию, когда A0=A1=D7=1 и CS=WR=0. Сигнал WR одинаков у ВМ80 и Z80 - он стробирует во время устойчивых данных, поэтому хоть триггер и записывает при 0->1 на тактовом входе, данные все равно будут записаны (по спаду сигнала WR). Получается, 4 корпуса мелкосхем, 1 контроллер и ВВ55, которая может быть уже впаяна. Естественно, прямо все порты соединять не обязательно, только те, что используются в матрице. Саму мелкосхему так же можно запихать в какую-нибудь CPLD, но в данный момент важно чтобы было дешево и доступно.
Дополнительно, есть еще такая мысль. В нормальных условиях комп никогда не устанавливает все порты на выдачу, иначе катастрофа. А мы можем сделать так. И тогда, контроллер может отслеживать эту ситуацию как исключение и брать данные с портов. Например, для смены раскладки, зажигания лампочек или еще чего. Например, если все порты на выдачу, и при этом мы передаем данные через порт А, а через порт С стробируем (т.к. этот порт позволяет побитное управление).
Обсуждаем.