Spectrum Expert
#01
31 октября 1997 |
|
Программирование - адаптация игровых программ под музыкальную карту 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.
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября