BAD APPLE MSX
BAD APPLE MSX

Если у чего-то есть экран, то там обязана играть Bad Apple!. Именно так думал и я. Каково же было моё удивление, когда узнал, что Bad Apple не существует на MSX, и вот почему... прошу под кат...

Когда-то давным-давно моим первым компьютером стал школьный КУВТ-2, он же "Ямаха". Это как первая любовь, такая же недолгая, прошло несколько лет обучения MSX-Basic, и далее мы перешли на x286, но ощущение, что что-то осталось нереализованным на этом компьютере - осталось. Конечно же, в те годы, пятиклашками, мы не понимали, чем одни компьютеры отличались от других, но любимым времяпрепровождением было пялиться в зелёный экран и нажимать на клавиши клавиатуры, а также иногда играть в USAS, Vampir Killer и Metal Gear...

вот она MSX-2 моего детства, только тогда экран был зелёный...
вот она MSX-2 моего детства, только тогда экран был зелёный...

С тех пор прошло много времени, и я почему-то и не предполагал, что можно вернуться в прошлое, вновь ощутить в руках клавиатуру КУВТ-2, увидеть приветствие MSX Basic... Но внезапно, в прошлом году увидев на барахолке КУВТ, я неожиданно для себя купил её... Строго говоря КУВТ-2 - это MSX-2 в варианте поставки от Ямахи для России в учебные классы, с небольшим�� модификациями. И это классно! Так как MSX, как платформа, в мире очень распространена, а в Японии так и вообще есть культ MSX.

вот такая она  КУВТ-2, как я тебя нашел или ты нашла меня...
вот такая она КУВТ-2, как я тебя нашел или ты нашла меня...

Очевидно, что в своё время я не успел написать на ней что-то важное для себя, понять вообще, как эта Ямаха работает, и нужно было восполнить этот пробел... Но сперва нужно посмотреть, что уже есть и сыграть в любимые игры. Когда эйфория уже спала, то начался этап предметного изучения и поиска идеи, что же такого закодить. Ранее с друзьями мы уже развлекались зеленой демкой 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 сначала размывается, потом опять биннаризируется и "ступеньки" получаются чуть более сглаженными. А также на рисунке ниже - все варианты тайлов грубые и сглаженные.

Вариант "сглаживания" тайла 4х2 в тайл 8х8
Вариант "сглаживания" тайла 4х2 в тайл 8х8
Варианты тайлов слева "грубые" до сглаживания и справа - сглаженные
Варианты тайлов слева "грубые" до сглаживания и справа - сглаженные
 Пример изображения, слева представленное сглаженными тайлами, справа "грубыми"
Пример изображения, слева представленное сглаженными тайлами, справа "грубыми"

Дальше нужно было решить магию, как получившийся объем из 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 используются однократно, такие тайлы можно (и нужно) использовать для повышения разрешения наиболее востребованных элементов изображения. Также возможны дополнительные математические оптимизации, но это пусть будет в других работах.