;;; 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: