Ассемблер - Как вычислить синус на ассемлере.

Odyssey Magazine #01
   Как вычислять синус на ассемблере ?


 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
 
 Теперь может возникнуть вопрос :

     А что это даст нашим программам ?


  Это  придаст вашей программе реалистич-
ность. Скажите, на что приятней смотреть,
на  прыгающий  по всем законам физики мяч
или  на  маячущую  вверх-вниз  физическую
форму ?

 Решать вам.

__________________________________________