"Аюша" 6502 SBC - "Теневое" ОЗУ


Вроде бы существующих 47К ОЗУ должно быть достаточно для многих приложений, но ёмкости ОЗУ всегда будет мало. Тем более, что может возникнуть необходимость модификации основной программы во время её работы. В том случае, если у нас установлен чип оперативной памяти ёмкостью 64К, то существует возможность его использования практически полностью (исключая 1К, отданный под устройства ввода-вывода), переключая верхние 16К (адресное поле С000 - FFFF) между ОЗУ и ПЗУ. Для этого делаем показанную ниже схему (как обычно, решено "в лоб", исходя из наличия деталей).

 

 

Половинка ТМ2 у нас уже используется в тактовом генераторе, так что для переключения режимов работы можно использовать её вторую половину. При включении компьютера сигнал RESET устанавливает низкий уровень на выходе Q, вследствие чего сигнал А14А15 (вывод 8 D4.4) подаётся через вновь введённый в схему мультиплексор КП2 на вывод 7 и далее на вход выбора СЕ D14 (на схеме выше обозначен как ROM). Таким образом компьютер работает как обычно.

Стоит нам просто обратиться к чипселекту CS1 (чтение или запись любого числа) то триггер ТМ2 перебрасывается, выход Q имеет высокий уровень, переключающий КП2 таким образом, что сигнал А14А15 подаётся на выбор ОЗУ (сигнал RAM, как на основной схеме). В любой момент мы можем снова обратиться к CS1, выбрав  снова обращение к ПЗУ.

Поскольку мы переключаем последнюю страницу памяти, в которой содержатся адреса переходов векторов BRK, INT и NMI, то при составлении программы с использованием "теневого" ОЗУ следует придерживаться следующего алгоритма (красным выделено критическое положение):
 

1. После старта компьютера нужный для работы блок программы (содержащий, к примеру, процедуры ввода-вывода) переписывается в любое адресное поле ОЗУ (начиная с 0200Н до BBFFH).

2. Управление передаётся скопированному блоку.

3. Обращаемся к CS1 и переходим к "теневому" ОЗУ.

4. Записываем в ячейки FFFAH - FFFFH необходимые адреса переходов по векторам BRK, INT и NMI, которые должны обращаться к адресам в поле 0200Н - BBFFH. В принципе необязательно, чтобы адреса переходов векторов совпадали в ПЗУ и ОЗУ, но, для простоты работы, лучше сделать их одинаковыми.

5. Передаём управление основной программе или подгружаем новые блоки с внешнего носителя.

 

На главную/Index