Search code examples
assemblyembeddedpicmplabxc8

MPLAB X IDE PIC assembly program throwing syntax error on lines containing labels


I am getting error at the lines containg ,"3 COMF PORTB,F" "D1 MOVLW 0xaf"(lines contains labels) as syntax error.

Also, anybody know how to set configuration bit and write assembly code for pic micro controller correctly please rectify and point me to the right resources.

Please read this before answering, since I am using latest MPLABX IDE there is no program or tool chain named MPASM like in old ones.

So on Internet searched and found we can use XC8 to compile the assembly code too.

But when I add configuration bit code generated using MPLABX IDE again the build process throw error, I only created a main.

ASM file and added generated configuration code there.

So now I removed the entire config code and just write bare assembly code to simulate, now get syntax error.

Totally confused and no idea, really getting troubled.

I already know Embedded C programming, but like to learn assembly to understand the under the hood details of PIC.

Needed help.

#include <pic18f45k80.inc>
R1  EQU 0X07
R2  EQU 0X08
R3  EQU 0X09
    ORG 0
    CLRF    TRISB
    MOVLW   0X55
    MOVWF   PORTB
L3  COMF    PORTB,F
    CALL    QDELAY
    BRA     L3

QDELAY  
    MOVLW 0x05
    MOVWF R1
D1  MOVLW 0xaf
    MOVWF R2
D2  MOVLW 0xaf
    MOVWF R3
D3  NOP
    NOP
    DECF  R3, F
    BNZ D3
    DECF R2, F
    BNZ D2
    DECF R1, F
    BNZ D1
    RETURN
    END

This is the error faced when building is done.

main.asm:6:: warning: (1522) RAM access bit operand not specified, assuming access-bank
main.asm:8:: warning: (1522) RAM access bit operand not specified, assuming access-bank
main.asm:9:: error: (876) syntax error
main.asm:13:: error: (876) syntax error
main.asm:15:: warning: (1522) RAM access bit operand not specified, assuming access-bank
main.asm:16:: error: (876) syntax error
main.asm:17:: warning: (1522) RAM access bit operand not specified, assuming access-bank
main.asm:18:: error: (876) syntax error
main.asm:19:: warning: (1522) RAM access bit operand not specified, assuming access-bank
main.asm:20:: error: (876) syntax error
main.asm:22:: warning: (1522) RAM access bit operand not specified, assuming access-bank
main.asm:24:: warning: (1522) RAM access bit operand not specified, assuming access-bank
main.asm:26:: warning: (1522) RAM access bit operand not specified, assuming access-bank
main.asm:10:: error: (800) undefined symbol "QDELAY"
main.asm:11:: error: (1223) relative branch/call offset out of range
(908) exit status = 1

Solution

  • You may benefit from a practical example of a port from MPASM to pic-as(v2.20)

    This is the MPASM file I started with:

    ; File:     main.asm
    ; Target:   PIC18F2550
    ; Author:   dan1138
    ; Date:     2020-06-17
    ; Compiler: MPASM v5.84
    ; IDE:      MPLABX v5.25
    ;
    ; Description:
    ;
    ;   Find integer square root of a 32-bit value
    ;
    ;
    ;
    ;
    ;                             PIC18F2550
    ;                    +------------:_:------------+
    ;          VPP ->  1 : RE3/MCLRn/VPP     PGD/RB7 : 28 <> PGD
    ;              ->  2 : RA0/AN0           PGC/RB6 : 27 <> PGC
    ;              <>  3 : RA1/AN1           PGM/RB5 : 26 <>
    ;              <>  4 : RA2/AN2          AN11/RB4 : 25 <>
    ;              <>  5 : RA3/AN3           AN9/RB3 : 24 <>
    ;              <>  6 : RA4/C1OUT         AN8/RB2 : 23 <>
    ;              <>  7 : RA5/AN4          AN10/RB1 : 22 <>
    ;          GND <>  8 : VSS              AN12/RB0 : 21 <>
    ;        20MHz <>  9 : RA7/OSC1              VDD : 20 <- 5v0
    ;        20MHz <> 10 : RA6/OSC2              VSS : 19 <- GND
    ;    32.768KHz <> 11 : RC0/SOSCO       RX/DT/RC7 : 18 <>
    ;    32.768KHz <> 12 : RC1/SOSCI       TX/CK/RC6 : 17 <>
    ;              <> 13 : RC2/CCP1           D+/RC5 : 16 <-
    ;              <> 14 : VUSB               D-/RC4 : 15 <-
    ;                    +---------------------------:
    ;                               DIP-28
    ;  Note:
    ;   RC4,RC5 can only be used as digital inputs when the USB transceiver is not used.
    ;
        list        p=18F2550
        list        c=132
        list        r=dec
    ;
     config PLLDIV = 5          ; PLL Prescaler Selection bits (Divide by 5 (20 MHz oscillator input))
     config CPUDIV = OSC1_PLL2  ; System Clock Postscaler Selection bits ([Primary Oscillator Src: /1][96 MHz PLL Src: /2])
     config USBDIV = 2          ; USB Clock Selection bit (used in Full-Speed USB mode only; UCFG:FSEN = 1) (USB clock source comes from the 96 MHz PLL divided by 2)
     config FOSC = HSPLL_HS     ; Oscillator Selection bits (HS oscillator, PLL enabled (HSPLL))
     config FCMEN = OFF         ; Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
     config IESO = OFF          ; Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)
     config PWRT = OFF          ; Power-up Timer Enable bit (PWRT disabled)
     config BOR = OFF           ; Brown-out Reset Enable bits (Brown-out Reset disabled in hardware and software)
     config BORV = 3            ; Brown-out Reset Voltage bits (Minimum setting 2.05V)
     config VREGEN = OFF        ; USB Voltage Regulator Enable bit (USB voltage regulator disabled)
     config WDT = OFF           ; Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit))
     config WDTPS = 32768       ; Watchdog Timer Postscale Select bits (1:32768)
     config CCP2MX = ON         ; CCP2 MUX bit (CCP2 input/output is multiplexed with RC1)
     config PBADEN = OFF        ; PORTB A/D Enable bit (PORTB<4:0> pins are configured as digital I/O on Reset)
     config LPT1OSC = OFF       ; Low-Power Timer 1 Oscillator Enable bit (Timer1 configured for higher power operation)
     config MCLRE = ON          ; MCLR Pin Enable bit (MCLR pin enabled; RE3 input pin disabled)
     config STVREN = ON         ; Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
     config LVP = OFF           ; Single-Supply ICSP Enable bit (Single-Supply ICSP disabled)
     config XINST = OFF         ; Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))
     config CP0 = OFF           ; Code Protection bit (Block 0 (000800-001FFFh) is not code-protected)
     config CP1 = OFF           ; Code Protection bit (Block 1 (002000-003FFFh) is not code-protected)
     config CP2 = OFF           ; Code Protection bit (Block 2 (004000-005FFFh) is not code-protected)
     config CP3 = OFF           ; Code Protection bit (Block 3 (006000-007FFFh) is not code-protected)
     config CPB = OFF           ; Boot Block Code Protection bit (Boot block (000000-0007FFh) is not code-protected)
     config CPD = OFF           ; Data EEPROM Code Protection bit (Data EEPROM is not code-protected)
     config WRT0 = OFF          ; Write Protection bit (Block 0 (000800-001FFFh) is not write-protected)
     config WRT1 = OFF          ; Write Protection bit (Block 1 (002000-003FFFh) is not write-protected)
     config WRT2 = OFF          ; Write Protection bit (Block 2 (004000-005FFFh) is not write-protected)
     config WRT3 = OFF          ; Write Protection bit (Block 3 (006000-007FFFh) is not write-protected)
     config WRTC = OFF          ; Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) are not write-protected)
     config WRTB = OFF          ; Boot Block Write Protection bit (Boot block (000000-0007FFh) is not write-protected)
     config WRTD = OFF          ; Data EEPROM Write Protection bit (Data EEPROM is not write-protected)
     config EBTR0 = OFF         ; Table Read Protection bit (Block 0 (000800-001FFFh) is not protected from table reads executed in other blocks)
     config EBTR1 = OFF         ; Table Read Protection bit (Block 1 (002000-003FFFh) is not protected from table reads executed in other blocks)
     config EBTR2 = OFF         ; Table Read Protection bit (Block 2 (004000-005FFFh) is not protected from table reads executed in other blocks)
     config EBTR3 = OFF         ; Table Read Protection bit (Block 3 (006000-007FFFh) is not protected from table reads executed in other blocks)
     config EBTRB = OFF         ; Boot Block Table Read Protection bit (Boot block (000000-0007FFh) is not protected from table reads executed in other blocks)
    ;
    ;   Specify the System clock frequency in Hz
    ;
    #define FOSC 48000000
    ;
    ;   Specify the Peripheral clock frequency in Hz
    ;
    #define FCYC (FOSC/4)
    ;
    ; Include device specific definitions for Special Function Registers
    ;
    #include <p18F2550.inc>
    ;
    ;
    ;
    ;
    ;
    resetVec    code    0x0000          ; processor reset vector
    ;
    resetVec:
        clrf    TBLPTRU, ACCESS
        goto    Start
    ;
    hi_int_vec  code    0x0008
    ;
        goto    HighIsrHandler
    ;
    LowIsr_data udata_acs
    ;
        global  WREG_save,STATUS_save,BSR_save
    ;
    WREG_save:      res 1
    STATUS_save:    res 1
    BSR_save:       res 1
    ;
    lo_int_vec  code    0x0018
    ;
    LowIsrVec:
        movff   WREG,WREG_save
        movff   STATUS,STATUS_save
        movff   BSR,BSR_save
    ;
    LowIsrHandler:
    ;
        movff   BSR_save,BSR
        movff   STATUS_save,STATUS
        movff   WREG_save,WREG
        retfie
    ;
    HighIsr_code code
    ;
    HighIsrHandler:
        return  FAST
    ;
    start_code  code
    ;
    Start:
        bcf     INTCON,GIEH         ; Disable all interrupts
        bcf     INTCON,GIEL
        bsf     RCON,IPEN           ; Enable interrupt priority
    ;
        movlw   0x00                ; Set primary oscillator as system clock source
        movwf   OSCCON,ACCESS       ;
    ;
        movlw   0x0F                ; Configure A/D
        movwf   ADCON1              ; for digital inputs
    ;
        goto    main
    ;
    ; Implement integer square root
    ;
    ;       unsigned long   in;
    ;       unsigned long  out;
    ;       unsigned long  bit;
    ;       unsigned long temp;
    ;
    ;       unsigned long isqrt(void)
    ;       {
    ;           out = 0;
    ;           bit = 1L << 30;
    ;
    ;           // "bit" starts at the highest power of four <= the argument.
    ;           while (bit > in)
    ;               bit >>= 2;
    ;
    ;           while (bit != 0)
    ;           {
    ;               temp = out + bit;
    ;               out >>= 1;
    ;               if (in >= temp)
    ;               {
    ;                   in -= temp;
    ;                   out += bit;
    ;               }
    ;               bit >>= 2;
    ;           }
    ;           return out;
    ;       }
    ;
    ;
    isqrt_data  udata
        global      isqrt_in,isqrt_out,isqrt_bit,isqrt_temp
    ;
    isqrt_in:       res 4
    isqrt_out:      res 4
    isqrt_bit:      res 4
    isqrt_temp:     res 4
    ;
    isqrt_code  code
    ;
    ;
    ; logical shift right one bit [fsr1]
    ;
    isqrt_lsr:
        bcf     STATUS,C
        rrcf    POSTDEC1,F
        rrcf    POSTDEC1,F
        rrcf    POSTDEC1,F
        rrcf    INDF1,f
        return
    ;
    ; Compare [FSR2] - [FSR1]
    ; Carry set when [FSR2] >= [FSR1]
    ; Carry clear when [FSR2] < [FSR1]
    ;
    isqrt_cmp:
        movf    POSTINC1,w
        subwf   POSTINC2,w
        movf    POSTINC1,w
        subwfb  POSTINC2,w
        movf    POSTINC1,w
        subwfb  POSTINC2,w
        movf    INDF1,w
        subwfb  INDF2,w
        return
    ;
    isqrt:
        clrf    isqrt_out
        clrf    isqrt_out+1
        clrf    isqrt_out+2
        clrf    isqrt_out+3
    ;
        clrf    isqrt_bit
        clrf    isqrt_bit+1
        clrf    isqrt_bit+2
        movlw   B'01000000'
        movwf   isqrt_bit+3
    ;
    FindMSB:
        lfsr    FSR1,isqrt_bit
        lfsr    FSR2,isqrt_in
        rcall   isqrt_cmp       ; STATUS set to (isqrt_in - isqrt_bit)
        bc      FindNextDigit   ; branch when isqrt_in >= isqrt_bit
    ;
    ; Shift the digits right two bits
    ;
        lfsr    FSR1,isqrt_bit+3
        rcall   isqrt_lsr
        lfsr    FSR1,isqrt_bit+3
        rcall   isqrt_lsr
        bra     FindMSB
    ;
    FindNextDigit:
        movf    isqrt_bit,W
        iorwf   isqrt_bit+1,W
        iorwf   isqrt_bit+2,W
        iorwf   isqrt_bit+3,W
        bz      isqrt_done
    ;
        movf    isqrt_bit,W
        addwf   isqrt_out,W
        movwf   isqrt_temp
        movf    isqrt_bit+1,W
        addwfc  isqrt_out+1,W
        movwf   isqrt_temp+1
        movf    isqrt_bit+2,W
        addwfc  isqrt_out+2,W
        movwf   isqrt_temp+2
        movf    isqrt_bit+3,W
        addwfc  isqrt_out+3,W
        movwf   isqrt_temp+3
    ;
        lfsr    FSR1,isqrt_out+3
        rcall   isqrt_lsr
    ;
        lfsr    FSR1,isqrt_temp
        lfsr    FSR2,isqrt_in
        rcall   isqrt_cmp       ; STATUS set to (isqrt_in - isqrt_temp)
        bnc     NoDigitUpdate   ; Branch when isqrt_in >= isqrt_temp
    ;
        movf    isqrt_temp,W
        subwf   isqrt_in
        movf    isqrt_temp+1,W
        subwfb  isqrt_in+1
        movf    isqrt_temp+2,W
        subwfb  isqrt_in+2
        movf    isqrt_temp+3,W
        subwfb  isqrt_in+3
    ;
        movf    isqrt_bit,W
        addwf   isqrt_out
        movf    isqrt_bit+1,W
        addwfc  isqrt_out+1
        movf    isqrt_bit+2,W
        addwfc  isqrt_out+2
        movf    isqrt_bit+3,W
        addwfc  isqrt_out+3
    ;
    NoDigitUpdate:
    ;
        lfsr    FSR1,isqrt_bit+3
        rcall   isqrt_lsr
        lfsr    FSR1,isqrt_bit+3
        rcall   isqrt_lsr
        bra     FindNextDigit
    ;
    isqrt_done:
        return
    ;
    main_code   code
    ;
    ;
    ; Constants
    #define TEST_VALUE1 2*2
    #define TEST_VALUE2 3*3
    #define TEST_VALUE3 4*4
    #define TEST_VALUE4 5*5
    #define TEST_VALUE5 6*6
    #define TEST_VALUE6 10*10
    #define TEST_VALUE7 9999*9999
    #define TEST_VALUE8 12345*12345
    #define TEST_VALUE9 65535*65535
    ;
    ; Macro to load a 32-bit constant
    ;
    load32  macro DWORD, CONST
    ;
        banksel DWORD
        movlw   0xFF & (CONST)
        movwf   DWORD
        movlw   0xFF & (CONST >> 8)
        movwf   DWORD+1
        movlw   0xFF & (CONST >> 16)
        movwf   DWORD+2
        movlw   0xFF & (CONST >> 24)
        movwf   DWORD+3
    ;
            endm
    ;
    main:
    ;
    AppLoop:
        load32  isqrt_in,TEST_VALUE1
        call    isqrt
        load32  isqrt_in,TEST_VALUE2
        call    isqrt
        load32  isqrt_in,TEST_VALUE3
        call    isqrt
        load32  isqrt_in,TEST_VALUE4
        call    isqrt
        load32  isqrt_in,TEST_VALUE5
        call    isqrt
        load32  isqrt_in,TEST_VALUE6
        call    isqrt
        load32  isqrt_in,TEST_VALUE7
        call    isqrt
        load32  isqrt_in,TEST_VALUE8
        call    isqrt
        load32  isqrt_in,TEST_VALUE9
        call    isqrt
        goto    AppLoop
    ;
        END
    

    This is the code ported to build with the pic-as(v2.20) tool chain:

    ; File:     main.S
    ; Target:   PIC18F2550
    ; Author:   dan1138
    ; Date:     2020-06-17
    ; Compiler: pic-as(v2.20)
    ; IDE:      MPLABX v5.40
    ;
    ; Description:
    ;
    ;   Find integer square root of a 32-bit value
    ;
    ; Add to the MPLABX project Additional options:
    ;   -Wa,-a -Wl,-presetVec=0h,-phi_int_vec=08h,-plo_int_vec=18h
    ;
    ;                             PIC18F2550
    ;                    +------------:_:------------+
    ;          VPP ->  1 : RE3/MCLRn/VPP     PGD/RB7 : 28 <> PGD
    ;              ->  2 : RA0/AN0           PGC/RB6 : 27 <> PGC
    ;              <>  3 : RA1/AN1           PGM/RB5 : 26 <> 
    ;              <>  4 : RA2/AN2          AN11/RB4 : 25 <> 
    ;              <>  5 : RA3/AN3           AN9/RB3 : 24 <> 
    ;              <>  6 : RA4/C1OUT         AN8/RB2 : 23 <> 
    ;              <>  7 : RA5/AN4          AN10/RB1 : 22 <> 
    ;          GND <>  8 : VSS              AN12/RB0 : 21 <> 
    ;        20MHz <>  9 : RA7/OSC1              VDD : 20 <- 5v0
    ;        20MHz <> 10 : RA6/OSC2              VSS : 19 <- GND
    ;    32.768KHz <> 11 : RC0/SOSCO       RX/DT/RC7 : 18 <> 
    ;    32.768KHz <> 12 : RC1/SOSCI       TX/CK/RC6 : 17 <> 
    ;              <> 13 : RC2/CCP1           D+/RC5 : 16 <- 
    ;              <> 14 : VUSB               D-/RC4 : 15 <- 
    ;                    +---------------------------:
    ;                               DIP-28
    ;  Note: 
    ;   RC4,RC5 can only be used as digital inputs when the USB transceiver is not used.
    ;
        processor   18F2550
        pagewidth   132
        radix       dec
    ;
     config PLLDIV = 5          ; PLL Prescaler Selection bits (Divide by 5 (20 MHz oscillator input))
     config CPUDIV = OSC1_PLL2  ; System Clock Postscaler Selection bits ([Primary Oscillator Src: /1][96 MHz PLL Src: /2])
     config USBDIV = 2          ; USB Clock Selection bit (used in Full-Speed USB mode only; UCFG:FSEN = 1) (USB clock source comes from the 96 MHz PLL divided by 2)
     config FOSC = HSPLL_HS     ; Oscillator Selection bits (HS oscillator, PLL enabled (HSPLL))
     config FCMEN = OFF         ; Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
     config IESO = OFF          ; Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)
     config PWRT = OFF          ; Power-up Timer Enable bit (PWRT disabled)
     config BOR = OFF           ; Brown-out Reset Enable bits (Brown-out Reset disabled in hardware and software)
     config BORV = 3            ; Brown-out Reset Voltage bits (Minimum setting 2.05V)
     config VREGEN = OFF        ; USB Voltage Regulator Enable bit (USB voltage regulator disabled)
     config WDT = OFF           ; Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit))
     config WDTPS = 32768       ; Watchdog Timer Postscale Select bits (1:32768)
     config CCP2MX = ON         ; CCP2 MUX bit (CCP2 input/output is multiplexed with RC1)
     config PBADEN = OFF        ; PORTB A/D Enable bit (PORTB<4:0> pins are configured as digital I/O on Reset)
     config LPT1OSC = OFF       ; Low-Power Timer 1 Oscillator Enable bit (Timer1 configured for higher power operation)
     config MCLRE = ON          ; MCLR Pin Enable bit (MCLR pin enabled; RE3 input pin disabled)
     config STVREN = ON         ; Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
     config LVP = OFF           ; Single-Supply ICSP Enable bit (Single-Supply ICSP disabled)
     config XINST = OFF         ; Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))
     config CP0 = OFF           ; Code Protection bit (Block 0 (000800-001FFFh) is not code-protected)
     config CP1 = OFF           ; Code Protection bit (Block 1 (002000-003FFFh) is not code-protected)
     config CP2 = OFF           ; Code Protection bit (Block 2 (004000-005FFFh) is not code-protected)
     config CP3 = OFF           ; Code Protection bit (Block 3 (006000-007FFFh) is not code-protected)
     config CPB = OFF           ; Boot Block Code Protection bit (Boot block (000000-0007FFh) is not code-protected)
     config CPD = OFF           ; Data EEPROM Code Protection bit (Data EEPROM is not code-protected)
     config WRT0 = OFF          ; Write Protection bit (Block 0 (000800-001FFFh) is not write-protected)
     config WRT1 = OFF          ; Write Protection bit (Block 1 (002000-003FFFh) is not write-protected)
     config WRT2 = OFF          ; Write Protection bit (Block 2 (004000-005FFFh) is not write-protected)
     config WRT3 = OFF          ; Write Protection bit (Block 3 (006000-007FFFh) is not write-protected)
     config WRTC = OFF          ; Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) are not write-protected)
     config WRTB = OFF          ; Boot Block Write Protection bit (Boot block (000000-0007FFh) is not write-protected)
     config WRTD = OFF          ; Data EEPROM Write Protection bit (Data EEPROM is not write-protected)
     config EBTR0 = OFF         ; Table Read Protection bit (Block 0 (000800-001FFFh) is not protected from table reads executed in other blocks)
     config EBTR1 = OFF         ; Table Read Protection bit (Block 1 (002000-003FFFh) is not protected from table reads executed in other blocks)
     config EBTR2 = OFF         ; Table Read Protection bit (Block 2 (004000-005FFFh) is not protected from table reads executed in other blocks)
     config EBTR3 = OFF         ; Table Read Protection bit (Block 3 (006000-007FFFh) is not protected from table reads executed in other blocks)
     config EBTRB = OFF         ; Boot Block Table Read Protection bit (Boot block (000000-0007FFh) is not protected from table reads executed in other blocks)
    ;
    ;   Specify the System clock frequency in Hz
    ;
    #define FOSC 48000000
    ;   
    ;   Specify the Peripheral clock frequency in Hz
    ;
    #define FCYC (FOSC/4)
    ;
    ; Include device specific definitions for Special Function Registers
    ;
    #include <xc.inc>
    ;
    ; Preprocessor macro to help with LFSR opcode
    ;
    #define FSR(x) (x)
    ;
        psect   resetVec,global,reloc=2,class=CODE,delta=1
    ;
    resetVec:
        clrf    TBLPTRU,c
        goto    Start
    ;
        psect   hi_int_vec,global,reloc=2,class=CODE,delta=1
    ;
        goto    HighIsrHandler
    ;
        psect   LowIsr_data,global,class=COMRAM,space=1,delta=1,lowdata,noexec
    ;
        global  WREG_save,STATUS_save,BSR_save
    ;
    WREG_save:      ds  1
    STATUS_save:    ds  1
    BSR_save:       ds  1
    ;
        psect   lo_int_vec,global,reloc=2,class=CODE,delta=1
    ;
    LowIsrVec:
        movff   WREG,WREG_save
        movff   STATUS,STATUS_save
        movff   BSR,BSR_save
    ;
    LowIsrHandler:
    ;
        movff   BSR_save,BSR
        movff   STATUS_save,STATUS
        movff   WREG_save,WREG
        retfie  0
    ;
        psect   HighIsr_code,global,reloc=2,class=CODE,delta=1
    ;
    HighIsrHandler:
        return  1
    ;
        psect   start_code,global,reloc=2,class=CODE,delta=1
    ;
    Start:
        bcf     INTCON,INTCON_GIEH_POSITION,0 ; Disable all interrupts
        bcf     INTCON,INTCON_GIEL_POSITION,0
        bsf     RCON,RCON_IPEN_POSITION,0 ; Enable interrupt priority
    ;
        movlw   0x00                ; Set primary oscillator as system clock source
        movwf   OSCCON,c            ;
    ;
        movlw   0x0F                ; Configure A/D
        movwf   ADCON1,c            ; for digital inputs
    ;
        goto    main
    ;
    ; Implement integer square root
    ;
    ;       unsigned long   in;
    ;       unsigned long  out;
    ;       unsigned long  bit;
    ;       unsigned long temp;
    ;
    ;       unsigned long isqrt(void)
    ;       {
    ;           out = 0;
    ;           bit = 1L << 30;
    ;
    ;           // "bit" starts at the highest power of four <= the argument.
    ;           while (bit > in)
    ;               bit >>= 2;
    ;
    ;           while (bit != 0)
    ;           {
    ;               temp = out + bit;
    ;               out >>= 1;
    ;               if (in >= temp)
    ;               {
    ;                   in -= temp;
    ;                   out += bit;
    ;               }
    ;               bit >>= 2;
    ;           }
    ;           return out;
    ;       }
    ;
    ;
        psect       isqrt_data,global,class=RAM,space=1,delta=1,noexec
        global      isqrt_in,isqrt_out,isqrt_bit,isqrt_temp
    ;
    isqrt_in:       ds  4
    isqrt_out:      ds  4
    isqrt_bit:      ds  4
    isqrt_temp:     ds  4
    ;
        psect   isqrt_code,global,reloc=2,class=CODE,delta=1
    ;
    ;
    ; 32-bit logical shift right one bit [fsr1]
    ;
    isqrt_lsr:
        bcf     STATUS,STATUS_C_POSITION,0
        rrcf    POSTDEC1,1,0
        rrcf    POSTDEC1,1,0
        rrcf    POSTDEC1,1,0
        rrcf    INDF1,1,0
        return
    ;
    ; Compare [FSR2] - [FSR1]
    ; Carry set when [FSR2] >= [FSR1]
    ; Carry clear when [FSR2] < [FSR1]
    ;
    isqrt_cmp:
        movf    POSTINC1,w,c
        subwf   POSTINC2,w,c
        movf    POSTINC1,w,c
        subwfb  POSTINC2,w,c
        movf    POSTINC1,w,c
        subwfb  POSTINC2,w,c
        movf    INDF1,w,c
        subwfb  INDF2,w,c
        return
    ;
    isqrt:
        clrf    BANKMASK(isqrt_out),b
        clrf    BANKMASK(isqrt_out)+1,b
        clrf    BANKMASK(isqrt_out)+2,b
        clrf    BANKMASK(isqrt_out)+3,b
    ;
        clrf    BANKMASK(isqrt_bit),b
        clrf    BANKMASK(isqrt_bit)+1,b
        clrf    BANKMASK(isqrt_bit)+2,b
        movlw   0b01000000
        movwf   BANKMASK(isqrt_bit)+3,b
    ;
    FindMSB:
        lfsr    FSR(1),isqrt_bit
        lfsr    FSR(2),isqrt_in
        rcall   isqrt_cmp       ; STATUS set to (isqrt_in - isqrt_bit)
        bc      FindNextDigit   ; branch when isqrt_in >= isqrt_bit
    ;
    ; Shift the digits right two bits
    ;
        lfsr    FSR(1),isqrt_bit+3
        rcall   isqrt_lsr
        lfsr    FSR(1),isqrt_bit+3
        rcall   isqrt_lsr
        bra     FindMSB
    ;
    FindNextDigit:
        movf    BANKMASK(isqrt_bit),W,b
        iorwf   BANKMASK(isqrt_bit)+1,W,b
        iorwf   BANKMASK(isqrt_bit)+2,W,b
        iorwf   BANKMASK(isqrt_bit)+3,W,b
        bz      isqrt_done
    ;
        movf    BANKMASK(isqrt_bit),W,b
        addwf   BANKMASK(isqrt_out),W,b
        movwf   BANKMASK(isqrt_temp),b
        movf    BANKMASK(isqrt_bit)+1,W,b
        addwfc  BANKMASK(isqrt_out)+1,W,b
        movwf   BANKMASK(isqrt_temp)+1,b
        movf    BANKMASK(isqrt_bit)+2,W,b
        addwfc  BANKMASK(isqrt_out)+2,W,b
        movwf   BANKMASK(isqrt_temp)+2,b
        movf    BANKMASK(isqrt_bit)+3,W,b
        addwfc  BANKMASK(isqrt_out)+3,W,b
        movwf   BANKMASK(isqrt_temp)+3,b
    ;
        lfsr    FSR(1),isqrt_out+3
        rcall   isqrt_lsr
    ;
        lfsr    FSR(1),isqrt_temp
        lfsr    FSR(2),isqrt_in
        rcall   isqrt_cmp       ; STATUS set to (isqrt_in - isqrt_temp)
        bnc     NoDigitUpdate   ; Branch when isqrt_in >= isqrt_temp
     ;
        movf    BANKMASK(isqrt_temp),W,b
        subwf   BANKMASK(isqrt_in),b
        movf    BANKMASK(isqrt_temp)+1,W,b
        subwfb  BANKMASK(isqrt_in)+1,b
        movf    BANKMASK(isqrt_temp)+2,W,b
        subwfb  BANKMASK(isqrt_in)+2,b
        movf    BANKMASK(isqrt_temp)+3,W,b
        subwfb  BANKMASK(isqrt_in)+3,b
    ;
        movf    BANKMASK(isqrt_bit),W,b
        addwf   BANKMASK(isqrt_out),b
        movf    BANKMASK(isqrt_bit)+1,W,b
        addwfc  BANKMASK(isqrt_out)+1,b
        movf    BANKMASK(isqrt_bit)+2,W,b
        addwfc  BANKMASK(isqrt_out)+2,b
        movf    BANKMASK(isqrt_bit)+3,W,b
        addwfc  BANKMASK(isqrt_out)+3,b
    ;
    NoDigitUpdate:
    ;
        lfsr    FSR(1),isqrt_bit+3
        rcall   isqrt_lsr
        lfsr    FSR(1),isqrt_bit+3
        rcall   isqrt_lsr
        bra     FindNextDigit
    ;
    isqrt_done:
        return
    ;
        psect   main_code,global,reloc=2,class=CODE,delta=1
    ;
    ;
    ; Constants
    #define TEST_VALUE1 2*2
    #define TEST_VALUE2 3*3
    #define TEST_VALUE3 4*4
    #define TEST_VALUE4 5*5
    #define TEST_VALUE5 6*6
    #define TEST_VALUE6 10*10
    #define TEST_VALUE7 9999*9999
    #define TEST_VALUE8 12345*12345
    #define TEST_VALUE9 65535*65535
    ;
    ; Macro to load a 32-bit constant
    ;
    load32  macro DWORD,CONST
    ;
        banksel DWORD
        movlw   255 and (CONST)
        movwf   BANKMASK(DWORD),b
        movlw   255 and (CONST >> 8)
        movwf   BANKMASK(DWORD)+1,b
        movlw   255 and (CONST >> 16)
        movwf   BANKMASK(DWORD)+2,b
        movlw   255 and (CONST >> 24)
        movwf   BANKMASK(DWORD)+3,b
    ;
            endm
    ;
    main:
    ;
    AppLoop:
        load32  isqrt_in,TEST_VALUE1
        call    isqrt
        load32  isqrt_in,TEST_VALUE2
        call    isqrt
        load32  isqrt_in,TEST_VALUE3
        call    isqrt
        load32  isqrt_in,TEST_VALUE4
        call    isqrt
        load32  isqrt_in,TEST_VALUE5
        call    isqrt
        load32  isqrt_in,TEST_VALUE6
        call    isqrt
        load32  isqrt_in,TEST_VALUE7
        call    isqrt
        load32  isqrt_in,TEST_VALUE8
        call    isqrt
        load32  isqrt_in,TEST_VALUE9
        call    isqrt
        goto    AppLoop
    ;
        END     resetVec
    

    Use a source file difference tool like kdiff to see what needed to be changed.

    I tried very hard to make the minimum changes to get the same HEX file output from both assemblers.

    For a complete MPLABX v5.40 project see this git repository.