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;

Attachment: 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

Reply via email to