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