Imported Upstream version 2.9.0
[debian/cc1111] / device / lib / pic16 / startup / crt0.c
1 /*
2  * crt0.c - SDCC pic16 port runtime start code
3  *
4  *
5  * Converted for SDCC and pic16 port
6  * by Vangelis Rokas (vrokas@otenet.gr)
7  *
8  * based on Microchip MPLAB-C18 startup files
9  *
10  * This program is free software; you can redistribute it and/or modify it
11  * under the terms of the GNU General Public License as published by the
12  * Free Software Foundation; either version 2, or (at your option) any
13  * later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23  *
24  * In other words, you are welcome to use, share and improve this program.
25  * You are forbidden to forbid anyone else to use, share and improve
26  * what you give them.   Help stamp out software-hoarding!
27  *
28  * $Id: crt0.c 5183 2008-05-26 18:55:44Z tecodev $
29  */
30
31 extern stack_end;
32 extern TBLPTRU;
33
34 /* external reference to the user's main routine */
35 extern void main (void);
36
37 void _entry (void) __naked __interrupt 0;
38 void _startup (void) __naked;
39
40 /* Access bank selector. */
41 #define a 0
42
43
44 /*
45  * entry function, placed at interrupt vector 0 (RESET)
46  */
47 void _entry (void) __naked __interrupt 0
48 {
49   __asm
50     goto    __startup
51   __endasm;
52 }
53
54 void _startup (void) __naked
55 {
56   __asm
57     ; Initialize the stack pointer
58     lfsr    1, _stack_end
59     lfsr    2, _stack_end
60
61     ; 1st silicon does not do this on POR
62     clrf    _TBLPTRU, a
63
64     ; Initialize the flash memory access configuration.
65     ; This is harmless for non-flash devices, so we do it on all parts.
66     bsf     0xa6, 7, a      ; EECON1.EEPGD = 1, TBLPTR accesses program memory
67     bcf     0xa6, 6, a      ; EECON1.CFGS  = 0, TBLPTR accesses program memory
68   __endasm;
69
70   /* Call the main routine. */
71   main();
72
73   __asm
74 lockup:
75     ; Returning from main will lock up.
76     bra     lockup
77   __endasm;
78 }
79