Сейчас витает у меня одна идея... скорей похожая на бред.
Смысл такой - самая "дибильная" команда во всех кодерах - это переход на следующий цикл вывода.
Т.е. Либо оно выглядит так:
Out (c),X
Ret - аж целых десять тактов при 12 вывода
либо
Out (c),X
.. - здесь какие то вычисления для перехода, что по определению больше или равно 4 тактам
Jp (HL) - ещё 4 такта, итого 8
Вот я долго думал как избавиться - и пришёл к единственному выводу - это просто убрать Ret.
:-D
Теперь вывод звука идёт без Ret!
А для этого программа кодер генерирует готовый Z80 код - т.е. команды типа Out (c),X NOP и прочие для забивки тактами для тактовых промежутков:
Out (c),d ; подъём динамика
Nop ; задержка 4 такта, пока не займёт нужное положение
Out (c),c ; опускание
Inc hl ; пауза 6 тактов, hl вообще никак не используется - только регистры С и D пользуются популярностью
Out (с),d ; здесь сразу после подъёма должно идти опускание без паузы
Out (c),c ; оно и есть
Nop
Nop ; пауза 8 тактов на опускание
Out (c),d ; очередной подъём
и т.д. - именно такое будет генерировать программа кодер
Единственное, что меня сдерживает - что этот код будет жутко неоптимальный - около 2-3 секунд проигрывания на всё тело в памяти около 1 метра - зато он будет максимально точный. Кроме того, в отличие от предыдущих версий он имеет возможность (по крайней мере теоретически) распаковываться после загрузки, т.е. фактически полный диск займёт около 20-30 секунд звучания, после каждой отгрузки будет распаковка в память и само проигрывание.
Ага, чуть не забыл
Фишка в том, что почти все предыдущие (кроме песни бабы яги) самплы были в постоянным размером цикла, тут нет. Тут раземр цикла непостоянен, зато очень ... быстр что ли.
Т.е. дискретность следующая:
Первый вывод в порт, поэтому само собой длина при длительности размера цикла равной 1 равна 12 тактам - Out (c),X
Длительность цикла при размере 2 - 16 тактов - Out (c),X и Nop
и далее идёт добавление под два такта -
3 размер - 18 тактов
4 - 20
5 - 22
6 - 24 и т.д., причём так как генерируется готовый код, то ограничений по размеру цикла нет - хоть 493859836986й размер ((((((-; Огромные промежутки (они возможны только теоретически, практически они просто не встречаются) можно кодировать даже командами циклов типа ld b,12 djnz $




Ответить с цитированием