Набросал проигрыватель PSG-файлов:
https://plvideo.ru/watch?v=_EPaj7QcZzCm
Исходник + мелодия + готовый RKS во вложении.
Вид для печати
Набросал проигрыватель PSG-файлов:
https://plvideo.ru/watch?v=_EPaj7QcZzCm
Исходник + мелодия + готовый RKS во вложении.
Поправил ошибки в тексте проигрывателя, так как кое-что парсилось неверно и, соответственно, проигрывалось неправильно:
Код:; PSG Player (memory-mapped AY-3-8910) with frame delay
; https://documentation.help/AY-3-8910.12-ZX-Spectrum-ru/ay_r9zqf.htm
device zxspectrum48
org 0 ; Адрес загрузки
startprog:
ay_sel equ 0xf403 ; Выбор регистра AY
ay_wr equ 0xf401 ; Запись в регистр AY
ay_rd equ 0xf400 ; Чтение из регистра AY
delay_const equ 1633 ; Константа задержки
psg_data equ psg + 16 ; Адрес начала PSG-данных
ld hl, psg_data
loop: ld a, (hl)
cp 0xfd ; Конец?
jp z, exit
cp 0xfe ; Задержка?
jp z, delay
cp 0xff ; Явный кадр?
jp z, frame
cp 0x0e ; Регистровая пара?
jp nc, skip
ld c, 0
jp write
; FF-блок
frame: inc hl
frloop: ld a, (hl)
cp 0xfd
jp z, exit
cp 0xfe
jp z, pause
cp 0xff
jp z, pause
cp 0x0e
jp nc, skip2
ld c, 1
jp write
skip2: inc hl
skip: inc hl
jp loop
; FE XX: задержка XX*4 кадров
delay: inc hl
ld a, (hl)
rlca
rlca
ld b, a
dloop: call wait
dec b
jp nz, dloop
inc hl
jp loop
; Запись регистра обычная (C=0) или внутри FF (C=1)
write: ld a, (hl)
ld (ay_sel), a
inc hl
ld a, (hl)
ld (ay_wr), a
inc hl
ld a, c
or a
jp nz, frloop
pause: call wait
jp loop
; Простая задержка на один кадр
wait: ld de, delay_const
wloop: dec de
ld a, d
or e
jp nz, wloop
ret
; Глушим все AY-регистры 0–13 перед выходом
exit: ld c, 0
eloop: ld a, c
ld (ay_sel), a
xor a
ld (ay_wr), a
inc c
ld a, c
cp 0x0e
jp c, eloop
ret
psg:
incbin "Slash - Molodoy (1996).psg"
; incbin "Stever - Cosmozone1_cut.psg"
db 0xfd ; Дублируем маркер конца мелодии на случай, если мелодия обрезана
endprog:
savebin "ay_spec.bin", startprog, endprog - startprog
Поэкспериментировал с индикацией:
https://plvideo.ru/watch?v=a7wICGGqjxUe
Мелодия играет вот эта.
В Emu80 есть возможность включить прерывания для Специалиста. Поэкспериментировал и с этим режимом. Проигрывание музыки и перемещение бегущей строки синхронизировано по прерываниям. Но, так как эти прерывания в Emu80 никак не синхронизированы с кадрами, имеет место тиринг...
https://plvideo.ru/watch?v=7adiG7WtPmaC
А в режиме МХ не пробовал, вроде там цвет поинтереснее?
- - - Добавлено - - -
Кстати, поглядел схему цвета в Спеце, которая восьмицвет, то там вроде при доработке звук переносится на выход INTE процессора. Это наверное не очень полезно для введения прерывания.