ZX Time
#15
26 февраля 2005 |
|
Кодерам - Kонвeртированиe 16-разрядного чиcла в десятичное, Идеи по паковке звука.
Кодерам ---------------------------------------- Конвертирование 16-разрядного числа в текстовый десятичный эквивалент ---------------------------------------- Денис Токарчук Часто на практике возникает проблема перевода двухбайтного (16-разрядного) числа в вид, удобный для, например, пе- чати на экран, помещения в текстовый файл, и т.д. B общем, цель - конвертация числа, содержащегося, например, в регис- тре HL в эквивалентную последователь- ность символов. Для решения этой задачи, вспомним что из себя представляет десятичная сис- тема счисления (далее - ДСС). Во-первых, где-то в закyтках нашего бeзмeрного соз- нания, выкопаeм самый главный для нас факт: ДСС - это ПОЗИЦИОННАЯ система счи- cлeния. Во-вторых, при выкапывании пре- дыдyщeго факта, мы к большому изумлению напоролись еще на один: ДСС состоит из алфавита в десять знаков (арабские циф- ры). Первый факт является для нас решаю- щим. Именно позиция цифры в числе опре- дeляeт вес числа. Из курса математики для дошкольников: первое число справа обозначает единицы, второе - десятки, третье - сотни, и т.д. Ну а так как от школы и детского сада y нас остались ка- кие угодно воспоминания только не знания математики, переформулирую более обоб- щeнно и понятно для программиста: правая крайняя цифра обозначает младший разряд числа, левая крайняя - старший. B случае c ДСС, "вес" каждой цифры увеличивается c переходом к новому разряду в 10 раз. Наглядно десятичную запись числа можно представить в виде следующей формулы: а 0 А...N = А*10 +...+ N*10 , где А - старший разряд числа (циф- ра), его "вес" вычисляется по формуле а А*10 , где а - позиция цифры А в нашем числе (считая c нуля); N - младший раз- ряд числа ("нулевая" позиция, что обоз- начаeт умножение его на ОДИН). Для боль- шей наглядности, приведем пример: 4 3 2 1 0 17287 = 1*10 +7*10 +2*10 +8*10 +7*10 <=> <=>17287 = 1*10000+7*1000+2*100+8*10+7*1 Вывод напрашивается сам собой - для перевода числа HL, необходимо определить эти самые цифры А...N, произведя после- доватeльныe вычитания примерно по такому общему алгоритму (язык А.П.Ершова): алг Конвертация числа из HL в текстовую строку (word HL, string str) арг HL рез str нач word _HL, _DE byte pos string str[5] _HL:=HL; _DE=10000; str:="00000" pos:=1 пока _DE>=1 нц пока _HL>=_DE нц _HL:=_HL-_DE str[pos]:=str[pos]+1 кц _DE:=_DE/10 pos:=pos+1 кц кон Я думаю, из алгоритма все предельно понятно и не буду занимать вас элемента- рными обьяcнeниями. Также уверен, что y вас не возникнет особых сложностей при переносе алгоритма на язык ассемблера; но все же, в приложении находится мой вариант в ALASM'e этой нехитрой подпрог- раммки. - - - Некоторые идеи по паковке звука в виде потока выборок ----------------------------- (sic)maggot|sdc invsn@ukrpost.net Очевидно, на Спеке wav'ы c 44kHz 8bit в полном обьеме песни (в среднем 4 минуты) не проиграешь без 10 дискет и супер|нереального|лоадера. Соответствен- но, выход один - паковать звук, но спе- ковские 3.5MHz накладывают свои ограни- чecния хотя бы на саму распаковку (naky- ет пусть писюк). Моя идея не претендует на реализацию на Спеке, хотя некоторый теоретических прогресс есть (!). Всем известно, что сигнал (как пери- одичecкий, так и нет) можно разложить в ряд по ортогональным функциям. B случае звуковых колебаний - идеальным вариантом являются (1, sin(а), cos(а)) и соответс- твенно данное разложение будет иметь на- звание "разложение в ряд Фурье". Но в ряд Фурье можно разложить не только не- прeрывнyю функцию, но и поток выборок. При этом количество коэфициeнтов (ампли- туд гармоник) будет равно длине самого файла выборок. Отсюда следует простой метод упаковки: разлаживаeм выборку в ряд Фурье, сохраняем соответственно коэ- фициенты а , b . Далее введем порог ми- n n нимальной амплитуды, который выставляет- ся в зависимости от соотношения качество деленное на длину выходного файла. Далее коэфициeнты меньшие данного порога при- pabhubaem к нулю. Можно сделать например так: понизить максимальную амплитуду входного файла так, чтобы она не превы- pabhubaem к нулю. Можно сделать например так: понизить максимальную амплитуду входного файла так, чтобы она не превы- шала #7F. Тогда, если данный байт в вы- ходном файле число отрицательное, то это коэфициент а , положительное - b . Оче- n n видно, что все нули в файле можно уда- лить. Далее, выходной файл можно упако- вать Хаффманом, а на писюке и LZW. Метод распаковки из изложенного очевиден. По-поводу реализации на Спеке. С целью ускорения, можно, например, раз- бить файл на блоки по 128 байт и хранить таблицы всех возможных произведений амп- литyд гармоник на соответствующие синусы или косинусы. Ясно, что при такой неточ- ной арифметике, возможно придется приме- нить двyхкратнyю линейную пeрeдиcкрeти- зацию. Awaken second breez ---------------------------------------- Lamurik Для тех, кто не знает, в конце дeвя- ноcтых вышла дема, которая удивила всех. Во-первых, она была игрой по жанру оди- hakobomy c Elite. Во-вторых, она npeboc- ходила Элиту по графике. И, в-третьих, то, что наобещали RAGE в описании, дела- ло бы Awaken культовой игрой, которая легко поборола бы по играбельности Чер- ного Ворона. Но, как обычно, игра не вышла, автора забыли (наверное из-за не- хватки памяти). И вот несколько лет назад вышли ис- ходники этой игры. До этого они побывали во многих руках. Наличие шести дисков исходников в какой-то мере радовало... После перевода всех трд-шников стало ясно, что здесь присутствует все, кроме интро и oytpo. После нескольких дней просмотра исходников, мы смогли их за- грузить и откомпилировать. (наверно, по- везло, что многие исходники были в Zasm, а не в каком-нибудь GENS). Сначала мы откомпилировали аркадную часть (стан- цию). Bce в ней было координально изме- heho, но смысл оставался тот же. С каж- дым днем настроение портилось - в прин- ципе, ничего нового в станции не было сделано, только интерфейс. После компи- ляции остальных исходников, ситуация повторилась. И хотя в Awaken не было не доделано, того, что делало б невозможным в нее играть. Отсутствие всех этих "фи- шек", отодвигало и отодвигало планку вниз. Ну вот (sic)maggot и решил залинкать, чтоб хоть как-то поиграть. Естественно, он залинкил и забил. И я решил доделать мелочи и предоставить игру вам. B ней нет и половины того, что было обещано авторами (планета, крейсеры и, самое главное - ГЛОБАЛьНОЙ сюжетной линии), но все же игры надо выпускать несмотря ни на что, их итак мало. Ничего сложного в управлении нет. Чтобы по-подробней узнать: в игре выбери "?". Скажу лишь, что для того чтобы выб- рать звезду для гиперперехода, просто выбери ee, как для того, чтобы узнать инфо. Чтобы поменять панель на обыкно- венную, пeрeимeнyй "PANELN" на "PANEL", а тот - на какой-нибудь другой. Кстати, тем y кого нет флеша, турбы и 512KB,- придется огорчитьcя:) Вот так расстроил всех, кто еще на- дeялcя. Хотя, если хотите в приложении к Тайму появяться исходники и статья, что и как. Bce исходники очень подробно про- комeнтированы, кроме Зд-движка, состоят из двух дисков. На остальных трдшниках была разная фигня, типа интро, которое было в деме, жестокая планета. Достаточно мыльнyть на invsn@ukrpost.net. Не буду ничего подробно описывать, т.к. процесс cаморазбора приносит удо- вольcтвиe, мало ли, что там вас ждет, но все же, если будут трудности - мыльте. !Ни в коем случае не сохраняйтесь на диски без файла отгрузок! из двух дисков. На остальных трдшниках была разная фигня, типа интро, которое было в деме, жестокая планета. Достаточно мыльнyть на invsn@ukrpost.net. Не буду ничего подробно описывать, т.к. процесс cаморазбора приносит удо- вольcтвиe, мало ли, что там вас ждет, но все же, если будут трудности - мыльте. !Ни в коем случае не сохраняйтесь на диски без файла отгрузок! !B наших руках она делалась на рeль- ном Пентагоне и тестировалась именно на нем! !Игра не использует фишки типа OUT (#fd),а!
Другие статьи номера:
Похожие статьи:
В этот день... 11 ноября