Долго думал, будет ли кому-то это интересно.
С детства (80-е) хотел иметь свой ПК. Думаю понятно, какие в те годы были компьютеры. Жили мы тогда маленьком дальневосточном городе и возможности купить или сделать компьютер самостоятельно не было. Позже, в 90-х годах, у меня появился первый «Спектрум», а потом и другое, но до тех пор я мог только изучать описание разных компьютеров из журналов. Я тогда очень здорово прокачался в теории простых восьмибитных ПК и был уверен, что смог бы сделать его сам. Только делать было не из чего.
Я вырос. Мечта спаять свой компьютер осталась. Какое-то время назад я решил, что откладывать больше нельзя.
Можно было заказать комплект и собрать какой-нибудь «Ленинград», но так мне было уже не интересно. Хотелось привести в мир очередной клон Спектрума с учетом современных возможностей.
Печатной платы не будет. Все собрать на макетной плате поводами МГТФ
Проект я реально обдумывал несколько лет. Не так, чтобы каждый день, а иногда, когда мозги занять было нечем. Но однажды я решил, что надо или начинать проект в железе, или он никогда не появится. Я заказал у китайцев первую партию деталей и приступил к сборке.
На момент начала полностью готовой схемы не было. Я просто стал собирать отдельными функциональными узлами, тестировать их и двигаться дальше после того, как они начинали работать. Минус такого варианта – в итоге места на макетной плате не хватило и пришлось прикручивать сбоку дополнительную плату.
Такой подход привел к тому, что какие-то части пришлось несколько раз перепроектировать. Много времени уходило на ожидание заказанных микросхем. Или просто не было времени на все это.
В общей сложности сборка продолжалась больше двух лет. В итоге, я решил, что надо просто остановиться. До идеала довести видеовыход так и не получилось. Там какая-то гармоника выдает статическую помеху на картинке. И есть другие несущественные артефакты Впрочем, это придает изображению некоторую ламповость.
Теперь немного подробностей. Для многих наверно это будет скучно.
В качестве загрузчика и частично видеоконтроллера используется микроконтроллер STM32F401. Прошивка ПЗУ находится в нем в его прошивке просто как статический массив байтов. При включении STM32 блокирует Z80 и загружает в ОЗУ код ПЗУ, после чего разблокирует процессор и тот начинает работать как обычно. Для доступа STM32 к ОЗУ используются расширители цифровых входов PCF8574 (3 штуки). Чтобы записать или прочитать один байт, надо записать сначала два байта адреса, а потом записать или прочитать байт данных.
Сначала я хотел сделать так, чтобы STM32 прозрачно забирала из ОЗУ данные для построения картинки и выводила их на монитор, полагая, что ее 84 МГц легко позволят это. У процессора всего-то 3.5 МГц. Хотел такую видеокарту сделать.
Реальность оказалась слишком суровой. Никаких шансов все успеть у микроконтроллера не оказалось. Потому что поток пикселей для VGA идет с частотой 25МГц. Т.е. всего около 3 тактов STM на пиксель. Пришлось оставить у STM только функцию формирования строчных и кадровых импульсов, частоту процессора и переключение режима бордюра по ходу кадра - вкл/выкл. Ну и что-то еще по мелочи.
Чтобы не было конфликта доступа к ОЗУ, в периоды, когда требуется читать видеоданные, процессор просто останавливается и видеоконтроллер, похожий на обычный спектрумовский, читает строку данных. Здесь я исходил из того, что мне ничего не мешает просто использовать более быструю версию Z80. По расчетам, если запустить его на частоте около 5МГц, то в среднем скорость будет как обычно. Это показалось проще, чем делать прозрачный доступ к ОЗУ как, например, в «Ленинграде».
Т.к. я ориентировался на формат кадра VGA, то в одном кадре получается 480 видимых строк. А у Спектрума их всего 192. Ну и вертикальное разрешение 640 против 256 – тоже значительно выше. Если тупо выводить картинку как есть, то получится махонький квадратик в центре кадра.
Поэтому я решил «умножить» пиксели на 4. Т.е. выводить по две одинаковых строки, в каждой из которых идут пары одинаковых пикселей. Тогда полезная область получается размером 512 на 384, что очень красиво вписывается в стандартный кадр, оставляя место для бордюра.
Следующей оптимизацией я подумал, что рисовать две одинаковых строки подряд будет накладно – процессор будет бесполезно простаивать слишком долго. Я решил применить черезстрочную развёртку. В одном кадре рисуются только четные строки, а нечетные заливаются черным, в следующем наоборот. И вот в таком виде я все это запустил первый раз. Радости моей не было предела. Компьютер стартанул и поприветствовал меня стандартной строкой. Т.е. в этот момент я свою детскую мечту осуществил. Дальше надо было доводить ее до ума.
Заливка второй строки черным привела к тому, что картинка получилась очень темная. Теперь я понимаю, что это логично, т.к. картинка складывается с черным кадром. Я поменял заливку на белый цвет – стало значительно приятнее для глаз. Но количество артефактов на изображении сильно напрягало.
По сути, все дальнейшее было борьбой за чистую картинку. Наверно, подробности будут не слишком интересны, скажу только, что видео-часть схемы я полностью перепроектировал и перепаял раза три наверно.
В итоге сейчас нет чересстрочной завертки. Вместо этого из ОЗУ рисуются всегда нечетные строки и параллельно эти пиксели пишутся в буфер. В следующей строке вместо заливки белым выводится строка из буфера. Для буфера нашлась замечательная микросхема D41464C, словно специально для этого придуманная – динамическое 4-х битное ОЗУ.
Очень долго не получалось сделать две градации яркости. Я так и не понял почему. Классический резистивный ЦАП по типу «Ленинграда» нормально не завелся, как я только не пытался согласовать его с монитором.
Потом мне это надоело, и я разыскал у китайцев интересную микросхемку для вывода картинки: SDA7123, которая решает эту задачу. Решает даже слишком хорошо, потому что получилось два черных цвета, а не один, как оригинале – совсем черный и почти черный.
Из другого интересного, отказ от классической синхронизации процессора привел к тому, что звук получился не совсем чистый и правильный. Но тут уж ничего не поделаешь, пришлось смириться.
Другой проблемой по той же причине стала абсолютная несовместимость с загрузкой через магнитофонный вход. Спектрум для декодирования сигнала считает количество тактов частоты синхронизации процессора и изменение этой частоты полностью убивает алгоритм чтения.
Я думал разные варианты. Одно время даже сделал SD-карту и кнопки снятия и загрузки дампа ОЗУ на карту, но этот путь в итоге мне не понравился.
Тогда я сделал кнопку, которая просто запрещает (или разрешает) захват шины видеоконтроллером и выставляет синхронизацию ровно 3,5 МГц. Это сработало программы стали загружаться (со смартфона), но на весь экран была только картинка бордюра. Без заставки.
Такое костыльное решение. Через несколько месяцев я пошел дальше и сделал динамическую частоту синхронизации процессора.
Пока картинка на экране рисуется выше или ниже полезной области кадра, процессор синхронизируется на 3,5 МГц.
Далее, когда идет вывод строки, процессор простаивает, а при выводе из буфера, процессор работает на примерно удвоенной частоте. Поэтому в среднем получается как бы стандартно.
Получился вполне рабочий вариант. Теперь загрузка происходит с картинкой заставки, как и положено. И звук стал чище. А на освободившуюся кнопку повесил режим «Турбо» - 7 Мгц постоянно.
Из других мелочей: нет записи на магнитофон – просто не стал делать, не вижу большого смысла для себя (хотя иногда думал, что не помешало бы). Корпуса нет и не планируется. Джойстик есть – перепаял из какого-то универсального USB-геймпада. Получилось как на Денди. Думаю, что это удобнее родного формата.
Из другого интересного. Разгонял свой Спектрум до 16 МГц. Работает, но смысла это не имеет без специальных программ, потому что все родное ориентировано на стандартную скорость. Однако, было интересно увидеть как заметно ускоряется рисование стандартных окружностей командами Бэйсика.
Немножко фотографий. Общий вид:
Поближе с двух сторон, прошу не падать в обморок любителей печатных плат:
Boulder Dash – моя любимая игра в те годы. Я потом даже написал свою версию для «взрослого» компьютера на, страшно сказать, FoxPro.
Batty – тоже убито много часов.
Ну и как-то так выглядит схема всего этого. Здесь нет только видео модулятора и от магнитофонного входа только транзистор. Не знаю почему он не сохранился целиком. Там простой усилитель с общим эмиттером.
Клавиатура, ее тоже нет на схеме, сделана по мотивам «Ленинграда» с небольшой доработкой. У меня более строгое декодирование внешних портов. Впрочем, все равно некоторые программы, заточенные на оригинальный Спектрум, не работают. Под конец уже стало лень документировать изменения в схеме. Но в общем она примерно такая.
Итог. Проектируя и делая все это я получил истинное удовольствие. Какой-то пользы от этого ПК нет конечно. Но мечта детства осуществилась. Мой Спектрум лежит в коробочке, и я не включал его уже месяца три. Вот только сегодня завел, чтобы сделать фотографии.
Справедливости ради, после того, как мой проект уже неплохо работал, я полез в Интернет и естественно узнал, что я не первый придумал соединить Z80 и STM32, чтобы получился Спектрум. Даже на Пикабу есть про это пост, но сейчас я не смог его найти.
Спасибо тем, кто дочитал.