Quote Originally Posted by Ioannis View Post
My main concern is how to save the W register and then restore it.

I tried

MOVW _wsave

but did not compile.

Ioannis
The command would be: movwf

Here is a quick attempt at converting the asm to PBP. Note that this is not the most efficeint/elegant conversion, but it should be a bit clearer was to what's happening.

Code:
crc VAR BYTE
i_w VAR BYTE

goto start                  

crc_8:
   crc = i_w ^ crc        ;xorwf crc,f
   i_w = 0                   ;clrw

   IF crc.0 = 1 THEN     ;btfsc crc,0
      i_w = i_w ^ $5E    ;xorlw 0x5e
      END IF
   IF crc.1 = 1 THEN     ;btfsc crc,0
      i_w = i_w ^ $BC    ;xorlw 0xbc
      END IF
   IF crc.2 = 1 THEN     ;btfsc crc,0
      i_w = i_w ^ $61    ;xorlw 0x61
      END IF
   IF crc.3 = 1 THEN     ;btfsc crc,0
      i_w = i_w ^ $C2    ;xorlw 0xc2
      END IF
   IF crc.4 = 1 THEN     ;btfsc crc,0
      i_w = i_w ^ $9D    ;xorlw 0x9d
      END IF
   IF crc.5 = 1 THEN     ;btfsc crc,0
      i_w = i_w ^ $23    ;xorlw 0x23
      END IF
   IF crc.6 = 1 THEN     ;btfsc crc,0
      i_w = i_w ^ $46    ;xorlw 0x46
      END IF
   IF crc.7 = 1 THEN     ;btfsc crc,0
      i_w = i_w ^ $8C    ;xorlw 0x8c
      END IF

   crc = i_w             ;movwf crc
RETURN

start:
 crc = 0                    ;clrf crc
 i_w = 1                    ;movlw 1
 GOSUB crc_8            ;call  crc_8

 crc = 0                    ;clrf crc
 i_w = 2                    ;movlw 2
 GOSUB crc_8            ;call  crc_8
 
 crc = 0                    ;clrf crc
 i_w = 4                    ;movlw 4
 GOSUB crc_8            ;call  crc_8

 crc = 0                   ;clrf crc
 i_w = 8                   ;movlw 8
 GOSUB crc_8            ;call  crc_8

 crc = 0                   ;clrf crc
 i_w = $10                ;movlw 0x10
 GOSUB crc_8            ;call  crc_8

 crc = 0                   ;clrf crc
 i_w = $20                ;movlw 0x20
 GOSUB crc_8            ;call  crc_8

 crc = 0                   ;clrf crc
 i_w = $40                ;movlw 0x40
 GOSUB crc_8            ;call  crc_8

 crc = 0                   ;clrf crc
 i_w = $80                ;movlw 0x80
 GOSUB crc_8            ;call  crc_8
END