Решил тут ещё немного поколупаться с DOS, в результате чего родился плеер треков в формате MPT (Atari Music ProTracker) да да, всем так нравилось это слово, что протрекер есть везде 

Сначала загружается сама программа, затем бинарь MPT-плеера (в будущем можно сделать детект и подгружать разные плееры).
В качестве аргумента указываем имя музыки.
На бордюре такты, по любой клавише выход.
Из интересного, в Millfork есть пример для этого плеера, но он немного некорректен. Во первых исходный XEX занимает аж 38кб, поскольку сама программа и плеер с музыкой «размазаны» по памяти, выгружается такой огромный брикет. А во вторых, пропускаются 6 байт при импорте файлов:
Код:
const array player @ ADDRPLA = file("data/mpt_player.obj", 6)
Почему их было не обрезать сразу при создании мне не ясно. В принципе я нашел плеер MPT в исходниках, так что можно подумать об оптимизации.
Кроме того походу пьесы автор не разобрался как управлять плеером, и вместо того что бы подать команду 2 (остановить) он глушит цифровые каналы (да-да плеер умеет в дигитал).
В сырках я перевёл команды плеера:
Код:
// commands, A:
// 0 - инициализация. в регистрах Y-младший и X-старший байт адреса музыкальных данных.
// 1 - воспроизвести инструмент, номер которого находится в битах 4-0 рег.X,
// в битах 7-6 рег.X - номер канала, на котором должен быть сыгран этот инструмент,
// а в рег.Y-номер ноты инструмента, с C-1 - $00, c#1 - $01.
// 2 - остановить воспроизведение музыки, без каких-либо параметров.
// 3 - воспроизвести паттрен, номер которого находится в битах 5-0 рег.X,
// в битах 7-6 рег.X - номер канала, а рег.Y - транспозиция канала.
// 4 - начать воспроизведение музыки. В рег.X - номер позиции начала, а рег.Y - биты 0-3 какой из
// каналов должен быть выключен (0 - 3й, 1 - 2й, 2 - 1й, 3 - 0й канал = 1 выключен)
// 5 - воспрозвести цифровой семпл, в регистрах Y-младший и X-старший байт адреса таблици, в которой
// находится список адресов расположения семплов.
// 6 - воспроизведение цифровой музыки, в рег.X bit 0 = 1 - 15kHz, 0 - 8kHz
// 7 - воссоздаёт(?) цифровой семпл, номер которого в рег.Y(0-F), в рег.X bit0 - 15kHz, bit7-6 номер канала