What I found interesting is that PicBasicPro compiles this code correctly for XINT on. Using brackets and leaving out the access parameter for addresses under 0x5F.

The blinky light code I originally posted now runs fine with the Diolan bootloader. The trick I found was to clear the FSR2L and FSR2H registers as the first instructions in my program. I also set Access equ 1.

I think the main issue was that I never initialized the FSR2 register to zero in my code. The Diolan bootloader uses FSR2 and it could have any value in it when the app code runs.

Since that is the register used for indexed addressing when XINST is on it must be set to zero to allow legacy code to run. Setting FSR2 to zero places the access bank and SFR's in memory just as if XINST was 0. I found this info in the data sheet. Had to read it about 10 times to make sure I was following it correctly.

The next challenge I am working on is to get the USB interrupts working with DT_INTS and the Diolan Bootloader. The USB_DEV.ASM and USB_HID.ASM use FSR2/INDF2 for indirect addressing and as a general register in several routines. Those will need to be modified to use FSR0/1 and INDF0/1 instead.