1; LONG CALL utility 2; 3; jsr jsrfar 4; .word address 5; .byte bank 6 7 pha ;reserve 1 byte on the stack 8 php ;save registers & status 9 pha 10 phx 11 phy 12 13 tsx 14 lda $106,x ;return address lo 15 sta imparm 16 clc 17 adc #3 18 sta $106,x ;and write back with 3 added 19 lda $107,x ;return address hi 20 sta imparm+1 21 adc #0 22 sta $107,x 23 24 ldy #1 25 lda (imparm),y ;target address lo 26 sta jmpfr+1 27 iny 28 lda (imparm),y ;target address hi 29 sta jmpfr+2 30 cmp #$c0 31 bcc jsrfar1 ;target is in RAM 32; target is in ROM 33 lda d1prb 34 sta $0105,x ;save original bank into reserved byte 35 iny 36 lda (imparm),y ;target address bank 37 and #$07 38 ply ;restore registers 39 plx 40 jmp jsrfar3 41 42; target is in RAM 43jsrfar1: 44 lda d1pra 45 sta $0105,x ;save original bank into reserved byte 46 iny 47 lda (imparm),y ;target address bank 48 sta d1pra ;set RAM bank 49 ply ;restore registers 50 plx 51 pla 52 plp 53 jsr jmpfr 54 php 55 pha 56 phx 57 tsx 58 lda $0104,x 59 sta d1pra ;restore RAM bank 60jsrfar2: 61 plx 62 pla 63 plp 64 plp 65 rts 66