Here is a piece of code, that works:
void ds_TX(char data)
MOVWF temp,0 // data-->temp
MOVLW 0x8 // WREG=8 (counter)
MOVWF counter,0 // 0x8-->counter
DECFSZ counter,1,0 //decrement counter, out if zero
As you see i got rid of indirect adreesing. And in my second version was only the one mystake:
MOVF data,0,0 // data-->WREG
It is superfluous to storage data into WREG, because it is already there on the moment of calling procedure.
And what about short long: i think it is something about big integer value (2 or three bytes long), but i am not C gosu.
thanks to all))