Можно поточне: каким редактором wham делалась мелодия? Вероятно wham! у вас для AY\YM (для 128к машин). Глянул мельком на него, там по-моему нет режима компиляции always (позволяющего играть музыку параллельно выполняя что-то еще).
В 48к версии была такая функция. Для инициализации мелодии выполнить randomize usr n, для проигрывания следующей ноты randomize usr n+12. О втором адресе для данного режима, почему-то нигде в программе не говорится!
----
Там все довольно тривиально:
Два бейсик файла - билдер im2 и демонстрашка.
Для работы кроме бейсик файла, у вас должна быть скомпилированная мелодия с плейером и обрабочик im2 созданный с помощью первой программы под ваши адреса.
Для 48к версии (под бипер) при компиляции в режиме always с адресом запуска 42000 - это числа 42000, 0, 42012. Правда, скорее всего придется отрегулировать темп, занося значения в ячейку 42035!
Принцип работы:
первым вводим адрес вызываемый при запуске im2. В кодах это выглядит как:
Код:
di ; запретить прерывания
call nn ;адрес вызова процедуры, аналог randomize usr nn
ld a,m ;число m, вектор прерываний
ld i,a
im 2 ;включение режима
ei ;разрешить прерывания
ret
вторым вводится адрес вызываемый при остановке im2:
Код:
di
call nn ;то же, что и выше, но по другому адресу
ld a,3F ;установка вектора прерываний для нормальной работы в tr-dos
ld i,a
im 1 ;выключение режима
ei
ret
третьим вводится адрес вызываемый при работе im2.
Код:
push ix ;cохраняются на стеке значения всех регистры процессора
push iy
push bc
push de
push hl
push af
exx
push bc
push de
push hl
ex af,af'
push af
call nn ;адрес вызываемый каждое прерывание
pop af ;восстанавливаются значения регистров процессора
pop hl ;до момента прихода прерывания
pop de
pop bc
ex af,af'
pop af
exx
pop hl
pop de
pop bc
pop iy
pop ix
jp 38 ;переход по стандартному адресу обработки прерывания im1 (команда rst 56).
Если вызывать ничего не надо (т.е. переход на адрес программы в кодах при запуске или остановке im2 не нужен), вводим 0. Это не будет расценено, как call 0 - будут использованы два nop'а.
последним вводится адрес распололжения обработчика в памяти. Из-за особенностей режима im2 (и написанного мною билдера) возможны несколько вариантов:
+ использование вектора из ПЗУ.
+ смещение процедуры к ближайщему возможному адресу (клавиша 1 или 2) либо выбор иного адреса (клавиша 3).
После ввода всех значений должен появиться экран, в первых трех строках которого указаны адреса описанные выше, адрес начала программы, обработчика прерываний, запуска и остановки режима im2. В последних строчках первая занимаемая программой ячейка памяти и длина программы.
замечание: поскольку im2 используется системой tr-dos. Перед вызовом ее команд или входом (по usr 15619 или usr 15616), должна запускаться подпрограмма остановки im2.
----
Думаю, доработать данную программулину, чтобы было более просто и наглядно. А главное универсально, например вместо ссылок на подпрограммы в кодах, подгрузка и интеграция в обработчик.. Планов, в целом - громадье!
Сообщение от
Andrey Vladimirovich
И что нужно сделать что бы она была "завершенная"?
Не совсем понятно, что под этим подразумевается?