
Сообщение от
HardWareMan
Ничего не заметили? Хорошо, следите: внутри SAVE_BYTE биты выводятся с равномерным таймингом и он задается константой. А вот снаружи мы имеем несколько команд, которые затягивают последний сформировавшийся уровень. Отсюда каждые 8 бит имеем растягивание уровня во времени и "рваный" звук. Причем, чем выше частота, тем заметнее рваный
Ошибка на обычных константах невелика. После каждого 8-го бита добавляется не более 2-х процентов периода. Коэффициент детонации у магнитофона 4-го класса 5%. Так что это нормально и к проблемам не ведёт, т.к ошибка будет только при задержке на полпериода, т.е на 50%. Строго говоря это ошибка Попова, Зеленко и Горшкова, авторов МИКРО-80, откуда все МГ-подпрограммы и происходят. Не составляло проблемы программно выровнять паузы между фронтами.
И очень сомневаюсь, чтобы у кого-то был настолько музыкальный слух, чтобы заметить "рванность" звука. И это легко выяснить. Достаточно написать программку выдающую длинную цепочку нулевых битов. А затем дать тому, кто претендует на музыкальный слух такой же, как у Моцарта, послушать эту запись и запись пилотона СПЕЦИАЛИСТА. Пусть попробует отличить, где "рваный" тон, а где чистый.
HardWareMan, в приведенном фрагменте ошибка:
Код:
.
LOOP: LD A,(HL)
CALL SVBYTE
INC HL
DEC BC
OR A
JP NZ,LOOP
Вообще-то, для организации цикла в МГ-подпрограммах ОРИОНА, СПЕЦИАЛИСТА и РК86 в подпрограммах SV_massiv и LD_massiv используется не задание числа байтов в BC, а сравнение текущего адреса с адресом конца блока. Для чего вызывается п/п-мма CMPDH, сравнение HL и DE, выставляющая флаг Z. Это конечно сути примера не меняет, но всё же лучше реальный текст. А ошибку исправьте и я отредактирую этот пост.
А если цикл по счётчику, то чтобы не ошибаться и не вводить больше строк лучше пользоваться макрокомандой
Код:
.
LOOP MACRO ADDR
DEC BC
LD A,B
OR C
JP NZ,ADDR ; JR для Z80
ENDM