51 #ifndef _TN_ARCH_PIC24_BFA_H
52 #define _TN_ARCH_PIC24_BFA_H
76 #define TN_BFA_SET 0x1111
80 #define TN_BFA_CLR 0x2222
84 #define TN_BFA_INV 0x3333
88 #define TN_BFA_WR 0xAAAA
92 #define TN_BFA_RD 0xBBBB
154 #define TN_BFA(comm, reg_name, field_name, ...) \
158 _TN_BFA_STRUCT_TYPE(reg_name) o; \
160 } lcur, lmask={}, lval={}; \
162 lmask.o.field_name = -1; \
164 ((comm) == TN_BFA_WR) \
166 _TN_BFA_COMM_GET(comm) v = __VA_ARGS__+0; \
167 if (lmask.i & (lmask.i-1)){ \
168 lval.o.field_name = v; \
169 lcur.o = _TN_BFA_STRUCT_VAL(reg_name); \
170 __asm__ __volatile__ \
171 ("xor %0":"=U"(reg_name):"a"(lmask.i & (lval.i^lcur.i))); \
175 _TN_BFA_STRUCT_VAL(reg_name).field_name = 1; \
177 _TN_BFA_STRUCT_VAL(reg_name).field_name = 0; \
182 :(((comm) == TN_BFA_INV) \
184 _TN_BFA_COMM_GET(comm) v = __VA_ARGS__+0; \
185 lval.o.field_name = v; \
186 __asm__ __volatile__(" xor %0" \
187 :"=U"(reg_name):"a"(lmask.i & lval.i)); \
190 :((((comm) == TN_BFA_SET) \
192 _TN_BFA_COMM_GET(comm) v = __VA_ARGS__+0; \
193 if (lmask.i & (lmask.i-1)){ \
194 lval.o.field_name = v; \
195 __asm__ __volatile__ \
196 ("ior %0":"=U"(reg_name):"a"(lmask.i & lval.i)); \
199 _TN_BFA_STRUCT_VAL(reg_name).field_name = 1; \
203 :(((((comm) == TN_BFA_CLR) \
205 _TN_BFA_COMM_GET(comm) v = __VA_ARGS__+0; \
206 if (lmask.i & (lmask.i-1)){ \
207 lval.o.field_name = v; \
208 __asm__ __volatile__ \
209 ("and %0":"=U"(reg_name):"a"(~(lmask.i & lval.i))); \
212 _TN_BFA_STRUCT_VAL(reg_name).field_name = 0; \
217 _TN_BFA_STRUCT_VAL(reg_name).field_name; \
270 #define TN_BFAR(comm, reg_name, lower, upper, ...) \
272 unsigned int lmask, lmaskl, lmasku; \
273 lmaskl = (1 << (lower)); \
274 lmasku = (1 << (upper)); \
275 lmask = ((lmaskl-1) ^ (lmasku-1)) | lmaskl | lmasku; \
276 ((comm) == TN_BFA_WR) \
278 _TN_BFA_COMM_GET(comm) v = __VA_ARGS__+0; \
279 v = (v << (((lower) < (upper)) ? (lower) : (upper))) & lmask; \
280 __asm__ __volatile__ \
281 (" xor %0": "=T"(reg_name):"a"(lmask & (v ^ reg_name))); \
283 :(((comm) == TN_BFA_INV) \
285 _TN_BFA_COMM_GET(comm) v = __VA_ARGS__+0; \
286 if (lmask & (lmask-1)) \
288 v = (v << (((lower) < (upper)) ? (lower) : (upper))) & lmask; \
289 __asm__ __volatile__( \
290 " xor %0":"=T"(reg_name):"a"(lmask & v)); \
293 __asm__ __volatile__( \
294 " btg %0, #%1" :"=T"(reg_name) :"i"(lower)); \
298 :(((comm) == TN_BFA_SET) \
300 _TN_BFA_COMM_GET(comm) v = __VA_ARGS__+0; \
301 if (lmask & (lmask-1)) \
303 v = (v << (((lower) < (upper)) ? (lower) : (upper))) & lmask; \
304 __asm__ __volatile__(" ior %0 " \
309 __asm__ __volatile__( \
310 " bset %0, #%1" :"=T"(reg_name) :"i"(lower)); \
314 :((((comm) == TN_BFA_CLR) \
316 _TN_BFA_COMM_GET(comm) v = __VA_ARGS__+0; \
317 if (lmask & (lmask-1)) \
319 v = (v << (((lower) < (upper)) ? (lower) : (upper))) & lmask; \
320 __asm__ __volatile__(" and %0 " \
322 :"a"(~(lmask & v))); \
325 __asm__ __volatile__( \
326 " bclr %0, #%1" :"=T"(reg_name) :"i"(lower)); \
331 (reg_name & lmask) >> (((lower) < (upper)) ? (lower) : (upper)); \
338 #ifndef DOXYGEN_SHOULD_SKIP_THIS
340 #define _TN_BFA_COMM_ERR(a) _TN_BFA_COMMAND_ERROR_##a
341 #define _TN_BFA_COMM_GET(a) _TN_BFA_COMM_ERR(a)
343 typedef unsigned int _TN_BFA_COMM_GET(
TN_BFA_SET);
344 typedef unsigned int _TN_BFA_COMM_GET(
TN_BFA_CLR);
345 typedef unsigned int _TN_BFA_COMM_GET(
TN_BFA_INV);
347 typedef unsigned int _TN_BFA_COMM_GET(
TN_BFA_WR);
348 typedef unsigned int _TN_BFA_COMM_GET(
TN_BFA_RD);
350 #define _TN_BFA_STRUCT_TYPE(a) a##BITS
351 #define _TN_BFA_STRUCT_VAL(a) a##bits
361 #endif // _TN_ARCH_PIC24_BFA_H
#define TN_BFA_SET
Command for TN_BFA() macro: Set bits in the bit field by mask; ... macro param should be set to the b...
#define TN_BFA_INV
Command for TN_BFA() macro: Invert bits in the bit field by mask; ... macro param should be set to th...
#define TN_BFA_RD
Command for TN_BFA() macro: Read bit field; ... macro param ignored.
#define TN_BFA_CLR
Command for TN_BFA() macro: Clear bits in the bit field by mask; ... macro param should be set to the...
#define TN_BFA_WR
Command for TN_BFA() macro: Write bit field; ... macro param should be set to the value to write...