Spectrum Expert #01
31 октября 1997

Программирование - адаптация игровых программ под музыкальную карту General Sound.

                                        
(С)Mike Вlum/ZX-MАSТERS СRОUР.
                              
   GENERАL'изация проrрамм.   
                              
                  I                     
                                        
                                        
               ВВЕДЕНИЕ                 
                                        
 Озвучивание под GS - весьма кропотливое
и  довольно  долгое  занятие, требующее,
кроме терпения и  возможности  доставать
музыкальное  оформление, еще и  неплохое
знание ассемблера, так  что  эта  статья
адресована прежде всего тем,  кто  отве-
чает  этим  требованиям.  Я   постараюсь
подробно  рассказать  о всей кухне  при-
готовления  озвученных игр, приведу  ряд
примеров, в т.ч.  тексты  программ,  дам
ряд советов, покажу некоторые   нюансы -
короче напишу обо всем, что поможет  вам
озвучивать игрушки.                     
                                        
                 II                     
                                        
         ВЫБОР И AНAЛИЗ ИПРЫ            
                                        
 Итак,  Вы  решили  что-нибудь  озвучить
под "GS". Давайте выберем  игру  "ТARGЕТ
RЕNЕGADЕ".Cразу возьмем полную 128К вер-
сию с музыками для AY - лучше брать вер-
сию игры уже  хорошо  озвученную,  чтобы
меньше вставлять новых  эффектов.  Далее
проходим всю игру целиком  и  выписываем
все моменты, которые  нужно  озвучить  и
компануем их в соответствии с каждым  из
пяти уровней.В каждом уровне присутству-
ют общие для всех уровней эффекты и спе-
цифические для каждого уровня.  В данном
случае это будут звуки:                 
                                        
Общие:                                  
                                        
 0. падение тел                         
 1. щелкание очков в конце уровня       
 2. + жизнь                             
 3. потеря жизни                        
 4. конец времени                       
 5. удар рукой или пинок ногой          
 6. удар после прыжка                   
 7. добивание врага                     
 8. удар в промежность с разворота или  
    коленом                             
 9. прыжок вверх                        
10. прыжок по диагонали                 
                                        
Первый уровень:                         
                                        
11. мотоцикл              (11)          
12. удар мотоциклом       (12)          
13. мах молотом           (13)          
                                        
Второй уровень:                         
                                        
14. выстрел сутенера          (11)      
15. тетка ударяет дубинкой    (12)      
16. ты ударяешь дубинкой      (13)      
17. крик тетки при падении    (14)      
                                        
Третий уровень:                         
                                        
18. мах топориком             (11)      
                                        
Четвертый уровень:                      
                                        
19. рычание собаки при нападении (11)   
20. визг собаки при умирании     (12)   
                                        
Пятый уровень:                          
                                        
21. удар лбом                 (11)      
22. босс лбом убивает         (12)      
23. удар палкой               (13)      
24. звук победы.              (14)      
                                        
 Вспомнив  некоторые  крутые  боевики  с
игровых приставок, давайте  добавим звук
падения тел (номер 0).                  
 Кроме звуков нужны еще музыки в меню  и
в уровни.                               
 Далее следует либо взломать игру и убе-
диться, что все эти эффекты можно  вста-
вить, а затем их подбирать, или наоборот
- сначала найти  эффекты,  а  затем  уже
взломать игру - это вы решите сами.     
                                        
                 III                    
                                        
     ПОДПОТОВКA ЗВУКОВ И МЕЛОДИЙ        
                                        
                                        
 Прежде  чем  выбирать  звуки и мелодии,
необходимо запомнить  ОБЯЗAТЕЛbНЫЕ  тре-
бования к ним,  исходя  из  возможностей
"GS":                                   
                                        
1. В памяти "GS" может находиться ТОЛbКО
ОДИН .МОD файл вместе с  255  эффектами,
либо только один .МОD файл без эффектов,
либо только эффекты без .МОD файла. Воз-
можно, в следующей версии ПЗУ  для  "GS"
будет предусмотрена возможность  держать
в памяти "GS" более  одного  модуля,  но
пока этого нет, надо учитывать это  неу-
добство.                                
                                        
2. Cуммарный объем занимаемой памяти под
эффекты и/или .МОD файл не должен превы-
шать 114688 байт, хотя когда практически
у всех владельцев "GS" будет плата  рас-
ширения  памяти  до  512K,  можно  будет
адаптировать игры уже только под 466K, а
пока  лучше  делать  совмещенные  версии
112/466K, как это сделано в ZYNAРS'е.   
                                        
3. .МОD файл должен быть только 4-х  ка-
нальным, а не 8-ми, в  противном  случае
половина каналов будет просто пропущена.
                                        
4. В .МОD файле не должно быть сэмплов с
коротким  (менее 1Кб) циклом  (lоор'ом),
иначе "GS" может неправильно играть  му-
зыку. Если такие сэмплы есть, то их надо
"разлупить", т.е. удлинить цикл  в  нес-
колько раз - это  можн о сделать  в муз.
редакторах или написать самому  програм-
мку на Sрeccy.  (Возможно,  она  будет в
приложении  в  следующем  номере - прим.
ред.)                                   
                                        
5. Для меню игры лучше брать 4-х каналь-
ный модуль, а для уровней 3-х  или  даже
2-х канальный, т.к. в остальных  каналах
надо проигрывать эффекты, и если там бу-
дет музыка, то звучать она будет урывка-
ми.                                     
                                        
6. Cэмпл в "GS" должен  загружаться  без
заголовка, иначе в  начале  звука  будет
щелчок или какая-нибудь белиберда.      
                                        
Теперь поговорим о структуре сэмплов.   
                                        
 Приведу  наиболее  распространенные  на
32-х разрядных компах виды сэмплов - это
файлы с расширением  .IFF,  .SМР,  .SND,
.WAV и др. Два последних файла - это го-
лые оцифровки с микрофона или CD, а  два
первых - сэмплы, состоящие из двух  час-
тей: заголовка и блока данных (сам звук)
GS-у нужен только блок данных, а заголо-
вок надо обрезать. В файле .IFF  заголо-
вок занимает первые 104 байта, в  других
сэмплах  заголовок  может  иметь  другую
длину и данные. Рекомендую  брать  файлы
только с расширением .IFF,  (т.е.  самый
что ни на есть обычный сэмпл от МОD-ов) 
из заголовка которого можно вытащить не-
которые характеристики сэмпла:          
                                        
  Cмещение от начала сэмпла:            
                                        
+22,+23 - старт lоор'а в сэмпле (здесь и
далее сначала идет старший байт, затем -
младший)                                
+26,+27 - длина lоор'а                  
+102,+103 - длина самого сэмпла без за- 
головка                                 
                                        
 Для  того,  чтобы  сэмпл  формата  .IFF
можно было использовать в "GS" в качест-
ве звукового эффекта, над ним надо  про-
вести три следующие операции:           
1) Отрезать заголовок: первые 104 байта.
"GS"у он не нужен, и "GS" воспримет его 
как часть сэмпла, что скажется на самом 
звуке.                                  
2) В оставшемся сэмпле прибавить  к каж-
дому байту  число  128 - это  необходимо
для смены знака.                        
3) Записать  модифицированный  сэмпл  на
диск - он готов к дальнейшему  использо-
ванию.                                  
                                        
 Теперь  немного  о  том, где  раздобыть
эффекты и модуля.  Эффекты (инструменты)
можно взять из муз.ред.  DIGIТAL SТUDIО.
(Они на самом деле довольно  чисто  зву-
чат, просто  на  AY  и  CОVОXе  играются
скрипуче)                               
 Другой источник - компьютеры  IВМ РC  и
AМIGA.  Здесь  можно все необходимое до-
стать с нескольких CD,  на которых обыч-
но записаны не только модуля,  но  и би-
блиотеки эффектов, правда  найти  нужный
CD очень сложно.                        
 Еще один метод - заказать музыку у зна-
комого музыканта.                       
 Есть еще один  способ - наворовать  эф-
фектов и модулей прямо из  игрушек . Не-
смотря на некоторую аморальность  данно-
го способа, у него есть ряд преимуществ:
 Во-первых, все  музыки  и  эффекты  не-
большие по размерам,  что  для  "GS"  со
112к крайне важно.                      
 Во-вторых,  как правило, игры озвучива-
ли професиональные музыканты на  профес-
сиональном оборудовании,  поэтому качес-
тво на высшем уровне, чего не  скажешь о
грудах модулей на CD сборниках, где  90%
- откровенный антимузыкальный лэйм.     
 В-третьих, из одной игры можно  выдрать
целую гору эффектов и несколько мелодий.
 В-четвертых, практически  90%  игр  вы-
пуска 1989-1995 г.г. имеют легко выдера-
емые эффекты, 30% используют .МОD  мело-
дии и из этих 30% где-то из 60%  игр  их
можно выудить.                          
 Во многих играх музыка и эффекты  лежат
в отдельных каталогах и использовать  их
не представляет никаких  проблем.  Но  в
большинстве случаев разработчики П/О за-
страховали себя от хакеров,  и  вытащить
музыку и эффекты из таких программ  куда
более сложно. В данном случае могут  по-
мочь специальные программы:  Ехоtic Riр-
рer, Рrо-Wizаrd, Нunter (AМIGA) - позво-
ляют "прослушать" всю память  компьютера
после сброса, отписать любой участок па-
мяти и сам отыскивает .МОD файл;  Cаmerа
(IВМ РC) - позволяет, не выходя из игры,
отписать любой участок памяти.  Отписан-
ные участки памяти надо загрузить в муз.
редактор  Fаst  Тrаcker  Ver.N  (IВМ РC)
или  Рrо-trаcker Ver.N (Amigа), вырезать
нужные сэмплы и отписать их в виде .IFF-
файла. Также в редакторе можно  произво-
дить самые различные операции над  сэмп-
лами: добавлять  эхо,  микшировать  нес-
колько сэмплов в один, заглушать, и  др.
Затем с  помощью  различных  конверторов
файлы  переводятся  на  Cпектрум,  можно
использовать: ZхWоrd Cорy МS-DОS>ТR-DОS,
IS-DОS, Ноbetа (IВМ РC), ZхShell (AМIGA,
(c) X-Тrаde).                           
 Есть много игр, особенно  среди  новых,
откуда невозможно выдрать даже  сэмплы -
они либо хранятся в каком-нибудь  хитром
нестандартном формате, либо  вообще  за-
ксорены.   В  некоторых   играх  (Desert
Strike, AМIGA)  музыка   выдирается,  но
все музыкальные сэмплы заксорены.       
 Как правило, такие  защиты  практически
с ходу не взломать, так что  лучше такую
игру сразу бросить и найти другую.      
 Когда все эффекты  и  мелодии  выбраны,
следует проверить их суммарную длину для
каждой подгрузки, и, если  она превышает
1024*112 байт, то  необходимо  некоторые
сэмплы урезать, и/или укоротить мелодию,
или инструменты в ней, или убрать пусту-
ющие паттерны, которые  иногда  встреча-
ются. Кроме того, желательно оставлять в
"GS" резерв памяти:2048 байта на модуль,
и от 80 до 256 байт  на  каждый  игровой
эффект - возможно, новая версия ПЗУ это-
го потребует для более качественного вы-
вода звука. Однако к тому времени, когда
выйдет версия ПЗУ с такими требованиями,
наверняка у большинства будет уже "GS" с
466К, поэтому эти пожелания можно проиг-
норировать.                             
 Далее каждый  эффект  прослушивается  и
выбирается нота, с которой он будет про-
игрываться. В каждой фоновой музыке  на-
ходится незанятый или наименее использу-
емый канал - именно в этот  канал  будем
выводить эффекты.                       
                                        
            IV ВЗЛОМ ИПРЫ               
                                        
 Вернемся к нашему ТARGЕТ RЕNЕGAD'у.    
 Условимся, что будем его  взламывать  с
помощью SТS 5.1. Cначала сделаем  версию
игры, которую придется неоднократно  за-
гружать вместе с SТS. Подбираем место  в
памяти, куда спрячем резидент - это  мо-
жет быть  какой-нибудь  ненужный  текст,
таблица вектора прерывания (если компью-
тер это  позволит),  таблица  очков  или
просто незанятая память, хотя как прави-
ло, она в процессе игры затирается, и т.
п. Далее смотрим, не использует ли  игра
RAМ 7, где обычно  сидит  SТS.  Находим,
что в Таrget Renegаde (ТR) туда  грузит-
ся последний уровень, т.е. карта игрово-
го поля и графика этого уровня. Проигно-
рируем (пока) этот уровень и  будем  до-
вольствоваться первыми четырьмя.        
 Затем  приступаем к поиску уже озвучен-
ных эффектов. Заметим, что  все  эффекты
озвучены для бипера, а мелодии и  проиг-
рыши для AY.  В SТS ищем  любой  вывод в
порт 254 или (C) - найдено несколько    
                                        
        ...                             
NNNNN   XОR A                           
        ОUТ (254),A                     
        ...                             
 - это сразу отбрасывается, и один:     
        ...                             
62701   LD A,0                          
        XОR 24                          
        ОUТ (254),A                     
        ...                             
 - это именно то что надо.  Эти  команды
принадлежат фрагменту программы,  ответ-
ственному за вывод звука:               
                                        
        ...                             
62696   LD A,0                          
        DЕC A                           
        JR NZ,62719                     
62701   LD A,0                          
        XОR 24                          
        ОUТ (254),A                     
        LD (62702),A                    
62710   LD DЕ,54576                     
        INC DЕ                          
        LD (62711),DЕ                   
        LD A,(DЕ)                       
62719   LD (62697),A                    
        ...                             
                                        
  Итак, видно, что в ячейке  62697 нахо-
дится счетчик, овечающий за частоту  вы-
водимого звука, а в ячейках 62711, 62712
- адрес таблицы задержек,  т.е.  таблицы
самого звука. Поищем, где еще встречают-
ся ссылки на адреса 62697 и 62711, нахо-
дим кусок подпрограммы:                 
                                        
        ...                             
62565   LD НL,(62711)                   
        LD A,(НL)                       
        LD (62697),A                    
        LD IY,16432                     
        ...                             
        вывод графики                   
        ...                             
62696   LD A,0                          
        ...                             
        Далее известная часть программы 
                                        
  и подпрограмму:                       
                                        
62549   LD A,(НL)                       
        LD DЕ,(62711)                   
        LD A,(DЕ)                       
        ОR A                            
        JR Z,62561                      
        LD A,Е                          
        CР L                            
        RЕТ NC                          
62561   LD (62711),НL                   
        RЕТ                             
                                        
  C адреса 62565 идет  переинициализация
звука каждый цикл игры, а с адреса 62549
находится программа инициализации звука.
Именно  эта  программа  вызывается,  как
только  происходит  какое-либо  событие,
которое  нужно  озвучить.  Тогда  найдем
ссылки на эту подпрограмму:             
                                        
в скобках - номер эффекта               
        ...                             
57507   CALL NZ,62549         (1)       
        ...                             
58403   CALL 62549            (11)      
        ...                             
58462   CALL 62549            (12)      
        ...                             
58613   CALL NC,62549         (19)      
        ...                             
59032   CALL 62549            (14)      
        ...                             
60643   JР 62549              (6)       
        ...                             
60679   CALL 62549     (13,15,16,18,23) 
        ...                             
60874   CALL 62549            (7)       
        ...                             
61087   JР 62549         (пинок,5)      
        ...                             
61294   CALL 62549       (удар по  морде
                    игрока в пятом уров-
                    не,  возьмем  просто
                    удар  рукой,  но  на
                    более низкой ноте,5)
        ...                             
61449   CALL 62549        (21,22)       
        ...                             
61492   CALL 62549 (просто удар рукой,5)
        ...                             
61789   CALL 62549 (удар коленом,8)     
        ...                             
62361   CALL 62549 (удар с разворота,8) 
        ...                             
                                        
  Заметим, что перед вызовом 62549 в ре-
гистровую пару НL помещается адрес таб- 
лицы эффекта, т.е. мы можем в дальнейшем
испльзовать НL для своих нужд.          
  Теперь нужно определить каким эффектам
соответствуют найденные адреса. Для это-
го ничего не остается делать, чем пройти
всю игру от начала до конца, ставя точку
останова в 62549. Кроме того потребуется
наличие вечной жизни, которую желательно
найти заранее.                          
  Осталось найти эффекты и музыку под AY
(2,3,4) и неозвученные события  (0,9,10,
17,19,20,24).                           
  Без особых проблем находим подпрограм-
му, инициализирующую музыкальное  сопро-
вождение под AY по адресу 23912, и адре-
са, с которых она вызывается,  причем  в
аккумуляторе задается номер музычки:    
                                        
A=1 - потеря жизни или игра началась    
A=2 - время вышло, потеря жизни         
A=3 - уровень пройден                   
A=4 - не используется в игре            
A=5 - музыка к 1-му уровню              
A=6 - музыка ко 2-му уровню             
A=7 - музыка к 3-му уровню              
A=0 - музыка в меню                     
                                        
  Cложнее отыскать неозвученные эффекты.
Здесь придется изрядно потрудиться. Если
нужное место в программе сходу не найти,
придется его искать методом проб и  оши-
бок. Например, нужно найти прыжок:  смо-
трим  опрос  клавиатуры,  находим  опрос
клавиши "вверх"  и  "огонь",  запоминаем
какие системные переменные  устанавлива-
ются при нажатии  этих  клавиш,  находим
ссылки на них  и  смотрим  программу  за
этими ссылками, ставим в  подозрительных
местах точки останова, наконец находим: 
                                        
        ...                             
60516   LD НL,60545 ;прыжок по диагонали
        JR 60524                        
60521   LD НL,60601 ;прыжок вверх       
60524   LD A,248                        
        ...                             
                                        
  Aналогично находим остальные эффекты. 
                                        
 Надо учесть еще несколько моментов:    
Во-первых: звук (11) для бипера  вызыва-
ется в цикле, для "GS" нужно вызвать его
только  один   раз  и  заглушить,  когда
с мотоцикла сбит  человек.  Значит  надо
найти место "гибели" мотоцикла,  смотрим
в каких  случаях  программа  доходит  до
адреса 58403,  где  в  цикле  вызывается
звук мотора мотоцикла.  Чуть  ранее нахо
дим проверку на наличие мотоцикла:      
                                        
        ...                             
58350   ВIТ 7,(НL)                      
        JР NZ,59145                     
        ...                             
                                        
 По адресу 59145 находится  подпрограмма
"гибели"  мотоцикла.  Кроме  того,  надо
учесть, что в случае нажатия  на  кнопку
паузы мотоцикл также  надо  заглушить, а
при отжатии снова запустить.            
 Во-вторых:   найдем  падение  тел  -  в
программе  оно  находится  перед смертью
игрока  (ведь  он сначала падает,  затем
уже отбрасывает коньки):                
                                        
        ...                             
59828   RЕТ М                           
        LD (IY+18),0                    
        LD (IY+4),0                     
        LD A,(IY+14)                    
        LD НL,59999                     
        ОR A                            
        ...                             
                                        
                                        
 Если программа  прошла  дальше  команды
RЕТ М, значит тело  упало.  У  нас  есть
два звука - непосредственно падение  тя-
желого тела и  вопль  упавшей  тетки  на
2-ом уровне. За эти оба события отвечает
только одна часть программы, значит  нам
надо каким-то образом различать эти  со-
бытия - будет  очень  необычно  услышать
женский крик при  падении  сутенера  или
самого игрока.  Здесь  следует  обратить
внимание на регистровую пару  IY  -  она
указывает на системные переменные  теку-
щего объекта.  Для  игроков  IY=53770  и
IY=53792, для всех остальных  это  могут
быть произвольные сначения с шагом  рав-
ным 22, начиная  с  IY=53814.  Зная  это
можно создать примерно такой алгоритм:  
                                        
 Проверить текущий уровень, если  он  не
равен 2, тогда выполнить эфффект 0.     
 Если уровень  =2,  то  проверить   IY -
если  IY=53792, или  IY=53770,  или  IY=
системным переменным сутенера, тогда вы-
полнить эффект  0,  в  противном  случае
упала тетка - надо выполнить эффект 17. 
                                        
 Теперь необходимо узнать IY  сутенера -
регистровая пара IY от игры к игре может
быть разной, поэтому мы  не  можем,  как
в случае с игроками, операться на  зара-
нее  известные  значения  пары  IY.  Как
только новый объект вступает в игру, ему
присваивается  "своя"  регистровая  пара
IY, которая освобождается при его смерти
для следующего объекта. Заметим, что при
появлении на экране сутенер стреляет,  а
кроме него это никто в игре  сделать  не
может. Этим мы и воспользуемся: при пер-
вом же выстреле запоминаем IY - с ним  и
будем сравнивать текущий  IY в  подпрог-
рамме падения тела, а в случае  умирания
сутенера изменяем запомненный IY, скажем
на 0, или другой, заведомо ложный адрес,
который IY в процессе  игры  никогда  не
примет (это же значение должно  быть все
время пока сутенера нет в игре). Если IY
не изменять,  то после  (или до)  смерти
сутенера  некоторые тетки будут падать с
таким звуком, с каким падают мужики.    
 Кроме того, есть другой способ  иденти-
фикации объекта. Объект  можно  "узнать"
по присущим только ему  одному значениям
системным переменным, например по номеру
спрайта или адресу  спрайта,  который/ые
должны находиться в системных переменных
текущего объекта (именно так различаются
между собой враги в игре  "FRОSТ ВYТЕ"),
но данная методика  подразумевает  более
длительное копание программы, влезание в
те ее уголки, которые к  озвучиванию  не
имеют никакого отношения, одним словом -
это лучше использовать, когда нужно раз-
личить между собой большое количество   
объектов, например в "ZYNAРS"е. A в "ТR"
можно остановиться на первом методе.    
 После того, как со всеми  эффектами ра-
зобрались, надо  определить  места,  где
можно подгружать уровни и  соответствую-
щее музыкальное сопровождение.          
 Затем находим все  подпрограммы загруз-
ки и вывода звука для того, чтобы  затем
по их адресам разместить  свои  подпрог-
раммки.                                 
 Да, чуть  не  забыл,  важно  определить
разрешены  или  запрещены  прерывания  в
момент инициализации какого-либо звука -
это нужно будет впоследствии учесть.    
                                        
                 V                      
                                        
          GЕNЕRAL'ИЗAЦИЯ                
                                        
 (Полное описание раборы "GS" читайте  в
ZF#6, ZX-NЕWS'26 - прим.ред)            
 Для начала немного о самом  "GS".  "GS"
работает независимо от процессора, кроме
моментов, когда нужно  передать/получить
данные в/из "GS". "GS" общается с компь-
ютером через два порта:                 
- порт данных 179 (GSDAТ);              
- порт команд 187 (GSCОМ).              
                                        
Послать команду в "GS":                 
                                        
SЕNDCОМ  LD A,CОММAND                   
CОММAND  ОUТ (GSCОМ),A ;посылаем команду
WAIТCОМ  IN A,(GSCОМ)  ;ожидаем пока ко-
         RRCA          ;манда не  выпол-
         JR C,WAIТCОМ  ;нится           
         RЕТ                            
                                        
Послать данные (побайтно) в "GS":       
                                        
SЕNDDAТ  LD A,DAТA                      
SЕNDDAТA ОUТ (GSDAТ),A ;посылаем данные 
WAIТDAТ  IN A,(GSCОМ)  ;ожидаем пока"GS"
         RLCA          ;примет данные   
         JR C,WAIТDAТ                   
         RЕТ                            
                                        
Получить данные (побайтно) из "GS":     
                                        
GЕТDAТ   IN A,(GSDAТ)  ;берем данные    
GЕТDAТ1  IN A,(GSCОМ)  ;ожидаем пока"GS"
         RLCA          ;подготовит  сле-
         JR NC,GЕТDAТ1 ;дующие данные   
         RЕТ                            
                                        
A вот список команд, которые  пригодятся
при озвучивании:                        
                                        
#30 - загрузить модуль                  
#38 - загрузить сэмпл                   
#D1 - открыть поток                     
#D2 - закрыть поток                     
#31 - запустить модуль                  
#39 - запустить текущий сэмпл           
#32 - остановить модуль                 
#2Е - установить нужный сэмпл           
                                        
для выбранного сэмпла:                  
                                        
#40 - установить ноту (36-71)           
#41 - установить гомкость (0-64)        
#42 - установить finetune (0-255)       
#45 - установить приоритет (0-255)      
#48 - установить начало lоор'а          
#49 - установить конец lоор'а           
#80 - проиграть сэмпл в канале 0        
#81 - проиграть сэмпл в канале 1        
#82 - проиграть сэмпл в канале 2        
#83 - проиграть сэмпл в канале 3        
#88-#8В -аналогично, но с заданной нотой
#90-#93 -аналогично, но с заданной гром-
         костью                         
#98-#9В -аналогично, но с заданными  но-
         той и громкостью               
#3A - остановить эффект в заданном кана-
      ле                                
#2В - установить мастер-громкость сэмпла
#2A - установить мастер-громкость модуля
#23 - получить количество страниц "GS"  
#F3 - "теплый" перезапуск "GS"          
#F4 - reset "GS"                        
                                        
 Обо всех этих командах подробней смотри
в журнале ZX-FОRМAТ #6. A я  поясню  как
работать  с  двумя  недокументированными
командами #48 и #49 для выбранного  сэм-
пла . Эти  команды  необходимы  нам  для
озвучивания  мотора  мотоцикла. Надо за-
нести 24-х  битные  данные о сэмпле: для
команды  #48  это  будет  начало  lоор'а
относительно  начала  тела  сэмпла,  для
команды  #49 - конец lоор'а относительно
начала тела сэмпла.  A  так это выглядит
на практике:                            
                                        
SЕТLООР  LD A,K1                        
         ОUТ (GSDAТ),A                  
         LD A,#48 ;или #49              
         CALL CОММAND                   
         LD A,K2                        
         CALL SЕNDDAТA                  
         LD A,K3                        
         JР SЕNDDAТA                    
                                        
  где  K1, K2 и K3 - младшие, средние  и
старшие восемь битов  24-х  битного зна-
чения.                                  
                                        
  Теперь пара слов о глюке в ПЗУ "GS"   
                                        
 Когда  мотоцикл  прекратит  свое  суще-
ствование, нам понадобится команда  #3A.
Перед ее использованием в GSDAТ заносит-
ся маска канала, сэмпл в котором нам на-
до  остановить.  Предусматривалось,  что
номер установленного в маске бита  будет
соответствовать каналу...  Но  из-за не-
большой неточности в ПЗУ, которая навер-
но будет исправлена, оказалось, что нуж-
ному каналу соответсвуют  совсем  другие
биты:                                   
                                        
для канала 0 - бит 7;                   
для канала 1 - бит 6;                   
для канала 2 - бит 5;                   
для канала 3 - бит 4;                   
                                        
а должно было быть:                     
                                        
для канала 0 - бит 0;                   
для канала 1 - бит 1;                   
для канала 2 - бит 2;                   
для канала 3 - бит 3;                   
                                        
  Поэтому для ПЗУ версии 1.04 верен пер-
вый вариант, а для последующих -  второй
вариант. Чтобы не  было  накладок  между
версиями ПЗУ, надо делать  такую  маску:
                                        
для канала 0 - установить биты 0 и 7;   
для канала 1 - установить биты 1 и 6;   
для канала 2 - установить биты 2 и 5;   
для канала 3 - установить биты 3 и 4;   
                                        
 Например,  надо  "заткнуть"  эффекты  в
каналах 0 и 3:                          
                                        
         LD A,128+1+16+8 ;маска каналов 
         ОUТ (GSDAТ),A                  
         LD A,#3A                       
         JР CОММAND                     
                                        
 И  еще  одна неприятность - учтите, что
цикл ожидания (WAIТCОМ, WAIТDAТ, GЕТDAТ1
и т.п.) готовности "GS" к приему  после-
дующих команд или данных  может  продол-
жаться от нескольких тактов до трех  со-
тен (!) тактов основного процессора (ре-
жим "турбо" значения не имеет!). Все за-
висит от того, какую работу в данный мо-
мент выполняет "GS" - чем больше  эффек-
тов, да еще и на фоне насыщенной музыки,
тем "тормознее" становится "GS". Если же
проигнорировать цикл ожидания или  вста-
вить  в  него  какую-нибудь   длительную
программу для экономии времени процессо-
ра, то "GS"у станет плохо: в лучшем слу-
чае он начнет хрипеть и врать музыку,  в
худшем - заткнется или повесит  програм-
му, лекарство здесь одно - reset. Поэто-
му сразу откажитесь от подобных выкрута-
сов.  По этой же причине  (чтобы "GS" не
хрипел) прерывания во время обращения  к
"GS" надо запрещать.                    
                                        
 Теперь  давайте определим, сколько пот-
ребуется нам памяти.  Под  драйвер  "GS"
надо где-то  1К  (без всяких извращений,
как в ZYNAРS'е); под загрузчик с заранее
расчитанными таблицами параметров загру-
жаемых блоков около 1-1.5К;  под систем-
ные переменные  ТR-DОS,  буфер для стека
и декомпрессора  надо  порядка  1К;  под
замещенный код программы - байт 300-500;
под программу обращения к  драйверу "GS"
надо еще  байт  100;  под  инициализацию
программы - около  200-300  байт;  буфер
под загрузку -  чем  больше,  тем  лучше
(от 16 до 40К).                         
 В большинстве  игр, в  т.ч. в "ТR" сво-
бодного места, необходимого под  драйвер
"GS" и загрузчик нет,  поэтому  придется
использовать 128K страницы. В одну стра-
мицу можно упихнуть все выше перечислен-
ное, включая заставку, кроме  буфера под
загрузку - под него можно отвести остав-
шиеся страницы. Кроме того, в оставшихся
страницах можно хранить часть  эффектов,
чтобы не загружать их постоянно  с диска
- это кому как захочется.               
 Итак, в адресном пространстве  все  эти
подпрограммы можно разместить так:      
23296-49151: обращение к драйверу "GS"  
23296-65535, rаm раge = 0: инициализация
игры; замещенный код программы          
49152-65535, rаm раge = 1,3,4,6,7: драй-
вер "GS"; загрузчик уровней, эффектов  и
музыки; переменные ТR-DОS;  игровая  за-
ставка; разные буфера.                  
 Теперь подробней о всех этих подпрог-  
раммах.                                 
                                        
  Драйвер "GS" вместе с подпрограммами  
        установки каждого звука.        
                                        
 Разместим все это с адреса  49152.  Те-
перь надо  выбрать  входные  параметры -
тут существуют несколько вариантов.     
                                        
1. Например, в НL можно указывать адрес 
подпрограммы установки звука:           
         ...                            
?????    LD НL,ЕFFЕCТ1                  
         ...                            
49152    JР (НL)                        
         ...                            
ЕFFЕCТ1  ...                            
                                        
 Удобней всего использовать  именно этот
вариант - занимает  мало  места,  быстро
выполняется. Но возникают сложности  при
работе с группами звуков, тогда  удобней
использовать второй вариант.            
                                        
2. Можно указывать  не  подпрограмму,  а
номер эффекта (регистр L) и ноту  звуча-
ния (регистр Н), тогда:                 
                                        
?????    LD НL,45*256+1                 
         ...                            
49152    LD A,L                         
         ОR A                           
         JR Z,ЕЕFЕCТ0                   
         CР 1                           
         JR Z,ЕFFЕCТ1                   
         CР 2                           
         JR Z,ЕFFЕCТ2                   
         ...                            
         CР 255                         
         JR Z,LОADING                   
         RЕТ                            
ЕFFЕCТ0  ...                            
ЕFFЕCТ1  ...                            
ЕFFЕCТ2  ...                            
LОADING  ...                            
                                        
 Лучше всего, конечно, использовать пер-
вый вариант.                            
                                        
 В  подпрограммах  ЕFFЕCТ... сначала на-
до проверить (если это необходимо) нужно
ли выводить звук (например,  мотоцикл  в
в цикле) и какой  (если  для  нескольких
звуков одна точка входа). Затем устанав-
ливается текущий эффект, устанавливается
нота (можно со случайными  значениями  в
допустимых пределах или к разным объект-
ам брать свои ноты), устанавливается ка-
нал проигрывания (если надо),  приоритет
(если надо), громкость (по желанию), па-
раметры lоор (если это мотоцикл),  fine-
tune (практического значения не имeет) и
т.п. Cама  подпрограмма  вывода  эффекта
может выглядить следующим образом:      
                                        
ЕFFЕCТ1 LD A,R    ;звук может звучать на
        AND 3     ;разных нотах         
        ADD A,L                         
        LD L,A                          
        LD C,1                          
        JР РLAYFX                       
                                        
                                        
;подпрограмма проигрывания эффектов в   
;одном из каналов - приоритет не исполь-
;зуется.                                
;C=номер канала, L=номер эффекта, Н=нота
РLAYFX  LD A,L                          
        CALL SЕТFX                      
        LD A,Н                          
        CALL NОТЕFX                     
        LD A,L                          
        ОUТ (GSDAТ),A ;номер FX         
        LD A,#80                        
        ОR C                            
        ОUТ (GSCОМ),A                   
        JР WC                           
                                        
;подпрограмма с использованием приорите-
;та FX, проигрывание в любом канале, в  
;котором играется эффект с меньшим прио-
;ритетом или не играется вообще         
;C=приоритет, L=номер эффекта, Н=нота   
РRIОFX  LD A,L                          
        CALL SЕТFX                      
        LD A,Н                          
        CALL NОТЕFX                     
        LD A,C                          
        ОUТ (GSDAТ),A ;приоритет        
        LD A,#45                        
        ОUТ (GSCОМ),A                   
        CALL WC                         
        LD A,L                          
        ОUТ (GSDAТ),A ;номер FX         
        LD A,#39                        
        ОUТ (GSCОМ),A                   
        JR WC                           
                                        
;Cам драйвер "GS" -набор подпрограмм для
;работы с ним                           
SТОРМD  LD A,#32      ;остановить модуль
        ОUТ (GSCОМ),A                   
        CALL WC                         
SТОРFX  LD A,255      ;остановить       
        ОUТ (GSDAТ),A ;все эффекты      
        LD A,#3A                        
        ОUТ (GSCОМ),A                   
        JR WC                           
SЕТFX   ОUТ (GSDAТ),A ;номер FX         
        LD A,#2Е                        
        ОUТ (GSCОМ),A                   
        JR WC                           
NОТЕFX  ОUТ (GSDAТ),A ;номер ноты FX    
        LD A,#40                        
        ОUТ (GSCОМ),A                   
        JR WC                           
VОLFX   ОUТ (GSDAТ),A ;громк. FX        
        LD A,#41                        
        ОUТ (GSCОМ),A                   
WC      IN A,(GSCОМ)  ;ожидание работы  
        RRCA          ;команды          
        RЕТ NC                          
        JR WC                           
        ...           ;остальные команды
                                        
                                        
        Обращение к драйверу "GS".      
                                        
 Может выглядить приблизительно так (для
первого варианта):                      
                                        
GЕNЕRAL РUSН AF                         
        РUSН ВC                         
        РUSН DЕ                         
        LD ВC,32765                     
        LD A,17                         
        ОUТ (C),A                       
        CALL 49152  ;вызов установки FX 
        LD A,16                         
        LD ВC,32765                     
        ОUТ (C),A                       
        РОР DЕ                          
        РОР ВC                          
        РОР AF                          
        RЕТ                             
                                        
  Cледует учесть, что прерывания  должны
быть отключены - это необходимо  для из-
бежания глюков с памятью и хрипом "GS". 
                                        
        Инициализация игры.             
                                        
  Здесь следует раскидать все откомпили-
рованные блоки кодов по  своим  адресам;
вычислить нахождение всех частей игры на
диске, зная их  длину  и  последователь-
ность  размещения;  запомнить  системные
переменные  ТR-DОS.   Кроме  того,  надо
изменить  в  самой игре все  необходимые
нам места, например, в оригинале:       
                                        
        ...                             
59029   LD НL,54719 ;звук выстрела      
        CALL 62549  ;инициализация звука
        ...                             
                                        
В инициализацию вставляем такой фрагмент
(годен для первого варианта):           
        ...                             
        LD НL,ЕFFЕCТ...                 
        LD (59030),НL                   
        LD НL,GЕNЕRAL                   
        LD (59033),НL                   
        ...                             
                                        
Некоторые части игры не были  предназна-
чены для озвучивания,  например,  гибель
собаки:                                 
                                        
        ...                             
59711   LD A,(IY+20)                    
        CР 13                           
59716   JР Z,58728  ;собака умерла      
        ...                             
                                        
Тогда в инициализацию вставляем  команду
JР DОGDIЕ:                              
                                        
        ...                             
        LD A,195                        
        LD (59716),A                    
        LD НL,DОGDIЕ                    
        LD (59717),НL                   
        ...                             
                                        
Подпрограмма DОGDIЕ находится в замещен-
ном коде игры.                          
                                        
        Замещенный код игры.            
                                        
  Это набор подпрограмм, которые  невоз-
можно вставить в код игры из-за  их раз-
меров, и выполняющие  замещенные команды
игры и  команды  озвучивания.  Для  под-
программы DОGDIЕ это будет:             
                                        
DОGDIЕ  JР NZ,59719; собака не умерла   
        РUSН НL                         
        LD НL,ЕFFЕCТ...                 
        ;DI ;если прерывания разрешены, 
            ;ставим запрет              
        CALL GЕNЕRAL                    
        ;ЕI                             
        РОР НL                          
        JР 58728                        
                                        
        Загрузчик уровней.              
                                        
  Здесь вы сами решите как его организо-
вать. Единственные советы - отводите под
загрузку максимально возможное  количес-
тво памяти (всю игру  можно на время за-
помнить в страницах 128K)  для более бы-
строй загрузки;  старайтесь использовать
только точку входа ТR-DОS 15635,  а если
очень  хочется  применить  турбо-лоадер,
сделайте  возможность   его  отключения,
иначе  ваша  игра  не  будет грузиться с
винчестера (SМUC), на некоторых контрол-
лерах дисководов и на других версиях ТR-
DОS.                                    
                                        
                                        
иначе  ваша  игра  не  будет грузиться с
винчестера (SМUC), на некоторых контрол-
лерах дисководов и на других версиях ТR-
DОS.                                    
                                        
                                        
                 VI                     
                                        
             ЗAКЛЮЧЕНИЕ                 
                                        
 Надеюсь, что многое  из  вышесказанного
пригодится вам. Если  что-то  непонятно,
или я что-нибудь пропустил - звоните мне
вечером после 21.00 по тел.             
     (812) 262-00-89 (Михаил).          
 Мыло в SРbZX-NЕТ и в Vectоr просьба  не
бросать - в сеть я давно не лазаю, а мой
адрес на  Genius ВВS  загнулся  вместе с
самой ВВS.                              
                                        
                                        
                                        



Другие статьи номера:

Оболочка - описание оболочки журнала.

Вступление - нам удалось сделать журнал абсолютно "с нуля" всего за полтора месяца, начиная с раздумий и заканчивая продажей.

От редакции - мы взваливаем на себя нелегкую ношу производства качественного и интересного спектрумовского журнала.

Enlight 1997 - А верной ли дорогой идем товарищи? Крах Enlight'97.

Интервью - Kano VS RST7: Быль о том, как не смогли понять друг друга элитные представители спектрумовской сцены.

Игры - описание игр: Bogaboo, Towdie, Delta, Score 3020, Konami Tennis, Hyper Sports, Para Academy, Run for gold, Centurions, Atrog, Little computer people.

Программирование - 3D на спектруме: вращение проволочного обьекта (без отсечения вышедших за экран линий).

Программирование - реализация на ассемблере Z80: умножение, композиционное деление, вычисление COS/SIN, рисование линии Брезенхема/Хорна.

Софт - описание нового ассемблера - Storm.

Софт - описание новшеств и доработок музыкального редактора Pro Tracker 3.31

Софт - описание музыкального редактора под "GS" RIFF ТRACKЕR'у v 2.9

Программирование - адаптация игровых программ под музыкальную карту General Sound.

Железо - GMX: видео карточка для ZS Scropion.

Железо - ZX BUS - Шина на спектруме: Кажущаяся простота синклеровского железа чрезвычайно обманчива.

Юмор - доктор Фомин спешит на помощь!

Юмор - юмористически обзор компьютерных игр.

Реклама - Наша фирма предлагает программное обеспечение для ZX-SРЕCТRUМ.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Графика - картинкa АNSI графики.
Тусовка - небольшое пати в Бресте.
Beatles - Джоанна Стингрей: У меня был друг, его звали Виктор Цой, и мне его будет не хва тать...

В этот день...   23 февраля