I was thinking something more like this...
Code:
dph_save VAR BYTE
dpl_save  VAR BYTE

ASM
write_char:
    MOVE?BB  dph, _dph_save
    MOVE?BB  dpl, _dpl_save

    push dph <--- delete this line
    push dpl <--- delete this line
...

...
    pop dpl <--- delete this line
    pop dph <--- delete this line

    MOVE?BB  _dph_save, dph 
    MOVE?BB  _dpl_save, dpl 
return

...

ENDASM
And, here's a little more info on the MOVE macro's
http://www.picbasic.co.uk/forum/showthread.php?p=2009

.