| # You'll find a bunch of nop opcodes in the below macros. They are |
| # there to keep the code correctly aligned. Be careful to maintain |
| # them when changing the code. |
| |
| comment "subroutine declare" |
| .purgem gdbasm_declare |
| .macro gdbasm_declare name |
| .align 1 |
| .global \name |
| \name: |
| .endm |
| |
| comment "subroutine prologue" |
| .macro gdbasm_enter |
| mov.l r14,@-r15 |
| sts.l pr,@-r15 |
| mov r15,r14 |
| nop |
| .endm |
| |
| comment "subroutine epilogue" |
| .macro gdbasm_leave |
| mov r14,r15 |
| lds.l @r15+,pr |
| mov.l @r15+,r14 |
| rts |
| nop |
| nop |
| .endm |
| |
| comment "subroutine end" |
| .purgem gdbasm_end |
| .macro gdbasm_end name |
| .size \name, . - \name |
| .align 1 |
| .endm |
| |
| comment "subroutine call" |
| .macro gdbasm_call subr |
| mov.l .Lconst\@,r1 |
| bra .Lafterconst\@ |
| nop |
| nop |
| .Lconst\@: |
| .align 2 |
| .long \subr |
| .align 1 |
| .Lafterconst\@: |
| jsr @r1 |
| nop |
| .endm |
| |
| .macro gdbasm_several_nops |
| nop |
| nop |
| nop |
| nop |
| .endm |
| |
| comment "exit (0)" |
| .macro gdbasm_exit0 |
| sleep |
| nop |
| .endm |
| |
| comment "crt0 startup" |
| .macro gdbasm_startup |
| comment "If there is a _stack symbol, use it for setting up the stack" |
| comment "pointer. In hosted mode (when there is no _stack symbol)," |
| comment "the operating system will have initialized it already." |
| mov.l .stackaddr, r0 |
| tst r0, r0 |
| bt .afterstackaddr |
| mov r0, r15 |
| bra .afterstackaddr |
| nop |
| .align 2 |
| .stackaddr: |
| .weak _stack |
| .long _stack |
| .align 1 |
| .afterstackaddr: |
| .endm |
| |
| comment "Declare a data variable" |
| .purgem gdbasm_datavar |
| .macro gdbasm_datavar name value |
| .data |
| .align 2 |
| .type \name, @object |
| .size \name, 4 |
| \name: |
| .long \value |
| .endm |