aboutsummaryrefslogtreecommitdiff
path: root/ld/testsuite/ld-m68hc11/far-hc12.s
diff options
context:
space:
mode:
Diffstat (limited to 'ld/testsuite/ld-m68hc11/far-hc12.s')
-rw-r--r--ld/testsuite/ld-m68hc11/far-hc12.s83
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:
+