4 / 106
Версия для печати
Принципы работы схем расширения ОЗУ
Придётся немного углубиться в электронику, без этого мы не сможем понять как функционирует часть схемы Спектрума, ответственная за работу с ОЗУ.
ОЗУ в почти всех клонах ZX-Spectrum сделано на микросхемах динамической памяти. Почему так? Во-первых, в те годы, когда у нас производились Спектрумы, только микросхемы динамической памяти имели необходимый объём (16К*1, 64К*1 и даже 256К*1). В то время как микросхемы статического ОЗУ были ёмкостью хорошо если 8К*8. Во-вторых, микросхемы динамического ОЗУ были доступнее и дешевле. Поэтому Спектрумы (да и вообще все остальные компьютеры) делали только на динамических ОЗУ. Однако у микросхем динамического ОЗУ есть минусы - постоянная необходимость так называемой «регенерации» ОЗУ, чтобы микросхема «не забыла» записанную в ней информацию, а также ограниченное количество выводов (обычно 16), которое не позволяет напрямую адресовать нужный байт.
Возьмём для примера, пожалуй, самую распространённую для ZX-Spectrum микросхему ОЗУ КР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 и так далее...
Чтобы организовать вывод строк таким способом, биты 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К Спектруме) память распределяется следующим образом:
Весь объём доступной для адресации процессором памяти составляет 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. Теперь распределение памяти приобретает следующий вид:
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 сделаны по одному и тому же принципу. Та часть схемы, которая «отвечает» за работу с расширенной памятью выглядит примерно так:
Мы видим, что добавились новые сигналы - А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. Статья даёт основы расширения машин с раздельными полями ОЗУ, к которым принадлежит и компьютер «Байт»
|