Universal PT2 and PT3 player for ZX Spectrum and MSX Release 1 (c)2004-2007 S.V.Bulba http://bulba.untergrund.net/ (http://bulba.at.kz/) Дата выпуска: 30 апреля 2007 года Общие замечания --------------- Идею дополнить возможности PT3 плеера для проигрывания PT2 модулей подкинули Иван Рощин и Андрей Богданович. Таким образом, данный плеер является продуктом слияния двух проектов: Vortex Tracker II v1.0 PT3 player for ZX Spectrum и Universal PT2 player for ZX Spectrum and MSX computers. В данной документации освещены лишь отдельные вопросы по данному продукту, поэтому прежде вам необходимо ознакомиться с документацией двух упомянутых выше проектов. Использование одного плеера для двух форматов вместо двух отдельных плееров дает только одно преимущество, коды совмещенного плеера занимают менее двух килобайт против 2,6 (1,6+1). Проигрыш по скорости несущественен при проигрывании PT3 формата, но более заметен на PT2-модулях (см. тестовые таблицы в конце исходного текста всех трех плееров). В качестве бонуса данный плеер с помощью условного ассемблирования может быть скомпилирован со следующими дополнительными функциями: 1) процедура ROUT для ZX или MSX; 2) счетчик позиций по адресу (START+11); 3) возможность менять раскладку каналов "налету"; 4) отслеживание перехода на цикл; 5) запрет официального идентификатора. Для ассемблирования использовался ассемблер под Win32: SjASM Z80 Assembler v0.39f Copyright 2005 Sjoerd Mastijn По сравнению с предыдущим выпуском произошло следующие изменения: для модулей PT3 версий 3.7 и выше теперь допускаются команды 1.xx и 2.xx, а также с помощью вложенного IF удалось сэкономить еще 5 байт в минимальной конфигурации. Файлы ----- PTxPlay.asm - исходный текст для ассемблера Z80. PTxPlay.h - тот же текст, адаптированный под Alasm. PTxPlay.txt - тот же текст, адаптированный под ZX Asm 3.10. PTxPlay - ассемблированный блок в минимальной конфигурации для ZX Spectrum с идентификатором для загрузки по адресу #C000, нули в конце можно отрезать. Точки входа ----------- Плеер стандартен, то есть сперва нужно вызвать START (адрес загрузки), а потом каждое прерывание - START+5. Для сброса AY после окончания проигрывания можно вызвать START опять, либо START+8, которая просто глушит звук AY (это можно использовать в режиме паузы, чтобы в последствии продолжить проигрывание с того же места). Перед вызовом START по адресу SETUP (START+10) нужно соответствующим образом установить бит 1, который отвечает за тип модуля: 0 для PT3 и 1 для PT2. Остальные биты можно устанавливать или тестировать в любой момент (если соответствующие функции не были отключены во время ассемблирования), подробности ниже. Тип модуля можно определить с помощью UniSearch Андрея Богдановича. Плеер не перемещаемый, используйте другой ORG перед ассемблированием, если вам нужен адрес, отличный от 49152, при этом область VARS можно поместить в любое другое удобное место. По адресу START+10 находится байт настройки и статусных флагов. Установкой бита 0 вы можете запретить плееру переходить на цикл (по окончанию проигрывания вместо перехода на цикл звук будет просто отключен). Бит 0 можно устанавливать и сбрасывать в любой момент - и до проигрывания, и во время проигрывания, так как он анализируется плеером только при переходе на цикл. Бит 1 описан выше. Биты 2-3 можно менять в любой момент для управления раскладкой каналов. Из четырех комбинаций битов разрешены только первые три: 0 - ABC, 1 - ACB, 2 - BAC. Раскладка ABC выводит звук "как есть", ACB меняет местами каналы B и C, а BAC - A и B. Таким образом, в случае стерео в центр можно поставить любой из трех каналов, то есть, охвачены все стандартные раскладки: ABC - большинство наших клонов ZX, ACB - Восточная Европа, BAC - ZS Scorpion 256K. Для получения еще, трех комбинаций стерео, поменяйте колонки местами. Биты 4-6 пока не задействованы. Бит 7 устанавливается каждый раз после того, как плеер доиграет последнюю позицию. При этом, если зацикливание не запрещено, осуществляется переход на позицию цикла. Если бит 0 сброшен, то одновременно с установкой бита 7 на AY отправляются первые данные из позиции цикла, то есть происходит обычное зацикливание. Если необходимо, чтобы бит 7 устанавливался только при запрете зацикливания, переместите команду SET 7,(HL) после RET Z (см. подпрограмму CHECKLP). В данной сборке модуль нужно загружать сразу же после переменных плеера. Конечно, вы можете изменить это в исходнике или прямо в коде. Также можно загружать адрес модуля в HL и вызывать START+3 вместо START: LD HL,PT3ModuleAddress XOR A ;PT3 LD (START+10),A CALL START+3 Вызывая START, вы тем самым вызываете процедуру INIT, которая анализирует бит типа модуля и готовит соответствующие ветки плеера, по версии PT3-модуля готовит соответствующие таблицы громкости и нот, инициализирует проигрывание модуля, а также сбрасывает AY. Вызов PLAY без предварительного вызова INIT может привести к полному краху, тоже будет, если модуль не загружен по указанному в INIT адресу. Для проигрывания вызывайте START+5 каждые 1/50 секунды (прерывание). Во время работы процедуры проигрывания не должно быть никаких прерываний - это приведет к сбою. За этим должны следить вы сами. Например, следующий пример абсолютно корректен: CALL #C000 ;вызов init EI ;разрешение прерываний _LP HALT ;ждем очередного прерывания CALL #C005 ;вызываем play, плеер использует 10500 тактов максимум, ;поэтому маскируемых прерываний до следующего HALT быть не должно XOR A ;опрос клавиатуры IN A,(#FE) CPL AND 15 JR Z,_LP CALL #C008 ;глушим звук AY (возможно возобновление с того же места) RET Если плеер ассемблирован со включенной функцией счетчика позиций, то по адресу START+11 находится байт с номером текущей позиции в модуле. Общее число позиций можно взять непосредственно из заголовка модуля или с помощью вышеупомянутой процедуры UniSearch. Пример проигрывания без перехода на цикл: LD A,1 LD (START+10),A CALL START EI LOOP HALT CALL START+5 LD A,(START+10) RLA JR NC,LOOP RET Читайте также комментарии в исходнике. Помощь ------ Несмотря на то, что данный плеер прошел ряд объективных тестов на правильность воспроизведения, автор допускает, что возможны некоторые ошибки. Если вы найдете таковые, или вы считаете нужным внести свой вклад в оптимизацию кода или просто имеете свои предложения по дальнейшему развитию плеера, пишите мне по адресу vorobey@mail.khstu.ru, в форум zx.pk.ru или в FIDO эхо-конференцию ZX.SPECTRUM. Благодарности ------------- Андрею Богдановичу aka Spectre за помощь в отладке, советы по усовершенствованию, адаптацию исходных текстов под ассемблеры ZX и процедуру UniSearch. Ивану Рощину за алгоритмы генерации таблиц тона и громкости. Alfonso D.C. aka Dioniso за информацию об MSX. Сергей Бульба 19 сентября 2004 года - 30 апреля 2007 года