]> cloudbase.mooo.com Git - avrcpm.git/blob - avr/macros.inc
* cpm/BIOS.MAC
[avrcpm.git] / avr / macros.inc
1 ; Commonly used macros
2 ;
3 ; Copyright (C) 2010,2012,2013 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 ;save current position
110 .org @0 ;vector address
111 .set dist_ = pos_ - (PC+1)
112
113 .if dist_ <= 2048
114 rjmp pos_
115 .elif (dist_ - (FLASHEND+1)) > -2048
116 .set disp_ = (dist_ - (FLASHEND+1)) & 0xFFF
117 ; rjmp pos_ - (FLASHEND+1)
118 .dw 0xC000 | disp_
119 .else
120 jmp pos_ ;jump to handler
121 .endif
122
123 .org pos_ ;restore PC
124 .endm
125
126 ;------------------------------------------------
127 ;
128 ;
129
130 #if 1
131
132 .macro ljmp
133 .if FLASHEND > 0x0fff
134 .ifdef @0
135 .set dist_ = @0 - (PC+1)
136 .if dist_ < 0
137 .if dist_ >= -2048
138 rjmp @0
139 .elif dist_ < -(FLASHEND+1-2048)
140 .dw 0xC000 | (dist_ + (FLASHEND+1)) & 0xFFF
141 .else
142 jmp @0
143 .endif
144 .else ; >0
145 .if (dist_ < 2048)
146 rjmp @0
147 .elif dist_ > (FLASHEND+1-2048)
148 .dw 0xC000 | (dist_ - (FLASHEND+1)) & 0xFFF
149 .else
150 jmp @0
151 .endif
152 .endif
153 .else ; not def @0
154 jmp @0
155 .endif
156 .else ; <= 0x0fff
157 rjmp @0
158 .endif
159 .endm
160
161 #else
162
163 .macro ljmp
164 .if FLASHEND > 0x0fff
165 .ifdef @0
166 .if abs(PC - @0) > 2047
167 jmp @0
168 .else
169 rjmp @0
170 .endif
171 .else
172 jmp @0
173 .endif
174 .else
175 rjmp @0
176 .endif
177 .endm
178 #endif
179
180 ;------------------------------------------------
181 ;
182 ;
183 .macro lcall
184 .if FLASHEND > 0x0fff
185 .ifdef @0
186 .set dist_ = @0 - (PC+1)
187 .if dist_ < 0
188 .if dist_ >= -2048
189 rcall @0
190 .elif dist_ < -(FLASHEND+1-2048)
191 .dw 0xC000 | (dist_ + (FLASHEND+1)) & 0xFFF
192 .else
193 call @0
194 .endif
195 .else ; >0
196 .if (dist_ < 2048)
197 rcall @0
198 .elif dist_ > (FLASHEND+1-2048)
199 .dw 0xC000 | (dist_ - (FLASHEND+1)) & 0xFFF
200 .else
201 call @0
202 .endif
203 .endif
204 .else ; not def @0
205 call @0
206 .endif
207 .else ; <= 0x0fff
208 rcall @0
209 .endif
210 .endm
211
212 ;------------------------------------------------
213 ; Print string.
214 ; printstring "String"
215
216 .macro printstring
217 lcall printstr
218 .if strlen(@0) % 2
219 .db @0,0
220 .else
221 .db @0,0,0
222 .endif
223 .endm
224
225 ;------------------------------------------------
226 ; Print newline
227 ; print cr, lf
228
229 .macro printnewline
230 lcall printstr
231 .db 13,0
232 .endm
233
234
235 ;------------------------------------------------
236 ; Print a Z80 flag
237 ; print_zflag F
238 ; where F is the flag to print
239
240 .macro print_zflag
241
242 .set S_ = 'S'
243 .set Z_ = 'Z'
244 .set H_ = 'H'
245 .set P_ = 'P'
246 .set N_ = 'N'
247 .set C_ = 'C'
248
249 ldi temp, ' '
250 sbrc z_flags,ZFL_@0
251 ldi temp, @0_
252 rcall uartputc
253 .endm
254
255 ;------------------------------------------------
256 ; db_version VMAJOR, VMINOR
257
258 .macro db_version
259
260 .set maj1_ = @0 / 10
261 .set maj0_ = @0 % 10
262 .set min1_ = @1 / 10
263 .set min0_ = @1 % 10
264
265 .if maj1_
266 .if min1_
267 .db maj1_+'0',maj0_+'0','.',min1_+'0',min0_+'0',0
268 .else
269 .db maj1_+'0',maj0_+'0','.', min0_+'0',0,0
270 .endif
271 .else
272 .if min1_
273 .db maj0_+'0','.',min1_+'0',min0_+'0',0,0
274 .else
275 .db maj0_+'0','.', min0_+'0',0
276 .endif
277 .endif
278 .endm
279
280 ; vim:set ts=8 noet nowrap
281