Очередной Новый год на носу, а значит, срочно нужно придумать очередной новогодний проектик и написать про него статью. Но делать с каждым разом это всё сложнее. Ведь не хочется повторяться, а также нужна достаточно интересная история, чтобы было, о чём рассказать. Думал-думал, что бы ещё такое умеренно-экзотическое изобрести, что не слишком оторвано от наших реалий и что возможно осуществить в сжатые сроки. Но ничего не приходило в голову.

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

Традиции

Для начала коротко расскажу про такое явление, как «крэктро», и какое отношение оно имеет к сегодняшней теме.

Примерно с появлением первых массовых домашних компьютеров в начале 1980-х годов родилась и крэк-сцена. Но не та, которая занималась неугодными Роскомнадзору делами, а другая, которая примерно в то же самое время также занималась другими сомнительными вещами. Впрочем, тогда они сомнительными не казались. Речь идёт о копировании и взломе коммерческого ПО, создании его «бесплатных» версий — движении, известном как «варез»-сцена.

Домашние ЭВМ поначалу развивались усилиями энтузиастов, во многом альтруистов, и первые программы для них распространялис�� свободно. Потом компьютеры начали производиться тысячами. Вчерашние энтузиасты попытались воспользоваться возможностью и заработать денег, создавая платные программы. Возник рынок. Другим энтузиастам не понравился такой вектор развития их увлечения, и они начали копировать и распространять ПО бесплатно. Первые стали защищать его от копирования, вторые взламывать. Отголоски этой истории звучат до сих пор.

Возникло варез-движение, конечно, на Западе. Там люди, занимающиеся взломом программ, назывались «крэкерами», создавали они, соответственно, «крэки» — взломанные версии программ. По зародившейся тогда традиции они оставляли своё имя или иные опознавательные знаки, визитную карточку, в виде прицеплённой к основному продукту программки с графикой, музыкой и обязательной бегущей строкой: «крэктро» (интро к крэку). Со временем подобным довеском оказались снабжены многие тысячи программ, в особенности на платформе Commodore 64.

В конце 1980-х бытовая компьютеризация простого населения добралась до стран Советского Союза. Весомой движущей силой в наших краях стал британский ZX Spectrum, так как его удалось воссоздать на местной элементной базе. Более продвинутые западные машины в их изначальной форме и отечественные разработки имели значительно меньшее хождение. Официальное ПО для неофициального Спектрума в СССР, конечно же, не продавалось, и пользователи-энтузиасты довольствовались всем, что попадалось в их сети.

Памятная строчка «CRACKED BY BILL GILBERT»
Памятная строчка «CRACKED BY BILL GILBERT»

Чаще всего это были из рук вон плохо взломанные версии игр, поступавшие из Польши. Там взлом имел вид нажатия кнопки на специальном устройстве «Multiface», которое просто выгружало образ памяти компьютера на кассету. От этого игры нередко действительно ломались — переставали работать корректно, теряли дозагружаемые уровни, и так далее, хотя встречались и вполне достойные релизы. Эталонным примером ПО подобного происхождения являются игры, снабжённые памятной строчкой «CRACKED BY BILL GILBERT».

Некоторые местные энтузиасты решили исправить ситуацию и взломать перевзломанное, попутно адаптировав игры для набирающей в то время популярность в наших краях дисковой системе TR-DOS и контроллеру дисковода Beta Interface, которые не имели успеха ни на своей родине, ни в других странах, не обладали уже доступным ПО, а значит, представляли собой непаханное поле для дикого творчества.

Авторы первых местных ре-релизов пере-взломов называли себя «хакерами», хотя по зарубежной терминологии они скорее были теми же «крэкерами». Поначалу это были энтузиасты без ников — Vasilyev Anton, Kulikov Dmitriy, Andy Chernikov, Sergey Skorobogatov, Pavel Nikitin. Чуть позже подтянулись напускающие флёр загадочности Max Iwamoto, KSA, *L*F*A*, Magic Soft, Softstar, и многие, многие другие.

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

Отечественные крэктро начального периода, 1990–1993 годов, отложились в моей памяти как очень похожие. И хотя создавались они по примерно похожим лекалам, подсмотренным каждым следующим автором у предыдущего, на самом деле они получались очень разнообразные. Существовали многие десятки подобных программ, так как многие хакеры той эпохи делали для каждой игры новое, не повторяющееся крэктро.

Содержательно эти программы представляли собой одиночный экран с некоторой графикой, анимацией и музыкой, зачастую вытащенной из коммерческих игр. Обязательным элементом был «текстовый скроллер» — бегущая текстовая строка с посланием от автора. В ранних крэктро это был «атрибутный» (крупноблочный) скролл высотой 6-8 строк в нижней части экрана, либо мелкая 8-пиксельная строка. Верхняя часть экрана содержала довольно стрёмную инфографику, не пытающуюся скрыть растянутые пиксели позаимствованных из игр шрифтов и иных элементов. Из эффектов присутствовали перемигивающиеся цвета, а в самых мощных крэктро — индикатор уровня звука каналов музыкального сопроцессора.

В средний период 1993–1995 годов крэктро обросли оригинальной красивой графикой и музыкой, а также стали предтечей электронной почты: люди оставляли сообщения друг другу и со��ственные персональные данные типа домашнего номера телефона во всё более причудливых текстовых скроллерах. В золотой век, 1995–2000 годах, развитие двинулось в сторону всё более крутых эффектов, творчески переосмысленных с более мощных платформ, в особенности Commodore Amiga, иногда добавляемых вопреки здравому смыслу из-за очень долгой загрузки.

В 2000-х годах тема пошла на убыль, всё чаще можно встретить однотипно оформленные релизы, которые, тем не менее, продолжают появляться. Всю историю этой традиции в рамках ZX Spectrum можно в деталях проследить на zxart.ee, задавая интересующие годы в поиске.

И на Западе, и в наших краях из крэктро органично выросла «демосцена» — область компьютерного творчества, которая развивала идею создания программок, подобных крэктро, но уже полностью самостоятельных, без привязки к краже интеллектуальной собственности. На демосцене возникли разнообразные дисциплины: кто-то продолжал делать крэктро, кто-то соревновался в визуальных эффектах и собирал из них всё более крутые самостоятельные демонстрации. Возникла и традиция делать нечто, подобное крэктро, в качестве поздравления с днём рождения — «гифт» или «гифтро».

Наконец, аналогичный формат возник и для поздравлений с праздниками, среди которых, конечно, главным стал Новый год. На современной демосцене в зимний период бывают даже специальные конкурсы именно для программ-поздравлений подобного рода. Среди ранних отечественных примеров отечественного происхождения можно назвать крэктро Split 1993 года или Christmass Demo 1994 года, а у польских хакеров найдутся и значительно более ранние работы.

Идея

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

Тогда я решил пойти от обратного и сделать самое банальное: максимально аутентичное новогоднее поздравление для ZX Spectrum в лучших (худших) традициях тех самых ранних отечественных крэктро, о которых рассказывал выше. Никаких навороченных технологий и эффектов, только невозбранно заимствованная графика и музыка, тестовый скроллер, и экстремальное сведение олдскулов.

Выбор такого аутентичного ретро-формата поставил передо мной необычные проблемы. Главной из них стал выбор элементов, которые я хотел бы разместить в интро. Ведь в нём всего один экран, и напихать сразу все приметы эпохи не получится. Пришлось выбрать самые знаковые из них, и при этом постараться не перестараться, сделав сильно лучше, чем можно было бы ожидать от выбранного исторического периода.

В итоге я придумал следующее: большая надпись сверху, какие-то мелкие надписи в середине, ёлка и стоящие вокруг неё персонажи из популярных игр. Сверху из анимации только классическое перемигивание цветов на надписях и «шариках» на ёлке. В нижней части сразу три текстовых скроллера: пиксельный в двух экземплярах с основным текстом и его увеличенная копия, выводимая цветовыми атрибутами.

Что касается графики и музыки, приметой эпохи было почти полное отсутствие оригинального контента. Средства его создания были не особо развиты и ещё толком не освоены энтузиастами, а то и вовсе только-только появились. Поэтому обычной практикой было заимствование графики, шрифтов и музыки из коммерческих игр. Именно этим путём наименьшего сопротивления я и решил двигаться. А значит, мне нужно было только написать код.

Код

Так как я задумал сделать интро в стиле определённого исторического периода, я решил применить и аутентичные техники программирования в духе эпохи: наивные, не самые оптимальные процедуры без продвинутых современных трюков. Код работает на обычном ZX Spectrum 48К с музыкальным сопроцессором — ранние крэктро не требовали даже 128К для работы. Сложность проекта такова, чтобы всё интро можно было бы написать за один вечер, не сильно приходя в сознание.

Главный цикл интро в Notepad++
Главный цикл интро в Notepad++

Разрабатывался код, конечно, более современными способами: писался в Notepad++, собирался в кросс-ассемблере SjAsmPlus и отлаживался в эмуляторе UnrealSpeccy. То же самое можно было бы сделать по классике, на реальном Спектруме или эмуляторе в том же Gens или другом нативном ассемблере, соответствующем эпохе. Но это просто было бы дольше и менее комфортно, при идентичном результате, а время, как обычно, нужно было сэкономить.

Я не буду разбирать весь код, так как это было бы не особо интересное чтение. Далее по тексту я обращу внимание только на некоторые избранные места, иллюстрирующие подходы старой школы и их отличие от того, как такие же вещи пишут современные просветлённые кодеры на ZX Spectrum. К слову, слово «кодер» в местной традиции носит не пренебрежительную, а наоборот, уважительную коннотацию. Здесь это тот, кто на ступень выше хакера: мастерски придумывает оригинальный код, а не просто копирует готовые решения. Исторические корни такой перемены значений неизвестны.

Код интро в отладчике UnrealSpeccy
Код интро в отладчике UnrealSpeccy

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

В таком режиме было написано 700 с небольшим строк кода.

Графика

Следуя старым добрым хакерским традициям, я не стал ничего рисовать сам и просто понатырил графику откуда ни попадя с минимальной последующей доработкой. Тырил просто методом скриншотов и копиров��ния с них избранных фрагментов.

Пальмы превращаются в Новогоднюю ёлку
Пальмы превращаются в Новогоднюю ёлку

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

Все четыре шрифта из интро
Все четыре шрифта из интро

Отличительным признаком ранних крэктро было наваливание на экран кучи разнообразных, не особо сочетающихся друг с другом шрифтов. На одном экране их можно было наблюдать 3-5 штук, и я выбрал золотую середину: пара случайных шрифтов из малоизвестных игр на основной части экрана, шрифт из Диззи для пиксельного скроллера и стандартный шрифт из ПЗУ для атрибутного скролла. Часть шрифтов я нашёл на сайте, где собрана добрая тысяча таковых, извлечённых из различных игр. Зрелище весьма любопытное, любителям пиксельной типографики рекомендую.

Графику я готовил в GraphicsGale в обычном BMP, предполагая её последующую конверсию. С последним случился некоторый затык. К сожалению, для ZX Spectrum до сих пор не создано хорошего графического кросс-редактора, снабжённого всеми необходимыми функциями при отсутствии глюков. Но есть несколько старых редакторов, родом из начала 2000-х годов, страдающих собственными уникальными проблемами разного калибра, вплоть до неработающей загрузки файла. В результате пришлось комбинировать наличные средства и действовать нестандартно.

Картинка во встроенном графическом редакторе BASin
Картинка во встроенном графическом редакторе BASin

Для начала я убрал в исходном изображении раскраску, оставив только два цвета. Затем конвертировал BMP в Спектрумовский экран в монохромном режиме с помощью BMP2SCR и заново раскрасил с помощью встроенного графического редактора среды BASin. Проблемой почти всех конверторов цветной графики является их желание преимущественно использовать инверсные пиксели, цвет которых определяется цветом фона INK — опция сохранять PAPER чёрным не предусмотрена. Это плохо работает с визуальными эффектами, и для обхода проблемы пришлось применить такой вот замысловатый процесс.

Перемигивание

Перемигивание цветов — классический эффект, присутствующий в большинстве ранних крэктро. Не знаю, кто и зачем сделал его первым, и как додумался до такой идеи, но повторять стали все, кому не лень, и занимались этим годами. Визуально он напоминает эффект с построчной сменой палитры на Commodore 64, но там это выглядело иначе.

Многие интро делают смену цвета каждый кадр, из-за чего возникает мельтешащий эффект, сливающийся в неопределённый почти белый цвет. Мне же больше по душе медленное перемигивание, происходящее раз в четыре телевизионных кадра, то есть со скоростью 1/12 секунды, и дающее рассмотреть каждый следующий цвет элемента.

Технически эффект очень прост: берётся код цвета, циклически декрементируются или инкрементируются младшие три бита, а остальные биты сохраняются прежними. Впрочем, это довольно ресурсоёмкая процедура, так как нужно перебрать немало байт и применить к ним пару битовых операций. А в моём случае ещё и пропустить некоторые знакоместа, что реализовано использованием дополнительной маски.

	ld a,(de)				;читаем байт атрибутной маски
	or a					;проверяем на 0
	jr nz,$+7				;пропускаем последующий код, если не 0

	ld a,(hl)				;читаем байт атрибута из экрана
	dec a					;декрементируем
	and c					;регистр C=7, оставляем три младших бита (INK)
	or b					;регистр B=64, накладываем бит яркости
	ld (hl),a				;возвращаем байт атрибута в экран

Чтобы оставить побольше свободного времени процессора для прочих элементов инро, я обновляю атрибуты двумя отдельными половинками: в одном кадре только верхнюю часть картинки, в другом — только нижнюю. Благодаря тому, что внизу на картинке присутствуют только звёздочки-шарики, визуально разрыв между обновлениями не заметен.

Атрибуты для перемигивания расставлены вручную во встроенном редакторе графики BASin после конверсии картинки. Практически как в старые добрые времена, только раньше я бы проделал эту операцию в Art Studio.

Скроллы

Обязательный, я бы даже сказал, ключевой элемент крэктро — текстовый скроллер. Я решил делать три скролла: один самый классический, крупный, атрибутный, с короткими фразочками и два пиксельных, дублирующих один и тот же текст в двух размерах. Подобная комбинация встречалась в ранних крэкто Дмитрия Куликова.

	dup 31				;повторяем 31 раз
	ldi					;копируем один байт из HL в DE, инкрементируем HL и DE
	edup				;заканчиваем повторение

Прокрутка атрибутного скролла выполняется цепочкой из 31-ой команды LDI, копирующей байты прямо в экранной области со сдвигом на один байт левее. Сразу после этого в конец строки записывается заранее подготовленный в буфере байт для нового столбца очередного символа. Символы имеют тень, которая получается сдвигом и заменой цветовых кодов предыдущего содержимого буфера перед отрисовкой в него нового столбца.

Пиксельные скроллеры выполнены прокруткой байт цепочками команд RL (HL) в отдельных в буферах в ОЗУ. Для мелкого скролла прокрутка делается один раз, а для увеличенного — дважды по одному пикселю. Всё это можно было бы делать и прямо в экранной памяти, но я хотел наложить на скроллы эффекты, и прокрутка в экране помешала бы его работе. Поэтому кручу в памяти и потом перекидываю в нужное место экрана цепочками LDI.

	dec hl			;идём по экрану в обратном порядке, может измениться H
	rl (hl)			;сдвигаем пиксель влево, вдвигая справа заранее подготовленный бит символа
	dup 31			;повторяем 31 раз
	dec l			;переходим на знакоместо влево, H гарантированно не меняется
	rl (hl)			;сдвигаем пиксель влево, вдвигая справа предыдущий выдвинутый влево пиксель
	edup			;заканчиваем повторения

Я не стал делать перемещение скроллерных полосок вверх и вниз, как в более поздних крэктро, так как это и затрудняет чтение, и в целом выглядит как что-то чуть более современное, чем хотелось бы. Впрочем, сделать это было бы несложно и с имеющимся кодом. Но нужно уметь вовремя остановиться.

Текстовое содержимое скроллов также является данью традициям. Это COMING SOON, который обычно анонсировал игры, которые вот-вот должны появиться на рынке, но применённый к наступающему году. Также присутствуют приветы друзьям и небольшой трибьют активистам отечественной крэк-сцены с перечислением их имён. Пусть их хакерские усилия сомнительны с точки зрения современной морали, но в тот исторический момент они открыли многим отечественным пользователям ZX Spectrum целый мир, в который тогда не было иного входа, и этим косвенно способствовали появлению в стране компьютерных энтузиастов, впоследствии развивавших эту нашу «айтишечку».

Эффекты

В роли дополнительного эффекта в интро выступает падающий в области скролла пиксельный снег. Пожалуй, это на грани перебора по сложности. Такое скорее сделали бы в 1994-95 годах. Но почему бы и нет, если да?

snow_anim:

	db %00001000
	db %00010000
	db %00100000
	db %01000000
	db %10000000
	db %10000000
	db %01000000
	db %00100000
	db %00010000
	db %00001000
	db %00000100
	db %00000010
	db %00000001
	db %00000001
	db %00000010
	db %00000100

Реализован снег очень просто. Выбирается случайное знакоместо экрана по горизонтали, и в нём начинает попиксельно смещаться байт: в предыдущей позиции он стирается, в новой выводится. Для синусоиды применяется банальная анимация по табличке, пиксель снежинки перемещается влево-вправо в пределах одного байта. Максимальное количество снежинок подобрано экспериментальным путём, чтобы укладываться во время кадра.

Также дополнительным эффектом является быстрое мерцание цветов в области скролла, создающее необычный оттенок цвета. Это сделано почти бесплатно, чередованием двух цветовых кодов для фона в шахматном порядке в каждом новом столбце атрибутного скроллера. Подобный эффект изредка наблюдался в крэктро начала 1990-х, и как мне кажется, это мерцание сильно добавляет ощущения «праздничности» эффекту, сверкая, как новогодняя гирлянда.

Музыка

В самых ранних крэктро часто использовали музыку непосредственно же из Спектрумовских игр. Чуть позже в ход пошли конверсии мелодий популярных исполнителей, которые первоначально создавались на Amiga и IBM PC в форматах MOD и STM и в ручном режиме адаптировались для Спектрума с применением Sound Tracker и ASC Sound Master. Также изредка заимствовали и музыку со встречающейся в компьютерных классах и родственной в области звука и процессора Yamaha MSX. Полностью оригинальные творения появились к середине 1990-х, когда энтузиасты достаточно натренировались на кавер-версиях.

По вышеобозначенным причинам и согласно хакерским традициям музыку для этого интро я тоже не стал сочинять сам, а нагло спёр. Поначалу я планировал спереть её из какой-нибудь игры. Потом подумал про вариант взять мелодию из одной из серии демок MSX, содержащих музыку с компьютера MSX, и даже присмотрел одну, которая мне давно нравилась. Однако, для этого нужно было бы сначала отделять кодовый блок и данные проигрывателя музыки, а потом размещать его в удобных ему адресах, и раскидывать свой код вокруг него — это достаточно времязатратное мероприятие.

В итоге я решил пойти самым простым путём: взял памятную многим мелодию из свежайшей в ту историческую эпоху польской демки Lyra II. Она звучала в части с качающейся на воде бутылкой, и представляла собой кавер на композицию Daydreaming британской поп-певицы Дасти Спрингфилд из альбома 1990-го года Reputation. Наверное, это не самый новогодний трек, который можно представить, но мне он показался вполне подходящим. К тому же, это многократный скрытый трибьют: и старой доброй демке, и её авторам, и исполнительнице оригинальной композиции.

Так как мелодии в Lyra II были написаны в свежайшем на тот момент редакторе Sound Tracker, я смог воспользоваться уже готовым проигрывателем этого музыкального формата, что сильно упростило дело. Правда, я взял современную версию в исходном коде, а в прежние времена, конечно, нужно было бы скомпилировать трек под нужные адреса в памяти программной ST Song Compiler. Между прочим, Sound Tracker изначально был коммерческой программой, и взломали его именно авторы Lyra II, и благодаря их усилиям эта программа добралась и до отечественных пользователей.

	halt
        ...
	call music_play

Я не стал заморачиваться с собственным обработчиком прерываний, потому что интро всегда работает с частотой 50 кадров в секунду, то есть кадр анимации укладывается во «фрейм». Соответственно, для проигрывания музыки со стабильной скоростью достаточно вызывать код проигрывателя раз в кадр. Тоже своего рода хак и примитивное, но вполне рабочее решение.

Загрузчик

Наконец, Бейсик-загрузчик, загружающий и запускающий кодовый блок. На Спектруме уже в первой половине 1990-х широко использовался так называемый «моноблок», в котором Бейсик-загрузчик и кодовый блок объединялись в единый файл для удобства копирования, чтобы ничего случайно не терялось и путалось. Но я всё же сделал простой Бейсик с загрузкой отдельно лежащих кодовых файлов, так как он позволяет легко адаптировать программы к другим дисковым системам.

Бейсик-загрузчик в ред
Бейсик-загрузчик в ред

Загрузчик написан по классике, на Бейсике, с использованием приёмчиков, сокращающих длину программы в байтах: NOT PI вместо 0 (два байта вместо шести), VAL строковых представлений вместо цифр, 4e4 вместо 40000 — классический адрес загрузки любительских программ, не обусловленный никакими практическими соображениями. Тоже дань традиции.

С написанием кода загрузчика возникли традиционные проблемы. Дело в том, что до сих пор нет удобного способа подготовки Бейсик-программ для их последующего добавления в образ TR-DOS дискеты. Поэтому я набирал загрузчик в BASin, сохранял в TAP, загружал в эмулятор, пересохранял в образ диска, потом извлекал Hobeta-файл с помощью Spectrum Navigator в DosBox и помещал его в финальный образ утилитой trdtool. Истинный спектрумизм как он есть.

Интро к интро
Интро к интро

Можно было бы обойтись просто кодовым блоком интро, но я решил добавить ещё интро к интро: надпись «жирным» шрифтом, подобную той, какую можно было встретить в ранних дисковых версиях игр. Шрифт генерируется на основе шрифта из ПЗУ сдвигом и сложением по OR.

Код загрузчика не упакован, так как и безо всяких оптимизаций легко умещается в один дисковый сектор (134 байта из 256), а вот код интро на всякий случай упакован пакером Hrust 1.3. Не вполне аутентично, так как он родом из конца 1990-х, но и в начале 1990-х существовали какие-никакие упаковщики данных, только менее эффективные, так что пойдёт.

Заключение

В погоне за ускользающим будущим, новыми достижениями, последними версиями, всем самым продвинутым и современным, важно не забывать, что испытывать радость нас научили гораздо более простые вещи. И они по-прежнему способны это делать.

С наступающим Новым годом!

P.S. Архивчик с запускаемым файлом для ZX Spectrum в SCL-образе, а также исходный код можно скачать прямо здесь.

© 2025 ООО «МТ ФИНАНС»