forgot to add I have tried 4 ways to implement this , none of which produces any error .
the subroutine below is run 1/sec in a working packet radio system with heaps or interrupts ,
no sign of sky falling yet


ps the result is displayed on a glcd using my glcd include as previously described in this forum



Code:
 w0 var word
 Report var byte[4]
 albo   var byte[4]
 I var byte




alberto: 
  random w0
 albo[0] = w0
  random w0
 albo[1] = w0
  random w0 
 albo[2] = w0
 w0=0
 for i =0 to 2
    w0=w0+albo[i]
 next
crc: ;   label to examine listing if required
 ;method 0
 albo[3] = ~w0
Report[0] =  albo[3]

 ;method 3
@ NOT?WB _w0,_Report+3

 ;method 2
 Report[2] = w0 //256
 Report[2] = ~ Report[2]

 ;method 1
asm
  CHK?RP _w0
  MOVF _w0,W
  CHK?RP _Report 
  MOVWF  _Report +1
  COMF   _Report +1,F
  RST?RP
ENDASM 
 
ecrc:
IF (Report[0]-Report[1])-(Report[2]-Report[3]) THEN
  ARRAYWRITE BUFF,["The sky is falling",0]  
  led_cnt=KEY_BEEP_TIME   ;  set off the alarm
  led_times=2                    ; twice for good measure
ELSE 
  ARRAYWRITE BUFF,[#Report[0]," ",#Report[1]," ",#Report[2]," ",#Report[3],0]
endif 
  GLCD_CLR 0,43,100,8
  GLCDC  1 ,43
  GLCDSTR  BUFF
 return