diff options
Diffstat (limited to 'ld/testsuite/ld-m68hc11/far-hc12.s')
-rw-r--r-- | ld/testsuite/ld-m68hc11/far-hc12.s | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/ld/testsuite/ld-m68hc11/far-hc12.s b/ld/testsuite/ld-m68hc11/far-hc12.s new file mode 100644 index 0000000..0081e38 --- /dev/null +++ b/ld/testsuite/ld-m68hc11/far-hc12.s @@ -0,0 +1,83 @@ +;;; Test 68HC12 FAR trampoline generation +;;; 2 trampolines are generated: +;;; - one for '_far_bar' +;;; - one for '_far_foo' +;;; 'far_no_tramp' does not have any trampoline generated. +;;; + .sect .text + .globl _start +_start: +start: + lds #stack-1 + ldx #0xabcd + pshx + ldd #0x1234 + ldx #0x5678 + bsr _far_bar ; Call to trampoline generated code + cpx #0x1234 + bne fail ; X and D preserved (swapped by _far_bar) + cpd #0x5678 + bne fail + pulx + cpx #0xabcd ; Stack parameter preserved + bne fail + ldd #_far_foo ; Get address of trampoline handler + xgdx + jsr 0,x + ldd #_far_bar ; Likewise (unique trampoline check) + xgdy + jsr 0,y + call _far_no_tramp ; No trampoline generated for _far_no_tramp + clra + clrb + wai +fail: + ldd #1 + wai + bra start + + .sect .bank1,"ax" + .globl _far_bar + .far _far_bar ; Must mark symbol as far +_far_bar: + jsr local_bank1 + xgdx + rtc + +local_bank1: + rts + + .sect .bank2,"ax" + .globl _far_foo + .far _far_foo +_far_foo: + jsr local_bank2 + rtc + +local_bank2: + rts + + .sect .bank3,"ax" + .globl _far_no_tramp + .far _far_no_tramp +_far_no_tramp: + jsr local_bank3 + rtc + +local_bank3: + rts + + .sect .text + .globl __far_trampoline +__far_trampoline: + movb 0,sp, 2,sp ; Copy page register below the caller's return + leas 2,sp ; address. + jmp 0,y ; We have a 'call/rtc' stack layout now + ; and can jump to the far handler + ; (whose memory bank is mapped due to the + ; call to the trampoline). + + .sect .bss + .skip 100 +stack: + |