Odyssey Magazine
#01
05 марта 1997 |
|
Ассемблер - Как вычислить синус на ассемлере.
Как вычислять синус на ассемблере ? Phantom Lord (С) 1997 Music by SHOV Наверное многие заметили, что практичес- ки все эффекты состоят из объектов изме- няющихся или движущихся по некоторым тра- екториям, по синусу. Многие конечно могут возразить, что существуют эффекты, меняю- щие свою форму или координаты вовсе не по синусу. На что я могу лишь ответить: "Вы не правы, молодой человек!". Как сказал один очень хороший ученый: Всякое функциональное отношение можно выразить через функции синуса и косинуса. Но мы же - математики и знаем, что sin(x)=cos(x-pi/2), поэтому фразу можно переделать так: Всякое функциональное отношение можно выразить через функцию синуса. (C) Phantom Lord Вернемся к теме. Итак нам надо иметь синус. Зададим его с уровня Бейсика. 10 let adr=49152 20 for n=0 to 2*pi step pi/128 30 poke adr,sin (n)*127 40 let adr=adr+1 50 next n В итоге мы получим таблицу длинной 256 байт. Каждое значение таблицы является одним из значений функции sin (n)*127. Мы умножили sin (n) на 127, чтобы увеличить его область значений с [-1,1] до [-127,127]. Теперь если брать значения из таблицы строго по порядку,то мы будем брать последовательные значения функции sin (n)*127. Напишем программу изменяющую по синусу цвета атрибутов экрана. AGAIN EI HALT CALL INC_SIN CALL SIN CALL IZM LD A,#7F IN A,(#FE) AND 1 JR NZ,AGAIN RET INC_SIN LD A,0 INC A LD (INC_SIN+1),A RET SIN LD A,(INC_SIN+1) LD L,A LD H,#C0 LD A,(HL) RET IZM LD HL,#5800 LD DE,#5801 LD BC,767 LD (HL),A LDIR RET Процедура INC_SIN позволяет нам пробе- жать по всей таблице, так как всего зна- чений 256, а при увеличении 255 на едини- цу получаем снова 0, т.е. элемент, при- надлежащий множеству определений нашей функции. Это условие называется периодич- ностью функции синус. Процедура SIN выбирает из таблицы синуса следующее значение, а IZM заполняет атри- буты экрана выбранным значением. Переход от "чистого" синуса к некоторым сложным функциям. ABS(SIN(X)) - модуль синуса. Из курса математики средней школы вы наверное знаете, что функция модуль сину- са периодичная с периодом PI. Расмотрим отрезок от сужения функции SIN(X) на по- луотрезке [0,PI/2). Нетрудно подметить, что в этом случае функции совпадают. На- пишем программу расчитывающую функцию ABS(SIN X) исходя из выше изложенных рас- суждений: A_1 CALL SIN_INC CALL SIN JR A_1 SIN_INC LD A,0 INC A AND 127 LD (SIN_INC+1),A RET SIN ... Как видите после команды INC A мы поста- вили AND 127, тем самым ограничив значе- ния SIN только на положительные числа , т.е. на ABS(SIN(X)). -ABS(SIN(X)) Очевидно, что если проделывать аналогич- ные рассуждения, то мы получим программу сходную с предыдущей и отличающуюся от нее только подпрограммой SIN_INC: SIN_INC LD A,0 INC A AND 127 ADD A,128 LD (SIN_INC+1),A RET Теперь может возникнуть вопрос : А что это даст нашим программам ? Это придаст вашей программе реалистич- ность. Скажите, на что приятней смотреть, на прыгающий по всем законам физики мяч или на маячущую вверх-вниз физическую форму ? Решать вам. __________________________________________
Другие статьи номера:
Похожие статьи:
В этот день... 15 октября