Ok, so far so good with a little test program for calling code that's pre-compiled in upper program memory, so I think I'm on track.

Item of note for the 16F series (I'm using the 16F1788):

DEFINE RESET_ORG 36B0h
*****also needs*****
DEFINE USE_LINKER 1

Both lines must be present when generating the "upper memory code" above 800h.
(otherwise there's a compile error re: library exceeding address 800h - found this little gem here:
http://www.picbasic.co.uk/forum/show...+cannot+exceed )

I generated the complied hex, then copied it out of MPLAB, pasted in a text file, did a little search/replace and editing, and pasted the result at the end of the program as ASM as you demonstrated...

used a goto to jump to it at the beginning of my program, and it worked like a charm.

Looking at the resulting compiled hex shows the "upper space subroutine" right where it should be.

I'll let you know how the xfer from i2c goes, but I can't foresee any issues at this rate.