Listing 1Here you see my step-by-step
process from traditional float C code on a PC down to integer assembler code on a PIC.
Step 1: C code on PC, float numbers:
float data[NMAX],h1r;
data[j]=(data[i]-h1r)/2; /* calculation step of FFT routine */
Step 2: C code on PC, integer numbers:
word data[NMAX], h1r;
data[j]=(data[i]-h1r)/2;
Step 3: C code on PC, use of pseudoregister based on fixed-point
library:
fixed.h:
word ra, rb; /* pseudoregisters A and B */
m_sub () /* subtraction function a-b->a */
{ra=ra-rb;};
main program:
/* data[j]=(data[i]-h1r)/2 */
m_ldai(i); /* load data[i] in A register */
m_ldb(h1r); /* load h1r in B register */
m_sub(); /* A = A-B */
m_div2(); /* A = A/2 */
m_stai(j); /* store A in data[j] */
Step 4: Last, translation in PIC assembler
Fixed.inc:
; m_sub : subtract B to A (A = A-B)
m_sub macro
movfp rb+1,WREG ; low byte first
subwf ra+1,1
movfp rb,WREG ; and high byte with borrow
subwfb ra,1
endm
main program:
; data[j]=(data[i]-h1r)/2
m_ldai i ; m_ldai(i)
m_ldb h1r ; m_ldb(h1r)
m_sub ; m_sub()
m_div2 ; m_div2()
m_stai j ; m_stai (j)