]> cloudbase.mooo.com Git - avrcpm.git/blob - avr/macros.inc
* avr/8080int-*.asm
[avrcpm.git] / avr / macros.inc
1 ; Commonly used macros
2 ;
3 ; Copyright (C) 2010 Leo C.
4 ;
5 ; This file is part of avrcpm.
6 ;
7 ; avrcpm is free software: you can redistribute it and/or modify it
8 ; under the terms of the GNU General Public License as published by
9 ; the Free Software Foundation, either version 3 of the License, or
10 ; (at your option) any later version.
11 ;
12 ; avrcpm is distributed in the hope that it will be useful,
13 ; but WITHOUT ANY WARRANTY; without even the implied warranty of
14 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 ; GNU General Public License for more details.
16 ;
17 ; You should have received a copy of the GNU General Public License
18 ; along with avrcpm. If not, see <http://www.gnu.org/licenses/>.
19 ;
20 ; $Id$
21 ;
22
23 ;------------------------------------------------
24 ;
25 .macro outm8
26 .if @0 > 0x3f
27 sts @0,@1
28 .else
29 out @0,@1
30 .endif
31 .endm
32
33 ;------------------------------------------------
34 ;
35 .macro inm8
36 .if @1 > 0x3f
37 lds @0,@1
38 .else
39 in @0,@1
40 .endif
41 .endm
42
43 ;------------------------------------------------
44 ;
45 .macro sbism8
46 .if @0 > 0x1f
47 in _tmp0,@0
48 sbrs _tmp0,@1
49 .else
50 sbis @0,@1
51 .endif
52 .endm
53
54 ;------------------------------------------------
55 ; load 16 bit constant to register pair
56
57 .macro ldiw
58 ldi @0l, low(@1)
59 ldi @0h, high(@1)
60 .endm
61
62 ;------------------------------------------------
63 ; load 16 bit direct from data space
64
65 .macro ldsw
66 lds @0l, @1
67 lds @0h, @1+1
68 .endm
69
70 ;------------------------------------------------
71 ; store 16 bit direct to data space
72
73 .macro stsw
74 sts @0, @1l
75 sts @0+1,@1h
76 .endm
77
78 ;------------------------------------------------
79 ; add 16 bit constant to register pair
80
81 .macro addiw
82 subi @0l, low(-@1)
83 sbci @0h, high(-@1)
84 .endm
85
86 ;------------------------------------------------
87 ; sub 16 bit constant from register pair
88
89 .macro subiw
90 subi @0l, low(@1)
91 sbci @0h, high(@1)
92 .endm
93
94 ;------------------------------------------------
95 ; Move single bit between two registers
96 ;
97 ; bmov dstreg,dstbit,srcreg.srcbit
98
99 .macro bmov
100 bst @2,@3
101 bld @0,@1
102 .endm
103
104 ;------------------------------------------------
105 ;
106 ;
107 ;
108 .macro INTERRUPT
109 .set pos_ = PC
110 .org @0 ; vector address
111 .if abs(pos_ - PC) > 2048
112 jmp pos_
113 .else
114 rjmp pos_ ; jump to handler
115 .endif
116 .org pos_ ; restore PC
117 .endm
118
119 ;------------------------------------------------
120 ;
121 ;
122 .macro ljmp
123 .if FLASHEND > 0x0fff
124 .ifdef @0
125 .if abs(PC - @0) > 2047
126 jmp @0
127 .else
128 rjmp @0
129 .endif
130 .else
131 jmp @0
132 .endif
133 .else
134 rjmp @0
135 .endif
136 .endm
137
138 ;------------------------------------------------
139 ;
140 ;
141 .macro lcall
142 .if FLASHEND > 0x0fff
143 .ifdef @0
144 .if abs(PC - @0) > 2047
145 call @0
146 .else
147 rcall @0
148 .endif
149 .else
150 call @0
151 .endif
152 .else
153 rcall @0
154 .endif
155 .endm
156
157 ;------------------------------------------------
158 ; Print string.
159 ; printstring "String"
160
161 .macro printstring
162 .if FLASHEND > 0x0fff
163 call printstr
164 .else
165 rcall printstr
166 .endif
167 .if strlen(@0) % 2
168 .db @0,0
169 .else
170 .db @0,0,0
171 .endif
172 .endm
173
174 ;------------------------------------------------
175 ; Print newline
176 ; print cr, lf
177
178 .macro printnewline
179 lcall printstr
180 .db 13,0
181 .endm
182
183
184 ;------------------------------------------------
185 ; Print a Z80 flag
186 ; print_zflag F
187 ; where F is the flag to print
188
189 .macro print_zflag
190
191 .set S_ = 'S'
192 .set Z_ = 'Z'
193 .set H_ = 'H'
194 .set P_ = 'P'
195 .set N_ = 'N'
196 .set C_ = 'C'
197
198 ldi temp, ' '
199 sbrc z_flags,ZFL_@0
200 ldi temp, @0_
201 rcall uartputc
202 .endm
203
204 ;------------------------------------------------
205 ; db_version VMAJOR, VMINOR
206
207 .macro db_version
208
209 .set maj1_ = @0 / 10
210 .set maj0_ = @0 % 10
211 .set min1_ = @1 / 10
212 .set min0_ = @1 % 10
213
214 .if maj1_
215 .if min1_
216 .db maj1_+'0',maj0_+'0','.',min1_+'0',min0_+'0',0
217 .else
218 .db maj1_+'0',maj0_+'0','.', min0_+'0',0,0
219 .endif
220 .else
221 .if min1_
222 .db maj0_+'0','.',min1_+'0',min0_+'0',0,0
223 .else
224 .db maj0_+'0','.', min0_+'0',0
225 .endif
226 .endif
227 .endm
228
229 ; vim:set ts=8 noet nowrap
230