Hello again. In testing more, it appears that this short example is insufficient to reproduce the issue. Sorry for any confusion.
I couldn't make a demonstrative toy example, so I've instead attached a pruned section of the code that originally caused me trouble. It does illustrate incorrect use of the STATUS.IRP register. The pointer use of interest is in set_tris(): (main.c:125 -- 137) void set_tris( uchar pin, uchar val) { print("TRIS: "); printhex(*PINS[pin].tris); print("\r\n"); if (val) *PINS[pin].tris |= (1 << PINS[pin].pinnum); else *PINS[pin].tris ^= (1 << PINS[pin].pinnum); printhex(*PINS[pin].tris); print("\r\n"); } The print() and printhex() function calls are there because they happen to trigger the issue. Before code pruning, they wrote to a circular buffer, but currently do nothing. The code generated for access to INDF is of the form : (main.asm:671 -- 682) CALL __gptrget1 PAGESEL $ BANKSEL r0x100A MOVWF r0x100A BANKSEL FSR MOVWF FSR BCF STATUS,7 BANKSEL r0x100E BTFSC r0x100E,0 BSF STATUS,7 BANKSEL INDF MOVF INDF,W The problem is that the register used in the BTFSC is not correctly initialized. Depending upon the previous use of this register, the IRP bit is set arbitrarily. For example, r0x100E = 0x79 in the attached code, the result of: (main.asm:649 -- 650) MOVLW (__str_2 + 0) MOVWF r0x100E I'd appreciate any discussion of this. Thanks again. ~Jacob On Mon, 18 Feb 2013 20:03:34 -0500 Jacob Joseph <ja...@jjoseph.org> wrote: > Hi. > > I'm using SDCC to target a PIC16F887 and am having some difficulty > with correct behavior of pointers to file registers. The code > generated by SDCC appears to set the STATUS.IRP bank selection bit > incorrectly in some cases. In particular, indirect access to the > TRISC register (0x87, bank 1) generates code with IRP==1, which causes > the indireciton to act instead upon the BAUDCTL register (0x187, bank > 3). > > Consider the following example: > > -------- > /* sdcc --use-non-free --debug-xtra -mpic14 -p16f887 test_irp.c */ > > #define __16f887 > #define NO_BIT_DEFINES > #define NO_LEGACY_NAMES > #include <pic16f887.h> > > // These pointers must be explicitly defined as being to data space, > // or 'check_data' in macros.inc results in them being generic, and > // skipped. > __data unsigned char *TRISCptr = &TRISC; > > void main(void) { > > volatile unsigned char a; > > a = *TRISCptr; > > while(1); > > } > --------- > > The generated code sets FSR = 0x87, as it should. However, before > accessing INDF, it sets bit 7 of STATUS. This is incorrect: > > MOVWF > FSR ;id=162,key=00a,inCond:10,outCond:1,flow seq=001 ;;; > gen.c:5556:SetIrp *{* ;; >>> gen.c:5577:SetIrp > ;; BANKOPT1 BANKSEL dropped; STATUS present in all of FSR's banks > BCF > STATUS,7 ;id=165,key=00b,inCond:21,outCond:21,flow seq=001 ;; > >>> gen.c:5580:SetIrp BANKSEL > >>> r0x1004 ;id=207,key=00c,inCond:0,outCond:0,flow seq=001 > BTFSC > r0x1004,0 ;id=167,key=00d,inCond:21,outCond:0,flow > seq=001 ;<>Start of new flow, seq=0x2 ancestor = 0x1 ; from: 001 ; > to: 003 ;; >>> gen.c:5581:SetIrp > BSF > STATUS,7 ;id=169,key=000,inCond:21,outCond:21,flow > seq=002 ;<>Start of new flow, seq=0x3 ancestor = 0x1 ; from: 002 > 001 ; to: 004 ;; *** genNearPointerGet 5951 > ;; >>> gen.c:5958:genNearPointerGet > BANKSEL > INDF ;id=208,key=000,inCond:0,outCond:0,flow seq=003 > MOVF INDF,W ;id=172,key=001,inCond:1,outCond:14,flow > seq=003 > > > I'd appreciate any help with this. > > Thanks. > ~Jacob
;-------------------------------------------------------- ; File Created by SDCC : free open source ANSI-C Compiler ; Version 3.2.1 #8406 (Jan 31 2013) (MINGW32) ; This file was generated Wed Feb 20 16:13:26 2013 ;-------------------------------------------------------- ; PIC port for the 14-bit core ;-------------------------------------------------------- ; .file "../../Desktop/jtag2/main.c" list p=16f887 radix dec include "p16f887.inc" ;-------------------------------------------------------- ; config word(s) ;-------------------------------------------------------- __config _CONFIG1, 0x23d4 __config _CONFIG2, 0x3fff ;-------------------------------------------------------- ; external declarations ;-------------------------------------------------------- extern _STATUSbits extern _PORTAbits extern _PORTBbits extern _PORTCbits extern _PORTDbits extern _PORTEbits extern _INTCONbits extern _PIR1bits extern _PIR2bits extern _T1CONbits extern _T2CONbits extern _SSPCONbits extern _CCP1CONbits extern _RCSTAbits extern _CCP2CONbits extern _ADCON0bits extern _OPTION_REGbits extern _TRISAbits extern _TRISBbits extern _TRISCbits extern _TRISDbits extern _TRISEbits extern _PIE1bits extern _PIE2bits extern _PCONbits extern _OSCCONbits extern _OSCTUNEbits extern _SSPCON2bits extern _MSKbits extern _SSPMSKbits extern _SSPSTATbits extern _WPUBbits extern _IOCBbits extern _VRCONbits extern _TXSTAbits extern _SPBRGbits extern _SPBRGHbits extern _PWM1CONbits extern _ECCPASbits extern _PSTRCONbits extern _ADCON1bits extern _WDTCONbits extern _CM1CON0bits extern _CM2CON0bits extern _CM2CON1bits extern _SRCONbits extern _BAUDCTLbits extern _ANSELbits extern _ANSELHbits extern _EECON1bits extern _INDF extern _TMR0 extern _PCL extern _STATUS extern _FSR extern _PORTA extern _PORTB extern _PORTC extern _PORTD extern _PORTE extern _PCLATH extern _INTCON extern _PIR1 extern _PIR2 extern _TMR1 extern _TMR1L extern _TMR1H extern _T1CON extern _TMR2 extern _T2CON extern _SSPBUF extern _SSPCON extern _CCPR1 extern _CCPR1L extern _CCPR1H extern _CCP1CON extern _RCSTA extern _TXREG extern _RCREG extern _CCPR2 extern _CCPR2L extern _CCPR2H extern _CCP2CON extern _ADRESH extern _ADCON0 extern _OPTION_REG extern _TRISA extern _TRISB extern _TRISC extern _TRISD extern _TRISE extern _PIE1 extern _PIE2 extern _PCON extern _OSCCON extern _OSCTUNE extern _SSPCON2 extern _PR2 extern _MSK extern _SSPADD extern _SSPMSK extern _SSPSTAT extern _WPUB extern _IOCB extern _VRCON extern _TXSTA extern _SPBRG extern _SPBRGH extern _PWM1CON extern _ECCPAS extern _PSTRCON extern _ADRESL extern _ADCON1 extern _WDTCON extern _CM1CON0 extern _CM2CON0 extern _CM2CON1 extern _EEDAT extern _EEDATA extern _EEADR extern _EEDATH extern _EEADRH extern _SRCON extern _BAUDCTL extern _ANSEL extern _ANSELH extern _EECON1 extern _EECON2 extern __gptrget1 extern __mulchar extern __sdcc_gsinit_startup ;-------------------------------------------------------- ; global declarations ;-------------------------------------------------------- global _set_tris global _print global _printhex global _putc global _main global _PINS global PSAVE global SSAVE global WSAVE global STK12 global STK11 global STK10 global STK09 global STK08 global STK07 global STK06 global STK05 global STK04 global STK03 global STK02 global STK01 global STK00 sharebank udata_ovr 0x0070 PSAVE res 1 SSAVE res 1 WSAVE res 1 STK12 res 1 STK11 res 1 STK10 res 1 STK09 res 1 STK08 res 1 STK07 res 1 STK06 res 1 STK05 res 1 STK04 res 1 STK03 res 1 STK02 res 1 STK01 res 1 STK00 res 1 ;-------------------------------------------------------- ; global definitions ;-------------------------------------------------------- ;-------------------------------------------------------- ; absolute symbol definitions ;-------------------------------------------------------- ;-------------------------------------------------------- ; compiler-defined variables ;-------------------------------------------------------- UDL_main_0 udata r0x1004 res 1 r0x1005 res 1 r0x1007 res 1 r0x1006 res 1 r0x1008 res 1 r0x1002 res 1 r0x1001 res 1 r0x1000 res 1 r0x1003 res 1 r0x1009 res 1 r0x100A res 1 r0x100C res 1 r0x100B res 1 r0x100D res 1 r0x100E res 1 r0x100F res 1 r0x1010 res 1 r0x1011 res 1 r0x1012 res 1 ;-------------------------------------------------------- ; initialized data ;-------------------------------------------------------- ID_main_0 code _PINS retlw (_PORTA + 0) retlw high (_PORTA + 0) retlw (_TRISA + 0) retlw high (_TRISA + 0) retlw 0x00 retlw (_PORTA + 0) retlw high (_PORTA + 0) retlw (_TRISA + 0) retlw high (_TRISA + 0) retlw 0x01 retlw (_PORTA + 0) retlw high (_PORTA + 0) retlw (_TRISA + 0) retlw high (_TRISA + 0) retlw 0x02 retlw (_PORTA + 0) retlw high (_PORTA + 0) retlw (_TRISA + 0) retlw high (_TRISA + 0) retlw 0x03 retlw (_PORTA + 0) retlw high (_PORTA + 0) retlw (_TRISA + 0) retlw high (_TRISA + 0) retlw 0x04 retlw (_PORTA + 0) retlw high (_PORTA + 0) retlw (_TRISA + 0) retlw high (_TRISA + 0) retlw 0x05 retlw (_PORTA + 0) retlw high (_PORTA + 0) retlw (_TRISA + 0) retlw high (_TRISA + 0) retlw 0x06 retlw (_PORTA + 0) retlw high (_PORTA + 0) retlw (_TRISA + 0) retlw high (_TRISA + 0) retlw 0x07 retlw (_PORTB + 0) retlw high (_PORTB + 0) retlw (_TRISB + 0) retlw high (_TRISB + 0) retlw 0x00 retlw (_PORTB + 0) retlw high (_PORTB + 0) retlw (_TRISB + 0) retlw high (_TRISB + 0) retlw 0x01 retlw (_PORTB + 0) retlw high (_PORTB + 0) retlw (_TRISB + 0) retlw high (_TRISB + 0) retlw 0x02 retlw (_PORTB + 0) retlw high (_PORTB + 0) retlw (_TRISB + 0) retlw high (_TRISB + 0) retlw 0x04 retlw (_PORTB + 0) retlw high (_PORTB + 0) retlw (_TRISB + 0) retlw high (_TRISB + 0) retlw 0x05 retlw (_PORTC + 0) retlw high (_PORTC + 0) retlw (_TRISC + 0) retlw high (_TRISC + 0) retlw 0x00 retlw (_PORTC + 0) retlw high (_PORTC + 0) retlw (_TRISC + 0) retlw high (_TRISC + 0) retlw 0x01 retlw (_PORTC + 0) retlw high (_PORTC + 0) retlw (_TRISC + 0) retlw high (_TRISC + 0) retlw 0x02 retlw (_PORTC + 0) retlw high (_PORTC + 0) retlw (_TRISC + 0) retlw high (_TRISC + 0) retlw 0x03 retlw (_PORTC + 0) retlw high (_PORTC + 0) retlw (_TRISC + 0) retlw high (_TRISC + 0) retlw 0x04 retlw (_PORTC + 0) retlw high (_PORTC + 0) retlw (_TRISC + 0) retlw high (_TRISC + 0) retlw 0x05 retlw (_PORTD + 0) retlw high (_PORTD + 0) retlw (_TRISD + 0) retlw high (_TRISD + 0) retlw 0x00 retlw (_PORTD + 0) retlw high (_PORTD + 0) retlw (_TRISD + 0) retlw high (_TRISD + 0) retlw 0x01 retlw (_PORTD + 0) retlw high (_PORTD + 0) retlw (_TRISD + 0) retlw high (_TRISD + 0) retlw 0x02 retlw (_PORTD + 0) retlw high (_PORTD + 0) retlw (_TRISD + 0) retlw high (_TRISD + 0) retlw 0x03 retlw (_PORTD + 0) retlw high (_PORTD + 0) retlw (_TRISD + 0) retlw high (_TRISD + 0) retlw 0x04 retlw (_PORTD + 0) retlw high (_PORTD + 0) retlw (_TRISD + 0) retlw high (_TRISD + 0) retlw 0x05 retlw (_PORTD + 0) retlw high (_PORTD + 0) retlw (_TRISD + 0) retlw high (_TRISD + 0) retlw 0x06 retlw (_PORTD + 0) retlw high (_PORTD + 0) retlw (_TRISD + 0) retlw high (_TRISD + 0) retlw 0x07 retlw (_PORTE + 0) retlw high (_PORTE + 0) retlw (_TRISE + 0) retlw high (_TRISE + 0) retlw 0x00 retlw (_PORTE + 0) retlw high (_PORTE + 0) retlw (_TRISE + 0) retlw high (_TRISE + 0) retlw 0x01 retlw (_PORTE + 0) retlw high (_PORTE + 0) retlw (_TRISE + 0) retlw high (_TRISE + 0) retlw 0x02 ID_main_1 code __str_0 retlw 0x30 ; '0' retlw 0x78 ; 'x' retlw 0x00 ; '.' ID_main_2 code __str_1 retlw 0x54 ; 'T' retlw 0x52 ; 'R' retlw 0x49 ; 'I' retlw 0x53 ; 'S' retlw 0x3a ; ':' retlw 0x20 ; ' ' retlw 0x00 ; '.' ID_main_3 code __str_2 retlw 0x0d ; '.' retlw 0x0a ; '.' retlw 0x00 ; '.' ;-------------------------------------------------------- ; overlayable items in internal ram ;-------------------------------------------------------- ; udata_ovr ;-------------------------------------------------------- ; reset vector ;-------------------------------------------------------- STARTUP code 0x0000 nop pagesel __sdcc_gsinit_startup goto __sdcc_gsinit_startup ;-------------------------------------------------------- ; code ;-------------------------------------------------------- code_main code ;*** ; pBlock Stats: dbName = M ;*** ;entry: _main ;Function start ; 2 exit points ;has an exit ;functions called: ; _init_pic ; _set_tris ; _set_tris ;1 compiler assigned register : ; STK00 ;; Starting pCode block _main ;Function start ; 2 exit points _init_pic ; .line 38; "../../Desktop/jtag2/main.c" INTCON = 0; /* disable all interrupts */ BANKSEL _INTCON CLRF _INTCON ; .line 40; "../../Desktop/jtag2/main.c" TMR0 = 0; CLRF _TMR0 ; .line 42; "../../Desktop/jtag2/main.c" CCP1CON = 0; /* disable CCP */ CLRF _CCP1CON ; .line 43; "../../Desktop/jtag2/main.c" CCP2CON = 0; CLRF _CCP2CON ; .line 47; "../../Desktop/jtag2/main.c" SSPCON = 0; CLRF _SSPCON ; .line 49; "../../Desktop/jtag2/main.c" PIE1 = 0; /* disable peripheral interrupts */ BANKSEL _PIE1 CLRF _PIE1 ; .line 50; "../../Desktop/jtag2/main.c" PIE2 = 0; CLRF _PIE2 ; .line 52; "../../Desktop/jtag2/main.c" CM1CON0 = 0; /* disable comparitors */ BANKSEL _CM1CON0 CLRF _CM1CON0 ; .line 53; "../../Desktop/jtag2/main.c" CM2CON0 = 0; CLRF _CM2CON0 ; .line 55; "../../Desktop/jtag2/main.c" OSCCON = 0x78; /* 8mhz */ MOVLW 0x78 BANKSEL _OSCCON MOVWF _OSCCON ; .line 57; "../../Desktop/jtag2/main.c" OPTION_REG = 0; /* No timers */ CLRF _OPTION_REG ; .line 60; "../../Desktop/jtag2/main.c" PORTA = 0; BANKSEL _PORTA CLRF _PORTA ; .line 61; "../../Desktop/jtag2/main.c" PORTB = 0; CLRF _PORTB ; .line 62; "../../Desktop/jtag2/main.c" PORTC = 0; CLRF _PORTC ; .line 63; "../../Desktop/jtag2/main.c" PORTD = 0; CLRF _PORTD ; .line 64; "../../Desktop/jtag2/main.c" PORTE = 0; CLRF _PORTE ; .line 66; "../../Desktop/jtag2/main.c" ANSEL = 0; /* all digital I/O on AN<7:0> */ BANKSEL _ANSEL CLRF _ANSEL ; .line 67; "../../Desktop/jtag2/main.c" TRISA = 0x00; /* all outputs. */ BANKSEL _TRISA CLRF _TRISA ; .line 69; "../../Desktop/jtag2/main.c" ANSELH = 0; /* all digital I/O on AN<7:0> */ BANKSEL _ANSELH CLRF _ANSELH ; .line 70; "../../Desktop/jtag2/main.c" WPUB = 0; /* PORTB weak pull-ups. Applies when pins are input. */ BANKSEL _WPUB CLRF _WPUB ; .line 71; "../../Desktop/jtag2/main.c" TRISB = 0x00; /* all outputs. */ CLRF _TRISB ; .line 72; "../../Desktop/jtag2/main.c" IOCB = 0; /* Interrupt on change */ CLRF _IOCB ; .line 74; "../../Desktop/jtag2/main.c" TRISC = 0x80; /* all outputs. UART is on RC6(o), RC7(i) */ MOVLW 0x80 MOVWF _TRISC ; .line 76; "../../Desktop/jtag2/main.c" TRISD = 0; /* all outputs */ CLRF _TRISD ; .line 77; "../../Desktop/jtag2/main.c" TRISE = 0; /* out: 0,1,2 RE3 (mclr) is input only */ CLRF _TRISE ; .line 84; "../../Desktop/jtag2/main.c" TXSTAbits.BRGH = 1; /* high speed */ BSF _TXSTAbits,2 ; .line 85; "../../Desktop/jtag2/main.c" BAUDCTLbits.BRG16 = 1; /* 8 bit generator */ BANKSEL _BAUDCTLbits BSF _BAUDCTLbits,3 ; .line 86; "../../Desktop/jtag2/main.c" SPBRG = 16; /* 115.2 kbaud (117.6k actual) with 8Mhz Fosc */ MOVLW 0x10 BANKSEL _SPBRG MOVWF _SPBRG ; .line 88; "../../Desktop/jtag2/main.c" PIE1bits.RCIE = 1; /* enable receive interrupts */ BSF _PIE1bits,5 ; .line 89; "../../Desktop/jtag2/main.c" INTCONbits.PEIE = 1; BANKSEL _INTCONbits BSF _INTCONbits,6 ; .line 90; "../../Desktop/jtag2/main.c" TXSTAbits.TXEN = 1; BANKSEL _TXSTAbits BSF _TXSTAbits,5 ; .line 91; "../../Desktop/jtag2/main.c" RCSTAbits.CREN = 1; BANKSEL _RCSTAbits BSF _RCSTAbits,4 ; .line 92; "../../Desktop/jtag2/main.c" TXSTAbits.SYNC = 0; BANKSEL _TXSTAbits BCF _TXSTAbits,4 ; .line 93; "../../Desktop/jtag2/main.c" RCSTAbits.SPEN = 1; BANKSEL _RCSTAbits BSF _RCSTAbits,7 _00148_DS_ ; .line 143; "../../Desktop/jtag2/main.c" set_tris(0x11, 1); MOVLW 0x01 MOVWF STK00 MOVLW 0x11 CALL _set_tris GOTO _00148_DS_ RETURN ; exit point of _main ;*** ; pBlock Stats: dbName = C ;*** ;entry: _set_tris ;Function start ; 2 exit points ;has an exit ;functions called: ; _print ; __mulchar ; __gptrget1 ; _printhex ; _print ; __gptrget1 ; __gptrget1 ; __gptrget1 ; __gptrget1 ; __gptrget1 ; _printhex ; _print ; _print ; __mulchar ; __gptrget1 ; _printhex ; _print ; __gptrget1 ; __gptrget1 ; __gptrget1 ; __gptrget1 ; __gptrget1 ; _printhex ; _print ;12 compiler assigned registers: ; r0x1009 ; STK00 ; r0x100A ; r0x100B ; r0x100C ; r0x100D ; STK01 ; r0x100E ; r0x100F ; r0x1010 ; r0x1011 ; r0x1012 ;; Starting pCode block _set_tris ;Function start ; 2 exit points ; .line 125; "../../Desktop/jtag2/main.c" void set_tris( uchar pin, uchar val) { BANKSEL r0x1009 MOVWF r0x1009 MOVF STK00,W MOVWF r0x100A ; .line 126; "../../Desktop/jtag2/main.c" print("TRIS: "); MOVLW high (__str_1 + 0) MOVWF r0x100B MOVLW (__str_1 + 0) MOVWF r0x100C MOVLW 0x80 MOVWF r0x100D MOVF r0x100C,W MOVWF STK01 MOVF r0x100B,W MOVWF STK00 MOVF r0x100D,W CALL _print ; .line 127; "../../Desktop/jtag2/main.c" printhex(*PINS[pin].tris); MOVLW 0x05 MOVWF STK00 BANKSEL r0x1009 MOVF r0x1009,W PAGESEL __mulchar CALL __mulchar PAGESEL $ BANKSEL r0x100C MOVWF r0x100C CLRF r0x100B MOVF r0x100C,W ADDLW (_PINS + 0) MOVWF r0x100C MOVLW high (_PINS + 0) MOVWF r0x1009 MOVF r0x100B,W BTFSC STATUS,0 INCFSZ r0x100B,W ADDWF r0x1009,F MOVLW 0x02 ADDWF r0x100C,W MOVWF r0x100B CLRF r0x100D RLF r0x100D,F MOVF r0x1009,W ADDWF r0x100D,F MOVF r0x100B,W MOVWF STK01 MOVF r0x100D,W MOVWF STK00 MOVLW 0x80 PAGESEL __gptrget1 CALL __gptrget1 PAGESEL $ BANKSEL r0x100E MOVWF r0x100E BANKSEL FSR MOVWF FSR BCF STATUS,7 BANKSEL r0x100F BTFSC r0x100F,0 BSF STATUS,7 BANKSEL INDF MOVF INDF,W BANKSEL r0x1010 MOVWF r0x1010 CALL _printhex ; .line 128; "../../Desktop/jtag2/main.c" print("\r\n"); MOVLW high (__str_2 + 0) BANKSEL r0x100F MOVWF r0x100F MOVLW (__str_2 + 0) MOVWF r0x100E MOVLW 0x80 MOVWF r0x1010 MOVF r0x100E,W MOVWF STK01 MOVF r0x100F,W MOVWF STK00 MOVF r0x1010,W CALL _print ; .line 130; "../../Desktop/jtag2/main.c" if (val) BANKSEL r0x100A MOVF r0x100A,W BTFSC STATUS,2 GOTO _00132_DS_ ; .line 131; "../../Desktop/jtag2/main.c" *PINS[pin].tris |= (1 << PINS[pin].pinnum); MOVF r0x100B,W MOVWF STK01 MOVF r0x100D,W MOVWF STK00 MOVLW 0x80 PAGESEL __gptrget1 CALL __gptrget1 PAGESEL $ BANKSEL r0x100A MOVWF r0x100A BANKSEL FSR MOVWF FSR BCF STATUS,7 BANKSEL r0x100E BTFSC r0x100E,0 BSF STATUS,7 BANKSEL INDF MOVF INDF,W BANKSEL r0x100F MOVWF r0x100F MOVLW 0x04 ADDWF r0x100C,W MOVWF r0x1010 CLRF r0x1011 RLF r0x1011,F MOVF r0x1009,W ADDWF r0x1011,F MOVF r0x1010,W MOVWF STK01 MOVF r0x1011,W MOVWF STK00 MOVLW 0x80 PAGESEL __gptrget1 CALL __gptrget1 PAGESEL $ BANKSEL r0x1012 MOVWF r0x1012 MOVLW 0x01 MOVWF r0x1010 MOVF r0x1012,W SUBLW 0x00 BTFSC STATUS,2 GOTO _00140_DS_ _00139_DS_ BANKSEL r0x1010 RLF r0x1010,F ADDLW 0x01 BTFSS STATUS,0 GOTO _00139_DS_ _00140_DS_ BANKSEL r0x1010 MOVF r0x1010,W IORWF r0x100F,F MOVF r0x100A,W BANKSEL FSR MOVWF FSR BCF STATUS,7 BANKSEL r0x100E BTFSC r0x100E,0 BSF STATUS,7 MOVF r0x100F,W BANKSEL INDF MOVWF INDF GOTO _00133_DS_ _00132_DS_ ; .line 133; "../../Desktop/jtag2/main.c" *PINS[pin].tris ^= (1 << PINS[pin].pinnum); BANKSEL r0x100B MOVF r0x100B,W MOVWF STK01 MOVF r0x100D,W MOVWF STK00 MOVLW 0x80 PAGESEL __gptrget1 CALL __gptrget1 PAGESEL $ BANKSEL r0x100A MOVWF r0x100A BANKSEL FSR MOVWF FSR BCF STATUS,7 BANKSEL r0x100E BTFSC r0x100E,0 BSF STATUS,7 BANKSEL INDF MOVF INDF,W BANKSEL r0x100F MOVWF r0x100F MOVLW 0x04 ADDWF r0x100C,F BTFSC STATUS,0 INCF r0x1009,F MOVF r0x100C,W MOVWF STK01 MOVF r0x1009,W MOVWF STK00 MOVLW 0x80 PAGESEL __gptrget1 CALL __gptrget1 PAGESEL $ BANKSEL r0x1010 MOVWF r0x1010 MOVLW 0x01 MOVWF r0x100C MOVF r0x1010,W SUBLW 0x00 BTFSC STATUS,2 GOTO _00142_DS_ _00141_DS_ BANKSEL r0x100C RLF r0x100C,F ADDLW 0x01 BTFSS STATUS,0 GOTO _00141_DS_ _00142_DS_ BANKSEL r0x100C MOVF r0x100C,W XORWF r0x100F,F MOVF r0x100A,W BANKSEL FSR MOVWF FSR BCF STATUS,7 BANKSEL r0x100E BTFSC r0x100E,0 BSF STATUS,7 MOVF r0x100F,W BANKSEL INDF MOVWF INDF _00133_DS_ ; .line 135; "../../Desktop/jtag2/main.c" printhex(*PINS[pin].tris); BANKSEL r0x100B MOVF r0x100B,W MOVWF STK01 MOVF r0x100D,W MOVWF STK00 MOVLW 0x80 PAGESEL __gptrget1 CALL __gptrget1 PAGESEL $ BANKSEL r0x100A MOVWF r0x100A BANKSEL FSR MOVWF FSR BCF STATUS,7 BANKSEL r0x100C BTFSC r0x100C,0 BSF STATUS,7 BANKSEL INDF MOVF INDF,W BANKSEL r0x100B MOVWF r0x100B CALL _printhex ; .line 136; "../../Desktop/jtag2/main.c" print("\r\n"); MOVLW high (__str_2 + 0) BANKSEL r0x100C MOVWF r0x100C MOVLW (__str_2 + 0) MOVWF r0x100A MOVLW 0x80 MOVWF r0x100B MOVF r0x100A,W MOVWF STK01 MOVF r0x100C,W MOVWF STK00 MOVF r0x100B,W CALL _print RETURN ; exit point of _set_tris ;*** ; pBlock Stats: dbName = C ;*** ;entry: _print ;Function start ; 2 exit points ;has an exit ;functions called: ; __gptrget1 ; _putc ; __gptrget1 ; _putc ;6 compiler assigned registers: ; r0x1000 ; STK00 ; r0x1001 ; STK01 ; r0x1002 ; r0x1003 ;; Starting pCode block _print ;Function start ; 2 exit points ; .line 117; "../../Desktop/jtag2/main.c" void print(char *p) { BANKSEL r0x1000 MOVWF r0x1000 MOVF STK00,W MOVWF r0x1001 MOVF STK01,W MOVWF r0x1002 _00123_DS_ ; .line 118; "../../Desktop/jtag2/main.c" while (*p) { BANKSEL r0x1002 MOVF r0x1002,W MOVWF STK01 MOVF r0x1001,W MOVWF STK00 MOVF r0x1000,W PAGESEL __gptrget1 CALL __gptrget1 PAGESEL $ BANKSEL r0x1003 MOVWF r0x1003 MOVF r0x1003,W BTFSC STATUS,2 GOTO _00126_DS_ ; .line 119; "../../Desktop/jtag2/main.c" putc(*p); MOVF r0x1003,W CALL _putc ; .line 120; "../../Desktop/jtag2/main.c" p++; BANKSEL r0x1002 INCF r0x1002,F BTFSC STATUS,2 INCF r0x1001,F BTFSC STATUS,2 INCF r0x1000,F GOTO _00123_DS_ _00126_DS_ RETURN ; exit point of _print ;*** ; pBlock Stats: dbName = C ;*** ;entry: _printhex ;Function start ; 2 exit points ;has an exit ;functions called: ; _print ; _putc ; _putc ; _print ; _putc ; _putc ;7 compiler assigned registers: ; r0x1004 ; r0x1005 ; r0x1006 ; r0x1007 ; r0x1008 ; STK01 ; STK00 ;; Starting pCode block _printhex ;Function start ; 2 exit points ; .line 100; "../../Desktop/jtag2/main.c" void printhex(uchar c){ BANKSEL r0x1004 MOVWF r0x1004 ; .line 102; "../../Desktop/jtag2/main.c" h = c >> 4; SWAPF r0x1004,W ANDLW 0x0f MOVWF r0x1005 ; .line 103; "../../Desktop/jtag2/main.c" print("0x"); MOVLW high (__str_0 + 0) MOVWF r0x1006 MOVLW (__str_0 + 0) MOVWF r0x1007 MOVLW 0x80 MOVWF r0x1008 MOVF r0x1007,W MOVWF STK01 MOVF r0x1006,W MOVWF STK00 MOVF r0x1008,W PAGESEL _print CALL _print PAGESEL $ ;;unsigned compare: left < lit(0xA=10), size=1 ; .line 104; "../../Desktop/jtag2/main.c" if (h < 10) MOVLW 0x0a BANKSEL r0x1005 SUBWF r0x1005,W BTFSC STATUS,0 GOTO _00114_DS_ ;;genSkipc:3246: created from rifx:02755F24 ; .line 105; "../../Desktop/jtag2/main.c" h += '0'; MOVF r0x1005,W MOVWF r0x1007 MOVLW 0x30 ADDWF r0x1007,W MOVWF r0x1005 GOTO _00115_DS_ _00114_DS_ ; .line 107; "../../Desktop/jtag2/main.c" h += ('a' - 10); BANKSEL r0x1005 MOVF r0x1005,W MOVWF r0x1007 MOVLW 0x57 ADDWF r0x1007,W MOVWF r0x1005 _00115_DS_ ; .line 108; "../../Desktop/jtag2/main.c" putc(h); BANKSEL r0x1005 MOVF r0x1005,W CALL _putc ; .line 109; "../../Desktop/jtag2/main.c" h = c & 0xf; MOVLW 0x0f BANKSEL r0x1004 ANDWF r0x1004,W MOVWF r0x1005 ;;unsigned compare: left < lit(0xA=10), size=1 ; .line 110; "../../Desktop/jtag2/main.c" if (h < 10) MOVLW 0x0a SUBWF r0x1005,W BTFSC STATUS,0 GOTO _00117_DS_ ;;genSkipc:3246: created from rifx:02755F24 ; .line 111; "../../Desktop/jtag2/main.c" h += '0'; MOVF r0x1005,W MOVWF r0x1004 MOVLW 0x30 ADDWF r0x1004,W MOVWF r0x1005 GOTO _00118_DS_ _00117_DS_ ; .line 113; "../../Desktop/jtag2/main.c" h += ('a' - 10); BANKSEL r0x1005 MOVF r0x1005,W MOVWF r0x1004 MOVLW 0x57 ADDWF r0x1004,W MOVWF r0x1005 _00118_DS_ ; .line 114; "../../Desktop/jtag2/main.c" putc(h); BANKSEL r0x1005 MOVF r0x1005,W CALL _putc RETURN ; exit point of _printhex ;*** ; pBlock Stats: dbName = C ;*** ;entry: _putc ;Function start ; 2 exit points ;has an exit ;; Starting pCode block _putc ;Function start ; 2 exit points ; .line 97; "../../Desktop/jtag2/main.c" return; RETURN ; exit point of _putc ; code size estimation: ; 305+ 85 = 390 instructions ( 950 byte) end
#include <stdint.h> #include "main.h" const iopin PINS[NUMPORTS] = { {&PORTA, &TRISA, 0}, {&PORTA, &TRISA, 1}, {&PORTA, &TRISA, 2},// {&PORTA, &TRISA, 3},// {&PORTA, &TRISA, 4},// {&PORTA, &TRISA, 5},// {&PORTA, &TRISA, 6},// {&PORTA, &TRISA, 7},// {&PORTB, &TRISB, 0},//8 {&PORTB, &TRISB, 1},//9 {&PORTB, &TRISB, 2},//a {&PORTB, &TRISB, 4},//b {&PORTB, &TRISB, 5},//c {&PORTC, &TRISC, 0},//d {&PORTC, &TRISC, 1},//e {&PORTC, &TRISC, 2},//f {&PORTC, &TRISC, 3},//10 {&PORTC, &TRISC, 4},//11 {&PORTC, &TRISC, 5},//12 {&PORTD, &TRISD, 0},//13 {&PORTD, &TRISD, 1},//14 {&PORTD, &TRISD, 2},//15 {&PORTD, &TRISD, 3},//16 {&PORTD, &TRISD, 4},//17 {&PORTD, &TRISD, 5},//18 {&PORTD, &TRISD, 6},//19 {&PORTD, &TRISD, 7},//1a {&PORTE, &TRISE, 0},//1b {&PORTE, &TRISE, 1},//1c {&PORTE, &TRISE, 2} //1d }; static void init_pic() { INTCON = 0; /* disable all interrupts */ TMR0 = 0; CCP1CON = 0; /* disable CCP */ CCP2CON = 0; /*SSPCON = 0b00100000;*/ /* enable hardware SPI */ /*SSPCON = 0x20;*/ /* enable hardware SPI */ SSPCON = 0; PIE1 = 0; /* disable peripheral interrupts */ PIE2 = 0; CM1CON0 = 0; /* disable comparitors */ CM2CON0 = 0; OSCCON = 0x78; /* 8mhz */ OPTION_REG = 0; /* No timers */ /* Port configuration */ PORTA = 0; PORTB = 0; PORTC = 0; PORTD = 0; PORTE = 0; ANSEL = 0; /* all digital I/O on AN<7:0> */ TRISA = 0x00; /* all outputs. */ ANSELH = 0; /* all digital I/O on AN<7:0> */ WPUB = 0; /* PORTB weak pull-ups. Applies when pins are input. */ TRISB = 0x00; /* all outputs. */ IOCB = 0; /* Interrupt on change */ TRISC = 0x80; /* all outputs. UART is on RC6(o), RC7(i) */ TRISD = 0; /* all outputs */ TRISE = 0; /* out: 0,1,2 RE3 (mclr) is input only */ /* UART configuration */ //TXSTAbits.BRGH = 0; /* low speed */ //BAUDCTLbits.BRG16 = 0; /* 8 bit generator */ //SPBRG = 12; /* 9600 baud (9615 actual) with 8Mhz Fosc */ TXSTAbits.BRGH = 1; /* high speed */ BAUDCTLbits.BRG16 = 1; /* 8 bit generator */ SPBRG = 16; /* 115.2 kbaud (117.6k actual) with 8Mhz Fosc */ PIE1bits.RCIE = 1; /* enable receive interrupts */ INTCONbits.PEIE = 1; TXSTAbits.TXEN = 1; RCSTAbits.CREN = 1; TXSTAbits.SYNC = 0; RCSTAbits.SPEN = 1; } void putc(char c) { return; } void printhex(uchar c){ uchar h; h = c >> 4; print("0x"); if (h < 10) h += '0'; else h += ('a' - 10); putc(h); h = c & 0xf; if (h < 10) h += '0'; else h += ('a' - 10); putc(h); } void print(char *p) { while (*p) { putc(*p); p++; } } /* val: output(0), input(1) */ void set_tris( uchar pin, uchar val) { print("TRIS: "); printhex(*PINS[pin].tris); print("\r\n"); if (val) *PINS[pin].tris |= (1 << PINS[pin].pinnum); else *PINS[pin].tris ^= (1 << PINS[pin].pinnum); printhex(*PINS[pin].tris); print("\r\n"); } void main(void) { init_pic(); while (1) set_tris(0x11, 1); }
#define __16f887 #define NO_BIT_DEFINES #define NO_LEGACY_NAMES #include <pic16f887.h> /* Configuration bits (p210-211) */ static __code uint16_t __at (_CONFIG1) configword1 = _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_ON & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_OFF & _WDT_OFF & _INTOSCIO; static __code uint16_t __at (_CONFIG2) configword2 = _BOR40V; #define INTBUFSIZE 8 #define READBUFSIZE 32 #define TXBUFSIZE 32 #define NUMPORTS 30 #define uchar unsigned char static void init_pic(); void set_tris(uchar pin, uchar val); /* serial comms */ void putc(char c); void print(char *p); void printhex(uchar c); // These pointers must be explicitly defined as being to data space, // or 'check_data' in macros.inc results in them being generic, and // skipped. typedef struct { volatile __data uchar *port; volatile __data uchar *tris; uchar pinnum; } iopin;
signature.asc
Description: PGP signature
------------------------------------------------------------------------------ Everyone hates slow websites. So do we. Make your web apps faster with AppDynamics Download AppDynamics Lite for free today: http://p.sf.net/sfu/appdyn_d2d_feb
_______________________________________________ Sdcc-user mailing list Sdcc-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/sdcc-user