Well I have this code and still get underflow errors... I have a pritty good idea of what the code does, but I can't understand why it gives me this undeflow error as it is called from the main loop.
Code:
SERBUF var byte 
TEMP var byte
COUNTS var byte

ASM
; ********************************************************************
; INCH ROUTINE
; THIS ROUTINE INPUTS RS232 DATA USING A 22K OHM RESISTOR, NO LEVEL-
; CHANGING INVERTER IS USED. GPIO,3 = RX (MARK = 0, SPACE = 1).
; THIS ROUTINE USES A 8-DATA BIT PER CHARACTER PROTOCOL.
; TO RECIEVE A CHARACTER, CALL inch. THE RECEIVED CHARACTER IS PLACED
; IN THE REG 'W' AND IN THE REG 'SERBUF'.
; CHARACTER WILL ECHO IF 'retlw 0' IS REM-ED OUT.
; VARIABLES USED: REG 'TEMP' AND REG 'SERBUF' BOTH VARIABLES ARE
; SHARED WITH THE 'outch' ROUTINE
; ROUTINES CALLED: 'half_baud' AND 'baud' FOR THE BAUD-RATE TIMING.
; ********************************************************************
inch:
    btfss GPIO,3 ; SKIP ON START BIT = "SPACE" (+RS232)
    goto inch ; ELSE KEEP LOOKING FOR A START BIT
    movlw d'08' ; START SERIAL INPUT SEQUENCE
    movwf _TEMP ; COLLECT 8 DATA BITS
    clrf _SERBUF ; CLEAR SERIAL CHARACTER BUFFER
    call half_baud ; DELAY FOR ONE HALF BAUD TIME
    btfss GPIO,3 ; FALL THRU IF START BIT STILL = "SPACE"
    goto inch ; ELSE IT WAS JUST A NOISE SPIKE, LOOP
inch1:
    call baud ; DELAY ONE BAUD-BIT TIME ( = 1/BAUD-RATE)
    bcf STATUS,0 ; CLEAR THE CARRY BIT
    rrf _SERBUF,F ; ROTATE CRY -> MSB, ROTATE MSB RIGHT
    btfss GPIO,3 ; IS INPUT = "SPACE" (+RS232) ?
    bsf _SERBUF,7 ; ...SKIP IF YES, ELSE SET BIT TO LOGIC '1'
    decfsz _TEMP,F ; EIGHT COUNTS YET?
    goto inch1 ; ...NO, GET ANOTHER BIT
    call baud ; DELAY FOR THE FIRST STOP BIT
    movf _SERBUF,W ; Put the character in reg 'W'
    retlw 0 ; NOTE: REM THIS OUT IF YOU NEED AN "ECHO"
    ; ...AND FALL THROUGH TO THE 'OUTCH' ROUTINE
    
; ********************************************************************
; BAUD ROUTINE @ 4 MHz
; BAUD RATE: CONSTANT:
; 1200 Baud D'137'
; 2400 Baud D'68'
; 4800 Baud D'34'
; 9600 Baud D'16'
; 19200 Baud D'8'
; 38400 Baud and up - use 'NOP' delays
; VARIABLES USED: REG 'COUNT'
; ROUTINES CALLED: NONE
; ********************************************************************
baud:            ; AT 2400 BAUD THE PERIOD IS 416.6 US
                ; CLK = 4MHz
    movlw D'68' ; 1 US (BAUD RATE CONSTANT)
    movwf _COUNTS ; 1 US
baud1:
    decfsz _COUNTS,F ; 1 US (+ 1 US MORE IF SKIP)
    goto baud1 ; 2 US
    ; FALL THRU...AFTER 1+1+3x68+1 = 207 US
half_baud:
    movlw D'68' ; 1 US
    movwf _COUNTS ; 1 US
hbaud1:
    decfsz _COUNTS,F ; 1 US (+ 1 US MORE IF SKIP)
    goto hbaud1 ; 2 US
    retlw 0 ; ...AFTER 1+1+3x68+1 = 207 US (X2=414 US)
ENDASM

high porta.0
loop:
@   goto inch
if SERBUF = 49 then low porta.0
goto loop
END