; ; This program originally available on the Motorola DSP bulletin board. ; It is provided under a DISCLAMER OF WARRANTY available from ; Motorola DSP Operation, 6501 Wm. Cannon Drive W., Austin, Tx., 78735. ; ; Linear Table Lookup/Interpolation Routine for Function Generation ; ; Last Update 16 Apr 87 Version 1.1 ; ; This program provides a fixed-point implementation of a table ; lookup/interpolation (of form given in TLI.HLP). ; ; The example will generate a 255 point sine wave by ; interpolating between the points of a 17 point sine wave. ; opt cex,mex page 132,66,0,10 dataout equ $fffe ; output file deg equ 3.141592654/180.0 ;conversion from radians to degrees org x:$10 ; ; Function points Y(i)=f(X(i)): Sine wave of magnitude 1/2 ; bptbl ;breakpoint table for function dc @sin(0.0*deg)/2.0 dc @sin(22.5*deg)/2.0 dc @sin(45.0*deg)/2.0 dc @sin(67.5*deg)/2.0 dc @sin(90.0*deg)/2.0 dc @sin(112.5*deg)/2.0 dc @sin(135.0*deg)/2.0 dc @sin(157.5*deg)/2.0 dc @sin(180.0*deg)/2.0 dc @sin(202.5*deg)/2.0 dc @sin(225.5*deg)/2.0 dc @sin(247.5*deg)/2.0 dc @sin(270.0*deg)/2.0 dc @sin(292.5*deg)/2.0 dc @sin(315.0*deg)/2.0 dc @sin(337.5*deg)/2.0 dc @sin(360.0*deg)/2.0 n equ 4 ;number of bits in X(i) org p:$100 ; ; Start of program ; move #-1.0,a ;initial angle =0 degrees ; note: A will vary from -1.0 to 1.0 to represent an angle ; varying from 0.0 to 360.0 move a,x:0 ;save it do #255,_esine ;do 255 steps ; ; table lookup/interpolation routine ; clr b #$80,x0 ;mask for sign flip add x0,a #>bptbl,x0 ;flip sgn bit, point to fcn tbl do #n,_es ;shift n bits into b lsl a ;to become the index into the rol b ;function breakpoint table _es add x0,b #0,a2 ;add base to ptr, make A positive lsr a b1,r0 ;make A a fraction, move ptr ; This produces 2**(n-1) (X-X(i)) ; Which is equal to (X-X(i))/(X(i+1)-X(i)) move a,x0 ;move A for later mul move x:(r0)+,b ;get Y(i) move x:(r0),a ;get Y(i+1) sub b,a ;find Y(i+1)-Y(i) move a,y0 ;move Y(i+1)-Y(i) macr y0,x0,b ;find Y(i)+(Y(i+1)-Y(i))*(X-X(i))/2**(n-1) ; ; end of routine ; move b,y:dataout ;output data move x:0,a ;get angle move #$01,x0 ;angle increment (fractional) add x0,a ;increase angle move a,x:0 ;save output _esine end