; CC8E Version 1.3, Copyright (c) B Knudsen Data ; C compiler for the PIC18 microcontrollers ; ************ 24. Jun 2009 9:08 ************* processor PIC18C252 radix DEC INDF0 EQU 0xFEF POSTINC0 EQU 0xFEE POSTDEC0 EQU 0xFED PREINC0 EQU 0xFEC FSR0 EQU 0xFE9 POSTINC1 EQU 0xFE6 FSR1 EQU 0xFE1 px EQU 0x1E p1 EQU 0x02 s EQU 0x03 e EQU 0x04 a EQU 0x07 px_2 EQU 0x08 i EQU 0x09 ax EQU 0x20 pxx EQU 0x2C lp EQU 0x2D C1tmp EQU 0x02 C2tmp EQU 0x02 z EQU 0x00 GOTO main ; FILE 18\demo-ptr.c ;// 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) ;{ pointers ; // p1 is 8 bit wide ; char *p1 = tab1; MOVLW 10 MOVWF p1,0 ; char s = 0; CLRF s,0 ; ; do ; s += *p1 & 3; m001 MOVFF p1,FSR0 CLRF FSR0+1,0 MOVLW 3 ANDWF INDF0,W,0 ADDWF s,1,0 ; while (++p1 < &tab1[10]); INCF p1,1,0 MOVLW 19 CPFSGT p1,0 BRA m001 ; ; // px is 16 bit wide because it can access elements from 2 banks ; px = tu2; CLRF px,0 MOVLW 2 MOVWF px+1,0 ; px = &tu3[9]; MOVLW 27 MOVWF px,0 MOVLW 3 MOVWF px+1,0 ; uns24 e = *px; MOVFF px,FSR0 MOVFF px+1,FSR0+1 MOVFF POSTINC0,e MOVFF POSTINC0,e+1 MOVFF POSTINC0,e+2 ; ; ; // low level pointer access ; FSR0 = &tab1[1]; MOVLW 11 MOVWF FSR0,0 CLRF FSR0+1,0 ; FSR1 = &tab2[0]; MOVLW 20 MOVWF FSR1,0 CLRF FSR1+1,0 ; char a = 10-1; MOVLW 9 MOVWF a,0 ; do { ; POSTINC0 = POSTINC1; // *FSR0++ = *FSR1++; m002 MOVFF POSTINC1,POSTINC0 ; } while (--a > 0); DECFSZ a,1,0 BRA m002 ; ; char *px, i; ; i = *px; MOVFF px_2,FSR0 CLRF FSR0+1,0 MOVFF INDF0,i ; ; i = *FSR0; // MOVFF INDF0,i MOVFF INDF0,i ; i = *FSR0++; // MOVFF POSTINC0,i MOVFF POSTINC0,i ; i = *FSR0--; // MOVFF POSTDEC0,i MOVFF POSTDEC0,i ; i = *++FSR0; // MOVFF PREINC0,i MOVFF PREINC0,i ; i = *--FSR0; // MOVF POSTDEC0,W,0 , MOVFF INDF0,i MOVF POSTDEC0,W,0 MOVFF INDF0,i ;} RETURN ; ; ;typedef struct { ; uns16 ab; ; struct { ; uns8 l1; ; uns8 l2; ; } vx; ;} Txx; ; ;Txx ax, bx[2], *pxx; ; ;void sub( void) ;{ sub ; pxx = &ax; MOVLW 32 MOVWF pxx,0 ; ax.ab = 1000; MOVLW 232 MOVWF ax,0 MOVLW 3 MOVWF ax+1,0 ; pxx->vx.l1 = 3; CLRF FSR0+1,0 MOVLW 2 ADDWF pxx,W,0 MOVWF FSR0,0 MOVLW 3 MOVWF INDF0,0 ; ; pxx = &bx[0]; MOVLW 36 MOVWF pxx,0 ; pxx->ab = 0; MOVFF pxx,FSR0 CLRF FSR0+1,0 CLRF POSTINC0,0 CLRF INDF0,0 ; pxx ++; MOVLW 4 ADDWF pxx,1,0 ; pxx->vx.l2 = 0; CLRF FSR0+1,0 MOVLW 3 ADDWF pxx,W,0 MOVWF FSR0,0 CLRF INDF0,0 ;} RETURN ; ; ;/* 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) ;{ sub2 ; if (++lp >= &large[256]) MOVLW 2 ADDWF lp,1,0 MOVLW 0 ADDWFC lp+1,1,0 MOVLW 5 CPFSGT lp+1,0 BRA m003 ; lp = &large[0]; CLRF lp,0 MOVLW 4 MOVWF lp+1,0 ; return *lp; m003 MOVFF lp,FSR0 MOVFF lp+1,FSR0+1 MOVFF POSTINC0,C1tmp MOVFF POSTINC0,C1tmp+1 MOVF C1tmp,W,0 RETURN ;} ; ;uns16 sub3( void) ;{ sub3 ; return *lp; MOVFF lp,FSR0 MOVFF lp+1,FSR0+1 MOVFF POSTINC0,C2tmp MOVFF POSTINC0,C2tmp+1 MOVF C2tmp,W,0 RETURN ;} ; ; ;void main(void) ;{ main ; pointers(); RCALL pointers ; sub(); RCALL sub ; ; lp = &large[0]; CLRF lp,0 MOVLW 4 MOVWF lp+1,0 ; uns16 z = sub2(); RCALL sub2 MOVFF C1tmp,z MOVFF C1tmp+1,z+1 ; z += sub3(); RCALL sub3 ADDWF z,1,0 MOVF C2tmp+1,W,0 ADDWFC z+1,1,0 ;} SLEEP RESET END ; *** KEY INFO *** ; 0x000004 59 word(s) 0 % : pointers ; 0x00007A 27 word(s) 0 % : sub ; 0x0000B0 20 word(s) 0 % : sub2 ; 0x0000D8 10 word(s) 0 % : sub3 ; 0x0000EC 16 word(s) 0 % : main ; RAM usage: 619 bytes (10 local), 917 bytes free ; Maximum call level: 1 ; Total of 134 code words (0 %)