Listing 1—Here 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)