7 сентября 2016, 13:10 (2999 дней назад) № 10256
Теперь пара слов про первую интру для TI:
В процессе изучения TI-99/4a мной была написана "99tro" - небольшая invitation intro на Chaos Constructions'2016, представленная на Revision'2016. Дополнительно к её исходникам здесь будут даны некоторые пояснения.
Основная идея состояла в том, чтобы интро по возможности передавало стилистику старых cracktro для Commodore 64, естественно с поправкой на более скромные возможности видео и звукового чипов TI-99/4a.
Грубо говоря, хотелось что-то типа цветного логотипа, плавно скроллящейся текстовой строки, переливающихся цветных полосок и болтающейся надписи из спрайтов.
Вскоре стали ясны следующие существенные ограничения и недостатки компьютера:
- Аппаратного скроллинга нет, его можно сделать только сдвигами и перезаписью видеопамяти
- Обмен с видеопамятью (это касается и спрайтов и графики и текста) очень медленный и сравнительно высокая частота процессора не спасает (равно как и его 16-разрядность, т.к. обмен с VDP идёт по 8-разрядной шине).
- VDP имеет ряд недокументированных или невнятно документированных багов (что неудивительно, TMS9918 - один из первых специализированных видеочипов). Пару раз это приводило к тому, что от уже практически законченной части приходилось отказываться.
- Сильно ограниченный функционал спрайтов - только 4 в строчку (что автоматически означает, что ничего шириной в экран спрайтами не сделаешь), одноцветность, большое количество инструкций процессора для простой смены цвета или координаты спрайта.
- Проигрывание музыки (vgm) отнимает весьма существенное время процессора. Как заявлено в исходниках плеера от Tursi, это 2-20% для 30гц версии, взависимости от конкретной музыки. В моём конкретном случае получалось не меньше 10-15%.
- Беда с удобными отладчиками (на самом деле, та же картина была и с эмулятором Vectrex - в обоих случаях есть мощные отладчики, но неудобные настолько, что, по факту, их использование скорее замедляет работу, нежели ускоряет)
- Невозможность быстро проверить код на реальном железе. Для этого нужно всё выключить, вытащить флэшку, воткнуть в PC, скопировать на неё код, вытащить из PC и вставить в TI, включить эмулятор диска и сам TI, выбрать Editor/Assembler, выбрать пункт загрузки программы, набрать DSK1.имя_программы, нажать ENTER, дождаться загрузки (около минуты).
В итоге постепенно от прежних идей осталось только то, что позволяла реализовать железка (конечно, с учётом, что это была моя первая программа для этой платформы и этого процессора):
- Надпись/лого CHAOS CONSTRUCTIONS'2016 с головой робота
- Мигающие в такт музыке глаза и рот робота
- Появляющийся буква за буквой, вслед за пульсирующим курсором, текст в несколько строк
- Плавно скроллящаяся строка текста
- Фоновая музыка (vgm)
Чтобы хоть как-то использовать сильные стороны TI-99/4a, я выбрал режим с максимальным графическим и цветовым разрешением - Graphics mode II (Bitmap). Для игр его используют крайне редко, т.к. он требует всех 16кб видеопамяти и, соответственно, очень медленный с точки зрения обновления изображения.
Однако, в отличии от игр, в моём случае можно было пойти на хитрость (что вообще характерно для demo и intro) - цвета я динамически не обновлял вообще нигде. Всё, что касается цветов, было установлено единственный раз в начале, вне основного цикла.
В цикле же менялся только bitmap и переключались два спрайта.
Верхнее лого было нарисовано сначала в Photoshop, затем преобразовано в дамп видеопамяти для VDP при помощи утилиты Convert9918 и далее эти два этапа циклически повторялись - т.е. в исходную картинку вносились уточнения, чтобы после преобразования (в 15-ти довольно кривых цветах и цветовом разрешении 2 цвета на 8 горизонтальных пикселов) она выглядела максимально адекватно. Надо сказать, что искажения характерные для композитного NTSC сигнала сыграли, как часто в таких случаях бывает, на руку - на CRT мониторе картинка выглядит явно лучше, чем в эмуляторе (к тому же, теплее и ламповее).
Надо сказать, я впервые всерьёз осознал, насколько важен для успеха платформы правильный выбор 16 возможных цветов её (платформы) разработчиками. В случае с TI-99/4a эти цвета крайне неудачны (к тому же, их 15).
Нижний плавный скроллинг был взят из единственного подобного примера (Matthew Hagerty) и модифицирован. Честно говоря. я бы за столь короткий срок вряд ли смог проникнуться ассемблером TMS9900 достаточно глубоко, чтобы повторить некоторые использованные там приёмы, без которых просто не хватило бы общей производительности для всей работы.
В скроллинге достаточно хитро сдвигаются влево части символов и результат копируется в VRAM. Всего скроллится область в 8 пикселов высотой.
Как я уже сказал выше, операции производятся исключительно над bitmap'ом - цветной фон в виде бело-синей полосы нарисован заранее и скроллингом не затрагивается.
Поскольку скроллинг - наиболее затратная операция в основном цикле, всё дальнейшее отталкивалось от него и от музыки (если перестаёшь укладываться в обратный ход луча, музыка начнёт тормозить).
К сожалению, по факту она всё равно немного тормозит т.к. оба эмулятора, на которых я отлаживал код, работали чуть быстрее, чем реальная железка. В чём именно заключается проблема - неясно.
В средней части экрана пишется текст за курсором. У меня было много идей как это красиво реализовать, но в итоге от всех пришлось отказаться из-за медленной видеопамяти и багов VDP. В результате, за каждую итерацию цикла рисуется одна буква (т.е. обновляется 8 байт видеопамяти). Для всех возможных восьми строк текста заранее установлен фон с плавным переходом между оттенками синего и серым.
Пульсирующий курсор представляет собой спрайт, для которого изображение берётся циклически из четырёх мест памяти - т.е. получается четыре кадра квадратика разного размера.
Что касается мигающих глаз и рта робота, то они реализованы тремя кадрами одного спрайта 16x16 (опять же - с целью выгадать в производительности). Тот или иной кадр выбирается взависимости от громкости одного из каналов звукового чипа (эти данные возвращает плеер).
Спрайты и шрифты редактировались в программе Magellan.
В коде используется три разных workspace для регистров процессора - одно для плеера (а он требует себе не только workspace, но и ещё кусок scratchpad - ценной 16-разрядной RAM, из-за чего не удалось увеличить скорость выполнения кода переносом его частей туда), второе для скроллинга и третье для всего остального (счётчики в цикле, координаты курсора и пр.)
В итоге, суммарный размер intro получился в районе 22кб. Основная часть, конечно, это несжатая графика (12kb) и RLE сжатая музыка (1.8кб). Таким образом, сам код занимает где-то в районе 6-7кб (да и то там есть фрагменты, которые использовались лишь для отладки).
(возможно, в Facebook она не будет вам доступна - видимость ограничена)