Решил поэкспериментировать с проигрыванием модулей PT2/PT3.
Взял исходники на ассемблере Z80 для Спектрума/MSX отсюда (PTxPlay). Убедился, что то, что компилирую я, байт в байт совпадает со вложенным бинарником.
Далее я подправил процедуру вывода на AY:
Прицепил музыку после переменных, как того требует документация, и согласно ей же приделал цикл с вызовом нот. Скомпилировал. Получил RKS, и загрузил его в эмулятор Emu80 в Специалист с Z80. По моему плану я должен был услышать музыку. Вместо я этого я получаю зависание с порчей экрана. При первичном анализе выяснил, что всё рушится уже на первоначальной процедуре инициализации проигрывателя. Дальше не копал. Конфигурация эмулятора проверена на моей адаптации Batty, то есть Z80 работает, и на предыдущем проигрывателе, то есть AY тоже звучит.Код:IF SPEC
AY_SEL equ 0xf403 ; Выбор регистра AY
AY_WR equ 0xf401 ; Запись в регистр AY
AY_RD equ 0xf400 ; Чтение из регистра AY
;Специалист
XOR A
LD HL, AYREGS ; HL = указатель на данные AY
LD C, 0x0D ; C = 13 (счётчик регистров)
LOUT:
LD (AY_SEL), A ; Выбор регистра AY (0xF403)
LD B, A
LD A, (HL) ; Читаем значение в A
LD (AY_WR), a ; Записываем в AY (0xF401)
LD A, B
INC HL ; Переходим к следующему значению
INC A ; Увеличиваем номер регистра (A++)
CP C ; Проверяем, достигли ли 13 (C=0x0D)
JR NZ, LOUT ; Если нет — повторяем
; Обработка 13-го регистра
LD (AY_SEL), A ; Выбираем регистр 13
LD A, (HL) ; Читаем его значение
AND A ; Проверяем бит 7 (для RET M)
RET M ; Если бит 7 = 1 (знак минус), возвращаемся
LD (AY_WR), A ; Иначе записываем значение регистра 13
RET
ENDIF
Вот спрашивается, что может идти не так?

