]> git.cryptolib.org Git - avr-crypto-lib.git/blob - avr-asm-macros.S
fixing style, typos and uart
[avr-crypto-lib.git] / avr-asm-macros.S
1 /* avr-asm-macros.S */
2 /*
3     This file is part of the AVR-Crypto-Lib.
4     Copyright (C) 2008  Daniel Otte (daniel.otte@rub.de)
5
6     This program is free software: you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation, either version 3 of the License, or
9     (at your option) any later version.
10
11     This program is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with this program.  If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 /*
21  * File:        avr-asm-macros.S
22  * Author:      Daniel Otte
23  * Date:        2008-08-13
24  * License:     GPLv3 or later
25  * Description: some macros which are quite usefull
26  *
27  */
28
29 //#ifndef AVR_ASM_MACROS__S__
30 //#define AVR_ASM_MACROS__S__
31 .nolist
32 #include <avr/io.h>
33 .list
34 /*******************************************************************************
35 *  MACRO SECTION                                                               *
36 *******************************************************************************/
37
38 .macro push_ p1:req, p2:vararg
39         push \p1
40 .ifnb \p2
41         push_ \p2
42 .endif
43 .endm
44
45 .macro pop_ p1:req, p2:vararg
46         pop \p1
47 .ifnb \p2
48         pop_ \p2
49 .endif
50 .endm
51
52 .macro push_range from:req, to:req
53         push \from
54 .if     \to-\from
55         push_range "(\from+1)",\to
56 .endif
57 .endm
58
59 .macro pop_range from:req, to:req
60         pop \to
61 .if     \to-\from
62         pop_range \from,"(\to-1)"
63 .endif
64 .endm
65
66 .macro stack_alloc size:req, reg1=r30, reg2=r31
67         in r0, _SFR_IO_ADDR(SREG)
68         in \reg1, _SFR_IO_ADDR(SPL)
69         in \reg2, _SFR_IO_ADDR(SPH)
70         sbiw \reg1, \size
71         cli
72         out _SFR_IO_ADDR(SPH), \reg2
73         out _SFR_IO_ADDR(SREG), r0
74         out _SFR_IO_ADDR(SPL), \reg1
75 .endm
76
77 .macro stack_free size:req, reg1=r30, reg2=r31
78         in r0, _SFR_IO_ADDR(SREG)
79         in \reg1, _SFR_IO_ADDR(SPL)
80         in \reg2, _SFR_IO_ADDR(SPH)
81         adiw \reg1, \size
82         cli
83         out _SFR_IO_ADDR(SPH), \reg2
84         out _SFR_IO_ADDR(SREG), r0
85         out _SFR_IO_ADDR(SPL), \reg1
86 .endm
87
88
89 .macro stack_alloc_large size:req, reg1=r30, reg2=r31
90         in r0, _SFR_IO_ADDR(SREG)
91         in \reg1, _SFR_IO_ADDR(SPL)
92         in \reg2, _SFR_IO_ADDR(SPH)
93         subi \reg1, lo8(\size)
94         sbci \reg2, hi8(\size)
95         cli
96         out _SFR_IO_ADDR(SPH), \reg2
97         out _SFR_IO_ADDR(SREG), r0
98         out _SFR_IO_ADDR(SPL), \reg1
99 .endm
100
101 .macro stack_free_large size:req, reg1=r30, reg2=r31
102         in r0, _SFR_IO_ADDR(SREG)
103         in \reg1, _SFR_IO_ADDR(SPL)
104         in \reg2, _SFR_IO_ADDR(SPH)
105         adiw \reg1, 63
106         adiw \reg1, (\size-63)
107         cli
108         out _SFR_IO_ADDR(SPH), \reg2
109         out _SFR_IO_ADDR(SREG), r0
110         out _SFR_IO_ADDR(SPL), \reg1
111 .endm
112
113 .macro stack_free_large2 size:req, reg1=r30, reg2=r31
114         in r0, _SFR_IO_ADDR(SREG)
115         in \reg1, _SFR_IO_ADDR(SPL)
116         in \reg2, _SFR_IO_ADDR(SPH)
117         adiw \reg1, 63
118         adiw \reg1, 63
119         adiw \reg1, (\size-63*2)
120         cli
121         out _SFR_IO_ADDR(SPH), \reg2
122         out _SFR_IO_ADDR(SREG), r0
123         out _SFR_IO_ADDR(SPL), \reg1
124 .endm
125
126 .macro stack_free_large3 size:req, reg1=r30, reg2=r31
127         in r0, _SFR_IO_ADDR(SREG)
128         in \reg1, _SFR_IO_ADDR(SPL)
129         in \reg2, _SFR_IO_ADDR(SPH)
130         push r16
131         push r17
132         ldi r16, lo8(\size)
133         ldi r17, hi8(\size)
134         add \reg1, r16
135         adc \reg2, r17
136         pop r17
137         pop r16
138         cli
139         out _SFR_IO_ADDR(SPH), \reg2
140         out _SFR_IO_ADDR(SREG), r0
141         out _SFR_IO_ADDR(SPL), \reg1
142 .endm
143
144
145 /*******************************************************************************
146 * END of MACRO SECTION                                                         *
147 *******************************************************************************/
148
149
150 //#endif /* AVR_ASM_MACROS__S__ */
151