2005/2006 flip/flop


Расположение на чипе

Обзор

У PPU есть одна интересная особенность : хитрый доступ к регистрам $2005 и $2006.

$2005 - порт для обновления scroll-регистров
$2006 - адрес для доступа к памяти PPU через регистр $2007

Особенность заключается в том, что для того, чтобы например установить 16-разрядный адрес PPU нужно сделать последовательно 2 записи в регистр $2006.

Связано это с тем, что максимальное количество адресуемых регистров через выводы микросхемы RS0-RS2 (итого 8) было недостаточно. Поэтому разработчики решили сэкономить, вместо добавления ещё одного контакта микросхемы. Вообще говоря это распространенный приём и часто встречается на любых системах.

Рассмотрим схему :

Обозначения контрольных линий:
R2 : производится чтение регистра $2002
W5/6 : производится запись в регистр $2005 ИЛИ $2006.
/DBE : вход с контакта data bus enable. /DBE = 1 запрещает любой доступ к регистрам PPU, в независимости от того, что установлено на контактах RS0-RS2 и R/W.
RC : очистить регистры (RC=1 во время сброса PPU)

Схема достаточно хитрая и flip/flop на самом деле организован в виде двух триггеров, на базе двух защелок.
На выход идут две контрольные линии : 1ST и 2ND. 1ST = 1: когда производится первая запись, 2ND = 1: когда производится вторая запись.
Эти сигналы не могут быть 0/0 или 1/1. Один из них всегда установлен, а другой сброшен.

Работа схемы происходит в несколько фаз.

Исходное состояние (RC=1 или чтение $2002).

В этой фазе производится сброс схемы в изначальное состояние. Обе защелки принимают значение 1, а на выходе 1ST=1.
При этом правая часть схемы работает как триггер.

Первая запись

Защелки принимают значение 1/0. При этом теперь левая часть схемы работает как триггер. Выход 1ST = 1.

Промежуточное состояние

Это состояние активно между первой и второй записью. Защелки принимают значения 0/0 и схема переключается таким образом, что выход 2ND = 1.
В это время опять правая часть работает как триггер.

Вторая запись


Защелки становятся в 0/1, схема готовится принять исходное состояние. На выходе 2ND = 1.

После того как сигнал W5/6 станет 0 (промежуточное состояние) - схема сбрасывается в исходное состояние (защелки = 1/1).
Сброс PPU или чтение регистра $2002 сбрасывают схему в исходное состояние, причем в любой момент.

Никогда раньше не видел такой херни.

Симуляция

static int RS_1 = 0, RS_2 = 0;
if (NOT(W56)) RS_1 = RS_2 | RC | R2;
1ST = RS_1 | RC | R2;
2ND = NOT(1ST);
if (W56) { RS_1 = 1ST; RS_2 = 2ND; }

RS_1 и RS_2 соответственно левая и правая защелки схемы.

Добавлено 27.06 "Херня" на самом деле является обыкновенным мультиплексором. Я такой херни не видел потому что раньше мультиплексоры не встречались. В данном случае мы имеем дело с двумя мультиплексорами 2 из 1. А вот логическая схема :

Спасибо HardWireMan за наводку!



Назад...