Advertisement
dllbridge

Untitled

Jun 20th, 2025 (edited)
382
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.03 KB | None | 0 0
  1.         org     0000h
  2.  
  3. ; Инициализация
  4. 0000  F3              di                      ; Запрет прерываний
  5. 0001  31 FF FF        ld      sp,0FFFFh       ; Установка стека
  6. 0004  21 00 02        ld      hl,0200h        ; HL = исходные данные
  7. 0007  11 4C F8        ld      de,0F84Ch       ; DE = куда копировать
  8. 000A  01 5C 04        ld      bc,045Ch        ; BC = длина блока
  9. 000D  ED B0           ldir                    ; Копирование памяти
  10.  
  11. ; Основной цикл обработки звука
  12. 000F  21 91 01        ld      hl,0191h        ; HL = таблица тонов
  13. 0012  06 FF           ld      b,0FFh          ; Инициализация счетчика
  14.  
  15. ; Чтение таблицы тонов
  16. 0014  7E              ld      a,(hl)          ; Загрузка значения тона
  17. 0015  23              inc     hl              ; Следующий байт
  18. 0016  4E              ld      c,(hl)          ; Загрузка длительности
  19. 0017  23              inc     hl
  20. 0018  04              inc     b               ; Увеличить счетчик тонов
  21. 0019  A1              and     c               ; Проверка конца маркера
  22. 001A  3C              inc     a
  23. 001B  20 F7           jr      nz,0014h        ; Цикл если не конец
  24.  
  25. 001D  3A 01 F8        ld      a,(0F801h)      ; Проверка текущей позиции
  26. 0020  B8              cp      b
  27. 0021  38 04           jr      c,0027h         ; Если не достигли конца
  28. 0023  AF              xor     a               ; Сброс позиции
  29. 0024  32 01 F8        ld      (0F801h),a
  30.  
  31. 0027  CD 3A 01        call    013Ah           ; Настройка AY
  32. 002A  CD C7 00        call    00C7h           ; Обновление звука
  33. 002D  CD 1F 01        call    011Fh           ; Проверка ввода
  34.  
  35. 0030  3A 00 F8        ld      a,(0F800h)      ; Проверка статуса
  36. 0033  CB 47           bit     0,a
  37. 0035  20 07           jr      nz,003Eh        ; Если бит 0 не установлен
  38. 0037  AF              xor     a
  39. 0038  32 04 F8        ld      (0F804h),a      ; Отключить канал A
  40. 003B  32 05 F8        ld      (0F805h),a      ; Отключить канал B
  41.  
  42. 003E  3A 00 F8        ld      a,(0F800h)
  43. 0041  CB 4F           bit     1,a
  44. 0043  CC AC 00        call    z,00ACh         ; Обработка тона если бит 1=0
  45.  
  46. 0046  CD 87 00        call    0087h           ; Дополнительная обработка звука
  47.  
  48. 0049  3A 04 F8        ld      a,(0F804h)      ; Проверка состояния каналов
  49. 004C  6F              ld      l,a
  50. 004D  3A 05 F8        ld      a,(0F805h)
  51. 0050  B5              or      l
  52. 0051  CC 54 01        call    z,0154h         ; Следующий тон если оба канала выключены
  53.  
  54. 0054  18 D4           jr      002Ah           ; Главный цикл
  55.  
  56. ; Подпрограмма настройки AY (013Ah)
  57. 00C7  3E 07           ld      a,07h           ; Выбор регистра 7 (микширование)
  58. 00C9  06 FF           ld      b,0FFh
  59. 00CB  ED 79           out     (c),a
  60. 00CD  ED 78           in      a,(c)           ; Чтение текущего значения
  61. 00CF  CB BF           res     7,a             ; Сброс битов
  62. 00D1  CB B7           res     6,a
  63. 00D3  06 BF           ld      b,0BFh
  64. 00D5  ED 79           out     (c),a           ; - - - Запись нового значения
  65. 00D7  3E 0E           ld      a,0Eh           ; Настройка регистра огибающей
  66. 00D9  06 FF           ld      b,0FFh
  67. 00DB  ED 79           out     (c),a
  68. 00DD  ED 78           in      a,(c)
  69. 00DF  32 00 F8        ld      (0F800h),a      ; Сохранение статуса
  70. 00E2  C9              ret
  71.  
  72. ; Таблица тонов (начиная с 0191h)
  73. 0191  01 50 C4 10 10 10 38 00
  74. 0199  00 50 00 01 00 30 7F BF
  75. 01A1  DF EF 00 5C 06 89 0D 16
  76. ... (и т.д.)
  77.  
  78.  
  79. //////////////////////////////
  80.  
  81.  
  82. #include <stdint.h>
  83. #include <stdbool.h>
  84.  
  85. #define AY_REG_SELECT  0x07
  86. #define AY_REG_WRITE   0xFF
  87.  
  88. uint8_t memory[0x1000];  // Z80 memory space
  89.  
  90. void ay_write(uint8_t reg, uint8_t val)               // Select AY register
  91. {
  92.  
  93.     out(AY_REG_SELECT, reg);
  94.     out(AY_REG_WRITE , val);                       // Write value to selected register
  95. }
  96.  
  97. void main()
  98. {
  99.  
  100.     asm("di");                                    // Initialize stack and copy data
  101.     uint16_t sp = 0xFFFF;
  102.     memcpy(&memory[0xF84C], &memory[0x0200], 0x045C);
  103.  
  104.     while (1)                                           // Process tone table
  105.     {
  106.         uint8_t* tone_ptr = &memory[0x0191];
  107.         uint8_t tone_count = 0;
  108.        
  109.         while (1)
  110.         {
  111.             uint8_t tone = *tone_ptr++;
  112.             uint8_t duration = *tone_ptr++;
  113.             tone_count++;
  114.            
  115.             if ((tone & duration) + 1 == 0) break;
  116.         }
  117.  
  118.         // Check if tone sequence needs reset
  119.         if (memory[0xF801] >= tone_count) {
  120.             memory[0xF801] = 0;
  121.         }
  122.  
  123.         // Update AY registers
  124.         ay_update();  // Equivalent to call 013Ah
  125.        
  126.         // Update sound output
  127.         update_sound();  // Equivalent to call 00C7h
  128.        
  129.         // Check input status
  130.         check_input();  // Equivalent to call 011Fh
  131.  
  132.         // Handle mute condition
  133.         if (!(memory[0xF800] & 0x01)) {
  134.             memory[0xF804] = 0;  // Channel A off
  135.             memory[0xF805] = 0;  // Channel B off
  136.         }
  137.  
  138.         // Process tone if needed
  139.         if (!(memory[0xF800] & 0x02)) {
  140.             handle_tone();  // Equivalent to call 00ACh
  141.         }
  142.  
  143.         // Continue sound generation
  144.         update_sound_again();  // Equivalent to call 0087h
  145.  
  146.         // Check if sound should advance
  147.         if ((memory[0xF804] | memory[0xF805]) == 0) {
  148.             next_tone();  // Equivalent to call 0154h
  149.         }
  150.     }
  151. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement