;;; 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) ;; psha ; (2) ;; 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) ;; ; (3) ldaa _current_page psha ; (2) ;; ; (4) staa _current_page ;; xgdx ; (3) jmp 0,y ; (4) .sect .page0 .skip 100 stack: