Попробуем запустить ZX Spectrum в плате Марсоход2...
В начале восьмидесятых годов британская компания Sinclair Research Ltd выпустила домашний компьютер ZX Spectrum 48, главным достоинством которого, как и предыдущих моделей в лице Sinclair ZX80 и Sinclair ZX81 стала невысокая стоимость. Благодаря дешевизне, а также обилию разнообразных систем-клонов, ZX Spectrum обрёл огромную популярность, а на территории бывшего Советского Союза компьютер и вовсе получил культовый статус. Интерес к "Спекки" начал спадать во второй половине девяностых годов, когда пользователи начали массово переходить на более продвинутые персональные компьютеры, однако многие из тех, кто застал период расцвета ZX Spectrum, до сих пор помнят загрузку "полосами" картинки-заставки игр с аудиокассет. Именно игр – хотя ZX Spectrum и не был мощной платформой, а его возможности в плане вывода графики были сильно ограничены, для компьютера было выпущено немало видеоигр, некоторые из которых могли приковать к монитору на долгие часы.
Вот так выглядел оригинальный ZX Spectrum снаружи...
...и внутри
В основе ZX Spectrum лежал процессор Zilog Z80 с частотой 3.5 МГц. Впоследствии появлялись модификации компьютера, оснащённые специальной кнопкой, разгонявшей CPU до 7 и даже до 14 МГц. Также оригинальная версия ZX Spectrum могла иметь 16 или 48 Кбайт оперативной памяти, однако позже была выпущена модель с 128 Кбайт памяти. Интересно, что разрядность адресной шины не позволяла Спекки работать напрямую с таким объёмом ОЗУ, и в архитектуре компьютера появились "костыли" в виде страничной адресации.
Кстати говоря, название "Spectrum" выбрано не случайно – это должно было подчеркнуть возможность вывода цветного изображения. В палитру входило 8 цветов: синий, красный, фиолетовый, зелёный, голубой, жёлтый, белый и чёрный. Каждый цвет мог иметь один из двух уровней яркости (на чёрный это не распространялось), таким образом, всего ZX Spectrum мог воспроизводить до 15 различных цветов и оттенков. В ОЗУ компьютера целых 6912 байт памяти было выделено для видеоданных. Из них 6144 байта предназначались для отрисовки картинки с разрешением 256 х 192 пикселя (плюс "бордюр", который, правда, памяти не занимал), а ещё 768 байт определяли атрибуты "знакоместа" размером 8 на 8 точек – это были цвета "фона" и "рисунка", яркость и мигание. В ПЗУ ZX Spectrum был вшит интерпретатор языка BASIC (точнее говоря, Sinclair BASIC), а также простейшие реализации интерфейсов вывода текста, арифметических вычислений, клавиатуры, магнитофона, принтера и прочей периферии.
Палитра ZX Spectrum насчитывает всего 15 цветов
Во времена расцвета популярности ZX Spectrum существовало несчётное множество его "клонов" – компьютеров, к оригинальному детищу Sinclair Research Ltd отношения не имеющих, но использующих аналогичную по функциональности элементную базу и, соответственно, программное обеспечение. Некоторые из клонов собирались радиолюбителями из доступных деталей, что приводило к разнообразным упрощениям, другие, напротив, подвергались всякого рода модернизациям, позволявшими расширить возможности работы с памятью или графикой.
Кто сказал, что ZX Spectrum не пригоден для развлечений?
В новом тысячелетии "Спектрум" возродился в разнообразных программных эмуляторах, в последние годы добравшихся до планшетов и смартфонов. Но особняком среди эмуляторов остаются реализации ZX Spectrum на ПЛИС, которых, надо заметить, в природе тоже существует немало. Почему бы не создать свою версию знаменитого компьютера и для платы Марсоход2?
За основу проекта я решил взять оригинальный обучающий материал за авторством Ewgeny7, который простым языком объясняет разнообразные аспекты языка VHDL на примере непосредственно создания ZX Spectrum. Данная реализация отличается простотой и опирается на ядро T80 (воплощение Z80 на языке VHDL), но предполагает использование микросхемы SRAM в качестве ОЗУ. На плате Марсоход2 установлена памяти типа SDRAM, что несколько осложняет задачу портирования, и именно решению этих трудностей будет посвящена вторая часть настоящей статьи.
Из предыдущего материала, который повествует об основных особенностях архитектурного устройства памяти SDRAM, мы знаем, что для этого типа ОЗУ характерны разнообразные задержки, а чтение или запись данных обычно представляет собой целую последовательность действий, которую выполняет специальный контроллер. С задержками я решил бороться путём увеличения тактовой частоты, подаваемой на микросхему памяти, относительно частоты самого "Спектрума": если последний довольствуется 14 МГц (и это "пиксельклок", используемый для вывода видеоданных, для самого процессора частота в итоге понижается до 3.5 МГц), то память работает на 70 МГц. Это позволяет надеяться, что за время между моментом, когда процессор запросит данные из ОЗУ, и моментом, когда он попытается считать эти данные со своей входной шины, контроллер успеет произвести все необходимые операции и извлечь нужную порцию информации из микросхемы SDRAM.
После необходимой "подмены", компиляции проекта и прошивки его в плату, Марсоход2 порадовал не серым экраном с лаконичной подписью компании-разработчика ZX Spectrum, а безобразной кашицей из цветов всей небогатой палитры этого компьютера. Анализ проблемы показал, что расчёты, выполненные в предыдущем абзаце, не совсем точны: если процессор действительно не замечает задержек, то видеоданные не успевают считываться из памяти даже на высокой частоте. Это связано с тем, что на чтение видеоданых выделяется крайне небольшое по продолжительности "окно", во время которого процессор бездействует и как бы отключается от общей шины памяти. Таким образом, попытки нарастить частоту памяти нужного эффекта не дали, а значит к решению проблемы нужно подходить с другой стороны.
Для начала отвлечёмся и посмотрим, как устроена память ZX Spectrum. Все данные существуют в едином адресном пространстве. Первую его часть – 16384 байта (0000h-4000h) – занимает ПЗУ, следом располагаются 6912 байт памяти видеоданных (4001h-5B00h), а оставшийся диапазон адресов уже используется непосредственно для ОЗУ.
После инициализации ПЗУ в ПЛИС на плате Марсоход2 остаётся ещё достаточно свободной памяти, которую я решил использовать в для размещения видеоданных. Для этого при помощи MegaWizard Plug-In Manager был создан модуль двухпортового ОЗУ на 8192 байта – этого более чем достаточно для размещения всех видеоданных. Основной модуль проекта пришлось расширить новыми выводами, которые будут интерфейсом взаимодействия между "Спектрумом" и видеопамятью. В целом, верхний модуль проекта выглядит так (кликнуть по изображению, чтобы увеличить):
Для управления новыми выводами потребовалось добавить немного логики. Так, данные на выходе video_wr_data будут браться с выходной шины процессора только тогда, когда процессор запрашивает запись по адресу из диапазона 4001h-5B00h. При этих же условиях будет активироваться сигнал video_wr_en, разрешающий запись данных в память, и, соответственно, video_wr_adr, отвечающий за передачу адреса данных видеопамяти, будет принимать значение младших 13 бит адресной шины процессора, если она обращается всё к тому же диапазону. Когда потребуется вывести видеоданные на экран, будет активирован сигнал video_rd_en, разрешающий чтение из памяти. Разумеется, сами данные будут браться с входа video_rd_data.
Очередная попытка скомпилировать проект и прошить его в плату, и мы можем наблюдать на экране такую картину:
ZX Spectrum в плате Марсоход2 загрузился и ожидает ввода команд!
Исходные данные этого проекта можно загрузить по ссылке:
Кстати говоря, проект обладает потенциалом для дальнейших улучшений: можно попробовать заменить ПЗУ на прошивку от более продвинутой модели "Спектрума" (требуется соответствующий образ с расширением .hex или .mif), что позволит, например, работать с большим объёмом оперативной памяти; добавить вывод звука и возможность загрузки программ с внешних устройств.
На этом статья подходит к концу. Если материал будет интересен, то я постараюсь вернуться к теме в ближайшее время и реализовать какие-нибудь улучшения для "Спектрума". Как всегда, вопросы, отзывы и пожаления можно оставить в комментариях.
Подробнее...