123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- ;;; Test 68HC11 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
- 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
- ldaa #%page(_far_no_tramp)
- ldy #%addr(_far_no_tramp)
- bsr __call_a16 ; No trampoline generated for _far_no_tramp
- clra
- clrb
- wai
- fail:
- ldd #1
- wai
- bra start
- .global __return
- __return:
- ins
- rts
- .sect .bank1,"ax"
- .globl _far_bar
- .far _far_bar ; Must mark symbol as far
- _far_bar:
- jsr local_bank1
- xgdx
- jmp __return
- local_bank1:
- rts
- .sect .bank2,"ax"
- .globl _far_foo
- .far _far_foo
- _far_foo:
- jsr local_bank2
- jmp __return
- local_bank2:
- rts
- .sect .bank3,"ax"
- .globl _far_no_tramp
- .far _far_no_tramp
- _far_no_tramp:
- jsr local_bank3
- jmp __return
- local_bank3:
- rts
- .sect .text
- .globl __far_trampoline
- __far_trampoline:
- psha ; (2) Save function parameter (high)
- ;; <Read current page in A>
- psha ; (2)
- ;; <Set currenge page from B>
- pshx ; (4)
- tsx ; (3)
- ldab 4,x ; (4) Restore function parameter (low)
- ldaa 2,x ; (4) Get saved page number
- staa 4,x ; (4) Save it below return PC
- pulx ; (5)
- pula ; (3)
- pula ; (3) Restore function parameter (high)
- jmp 0,y ; (4)
- .globl __call_a16
- __call_a16:
- ;; xgdx ; (3)
- ;; <Read current page in A> ; (3) ldaa _current_page
- psha ; (2)
- ;; <Set current page from B> ; (4) staa _current_page
- ;; xgdx ; (3)
- jmp 0,y ; (4)
- .sect .page0
- .skip 100
- stack:
|