Код, к сожалению, не очень-то подгоняется. Сложность ещё в том, что кроме кода надо подгонять частоту дискретизации WAV. Я делал так: считывал 1000 периодов настроечного тона и выводил на экран сколько за это время насчитал счётчик. Цель была получить ровно 6000 (то есть ровно 6 проходов цикла на каждый период). В зависимости от того, насколько число отличалось от 6000, исправлял частоту дискретизации WAVа. С первого раза никогда не совпадало - то недолёт, то перелёт. Приходилось последовательным приближением находить оптимальную частоту. И она никак не делится на целое число тактов процессора.
Казалось бы, что здесь могло пойти не так? Справа от всех инструкций написана их длительность в тактах. Но на практике сумма не сходится. Сильно. SOB закомментирован и не используется, так как длительность 20 тактов никуда не подходит. Вместо него DEC и BNE. Кусок длительностью 44 такта можно заменить на 56 - всё равно ничего не сходится. Непредсказуемо.
Код:; count 1000 periods
4: INC R2 ; 12 | 56
BIT R5,(R4) ; 28 |
BNE 4 ; 16 |
5: BIT R5,(R4) ; 28 | 44
BEQ 5 ; 16 |
INC R2 ; 12 | 56
BR 6 ; 16 |
6: DEC R0 ; 12 |
BNE 4 ; 16 |
; SOB R0,3 ; 20

