; CC7A Ver 1.0D, Copyright (c) B Knudsen Data ; C compiler for the PIC18 microcontrollers ; ************ 24. Feb 2011 12:28 ************* processor 17C766 radix DEC INDF0 EQU 0x00 FSR0 EQU 0x01 INDF1 EQU 0x08 FSR1 EQU 0x09 WREG EQU 0x0A BSR EQU 0x0F px EQU 0x2F p1 EQU 0x20 s EQU 0x21 e EQU 0x1A a EQU 0x22 px_2 EQU 0x23 i EQU 0x24 ax EQU 0x31 bx EQU 0x35 pxx EQU 0x3D lp EQU 0x3E dx EQU 0x120 C1tmp EQU 0x20 z EQU 0x220 GOTO main ; FILE 17\demo-ptr.c ;// POINTERS AND INDEXED TABLES ; ;#pragma chip PIC17C766 // select device ; ; ;bank0 char tab1[10]; ;bank1 char tab2[10]; ; ;bank2 uns24 tu2[4]; ;bank3 uns24 tu3[4]; ;uns24 *px; ; ; ;void pointers( void) ;{ pointers ; // p1 is 8 bit wide ; char *p1 = tab1; MOVLW 37 MOVWF p1 ; char s = 0; CLRF s,1 ; do ; s += *p1 & 3; m001 MOVFP p1,FSR0 MOVLW 3 ANDWF INDF0,W ADDWF s,1 ; while (++p1 < &tab1[10]); INCF p1,1 MOVLW 46 CPFSGT p1 GOTO m001 ; ; px = tu2; MOVLW 34 MOVWF px MOVLW 2 MOVWF px+1 ; px = &tu3[9]; MOVLW 59 MOVWF px MOVLW 3 MOVWF px+1 ; shrBank uns24 e = *px; MOVFP px,FSR0 SWAPF px+1,W MOVWF BSR MOVFP INDF0,e INCFSZ FSR0,1 MOVFP INDF0,e+1 INCFSZ FSR0,1 MOVFP INDF0,e+2 ; ; // low level pointer access ; FSR1 = &tab1[1]; MOVLW 38 MOVWF FSR1 ; char a = 10-1; MOVLW 9 MOVLR 0 MOVWF a ; do { ; INDF1 = 0; m002 CLRF INDF1,1 ; } while (--a > 0); DECFSZ a,1 GOTO m002 ; ; char *px, i; ; i = *px; MOVFP px_2,FSR0 MOVPF INDF0,i ; ;} MOVLB 0 RETURN ; ; ;typedef struct { ; uns16 ab; ; struct { ; uns8 l1; ; uns8 l2; ; } vx; ;} Txx; ; ;bank4 Txx ax, bx[2], *pxx; ; ;void sub( void) ;{ sub ; pxx = &ax; MOVLW 49 MOVWF pxx ; ax.ab = 1000; MOVLW 232 MOVWF ax MOVLW 3 MOVWF ax+1 ; pxx->vx.l1 = 3; MOVLW 2 ADDWF pxx,W MOVWF FSR0 MOVLW 3 MOVWF INDF0 ; ; pxx = &bx[0]; MOVLW 53 MOVWF pxx ; bx[1].vx.l2 = 10; MOVLW 10 MOVWF bx+7 ; pxx->ab = 0; MOVFP pxx,FSR0 CLRF INDF0,1 INCFSZ FSR0,1 CLRF INDF0,1 ; pxx ++; MOVLW 4 ADDWF pxx,1 ; pxx->vx.l2 = 0; MOVLW 3 ADDWF pxx,W MOVWF FSR0 CLRF INDF0,1 ;} RETURN ; ; ;bank0 uns16 *lp; ; ;uns16 sub2( void) ;{ sub2 ; bank1 uns16 dx; ; ; lp ++; MOVLW 2 ADDWF lp,1 ; return dx; MOVLR 1 MOVFP dx,WREG RETURN ;} ; ;uns16 sub3( void) ;{ sub3 ; return *lp; MOVFP lp,FSR0 MOVPF INDF0,C1tmp INCFSZ FSR0,1 MOVPF INDF0,C1tmp+1 MOVFP C1tmp,WREG RETURN ;} ; ; ; ;void main(void) ;{ main ; pointers(); MOVLB 0 MOVLR 0 CALL pointers ; sub(); CALL sub ; ; bank2 uns16 z = sub2(); CALL sub2 MOVLR 2 MOVWF z MOVLR 1 MOVFP dx+1,WREG MOVLR 2 MOVWF z+1 ; z += sub3(); MOVLR 0 CALL sub3 MOVLR 2 ADDWF z,1 MOVLR 0 MOVFP C1tmp+1,WREG MOVLR 2 ADDWFC z+1,1 ;} SLEEP GOTO main END ; *** KEY INFO *** ; 0x0001 P0 39 word(s) 0 % : pointers ; 0x0028 P0 26 word(s) 0 % : sub ; 0x0042 P0 5 word(s) 0 % : sub2 ; 0x0047 P0 6 word(s) 0 % : sub3 ; 0x004D P0 21 word(s) 0 % : main ; RAM usage: 72 bytes (12 local), 830 bytes free ; Maximum call level: 1 ; Codepage 0 has 98 word(s) : 1 % ; Codepage 1 has 0 word(s) : 0 % ; Total of 98 code words (0 %)