А вот так выглядит программа вывод звуковых эффектов в игре. Компьютер ZX Specturm 128K, звуковой синтезатор AY8910, язык программирования Cmm (ассемблер стилизованный под Си).

// Константы музыкального синтезатора

const int ayAddrPort = 0xFFFD;
const int ayPortAddrHigh = ayAddrPort >> 8;
const int ayDataPort = 0xBFFD;
const int ayPortDataHigh = ayDataPort >> 8;
const int ayRegToneAL = 0;
const int ayRegToneAH = 1;
const int ayRegToneBL = 2;
const int ayRegToneBH = 3;
const int ayRegToneCL = 4;
const int ayRegToneCH = 5;
const int ayRegNoiseTone = 6;
const int ayRegMixer = 7;
const int ayRegVolumeA = 8;
const int ayRegVolumeB = 9;
const int ayRegVolumeC = 10;
const int ayMixerToneA = 0x01;
const int ayMixerToneB = 0x02;
const int ayMixerToneC = 0x04;
const int ayMixerNoiseA = 0x08;
const int ayMixerNoiseB = 0x10;
const int ayMixerNoiseC = 0x20;

// Константы формата хранения звуковых эффектов

const int fxTeminator = 0x20; //! Лучше использовать значение fxFlagSetTone без fxFlagTone
const int fxFlagNoise = 0x10; //! Лучше, что бы позиция бит повторяла регистр AY
const int fxFlagSetTone = 0x20;
const int fxFlagSetNoise = 0x40;
const int fxFlagTone = 0x80;

const int fxChannel = 2;  // Выводить эффекты в этот канал AY

uint16_t fxPtr = 0; // Адрес в памяти звучащего эффекта.

void fxInit()
{
    musicInit();
    musicTick();
    fxPtr = hl = 0;
}

void fxTick()
{
    // Музыкальный проигрыватель загрузит регистры синтезатора следующими значениями.
    musicTick();

    // Указатель на звучащий в данный момент эффект в регистр HL.
    hl = fxPtr;

    // Нужно ли запустить новый эффект?
    a = gFx;
    if (a != 0)
    {
        // Вычисление адреса эффекта. Аналог hl = fxTable[a - 1].
        a += a;
        l = (a += [&fxTable - 2]);
        h = ((a +@= [(&fxTable - 2) >> 8]) -= l);
        a = *hl; hl++; h = *hl; l = a;

        // Сброс переменной gFx.
        gFx = (a ^= a);
    }

    // Если никакой эффект не воспроизводится, то выходим.
    if (flag_z (a = h) |= l) return;

    // Считываем первый байт содержащий громкость и флаги
    e = *hl; hl++;

    // Записываем флаги в регистр микшера. Регистр микшера пока хранится в D.
    d = 0xFF;
    if (e & fxFlagTone) d &= [0xFF ^ (ayMixerToneA << fxChannel)];
    if (e & fxFlagNoise) d &= [0xFF ^ (ayMixerNoiseA << fxChannel)];

    // Запись в регистр громкости
    bc = ayAddrPort; a = [ayRegVolumeA + fxChannel]; out(bc, a);
    b = ayPortDataHigh; (a = e) &= 0x0F; out(bc, a);

    // Запись в регистр тона, если установлен соответствующий флаг
    if (e & fxFlagSetTone)
    {
        b = ayPortAddrHigh; a = [ayRegToneAL + fxChannel * 2]; out(bc, a);
        b = ayPortDataHigh; a = *hl; hl++; out(bc, a);
        b = ayPortAddrHigh; a = [ayRegToneAH + fxChannel * 2]; out(bc, a);
        b = ayPortDataHigh; a = *hl; hl++; out(bc, a);
    }

    // Необходимо изменить шум
    if (e & fxFlagSetNoise)
    {
        a = *hl; hl++;

        // Значение шума больеш fxTeminator является терминатором
        if (a >= fxTeminator)
        {
            fxPtr = hl = 0;
            return;
        }

        // Запись шума в регистр
        b = ayPortAddrHigh; e = ayRegNoiseTone; out(bc, e);
        b = ayPortDataHigh; out(bc, a);
    }

    // Запись в регистр микшера отдельных бит
    b = ayPortAddrHigh; a = ayRegMixer; out(bc, a);
    a = in(bc);
    a |= [(ayMixerToneA << fxChannel) | (ayMixerNoiseA << fxChannel)];
    a &= d;
    b = ayPortDataHigh;
    out(bc, a);

    // Сохранение указателя
    fxPtr = hl;
}

А вот результат компиляции.

    ; music/fx2.c:2 
    ; music/fx2.c:3 const int ayAddrPort = 0xFFFD;
    ; music/fx2.c:4 const int ayPortAddrHigh = ayAddrPort >> 8;
    ; music/fx2.c:5 const int ayDataPort = 0xBFFD;
    ; music/fx2.c:6 const int ayPortDataHigh = ayDataPort >> 8;
    ; music/fx2.c:7 const int ayRegToneAL = 0;
    ; music/fx2.c:8 const int ayRegToneAH = 1;
    ; music/fx2.c:9 const int ayRegToneBL = 2;
    ; music/fx2.c:10 const int ayRegToneBH = 3;
    ; music/fx2.c:11 const int ayRegToneCL = 4;
    ; music/fx2.c:12 const int ayRegToneCH = 5;
    ; music/fx2.c:13 const int ayRegNoiseTone = 6;
    ; music/fx2.c:14 const int ayRegMixer = 7;
    ; music/fx2.c:15 const int ayRegVolumeA = 8;
    ; music/fx2.c:16 const int ayRegVolumeB = 9;
    ; music/fx2.c:17 const int ayRegVolumeC = 10;
    ; music/fx2.c:18 const int ayMixerToneA = 0x01;
    ; music/fx2.c:19 const int ayMixerToneB = 0x02;
    ; music/fx2.c:20 const int ayMixerToneC = 0x04;
    ; music/fx2.c:21 const int ayMixerNoiseA = 0x08;
    ; music/fx2.c:22 const int ayMixerNoiseB = 0x10;
    ; music/fx2.c:23 const int ayMixerNoiseC = 0x20;
    ; music/fx2.c:24 
    ; music/fx2.c:25 // Константы формата хранения звуковых эффектов
    ; music/fx2.c:26 
    ; music/fx2.c:27 const int fxTeminator = 0x20; //! Лучше использовать значение fxFlagSetTone без fxFlagTone
    ; music/fx2.c:28 const int fxFlagNoise = 0x10; //! Лучше, что бы позиция бит повторяла регистр AY
    ; music/fx2.c:29 const int fxFlagSetTone = 0x20;
    ; music/fx2.c:30 const int fxFlagSetNoise = 0x40;
    ; music/fx2.c:31 const int fxFlagTone = 0x80;
    ; music/fx2.c:32 
    ; music/fx2.c:33 const int fxChannel = 2;  // Выводить эффекты в этот канал AY
    ; music/fx2.c:34 
    ; music/fx2.c:35 uint16_t fxPtr = 0; // Адрес в памяти звучащего эффекта.
fxPtr dw 0
    ; music/fx2.c:36 
    ; music/fx2.c:37 void fxInit()
fxInit:
    ; music/fx2.c:38 {
    ; music/fx2.c:39 musicInit();
    call musicInit
    ; music/fx2.c:40 musicTick();
    call musicTick
    ; music/fx2.c:41 fxPtr = hl = 0;
    ld   hl, 0
    ld   (fxPtr), hl
    ; music/fx2.c:42 }
    ret
    ; music/fx2.c:43 
    ; music/fx2.c:44 void fxTick()
fxTick:
    ; music/fx2.c:45 {
    ; music/fx2.c:46 // Музыкальный проигрыватель загрузит регистры синтезатора следующими значениями.
    ; music/fx2.c:47 musicTick();
    call musicTick
    ; music/fx2.c:48 
    ; music/fx2.c:49 // Указатель на звучащий в данный момент эффект в регистр HL.
    ; music/fx2.c:50 hl = fxPtr;
    ld   hl, (fxPtr)
    ; music/fx2.c:51 
    ; music/fx2.c:52 // Нужно ли запустить новый эффект?
    ; music/fx2.c:53 a = gFx;
    ld   a, (gFx)
    ; music/fx2.c:54 if (a != 0)
    or   a
    ; music/fx2.c:55 {
    jp   z, l0
    ; music/fx2.c:56 // Вычисление адреса эффекта. Аналог hl = fxTable[a - 1].
    ; music/fx2.c:57 a += a;
    add  a
    ; music/fx2.c:58 l = (a += [&fxTable - 2]);
    add  (fxTable) - (2)
    ld   l, a
    ; music/fx2.c:59 h = ((a +@= [(&fxTable - 2) >> 8]) -= l);
    adc  (+((fxTable) - (2))) >> (8)
    sub  l
    ld   h, a
    ; music/fx2.c:60 a = *hl; hl++; h = *hl; l = a;
    ld   a, (hl)
    inc  hl
    ld   h, (hl)
    ld   l, a
    ; music/fx2.c:61 
    ; music/fx2.c:62 // Сброс переменной gFx.
    ; music/fx2.c:63 gFx = (a ^= a);
    xor  a
    ld   (gFx), a
    ; music/fx2.c:64 }
    ; music/fx2.c:65 
    ; music/fx2.c:66 // Если никакой эффект не воспроизводится, то выходим.
    ; music/fx2.c:67 if (flag_z (a = h) |= l) return;
l0:
    ld   a, h
    or   l
    ret  z
    ; music/fx2.c:68 
    ; music/fx2.c:69 // Считываем первый байт содержащий громкость и флаги
    ; music/fx2.c:70 e = *hl; hl++;
    ld   e, (hl)
    inc  hl
    ; music/fx2.c:71 
    ; music/fx2.c:72 // Записываем флаги в регистр микшера. Регистр микшера пока хранится в D.
    ; music/fx2.c:73 d = 0xFF;
    ld   d, 255
    ; music/fx2.c:74 if (e & fxFlagTone) d &= [0xFF ^ (ayMixerToneA << fxChannel)];
    bit  7, e
    jp   z, l1
    res  2, d
    ; music/fx2.c:75 if (e & fxFlagNoise) d &= [0xFF ^ (ayMixerNoiseA << fxChannel)];
l1:
    bit  4, e
    jp   z, l2
    res  5, d
    ; music/fx2.c:76 
    ; music/fx2.c:77 // Запись в регистр громкости
    ; music/fx2.c:78 bc = ayAddrPort; a = [ayRegVolumeA + fxChannel]; out(bc, a);
l2:
    ld   bc, 65533
    ld   a, 10
    out  (c), a
    ; music/fx2.c:79 b = ayPortDataHigh; (a = e) &= 0x0F; out(bc, a);
    ld   b, 191
    ld   a, e
    and  15
    out  (c), a
    ; music/fx2.c:80 
    ; music/fx2.c:81 // Запись в регистр тона, если установлен соответствующий флаг
    ; music/fx2.c:82 if (e & fxFlagSetTone)
    bit  5, e
    ; music/fx2.c:83 {
    jp   z, l3
    ; music/fx2.c:84 b = ayPortAddrHigh; a = [ayRegToneAL + fxChannel * 2]; out(bc, a);
    ld   b, 255
    ld   a, 4
    out  (c), a
    ; music/fx2.c:85 b = ayPortDataHigh; a = *hl; hl++; out(bc, a);
    ld   b, 191
    ld   a, (hl)
    inc  hl
    out  (c), a
    ; music/fx2.c:86 b = ayPortAddrHigh; a = [ayRegToneAH + fxChannel * 2]; out(bc, a);
    ld   b, 255
    ld   a, 5
    out  (c), a
    ; music/fx2.c:87 b = ayPortDataHigh; a = *hl; hl++; out(bc, a);
    ld   b, 191
    ld   a, (hl)
    inc  hl
    out  (c), a
    ; music/fx2.c:88 }
    ; music/fx2.c:89 
    ; music/fx2.c:90 // Необходимо изменить шум
    ; music/fx2.c:91 if (e & fxFlagSetNoise)
l3:
    bit  6, e
    ; music/fx2.c:92 {
    jp   z, l4
    ; music/fx2.c:93 a = *hl; hl++;
    ld   a, (hl)
    inc  hl
    ; music/fx2.c:94 
    ; music/fx2.c:95 // Значение шума больеш fxTeminator является терминатором
    ; music/fx2.c:96 if (a >= fxTeminator)
    cp   32
    ; music/fx2.c:97 {
    jp   c, l5
    ; music/fx2.c:98 fxPtr = hl = 0;
    ld   hl, 0
    ld   (fxPtr), hl
    ; music/fx2.c:99 return;
    ret
    ; music/fx2.c:100 }
    ; music/fx2.c:101 
    ; music/fx2.c:102 // Запись шума в регистр
    ; music/fx2.c:103 b = ayPortAddrHigh; e = ayRegNoiseTone; out(bc, e);
l5:
    ld   b, 255
    ld   e, 6
    out  (c), e
    ; music/fx2.c:104 b = ayPortDataHigh; out(bc, a);
    ld   b, 191
    out  (c), a
    ; music/fx2.c:105 }
    ; music/fx2.c:106 
    ; music/fx2.c:107 // Запись в регистр микшера отдельных бит
    ; music/fx2.c:108 b = ayPortAddrHigh; a = ayRegMixer; out(bc, a);
l4:
    ld   b, 255
    ld   a, 7
    out  (c), a
    ; music/fx2.c:109 a = in(bc);
    in   a, (c)
    ; music/fx2.c:110 a |= [(ayMixerToneA << fxChannel) | (ayMixerNoiseA << fxChannel)];
    or   36
    ; music/fx2.c:111 a &= d;
    and  d
    ; music/fx2.c:112 b = ayPortDataHigh;
    ld   b, 191
    ; music/fx2.c:113 out(bc, a);
    out  (c), a
    ; music/fx2.c:114 
    ; music/fx2.c:115 // Сохранение указателя
    ; music/fx2.c:116 fxPtr = hl;
    ld   (fxPtr), hl
    ; music/fx2.c:117 }
    ret
    ; music/fx2.c:118