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 <[email protected]> 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 [email protected] https://lists.sourceforge.net/lists/listinfo/sdcc-user
