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

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

<b>Программирование</b> - адаптация игровых программ под музыкальную карту General Sound.
                                        
(С)Mike Blum/ZX-MASTERS CROUP.
                              
   GENERAL'изация программ.   
                              
                  I                     
                                        
                                        
               ВВЕДЕНИЕ                 
                                        
 Озвучивание под GS - весьма кропотливое
и  довольно  долгое  занятие, требующее,
кроме терпения и  возможности  доставать
музыкальное  оформление, еще и  неплохое
знание ассемблера, так  что  эта  статья
адресована прежде всего тем,  кто  отве-
чает  этим  требованиям.  Я   постараюсь
подробно  рассказать  о всей кухне  при-
готовления  озвученных игр, приведу  ряд
примеров, в т.ч.  тексты  программ,  дам
ряд советов, покажу некоторые   нюансы -
короче напишу обо всем, что поможет  вам
озвучивать игрушки.                     
                                        
                 II                     
                                        
         ВЫБОР И АНАЛИЗ ИПРЫ            
                                        
 Итак,  Вы  решили  что-нибудь  озвучить
под "GS". Давайте выберем  игру  "TARGET
RENEGADE".Сразу возьмем полную 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 ЗВУКОВ И МЕЛОДИЙ        
                                        
                                        
 Прежде  чем  выбирать  звуки и мелодии,
необходимо запомнить  ОБЯЗАТЕЛьНЫЕ  тре-
бования к ним,  исходя  из  возможностей
"GS":                                   
                                        
1. В памяти "GS" может находиться ТОЛьКО
ОДИН .MOD файл вместе с  255  эффектами,
либо только один .MOD файл без эффектов,
либо только эффекты без .MOD файла. Воз-
можно, в следующей версии ПЗУ  для  "GS"
будет предусмотрена возможность  держать
в памяти "GS" более  одного  модуля,  но
пока этого нет, надо учитывать это  неу-
добство.                                
                                        
2. Суммарный объем занимаемой памяти под
эффекты и/или .MOD файл не должен превы-
шать 114688 байт, хотя когда практически
у всех владельцев "GS" будет плата  рас-
ширения  памяти  до  512K,  можно  будет
адаптировать игры уже только под 466K, а
пока  лучше  делать  совмещенные  версии
112/466K, как это сделано в ZYNAPS'е.   
                                        
3. .MOD файл должен быть только 4-х  ка-
нальным, а не 8-ми, в  противном  случае
половина каналов будет просто пропущена.
                                        
4. В .MOD файле не должно быть сэмплов с
коротким  (менее 1Кб) циклом  (loop'ом),
иначе "GS" может неправильно играть  му-
зыку. Если такие сэмплы есть, то их надо
"разлупить", т.е. удлинить цикл  в  нес-
колько раз - это  можн о сделать  в муз.
редакторах или написать самому  програм-
мку на Speccy.  (Возможно,  она  будет в
приложении  в  следующем  номере - прим.
ред.)                                   
                                        
5. Для меню игры лучше брать 4-х каналь-
ный модуль, а для уровней 3-х  или  даже
2-х канальный, т.к. в остальных  каналах
надо проигрывать эффекты, и если там бу-
дет музыка, то звучать она будет урывка-
ми.                                     
                                        
6. Сэмпл в "GS" должен  загружаться  без
заголовка, иначе в  начале  звука  будет
щелчок или какая-нибудь белиберда.      
                                        
Теперь поговорим о структуре сэмплов.   
                                        
 Приведу  наиболее  распространенные  на
32-х разрядных компах виды сэмплов - это
файлы с расширением  .IFF,  .SMP,  .SND,
.WAV и др. Два последних файла - это го-
лые оцифровки с микрофона или CD, а  два
первых - сэмплы, состоящие из двух  час-
тей: заголовка и блока данных (сам звук)
GS-у нужен только блок данных, а заголо-
вок надо обрезать. В файле .IFF  заголо-
вок занимает первые 104 байта, в  других
сэмплах  заголовок  может  иметь  другую
длину и данные. Рекомендую  брать  файлы
только с расширением .IFF,  (т.е.  самый
что ни на есть обычный сэмпл от MOD-ов) 
из заголовка которого можно вытащить не-
которые характеристики сэмпла:          
                                        
  Смещение от начала сэмпла:            
                                        
+22,+23 - старт loop'а в сэмпле (здесь и
далее сначала идет старший байт, затем -
младший)                                
+26,+27 - длина loop'а                  
+102,+103 - длина самого сэмпла без за- 
головка                                 
                                        
 Для  того,  чтобы  сэмпл  формата  .IFF
можно было использовать в "GS" в качест-
ве звукового эффекта, над ним надо  про-
вести три следующие операции:           
1) Отрезать заголовок: первые 104 байта.
"GS"у он не нужен, и "GS" воспримет его 
как часть сэмпла, что скажется на самом 
звуке.                                  
2) В оставшемся сэмпле прибавить  к каж-
дому байту  число  128 - это  необходимо
для смены знака.                        
3) Записать  модифицированный  сэмпл  на
диск - он готов к дальнейшему  использо-
ванию.                                  
                                        
 Теперь  немного  о  том, где  раздобыть
эффекты и модуля.  Эффекты (инструменты)
можно взять из муз.ред.  DIGITAL STUDIO.
(Они на самом деле довольно  чисто  зву-
чат, просто  на  AY  и  COVOXe  играются
скрипуче)                               
 Другой источник - компьютеры  IBM РС  и
AMIGA.  Здесь  можно все необходимое до-
стать с нескольких CD,  на которых обыч-
но записаны не только модуля,  но  и би-
блиотеки эффектов, правда  найти  нужный
CD очень сложно.                        
 Еще один метод - заказать музыку у зна-
комого музыканта.                       
 Есть еще один  способ - наворовать  эф-
фектов и модулей прямо из  игрушек . Не-
смотря на некоторую аморальность  данно-
го способа, у него есть ряд преимуществ:
 Во-первых, все  музыки  и  эффекты  не-
большие по размерам,  что  для  "GS"  со
112к крайне важно.                      
 Во-вторых,  как правило, игры озвучива-
ли професиональные музыканты на  профес-
сиональном оборудовании,  поэтому качес-
тво на высшем уровне, чего не  скажешь о
грудах модулей на CD сборниках, где  90%
- откровенный антимузыкальный лэйм.     
 В-третьих, из одной игры можно  выдрать
целую гору эффектов и несколько мелодий.
 В-четвертых, практически  90%  игр  вы-
пуска 1989-1995 г.г. имеют легко выдера-
емые эффекты, 30% используют .MOD  мело-
дии и из этих 30% где-то из 60%  игр  их
можно выудить.                          
 Во многих играх музыка и эффекты  лежат
в отдельных каталогах и использовать  их
не представляет никаких  проблем.  Но  в
большинстве случаев разработчики П/О за-
страховали себя от хакеров,  и  вытащить
музыку и эффекты из таких программ  куда
более сложно. В данном случае могут  по-
мочь специальные программы:  Exotic Rip-
рег, Рго-Wizard, Hunter (AMIGA) - позво-
ляют "прослушать" всю память  компьютера
после сброса, отписать любой участок па-
мяти и сам отыскивает .MOD файл;  Camera
(IBM РС) - позволяет, не выходя из игры,
отписать любой участок памяти.  Отписан-
ные участки памяти надо загрузить в муз.
редактор  Fast  Tracker  Ver.N  (IBM РС)
или  Рго-tracker Ver.N (Amiga), вырезать
нужные сэмплы и отписать их в виде .IFF-
файла. Также в редакторе можно  произво-
дить самые различные операции над  сэмп-
лами: добавлять  эхо,  микшировать  нес-
колько сэмплов в один, заглушать, и  др.
Затем с  помощью  различных  конверторов
файлы  переводятся  на  Спектрум,  можно
использовать: ZxWord Copy MS-DOS>TR-DOS,
IS-DOS, Hobeta (IBM РС), ZxShell (AMIGA,
(c) X-Trade).                           
 Есть много игр, особенно  среди  новых,
откуда невозможно выдрать даже  сэмплы -
они либо хранятся в каком-нибудь  хитром
нестандартном формате, либо  вообще  за-
ксорены.   В  некоторых   играх  (Desert
Strike, AMIGA)  музыка   выдирается,  но
все музыкальные сэмплы заксорены.       
 Как правило, такие  защиты  практически
с ходу не взломать, так что  лучше такую
игру сразу бросить и найти другую.      
 Когда все эффекты  и  мелодии  выбраны,
следует проверить их суммарную длину для
каждой подгрузки, и, если  она превышает
1024*112 байт, то  необходимо  некоторые
сэмплы урезать, и/или укоротить мелодию,
или инструменты в ней, или убрать пусту-
ющие паттерны, которые  иногда  встреча-
ются. Кроме того, желательно оставлять в
"GS" резерв памяти:2048 байта на модуль,
и от 80 до 256 байт  на  каждый  игровой
эффект - возможно, новая версия ПЗУ это-
го потребует для более качественного вы-
вода звука. Однако к тому времени, когда
выйдет версия ПЗУ с такими требованиями,
наверняка у большинства будет уже "GS" с
466К, поэтому эти пожелания можно проиг-
норировать.                             
 Далее каждый  эффект  прослушивается  и
выбирается нота, с которой он будет про-
игрываться. В каждой фоновой музыке  на-
ходится незанятый или наименее использу-
емый канал - именно в этот  канал  будем
выводить эффекты.                       
                                        
            IV ВЗЛОМ ИПРЫ               
                                        
 Вернемся к нашему TARGET RENEGAD'у.    
 Условимся, что будем его  взламывать  с
помощью STS 5.1. Сначала сделаем  версию
игры, которую придется неоднократно  за-
гружать вместе с STS. Подбираем место  в
памяти, куда спрячем резидент - это  мо-
жет быть  какой-нибудь  ненужный  текст,
таблица вектора прерывания (если компью-
тер это  позволит),  таблица  очков  или
просто незанятая память, хотя как прави-
ло, она в процессе игры затирается, и т.
п. Далее смотрим, не использует ли  игра
RAM 7, где обычно  сидит  STS.  Находим,
что в Target Renegade (TR) туда  грузит-
ся последний уровень, т.е. карта игрово-
го поля и графика этого уровня. Проигно-
рируем (пока) этот уровень и  будем  до-
вольствоваться первыми четырьмя.        
 Затем  приступаем к поиску уже озвучен-
ных эффектов. Заметим, что  все  эффекты
озвучены для бипера, а мелодии и  проиг-
рыши для AY.  В STS ищем  любой  вывод в
порт 254 или (C) - найдено несколько    
                                        
        ...                             
NNNNN   XOR A                           
        OUT (254),A                     
        ...                             
 - это сразу отбрасывается, и один:     
        ...                             
62701   LD A,0                          
        XOR 24                          
        OUT (254),A                     
        ...                             
 - это именно то что надо.  Эти  команды
принадлежат фрагменту программы,  ответ-
ственному за вывод звука:               
                                        
        ...                             
62696   LD A,0                          
        DEC A                           
        JR NZ,62719                     
62701   LD A,0                          
        XOR 24                          
        OUT (254),A                     
        LD (62702),A                    
62710   LD DE,54576                     
        INC DE                          
        LD (62711),DE                   
        LD A,(DE)                       
62719   LD (62697),A                    
        ...                             
                                        
  Итак, видно, что в ячейке  62697 нахо-
дится счетчик, овечающий за частоту  вы-
водимого звука, а в ячейках 62711, 62712
- адрес таблицы задержек,  т.е.  таблицы
самого звука. Поищем, где еще встречают-
ся ссылки на адреса 62697 и 62711, нахо-
дим кусок подпрограммы:                 
                                        
        ...                             
62565   LD HL,(62711)                   
        LD A,(HL)                       
        LD (62697),A                    
        LD IY,16432                     
        ...                             
        вывод графики                   
        ...                             
62696   LD A,0                          
        ...                             
        Далее известная часть программы 
                                        
  и подпрограмму:                       
                                        
62549   LD A,(HL)                       
        LD DE,(62711)                   
        LD A,(DE)                       
        OR A                            
        JR Z,62561                      
        LD A,Е                          
        СР L                            
        RET NC                          
62561   LD (62711),HL                   
        RET                             
                                        
  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   JP 62549              (6)       
        ...                             
60679   CALL 62549     (13,15,16,18,23) 
        ...                             
60874   CALL 62549            (7)       
        ...                             
61087   JP 62549         (пинок,5)      
        ...                             
61294   CALL 62549       (удар по  морде
                    игрока в пятом уров-
                    не,  возьмем  просто
                    удар  рукой,  но  на
                    более низкой ноте,5)
        ...                             
61449   CALL 62549        (21,22)       
        ...                             
61492   CALL 62549 (просто удар рукой,5)
        ...                             
61789   CALL 62549 (удар коленом,8)     
        ...                             
62361   CALL 62549 (удар с разворота,8) 
        ...                             
                                        
  Заметим, что перед вызовом 62549 в ре-
гистровую пару HL помещается адрес таб- 
лицы эффекта, т.е. мы можем в дальнейшем
испльзовать HL для своих нужд.          
  Теперь нужно определить каким эффектам
соответствуют найденные адреса. Для это-
го ничего не остается делать, чем пройти
всю игру от начала до конца, ставя точку
останова в 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 - музыка в меню                     
                                        
  Сложнее отыскать неозвученные эффекты.
Здесь придется изрядно потрудиться. Если
нужное место в программе сходу не найти,
придется его искать методом проб и  оши-
бок. Например, нужно найти прыжок:  смо-
трим  опрос  клавиатуры,  находим  опрос
клавиши "вверх"  и  "огонь",  запоминаем
какие системные переменные  устанавлива-
ются при нажатии  этих  клавиш,  находим
ссылки на них  и  смотрим  программу  за
этими ссылками, ставим в  подозрительных
местах точки останова, наконец находим: 
                                        
        ...                             
60516   LD HL,60545 ;прыжок по диагонали
        JR 60524                        
60521   LD HL,60601 ;прыжок вверх       
60524   LD A,248                        
        ...                             
                                        
  Аналогично находим остальные эффекты. 
                                        
 Надо учесть еще несколько моментов:    
Во-первых: звук (11) для бипера  вызыва-
ется в цикле, для "GS" нужно вызвать его
только  один   раз  и  заглушить,  когда
с мотоцикла сбит  человек.  Значит  надо
найти место "гибели" мотоцикла,  смотрим
в каких  случаях  программа  доходит  до
адреса 58403,  где  в  цикле  вызывается
звук мотора мотоцикла.  Чуть  ранее нахо
дим проверку на наличие мотоцикла:      
                                        
        ...                             
58350   BIT 7,(HL)                      
        JP NZ,59145                     
        ...                             
                                        
 По адресу 59145 находится  подпрограмма
"гибели"  мотоцикла.  Кроме  того,  надо
учесть, что в случае нажатия  на  кнопку
паузы мотоцикл также  надо  заглушить, а
при отжатии снова запустить.            
 Во-вторых:   найдем  падение  тел  -  в
программе  оно  находится  перед смертью
игрока  (ведь  он сначала падает,  затем
уже отбрасывает коньки):                
                                        
        ...                             
59828   RET М                           
        LD (IY+18),0                    
        LD (IY+4),0                     
        LD A,(IY+14)                    
        LD HL,59999                     
        OR A                            
        ...                             
                                        
                                        
 Если программа  прошла  дальше  команды
RET М, значит тело  упало.  У  нас  есть
два звука - непосредственно падение  тя-
желого тела и  вопль  упавшей  тетки  на
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
не изменять,  то после  (или до)  смерти
сутенера  некоторые тетки будут падать с
таким звуком, с каким падают мужики.    
 Кроме того, есть другой способ  иденти-
фикации объекта. Объект  можно  "узнать"
по присущим только ему  одному значениям
системным переменным, например по номеру
спрайта или адресу  спрайта,  который/ые
должны находиться в системных переменных
текущего объекта (именно так различаются
между собой враги в игре  "FROST BYTE"),
но данная методика  подразумевает  более
длительное копание программы, влезание в
те ее уголки, которые к  озвучиванию  не
имеют никакого отношения, одним словом -
это лучше использовать, когда нужно раз-
личить между собой большое количество   
объектов, например в "ZYNAPS"е. A в "TR"
можно остановиться на первом методе.    
 После того, как со всеми  эффектами ра-
зобрались, надо  определить  места,  где
можно подгружать уровни и  соответствую-
щее музыкальное сопровождение.          
 Затем находим все  подпрограммы загруз-
ки и вывода звука для того, чтобы  затем
по их адресам разместить  свои  подпрог-
раммки.                                 
 Да, чуть  не  забыл,  важно  определить
разрешены  или  запрещены  прерывания  в
момент инициализации какого-либо звука -
это нужно будет впоследствии учесть.    
                                        
                 V                      
                                        
          GENERAL'ИЗАЦИЯ                
                                        
 (Полное описание раборы "GS" читайте  в
ZF#6, ZX-NEWS'26 - прим.ред)            
 Для начала немного о самом  "GS".  "GS"
работает независимо от процессора, кроме
моментов, когда нужно  передать/получить
данные в/из "GS". "GS" общается с компь-
ютером через два порта:                 
- порт данных 179 (GSDAT);              
- порт команд 187 (GSCOM).              
                                        
Послать команду в "GS":                 
                                        
SENDCOM  LD A,COMMAND                   
COMMAND  OUT (GSCOM),A ;посылаем команду
WAITCOM  IN A,(GSCOM)  ;ожидаем пока ко-
         RRCA          ;манда не  выпол-
         JR C,WAITCOM  ;нится           
         RET                            
                                        
Послать данные (побайтно) в "GS":       
                                        
SENDDAT  LD A,DATA                      
SENDDATA OUT (GSDAT),A ;посылаем данные 
WAITDAT  IN A,(GSCOM)  ;ожидаем пока"GS"
         RLCA          ;примет данные   
         JR C,WAITDAT                   
         RET                            
                                        
Получить данные (побайтно) из "GS":     
                                        
GETDAT   IN A,(GSDAT)  ;берем данные    
GETDAT1  IN A,(GSCOM)  ;ожидаем пока"GS"
         RLCA          ;подготовит  сле-
         JR NC,GETDAT1 ;дующие данные   
         RET                            
                                        
A вот список команд, которые  пригодятся
при озвучивании:                        
                                        
#30 - загрузить модуль                  
#38 - загрузить сэмпл                   
#D1 - открыть поток                     
#D2 - закрыть поток                     
#31 - запустить модуль                  
#39 - запустить текущий сэмпл           
#32 - остановить модуль                 
#2Е - установить нужный сэмпл           
                                        
для выбранного сэмпла:                  
                                        
#40 - установить ноту (36-71)           
#41 - установить гомкость (0-64)        
#42 - установить finetune (0-255)       
#45 - установить приоритет (0-255)      
#48 - установить начало loop'а          
#49 - установить конец loop'а           
#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-FORMAT #6. A я  поясню  как
работать  с  двумя  недокументированными
командами #48 и #49 для выбранного  сэм-
пла . Эти  команды  необходимы  нам  для
озвучивания  мотора  мотоцикла. Надо за-
нести 24-х  битные  данные о сэмпле: для
команды  #48  это  будет  начало  loop'а
относительно  начала  тела  сэмпла,  для
команды  #49 - конец loop'а относительно
начала тела сэмпла.  A  так это выглядит
на практике:                            
                                        
SETLOOP  LD A,K1                        
         OUT (GSDAT),A                  
         LD A,#48 ;или #49              
         CALL COMMAND                   
         LD A,K2                        
         CALL SENDDATA                  
         LD A,K3                        
         JP SENDDATA                    
                                        
  где  K1, K2 и K3 - младшие, средние  и
старшие восемь битов  24-х  битного зна-
чения.                                  
                                        
  Теперь пара слов о глюке в ПЗУ "GS"   
                                        
 Когда  мотоцикл  прекратит  свое  суще-
ствование, нам понадобится команда  #3A.
Перед ее использованием в GSDAT заносит-
ся маска канала, сэмпл в котором нам на-
до  остановить.  Предусматривалось,  что
номер установленного в маске бита  будет
соответствовать каналу...  Но  из-за не-
большой неточности в ПЗУ, которая навер-
но будет исправлена, оказалось, что нуж-
ному каналу соответсвуют  совсем  другие
биты:                                   
                                        
для канала 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 ;маска каналов 
         OUT (GSDAT),A                  
         LD A,#3A                       
         JP COMMAND                     
                                        
 И  еще  одна неприятность - учтите, что
цикл ожидания (WAITCOM, WAITDAT, GETDAT1
и т.п.) готовности "GS" к приему  после-
дующих команд или данных  может  продол-
жаться от нескольких тактов до трех  со-
тен (!) тактов основного процессора (ре-
жим "турбо" значения не имеет!). Все за-
висит от того, какую работу в данный мо-
мент выполняет "GS" - чем больше  эффек-
тов, да еще и на фоне насыщенной музыки,
тем "тормознее" становится "GS". Если же
проигнорировать цикл ожидания или  вста-
вить  в  него  какую-нибудь   длительную
программу для экономии времени процессо-
ра, то "GS"у станет плохо: в лучшем слу-
чае он начнет хрипеть и врать музыку,  в
худшем - заткнется или повесит  програм-
му, лекарство здесь одно - reset. Поэто-
му сразу откажитесь от подобных выкрута-
сов.  По этой же причине  (чтобы "GS" не
хрипел) прерывания во время обращения  к
"GS" надо запрещать.                    
                                        
 Теперь  давайте определим, сколько пот-
ребуется нам памяти.  Под  драйвер  "GS"
надо где-то  1К  (без всяких извращений,
как в ZYNAPS'е); под загрузчик с заранее
расчитанными таблицами параметров загру-
жаемых блоков около 1-1.5К;  под систем-
ные переменные  TR-DOS,  буфер для стека
и декомпрессора  надо  порядка  1К;  под
замещенный код программы - байт 300-500;
под программу обращения к  драйверу "GS"
надо еще  байт  100;  под  инициализацию
программы - около  200-300  байт;  буфер
под загрузку -  чем  больше,  тем  лучше
(от 16 до 40К).                         
 В большинстве  игр, в  т.ч. в "TR" сво-
бодного места, необходимого под  драйвер
"GS" и загрузчик нет,  поэтому  придется
использовать 128K страницы. В одну стра-
мицу можно упихнуть все выше перечислен-
ное, включая заставку, кроме  буфера под
загрузку - под него можно отвести остав-
шиеся страницы. Кроме того, в оставшихся
страницах можно хранить часть  эффектов,
чтобы не загружать их постоянно  с диска
- это кому как захочется.               
 Итак, в адресном пространстве  все  эти
подпрограммы можно разместить так:      
23296-49151: обращение к драйверу "GS"  
23296-65535, гам page = 0: инициализация
игры; замещенный код программы          
49152-65535, гам page = 1,3,4,6,7: драй-
вер "GS"; загрузчик уровней, эффектов  и
музыки; переменные TR-DOS;  игровая  за-
ставка; разные буфера.                  
 Теперь подробней о всех этих подпрог-  
раммах.                                 
                                        
  Драйвер "GS" вместе с подпрограммами  
        установки каждого звука.        
                                        
 Разместим все это с адреса  49152.  Те-
перь надо  выбрать  входные  параметры -
тут существуют несколько вариантов.     
                                        
1. Например, в HL можно указывать адрес 
подпрограммы установки звука:           
         ...                            
?????    LD HL,EFFECT1                  
         ...                            
49152    JP (HL)                        
         ...                            
EFFECT1  ...                            
                                        
 Удобней всего использовать  именно этот
вариант - занимает  мало  места,  быстро
выполняется. Но возникают сложности  при
работе с группами звуков, тогда  удобней
использовать второй вариант.            
                                        
2. Можно указывать  не  подпрограмму,  а
номер эффекта (регистр L) и ноту  звуча-
ния (регистр Н), тогда:                 
                                        
?????    LD HL,45*256+1                 
         ...                            
49152    LD A,L                         
         OR A                           
         JR Z,EEFECT0                   
         СР 1                           
         JR Z,EFFECT1                   
         СР 2                           
         JR Z,EFFECT2                   
         ...                            
         СР 255                         
         JR Z,LOADING                   
         RET                            
EFFECT0  ...                            
EFFECT1  ...                            
EFFECT2  ...                            
LOADING  ...                            
                                        
 Лучше всего, конечно, использовать пер-
вый вариант.                            
                                        
 В  подпрограммах  EFFECT... сначала на-
до проверить (если это необходимо) нужно
ли выводить звук (например,  мотоцикл  в
в цикле) и какой  (если  для  нескольких
звуков одна точка входа). Затем устанав-
ливается текущий эффект, устанавливается
нота (можно со случайными  значениями  в
допустимых пределах или к разным объект-
ам брать свои ноты), устанавливается ка-
нал проигрывания (если надо),  приоритет
(если надо), громкость (по желанию), па-
раметры loop (если это мотоцикл),  fine-
tune (практического значения не имеет) и
т.п. Сама  подпрограмма  вывода  эффекта
может выглядить следующим образом:      
                                        
EFFECT1 LD A,R    ;звук может звучать на
        AND 3     ;разных нотах         
        ADD A,L                         
        LD L,A                          
        LD C,1                          
        JP PLAYFX                       
                                        
                                        
;подпрограмма проигрывания эффектов в   
;одном из каналов - приоритет не исполь-
;зуется.                                
;C=номер канала, L=номер эффекта, Н=нота
PLAYFX  LD A,L                          
        CALL SETFX                      
        LD A,Н                          
        CALL NOTEFX                     
        LD A,L                          
        OUT (GSDAT),A ;номер FX         
        LD A,#80                        
        OR C                            
        OUT (GSCOM),A                   
        JP WC                           
                                        
;подпрограмма с использованием приорите-
;та FX, проигрывание в любом канале, в  
;котором играется эффект с меньшим прио-
;ритетом или не играется вообще         
;C=приоритет, L=номер эффекта, Н=нота   
PRIOFX  LD A,L                          
        CALL SETFX                      
        LD A,Н                          
        CALL NOTEFX                     
        LD A,C                          
        OUT (GSDAT),A ;приоритет        
        LD A,#45                        
        OUT (GSCOM),A                   
        CALL WC                         
        LD A,L                          
        OUT (GSDAT),A ;номер FX         
        LD A,#39                        
        OUT (GSCOM),A                   
        JR WC                           
                                        
;Сам драйвер "GS" -набор подпрограмм для
;работы с ним                           
STOPMD  LD A,#32      ;остановить модуль
        OUT (GSCOM),A                   
        CALL WC                         
STOPFX  LD A,255      ;остановить       
        OUT (GSDAT),A ;все эффекты      
        LD A,#3A                        
        OUT (GSCOM),A                   
        JR WC                           
SETFX   OUT (GSDAT),A ;номер FX         
        LD A,#2Е                        
        OUT (GSCOM),A                   
        JR WC                           
NOTEFX  OUT (GSDAT),A ;номер ноты FX    
        LD A,#40                        
        OUT (GSCOM),A                   
        JR WC                           
VOLFX   OUT (GSDAT),A ;громк. FX        
        LD A,#41                        
        OUT (GSCOM),A                   
WC      IN A,(GSCOM)  ;ожидание работы  
        RRCA          ;команды          
        RET NC                          
        JR WC                           
        ...           ;остальные команды
                                        
                                        
        Обращение к драйверу "GS".      
                                        
 Может выглядить приблизительно так (для
первого варианта):                      
                                        
GENERAL PUSH AF                         
        PUSH ВС                         
        PUSH DE                         
        LD ВС,32765                     
        LD A,17                         
        OUT (C),A                       
        CALL 49152  ;вызов установки FX 
        LD A,16                         
        LD ВС,32765                     
        OUT (C),A                       
        РОР DE                          
        РОР ВС                          
        РОР AF                          
        RET                             
                                        
  Следует учесть, что прерывания  должны
быть отключены - это необходимо  для из-
бежания глюков с памятью и хрипом "GS". 
                                        
        Инициализация игры.             
                                        
  Здесь следует раскидать все откомпили-
рованные блоки кодов по  своим  адресам;
вычислить нахождение всех частей игры на
диске, зная их  длину  и  последователь-
ность  размещения;  запомнить  системные
переменные  TR-DOS.   Кроме  того,  надо
изменить  в  самой игре все  необходимые
нам места, например, в оригинале:       
                                        
        ...                             
59029   LD HL,54719 ;звук выстрела      
        CALL 62549  ;инициализация звука
        ...                             
                                        
В инициализацию вставляем такой фрагмент
(годен для первого варианта):           
        ...                             
        LD HL,EFFECT...                 
        LD (59030),HL                   
        LD HL,GENERAL                   
        LD (59033),HL                   
        ...                             
                                        
Некоторые части игры не были  предназна-
чены для озвучивания,  например,  гибель
собаки:                                 
                                        
        ...                             
59711   LD A,(IY+20)                    
        СР 13                           
59716   JP Z,58728  ;собака умерла      
        ...                             
                                        
Тогда в инициализацию вставляем  команду
JP DOGDIE:                              
                                        
        ...                             
        LD A,195                        
        LD (59716),A                    
        LD HL,DOGDIE                    
        LD (59717),HL                   
        ...                             
                                        
Подпрограмма DOGDIE находится в замещен-
ном коде игры.                          
                                        
        Замещенный код игры.            
                                        
  Это набор подпрограмм, которые  невоз-
можно вставить в код игры из-за  их раз-
меров, и выполняющие  замещенные команды
игры и  команды  озвучивания.  Для  под-
программы DOGDIE это будет:             
                                        
DOGDIE  JP NZ,59719; собака не умерла   
        PUSH HL                         
        LD HL,EFFECT...                 
        ;DI ;если прерывания разрешены, 
            ;ставим запрет              
        CALL GENERAL                    
        ;EI                             
        РОР HL                          
        JP 58728                        
                                        
        Загрузчик уровней.              
                                        
  Здесь вы сами решите как его организо-
вать. Единственные советы - отводите под
загрузку максимально возможное  количес-
тво памяти (всю игру  можно на время за-
помнить в страницах 128K)  для более бы-
строй загрузки;  старайтесь использовать
только точку входа TR-DOS 15635,  а если
очень  хочется  применить  турбо-лоадер,
сделайте  возможность   его  отключения,
иначе  ваша  игра  не  будет грузиться с
винчестера (SMUC), на некоторых контрол-
лерах дисководов и на других версиях TR-
DOS.                                    
                                        
                                        
иначе  ваша  игра  не  будет грузиться с
винчестера (SMUC), на некоторых контрол-
лерах дисководов и на других версиях TR-
DOS.                                    
                                        
                                        
                 VI                     
                                        
             ЗАКЛЮЧЕНИЕ                 
                                        
 Надеюсь, что многое  из  вышесказанного
пригодится вам. Если  что-то  непонятно,
или я что-нибудь пропустил - звоните мне
вечером после 21.00 по тел.             
     (812) 262-00-89 (Михаил).          
 Мыло в SPbZX-NET и в Vector просьба  не
бросать - в сеть я давно не лазаю, а мой
адрес на  Genius BBS  загнулся  вместе с
самой BBS.                              
                                        
                                        
                                        



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

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

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

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

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тaнинcкaя Библия - Книгa Люцифeрa VIII. O Чeлoвeчecкom Жeртвoпринoшeнии.
Hard group - Расширение памяти компьютера "Синтез-2" до 128 Кб.
Articles - беседы о сцене, c-jeff VS elfh: "в 2000-е годы каждую неделю выходили новые релизы, была пресса, а сейчас какое-то блядство..."

В этот день...   21 ноября