diff options
Diffstat (limited to 'firmware/crt1.S')
-rw-r--r-- | firmware/crt1.S | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/firmware/crt1.S b/firmware/crt1.S new file mode 100644 index 0000000..29693ac --- /dev/null +++ b/firmware/crt1.S @@ -0,0 +1,107 @@ + +/* Copyright (c) 2002, Marek Michalkiewicz <marekm@amelek.gda.pl> + Copyright (c) 2007, 2008 Eric B. Weddington + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of the copyright holders nor the names of + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. */ + +/* $Id$ */ + +#if (__GNUC__ < 3) || (__GNUC__ == 3 && __GNUC_MINOR__ < 3) +#error "GCC version >= 3.3 required" +#endif + +/* +#include IOSYMFILE +#include "macros.inc" +*/ +#include <avr/io.h> +//#include <avr/pgmspace.h> + + #define XJMP rjmp + #define XCALL rcall + + .macro vector name + .weak \name + .set \name, __init + XJMP \name + .endm + + .section .vectors,"ax",@progbits + .global __vectors + .global __bad_interrupt + .func __vectors +__bad_interrupt: +__vectors: + XJMP __init + vector __vector_1 + vector __vector_2 + vector __vector_3 + .endfunc + + /* Handle unexpected interrupts (enabled and no handler), which + usually indicate a bug. Jump to the __vector_default function + if defined by the user, otherwise jump to the reset address. + + This must be in a different section, otherwise the assembler + will resolve "rjmp" offsets and there will be no relocs. */ + + .section .init0,"ax",@progbits + .weak __init +; .func __init +__init: + + .weak __stack + .set __stack, RAMEND + /* By default, malloc() uses the current value of the stack pointer + minus __malloc_margin as the highest available address. + + In some applications with external SRAM, the stack can be below + the data section (in the internal SRAM - faster), and __heap_end + should be set to the highest address available for malloc(). */ + .weak __heap_end + .set __heap_end, 0 + + .section .init2,"ax",@progbits + clr R1 + out 0x3f,r1 + ldi r28,lo8(__stack) + ldi r29,hi8(__stack) + out 0x3d, r28 + out 0x3e, r29 + .section .init9,"ax",@progbits + XJMP main +; .endfunc + + + .section .zerotable,"ax",@progbits +zerovectors: + XJMP __init + XJMP __vector_1 + XJMP __vector_2 + XJMP __vector_3 |