#define b_RS232Out PORTB,3
#define b_RS232In PORTB,2
; variables
TransferFlags
InByte
cache
RecSkips
; TransferFlags bits
b_receiving equ 7
b_transmit equ 6
b_byte_available equ 5
b_sent_start equ 4
b_Count100 equ 3
interupt movwf int_work; 2 latent +1
swapf STATUS,W; +1 4
movwf int_status; status is nibble swaped +1 5
bcf STATUS,RP0; +1 6
bcf STATUS,RP1; +1 7
movlw 100h-130/2; +1 8
movwf TMR0; +1 9 + 130 = 139
bcf INTCON,TMR0IF; reset int flag
decfsz RecSkips,F
goto DoneRS232
incf RecSkips,F; set to 1
btfss TransferFlags,b_receiving
goto get_start_bit
Setc
btfss b_RS232In
clrc
rrf InByte,F
movlw 3
movwf RecSkips
btfss STATUS,C
goto DoneRS232
got_byte movf InByte,W
movwf cache
bsf TransferFlags,b_byte_available
bcf TransferFlags,b_receiving
goto DoneRS232
get_start_bit bbs b_RS232In,DoneRS232
movlw 4
movwf RecSkips
bsf TransferFlags,b_receiving
movlw 80h
movwf InByte
DoneRS232 swapf int_status,W
movwf STATUS
swapf int_work,F; swap to file
swapf int_work,W; swap to work
retfie