Если у чего-то есть экран, то там обязана играть Bad Apple!. Именно так думал и я. Каково же было моё удивление, когда узнал, что Bad Apple не существует на MSX, и вот почему... прошу под кат...
Когда-то давным-давно моим первым компьютером стал школьный КУВТ-2, он же "Ямаха". Это как первая любовь, такая же недолгая, прошло несколько лет обучения MSX-Basic, и далее мы перешли на x286, но ощущение, что что-то осталось нереализованным на этом компьютере - осталось. Конечно же, в те годы, пятиклашками, мы не понимали, чем одни компьютеры отличались от других, но любимым времяпрепровождением было пялиться в зелёный экран и нажимать на клавиши клавиатуры, а также иногда играть в USAS, Vampir Killer и Metal Gear...
С тех пор прошло много времени, и я почему-то и не предполагал, что можно вернуться в прошлое, вновь ощутить в руках клавиатуру КУВТ-2, увидеть приветствие MSX Basic... Но внезапно, в прошлом году увидев на барахолке КУВТ, я неожиданно для себя купил её... Строго говоря КУВТ-2 - это MSX-2 в варианте поставки от Ямахи для России в учебные классы, с небольшими модификациями. И это классно! Так как MSX, как платформа, в мире очень распространена, а в Японии так и вообще есть культ MSX.
Очевидно, что в своё время я не успел написать на ней что-то важное для себя, понять вообще, как эта Ямаха работает, и нужно было восполнить этот пробел... Но сперва нужно посмотреть, что уже есть и сыграть в любимые игры. Когда эйфория уже спала, то начался этап предметного изучения и поиска идеи, что же такого закодить. Ранее с друзьями мы уже развлекались зеленой демкой Bad Apple на осциллографе, и тут подумалось: "А не замахнуться ли нам на Вильяма, понимаете ли, нашего Шекспира?":
По какой-то невероятной причине Bad Apple не была представлена на платформе MSX, то есть формально какая-то демо была, но запустить его на не разогнанной не модифицированной MSX было нельзя, существует стрим 80Мбайтного файла со специализированного накопителя на специально модифицированной MSX, короче, это было явно не то, что требовалось...
Почему же Bad Apple нельзя реализовать на MSX? Ответ кроется в архитектуре платформы MSX. Из книги К.И.Фахрутдинов, И.И.Бочаров "Архитектура и устройства микрокомпьютеров стандарта MSX-2":
Сердцем MSX является Z80 процессор (привет "здесь смайл машет вам ручкой" почитатели ZX Spectrum), но! как мы видим на схеме, видео память VRAM прячется за видео процессор TI V9918/38, что резко снижает скорость пересылки данных из обычной памяти в видео память. В то же время, наличие видеопроцессора является и преимуществом в архитектуре MSX, он позволяет выполнять различные операции по отрисовке линий, точек, а также отображать тайлы (они же шаблоны, они же символы) и спрайты, позволяет отслеживать коллизии спрайтов, а также ещё несколько ништячков, что очень полезно при реализации игр. Но, к сожалению, они не помогают при выводе видео. Нужно было придумывать некоторую хитрость.
Были проверены варианты отрисовки изображения точками и линиями, но они оказались слишком медленные, и тогда стало понятным, что нужно решение искать в родной области MSX - а именно в отображении тайлов. По сути всю область экрана (256х192) можно представить как знакоместа 32х24, в каждом знакоместе можно разместить одни из 256 символов 8х8, он же тайл. Таких тайлов может храниться в памяти VRAM 256 штук. 256 тайлов не могут покрыть все варианты реализации 8х8, но могут перекрыть все варианты 4х2, что должно соответствовать разрешению 128х48.
Таким образом, решение для отображения видео в тайловом (символьном) формате лежит в подборе таких тайлов, чтобы они были максимально естественными и создавали ощущение чуть большего разрешения, чем на самом деле.
Чтобы чутка упростить себе жизнь, большая часть различных преобразований, забивая гвозди микроскопом - выполнена в матлабе. Все варианты точек разрешения 4х2 в тайле 8х8 были размазаны фильтром и обратно биннаризованы. Вот для примера, как это происходит, тайл 00110010 сначала размывается, потом опять биннаризируется и "ступеньки" получаются чуть более сглаженными. А также на рисунке ниже - все варианты тайлов грубые и сглаженные.
Дальше нужно было решить магию, как получившийся объем из 2200+ кадров уместить в размер хотя бы одной дискеты, не более чем 720кБ. Каждый кадр теперь это 32*24 = 768 байт или на видео 1.5Мбайт. Нужно было бы придумать очень простой вариант кодера. После переборки нескольких вариантов было решено ввести следующие четыре состояния битового потока: рисовать белым (код 0b00), рисовать черным (0b11), отрисовать следующие N пикселей текущим пером (0b01) и отрисовать в текущем тайле следующий в потоке 8 битный символ (0b10). Такая простая реализация кодирования позволила реализовать на Z80 простой декодер и уменьшить объем данных с 1500кБ до 320кБ.
В самой реализации кода под Z80 MSX все относительно просто:
инициализация
чтение первичного 16кБ буфера видео
основной цикл
ожидание кадрового импульса
вывод следующего семпла звука
отображение следующей части кадра в текущем видео буфере
чтение данных из буфера
декодирование
отрисовка тайла (пересылка в видеопроцессор(VDP)-память(VRAM))
если осталось время - дозаполнение буфера видео с дискеты
конец основного цикла
Результатом всего этого действа стала первая Bad Apple демо как для MSX-2, так и для более простых MSX машин. =) Хочу выразить признательность организаторам Chaos Construction 2021 за возможность представить эту работу общественности на демопати!
приятного просмотра:
Файл демо можно скачать на poeut.net:
или посмотреть в web player msx online:
или посмотреть, как в Японии играет демо на MX-10 (одна из самых простых версий первых MSX компьютеров)
Хочу выразить признательность всему сообществу MSX, которое меня поддерживало и помогло влиться в архитектуру MSX за такое короткое время: Страйстару, Дельфину и Серому, а так же всем в сообществе world_of_msx и канала дискорд "MSX по-русски!", без вас я бы не смог и большей части кода реализовать, и уж тем более ту хорошую оптимизацию по чтению и отображения данных, что получилась в этой работе.
В дополнение: что для себя я вынес работая над этой демо: оказывается, ранее, в играх 80х для MSX, вполне могла бы быть доступна возможность отображения аналогичного видео в заставках, между уровнями, что добавило бы им некоторой изюминки. =)
В дополнение 2: можно ли сделать данную реализацию более качественной? Да, безусловно, но, к сожалению, на все не хватает времени. Фактически в видео из 256 тайлов не используются совсем 13 тайлов и около 25 используются однократно, такие тайлы можно (и нужно) использовать для повышения разрешения наиболее востребованных элементов изображения. Также возможны дополнительные математические оптимизации, но это пусть будет в других работах.
Автор:
Pyhesty