a couple of ways

Code:
pulsetrain:  
index=67 
while index
while  !portb.0 :wend   ;wait for hi
index=index-1
pauseus 600                  ;bit period=3*te ie 3*400=1200uS
code.0[index]= ~ portb.0      ;sample @midpoint of bit period
while  portb.0 :wend    ;wait for lo
wend


;or with some simple time supervision


Code:
fail var bit
timer var word ext
@timer = TMR1L
PRELOAD CON 65535-820  ;@8MHz  timer prediv 2  each tick=1uS




pulsetrain:  
index=67 
t1con=0
fail=0


while index
timer=preload
while  !portb.0 :wend   ;wait for hi
t1con=$21
index=index-1
pauseus 600                  ;bit period=3*te ie 3*400=1200uS
code.0[index]= ~ portb.0      ;sample @midpoint of bit period
while  portb.0 && !pir1.0 :wend    ;wait for lo
t1con=0
fail=fail | pir1.0
wend

or sample @50,250,450,650,850 uS past transition to hi
where valid result is
11000 for a 1
11110 for a 0

there are endless methods