Universal PT2 player for ZX Spectrum and MSX computers Release 1 (c)2005 S.V.Bulba http://bulba.at.kz Дата выпуска: 26 февраля 2005 года Общие замечания --------------- Данный проект является очередным шагом к созданию универсального плеера для модулей ZX Spectrum Pro Tracker 2.xx-3.xx и Vortex Tracker II. В том виде, в каком он представлен в данном архиве, новый плеер призван заменить стандартный плеер компилированных PT2-модулей во всех областях, где компактность, универсальность и правильность плеера важнее скорости (это единственная характеристика, по которой данный плеер уступает стандартному). Проект начат исключительно по просьбе Spectre (автора Quick Commander), который уже давно и успешно использует аналогичный универсальный плеер для PT3-модулей. Как и в упомянутом плеере PT3, компактность нового плеера PT2 (менее 1 кб) достигается заменой табличек громкости и нот более компактными генераторами и едиными для всех каналов AY процедурами (последнее и определяет пиковую загрузку 7700-8500 тактов Z80 в зависимости от сложности модуля). Универсальность и правильность обеспечивается отсутствием ограничений по Tempo, правильным расчетом параметров портаменто (расчитанные на стадии компиляции константы портаменто игнорируются), учетом адреса компиляции модулей Phantom Family Pro Tracker v2.4 (вы можете загружать их по любому адресу). Область переменных может быть перенесена директивой ORG в любой удобное место и может быть отрезана перед сохранением на диск без ущерба целостности плеера. Сам плеер также может быть откомпилирован по любому удобному адресу. Для ассемблирования использовался ассемблер под Win32: ZXASM, Z80 cross-platform assembler version 1.4.2 (C) Copyright 1997-2002 by Ilya G. Aniskovets В исходных текстах закомментирован более быстрый вариант выборки ноты, так как, к сожалению, указанный выше ассемблер не может его ассемблировать. Файлы ----- PT2Play.asm - исходный текст для ассемблера Z80. ZX_Asms\PT2Play.h - тот же текст, адаптированный под Alasm. ZX_Asms\PT2Play.txt - тот же текст, адаптированный под ZX Asm 3.10. PT2Play - ассемблированный блок для загрузки по адресу #C000, нули в конце можно отрезать. Для того, чтобы собрать версию для MSX, необходимо закомментировать процедуру R_OUT для ZX Spectrum и раскомментировать аналогичную процедуру для MSX. Точки входа ----------- Плеер стандартен, то есть сперва нужно вызвать START (адрес загрузки), а потом каждое прерывание - START+5. Для сброса AY после окончания проигрывания можно вызвать START опять, либо START+8, которая просто глушит звук AY (это можно использовать в режиме паузы, чтобы в последствии продолжить проигрывание с того же места). Плеер не перемещаемый, используйте другой ORG перед ассемблированием, если вам нужен адрес, отличный от 49152, при этом область VARS можно поместить в любое другое удобное место. По адресу START+10 находится байт настройки и статусных флагов. Установкой бита 0 вы можете запретить плееру переходить на цикл (по окончанию проигрывания вместо перехода на цикл звук будет просто отключен). Бит 0 можно устанавливать и сбрасывать в любой момент - и до проигрывания, и во время проигрывания, так как он анализируется плеером только при переходе на цикл. Бит 7 устанавливается каждый раз после того, как плеер доиграет последнюю позицию. При этом, если зацикливание не запрещено, осуществляется переход на позицию цикла. Если бит 0 сброшен, то одновременно с установкой бита 7 на AY отправляются первые данные из позиции цикла, то есть происходит обычное зацикливание. Если необходимо, чтобы бит 7 устанавливался только при запрете зацикливания, переместите команду SET 7,(HL) после RET Z (см. подпрограмму CHECKLP). В данной сборке модуль нужно загружать сразу же после переменных плеера. Конечно, вы можете изменить это в исходнике или прямо в коде. Также можно загружать адрес модуля в HL и вызывать START+3 вместо START: LD HL,PT2ModuleAddress CALL START+3 Вызывая START, вы тем самым вызываете процедуру INIT, которая подготавливает соответсвующие таблицы грокости и нот, инициализирует проигрывание модуля, а также сбрасывает AY. Вызов PLAY без предварительного вызова INIT может привести к полному краху, тоже будет, если модуль не загружен по указанному в INIT адресу. Для проигрывания вызывайте START+5 каждые 1/50 секунды (прерывание). Во время работы процедуры проигрывания не должно быть никаких прерываний - это приведет к сбою. За этим должны следить вы сами. Например, следующий пример абсолютно корректен: CALL #C000 ;вызов init EI ;разрешение прерываний _LP HALT ;ждем очередного прерывания CALL #C005 ;вызываем play, плеер использует 8500 тактов максимум, ;поэтому маскируемых прерываний до следующего HALT быть не может XOR A ;опрос клавиатуры IN A,(#FE) CPL AND 15 JR Z,_LP ;1 первый вариант заглушки звука (возможно возобновление с того же места): CALL #C008 ;глушим звук AY ;2 второй вариант заглушки звука (возможно проигрывание только с начала): ;2 CALL #C000 ;повторный вызов init RET По адресу START+11 находится двухбайтовый указатель на текущую позицию в модуле. Чтобы узнать текущий номер позиции во время проигрывания (например, для визуализации), выполните следующий код: LD HL,(START+11) LD DE,-PT2ModuleAddress-131 ADD HL,DE Номер позиции будет в регистре HL (в нормальном модуле H всегда будет 0). Пример проигрывания без перехода на цикл: LD A,1 LD (START+10),A CALL START EI LOOP HALT CALL START+5 LD A,(START+10) RLA JR NC,LOOP RET Проигрывание с трехкратным зацикливанием: CALL START LD A,3 EI LOOP PUSH AF HALT CALL START+5 POP AF LD HL,START+10 SLA (HL) JR NC,LOOP DEC A JR NZ,LOOP CALL START+8 RET Читайте также комментарии в исходнике. Помощь ------ Несмотря на то, что данный плеер прошел ряд объективных тестов на правильность воспроизведения, автор допускает, что возможны некоторые ошибки. Если вы найдете таковые, или вы считаете нужным внести свой вклад в оптимизацию кода или просто имеете свои предложения по дальнейшему развитию плеера, пишите мне по адресу vorobey@mail.khstu.ru. Благодарности ------------- Spectre как заказчику и будущему пользователю и за помощь в оптимизации. Ивану Рощину за алгоритмы генерации таблиц тона и громкости. Alfonso D.C. aka Dioniso за информацию об MSX. Сергей Бульба 12-26 февраля 2005 года