]> git.cryptolib.org Git - avr-crypto-lib.git/blob - avr-asm-macros.S
md5_lastBlock() now in ASM
[avr-crypto-lib.git] / avr-asm-macros.S
1 /* avr-asm-macros.S */
2 /*
3     This file is part of the Crypto-avr-lib/microcrypt-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 #include <avr/io.h>
30
31 /*******************************************************************************
32 *  MACRO SECTION                                                               *
33 *******************************************************************************/
34
35 .macro push_ p1:req, p2:vararg
36         push \p1
37 .ifnb \p2       
38         push_ \p2
39 .endif
40 .endm
41
42 .macro pop_ p1:req, p2:vararg
43         pop \p1
44 .ifnb \p2       
45         pop_ \p2
46 .endif
47 .endm
48
49 .macro push_range from:req, to:req
50         push \from
51 .if     \to-\from
52         push_range "(\from+1)",\to
53 .endif          
54 .endm
55
56 .macro pop_range from:req, to:req
57         pop \to
58 .if     \to-\from
59         pop_range \from,"(\to-1)"       
60 .endif
61 .endm
62
63 .macro stack_alloc size:req, reg1=r30, reg2=r31
64         in r0, _SFR_IO_ADDR(SREG)
65         in \reg1, _SFR_IO_ADDR(SPL)
66         in \reg2, _SFR_IO_ADDR(SPH)
67         sbiw \reg1, \size 
68         cli
69         out _SFR_IO_ADDR(SPH), \reg2
70         out _SFR_IO_ADDR(SREG), r0
71         out _SFR_IO_ADDR(SPL), \reg1
72 .endm
73
74 .macro stack_free size:req, reg1=r30, reg2=r31
75         in r0, _SFR_IO_ADDR(SREG)
76         in \reg1, _SFR_IO_ADDR(SPL)
77         in \reg2, _SFR_IO_ADDR(SPH)
78         adiw \reg1, \size 
79         cli
80         out _SFR_IO_ADDR(SPH), \reg2
81         out _SFR_IO_ADDR(SREG), r0
82         out _SFR_IO_ADDR(SPL), \reg1
83 .endm
84
85
86 .macro stack_alloc_large size:req, reg1=r30, reg2=r31
87         in r0, _SFR_IO_ADDR(SREG)
88         in \reg1, _SFR_IO_ADDR(SPL)
89         in \reg2, _SFR_IO_ADDR(SPH)
90         subi \reg1, lo8(\size)
91         sbci \reg2, hi8(\size)   
92         cli
93         out _SFR_IO_ADDR(SPH), \reg2
94         out _SFR_IO_ADDR(SREG), r0
95         out _SFR_IO_ADDR(SPL), \reg1
96 .endm
97
98 .macro stack_free_large size:req, reg1=r30, reg2=r31
99         in r0, _SFR_IO_ADDR(SREG)
100         in \reg1, _SFR_IO_ADDR(SPL)
101         in \reg2, _SFR_IO_ADDR(SPH)
102         adiw \reg1, 63
103         adiw \reg1, (\size-63) 
104         cli
105         out _SFR_IO_ADDR(SPH), \reg2
106         out _SFR_IO_ADDR(SREG), r0
107         out _SFR_IO_ADDR(SPL), \reg1
108 .endm
109
110
111
112 /*******************************************************************************
113 * END of MACRO SECTION                                                         *
114 *******************************************************************************/
115
116
117