Advertisement
Guest User

Untitled

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