2 BCU SDK bcu development enviroment
3 Copyright (C) 2005-2011 Martin Koegler <mkoegler@auto.tuwien.ac.at>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 In addition to the permissions in the GNU General Public License,
11 you may link the compiled version of this file into combinations
12 with other programs, and distribute those combinations without any
13 restriction coming from the use of this file. (The General Public
14 License restrictions do apply in other respects; for example, they
15 cover modification of the file, and distribution when not linked into
16 a combine executable.)
18 This program is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 GNU General Public License for more details.
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software
25 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
37 } FT12_GetStatus_Result
;
41 unsigned short quotient
;
42 unsigned short remainder
;
48 unsigned short product
;
74 } U_SerialShift_Result
;
88 #define SETAONCARRY "\n\tclra\n\tbcc _L_%=\n\tinca\n_L_%=:\n\t"
89 #define SETAONZERO "\n\tclra\n\tbne _L_%=\n\tinca\n_L_%=:\n\t"
90 #define SETAONNZERO "\n\tclra\n\tbeq _L_%=\n\tinca\n_L_%=:\n\t"
95 asm volatile ("bset.0 0x00C");
98 extern const uchar OR_TAB
[8];
99 extern const uchar AND_TAB
[8];
102 _U_flagsGet (uchar no
)
105 if (!__builtin_constant_p (no
))
106 asm volatile ("lda %1\n\tjsr U_flagsGet":"=z" (ret
):"r" (no
):"A", "X",
109 asm volatile ("lda $%1\n\tjsr U_flagsGet":"=z" (ret
):"i" (no
):"A", "X",
115 _U_flagsSet (uchar no
, uchar flag
)
117 if (!__builtin_constant_p (no
))
118 asm volatile ("lda %0\n\tjsr U_flagsSet"::"r" (no
), "z" (flag
):"A", "X",
121 asm volatile ("lda $%0\n\tjsr U_flagsSet"::"i" (no
), "z" (flag
):"A", "X",
126 _U_transRequest (uchar no
)
128 if (!__builtin_constant_p (no
))
129 asm volatile ("lda %0\n\tjsr U_transRequest"::"r" (no
):"A", "X", "RegB",
132 asm volatile ("lda $%0\n\tjsr U_transRequest"::"i" (no
):"A", "X", "RegB",
137 _U_testObj (uchar no
)
140 if (!__builtin_constant_p (no
))
141 asm volatile ("lda %1\n\tjsr U_testObj":"=c" (ret
):"r" (no
):"A", "X",
144 asm volatile ("lda $%1\n\tjsr U_testObj":"=c" (ret
):"i" (no
):"A", "X",
150 _EEwrite (uchar offset
, uchar value
)
152 if (!__builtin_constant_p (offset
))
154 if (!__builtin_constant_p (value
))
155 asm volatile ("lda %0\n\tldx %1\n\tjsr EEwrite"::"r" (value
),
156 "r" (offset
):"A", "X", "RegB", "RegC", "RegH");
158 asm volatile ("lda %0\n\tldx $%1\n\tjsr EEwrite"::"r" (value
),
159 "i" (offset
):"A", "X", "RegB", "RegC", "RegH");
163 if (!__builtin_constant_p (value
))
164 asm volatile ("lda $%0\n\tldx %1\n\tjsr EEwrite"::"i" (value
),
165 "r" (offset
):"A", "X", "RegB", "RegC", "RegH");
167 asm volatile ("lda $%0\n\tldx $%1\n\tjsr EEwrite"::"i" (value
),
168 "i" (offset
):"A", "X", "RegB", "RegC", "RegH");
175 asm volatile ("jsr EEsetChecksum":::"A", "X", "RegB", "RegC", "RegH");
179 _U_debounce (uchar value
, uchar time
)
182 if (!__builtin_constant_p (time
))
184 volatile ("lda %1\n\tldx %2\n\tjsr U_debounce\n\tsta %0":"=r" (ret
):"r"
185 (value
), "r" (time
):"X", "A", "RegB", "RegC", "RegD", "RegE",
189 volatile ("lda %1\n\tldx $%2\n\tjsr U_debounce\n\tsta %0":"=r" (ret
):"r"
190 (value
), "i" (time
):"X", "A", "RegB", "RegC", "RegD", "RegE",
196 _U_deb10 (uchar value
)
199 asm volatile ("lda %1\n\tjsr U_deb10\n\tsta %0":"=r" (ret
):"r" (value
):"X",
200 "A", "RegB", "RegC", "RegD", "RegE", "RegF", "RegG");
205 _U_deb30 (uchar value
)
208 asm volatile ("lda %1\n\tjsr U_deb30\n\tsta %0":"=r" (ret
):"r" (value
):"X",
209 "A", "RegB", "RegC", "RegD", "RegE", "RegF", "RegG");
216 asm volatile ("jsr U_delMsgs":::"A", "X", "RegB");
220 _U_readAD (uchar channel
, uchar count
)
223 if (!__builtin_constant_p (count
))
225 if (!__builtin_constant_p (channel
))
227 volatile ("lda %1\n\tldx %2\n\tjsr U_readAD":"=t" (ret
):"r"
228 (channel
), "r" (count
):"A", "X");
231 volatile ("lda %1\n\tldx $%2\n\tjsr U_readAD":"=t" (ret
):"r"
232 (channel
), "i" (count
):"A", "X");
236 if (!__builtin_constant_p (channel
))
238 volatile ("lda $%1\n\tldx %2\n\tjsr U_readAD":"=t" (ret
):"i"
239 (channel
), "r" (count
):"A", "X");
242 volatile ("lda $%1\n\tldx $%2\n\tjsr U_readAD":"=t" (ret
):"i"
243 (channel
), "i" (count
):"A", "X");
248 static U_map_Result
inline
249 _U_map (signed short value
, uchar ptr
)
252 if (!__builtin_constant_p (ptr
))
255 ("ldx %2\n\tjsr U_map" SETAONCARRY
"sta %1":"=q"
256 (ret
.value
), "=r" (ret
.error
):"r" (ptr
), "q" (value
):"A", "X", "RegD",
257 "RegE", "RegF", "RegG", "RegH", "RegI");
261 ("ldx $%2\n\tjsr U_map" SETAONCARRY
"sta %1":"=q"
262 (ret
.value
), "=r" (ret
.error
):"i" (ptr
), "q" (value
):"A", "X", "RegD",
263 "RegE", "RegF", "RegG", "RegH", "RegI");
267 static signed short inline
268 _U_map_NE (signed short value
, uchar ptr
)
271 if (!__builtin_constant_p (ptr
))
274 ("ldx %1\n\tjsr U_map":"=q"
275 (ret
):"r" (ptr
), "q" (value
):"A", "X", "RegD",
276 "RegE", "RegF", "RegG", "RegH", "RegI");
280 ("ldx $%1\n\tjsr U_map":"=q"
281 (ret
):"i" (ptr
), "q" (value
):"A", "X", "RegD",
282 "RegE", "RegF", "RegG", "RegH", "RegI");
290 if (!__builtin_constant_p (val
))
291 asm volatile ("lda %1\n\tjsr U_ioAST":"=z" (ret
):"r" (val
):"A", "X",
294 asm volatile ("lda $%1\n\tjsr U_ioAST":"=z" (ret
):"i" (val
):"A", "X",
299 static S_xxShift_Result
inline
300 _S_AstShift (uchar ptr
)
302 S_xxShift_Result ret
;
303 if (!__builtin_constant_p (ptr
))
306 ("ldx %2\n\tjsr S_AstShift\n\tstx %0" SETAONCARRY
"sta %1":"=r"
307 (ret
.pointer
), "=r" (ret
.error
):"r" (ptr
):"A", "X", "RegB", "RegC",
308 "RegD", "RegE", "RegF", "RegG", "RegH", "RegI");
312 ("ldx $%2\n\tjsr S_AstShift\n\tstx %0" SETAONCARRY
"sta %1":"=r"
313 (ret
.pointer
), "=r" (ret
.error
):"i" (ptr
):"A", "X", "RegB", "RegC",
314 "RegD", "RegE", "RegF", "RegG", "RegH", "RegI");
319 _S_AstShift_NE (uchar ptr
)
322 if (!__builtin_constant_p (ptr
))
325 ("ldx %1\n\tjsr S_AstShift\n\tstx %0":"=r"
326 (ret
):"r" (ptr
):"A", "X", "RegB", "RegC",
327 "RegD", "RegE", "RegF", "RegG", "RegH", "RegI");
331 ("ldx $%1\n\tjsr S_AstShift\n\tstx %0":"=r"
332 (ret
):"i" (ptr
):"A", "X", "RegB", "RegC",
333 "RegD", "RegE", "RegF", "RegG", "RegH", "RegI");
337 static S_xxShift_Result
inline
338 _S_LastShift (uchar ptr
)
340 S_xxShift_Result ret
;
341 if (!__builtin_constant_p (ptr
))
344 ("ldx %2\n\tjsr S_LastShift\n\tstx %0" SETAONCARRY
"sta %1":"=r"
345 (ret
.pointer
), "=r" (ret
.error
):"r" (ptr
):"A", "X", "RegB", "RegC",
346 "RegD", "RegE", "RegF", "RegG", "RegH", "RegI");
350 ("ldx $%2\n\tjsr S_LastShift\n\tstx %0" SETAONCARRY
"sta %1":"=r"
351 (ret
.pointer
), "=r" (ret
.error
):"i" (ptr
):"A", "X", "RegB", "RegC",
352 "RegD", "RegE", "RegF", "RegG", "RegH", "RegI");
357 _S_LastShift_NE (uchar ptr
)
360 if (!__builtin_constant_p (ptr
))
363 ("ldx %1\n\tjsr S_LastShift\n\tstx %0":"=r"
364 (ret
):"r" (ptr
):"A", "X", "RegB", "RegC",
365 "RegD", "RegE", "RegF", "RegG", "RegH", "RegI");
369 ("ldx $%1\n\tjsr S_LastShift\n\tstx %0":"=r"
370 (ret
):"i" (ptr
):"A", "X", "RegB", "RegC",
371 "RegD", "RegE", "RegF", "RegG", "RegH", "RegI");
375 static U_SerialShift_Result
inline
376 _U_SerialShift (uchar octet
)
378 U_SerialShift_Result ret
;
379 if (!__builtin_constant_p (octet
))
382 ("lda %2\n\tjsr U_SerialShift\n\tsta %0" SETAONCARRY
"sta %1":"=r"
383 (ret
.octet
), "=r" (ret
.error
):"r" (octet
):"A", "X", "RegB", "RegC",
384 "RegD", "RegE", "RegF", "RegG", "RegI");
388 ("lda $%2\n\tjsr U_SerialShift\n\tsta %0" SETAONCARRY
"sta %1":"=r"
389 (ret
.octet
), "=r" (ret
.error
):"i" (octet
):"A", "X", "RegB", "RegC",
390 "RegD", "RegE", "RegF", "RegG", "RegI");
395 _U_SerialShift_NE (uchar octet
)
398 if (!__builtin_constant_p (octet
))
401 ("lda %1\n\tjsr U_SerialShift\n\tsta %0":"=r"
402 (ret
):"r" (octet
):"A", "X", "RegB", "RegC",
403 "RegD", "RegE", "RegF", "RegG", "RegI");
407 ("lda $%1\n\tjsr U_SerialShift\n\tsta %0":"=r"
408 (ret
):"i" (octet
):"A", "X", "RegB", "RegC",
409 "RegD", "RegE", "RegF", "RegG", "RegI");
414 _TM_Load (uchar setup
, uchar runtime
)
416 if (!__builtin_constant_p (runtime
))
418 if (!__builtin_constant_p (setup
))
419 asm volatile ("lda %0\n\tldx %1\n\tjsr TM_Load"::"r" (setup
),
420 "r" (runtime
):"A", "X", "RegB", "RegC", "RegD", "RegE",
423 asm volatile ("lda %0\n\tldx $%1\n\tjsr TM_Load"::"r" (setup
),
424 "i" (runtime
):"A", "X", "RegB", "RegC", "RegD", "RegE",
429 if (!__builtin_constant_p (setup
))
430 asm volatile ("lda $%0\n\tldx %1\n\tjsr TM_Load"::"i" (setup
),
431 "r" (runtime
):"A", "X", "RegB", "RegC", "RegD", "RegE",
434 asm volatile ("lda $%0\n\tldx $%1\n\tjsr TM_Load"::"i" (setup
),
435 "i" (runtime
):"A", "X", "RegB", "RegC", "RegD", "RegE",
440 static TM_GetFlg_Result
inline
441 _TM_GetFlg (uchar timer
)
443 TM_GetFlg_Result ret
;
444 if (!__builtin_constant_p (timer
))
447 ("lda %2\n\tjsr TM_GetFlg\n\tsta %0" SETAONCARRY
"sta %1":"=r"
448 (ret
.time
), "=r" (ret
.expired
):"r" (timer
):"A", "X", "RegB", "RegC",
453 ("lda $%2\n\tjsr TM_GetFlg\n\tsta %0" SETAONCARRY
"sta %1":"=r"
454 (ret
.time
), "=r" (ret
.expired
):"i" (timer
):"A", "X", "RegB", "RegC",
460 _TM_GetFlg_M0 (uchar timer
)
463 if (!__builtin_constant_p (timer
))
466 ("lda %1\n\tjsr TM_GetFlg" SETAONCARRY
"sta %0":"=r"
467 (ret
):"r" (timer
):"A", "X", "RegB", "RegC", "RegD", "RegE");
471 ("lda $%1\n\tjsr TM_GetFlg" SETAONCARRY
"sta %1":"=r"
472 (ret
):"i" (timer
):"A", "X", "RegB", "RegC", "RegD", "RegE");
477 _TM_GetFlg_M1 (uchar timer
)
480 if (!__builtin_constant_p (timer
))
483 ("lda %1\n\tjsr TM_GetFlg\n\tsta %0":"=r"
484 (ret
):"r" (timer
):"A", "X", "RegB", "RegC", "RegD", "RegE");
488 ("lda $%1\n\tjsr TM_GetFlg\n\tsta %0":"=r"
489 (ret
):"i" (timer
):"A", "X", "RegB", "RegC", "RegD", "RegE");
494 _U_SetTM (uchar timer
, uchar pointer
, uchar time
)
496 if (!__builtin_constant_p (pointer
))
498 if (!__builtin_constant_p (timer
))
500 volatile ("lda %1\n\tldx %2\n\tjsr U_SetTM"::"e" (time
),
501 "r" (timer
), "r" (pointer
):"A", "X", "RegB", "RegC",
504 asm volatile ("lda %1\n\tldx $%2\n\tjsr U_SetTM"::"e" (time
),
505 "r" (timer
), "i" (pointer
):"A", "X", "RegB", "RegC",
510 if (!__builtin_constant_p (timer
))
512 volatile ("lda $%1\n\tldx %2\n\tjsr U_SetTM"::"e" (time
),
513 "i" (timer
), "r" (pointer
):"A", "X", "RegB", "RegC",
517 volatile ("lda $%1\n\tldx $%2\n\tjsr U_SetTM"::"e" (time
),
518 "i" (timer
), "i" (pointer
):"A", "X", "RegB", "RegC",
524 _U_SetTMx (uchar timer
, uchar time
)
526 if (!__builtin_constant_p (timer
))
527 asm volatile ("lda %1\n\tjsr U_SetTMx"::"e" (time
), "r" (timer
):"A", "X",
528 "RegB", "RegC", "RegD");
530 asm volatile ("lda %1\n\tjsr U_SetTMx"::"e" (time
), "r" (timer
):"A", "X",
531 "RegB", "RegC", "RegD");
535 _U_GetTM (uchar timer
, uchar pointer
)
538 if (!__builtin_constant_p (pointer
))
540 if (!__builtin_constant_p (timer
))
543 ("lda %1\n\tldx %2\n\tjsr U_GetTM" SETAONZERO
"sta %0":"=r"
544 (ret
):"r" (timer
), "r" (pointer
):"A", "X", "RegB", "RegC", "RegD");
548 ("lda $%1\n\tldx %2\n\tjsr U_GetTM" SETAONZERO
"sta %0":"=r"
549 (ret
):"i" (timer
), "r" (pointer
):"A", "X", "RegB", "RegC", "RegD");
553 if (!__builtin_constant_p (timer
))
556 ("lda %1\n\tldx $%2\n\tjsr U_GetTM" SETAONZERO
"sta %0":"=r"
557 (ret
):"r" (timer
), "i" (pointer
):"A", "X", "RegB", "RegC", "RegD");
561 ("lda $%1\n\tldx $%2\n\tjsr U_GetTM" SETAONZERO
"sta %0":"=r"
562 (ret
):"i" (timer
), "i" (pointer
):"A", "X", "RegB", "RegC", "RegD");
568 _U_GetTMx (uchar timer
)
571 if (!__builtin_constant_p (timer
))
574 ("lda %1\n\tjsr U_GetTM" SETAONZERO
"sta %0":"=r"
575 (ret
):"r" (timer
):"A", "X", "RegB", "RegC", "RegD");
579 ("lda $%1\n\tjsr U_GetTM" SETAONZERO
"sta %0":"=r"
580 (ret
):"i" (timer
):"A", "X", "RegB", "RegC", "RegD");
585 _U_Delay (uchar delay
)
587 if (!__builtin_constant_p (delay
))
588 asm volatile ("lda %0\n\tjsr U_Delay"::"r" (delay
):"A", "X", "RegB");
590 asm volatile ("lda $%0\n\tjsr U_Delay"::"i" (delay
):"A", "X", "RegB");
593 static AllocBuf_Result
inline
594 _AllocBuf (bool longbuf
)
601 ("sec\n\tjsr AllocBuf\n\tstx %1" SETAONCARRY
"sta %0":"=r"
602 (ret
.valid
), "=r" (e
)::"A", "X");
606 ("clc\n\tjsr AllocBuf\n\tstx %1" SETAONCARRY
"sta %0":"=r"
607 (ret
.valid
), "=r" (e
)::"A", "X");
608 ret
.pointer
= (uchar_loptr
) (uint1
) e
;
612 static uchar_loptr
inline
613 _AllocBuf_NE (bool longbuf
)
617 asm volatile ("sec\n\tjsr AllocBuf\n\tstx %0":"=r" (ret
)::"A", "X");
619 asm volatile ("clc\n\tjsr AllocBuf\n\tstx %0":"=r" (ret
)::"A", "X");
620 return (uchar_loptr
) (uint1
) ret
;
624 _FreeBuf (uchar_loptr pointer
)
626 uchar x
= ((uint1
) pointer
);
627 if (!__builtin_constant_p (x
))
628 asm volatile ("ldx %0\n\tjsr FreeBuf"::"r" (x
):"A", "X", "RegB");
630 asm volatile ("ldx $%0\n\tjsr FreeBuf"::"i" (x
):"A", "X", "RegB");
633 static PopBuf_Result
inline
638 if (!__builtin_constant_p (msg
))
641 ("lda %2\n\tjsr PopBuf\n\tstx %1" SETAONCARRY
"sta %0":"=r"
642 (ret
.found
), "=r" (e
):"r" (msg
):"A", "X", "RegB");
646 ("lda $%2\n\tjsr PopBuf\n\tstx %1" SETAONCARRY
"sta %0":"=r"
647 (ret
.found
), "=r" (e
):"i" (msg
):"A", "X", "RegB");
648 ret
.pointer
= (uchar_loptr
) (uint1
) e
;
652 static uchar_loptr
inline
653 _PopBuf_NE (uchar msg
)
656 if (!__builtin_constant_p (msg
))
659 ("lda %1\n\tjsr PopBuf\n\tstx %0":"=r"
660 (ret
):"r" (msg
):"A", "X", "RegB");
664 ("lda $%1\n\tjsr PopBuf\n\tstx %1":"=r" (ret
):"i" (msg
):"A", "X", "RegB");
665 return (uchar_loptr
) (uint1
) ret
;
668 static U_Mul_Result
inline
669 _multDE_FG (unsigned short v1
, unsigned short v2
)
674 ("jsr multDE_FG" SETAONCARRY
"sta %0":"=r"
675 (ret
.overflow
), "=q" (ret
.product
):"t" (v1
), "u" (v2
):"A", "X");
678 static unsigned short inline
679 _multDE_FG_NE (unsigned short v1
, unsigned short v2
)
682 asm volatile ("jsr multDE_FG":"=q" (ret
):"t" (v1
), "u" (v2
):"A", "X");
686 static U_Div_Result
inline
687 _divDE_BC (unsigned short dividend
, unsigned short divisor
)
692 ("jsr divDE_BC" SETAONCARRY
"sta %0":"=r"
693 (ret
.error
), "=u" (ret
.quotient
), "=t" (ret
.remainder
):"q" (divisor
),
694 "t" (dividend
):"A", "X");
697 static unsigned short inline
698 _divDE_BC_quotient (unsigned short dividend
, unsigned short divisor
)
703 ("jsr divDE_BC":"=u" (ret
.quotient
), "=t" (ret
.remainder
):"q" (divisor
),
704 "t" (dividend
):"A", "X");
708 static unsigned short inline
709 _divDE_BC_remainder (unsigned short dividend
, unsigned short divisor
)
714 ("jsr divDE_BC":"=u" (ret
.quotient
), "=t" (ret
.remainder
):"q" (divisor
),
715 "t" (dividend
):"A", "X");
716 return ret
.remainder
;
719 #define DEF_SHIFTROT(NAME) static uchar inline _##NAME(uchar val){uchar ret;asm volatile ("lda %1\n\t jsr " #NAME "\n\tsta %1":"=r"(ret):"r"(val):"A");return ret; }
731 DEF_SHIFTROT (rolA3
) DEF_SHIFTROT (rolA4
) DEF_SHIFTROT (rolA7
)
735 _U_SetBit (uchar octet
, uchar bit
, bool set
)
737 if (!__builtin_constant_p (bit
))
740 asm volatile ("sec\n\tlda %1\n\tjsr U_SetBit":"=h" (octet
):"r" (bit
),
741 "0" (octet
):"RegB", "A");
743 asm volatile ("clc\n\tlda %1\n\tjsr U_SetBit":"=h" (octet
):"r" (bit
),
744 "0" (octet
):"RegB", "A");
749 asm volatile ("sec\n\tlda $%1\n\tjsr U_SetBit":"=h" (octet
):"i" (bit
),
750 "0" (octet
):"RegB", "A");
752 asm volatile ("clc\n\tlda $%1\n\tjsr U_SetBit":"=h" (octet
):"i" (bit
),
753 "0" (octet
):"RegB", "A");
759 _U_GetBit (uchar octet
, uchar bit
)
762 if (!__builtin_constant_p (bit
))
765 ("lda %1\n\tjsr U_GetBit" SETAONNZERO
"sta %0":"=r"
766 (ret
):"r" (bit
), "h" (octet
):"A", "X", "RegB");
770 ("lda $%1\n\tjsr U_GetBit" SETAONNZERO
"sta %0":"=r"
771 (ret
):"i" (bit
), "h" (octet
):"A", "X", "RegB");
778 _U_EE_WriteBlock (void *ptr
, long data
)
780 asm volatile ("jsr U_EE_WriteBlock"::"v" (ptr
), "y" (data
):"A", "X", "RegB",
788 asm volatile ("jsr U_GetAccess\n\tsta %0":"=r" (ret
)::"A");
793 _U_SetPollingRsp (uchar val
)
795 if (!__builtin_constant_p (val
))
796 asm volatile ("lda %0\n\tjsr U_SetPollingRsp"::"r" (val
):"A");
798 asm volatile ("lda $%0\n\tjsr U_SetPollingRsp"::"i" (val
):"A");
802 _U_Char_Out (uchar val
)
804 if (!__builtin_constant_p (val
))
805 asm volatile ("lda %0\n\tjsr U_Char_Out"::"r" (val
):"A", "X");
807 asm volatile ("lda $%0\n\tjsr U_Char_Out"::"i" (val
):"A", "X");
811 _U_TS_Set (uchar timer
, uchar mode
, uchar scale
, uchar value
, uchar param
)
813 if (!__builtin_constant_p (timer
))
815 if (!__builtin_constant_p (mode
))
816 asm volatile ("lda %1\n\tldx %2\n\tjsr U_TS_Set"::"z" (scale
),
817 "r" (mode
), "r" (timer
), "c" (value
), "d" (param
):"A",
818 "X", "RegB", "RegC", "RegD", "RegE", "RegF");
820 asm volatile ("lda %1\n\tldx $%2\n\tjsr U_TS_Set"::"z" (scale
),
821 "r" (mode
), "i" (timer
), "c" (value
), "d" (param
):"A",
822 "X", "RegB", "RegC", "RegD", "RegE", "RegF");
826 if (!__builtin_constant_p (mode
))
827 asm volatile ("lda $%1\n\tldx %2\n\tjsr U_TS_Set"::"z" (scale
),
828 "i" (mode
), "r" (timer
), "c" (value
), "d" (param
):"A",
829 "X", "RegB", "RegC", "RegD", "RegE", "RegF");
831 asm volatile ("lda $%1\n\tldx $%2\n\tjsr U_TS_Set"::"z" (scale
),
832 "i" (mode
), "i" (timer
), "c" (value
), "d" (param
):"A",
833 "X", "RegB", "RegC", "RegD", "RegE", "RegF");
838 _U_TS_Del (uchar val
)
840 if (!__builtin_constant_p (val
))
841 asm volatile ("ldx %0\n\tjsr U_TS_Del"::"r" (val
):"X");
843 asm volatile ("ldx $%0\n\tjsr U_TS_Del"::"i" (val
):"X");
847 _U_MS_Post (uchar msgid
, uchar_loptr pointer
)
849 if (!__builtin_constant_p (msgid
))
851 if (!__builtin_constant_p (pointer
))
852 asm volatile ("lda %0\n\tldx %1\n\tjsr U_MS_Post"::"r" (msgid
),
853 "r" (pointer
):"A", "X", "RegB", "RegL", "RegM", "RegN");
855 asm volatile ("lda %0\n\tldx $%1\n\tjsr U_MS_Post"::"r" (msgid
),
856 "i" (pointer
):"A", "X", "RegB", "RegL", "RegM", "RegN");
860 if (!__builtin_constant_p (pointer
))
861 asm volatile ("lda $%0\n\tldx %1\n\tjsr U_MS_Post"::"i" (msgid
),
862 "r" (pointer
):"A", "X", "RegB", "RegL", "RegM", "RegN");
864 asm volatile ("lda $%0\n\tldx $%1\n\tjsr U_MS_Post"::"i" (msgid
),
865 "i" (pointer
):"A", "X", "RegB", "RegL", "RegM", "RegN");
870 _U_MS_Switch (uchar msgid
, uchar destination
)
872 if (!__builtin_constant_p (msgid
))
874 if (!__builtin_constant_p (destination
))
875 asm volatile ("lda %0\n\tldx %1\n\tjsr U_MS_Switch"::
876 "r" (destination
), "r" (msgid
):"A", "X", "RegB", "RegL",
879 asm volatile ("lda %0\n\tldx $%1\n\tjsr U_MS_Switch"::"r" (destination
),
880 "i" (msgid
):"A", "X", "RegB", "RegL", "RegM", "RegN");
884 if (!__builtin_constant_p (destination
))
885 asm volatile ("lda $%0\n\tldx %1\n\tjsr U_MS_Switch"::
886 "i" (destination
), "r" (msgid
):"A", "X", "RegB", "RegL",
889 asm volatile ("lda $%0\n\tldx $%1\n\tjsr U_MS_Switch"::
890 "i" (destination
), "i" (msgid
):"A", "X", "RegB", "RegL",
896 _FP_Flt2Int (uchar ptr
, uchar exponent
)
899 if (!__builtin_constant_p (ptr
))
900 asm volatile ("ldx %1\n\tjsr FP_Flt2Int":"=q" (ret
):"r" (ptr
),
901 "f" (exponent
):"A", "X", "RegD", "RegE");
903 asm volatile ("ldx $%1\n\tjsr FP_Flt2Int":"=q" (ret
):"i" (ptr
),
904 "f" (exponent
):"A", "X", "RegD", "RegE");
909 _FP_Int2Flt (short val
, uchar ptr
, uchar exponent
)
911 if (!__builtin_constant_p (ptr
))
912 asm volatile ("ldx %0\n\tjsr FP_Int2Flt"::"r" (ptr
), "f" (exponent
),
915 asm volatile ("ldx $%0\n\tjsr FP_Int2Flt"::"i" (ptr
), "f" (exponent
),
920 _U_FT12_Reset (uchar baudrate
)
922 if (!__builtin_constant_p (baudrate
))
923 asm volatile ("lda %0\n\tjsr U_FT12_Reset"::"r" (baudrate
):"A", "X",
924 "RegB", "RegC", "RegD", "RegE", "RegF", "RegG", "RegH",
925 "RegI", "RegJ", "RegK", "RegL", "RegM", "RegN");
927 asm volatile ("lda $%0\n\tjsr U_FT12_Reset"::"i" (baudrate
):"A", "X",
928 "RegB", "RegC", "RegD", "RegE", "RegF", "RegG", "RegH",
929 "RegI", "RegJ", "RegK", "RegL", "RegM", "RegN");
932 static FT12_GetStatus_Result
inline
933 _U_FT12_GetStatus (bool force_reset
)
935 FT12_GetStatus_Result ret
;
939 ("sec\n\tjsr U_FT12_GetStatus\n\tsta %0" SETAONCARRY
"sta %1":"=r"
940 (ret
.stateok
), "=r" (ret
.newstate
)::"A");
944 ("clc\n\tjsr U_FT12_GetStatus\n\tsta %0" SETAONCARRY
"sta %1":"=r"
945 (ret
.stateok
), "=r" (ret
.newstate
)::"A");
950 _U_SCI_Init (uchar baudrate
)
952 if (!__builtin_constant_p (baudrate
))
953 asm volatile ("lda %0\n\tjsr U_SCI_Init"::"r" (baudrate
):"A", "X");
955 asm volatile ("lda $%0\n\tjsr U_SCI_Init"::"i" (baudrate
):"A", "X");
961 asm volatile ("jsr U_SPI_Init":::"A", "X");
971 __U_flag_Set (uchar no
, uchar bit
)
973 if (__builtin_constant_p (no
) && __builtin_constant_p (bit
))
974 asm volatile ("bset.%1 %0+ramflag_pointer"::"i" (no
/ 2),
975 "i" ((bit
% 4) + (no
% 2) * 4));
977 _U_flagsSet (no
, _U_flagsGet (no
) | (1 << bit
));
981 __U_flag_Clear (uchar no
, uchar bit
)
983 if (__builtin_constant_p (no
) && __builtin_constant_p (bit
))
984 asm volatile ("bclr.%1 %0+ramflag_pointer"::"i" (no
/ 2),
985 "i" ((bit
% 4) + (no
% 2) * 4));
987 _U_flagsSet (no
, _U_flagsGet (no
) & ~(1 << bit
));
991 __U_transRequest (uchar no
)
993 if (__builtin_constant_p (no
))
995 __U_flag_Set (no
, 0);
996 __U_flag_Set (no
, 1);
999 _U_transRequest (no
);