Spectrum-совместимые компьютеры «Байт»,«Байт-01» и прочие раритеты

4 / 106

Принципы работы схем расширения ОЗУ

Придётся немного углубиться в электронику, без этого мы не сможем понять как функционирует часть схемы Спектрума, ответственная за работу с ОЗУ.

ОЗУ в почти всех клонах ZX-Spectrum сделано на микросхемах динамической памяти. Почему так? Во-первых, в те годы, когда у нас производились Спектрумы, только микросхемы динамической памяти имели необходимый объём (16К*1, 64К*1 и даже 256К*1). В то время как микросхемы статического ОЗУ были ёмкостью хорошо если 8К*8. Во-вторых, микросхемы динамического ОЗУ были доступнее и дешевле. Поэтому Спектрумы (да и вообще все остальные компьютеры) делали только на динамических ОЗУ. Однако у микросхем динамического ОЗУ есть минусы - постоянная необходимость так называемой «регенерации» ОЗУ, чтобы микросхема «не забыла» записанную в ней информацию, а также ограниченное количество выводов (обычно 16), которое не позволяет напрямую адресовать нужный байт.

Возьмём для примера, пожалуй, самую распространённую для ZX-Spectrum микросхему ОЗУ КР565РУ5:

Микросхема КР565РУ5

Микросхема сделана в 16-выводном корпусе. В то же время её объём составляет 65536 бит. То есть для задания адреса требуется 16 выводов (65536 - это 2 в степени 16). Итого, нам надо 16 выводов только для указания адреса, а у микросхемы всего 16 выводов... Не сходится? Чтобы вместить в 16 выводов микросхемы все нужные сигналы шина адреса сделана мультиплексированной. Адрес мы задаём в два этапа - сначала одну половину в 8 бит, потом вторую половину в 8 бит.

Кстати, это является ответом на вопрос, почему ёмкость динамических ОЗУ от модели к модели увеличивается в 4 раза (КР565РУ3/6 - 16К*1, КР565РУ5 - 64К*1, КР565РУ7 - 256К*1, 441000 - 1024К*1). Почему нет динамических ОЗУ объёмом 32К? А потому, что при переходе от РУ6 к РУ5 мы к адресной шине добавляем 1 бит, но за счёт мультиплексированной шины получаем увеличение в 2 бита, то есть в 4 раза (я тут не веду речь про экзотику типа КР565РУ5Д1 или Д2, которая по сути является браком ОЗУ КР565РУ5, и в которой рабочая только одна «половинка». В качестве примера можно взять «старый» вариант компьютера «Байт»).

Итак, для записи/чтения одного бита надо в два «захода» указать адрес. Не забываем про регенерацию - с определённой периодичностью (для КР565РУ5 - не реже, чем один раз в 2 мс) надо «перебрать» (то есть перечитать) адреса в ОЗУ, иначе микросхема начнёт «забывать» записанные данные. К счастью, перебирать надо не все адреса подряд, а только одну «половинку» адреса из 8 бит (то есть не реже, чем в 2 мс надо обратиться к ОЗУ 256 раз, указывая каждый раз новый столбец в матрице ячеек памяти). Итого имеем 3 варианта обращения к микросхеме: выбор первой «половины» адреса, выбор второй «половины» адреса и циклический перебор одной из половин адреса с определённой периодичностью.

Это была теория, теперь перейдём к практике.

ZX-Spectrum с общим полем ОЗУ

Под общим полем ОЗУ подразумевается, когда всё ОЗУ выполнено в виде одного массива микросхем, например для 64КБ ОЗУ используем одну «линейку» из 8 штук КР565РУ5.

В качестве компьютера с одним полем памяти, на примере которого я хочу описать работу схемы расширения ОЗУ до 128К, будет выступать «Ленинград-1» (как наиболее простой по устройству и пониманию принципа работы).

В качестве схемы расширения в этом разделе будут выступать платы расширения ОЗУ до 128К Б-1, С-1 и BC-1. Данные платы расширения ОЗУ работают по одному и тому же принципу и незначительно различаются в плане схемотехники. Таким образом с некоторыми допущениями можно сказать, что у них одинаковая схема. Эти платы рассчитаны на подключение к компьютерам «Балтик», «Пентагон-48», «Байт» и «Ленинград-1», схемотехнику и принципы работы последнего, как я уже говорил выше, буду брать за образец.

В «Ленинград-1 48К» все варианты обращения к ОЗУ можно представить в виде таблицы:

... /RAS=1 /RAS=0
... MA0 (A0) MA1 (A1) MA2 (A2) MA3 (A3) MA4 (A4) MA5 (A5) MA6 (A6) MA7 (A7) MA0 (A8) MA1 (A9) MA2 (A10) MA3 (A11) MA4 (A12) MA5 (A13) MA6 (A14) MA7 (A15)
H1=0 A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15
H1=1 H2=0 H3 H4 H5 H6 H7 V3 V4 V5 V0 V1 V2 V6 V7 0 1 0
H2=1 H3 H4 H5 H6 H7 V3 V4 V5 V6 V7 0 1 1 0 1 0

Но ничего не понятно, но очень интересно... Однако я всё объясню, пусть и предельно упрощённо.

В компьютере есть сигнал H1. Если он равен 0, значит идёт цикл обращения процессора к ОЗУ. При этом неважно хочет ли на самом деле процессор прочитать или записать данные в ОЗУ или нет. Просто при этом значении сигнала H1 процессору можно обращаться к ОЗУ. В другое время - никак нельзя :) По сигналу /RAS=1 в ОЗУ сначала фиксируется одна «половинка» адреса, затем при смене значения сигнала (/RAS=0) фиксируется «вторая» половинка адреса.

Если же H1=1, то процессор «отдыхает», и в работу включается видеоконтроллер, который занимается постоянным сканированием содержимого определённой области ОЗУ, выводя его на экран. Тут к нам добавляется ещё один сигнал - H2, по состоянию которого (совместно с H1=1) видеоконтроллер либо выводит на экран содержимое пикселей экрана (H2=0), либо выводит содержимое атрибутов (H2=1). Заодно при работе видеоконтроллера гарантированно перебираются 256 столбцов в каждой микросхеме ОЗУ (это делается при /RAS=1), осуществляя, таким образом, регенерацию данных.

С режимом чтения/записи данных процессором всё понятно - зафиксировали адрес, прочитали или записали данные. Обратите внимание, что процессору теоретически доступен весь объём ОЗУ - все 64КБ, включая область #0000-#3FFF, которую, как известно, занимает ПЗУ. Однако обращение к этой области ОЗУ «отсекается» в схеме компьютера, и вместо ОЗУ включается микросхема ПЗУ.

А вот с режимом вывода данных на экран дело обстоит несколько сложнее.

Как известно, экран в ZX-Spectrum состоит из 192 строк по 256 точек в каждой строке. При выводе изображения на экран последовательно сканируются строки начиная с верхней части экрана, и в каждой строке последовательно сканируются слева направо столбцы. Номера строк, которые выводятся в данный момент, задаются сигналами V0-V7. То есть в режиме вывода содержимого экрана сигналы V7-V0 меняются от %00000000 (0) до %00111111 (191), то есть перебираются 192 строки. Примерно то же самое происходит со столбцами. Только их число равно 32 (32 столбца по 8 бит дают 256 точек по горизонтали). Номера столбцов задаются сигналами H3-H7.

Столбцы сканируются линейно, это видно из таблицы - номера столбцов идут последовательно от H3 до H7. Однако почему такое не происходит со строками? У них какая-то странная нумерация, а для части адресов вообще заданы значения 0 и 1...

Всё дело в организации экранной области ZX-Spectrum. Если вы помните, строки адресуются не линейно одна за одной, а сначала строка с номером 0, потом через 32 байта начинается строка с номером 7 и так далее...

Организация экранной области ZX-Spectrum (из книги «TR-DOS для пользователей и программистов»

Чтобы организовать вывод строк таким способом, биты V0-V7 «перепутаны» таким хитрым образом. Совместно с битами A15=0, A14=1, A13=0 сигналы V0-V7 образуют экранный адрес (#4000-#57FF).

Что же касается атрибутов (при сигнале H2=1), то битами A11-A15 задаётся адрес #5800, относительно которого последовательно перебираются 768 байт при помощи сигналов V3-V7 и H3-H7.

Расширение ОЗУ до 128К

Что же делать, если нам надо 128К RAM? Для начала, есть стандарт, согласно которому должна работать память 128К в ZX-Spectrum.

У нас сейчас (в 48К Спектруме) память распределяется следующим образом:

Организация 48K RAM в ZX-Spectrum

Весь объём доступной для адресации процессором памяти составляет 64 КБ и условно разбит на 4 области, именуемые CPU0-CPU3. Каждая область занимает по 16КБ. Так удобнее их адресовать - по двум битам шины адреса - A14 и A15. Область памяти CPU0 всегда (или почти всегда) занимает ПЗУ. Поэтому в схеме компьютера при обращении к памяти и комбинации битов A14=0 и A15=0 выбирается микросхема ПЗУ.

Область памяти CPU1 делят между собой процессор и видеоконтроллер. Если процессору нужно обратиться к этой области памяти, то в момент вывода изображения на экран процессор «подтормаживается» сигналом WAIT. Поэтому эта область памяти называется «медленная».

Далее идут подряд две области памяти CPU2 и CPU3.

В случае увеличения объёма ОЗУ мы не можем физически расширить адресуемую процессором память - больше чем 64КБ памяти он не сможет адресовать. Поэтому используется «оконная» система - в раздел памяти CPU3 мы можем «смонтировать» любой из доступных кусков ОЗУ 128К. Для удобства они называются «банками». Для ОЗУ 128К это 8 банков по 16КБ, условно нумеруемые от 0 до 7. Итак, в CPU3 можно «смонтировать» любой банк памяти от 0 до 7. Что же остальные разделы? Про CPU0 мы уже говорили - это раздел для ПЗУ, он нам не нужен. Для разделов CPU1 и CPU2 жёстко используются конкретные банки памяти - 5 и 2. Таков стандарт на 128К ZX-Spectrum. Теперь распределение памяти приобретает следующий вид:

Организация 128K RAM в ZX-Spectrum

64КБ ОЗУ уже есть, надо добавить в Спектрум ещё столько же. Самое очевидное, что можно сделать - это взять ещё 8 микросхем КР565РУ5 и организовать их в виде ещё одной «линейки» ОЗУ, тем более что почти все выводы микросхем будут соединяться параллельно (за исключением сигнала CAS, это 15-й вывод микросхем КР565РУ5), и каком-то образом управлять двумя «линейками» ОЗУ. Просто напаиваем на уже установленные в плату микросхемы КР565РУ5 ещё один «этаж» микросхем. 15-е выводы не припаются к нижним микросхемам, а для всей верхней «линейки» ОЗУ, соединяются между собой. Это будет сигнал /CAS1. Для удобства будем называть «родные» микросхемы ОЗУ - как «линейка 0», а напаянные поверх их микросхемы ОЗУ как «линейка 1». Естественно, от линейки 0 ОЗУ мы отсоединим приходящий сигнал /CAS. В результате получаем целых три сигнала, которые надо куда-то пристроить - /CAS (тот, что приходил на 0-ю линейку ОЗУ), /CAS0 - сигнал CAS на линейку 0 ОЗУ и /CAS1 - сигнал CAS на напаянную линейку ОЗУ.

Как я уже говорил, платы расширения ОЗУ Б-1, С-1, ВС-1 сделаны по одному и тому же принципу. Та часть схемы, которая «отвечает» за работу с расширенной памятью выглядит примерно так:

Структурная схема платы расширения ОЗУ до 128К для ZX-Spectrum

Мы видим, что добавились новые сигналы - А14(1), А15(1) и С.ЭКР. Сигналами А14(1) и А15(1) мы будем заменять сигналы А14 и А15, поступающие на мультиплексоры управления ОЗУ. А сигнал С.ЭКР служит только для быстрого переключения вывода данных на экран. Изначально, когда С.ЭКР=0, вывод на экран идёт из банка 5 ОЗУ. Если С.ЭКР установить в 1, то вывод на экран осуществляется с банка 7 ОЗУ. Речь идёт только про аппаратный вывод данных из ОЗУ на экран. Сам сигнал не переключает никакие банки ОЗУ в памяти!

Порядок обращения к памяти 128К ОЗУ примет следующий вид (для удобства все изменения относительно режима 48К выделены красным цветом):

/RAS=1 /RAS=0
MA0 (A0) MA1 (A1) MA2 (A2) MA3 (A3) MA4 (A4) MA5 (A5) MA6 (A6) MA7 (A7) MA0 (A8) MA1 (A9) MA2 (A10) MA3 (A11) MA4 (A12) MA5 (A13) MA6 (A14) MA7 (A15)
H1=0 A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14(1) A15(1)
H1=1 H2=0 H3 H4 H5 H6 H7 V3 V4 V5 V0 V1 V2 V6 V7 0 1 С.ЭКР
H2=1 H3 H4 H5 H6 H7 V3 V4 V5 V6 V7 0 1 1 0 1

Пройдёмся по логике работы схемы расширения, чтобы понять почему нам нужно было менять A14,15 на адресных мультиплексорах в компьютере.

Все варианты состояния схемы расширения представлены ниже в таблице:

/CAS0
линейка 0 ОЗУ
/CAS1
линейка 1 ОЗУ
A15(1) A14(1)
CPU0
#0000-#3FFF
0 1 0 0 С адреса #0000 линейки 0 ОЗУ
(банк 0)
CPU1
#4000-#7FFF
(банк 5)
1 0 0 1 С адреса #4000 линейки 1 ОЗУ
CPU2
#8000-#BFFF
(банк 2)
0 1 1 0 С адреса #8000 линейки 0 ОЗУ
CPU3
#C000-#FFFF
бит 2 #7FFD /бит 2 #7FFD бит 1 #7FFD бит 0 #7FFD

Разберём все состояния схемы.

При обращении к областям памяти CPU0-CPU2 работает «нижняя» по схеме часть мультиплексора КП11. Соответственно при обращении к CPU3 включается «верхняя» часть микросхемы.

Скажу сразу, что банки ОЗУ распределены по линейкам ОЗУ следующим образом: банки 0-3 находятся в 0-й линейке ОЗУ, банки 4-7 находятся в 1-й (напаянной) линейке ОЗУ. Такое расположение банков памяти наиболее удобно для работы схемы расширения. И это к вопросу о том, как при работе теста ОЗУ 128К определить по номеру банка ОЗУ неисправную микросхему.

Обращение к CPU0 (как я уже писал этот вариант работы «отсекается» схемой компьютера, но всё равно имеет смысл рассмотреть и его). При этом A14(1)=A14=0, A15(1)=A15=0, и сигналом A14=0 включаем 0-ю линейку ОЗУ. При этом мы обращаемся к линейке 0 ОЗУ по адресам #0000-#3FFF, то есть попадаем в 0-й банк ОЗУ 128К.

Между прочим, из-за особенности схемы «Ленинград-1» при расширении ОЗУ до 128К при записи в область CPU0, то есть в ПЗУ, на самом деле данные пишутся в соответствующие байты банка 0 ОЗУ (именно по той причине, что раздел CPU0 соответствует 0-му банку ОЗУ), из-за чего могут не работать некоторые игры. И при расширении ОЗУ до 128К (и выше) в схему компьютера надо вносить исправление.

Обращение к CPU1. Это область памяти #4000-#7FFF. При этом A14(1)=A14=1, A15(1)=A15=0. Сигналом A14=1 включаем 1-ю линейку ОЗУ (напаянную), и за счёт сигналов A14=1 и A15=0 обращаемся к адресам #4000-#7FFF в 1-й линейке ОЗУ, то есть к банку 5 ОЗУ.

Обращение к CPU2. Это область памяти #8000-#BFFF. При этом A14(1)=A14=0, A15(1)=A15=1. Сигналом A14=0 включаем 0-ю линейку ОЗУ, и за счёт сигналов A14=0 и A15=1 обращаемся к адресам #8000-#BFFF в 0-й линейке ОЗУ, то есть к банку 2 ОЗУ.

Обращение к CPU3. Это область памяти #C000-#FFFF. В этом случае A14(1)= бит 0 порта #7FFD, A15(1)= бит 1 порта #7FDD, а бит 2 порта #7FFD определяет активную линейку ОЗУ (0-оригинальная, 1-напаянная). Соответственно именно из этого режима видно, что банки 0-3 находятся в 0-й линейке ОЗУ, а банки 4-7 находятся в 1-й линейке ОЗУ. Внутри выбранной линейки ОЗУ номер банка определяется сигналами A15(1) и A14(1). А так как при обращении к CPU3 сигналы процессора равны A14=A15=1, то выбранный банк ОЗУ «монтируется» в область памяти #C000-#FFFF.

Также на схему расширения приходит сигнал H1. Его назначение состоит только в том, чтобы выделить тот момент, когда идёт считывание данных из ОЗУ на экран. При этом принудительно включается линейка ОЗУ №1. Почему так? Потому, что банки ОЗУ 5 и 7, из которых возможен вывод на экран, находятся в этой линейке ОЗУ.

И, напоследок, о сигнале С.ЭКР (бит 3 порта #7FFD). Как я уже писал, этот сигнал всего лишь определяет с какого из двух банков ОЗУ (5 или 7) выводит информацию на экран. Теперь посмотрим как это происходит аппаратно. Если этот сигнал равен 0 (при сбросе компьютера), на адресные мультиплексоры на MA7 для старшего байта адреса при выводе на экран поступает лог.0. Мы же помним, что при выводе на экран аппаратно включается линейка №1 ОЗУ (смотрим абзацем выше). При этом вывод на экран идёт начиная с адреса #4000 в 1-й линейке ОЗУ, то есть с 5-го банка ОЗУ. Если же сигнал С.ЭКР=1, то вывод на экран идёт уже с адреса #C000 (MA6=MA7=1) в 1-й линейке ОЗУ, что соответствует банку ОЗУ под номером 7.

Написал много текста, возможно это сильно сложно для восприятия, зато понимание «как это работает» даёт возможность в перспективе самостоятельно разработать расширение памяти для какого-либо клона Спектрума.

Статьи по расширению объёма ОЗУ ZX-Spectrum
Статья Рюмика «Спектрум-128»Из журнала «Радиолюбитель» 1994 №2. Статья даёт основы расширения машин с раздельными полями ОЗУ, к которым принадлежит и компьютер «Байт»