Вспоминаем старый добрый ZX Spectrum, пишем «Hello World» и знакомимся с демосценой

«Пословица звучит витиевато:
«Не восхищайтесь прошлогодним небом».
Не возвращайся — где был рай когда-то.
И брось дурить — иди туда, где не был»

В. Высоцкий

Доброго времени суток, товарищи! Я более чем уверен, что большинство из вас знакомы с такой вещицей, как ZX Spectrum. Как много теплых воспоминаний связано с этой чёрной коробочкой, начинённой различными микросхемами!

В этом посту я поведаю о том, как использовать и настраивать эмулятор Fuse под линуксом, а также расскажу, как написать простейшую программу в машинных кодах под ZX Spectrum и запустить её в эмуляторе.

На сладкое — я познакомлю вас с миром демосцены, в котором каждый найдёт себе место под солнцем и сможет как почерпнуть для себя новых знаний, так и просто насладиться уютом, теплотой и ламповостью сего места.

Elite, Exolon, Spellbound, Dizzy — если эти слова вам о чём-либо говорят, то милости прошу под кат!

image

Предисловие


Для начала хотелось бы познакомить вас с самим спектрумом. Если вам не шибко повезло и вы не застали его в живую, то рекомендую к прочтению текст ниже, ибо в противном случае дальнейшее чтение статьи будет попросту бессмысленно.

ZX Spectrum — это такой бытовой компьютер, выпуск которого пришёлся на 1982 год. Он пользовался большой популярностью в те времена и чего мелочиться — именно с этого компьютера началась эра персональных компьютеров.

ZX Spectrum был (и остаётся до сих пор image) восьмибитным, всего было выпущено четыре официальных модели — ZX Spectrum 16K/48K, ZX Spectrum+, ZX Spectrum 128, имеющие, соответственно, 16, 48 и 128к оперативной памяти. Отнюдь, сейчас существуют клоны спектрума, имеющие различные характеристики, пентева, к примеру.

Знакомимся с Fuse

Fuse, как вы могли догадаться ранее — это эмулятор спектрума, поддерживаемый во многих операционных системах, начиная от линукса и заканчивая вендой.

Давайте соберём его и немедля приступим к изучению нутра этой вещицы.
Сразу оговорюсь, если вы используете Ubuntu, то вам будет достаточно выполнить следующую команду:

sudo apt-get install fuse

Ну, а чтобы собрать исходники этого эмулятора, нам потребуется:

1. Скачать сам эмулятор — бдыщ;
2. В папке проекта выполняем —

./configure && make install

3. Слышим истошные крики о том, что нам не хватает библиотеки «libspectrum» —

checking libspectrum.h usability... no
checking libspectrum.h presence... no
checking for libspectrum.h... no
configure: error: Sorry - I need libspectrum to be available

К всеобщему счастью, проблема решается довольно легко — достаточно проследовать по ссылке и установить недостающую библиотеку, после чего заново запустить ./configure.
4. После проделанных операций вы можете смело запускать fuse. Voila!

Настраиваем Fuse


Пришло время настроить наш свежескомпиленный эмулятор, но перед этим рекомендую загрузить пак rom-ов и поместить его в папку, из коей впредь будут запускаться программы для спектрума.

Запускаем Fuse, заходим в меню Options → Filter и ставим галочку напротив пункта «Double size» —

Вот это
image

Если вы хотите, чтобы образы .TAP и .TRD считывались мгновенно и ручками ничего не приходилось делать, то рекомендую не трогать настройки и оставить всё, как есть, ну, а ежели вы хотите вспомнить былое и максимально окунуться в прошлое, то выставьте настройки, которые спрятаны под спойлером.

Скучное название спойлера
Options → Sound:

image

Options → General:

image

После того, как вы успешно проделали махинации с Fuse, можете смело запускать вашу любимую игру, прежде найдя её на www.worldofspectrum.org. Если решились использовать sdl-версию, запустите образ из консоли, используя
fuse .tap

После выполнения команды выше вы увидите серый экран, на котором либо будет меню, либо, соответственно, не будет. В первом случае вам нужно нажать «Enter», после чего запустить кассету (F8), а во втором — нажмите следующие клавиши — »J, Ctrl+P, Ctrl+P, Enter», после, опять же, F8.

Отлично! Во время загрузки вы услышите тот самый звук, который, возможно, станет проводником в ваше детство.
Что же, самое время найти парочку старых игр и насладиться их прохождением! Несколько томительных минут ожидания и уже никто не в силах оторвать вас от этой замечательной вещицы image.

Пишем простую программу под ZX Spectrum


Пришло время развеять завесу тайны и узнать, что же действительно представляет из себя ZX Spectrum. Наша программа будет просто выводить текст «Wct One Love» на экран, после чего передавать управление спеку.

image

Использовать мы, разумеется, будем Wct, что и следовало ожидать от меня — это такая hex-подобная система счисления со своим компилятором и прочими фишками. Отличается от хексов тем, что состоит только из букв, а последние две поменялись местами. Одним словом — сумасброд, но я использую его на протяжении длительного времени и уже привык и полюбил его. Не серчайте, я понимаю, что некоторых это порядком достало image. Если обобщить, то Wct представляет из себя не более, чем обычную игрушку. Не будем тянуть кота за хвост — приступим к написанию самого кода.

А вот так выглядит Wct
A B C D E F G H I J K L M N P O

Чтобы понимать, что мы делаем, будем использовать таблицу, в которой можно найти соответствующий код для каждой мнемоники.

Первым делом нам нужно поместить в регистр «A» число Cw (в десятичной системе счисления — 2). Для выполнения многих команд обрабатываемые данные должны быть занесены в регистр «A», прежде чем будут выполняться следующие действия.

Dp AC		// В регистр «A» помещаем число Cw

После же нам надо вызвать функцию печати символа — «BG AB».
Так реализуем же это посредством использования команды «Mn». Следует обратить внимание на то, в каком порядке идут байты. В данном случае это Big Endian, то бишь порядок «от старшего к младшему» из байтов.

Mn ab bg	// Вызываем функцию печати символа — «BG AB».

Пришло время упомянуть регистры спектрума. Микропроцессор Z80, в отличие от 18080, работает с двумя наборами регистров — основным и альтернативным, Оба набора состоят из семи 8-разрядных регистров данных и флагового регистра. Регистры основного набора обозначаются буквами А, В, С, D, Е, Н, L и F (флаговый). Регистры альтернативного набора соответственно — А', В'(С, Dr, Е Hr, L' и F). Для пользователя эти наборы совершенно идентичны, и знак' (апостроф) означает лишь то, что в данный момент регистр не является активным.

Команды, обрабатывающие 16-разрядные числа, используют пары регистров в следующих сочетаниях: ВС, DE, HL, AF и, соответственно, ВС, DE HL AF'. При этом в регистры В, D, Н, А, В', D', Н А' записывается старший байт числа, а в С, Е, L, F, С, Е L' и F' — младший. Спаренные регистры можно использовать, например, для хранения и обработки адресов ячеек памяти.

Нам же надо загрузить в пару HL адрес нашей строки, которая располагается по адресу IABAw с использованием команды Cb.

Cb ba ia	// Загружаем в HL строку по адресу
		// IABA, и начинаем обрабатывать текст,
		// который мы получили из этой строки

Теперь нам надо загрузить адрес, который мы запихнули в HL, в регистр A, соответственно, использовать мы будем команду Hp —

Hp		// Загрузка адреса из HL в регистр "А"

Теперь нам нужно проверить, не закончилась ли строка. В противном случае нам нужно будет вернуть управление спектруму, а ежели в памяти всё ещё остались символы, то мы проверим это с использованием команды Op, где операндом будет AAw, то бишь »0».

Если же строка закончилась, то выполним команду прерывания процесса — Mi.

Op AA		// Проверяем, не закончилась ли строка.
		// Если закончилась, то переходим к выполнению
		// следующей команды.

Mi		// Если строка закончилась, то передаём
		// управление спеку.

Следующие три команды должны выполнить чтение по адресу IABAw, увеличить текущее значение в регистре HL на единицу и совершить цикл.

Nh		// Выполняем функцию чтения - BA.
Cd		// Увеличиваем регистр "HL" на единицу
		// и продолжаем выполнение программы.

Bi OI		// Цикл... Переходим на метку, выполняем «Cb ba ia»

Теперь мы должны разместить непосредственно наш текст. Его можно записать двумя способами — либо разместив в кавычках, либо же предварительно переведя его в набор байтов. Чтобы осуществить перевод текста вручную, воспользуемся таблицей по адресу wctsite.tk/table.
«Wct One Love» или же «FH GD HE CA EO GP GF CA EM GO HG GF».

Теперь нам осталось указать на то, что наша программа завершена, дальше не следует выполнять никакие действия.

An AA		// Конец...

Чудно! Мы завершили написание нашей первой программы под спектрум, давайте взглянем на полный код:

/*
ZX-Spectrum Example
Coded in Wct
*/

Dp AC		// Помещаем в регистр "А" число C (2);
Mn ab bg	// Вызываем функцию печати символа - BG AB.
		// Заметьте, что после команды операнды
		// идут в обратном порядке, тобишь от
		// последнего и до первого.

Cb ba ia	// Загружаем в HL строку по адресу	<───────┐
		// IABA, и начинаем обрабатывать текст, 	│
		// который мы получили из этой строки	>───────┼───────┐
		//						│	│
Hp		// Загрузка адреса из HL в регистр "А"		│	│
Op AA		// Проверяем, не закончилась ли строка.		│	│
		// Если закончилась, то переходим к выполнению	│	│
		// следующей команды.				│	│
		//						│	│
Mi		// Если строка закончилась, то передаём		│	│
		// управление спеку.				│	│
		//						│	│
Nh		// Выполняем функцию чтения - BA.		│	│
Cd		// Увеличиваем регистр "HL" на единицу		│	│
		// и продолжаем выполнение программы. 		│	│
		//						│	│
Bi OI		// Цикл... Переходим на метку...	>───────┘	│
		//						        │
"Wct One Love"	// Наш текст	<───────────────────────────────────────┘

An AA		// Конец...

Теперь пришло время разобраться со сборкой вышеприведённого кода. Для начала нам нужно собрать утилиту «bin2tap», которая позволит сконвертировать бинарник в образ кассеты, с которой будет считываться программа в спектрум. Достаточно скомпилировать файл raw.githubusercontent.com/Mihip/Wct/master/source/spectrum/bin2tap.c при помощи, допустим, GCC, и приступить к следующему шагу.

image

Чтобы собрать бинарник нам понадобится воспользоваться билдером. Вставьте туда код, скомпилируйте его и сохраните бинарник на вашем компьютере.

Теперь нам нужно создать образ кассеты, для этого воспользуемся командой bin2tap -b name_of.bin с флагом »-b», который означает то, что также в образ будет включен бейсик код, который загрузит нашу программу в память спектрума самостоятельно.

Всё готово, можно запускать программу ─

image

Отлично! Всё сработало. Поздравляю, вполне вероятно, что это ваша первая программа, написанная для спектрума!

Знакомимся с демосценой

Что же такое демосцена? Демосцена — это место, где каждый может проявить себя в лучшем свете. Демосцена — это раскрытие своих способностей, изучение новых платформ для написания демок. На самом деле я имею ввиду ретро демосцену, где зачастую используется как раз спектрум как платформа для написания дем. Что такое демо? Это программа, раскрывающая способности не только компьютера, но и автора.

Демосцена — это своеобразное искусство. Имеет место и рассказать о демопати. Демопати — мероприятия, где демомейкеры встречаются и непосредственно демонстрируют свои навыки, а также демы, которые они создавали специально для пати. Отличие демопати от обычных фестивалей искусства состоит в том, что работы зачастую доделываются непосредственно на демопати, и это является частью процесса мероприятия. Кроме этого, крупнейшие демопати обычно проходят несколько дней (чаще всего — 3–4) и одновременно являются пристанищем демосценеров из разных стран (для этого есть специальные спальные места, где можно спать в спальном мешке).

Из слов VBI:

1:16:20 — vbi-: Демо — это обычно способ показать своё владение железом.
1:16:29 — vbi-: Не важно, гитара это или комп.
1:16:47 — vbi-: Это, возможно, демонстрация возможностей железа,
1:16:59 — vbi-: то, что ты можешь из него достать.
1:17:04 — vbi-: А вот хорошее демо —
1:17:24 — vbi-: это такое, в котором используется непривычное использование железа,
1:17:40 — vbi-: Либо же железо отрабатывает на все свои 100%.
1:18:55 — vbi-: То есть демо обычно — это выход на уровень выше, чем, как казалось, позволяет железо.
wbcbz7_k016> сцена — это когда ты пилишь проды, чтобы и себя показать, и на других посмотреть, и просто оттянуться\отдохнуть\научиться
wbcbz7_k016>:)

Если же моё определение вам не по душе, то ниже приведена цитата из википедии:

image

Демосце́на — киберкультура, зародившаяся в конце 1970-х годов вместе с распространением первых домашних компьютеров. Направление компьютерного искусства, главной особенностью которого является выстраивание сюжетного видеоряда, создаваемого в реальном времени компьютером, по принципу работы компьютерных игр. Таким образом, демо является симбиозом программирования и искусства.

Моё любимое демо для спектрума — «Eager (to live)», автором которого является introspec (a.k.a spke).

Товарищи, присоединяйтесь к демосцене, творите чудеса и никогда не забывайте про спектрум image!

Послесловие

Друзья, спасибо за то, что вы поддерживаете меня своими тёплыми комментариями и отзывами, я рад, что вам действительно интересны мои статьи и заметки. Хотелось бы верить в то, что ZX Spectrum навсегда останется в ваших сердцах и всегда будет дарить только хорошие воспоминания. Спасибо за то, что уделили время на прочтение этой статьи!

И помните,

Make demo, not war!

image

Использованная литература
zxpress.ru
wikipedia.org

Приветы
Пользуясь случаем, хотелось бы передать привет моим знакомым из #z80 — Kakos_Nonos, Nuts, introspec, wbcbz7, organism, TSL, nyuk, jam, kowalski, g0blinish, vbi, zedOFF и всем, всем, всем, кого я забыл упомянуть image.

Ссылки
wctportal.ru — портал, посвящённый Wct;
wctsite.tk — официальный сайт, посвящённый Wct, домен так и не сменился;
github.com/Mihip/Wct — репозиторий на гитхабе;
zxpress.ru — материалы по ZX Spectrum;
worldofspectrum.org — архив работ для ZX Spectrum.

Комментарии (7)

  • 8 июля 2016 в 00:28

    +1

    Послушал звук загрузки с кассеты, прослезился.
  • 8 июля 2016 в 00:58

    0

    Эх, помню, программы для спектрума у нас крутили ночью по FM-радио… Про авторское право никто не слышал, а волновало только лишь бы не прошла помеха от выключателя в соседней комнате. Впрочем, кассеты с любыми программами были на толкучке. Даже Лисп был…
    Потом появился дисковод — целая революция!
    А потом появился 286-й — и понеслась…
  • 8 июля 2016 в 01:10

    0

    WCT… что это?
  • 8 июля 2016 в 01:43

    0

    Фигня какая то из бредо генератора, нифига не понятно.

    При том что у меня был робик с бейсиком и асм Z80 я вполне себе освоил, как минимум базовую часть, притом без всякого интернета (1998 год, далёкое замкадье).

    Самое интересное опущено — внутреннее устройство.

    Было круто тогда, но нет смысла сейчас, проще накорябать нужное на сях и запустить хоть на х86 хоть на мипс, хоть на арм, хоть в эльбрусе.

  • 8 июля 2016 в 02:06

    0

    Интересно, почему когда упоминают топовые игры на спектрум, часто игнорируют UFO и Черный ворон?
    Отличные же игры были.
  • 8 июля 2016 в 02:08

    +1

    Прям задушу, Z80 мммммм… Кино «Micro Men» (2009) обязателен к просмотру! ru.wikipedia.org/wiki/Micro_Men
  • 8 июля 2016 в 06:51

    0

    Отличная статья, хоть и коротка по смысловой нагрузке. На асме Z80 к сожалению не писал, только на встроенном S-Basic, возле телевизора на почётном месте не запыленная Дельта-С 128 с которой отлично проходят выходные в паре со всякими Exolon и конечно бейсиком.

    P.s.: не рекламы ради, в Новосибирске 30 -31 июля состоится CrazySiberianParty'2016 (CSP2016)

© Habrahabr.ru