.model TINY ; com
.486 ; nebudeme suchaři
.code
org 100h
start:
Mov fs,Tbl_seg
Finit ; nutné
Xor ecx,ecx
Mov Kopr,ecx
Mov cx,360 ; máme 360 stupňů
Xor di,di
@SinLoop:
Fild kopr ; do ST(0) nahraju prom. kopr
(tj. stupeň)
Fldpi ; do ST se nahraje PI - hodnota
prom. Kopr bude posunuta o
jednu dolů - tj. ST(1)
Fmulp ; násobí ST(1)=ST(1)*ST(0) a pak
; odstraní ST(0) ze zásobníku -
tzn. ST(1) se stane ST(0)
Fild cst1 ; do ST(0) hodí konstantu ...
(přepočet na radiány)
; v ST(1) je teď kopr*Pi
Fdivp ; ST(1) =ST(1) / ST(0) a odstraní ST
; ST(0) = kopr * PI / 180
Fsin ; udělá sínus ST a uloží do ST
Fild cst ; do ST(0) hodí fixed-point konstantu
Fmulp ; opět násobení ...
Fistp dword ptr FS:[DI] ; a vypočítanou hodnotu hodíme do
paměti a uklidíme po sobě poslední
stopy ;-)
Add DI,4 ; pracujeme s DWordama ...
Inc dword ptr kopr ; zvětšíme o 1 a jdeme na další ...
Loop @Sinloop
Retn
Kopr dd 0
Pom dd 0
Cst dd 65536 ; fix-point cst ... zvolena kvůli
pozdějšímu jednoduchému shiftu
o 16 :)
Cst1 dw 180 ; kvůlivá převodu na radiány
Tbl_seg dw 07000h ; nechutně obsadíme nějaký segment
end start
výheň