// POINTERS AND INDEXED TABLES #pragma chip PIC18C252 char tab1[10]; char tab2[10]; bank2 uns24 tu2[10]; bank3 uns24 tu3[10]; uns24 *px; void pointers( void) { // p1 is 8 bit wide char *p1 = tab1; char s = 0; do s += *p1 & 3; while (++p1 < &tab1[10]); // px is 16 bit wide because it can access elements from 2 banks px = tu2; px = &tu3[9]; uns24 e = *px; // low level pointer access FSR0 = &tab1[1]; FSR1 = &tab2[0]; char a = 10-1; do { POSTINC0 = POSTINC1; // *FSR0++ = *FSR1++; } while (--a > 0); char *px, i; i = *px; i = *FSR0; // MOVFF INDF0,i i = *FSR0++; // MOVFF POSTINC0,i i = *FSR0--; // MOVFF POSTDEC0,i i = *++FSR0; // MOVFF PREINC0,i i = *--FSR0; // MOVF POSTDEC0,W,0 , MOVFF INDF0,i } typedef struct { uns16 ab; struct { uns8 l1; uns8 l2; } vx; } Txx; Txx ax, bx[2], *pxx; void sub( void) { pxx = &ax; ax.ab = 1000; pxx->vx.l1 = 3; pxx = &bx[0]; pxx->ab = 0; pxx ++; pxx->vx.l2 = 0; } /* An array that need to cross page boundaries can optionally be assigned a specific start address. This start address is only required when the array is less than 257 bytes and need to cross a 256 byte boundary. */ uns16 large[256] @ 0x400; // bank 4 and 5 size2 uns16 *lp; uns16 sub2( void) { if (++lp >= &large[256]) lp = &large[0]; return *lp; } uns16 sub3( void) { return *lp; } void main(void) { pointers(); sub(); lp = &large[0]; uns16 z = sub2(); z += sub3(); }