Статья из ZX-Ревю 96/6
© Рюмик С.М. г. Чернигов, 1996
НЕСТАНДАРТНОЕ ИСПОЛЬЗОВАНИЕ РЕГИСТРА R.
Как известно, микропроцессор Z80 имеет в своем составе регистр обслуживания динамической памяти, так называемый, регистр R.
Подобного регистра не было в предшественнике Z80 — микропроцессоре I8080 (отечественный аналог КР580БМ80А). Разработчики Z80 изначально ориентировались на применение в качестве ОЗУ микросхем динамической памяти, требующих периодической регенерации (восстановления) хранимой информации.
РЕГЕНЕРАЦИЯ ПАМЯТИ В КОМПЬЮТЕРЕ "ZX-SPECTRUM"
Рассмотрим общие принципы регенерации ОЗУ через регистр R.
Содержимое 8-и разрядного регистра R, в каждом машинном цикле M1 микропроцессора Z80 выдается на шину адреса. После выполнения очередной команды, содержимое регистра R увеличивается на единицу. В схеме компьютера "ZX-SPECTRUM" задействованы 7 младших разрядов регистра R, которые аппаратно через мультиплексор подаются на адресные входы восьми микросхем динамической памяти К565РУ5.
Микросхема К565РУ5 организована матрицей запоминающих элементов — 128 строк по 512 столбцов. Одновременно информация может быть регенерирована в одной из 128 строк ОЗУ при спаде сигнала выборки строки RAS и единичном уровне сигнала выборки столбца CAS.
7 младших разрядов регистра R однозначно определяют порядковый номер строки от #00 до #7F. Итого 128 строк.
В "ZX-SPECTRUM" процесс обращения к ОЗУ синхронизирован сигналом MREQ от Z80, который подается непосредственно на входы RAS микросхем К565РУ5. Вся информация в памяти гарантированно регенерируется через каждые 128 команд программы. Согласно справочным данным, время регенерации Tref для микросхем К565РУ5 должно быть не более 2 мс, иначе информация в ОЗУ "потечет". Это условие для компьютера "ZX-SPECTRUM" выполняется без особого труда, т.к. Tref при работе обычной программы составляет величину примерно от 150 мкс (для 4-тактных команд) до 900 мкс (для 23-тактных команд).
Под словом "обычная программа" подразумевается программа, не использующая установку регистра R. Из ассемблера к регистру R можно обратиться через команды LD A,R и LD R,A.
В свое время, применение регистра R для обслуживания динамической памяти значительно упростило схему компьютера "ZX-SPECTRUM", т.к. отпала необходимость в применении специальных мультиплексоров и счетчиков регенерации.
Следует отметить, что в фирменном "ZX-SPECTRUM-48" регенерация памяти на регистре R была осуществлена только для верхних 32 кБайт памяти по адресам #8000 — #FFFF. ВидеоОЗУ и часть памяти по адресам #4000 — #7FFF, были выполнены с постоянной принудительной регенерацией от синхросчетчиков компьютера. Такой тип архитектуры компьютера называется — "с раздельными полями памяти".
Существуют модели, где вся память регенерируется через регистр R или от синхросчетчиков. Подобный тип архитектуры компьютера называется — "с общим полем памяти".
ЧАСТИЧНАЯ РЕГЕНЕРАЦИЯ ОЗУ
Использование регистра R в программах для "ZX-SPECTRUM" является экзотикой. Как правило, программисты обращаются к регистру R в двух случаях: для получения псевдослучайной величины и для организации циклической защиты от просмотра программ методом "заксоривания".
Еще один нестандартный прием программирования пришлось применить, решая практическую задачу — измерение периода регенерации Tref микросхем К565РУ5. Для этого необходимо было организовать частичную регенерацию ОЗУ, т.е. в какой-то части памяти в течение определенного отрезка времени не должны были восстанавливаться данные.
"Сердцем" программы измереня Tref является кодовый блок "активной" задержки на регистре R, который предлагается к детальному рассмотрению.
Понимание работы программы невозможно без изучения временной диаграммы (рис. 1) цикла выборки команды микропроцессора Z80 (Дж. Коффрон. Технические средства микропроцессорных систем. — М.: Мир, 1983).

Циклом выборки начинается выполнение любой команды Z80, как однобайтной, так и многобайтной.
В начале такта T1 содержимое 16-разрядного счетчика команд РС подается на адресную шину A0-A15. Через половину периода следования тактовых импульсов CLK (Z80, вывод 6) происходит активизация сигнала MREQ (Z80, вывод 19). Так как MREQ в "ZX-SPECTRUM" подан непосредственно на входы RAS линейки микросхем К565РУ5, то в этот момент происходит первая регенерация информации в строке ОЗУ с адресом, определяемым младшими 7 разрядами счетчика адреса РС.
Такт T2 — подготовительный, микропроцессор анализирует внешние сигналы.
Такт T3 и T4 цикла выборки команды специально предназначены для регенерации динамической памяти.
В начале такта T3 процессор выставляет на адресную шину адрес регенерации, где младшие 8 разрядов определяются содержимым регистра R. Старшие 8 разрядов A8-A15 остаются неизменными. По спаду сигнала MREQ происходит вторая регенерация информации в ОЗУ.
Итого, за один цикл M1 восстановление данных в памяти происходит дважды. Если младшие 7 разрядов счетчика РС и регистра R совпадают, то будет регенерирована дважды одна и та же строка ОЗУ, а если не совпадают — то однократно две разные строки ОЗУ.
В листинге 1 приведен дизассемблированный блок кодов, выполняющий функцию задержки с "активной" паузой на регистре R. В таблице 1 расписаны состояния счетчика команд РС и регистра R в процессе работы программы.
Код:
ЛИСТИНГ 1
#75F8: 06 10 LD B,#10 ; Задержка на регистре В.
#75FA: 3E 02 LD A,#02 ; Начальная установка А.
#75FC: C3 80 76 JP L1 ; Начало цикла В.
#75FF: 1B L2 DEC DE ; Уменьшение счетчика.
#7600: ED 4F LD R,A ; Установка R.
#7602: 15 DEC D ; Проверка на
#7603: 14 INC D ; достижение D=0.
#7604: 20 F9 JR NZ,L2 ; Цикл DE.
#7606: 10 78 DJNZ L1 ; Цикл В.
... ... ... ... ... ...
#7680: ED 4F L1 LD R,A ; Установка R.
#7682: 11 00 21 LD DE,#2100; Задержка на регистре DE.
#7685: C3 FF 75 JP L2 ; Начало цикла DE.

Для увеличения длительности паузы, в программе применены два вложенных цикла задержки на регистах B и DE.
Собственно "активная" пауза начинается со строки #75FF. Далее, в процессе работы программы, счетчик адреса РС поочередно принимает значения #75FF — #7607 и #7680 — #7687. При этом 7 младших разрядов A0-A6 (PC) на шине адреса в режиме "Регенерация 1" (рис. 1) будут принимать 9 дискретных значений: #7F, #00-#07.
В то же время в регистр R в строке #7680 заносится начальное число #02, и при выполнении очередной команды значение R будет увеличиваться на единицу. В таблице 1 показаны изменения младших 7 разрядов счетчика команд РС и регистра R в двух циклах DE и B при точке отсчета #7600. Обратите внимание, что по команде LD R,A регистр R меняет свое значение дважды: в самом начале увеличивает свое значение на единицу, а в конце принимает значение аккумулятора A.
В итоге 7 младших разрядов A0-A6 (R) шины адреса в режиме "Регенерация 2" будут находиться в диапазоне #02-#07.
Таким образом, в цикле "активной" паузы регенерация информации происходит не во всех 128 строках ОЗУ, а лишь в 9 строках с порядковыми номерами #7F, #00-#07. Причем часть программы по адресам #7680-#7687 будет находиться под регенерационной защитой #75FF-#7607.
Меняя значения начальной установки регистра R, а также расширяя "тело" задержки, можно увеличить количество регенерируемых строк ОЗУ по своему усмотрению. При частичной регенерации появляется возможность разместить программу в ОЗУ "кусками" под защитой регенерируемых строк.
Измерение периода регенерации микросхем памяти является частной задачей, что, однако, не ограничивает применение самой идеи в других областях, например, для определения архитектуры компьютера, для организации защиты программ, для изощренного наказания за несанкционированное копирование и т.д.