Обратите внимание, что новости можно получать по RSS.
X
-

События, Демосцена, Информационные технологии, История вычислительной техники и IT

3 сентября 2015, 02:11 (3347 дней назад, №9575)Исходники intro для Vectrex

Хочу поделиться исходниками своих работ под Vectrex - Electric Force (233 байта), Invitron (32 килобайта) и двух пробных - Rainy (413 байт) и Emptyscreentro (128 байт). Все исходники - ассемблер 6809. Подробнее о Vectrex и разработке под него можно прочесть в моей статье.

Electric Force (233b)
(source+bin)

В работе использована не совсем стандартная возможность Vectrex рисовать кривые (изменяя значение на ЦАП-е в канале X в процессе того, как идёт интегрирование по каналу Y). Рисование кривых - первое, что меня заинтересовало, когда я начал изучать Vectrex. Соответственно, эксперименты затем вылились в эту работу, представленную на конкурс Tiny intro фестиваля Chaos Constructions'2015.

Эмулятор (ParaJVE) плохо понимает такие вещи (хотя и понимает), поэтому в нём это смотреть не стоит - если нет Vectrex'a, лучше посмотреть на Youtube.

Надо сказать, что сколько я не пытался записать нормальное видео (на Sony NEX7, 35/F1.8) - получается лишь жалкое подобие того, что видно на ЭЛТ экране. Во-первых, катастрофически не хватает динамического диапазона - между совершенно чёрным экраном и яркой точкой на нём, где задерживается луч - огромная разница в яркости, которую камера никак не может зафиксировать. Кроме того, не передать плавность (маленькая выдержка снижает чувствительность). Короче говоря, видео - плод компромиссов, в результате которого "тёплая ламповость" неизбежно теряется, что очень обидно.

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

"Случайные" данные для кривых берутся из BIOS, конкретно - из таблицы символов (там попадаются наиболее подходящие значения ;)

Количество кривых - фактически предельное, чтобы уложиться (вместе со всеми вычислениями + изменение яркости + возврат к центру экрана для калибровки + отрисовка текста + две горизонтальные линии) в стандартные 30 тыс тактов на "кадр".

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

Отдельно замечу, что хотя никакого звука в коде нет, сам Vectrex из-за наводок жужжит (это типично для большинства Vectrex'ов), что в данном случае скорее плюс :)

Youtube | Pouet

Invitron (32kb)
(source+bin)

Работа была написана в качестве invitation intro (приглашения) на Chaos Constructions'2015. Основной объём из её 32к занимает оцифрованный (7кГц) несжатый голос - 20кб. Известная (в узких кругах) фраза "здесь пахнет демосценой" была произнесена Random'ом во время "Random speech compo" на CC'2004. Её проигрывание осуществляется через ЦАП.
После этого через чип AY8912 фоном начинает играть музыка Plaigraunt by C-Jeff. Она преобразована из pt3 в .YM через AY-Emul, затем в данные для VecSound через ym_vpack. Соответственно, в качестве плеера используется VecSound.
Как несложно услышать, плеер этот далеко не идеален, но попытки найти другой - успехом не увенчались. Так что, с одной стороны, неудобно перед C-Jeff-ом за искажение его отличной музыки, с другой - альтернативы всё равно не было (разбираться с 8912 и писать плеер самостоятельно я морально не готов :).
В процессе проигрывания VecSound плеер распаковывает YM на лету. Хотя там довольно простое сжатие, на это уходит порядочно тактов. В распакованном же виде музыка бы не влезла в стандартный 32кб объём картриджа Vectrex.

Что касается основной части интро - она была навеяна титрами из фильма "Tron Legacy". Конечно, сходство весьма поверхностное. Проблема в том, что за 30 тыс тактов (на условный "кадр") можно нарисовать очень немного векторов (ну или много, но очень коротких). Напомню, что перемещение луча к началу следующего вектора - тоже считается за вектор, как и яркие точки. При этом, после рисования почти каждого вектора, нужно рекалибровать систему, возвращая луч к центру экрана (иначе всё будет съезжать, искажаться и пр.).

Скроллинг верхней и нижней части реализован довольно просто - каждый вектор сначала рисуется за пределами экрана и затем, с каждым кадром, добавляется смещение. После того, как он скроется за другим краем, всё повторяется. Таким образом можно скроллить лишь векторы довольно небольшой длины. Это связано с тем, что напряжение на выходе интеграторов не может превысить определённое значение. Поэтому, если смещать луч в одном направлении снова и снова, в конце концов он как бы упрётся в невидимую эластичную "стену". Забавно, что в эмуляторе (ParaJVE) эта особенность железа не учитывается и луч уходит сколь угодно далеко.
Точки на концах векторов яркие не за счёт управления яркостью, а за счёт того, что луч задерживается в этом месте несколько тактов (эмулятор это также не понимает, да и в видеоролике, к сожалению, эффекта почти не видно).

Текст в центре первоначально хотелось выводить, рисуя символы векторами. Однако, это оказалось совершенно неприемлимо по тактам. В итоге, используется переделанная процедура BIOS выводящая строку "растром". Переделка заключалась, во-первых, в разворачивании подпрограмм, которые из неё вызывались (для экономии тактов) и, во-вторых, скорректирована одна задержка, из-за которой на большинстве Vectrex'ов (насколько это можно судить по разным видео на youtube), длинные строки текста начинает перекашивать в определённом направлении.

Подпрограммы рисования векторов, перемещения луча, изменения яркости - также все были вынуты из BIOS, вставлены непосредственно в код интро и, по-возможности, оптимизированы.
По ходу дела обнаружилось, что asm09win некорректно работает с макросами - когда их начинаешь использовать, при ассемблировании периодически возникают странные синтаксические ошибки, в произвольных строках. Пришлось нужные куски исходника дублировать вручную.

Youtube | Pouet

EmptyScreentro (128b)
(source+bin)

Эксперимент по выводу изображения за пределы экрана (туда, где ещё есть люминофор, но он уже скрыт корпусом).
Рисуются две вертикальные линии слева и справа, в максимальном масштабе и с максимальной яркостью. При этом рисуются по 30 раз за кадр каждая, за счёт чего яркость возрастает ещё больше и свечение из под рамки становится отчётливо видно. В принципе, таким образом можно попортить кинескоп, хотя в данном случае участок всё равно находится за пределами видимой области. Кроме того, теоретически в Vectrex есть защита от слишком долгого нахождения луча в одном положении (яркость должна автоматически уменьшиться).
Длина линий меняется взависимости от данных при проигрывании короткой мелодии через AY8912 (которая берётся из ROM).

Youtube

Rainy (413b)
(source+bin)

Имитация струй дождя с переменной интенсивностью. Используется большое количество векторов разной яркости и с разным паттерном (изменяющимся в процессе). Масштаб максимальный. Внизу, в конце линии, луч на некоторое время придерживается, для получения яркой точки.
Хотя этот код был первой попыткой написать что-то осмысленное для Vectrex, опубликована работа была последней. При большом желании код можно сократить как минимум вдвое (данные для координат линий не хранить, а вычислять, а также частично использовать подпрограммы BIOS для Draw_Line_d, Move_D, Reset0Ref, Intensity_a (в данном случае они вынесены из BIOS и модицифированы, без чего потенциально можно обойтись).

Youtube

Опубликовано: Пётр Соболев

Случайная заметка

2372 дня назад, 14:035 мая 2018 NASA+DOE завершило очередной цикл испытаний ядерного реактора Kilopower для применения за пределами Земли. Общий смысл в том, что а) это честный ядерный реактор (а не РИТЭГи, которые сейчас применяются) б) для преобразования в электричество используются двигатели Стирлинга. Единственно, при такой небольшой мощности это не имеет ...далее

Избранное

2737 дней назад, 01:575 мая 2017 Часть 1: От четырёх до восьми Я люблю читать воспоминания людей, заставших первые шаги вычислительной техники в их стране. В них всегда есть какая-то романтика, причём какого она рода — сильно зависит от того, с каких компьютеров люди начали. Обычно это определяется обстоятельствами — местом работы, учёбы, а иногда и вовсе — ...далее

2249 дней назад, 20:305 сентября 2018 "Finally, we come to the instruction we've all been waiting for – SEX!" / из статьи про микропроцессор CDP1802 / В начале 1970-х в США были весьма популярны простые электронные игры типа Pong (в СССР их аналоги появились в продаже через 5-10 лет). Как правило, такие игры не имели микропроцессора и памяти в современном понимании этих слов, а строились на жёсткой ...далее