Вариант с halt правильный, вряд ли есть другой. Проблема в том, что все компоненты проекта, как и сам 1tracker, не отличаются изящным дизайном и оптимальностью. В результате постоянно получается, что минутный фикс превращается в многочасовую пляску с бубном. И это, конечно, сильно напрягает.
Есть много решений этой проблемы, но все они неудобные и некрасивые.
Можно добавлять в AY-файл полное ПЗУ (в последнее время так и делаю) и попытаться заставить работать обычный обработчик прерывания. Можно нагородить пустой IM2 где-нибудь в экранной области. И то и другое приведёт к двум веткам генерации кода — одна для трекера, вторая для экспорта, а этого очень хочется избежать. Сейчас всё просто (затрачены значительные усилия, чтобы осуществить эту схему): один ассемблерный исходник движка плюс ассемблерный вывод компилятора музыки — ассемблер — бинарник — AY-файл — опционально TAP/SCL; на всех этапах может делаться экспорт; тот же самый AY-файл играется редактором.
Можно было бы сделать условную компиляцию этого halt'а. Но её в моём ассемблере нет, и добавить — перекопать 1500 строк на AngelScript, написанных два года назад. Конечно, по-хорошему этот ассемблер требует переписывания с нуля, но это тяжёлая задача. Можно сделать хак, собирать исходник движка из двух кусков текста, вставляя между ними строку с halt при сборке не для AY-файла — опять же см. выше, и само по себе очень некрасиво.
Можно отдать определение Kempston'а на усмотрение программиста, брать на входе ещё один регистр, помимо указателя на данные музыки. Тоже сомнительное решение.
Поэтому пока мысли либо убрать опрос вообще, чтобы избавиться от головной боли, либо закомментировать определение в исходнике, и кому нужна поддержка, пусть экспортирует исходник и раскомментирует. Но тогда проблема глючного опроса в экспортированных TAP/SCL останется.
Спасибо. Посмотрел, с наскока добавить не получится, нужно много переделывать (убирать паттерны, условную компиляцию, переформатировать многострочный код), так что добавлю позже.
Вариант с halt не будет работать в 1tracker, так как в AY-файлах не гарантируется ни работающий обработчик прерываний, ни наличие ПЗУ вообще, и движок сразу же виснет. Думаю, лучше просто убрать опрос Kempston, так как желания тратить время на поиск обходных путей нет никакого.
in a,(#1f)
and #1f
ld a,OP_NOP
jr nz,$+4
ld a,OP_ORC
ld (soundLoop.checkKempston),a
а собственно проверка — такая:
.checkKey
in a,(#1f)
and #1f
ld c,a
in a,(#fe)
cpl
.checkKempston=$
or c
and #1f
jp z,readNotes
Главная проблема с этим такая: на машине без кемпстона in a,(#1f): and #1f, как правило, не ноль, так что 5 из 8 линий клавиатуры исключаются из опроса. Что особенно противно, in a,(#1f) может ещё и читать атрибуты/пикселы с плавующей шины и разрешать опрос нужной клавиши, так что опрос часто всё ещё работает, но очень плохо предсказуемо. Наконец, на машине с плавающей шиной in a,(#1f): and #1f может запросто выдать Z (допустим на чистом экране залитом чёрным по чёрному с шины читается довольно много нулей). При таком неудачливом раскладе движок вообще будет считать что клавиатура нажата почти всё время (т.е. всё время, когда in a,(#1f) сбрасывает нужные нам биты).
В Phaser2 основная проблема устранена ( in a,(#1f): ld c,a: xor a ), но тест кемпстона всё ещё не вполне надёжен. В Octode XL я сделал вот так:
ei
halt ; must ensure that test is done during the border
in a,(#1f)
inc a
jr nz,haveKempston
ld (maskKempston),a
haveKempston:
и собственно опрос
in a,(#1f)
and #1f
maskKempston: EQU $-1
ld c,a
in a,(#fe)
cpl
or c
and #1f
Проблем вроде пока не видел. Ещё в QChan была какая-то похожая проблема (столкнулся, когда собирал Dat Fuzz вместе с utz), но, емнип, там вообще опрос был немного редковат, так что там я просто развёл опрос клавиатуры и джойстика.
Я был бы очень рад если бы Octode XL появился в 1tracker. К сожалению, я слегка поправил там формат музыки (основное соображение было ничтожно ускорить переход от строки к строке и добавить ещё одну низкую ноту), так что совсем прямолинейная замена не получится. Но модификации очень простые, я даже сознательно не стал менять расчёт высоты нот, т.к. это убило бы старые октодовские треки, настроенные детьюном.
Для тех, кто заинтересован разобраться во внутреннем устройстве биперных движков, utz недавно написал весьма подробный гайд на английском языке: randomflux.info/1bit/viewtopic.php?id=21
DenisGrachev , офигенная дема!
Жаль, в этом году выбраться не получилось, но по видео и продам — пати получилась замечательной, хоть уже не просто попойка :)
Ведущему — +100 в карму! :D
Быстрый вопрос: а почему было принято решение так жёстко связаться с конкретным движком? из-за числа каналов? Мне просто кажется, что некий промежуточный формат мог бы быть полезен, чтобы добавить возможность подбора ещё и движка, который бы давал наиболее подходящий звук.
Я как заворожённый наблюдаю за каждой новостью о биперной музыке и как зачарованный слушаю каждый новый биперный трек. Для меня это — непостижимая магия. Всем, что связано со спектрумовским бипером, я восхищаюсь даже больше, чем некоторым кододрочерством в области эффектов.
Но я совершенно в этом не разбираюсь. Для меня загадка, как вы всё это делаете.
Поэтому просто спасибо.
Очень хорошая новость — я давно выцеливался сделать одну маленькую вещь в Phaser, но мне не хватало второго голоса в Phaser1, чтобы взять аккорд, и не хватало яиц, чтобы осилить Phaser2 в голом виде.
Вопрос по касательной — раз обновилась версия 1tracker, нет ли желания обновить движки немного? Дело в том, что тесты клавиатуры в нескольких движках (Phaser2, Octode) могут работать ненадёжно на машинах с плавающей шиной. Я могу сделать поправки в коде, там всё довольно тривиально в общем, просто чтобы потом не фиксить индивидуальные треки.
Есть много решений этой проблемы, но все они неудобные и некрасивые.
Можно добавлять в AY-файл полное ПЗУ (в последнее время так и делаю) и попытаться заставить работать обычный обработчик прерывания. Можно нагородить пустой IM2 где-нибудь в экранной области. И то и другое приведёт к двум веткам генерации кода — одна для трекера, вторая для экспорта, а этого очень хочется избежать. Сейчас всё просто (затрачены значительные усилия, чтобы осуществить эту схему): один ассемблерный исходник движка плюс ассемблерный вывод компилятора музыки — ассемблер — бинарник — AY-файл — опционально TAP/SCL; на всех этапах может делаться экспорт; тот же самый AY-файл играется редактором.
Можно было бы сделать условную компиляцию этого halt'а. Но её в моём ассемблере нет, и добавить — перекопать 1500 строк на AngelScript, написанных два года назад. Конечно, по-хорошему этот ассемблер требует переписывания с нуля, но это тяжёлая задача. Можно сделать хак, собирать исходник движка из двух кусков текста, вставляя между ними строку с halt при сборке не для AY-файла — опять же см. выше, и само по себе очень некрасиво.
Можно отдать определение Kempston'а на усмотрение программиста, брать на входе ещё один регистр, помимо указателя на данные музыки. Тоже сомнительное решение.
Поэтому пока мысли либо убрать опрос вообще, чтобы избавиться от головной боли, либо закомментировать определение в исходнике, и кому нужна поддержка, пусть экспортирует исходник и раскомментирует. Но тогда проблема глючного опроса в экспортированных TAP/SCL останется.
Исходник модифицированного конвертора xm2octodexl.cpp лежит там в папке «other».
а собственно проверка — такая:
Главная проблема с этим такая: на машине без кемпстона in a,(#1f): and #1f, как правило, не ноль, так что 5 из 8 линий клавиатуры исключаются из опроса. Что особенно противно, in a,(#1f) может ещё и читать атрибуты/пикселы с плавующей шины и разрешать опрос нужной клавиши, так что опрос часто всё ещё работает, но очень плохо предсказуемо. Наконец, на машине с плавающей шиной in a,(#1f): and #1f может запросто выдать Z (допустим на чистом экране залитом чёрным по чёрному с шины читается довольно много нулей). При таком неудачливом раскладе движок вообще будет считать что клавиатура нажата почти всё время (т.е. всё время, когда in a,(#1f) сбрасывает нужные нам биты).
В Phaser2 основная проблема устранена ( in a,(#1f): ld c,a: xor a ), но тест кемпстона всё ещё не вполне надёжен. В Octode XL я сделал вот так:
и собственно опрос
Проблем вроде пока не видел. Ещё в QChan была какая-то похожая проблема (столкнулся, когда собирал Dat Fuzz вместе с utz), но, емнип, там вообще опрос был немного редковат, так что там я просто развёл опрос клавиатуры и джойстика.
Я был бы очень рад если бы Octode XL появился в 1tracker. К сожалению, я слегка поправил там формат музыки (основное соображение было ничтожно ускорить переход от строки к строке и добавить ещё одну низкую ноту), так что совсем прямолинейная замена не получится. Но модификации очень простые, я даже сознательно не стал менять расчёт высоты нот, т.к. это убило бы старые октодовские треки, настроенные детьюном.
К слову, может быть заодно добавить и Octode XL?
Жаль, в этом году выбраться не получилось, но по видео и продам — пати получилась замечательной, хоть уже не просто попойка :)
Ведущему — +100 в карму! :D
Но я совершенно в этом не разбираюсь. Для меня загадка, как вы всё это делаете.
Поэтому просто спасибо.
Вопрос по касательной — раз обновилась версия 1tracker, нет ли желания обновить движки немного? Дело в том, что тесты клавиатуры в нескольких движках (Phaser2, Octode) могут работать ненадёжно на машинах с плавающей шиной. Я могу сделать поправки в коде, там всё довольно тривиально в общем, просто чтобы потом не фиксить индивидуальные треки.
Никакой связи, просто слово вспомнилось. =)