3 / 3 395
Версия для печати
Компьютер SpeccyBob
Автор сей весьма интересной разработки - Mike Wynne.
Сайт разработчика - http://www.chuntey.com/speccybob/ (там же схемы плат и их описание на английском).
Кое-что дополнительно можно найти здесь.
Этот компьютер представляет собой немалый интерес как минимум по двум причинам:
- память компьютера состоит из ОЗУ статического типа (SRAM). Это необычно для Спектрумов, где в основном применяются динамические ОЗУ. В данном случае не стоит проблема регенерации памяти;
- компьютер собран исключительно на микросхемах мелкой логики без применения специфической комплектации (ну разве что за исключением микросхемы ПЗУ, которую надо как-нибудь "прошить"). Никаких ПЛИС, ПЛМ и прочей ерунды :)
Авторский вариант под названием SpeccyBob Lite состоит из трёх отдельных плат - тактового генератора, видеоконтроллера и процессорной платы. Автором заявлена 99% совместимость с фирменным ZX-Spectrum. Последняя версия схемы компьютера - 1.3, датирована 2001 годом. Насколько я понимаю больше никаких работ по "доводке" схемы не делалось.
Этот клон ZX-Spectrum меня очень заинтересовал, и я решил его повторить. Всё как обычно - макетка, провод мгтф, все микросхемы установлены на панельки. Собирал по возможности придерживаясь оригинальной схемы, только не на трёх отдельных платах, а на одной. Отличия начались, когда внезапно оказалось, что среди наших микросхем нет прямых аналогов 74HC76 и 74HC4040. Однако 74HC76 в данной схеме отлично заменилась на КР1533ТВ6, только с другой нумерацией выводов. Что же касается 74HC4040, то вместо неё подошли два счётчика КР1533ИЕ19 в каскадном включении. С ОЗУ я тоже не ожидал проблем - у меня было достаточно микросхем объёмом вплоть до 64Кx8, вытянутых по случаю из древних материнских плат:
Микросхемы SRAM из старых материнских плат
Микросхемы SRAM из старых материнских плат
Итак, плата спаяна, монтаж проверен, первое включение с установленным тестом ОЗУ 48К. И первый облом: изображение на экране при выводе полос на бордюре дико искажено:
Первой мыслью было - "ошибка монтажа". Перепроверил несколько раз все соединения по схеме. Ничего подозрительного. Всё спаяно как надо. Вторая мысль - "я перенес оригинальную схему в свой вариант с ошибками". Снова сажусь за перепроверку. И снова убеждаюсь, что вроде бы всё в порядке, всё как надо. Перепроверил все микросхемы. В принципе вся комплектация новая, из магазина, брака быть по идее не должно. Ещё раз перепроверил все микросхемы. Всё оказалось целое, не паленое. Загадка, одним словом.
Больше никаких идей не было по поводу "почему это не работает", поэтому обратился на форум zx.pk.ru, там люди умные, наверняка должны помочь. И таки помогли. Дали хорошую идею, что в этом компе нет привязки к "уровню чёрного". Меня, правда, смутило, что даже такой всеядный монитор, как МС6105, не захотел нормально показывать без этой привязки. В других клонах Спектрума (Ленинград-1, Квант), где тоже нет такой привязки, монитор МС6105 отлично показывал картинку без каких-либо искажений. Как именно сделать таковую привязку именно в этой модели компьютера я совсем не знал. Однако помог "метод изуверского тыка" :)
Взял за основу аналогичную доработку для компьютера "Ленинград-1" и стал её "тыкать" на различные выходы счётчиков-делителей. Удалось найти комбинацию сигналов для доработки, при которой искажение изображения исчезало. Первая победа :)
Держать постоянно на рабочем месте монитор мне было неудобно, поэтому решил подключить компьютер к PAL-кодеру. И снова очередная "засада" - PAL-кодер "не понимает" видеосигнал, подаваемый с компьютера. В принципе я и не ожидал, что компьютер будет выдавать видеосигнал по всем стандартам, поэтому не сильно удивился. Но интерес взял верх, и пришлось засесть за осциллограф. Для начала проверил длительность строчного синхроимпульса. Она оказалась порядка 9 мкс. Вспомнил, что в Ленинграде-1 был такой же косяк со строчной синхронизацией. Для PAL-кодера требуется длительность синхроимпульса где-то около 4 мкс. Надо уменьшать с 9 до 4 мкс. Как? Очевидный выход - поставить одновибратор, генерирующий импульс нужной длительности. Однако этот вариант мне не понравился. Конечно же эксперимента ради я на "проводах" повесил одновибратор, и с укороченным строчным синхроимпульсом PAL-кодер начал давать более-менее приличную картинку.
Для дальнейших изысканий пришлось составить потактовую диаграмму работы счётчиков для формирования одного кадра. После этого стало более-менее понятно каким образом формируются сигналы синхронизации и как именно можно сократить длительность ССИ, не прибегая к пайке конденсаторов на плату. Также немного помог "метод тыка". В итоге получился строчный синхроимпульс длиной около 4 мкс, который вполне удовлетворил мой PAL-кодер и ТВ-тюнер.
Следующая беда - нестабильная синхронизация по кадрам. На ТВ-тюнере изображение медленно "плывёт" вверх, и никакими настройками не удаётся его удержать на месте. Подозрение падает на кадровый синхроимпульс. Решил посмотреть какой кадровый синхроимпульс у "образцового" компьютера. Для этого осциллографом "потыкал" в компьютер "Байт". Сравнил полученный результат. В SpeccyBob очень короткий кадровый синхроимпульс. Надо увеличивать длительность. Снова помогла потактовая диаграмма. В итоге родилась дикая схема, которая вполне работает (не спорю, наверняка можно было сделать проще и лучше):
Итак, PAL-кодер с ТВ-тюнером я поборол и получил нормальное изображение. Теперь можно спокойно смотреть результаты работы тестового ПЗУ. И тут очередая беда - постоянные ошибки ОЗУ, случайные адреса, случайные биты. Замена ОЗУ не помогает. Подозрение пало на тип используемого ОЗУ - я ставил быстрое ОЗУ (быстродействие порядка 10-20 нс), и к тому же эти микросхемы ОЗУ нехило потребляют (порядка 400 миливатт в активном режиме). На счастье в закромах нашлись более медленные и менее потребляющие ОЗУ.
После замены ОЗУ на более медленное все косяки с ошибками памяти исчезли. Итого: микросхемы ОЗУ кэш-памяти со старых материнских плат НЕ ПОДХОДЯТ для использования в SpeccyBob! По крайней мере ни одна микросхема из моих запасов не заработала как надо. Вероятнее всего из-за того, что они ОЧЕНЬ быстрые. Не спорю, могу ошибаться, и путём какой-нибудь незначительной доработки компа эта проблема решится. Если кто знает что надо делать - пишите мне, опробую и буду очень рад, если получу положительный результат.
Повторюсь. Вот такие, быстрые, ОЗУ не подходят для SpeccyBob:
Микросхемы SRAM из старых материнских плат
Микросхемы SRAM из старых материнских плат
А вот такие "медленные" вполне годятся:
Далее настало время подключить клавиатуру и магнитофонный вход. С клавиатурой был один нюанс: у меня плёночная клавиатура:
Плёночная клавиатура для ZX-Spectrum
Плёночная клавиатура для ZX-Spectrum
Для корректной работы пришлось подбирать сопротивление резисторов, "подтягивающих" входы битов 0-4 порта клавиатуры к +5В. При слишком большом сопротивлении резисторов (я ставил сначала 10К) некоторые кнопки клавиатуры попросту не работали. При уменьшении сопротивления резисторов до 5,1К всё стало работать как надо.
Далее настало время тестов (я грузил с ленты TEST 4.30). Тест показал очень короткий сигнал INT. В принципе схема формирования INT в компьютере вполне работоспособна:
На триггере U6a сигналы HRST и Vsync задают время начала действия сигнала INT, который длится ровно столько, пока процессор не подтвердит его обработку (сбросом в 0 сигналов IORQ и M1). По идее в этом случае длительность сигнала не должна смущать - в любом случае INT будет обработан как надо.
Однако, если требуется "красивая" длительность INT в 24 такта, схему можно немного изменить, добавив дополнительный триггер DD52.2:
По быстродействию TEST 4.30 показывает таки нехилую "тормознутость" компа:
В частности меня смущает результат "Lines on screen: 285", хотя в компьютере стоит группа счётчиков с пересчётом ровно в 312 строк. Может быть тест показывает "не те строки", я не знаю. Во всяком случае я не собираюсь этом компе смотреть демки с мультиколорами. Работает и ладно.
Во всяком случае в плане тормознутости этому компьютеру ой как далеко до "рекордсмена" по этой части - компьютеру "Инфотон-030" с его 57300 тактами за прерывание.
Ещё непонятно зачем тормозить процессор при обращении к портам:
Этот кусок схемы при работе процессора в области видео-ОЗУ (VRAM=0) или при обращении к портам (сигнал IOCS=0) включает режим "подтормаживания", если в текущий момент идёт вывод изображения на экран. В случае работы в области видео-ОЗУ всё ясно - процессор "делит" с видеоконтроллером приоритет доступа к ОЗУ. А с обращением к портам что ему делить? Видеоконтроллер к портам не имеет никакого отношения. Я вообще отключил сигнал IOCS от этой схемы, однако быстродействие никак не поменялось :(
В схеме компьютера я сделал ещё несколько мелких доработок, но они столь незначительны, что их можно не описывать (на финальной схеме, которую я начертил, итак уже всё сделано и показано). На данный момент есть один глюк, когда иногда дергается изображение (такое ощущение, что путаются две нижние трети экрана между собой). Однако я не нашёл никаких закономерностей когда это проявляется и с какой периодичностью. И тем более не знаю из-за чего это и как это устранить.
В принципе это всё, компьютер работает, игры играются :) На всякий случай скажу: не исключено, что я мог накосячить при сборке компа, из-за чего и получил кучу глюков. Ведь если верить фотографиям автора компьютера, его экземпляр (в отличие от моего) вполне нормально работал с телевизором. Во всяком случае в финале у меня получился нормально (ну почти нормально) работающий компьютер.
Фотографии платы будут чуть позже, ниже по тексту статьи, потому что ещё не всё :)
Часть вторая. Подключаем дисковод
Компьютер с памятью 48К и загрузкой с ленты меня не очень удовлетворил. Наглеть, так по-крупному. Хочу 128К и дисковод. Для начала дисковод. С этим никаких проблем не возникло. Взял обычный контроллер дисковода (у меня валялся контроллер С-48) и подключил его. Все подробности по подключению этого контроллера есть в его описании.
Из нюансов (именно для контроллера С-48):
вместо IORQ подал на контроллер дисковода смесь IORQ + инвертированный M1 (сигнал берется с 6DD47 по схеме компьютера). Без этого в цикле подтверждения IM2 контроллер "мусорит" на шине данных;
порты компьютера не блокировал при работе контроллера (хотя в описании по подключению контроллера это надо делать). Причина - порты #FE и #7FFD (для режима 128К) никак не конфликтуют с портами Beta Disc Interface;
прошил в 32К ПЗУ 27256 BASIC48+TR-DOS и для переключения половинок ПЗУ использовал сигнал ROMCS с контроллера.
Для получения +12В для КР1818ВГ93 спаял простейший преобразователь 5В->12В:
На всякий случай повторюсь - это преобразователь исключительно для питания КР1818ВГ93! Для питания дисковода он ни разу непригоден!
Часть третья. Увеличение объёма ОЗУ до 128К
Для сего действа нужно:
1) В качестве видео-ОЗУ должна быть микросхема памяти объёмом 32К (62256);
2) В качестве основного ОЗУ надо найти подходящую по объёму микросхему на 128КБ. У меня на счастье нашлась отпаянная с какого-то винчестера микросхема SRM20100LM-70, которая каким-то чудом согласилась работать без глюков в этом компе.
3) По желанию можно ставить или не ставить звуковой сопроцессор;
4) Ещё надо всяких там микросхем мелкой логики и немного попаять.
Собственно схему доработки можно посмотреть на основной схеме компа, а тут я расскажу как она работает:
На микросхеме DD56 (КР1533ИД7) собран дешифратор порта #7FFD и портов музыкального сопроцессора.
Триггер DD57 (КР1533ТМ9) - это и есть порт расширения #7FFD. Его 5-й бит вместе с элементом DD20.2 образует "защёлку", которая при установке бита в 1 блокирует запись в порт, превращая компьютер в обычный 48К вариант.
Банки памяти 128К подразделяются на два типа - быстрая память и медленная (которую делят между собой процессор и видеоконтроллер). Вся быстрая память - целых 6 банков с номерами 0,1,2,3,4 и 6 располагается в микросхеме основного ОЗУ DD45 (это та, которая 128К объёмом). К слову, в ней остаются неиспользованными целых две банки памяти, которые при желании можно приспособить для чего-нибудь полезного типа кэша, подставляемого вместо ПЗУ, к примеру. Что же касается медленной памяти, то в 128-х компах это две банки ОЗУ с номерами 5 и 7, которые располагаются в микросхеме ОЗУ DD41 (32K).
Теперь для пояснения как именно всей этой памятью рулить я буду рассказывать прописные истины. Для начала представим этакую наглядную карту памяти компьютера:
Здесь мы видим, что весь объём доступной для адресации процессором памяти составляет 64 КБ и условно разбит на 4 области, именуемые CPU0-CPU3. Каждая область равна 16КБ. Так удобнее их адресовать - по двум битам шины адреса - A14 и A15. Область памяти CPU0 всегда (ну почти всегда) занимает ПЗУ. Поэтому в схеме компа при обращении к памяти и комбинации битов A14=0 и A15=0 выбирается микросхема ПЗУ.
Идём дальше. Область памяти CPU1 делят между собой процессор и видеоконтроллер. Если нужно обратиться к этой области памяти, то в момент вывода изображения на экран (а для его вывода берутся данные именно из этой области памяти) процессор "подтормаживается" сигналом WAIT. Поэтому эта память называется "медленная". Именно эта память находится в микросхеме DD41 компьютера. Она отделена от "основной" памяти (которая располагается в микросхеме DD45).
Далее идут подряд две области памяти CPU2 и CPU3, которые целиком располагаются в микросхеме ОЗУ DD45.
В случае увеличения объёма ОЗУ мы не можем физически расширить адресуемую процессором память - всё равно больше чем 64КБ памяти он не сможет адресовать. Поэтому мы используем оконную систему - а именно в раздел памяти CPU3 мы можем подставить любой из доступных кусков ОЗУ 128К. Для удобства они называются "банками". Для ОЗУ 128К это 8 банков, условно нумеруемые от 0 до 7. Итак, в CPU3 можно поставить любой банк памяти от 0 до 7. Что же остальные разделы? Про CPU0 мы уже говорили - это ПЗУ, он нам не нужен. Для разделов CPU1 и CPU2 жёстко используются конкретные банки памяти - 5 и 2. Таков стандарт на 128К ZX-Spectrum. Итого карта памяти приобретает следующий вид:
Т.е. при обращении к адресам памяти #4000-#7FFF информация будет браться из банка 5 ОЗУ. А при обращении к адресам памяти #8000-#BFFF мы будем работать с байтами из 2-го банка ОЗУ. При этом в CPU3 мы можем в то же самое время подставить тот же банк 2 ОЗУ и при обращении к памяти #C000-#FFFF тоже работать с банком 2. Тут, надеюсь, всё ясно.
Кроме этого в 128-м спектруме существует такая "фича" как быстрое переключение экранов. Это работает следующим образом: в обычном режиме для вывода на экран берётся информация с адреса #4000 по #5AFF включительно. Эти байты расположены в CPU1, поэтому они выводятся на экран из 5-го банка ОЗУ. Но если мы возьмём и установим в 1 бит 3 порта #7FFD, то при выводе изображения на экран байты будут браться не из 5, а из 7-го банка ОЗУ! Но это касается только вывода изображения! Если при установленном 3-м бите порта #7FFD мы будем писать или читать байты из области СPU1, то они будут читаться (писаться) из банка 5! Вот как.
К чему это я всё разъясняю про эти банки 5 и 7? А вот к чему - исходя из такого принципа вывода данных на экран и банк 5 и банк 7 должны быть расположены в том ОЗУ, которое может сканироваться видеоконтроллером, т.е. DD41. Вот поэтому для расширения ОЗУ до 128К DD41 должно быть объёмом 32К, а не 16К как при обычной 48K конфигурации.
Раз уж с принципом работы 128К с большего разобрались, я дальше объясню логику работу схемы расширения памяти. Итак, мы можем управлять основной памятью ОЗУ при помощи трёх линий адреса на микросхеме DD45 - это A14, A15 и A16. С их помощью мы можем адресовать любой из 8 банков ОЗУ по 16КБ каждый. Кроме этого у нас есть видео ОЗУ DD41, в котором два банка памяти, адресуемые сигналом VA14 (1-й вывод DD41).
Дальше всё просто: для начала возьмём случай, когда мы хотим обратиться к областям памяти CPU2 и CPU3. При обращении к CPU2 мы должны включить банк 2 ОЗУ, а при обращении к CPU3 мы должны включить тот банк ОЗУ, номер которого в данный момент записан в битах 0-2 порта #7FFD. Для этого в схеме расширения используются DD32.2 и мультиплексор DD58. В случае обращения к CPU3 A14=A15=1, на выходе 6DD32.2 появляется лог.1, которая переключает мультиплексор на пропускание сигналов со входов B0-B3 на выходы Q0-Q3. К входам B0-B2 подключены биты 0-2 порта #7FFD. К выходам Q0-Q2 подключены линии A14, A15 и A16 основного ОЗУ DD45. Т.е. какой банк указан в порте #7FFD, такой и получаем в CPU3.
При обращении к памяти CPU2 (или CPU1,CPU0) на выходе 6DD32.2 будет лог.0, при этом мультиплексор DD58 переключится на приём информации со входов A0-A3, на которых жёстко установлен двоичный код 010, т.е. это номер два. Поэтому при обращении к CPU2 включится банк 2.
Идём дальше. Надо разграничить основное ОЗУ и медленное ОЗУ. Иначе при работе с банками памяти 5 и 7 мы будем обращаться к основному ОЗУ. Для этого в схему введен дешифратор DD59, который при работе в области памяти CPU3 совместно с DD61.1 и DD32.3 при обращении к банкам памяти 5 или 7 отключает выбор основного ОЗУ путём подачи лог.0 на вход дешифратора памяти DD46. А так как при этом A14=1, то дешифратор DD46 включит выбор медленного ОЗУ DD41. Далее через DD60.1 идёт выбор банка медленного ОЗУ. Банк 5 - это VA14=0, банк 7 - VA14=1.
И напоследок - включение сигнала "Смена Экрана". Это тот самый бит 3 порта #7FFD. Суть состоит в том, что по сигналу Vacc=0 на шину адреса медленного ОЗУ подаётся адрес со счётчиков, указывающий, какой байт брать для вывода на экран. Элемент DD60.2 в зависимости от значения бита 3 порта #7FFD включает либо нижнюю половинку медленного ОЗУ (это банк 5), либо верхнюю (банк 7).
Если надо включить режим 48К, то в бит 5 порта #7FFD записываем лог.1, а в биты 0-3 - нули. При этом карта памяти примет следующий вид:
Такое состояние сохранится до сброса компьютера. После сброса порт разблокируется.
Ещё: битом 4 порта #7FFD выбираются половинки ПЗУ. Для 128К компьютеров можно поставить ПЗУ объёмом 32К (27256) с записанным Меню-128 и BASIC-48. При этом бит 4=0 выбирает банк ПЗУ с Меню-128, а бит4=1 выбирает BASIC-48. В моём случае ПЗУ с меню 128 не устанавливалось, поэтому этот бит не задействован.
Данная схема расширения позволяет при незначительных изменениях осуществить увеличение объёма памяти компьютера практически до любого значения. Т.е. верхний "потолок" объёма ОЗУ зависит только от того, какую микросхему SRAM вы сможете найти.
Как-то так :)
А теперь фотки того ужоса, который в итоге у меня получился:
SpeccyBob 128К на макетке
SpeccyBob с контроллером дисковода С-48
SpeccyBob 128К на макетке
SpeccyBob с контроллером дисковода С-48
На плате не видно блокировочных конденсаторов (которые устанавливаются по цепям питания каждой микросхемы) потому что они расположены под каждой микросхемой внутри панельки.
И в самом конце - схемы и документация