What is your issue programming or outputting?

Ran into the same brickwall and used the onboard NV ram for stuffing the output messages.
Used the debug instead of serout/hserout it uses less space
Then Used gosub for calling the output and read the text one letter and used char+128 to indicate EOL/EOM.

The gosub used much less space using individual functions:
so if you had a lot of conditions; set them up as a matrix and work them against the matrix, calling all from the NV ram.
Amazingly ugly but did it on a bet. Even had room for a copyright

Next time just buy the larger [read better] part, they wind up being cheaper
12f1840 / 16f182x / 16f193[8/9]

Newark.com has decent pricing. [last years pricing, but you get the idea]

Code:
PIC12F683	8dip	20MHZ 2Kprog 128nvB 256EE 6I/O $1.41 or	$1.15	
PIC12F1822	8 dip	2kprog 256ram 128nvB 6 i/o	$1.20
PIC12F1840-I/P		 8 PDIP	IO6 Prog7K 256B RAM 128nvB 32MHz 3tmr  	$1.18

Using the NV -- Ofuzzy1 & W_Alarm are now text strings residing in the NV
Code:
CharBump        con $80
Ofuzzy1 data @$10,   "(C)2011 Ofuzzy1 AllRightsReserved-Not for Life Critical Use", "!" + CharBump
W_Alarm  Data        "Alarm", "_" + CharBump
Code:
gosub Print_Copyright
...

Print_Copyright:
gosub Print_SP2 : gosub CR_LF3 ': gosub CR_LF
zb= Ofuzzy1 : gosub Print_Phrase
gosub CR_LF3 ': gosub CR_LF
return

to print a phrase out use this:
ab, bb, zb are byte sized VAR
Code:
Print_Phrase:   ' Call with zb = ROM_Memory_Location [byte]
bb = 1
  Do until !BB '  = 0
    read zb, ab
    if ab > CharBump-1 then 
        ab = ab - CharBump
        bb = 0
    endif    
    debug ab
    zb= zb + 1
  loop
return
to call get the phrase ready to print use this:
Code:
Print_Copyright:
gosub CR_LF
zb= Ofuzzy1 : gosub Print_Phrase
return
Need 3 or 2 or 1 line feeds?
Code:
CR_LF3:
debug LF,cr
CR_LF2:
debug LF,cr
CR_LF:
debug CR,LF
return