?login_element?

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download

  1. ;-Minimal ayFX player2 v0.16 20.06.06--------------------------;
  2. ; cropped for Hardy                                            ;
  3. ;                                                              ;
  4. ; Простейший плеер эффектов. Проигрывает эффекты на одном AY,  ;
  5. ; в канале B.                                                  ;
  6. ; Процедура проигрывания использует регистры AF,BC,DE,HL,IX.   ;
  7. ;                                                              ;
  8. ; Запуск эффекта:                                              ;
  9. ;   ld a, номер эффекта (0..127)                               ;
  10. ;   call AFXPLAY                                               ;
  11. ;                                                              ;
  12. ; В обработчике прерывания:                                    ;
  13. ;   call AFXFRAME                                              ;
  14. ;                                                              ;
  15. ;--------------------------------------------------------------;
  16.  
  17.  
  18. ;--------------------------------------------------------------;
  19. ; SFXFRAME: Проигрывание текущего кадра.                       ;
  20. ; Параметров не имеет.                                         ;
  21. ;--------------------------------------------------------------;
  22.  
  23.         jp SFXPLAY
  24.  
  25. SFXFRAME
  26. ;487t, включая call..ret
  27. sfxaddr=$+1
  28.         ld hl,0
  29.         ld a,h
  30.         or a
  31.         ret z
  32.  
  33.         ld bc,0xfffd
  34.         LD E,(HL)          ;берём значение информационного байта
  35.         INC HL
  36.         ld a,9
  37.         OUT (C),A ;выбрали регистр громкости
  38.         LD A,E
  39.         AND #0F
  40.         LD B,0xbf
  41.         OUT (C),A                    ;собственно вывод громкости
  42.  
  43.         BIT 5,E                         ;будет изменение тона?
  44.         jr Z,afxFrame_toneq;afxFrame_nochtone          ;тон не изменяется
  45.         LD A,(HL)
  46.         LD (sfxtoneL),A
  47.         INC HL
  48.         LD A,(HL)
  49.         LD (sfxtoneH),A
  50.         INC HL ;7(jr)+7+13+6+7+13+6 = 59t
  51. afxFrame_toneq
  52.         ld a,2
  53.         LD B,#FF                        ;выводим значения тона
  54.         OUT (C),A
  55.         LD B,0xbf
  56. sfxtoneL=$+1
  57.        LD D,0 ;младший байт тона может быть 0xfe!!!
  58.         OUT (C),D
  59.         INC A
  60.         ld b,0xff
  61.         OUT (C),A
  62.         LD B,0xbf
  63. sfxtoneH=$+1
  64.        LD D,0
  65.         OUT (C),D
  66.         BIT 6,E                         ;будет изменение шума?
  67.        
  68.         jr Z,afxFrame_nochnoise          ;шум не изменяется
  69.         LD A,(HL)                       ;читаем значение шума
  70.         INC HL
  71.         SUB #20 ;7+7+6+7 = 27t
  72.        
  73.         jr nc,afxFrame_endsfx
  74. ;меньше #20, играем дальше
  75.         LD B,0xFF
  76.         LD D,6
  77.         OUT (C),D
  78.         LD B,0xbf
  79.         OUT (C),A                        ;вывод значения шума
  80.          ;7(jr)+7+7+12+7+12 = 52t
  81. afxFrame_noiseq
  82.         ld a,e
  83.         rrca                          ;сдвигаем флаги TN
  84.         rrca                           ;сдвигаем флаги TN
  85.         rrca                           ;сдвигаем флаги TN
  86.         ld e,a
  87.         LD B,0xFF                     ;читаем регистр микшера
  88.         LD A,7
  89.         OUT (C),A
  90.         IN A,(C)
  91.         XOR E                          ;накладываем флаги канала
  92.          AND %11101101
  93.         XOR E
  94.         LD B,0xbf
  95.         OUT (C),A                      ;выводим обратно в микшер ;может быть 0xfe!!!
  96.         LD (sfxaddr),hl                ;сохраняем изменившийся адрес
  97.         ret
  98.  
  99. afxFrame_endsfx
  100.          add hl,hl
  101.          inc hl
  102.         LD H,A                          ;иначе конец эффекта =0
  103.         LD E,#90                ;выключаем тон и шум в микшере
  104.         jr afxFrame_noiseq ;12(jr)+ 11+6+ 4+7+12 = 52t
  105. afxFrame_nochnoise
  106.          jr $+2
  107.          jr $+2
  108.          jr $+2
  109.          jr $+2
  110.          ld a,(hl)
  111.         jr afxFrame_noiseq ;12(jr)+ 48+7+ 12 = t (=27+52)
  112.  
  113. ;--------------------------------------------------------------;
  114. ; Запуск эффекта на свободном канале. При отсутствии           ;
  115. ; свободных каналов выбирается наиболее давно звучащий.        ;
  116. ; Вход: A = номер эффекта 0..255                               ;
  117. ;--------------------------------------------------------------;
  118.  
  119. SFXPLAY
  120.         add a,a
  121.         add a,+(sfx+1)&0xff
  122.         ld l,a
  123.         adc a,+(sfx+1)/256
  124.         sub l
  125.         ld h,a
  126.         LD C,(HL)
  127.         INC HL
  128.         LD B,(HL)
  129.         ADD HL,BC                    ;адрес эффекта получен в hl
  130.         ld (sfxaddr),hl
  131.         ret
  132.