_linearize: ;--------------------------------------- save context PUSH CORCON PUSH W8 PUSH W9 PUSH W10 ;--------------------------------------- configure accumulators and pointers MOV #0x10C0,W3 ;config accumulators A & B for 1.31 saturation & unsigned mode MOV W3,CORCON MOV W0,W8 ;move address of a1 (in W0) into pointer for X data space (W8) INC2 W0,W9 ;move address of a2 (in W0+2) into pointer for X data space (W9) MOV W1,W10 ;move address of averagedArrays (in W1) into pointer for Y data space (W10) ;--------------------------------------- calculate a1 * averagedArrays CLR A,[W8],W4,[W10],W5 ;[single instruction] ;clear A, pre-load W4 with a1 (pointed to by W8) ;pre-load W5 with averagedArrays (pointed to by W10) MPY W4*W5,A ;multiply a1 (in W4) * averagedArrays (in W5), store result in A ;--------------------------------------- calculate averagedArrays^2 CLR B ;clear B; W5 already pre-loaded with averagedArrays by earlier instruction MPY W5*W5,B,[W9],W4 ;calculate square of averagedArrays (in W5), store result in B, ;preload W4 with a2 (pointed to by W9) SAC.R B,W5 ;store rounded averageArrays^2 into W5 ;--------------------------------------- calculate a2*averagedArrays^2, subtract from a1*averagedArraysd MSC W4*W5,A ;[single instruction] ;multiply a2 (in W4) * averagedArrays^2 (in W5) ;subtract result from A, store result in A SAC.R A,[W2] ;round and store result in A to linearOut (pointed to by W2) ;---------------------------------------;restore context and return POP W10 POP W9 POP W8 POP CORCON RETURN .end