* src/pic16/device.c (Pics16[]): added devices 18F2550, 18F4331,
[fw/sdcc] / 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$
29  */
30
31 extern stack;
32 extern stack_end;
33
34 extern TBLPTRU;
35
36 /* external reference to the user's main routine */
37 extern void main (void);
38
39 /* prototype for the startup function */
40 void _entry (void) _naked interrupt 0;
41 void _startup (void) _naked;
42
43
44 /*
45  * entry function, placed at interrupt vector 0 (RESET)
46  */
47
48 void _entry (void) _naked interrupt 0
49 {
50   _asm goto __startup _endasm;
51 }
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     clrf _TBLPTRU, 0    // 1st silicon doesn't do this on POR
61     
62     // initialize the flash memory access configuration. this is harmless
63     // for non-flash devices, so we do it on all parts.
64     bsf 0xa6, 7, 0
65     bcf 0xa6, 6, 0
66
67   _endasm ;
68     
69   /* Call the user's main routine */
70   main();
71
72 loop:
73   /* return from main will lock up */
74   goto loop;
75 }
76