Sound System
Posted: Sun, 15.03.2015 17:03:50
Модуль ПДП звуковой карты на VHDL для CPU0 в конфигурации ReVerSE-U16 QuadSpeccy (см. в приложении). Сейчас дизайн DMA Sound занимает около 2К LE.
Исходники (ссылка).
Реализовано 8-мь звуковых канала, каждый играет 8-разрядный (signed) звуковой образ (при необходимости в дальнейшей версии может быть расширен). Индивидуальная частота, громкость, стартовая позиция и длина. Возможность зацикливания (loop) с произвольного места.
Для управления звуком выбран диапазон портов 0x0050-0x8250 (младший байт всегда 0x50).
Управление каналами:
0x8050: Стерео микшер 0-7 (7..0) т.е. биты (3..0)=1 то каналы 0-3 (правые) слышны ещё и слева, если биты (7..4)=1 то каналы 4-7 (левые) слышны ещё и справа.
0x8150: Зацикливание каналов 0-7 (7..0) т.е. бит 0=1 разрешает зацикливание канала 0
0x8250: Разрешает работу каналов 0-7 (7..0) т.е. бит 0=1 разрешает работу канала 0. Чтение порта возвращает текущее состояние каналов, т.е. если бит 0=1 то канал 0 работает. Если бит 0=0, то канал закончил работу.
Канал 0:
0x0050: Стартовый адрес (7..0) т.е. 0x000000-0xFFFFFF
0x0150: Стартовый адрес (15..8)
0x0250: Стартовый адрес (23..16)
..
0x0450: Длина (7..0) т.е. 0x000000=1 байт .. 0xFFFFFF=0x1000000 байт
0x0550: Длина (15..8)
0x0650: Длина (23..16)
..
0x0850: Частота (7..0) т.е. 0=3,5MHz .. 65535=53,4..Hz
0x0950: Частота (15..8)
0x0A50: Громкость (5..0) т.е. 0=минимальная .. 63=максимальная
Канал 1:
0x1050: Стартовый адрес (7..0) т.е. 0x000000-0xFFFFFF
0x1150: Стартовый адрес (15..8)
0x1250: Стартовый адрес (23..16)
..
0x1450: Длина (7..0) т.е. 0x000000=1 байт .. 0xFFFFFF=0x1000000 байт
0x1550: Длина (15..8)
0x1650: Длина (23..16)
..
0x1850: Частота (7..0) т.е. 0=3,5MHz .. 65535=53,4..Hz
0x1950: Частота (15..8)
0x1A50: Громкость (5..0) т.е. 0=минимальная .. 63=максимальная
и так далее...
В общем требуется тестирование и разработка проигрывателя. Сейчас пока можно испытать работу с BASIC, программка в приложении.
Исходники (ссылка).
Реализовано 8-мь звуковых канала, каждый играет 8-разрядный (signed) звуковой образ (при необходимости в дальнейшей версии может быть расширен). Индивидуальная частота, громкость, стартовая позиция и длина. Возможность зацикливания (loop) с произвольного места.
Для управления звуком выбран диапазон портов 0x0050-0x8250 (младший байт всегда 0x50).
Управление каналами:
0x8050: Стерео микшер 0-7 (7..0) т.е. биты (3..0)=1 то каналы 0-3 (правые) слышны ещё и слева, если биты (7..4)=1 то каналы 4-7 (левые) слышны ещё и справа.
0x8150: Зацикливание каналов 0-7 (7..0) т.е. бит 0=1 разрешает зацикливание канала 0
0x8250: Разрешает работу каналов 0-7 (7..0) т.е. бит 0=1 разрешает работу канала 0. Чтение порта возвращает текущее состояние каналов, т.е. если бит 0=1 то канал 0 работает. Если бит 0=0, то канал закончил работу.
Канал 0:
0x0050: Стартовый адрес (7..0) т.е. 0x000000-0xFFFFFF
0x0150: Стартовый адрес (15..8)
0x0250: Стартовый адрес (23..16)
..
0x0450: Длина (7..0) т.е. 0x000000=1 байт .. 0xFFFFFF=0x1000000 байт
0x0550: Длина (15..8)
0x0650: Длина (23..16)
..
0x0850: Частота (7..0) т.е. 0=3,5MHz .. 65535=53,4..Hz
0x0950: Частота (15..8)
0x0A50: Громкость (5..0) т.е. 0=минимальная .. 63=максимальная
Канал 1:
0x1050: Стартовый адрес (7..0) т.е. 0x000000-0xFFFFFF
0x1150: Стартовый адрес (15..8)
0x1250: Стартовый адрес (23..16)
..
0x1450: Длина (7..0) т.е. 0x000000=1 байт .. 0xFFFFFF=0x1000000 байт
0x1550: Длина (15..8)
0x1650: Длина (23..16)
..
0x1850: Частота (7..0) т.е. 0=3,5MHz .. 65535=53,4..Hz
0x1950: Частота (15..8)
0x1A50: Громкость (5..0) т.е. 0=минимальная .. 63=максимальная
и так далее...
- Code: Select all
DS_CH0_ADDRESS equ #0050
DS_CH0_LENGTH equ #0450
DS_CH0_TIMER equ #0850
DS_CH0_VOLUME equ #0A50
DS_CH_MIXING equ #8050
DS_CH_LOOP equ #8150
DS_CH_ENABLE equ #8250
;Опрос наличия DMA-SOUND
Test xor a ;запретить работу каналов 0-7
ld bc,DS_CH_ENABLE ;порт DMASOUND_EN_CH
out (c),a ;запись в порт
in a,(c) ;чтение
or a ;0?
jr z,Player ;DMA-SOUND отсутствует
noDMA
ret
;Проигрывание семпла
ch0_rate equ 16 ;частота выборки 16кГц
ch0_adr15to0 equ #0000 ;линейный адрес, т.е.
ch0_adr23to16 equ #00 ;0x000000-0x003FFF=стр.0 и т.д.
ch0_len15to0 equ #2000 ;длина семпла 8кБ, т.е.
ch0_len23to16 equ #00 ;0x002000
ch0_volume equ #3F ;максимальная громкость
channel_enable equ %00000001 ;разрешаем канал 0
Player ld a,ch0_adr23to16
ld hl,ch0_adr15to0
ld bc,DS_CH0_ADDRESS
call Port_out
ld a,ch0_len23to16
ld hl,ch0_len15to0
ld bc,DS_CH0_LENGTH
call Port_out
ld a,ch0_volume
ld hl,3500/ch0_rate
ld bc,DS_CH0_TIMER
call Port_out
ld a,channel_enable
ld hl,#0101 ;зацикливаем, будет слышен и слева
ld bc,DS_CH_MIXING
Port_out
out (c),l
inc b
out (c),h
inc b
out (c),a
ret
В общем требуется тестирование и разработка проигрывателя. Сейчас пока можно испытать работу с BASIC, программка в приложении.