Как вычислять синус на ассемблере ?
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
Теперь может возникнуть вопрос :
А что это даст нашим программам ?
Это придаст вашей программе реалистич-
ность. Скажите, на что приятней смотреть,
на прыгающий по всем законам физики мяч
или на маячущую вверх-вниз физическую
форму ?
Решать вам.
__________________________________________