SORRY, I HIT THE WRONG BUTTON BEFORE I HAD COMPLETED THE POST
PLEASE READ ON..........

Charles & Bruce,

Thanks for your help.

Bruce: the code you provided works well and I've tested it in MPLAB with a variety of inputs and it's all OK.
I have 'glued' it into PBP and still can't get it to compile. The things I changed between the 'ASM only' and 'PBP_ASM' are:

1. Deleted the .asm CONFIGS because they come from my programmer.
2. Deleted the .asm variable definitions in data memory, defined them in PBP, watched out for caes sensitivity and changed the .asm definitions to have a leading underscore (e.g. _X_steps).
3. Took out the .asm PORT and TRIS lines because it's done in PBP.
4. Took out the temp code to load the variables because they should come from PBP.
5. Deleted the last 3 lines of code - not needed I presume?

My, failed attempt to get the PBP to run looks like:


Code:
' File...... 8722 Scan_ASM_Test
' Purpose... Drive two steppers to achieve diagonal moves   
' *****************************************************************************
' *                                                                           *
' *                             INCLUDE & DEFINES                             * 
' *                                                                           *
' *****************************************************************************
clear
define OSC 40				' Use HSPLL during compilation

' *****************************************************************************
' *                                                                           *
' *                                 VARIABLES                                 * 
' *                                                                           *
' *****************************************************************************
X_steps         var word                     ' Steps to move, not reusable
Count_pulse     var WORD    Bank0   System   ' Pulse duration = 3.n + 7
X_delay         var WORD    Bank0   System
Y_delay         var WORD    Bank0   System

goto Start                                    ' Skip over ASM code

' *****************************************************************************
' *                                                                           *
' *                              ASSEMBLER CODE                               * 
' *                                                                           *
' *****************************************************************************
Run_ASM:
 ASM
   LIST P=18F8722           ; Directive to define processor
   #include "P18F8722.inc"  ; Drocessor specific variable definitions
                            ;  Reset vector in program memory
   ORG    0x0000
   goto   Main_ASM          ; Go to start of main code

;******************************************************************************
;  All interrupts vector to here in program memory, Priorities disabled
;  This is high priority only so wsave etc is automatic
   ORG    0x0008
   bra    Tmr_ints  		; Go to interrupt routine
   
;******************************************************************************
;  Higher priority for Timer0 overflows, send out stepper
;  drive pulse for X axis on PORTD.0
Tmr_ints
   btfss  INTCON,TMR0IF    ; did Timer0 interrupt?
   bra    LowPri           ; no. branch to Timer1 int
   bsf    PORTD,0          ; yes. High PORTD.0
   call   Pulse_out        ; Call delay routine
   bcf    PORTD,0          ; Low PORTD.0
   bcf    INTCON,TMR0IF    ; Clear Timer0 interrupt flag
   movff  _X_delay+1,TMR0H ; Load timer0 with _X_delay high byte
   movff  _X_delay,TMR0L   ; Load timer0 with _X_delay low byte
   decf   _X_steps,F       ; Decrement X_steps low byte
                            
;  Lower priority for Timer1 overflows, send out stepper
;  drive pulse for Y axis on PORTD.3
LowPri
   btfss  PIR1,TMR1IF      ; Timer1 int pending?										
   bra    IntExit          ; no. exit
   bsf    PORTD,3          ; High PORTD.3
   call   Pulse_out        ; Call delay routine
   bcf    PORTD,3          ; High PORTD.3
   bcf    PIR1,TMR1IF      ; Clear Timer1 interrupt flag
   movff  _Y_delay+1,TMR1H ; Load Timer1 with Y_delay high byte
   movff  _Y_delay,TMR1L   ; Load timer1 with Y_delay low byte
IntExit
   retfie FAST             ; return & restore WREG, STATUS, BSR
	
;******************************************************************************                                                                           *
;                               SUBROUTINES                                   *                                                                            * 
;******************************************************************************	
Pulse_out                  ; Delay = 3.n + 7 [0.1 microseconds]
   movlw   0xff            ; Load w with n
   movwf   _Count_pulse    ; Load Count with n
Pulse_loop
   decfsz  _Count_pulse    ; Decrament the file Count
   goto    Pulse_loop      ; Loop if not zero
   return
	
;******************************************************************************                                                                           *
;                                  MAIN ASM                                   *                                                                             * 
;******************************************************************************	
Main_ASM
	
; Set up interrupt conditions for Timer0 and Timer1	
   bcf    RCON,7     ; Disable priority levels on interrupts,IPEN=0
   bsf    INTCON,7   ; Enable all interrupts
   bsf    INTCON,6   ; Enable all peripheral interrupts
   bcf    INTCON,3   ; Disable PORTB interrupts
   bcf    INTCON2,2  ; Make Timer0 overflow low priority
   bcf    IPR1,0     ; Make Timer1 overflow low priority
   bsf    INTCON,5   ; Enable Timer0 overflow int
   bsf    PIE1,0     ; Enable Timer1 overflow int		
	
; Set up Timer0 conditions				
   bcf    T0CON,6    ; Timer0 uses 16 bits
   bcf    T0CON,5    ; Timer0 uses internal osc
   bcf    T0CON,4    ; Timer0 count on rising edge og osc
   bsf    T0CON,3    ; Timer0 pre-scaler not assigned
   clrf   TMR0H      ; Zero the clock
   clrf   TMR0L      ; Zero the clock				
   bsf    T0CON,7    ; Timer0 on
		
; Set up Timer1 conditions
   bsf    T1CON,7    ; Timer1 uses 16 bits
   bcf    T1CON,1    ; Timer1 uses internal osc
   clrf   TMR1H      ; Zero the clock
   clrf   TMR1L      ; Zero the clock
   bsf    T1CON,0    ; Timer1 on	
	
; Temp code to simulate PBP input for the delays
; Removed - should come from PBP

; Check if X_steps_lb=0 (decremented in high priority interrupt)
; If so, check X_steps_hb and if zero, end
; If not, decrement X_steps_hb, set X_steps_lb and go again	
Main_loop
   movff   _X_steps+1,PORTJ ; Steps hi to PORTJ
   movff   _X_steps,PORTB   ; Steps lo to PORTB
   
   tstfsz  _X_steps         ; Test steps lo, skip next if zero
   goto    Main_loop        ; More steps to do, so loop
   tstfsz  _X_steps+1       ; Test steps hi, skip next if zero
   bra     Re_load_lb
   goto    All_done
	
Re_load_lb
   decf    _X_steps+1,F    ; Decrement hb and then carry to lb
   setf    _X_steps        ; Decremented hb, so load ff to lb
   goto    Main_loop
	
All_done	
   bcf     INTCON,7       ; Clear GIE, disable ALL interrupts
   clrwdt

ENDASM
RETURN

' *****************************************************************************
' *                                                                           *
' *                                INITIALISE                                 * 
' *                                                                           *
' *****************************************************************************
Start:
ADCON1	= %00001101           ' A0, A1 analog, rest digital
CMCON	= %00000111           ' Comparators off, this frees up PORTF
TRISA   = %00000000                                  
TRISB   = %00000000
TRISC	= %00000000
TRISD   = %00000000           ' D.0 is X drive. D.3 is Y drive
TRISE   = %00000000           ' LEDs to display X_steps lo byte
TRISF   = %00000000
TRISG   = %00000000
TRISH   = %00000000
TRISJ   = %00000000           ' LEDs to display X_steps hi byte 

' *****************************************************************************
' *                                                                           *
' *                                   MAIN                                    * 
' *                                                                           *
' *****************************************************************************

Main:  
    X_delay = $FFFF
    Y_delay = $FFFF
    X_steps = $FFFF
    Count_pulse = $FFFF
    
    gosub Run_ASM   
    pause 100   
    goto Main

	end
You used a .asm technique of defining a data address like:
_X_delay : 2 ; Reserve two bytes in data memory
If I have a variable in PBP like
X_delay VAR WORD
Will the WORD from PBP find it's way to the .asm?

Charles L: I'm still going to do it using DT's interrupts

Regards Bill Legge