Набросал проигрыватель PSG-файлов:
Исходник + мелодия + готовый RKS во вложении.
Набросал проигрыватель PSG-файлов:
Исходник + мелодия + готовый RKS во вложении.
Последний раз редактировалось CityAceE; 22.06.2025 в 21:16.
С уважением, Станислав.
Поправил ошибки в тексте проигрывателя, так как кое-что парсилось неверно и, соответственно, проигрывалось неправильно:
Код:; 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
С уважением, Станислав.
Поэкспериментировал с индикацией:
Мелодия играет вот эта.
Последний раз редактировалось CityAceE; 23.06.2025 в 14:09.
С уважением, Станислав.
Mick(23.06.2025)
CityAceE(23.06.2025)
В Emu80 есть возможность включить прерывания для Специалиста. Поэкспериментировал и с этим режимом. Проигрывание музыки и перемещение бегущей строки синхронизировано по прерываниям. Но, так как эти прерывания в Emu80 никак не синхронизированы с кадрами, имеет место тиринг...
Последний раз редактировалось CityAceE; 24.06.2025 в 21:25.
С уважением, Станислав.
А в режиме МХ не пробовал, вроде там цвет поинтереснее?
- - - Добавлено - - -
Кстати, поглядел схему цвета в Спеце, которая восьмицвет, то там вроде при доработке звук переносится на выход INTE процессора. Это наверное не очень полезно для введения прерывания.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)