Commit | Line | Data |
---|---|---|
6c6532f7 SC |
1 | ;;; Test 68HC11 FAR trampoline generation |
2 | ;;; 2 trampolines are generated: | |
3 | ;;; - one for '_far_bar' | |
4 | ;;; - one for '_far_foo' | |
5 | ;;; 'far_no_tramp' does not have any trampoline generated. | |
6 | ;;; | |
7 | .sect .text | |
8 | .globl _start | |
9 | _start: | |
10 | start: | |
11 | lds #stack | |
12 | ldx #0xabcd | |
13 | pshx | |
14 | ldd #0x1234 | |
15 | ldx #0x5678 | |
16 | bsr _far_bar ; Call to trampoline generated code | |
17 | cpx #0x1234 | |
18 | bne fail ; X and D preserved (swapped by _far_bar) | |
19 | cpd #0x5678 | |
20 | bne fail | |
21 | pulx | |
22 | cpx #0xabcd ; Stack parameter preserved | |
23 | bne fail | |
24 | ldd #_far_foo ; Get address of trampoline handler | |
25 | xgdx | |
26 | jsr 0,x | |
27 | ldd #_far_bar ; Likewise (unique trampoline check) | |
28 | xgdy | |
29 | jsr 0,y | |
30 | ldaa #%page(_far_no_tramp) | |
31 | ldy #%addr(_far_no_tramp) | |
32 | bsr __call_a16 ; No trampoline generated for _far_no_tramp | |
33 | clra | |
34 | clrb | |
35 | wai | |
36 | fail: | |
37 | ldd #1 | |
38 | wai | |
39 | bra start | |
40 | .global __return | |
41 | __return: | |
42 | ins | |
43 | rts | |
44 | ||
45 | .sect .bank1,"ax" | |
46 | .globl _far_bar | |
47 | .far _far_bar ; Must mark symbol as far | |
48 | _far_bar: | |
49 | jsr local_bank1 | |
50 | xgdx | |
51 | jmp __return | |
52 | ||
53 | local_bank1: | |
54 | rts | |
55 | ||
56 | .sect .bank2,"ax" | |
57 | .globl _far_foo | |
58 | .far _far_foo | |
59 | _far_foo: | |
60 | jsr local_bank2 | |
61 | jmp __return | |
62 | ||
63 | local_bank2: | |
64 | rts | |
65 | ||
66 | .sect .bank3,"ax" | |
67 | .globl _far_no_tramp | |
68 | .far _far_no_tramp | |
69 | _far_no_tramp: | |
70 | jsr local_bank3 | |
71 | jmp __return | |
72 | ||
73 | local_bank3: | |
74 | rts | |
75 | ||
76 | .sect .text | |
77 | .globl __far_trampoline | |
78 | __far_trampoline: | |
79 | psha ; (2) Save function parameter (high) | |
80 | ;; <Read current page in A> | |
81 | psha ; (2) | |
82 | ;; <Set currenge page from B> | |
83 | pshx ; (4) | |
84 | tsx ; (3) | |
85 | ldab 4,x ; (4) Restore function parameter (low) | |
86 | ldaa 2,x ; (4) Get saved page number | |
87 | staa 4,x ; (4) Save it below return PC | |
88 | pulx ; (5) | |
89 | pula ; (3) | |
90 | pula ; (3) Restore function parameter (high) | |
91 | jmp 0,y ; (4) | |
92 | ||
93 | .globl __call_a16 | |
94 | __call_a16: | |
95 | ;; xgdx ; (3) | |
96 | ;; <Read current page in A> ; (3) ldaa _current_page | |
97 | psha ; (2) | |
98 | ;; <Set current page from B> ; (4) staa _current_page | |
99 | ;; xgdx ; (3) | |
100 | jmp 0,y ; (4) | |
101 | ||
102 | .sect .page0 | |
103 | .skip 100 | |
104 | stack: | |
105 |