in this example I use indirect addressing to retrieve the data ,but due to the 12f1822 architecture only the low 8 bits are retrievable .wastes a bit of space but its heaps quicker

Code:
'****************************************************************
'*  Name    : ws2812.BAS                                                                              *
'*  Author  : richard                                                                                       *
'*  Notice  :                                                                                                   *
'*          :                                                                                                     *
'*  Date    : 1/11/2016                                                                                  *
'*  Version : 1.0                                                                                            *
'*  Notes   : pic12f1822  @32 mhz 3v3                                                           *
'*          : porta.5 >>>> ws2821 Din                                                             *
'****************************************************************
 #CONFIG
cfg1 = _FOSC_INTOSC
cfg1&= _WDTE_ON
cfg1&= _PWRTE_OFF
cfg1&= _MCLRE_ON
cfg1&= _CP_OFF
cfg1&= _CPD_OFF
cfg1&= _BOREN_ON
cfg1&= _CLKOUTEN_OFF
cfg1&= _IESO_ON
cfg1&= _FCMEN_ON
  __CONFIG _CONFIG1, cfg1

cfg2 = _WRT_OFF
cfg2&= _PLLEN_ON
cfg2&= _STVREN_ON
cfg2&= _BORV_19
cfg2&= _LVP_OFF
  __CONFIG _CONFIG2, cfg2

#ENDCONFIG

 bt VAR byte  bank0
 px VAR byte  bank0
 pc var byte bank0   ; number of rgb led to write x3

 pixels  var byte[3]    ;  rgb led  x3
 DURATION  var byte
 
 palette var word    ;address of pallet
 TEMP VAR WORD
 OFFSET VAR WORD     ;pallet index


 
 
   
 goto overpalette   ; green,red,blue data   
 my_palette:     ;  note !!!  inde read can only access the low byte of each  stored  word
 @ dw 100,120,0  ;
 @ dW 0,100,0  ; RED
 @ dW 0,80,0  ;
 @ dW 0,60,0  ;
 @ dW 0,20,0  ;
 @ dW 200,200,0  ;OR
 @ dW 160,160,0  ;
 @ dW 100,100,0  ;
 @ dW 80,80,0  ;
 @ dW 2,5,0  ; 
 @ dW 200,150,0  ;YEL
 @ dW 160,120,0  ;
 @ dW 100,75,0  ;
 @ dW 80,60,0  ;
 @ dW 40,30,0  ; 
 @ dW 150,200,0  ; ?
 @ dW 120,160,0  ;
 @ dW 75,100,0  ;
 @ dW 60,80,0  ;
 @ dW 30,40,0  ; 
 @ dW 120,100,0  ;
 @ dW 160,160,160  ; WH
 @ dW 100,100,100  ;
 @ dW 80,80,80  ;
 @ dW 30,30,30  ;
ASM  
 

;---[Returns the Address of a Label as a Word]------------------------------
GetAddress macro Label, Wout
    CHK?RP Wout
    movlw low Label          ; get low byte
    movwf Wout
    movlw Label >> 8         ; get high byte
    movwf Wout + 1
  endm     
endasm
overpalette :  
 
 goto overasm
   asm
_pram                     ;entry point to read from sram
        movlw   low _pixels
        movwf   FSR0L
        movlw   high _pixels
        movwf   FSR0H 
        goto _nxby
_prom                     ;entry point to read from flash 
        CHK?RP _OFFSET
        MOVE?WW   _OFFSET , FSR0
        BSF FSR0H ,7
_nxby   MOVIW  FSR0 ++
        movwf _px
        MOVLW 8
        movwf _bt
        RLF _px,F
_nxbt   BSF LATA ,5
        BTFSS STATUS,C
        GOTO XX
        NOP
        NOP
        NOP
XX      BCF  LATA ,5
        NOP
        RLF _px,F
        DECFSZ _bt,F
        GOTO _nxbt 
        DECFSZ _pc,F
        GOTO _nxby
        RETURN 
   
endasm

overasm:



 CLEAR
 define OSC 32
 osccon=$f0
 trisa=%011110
 @ GetAddress _my_palette,_palette  ;set pallet address
 
 
loopy: 
 GOSUB FLICKER
 PC=3    ; value is  number of rgb leds X 3 
 call prom
 pause DURATION
 goto loopy
 
 
 
 
FLICKER:
 RANDOM TEMP
 DURATION=TEMP&$7F
 RANDOM TEMP
' temp=0
 OFFSET =(TEMP //25)*3 + palette
RETURN