МАРСОХОД

Open Source Hardware Project

Проекты Altera Quartus II для платы Марсоход2

ZX Spectrum

 

hello marsohod

Попробуем запустить ZX Spectrum в плате Марсоход2...

В начале восьмидесятых годов британская компания Sinclair Research Ltd выпустила домашний компьютер ZX Spectrum 48, главным достоинством которого, как и предыдущих моделей в лице Sinclair ZX80 и Sinclair ZX81 стала невысокая стоимость. Благодаря дешевизне, а также обилию разнообразных систем-клонов, ZX Spectrum обрёл огромную популярность, а на территории бывшего Советского Союза компьютер и вовсе получил культовый статус. Интерес к "Спекки" начал спадать во второй половине девяностых годов, когда пользователи начали массово переходить на более продвинутые персональные компьютеры, однако многие из тех, кто застал период расцвета ZX Spectrum, до сих пор помнят загрузку "полосами" картинки-заставки игр с аудиокассет. Именно игр – хотя ZX Spectrum и не был мощной платформой, а его возможности в плане вывода графики были сильно ограничены, для компьютера было выпущено немало видеоигр, некоторые из которых могли приковать к монитору на долгие часы.

ZX Spectrum original

Вот так выглядел оригинальный ZX Spectrum снаружи...

ZXspectrum mb

...и внутри

В основе 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-colors

Палитра ZX Spectrum насчитывает всего 15 цветов

Во времена расцвета популярности ZX Spectrum существовало несчётное множество его "клонов" – компьютеров, к оригинальному детищу Sinclair Research Ltd отношения не имеющих, но использующих аналогичную по функциональности элементную базу и, соответственно, программное обеспечение. Некоторые из клонов собирались радиолюбителями из доступных деталей, что приводило к разнообразным упрощениям, другие, напротив, подвергались всякого рода модернизациям, позволявшими расширить возможности работы с памятью или графикой.

zxspectrumplus2complete

Кто сказал, что 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), а оставшийся диапазон адресов уже используется непосредственно для ОЗУ.

table spectrum memory map

После инициализации ПЗУ в ПЛИС на плате Марсоход2 остаётся ещё достаточно свободной памяти, которую я решил использовать в для размещения видеоданных. Для этого при помощи MegaWizard Plug-In Manager был создан модуль двухпортового ОЗУ на 8192 байта – этого более чем достаточно для размещения всех видеоданных. Основной модуль проекта пришлось расширить новыми выводами, которые будут интерфейсом взаимодействия между "Спектрумом" и видеопамятью. В целом, верхний модуль проекта выглядит так (кликнуть по изображению, чтобы увеличить):

zx topology

Для управления новыми выводами потребовалось добавить немного логики. Так, данные на выходе video_wr_data будут браться с выходной шины процессора только тогда, когда процессор запрашивает запись по адресу из диапазона 4001h-5B00h. При этих же условиях будет активироваться сигнал video_wr_en, разрешающий запись данных в память, и, соответственно, video_wr_adr, отвечающий за передачу адреса данных видеопамяти, будет принимать значение младших 13 бит адресной шины процессора, если она обращается всё к тому же диапазону. Когда потребуется вывести видеоданные на экран, будет активирован сигнал video_rd_en, разрешающий чтение из памяти. Разумеется, сами данные будут браться с входа video_rd_data.

Очередная попытка скомпилировать проект и прошить его в плату, и мы можем наблюдать на экране такую картину:

zx spectrum first start

ZX Spectrum в плате Марсоход2 загрузился и ожидает ввода команд!

Исходные данные этого проекта можно загрузить по ссылке: icon Проект ZX Spectrum (1.65 Мбайт)

Кстати говоря, проект обладает потенциалом для дальнейших улучшений: можно попробовать заменить ПЗУ на прошивку от более продвинутой модели "Спектрума" (требуется соответствующий образ с расширением .hex или .mif), что позволит, например, работать с большим объёмом оперативной памяти; добавить вывод звука и возможность загрузки программ с внешних устройств.

На этом статья подходит к концу. Если материал будет интересен, то я постараюсь вернуться к теме в ближайшее время и реализовать какие-нибудь улучшения для "Спектрума". Как всегда, вопросы, отзывы и пожаления можно оставить в комментариях.

 

Комментарии  

0 #31 Vasiliy 23.01.2017 17:45
Здравствуйте!
Представляю на Ваш суд свою разработку – всемирно известный персональный компьютер ZX Spectrum на современной элементной базе – AVR микроконтроллер ах.
На ZX Spectrum выросли миллионы любителей компьютероной техники, программисты, радиолюбители и простые пользователи – любители компьютерных игр и попрограммирова ть на бейсике) Если Вы помните всё это, готов порадовать Вас своей разработкой, подробно здесь:
http://meandr.org/archives/21451
О разработке имеются статьи в журнале «Радио»
Тема, посвящённая AVR ZX Spectrum на форуме zx.pk.ru:
http://zx-pk.ru/threads/23671-avr-zx-spectrum-v2_0.html
Желающие могут собрать устройство самостоятельно и поиграть в старые добрые игрушки юности/детства, проект открытый
Вопросы автору (мне) в личку, или Vasil.lisitsin@yandex.ru
Есть в магазине: http://good-kits.ru/nabory-bloki-i-moduli/zx-spectrum/radiokonstruktor-avr-zx-spectrum-v2/
0 #30 Chaosorg 23.03.2016 13:19
интересная принципиальност ь у foxtail :) заметьте, версий в теме
http://marsohod.org/index.php/forum/proekty-polzovatelej/3137-zx-spectrum-128k-na-osnove-proekta-ewgeny7
несколько - если Вам так мешает AY звук и режим 128го спектрума, то возьмите более раннюю, где просто поправлены ошибки этой
0 #29 foxtail 23.03.2016 06:38
Работает прекрасно. Жаль нет бордюра тут, но на новую версию не перехожу, эта работает и ладно.

Тут есть одна проблема. Если долго не читать или не писать, память заполняется "мусором".

Решил проблему ром-хакингом

$386E:

push bc ;1
push de ;1

ld hl,($5B00) ;3
ld d, h ; 1
ld e, l ; 1
ld bc, $0100 ; 3
ldir ; 2
ld ($5B00), hl ; 3

pop de ;1
pop bc ;1

; Выполнение замещенной инструкции
ld hl,(05c78h)
jp $003D ; 3

а там где rst08,

jp $386E ; 3 3A 3B 3C ld hl,(05c78h) ; 3

оставил на ночь, ни байта не запоролось, так что все ок. Тратит, конечно, 7% от CPU, но зато стабильно хоть как-то.

А то захотелось дизассемблер написать на бейсике, а память улетает :D
0 #28 Chaosorg 08.06.2015 01:15
Доработано совместными усилиями до ZX Spectrum 128K
http://marsohod.org/index.php/forum/proekty-polzovatelej/3137-zx-spectrum-128k-na-osnove-proekta-ewgeny7
0 #27 Chaosorg 18.05.2015 17:15
Про перейти на форум - согласен. Думаю стоит дать ссылку на тему, где, как мне кажется, больше всего обсуждения именно проекта спектрума для Марсохода 2, который скачивается с этого сайта (т.е. который сейчас комментируется)
http://marsohod.org/index.php/forum/voprosy-o-plate-marsokhod/3031-zx-spectrum-regeneratsiya-videobufera-i-pomekhi
0 #26 Chaosorg 18.05.2015 09:08
Если внутрь чужого исходника не лезть, то какая разница на чем он? Мне вот кажется, что 128к режим полезнее первым внедрить иначе мало на чем удастся послушать AY.

Еще я бы попробовал вернуть видеопамять в sdram, а быструю внутреннюю оставить под ПЗУ и преобразователь TV->VGA@60Hz
0 #25 Vise 18.05.2015 09:04
Нашел AY на Verilog! Я так думаю, дальше лучше на форум перейти.
0 #24 Vise 18.05.2015 08:25
Ну файловая система это да, много мороки. А вот думаю AY и 128 К не особо большая проблема. Пошел AY на Verilog искать. Ибо VHDL для меня темный лес :)))) Хотя...
0 #23 Chaosorg 18.05.2015 07:36
Я буду пробовать добавить все это, но разобью проект на более мелкие блоки, чем этот speccy. И, неверное, сделаю шаг в сторону графического дизайна, хотя бы в части соединения блоков. Еще надо определиться какой минимальный процессор надо использовать чтобы работать с файловой системой внешних накопителей и реально ли это вообще поместить на марсоход 2?
0 #22 Vise 18.05.2015 03:00
Ну TAPE_OUT и BEEPER я тоже добавил. Насчет TAPE_IN - сапсибо! Я смотрел по схеме вроде Ленинграда, там на 5 бит магнитофонный вход идет. Видимо очепятка :) Еще бы AY, 128К и Beta disk! Вообще крутяк бы был!
0 #21 Chaosorg 17.05.2015 23:00
еще я добавил

TAPE_OUT знак_меньше_или_равно port_fe(3);
BEEPER знак_меньше_или_равно port_fe(4);

и вывел TAPE_OUT и BEEPER куда следует
0 #20 Chaosorg 17.05.2015 22:58
Vise - кажется не в тот разряд подаете сигнал магнитофона
у меня так:

cpu_di_bus знак_меньше_или _равно rom_do when (rom_sel = '1' and cpu_mreq_n = '0') else ram_rd_data (7 downto 0) when (rom_sel = '0' and cpu_mreq_n = '0') else "1" & tape_in & "1" & kb_do_bus when (port_fe_sel = '1') else "11111111";

Я данные об устройстве порта fe брал из ИНета.

tape_in я формирую иначе, чем Вы - сравниваю показания АЦП с неким порогом. Подобрал такое значение, чтобы игры в режиме turbo грузились со смартфона при максимальной громкости, а не только в медленном обычном.

tape_in знак_меньше_или _равно '1' when ADC_D > 8 else '0';

ADC_D соединено с выходами АЦП марсохода. Не забудьте еще подать, например, clock на ADC_CLK

еще я добавил

TAPE_OUT
0 #19 Vise 17.05.2015 13:34
А что надо сделать чтоб добавился вход магнитофона? Я написал:
cpu_di_bus = rom_do when (rom_sel = '1' and cpu_mreq_n = '0') else ram_rd_data (7 downto 0) when (rom_sel = '0' and cpu_mreq_n = '0') else "11" & TAPE & kb_do_bus when (port_fe_sel = '1') else "11111111";
И чего то ничего не грузится. Ну TAPE вывел на ногу плис. Как правильно?
0 #18 Chaosorg 26.03.2015 13:43
Цитирую gameuser:
Комп отжил свое.

Оппа. Ёоу. Йе...

Спектрум - детство. Детство. Оно бессмертно. Бессмертно. Просто морщится, сохнет, забывается. Но оно нам нравится, хотя ... ссыхается ...

Зеленые деревья, синее небо, пульс бытия, уф...
Запах канифоли, Светы по подъезду, Лены по курсу первому, Иры по потоку, Юноны (тоже бывает такое)...

Спектрум познаваем. Могу пощупать все с точностью - вплоть до транзистора, резистора, другой реальной фигни аппаратной.

И софт такой же...

Все заметили - экзамен про АПИ фирменные - зачем? - , даешь опенсорс, web, javascript, шейдеры

Все тоскуют по понятному - к тому и движемся...
-2 #17 gameuser 25.03.2015 13:23
Комп не плох но он не развивается у него нет даже 20 мегабайт памяти и нет 60 мегагерцового процессора чтобы сыграть в Сигму или Бомб Жак. Не развиваемый.
А все почему потому что шума в чипе много он болен ишемией.
Сгас. Погас. Это же фонера. Фонэрапланеристы.
Они не могут придумать путь по которому они выдут на более богатые чипы.
Комп отжил свое.
Текстолит это просадка от денег и левого заказа.
Касета и рессора это процессор пленка и запись это клавиатура что положите в процессор в ресору которую нажно перевернуть войлоком с кассету. И пустить. Или просто прилепить с боку от кассеты.
ЧТО?
+1 #16 Chaosorg 18.03.2015 11:31
В общем, если еще поменять контроллер SDRAM на новый с этого же сайта и соединить его ready с wait_n процессора T80s , то все работает как надо. В совокупности с добавленным входом для магнитофона и звуком позволило играть :) Через выход для наушников телефона игры в виде звука загружаются даже в турбо режиме.

Создание темы на форуме "ZX Spectrum, регенерация видеобуфера и помехи" позволило получить ряд полезных советов.

Теперь надо исправлять несколько нестандартный тайминг видеосигнала - некоторая привередливая техника (например, современный телевизор LG с VGA входом) отказывается вообще что-то показывать.
0 #15 Chaosorg 12.03.2015 19:39
Действительно оказалось полезным, что в проекте изначально нет звука и ввода/вывода с магнитофона. У меня, например, это вообще первый контакт с ПЛИС и было приятно сделать добавки самому. Но, к сожалению, выяснилось, что игры почти никакие не работают - виснут в процессе или после загрузки. Попробую создать тему на форуме этого сайта.

P.S.
Уберите, пожалуйста, мои комментарии #13 и #12 - они обрезались движком из-за символа меньше.
0 #14 Chaosorg 11.03.2015 14:18
В проекте ошибка из-за которой не меняется цвет бордюра

в строке 314 файла speccy.vhd написано:
port_fe знак_меньше= cpu_do_bus when (port_fe_sel = '1' and (cpu_wr_n'event and cpu_wr_n = '1'));

а должно быть:
port_fe знак_меньше= cpu_do_bus when (port_fe_sel = '1' and (cpu_wr_n'event and cpu_wr_n = '0'));

как в исходном проекте от Ewgeny7 и его учебной статье

ведь у Z80 активный уровень сигнала низкий
0 #13 Chaosorg 11.03.2015 14:17
port_fe
0 #12 Chaosorg 11.03.2015 14:16
В проекте ошибка из-за которой не меняется цвет бордюра

в строке 314 файла speccy.vhd написано:
port_fe
0 #11 goldfish75 28.12.2014 14:19
А почему:
1. в проекте напряжение по дефолту 3.3v а не 2.5v?
2. unused pins установлен в "as input tri-stated with weak pull-up" а не в "as inputs that are tri-stated"
3. к выходу rd_valid контроллера SDRAM прицеплен пин никуда не ведущий. Можно оставить этот выход просто оборванным?
Хочется продолжения этого проекта
Монитор показывает картинку как-то кривовато, пишет 720х576 31Кгц 50гц
Вот если бы стандартный VGA 640x480, а screen рисовать увеличенным в двое 512х384, остальное бордюр
0 #10 MyName 08.12.2014 05:17
Цитирую MyName:
Цитирую nckm:
Цитирую MyName:
А что с проектом Amber-ARM? Будет ли продолжение или забросили?

К сожалению для дальнейшего развития проекта АМБЕР уже практически не осталось логики в ПЛИС. Нужно переходить на более емкие ПЛИС...


Но почему Спектрум? Может стоит посмотреть в сторону более современных процессоров, например LatticeMico32


или даже такого: http://opencores.org/project,zet86
0 #9 MyName 08.12.2014 05:15
Цитирую nckm:
Цитирую MyName:
А что с проектом Amber-ARM? Будет ли продолжение или забросили?

К сожалению для дальнейшего развития проекта АМБЕР уже практически не осталось логики в ПЛИС. Нужно переходить на более емкие ПЛИС...


Но почему Спектрум? Может стоит посмотреть в сторону более современных процессоров, например LatticeMico32
0 #8 Alvich 07.12.2014 15:56
Тема интересная в плане различных доработок и обучалки, например прикрутить порт принтера LPT или общий программируемый порт (аналог 8055 или 8051) или дигитайзер (ввод видео!) через ПДП, да малоли что еще.

Вопрос по видеоконтроллер у: частота тактирования контроллере 70 МГц (из настройки PLL), а в настройках контроллера стоит value80 где правильно?
+2 #7 mindango 07.12.2014 15:20
В данном проекте предусмотрена работа с клавиатурой PS\2. Её следует подключать к 113 и 114 выводам ПЛИС (частота и данные соответственно).

На этапе тестирования проблем с вводом не возникало. Клавиша Scroll Lock перезагружает Спектрум.
+1 #6 nckm 07.12.2014 13:57
Цитирую alman:
Интересно конечно же.
Пожелания просты - добавьте звук и возможность загружать игрушки. Не с кассеты, конечно, а с компа. Или, на крайний случай, с аудиовыхода мобильного телефона.

Непонятно как решите вопрос с клавиатурой. Есть ли идеи на этот счёт?

а вроде бы работает PS/2 клавиатура
0 #5 nckm 07.12.2014 13:56
Цитирую MyName:
А что с проектом Amber-ARM? Будет ли продолжение или забросили?

К сожалению для дальнейшего развития проекта АМБЕР уже практически не осталось логики в ПЛИС. Нужно переходить на более емкие ПЛИС...
0 #4 MyName 07.12.2014 13:11
А что с проектом Amber-ARM? Будет ли продолжение или забросили?
0 #3 alman 06.12.2014 22:51
Интересно конечно же.
Пожелания просты - добавьте звук и возможность загружать игрушки. Не с кассеты, конечно, а с компа. Или, на крайний случай, с аудиовыхода мобильного телефона.

Непонятно как решите вопрос с клавиатурой. Есть ли идеи на этот счёт?
0 #2 nckm 06.12.2014 04:42
Цитирую Ynicky:
Правильно ли я понимаю, что монитор должен поддерживать частоту кадров 50 Гц?

да, похоже не на всяком мониторе работает. Я пробовал на довольно старом tft, с родным разрешением 1280х1024. С этим заработало.
0 #1 Ynicky 05.12.2014 23:28
Правильно ли я понимаю, что монитор должен поддерживать частоту кадров 50 Гц?

Добавить комментарий


Защитный код
Обновить


GitHub YouTube Twitter