I am using PBP3 (3.0.7.4) and Microcode Studio Plus (5.0.0.5). This code runs fine on a PIC18F2525, but on the 18F2550, I cannot get any GOTO or GOSUB instructions to work if the code I am jumping too is too far away. See the code attached which is very simplified but demonstrates the problem. The GOSUB works fine until I insert enough "filler code" to separate the call and the destination. The filler code is never executed, it just pushes the subroutine farther into the code space.

I am using the Trace Systems Bootloader, but the same problem still appears if I burn hex directly to a clean PIC. Interestingly, in the case of the Trace Bootloader, when the GOSUB fails, the PIC falls through to the bootloader (the bootloader is located at 0x6200). I have it down to commenting or uncommenting a single line of code to cause the problem.

To me it seems like the PIC gets lost if I try to jump to an address that is too far from the call. But this should not be the case on a PIC18F. I should be able to jump to any address on the PIC. I commented the code to show where it fails. If I uncomment that one line, it will never execute the subroutine when the "trigger" is pressed.

Has anyone else seen something similar to this? This is KILLING my real program. Thanks for any guidance.

--Jim

Code:
'Program Memory Bytes Used: 16372 of 32767
'Revision Date: 14 April 2014 
'Written for PICBASIC PRO Compiler version 3.0.7
'Processor=PIC18F2550  20MHz Oscillator


	DEFINE LCD_EREG PORTA
	DEFINE LCD_EBIT 4
	DEFINE LCD_RSREG PORTA
	DEFINE LCD_RSBIT 5
	DEFINE LCD_DATAUS 100
	
	DEFINE NO_CLRWDT 1

	DEFINE OSC 20               '
	
    INCLUDE "con_vars.inc"      'constant and variable definitions
    
'*************************************************************
'*************************************************************
'******************** PIN ASSIGNMENTS ************************
'*************************************************************
'*************************************************************
'------------------ PORT B PIN ASSIGNMENTS -------------------
Symbol ir_in 		= PORTB.0			'IR receiver data input
Symbol sclk 		= PORTB.1			'isd_spi_clock
Symbol mosi 		= PORTB.2			'isd_spi_out
Symbol backlight	= PORTB.3         	'backlight   
Symbol modesel		= PORTB.4			'mode button
Symbol reload 		= PORTB.5			'reload button
Symbol hitled		= PORTB.6			'sensor LED
Symbol trigger		= PORTB.7			'trigger button
'------------------ PORT C PIN ASSIGNMENTS -------------------
Symbol ir_power 	= PORTC.0         	'ir_power
Symbol muzzle2	    = PORTC.1         	'muzzle 2
Symbol mod_out 		= PORTC.2         	'mod_out
'Symbol not_used 	= PORTC.3         	'USB Vreg Capacitor
'Symbol not_used 	= PORTC.4         	'USB D-
'Symbol not_used 	= PORTC.5         	'USB D+
Symbol muzzle 		= PORTC.6         	'muzzle 1
Symbol ss   		= PORTC.7			'isd_spi_slave_select
'------------------ PORT E PIN ASSIGNMENTS -------------------
Symbol sw4  		= PORTE.3         	'Input Only

'*************************************************************
'*************************************************************
'******************** INITIALIZATION *************************
'*************************************************************
'*************************************************************
initialize:
	CLEAR                   'initialize RAM					

	ADCON0 = 1              'AD on, CH0
	ADCON1 = 15				'all pins are digital
	ADCON2 = %00111111      'left justified result, max times
	CMCON = 7				'turn off comparators
	Poke $81,$FF			'turn off PORT B weak pull ups
    RCSTA = 0			    'disable serial port
    
'------------------------- TIMER 0 --------------------------
						        'Timer 0 is used for Input Pulse Measurement	
    TMR0L = 0					'clear Timer 0 low byte
    
    T0CON = %11000101       	'prescale = /64
	INTCON.5 = 0            	'disable TMR0 interrupt

'------------------------- TIMER 1 --------------------------
                                'Timer 1 is for Elapsed Time
    TMR1H = 0					'clear Timer 1 high byte
    TMR1L = 0					'clear Timer 1 low byte
    T1CON = 49					'turn Timer 1 on ;      prescale = 1:8
	PIE1.0 = 0              	'enable Timer 1 interrupt flag
	PIR1.0 = 0                  'clear overflow flag

'------------------------- TIMER 2 --------------------------
                            'Timer 2 is used for PWM module(s)	
	T2CON = 4				'Timer2 = ON; Prescale = 1:1
	CCP1CON = 0				'PWM module off
	
'------------------------------------------------------------
    TRISA = %00000000    	'set PortA directions (0=Output, 1=Input)
	TRISB = %10110001    	'set PortB directions
	TRISC = %00000000    	'set PortC directions

	PORTB = %00000010 
	PORTC = %10000000
        

    pause 200

'****************************************************************
'****************************************************************
bootload_access:                    'Trace Systems PIC18F Bootloader
    	IF trigger = 0 then 		'bootloader access key, only on power up
            LCDOut $FE, 1					'clear LCD 
            LCDOut $FE,$80,"  BOOT  "
            LCDOut $FE,$C0," LOADER "
            
            pause 1000
            @ goto 0x6200           'bootloader start address
    	EndIf
  
'****************************************************************
'****************************************************************
startup_screen:
    LCDOut $FE, 1					'clear LCD 
    LCDOut $FE,$80,"JumpFail"
    LCDOut $FE,$C0,"TestCode"
    
    PAUSE 1000

'****************************************************************
'****************************************************************
start:
	LCDOut $FE, 1					'clear LCD 
	LCDOut $FE,$80,"Waiting"
	LCDOut $FE,$C0,"Trigger"
	
test_loop:
    pause 100
    if trigger = 0 then 
        gosub test_sub
    endif
    pause 100
    goto test_loop
    
'****************************************************************
'****************************************************************
filler_code:
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"         'works to here
    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"         'FAILED HERE IF LINE UNCOMMENTED
'    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
'    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
'    LCDOut $FE,$C0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"

   

	
'****************************************************************
'****************************************************************
test_sub:
	LCDOut $FE, 1					'clear LCD 
	LCDOut $FE,$80,"Got Here"
	LCDOut $FE,$C0,"Test Sub"
	pause 200
	
	high hitled
	pause 500
	low hitled
    return    
'****************************************************************
'****************************************************************
	End