It's really bad the poor 16F84A don't support some interesting MPASM feature. Well i admit that i discovered this totally at the end... anyways, here's something 532 Bytes working on a 16F877
Code:
DEFINE LOADER_USED 1
Define OSC 4
DEFINE LCD_DREG PORTD     ' LCD data port 
DEFINE LCD_DBIT 4         ' LCD data starting bit 0 or 4 
DEFINE LCD_RSREG PORTD    ' LCD register select port 
DEFINE LCD_RSBIT 2        ' LCD register select bit 
DEFINE LCD_EREG PORTD     ' LCD enable port 
DEFINE LCD_EBIT 3         ' LCD enable bit 
DEFINE LCD_BITS 4         ' LCD bus size 4 or 8 
DEFINE LCD_LINES 4        ' Number lines on LCD 
DEFINE LCD_COMMANDUS 2000 ' Command delay time in us 
DEFINE LCD_DATAUS 50      ' Data delay time in us 

goto VariableDefinition
asm
Comm=0xFE
EOL=0xFF
Dx=0x14

CustChar 
        dt  Comm,0x40,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F  ; Cust Char #0  
        dt  Comm,0x48,0x1F,0x1F,0x1F,0x1F,0x00,0x00,0x00,0x00  ; Cust Char #1  
        dt  Comm,0x50,0x00,0x00,0x00,0x00,0x1F,0x1F,0x1F,0x1F  ; Cust Char #2  
        dt  Comm,0x58,0x00,0x00,0x00,0x00,0x00,0x0E,0x0E,0x0E  ; Cust Char #3  
        dt  Comm,0x60,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x1F  ; Cust Char #4  
        dt  Comm,0x68,0x1F,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00  ; Cust Char #5  
        dt  Comm,0x70,0x00,0x01,0x03,0x07,0x0F,0x1F,0x1F,0x1F  ; Cust Char #6  
        dt  Comm,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03  ; Cust Char #7  
        dt  EOL ; end of Custom character

One     dt 7,6,0,EOL
        dt Comm,Dx,Comm,Dx,0,EOL
        dt Comm,Dx,Comm,Dx,0,EOL
        dt Comm,Dx,Comm,Dx,0,EOL
        dt 4

Two     dt 1,1,1,0,EOL
        dt 2,2,2,0,EOL
        dt 0,1,1,1,EOL
        dt 0,2,2,2,EOL
        dt 5
      
Three   dt 1,1,1,0,EOL
        dt Comm,Dx,4,4,0,EOL
        dt Comm,Dx,5,5,0,EOL
        dt 2,2,2,0,EOL
        dt 5        
endasm

VariableDefinition:
    CustChar    con EXT
    One         con EXT
    Two         con EXT
    Three       con EXT

    Clr         CON 1
    Comm        Con EXT
    EOL         con EXT
    Dx          con EXT
    Line        var byte[4]
        line[0]=$80
        line[1]=$C0
        line[2]=$94
        line[3]=$D4
    
    offset      var byte
    index       var byte
    Char        var byte
    ActualLine  var byte
    Addr        var word
       
    Number      var byte
    Pattern     var word[10]
        pattern[1]=one
        Pattern[2]=two
        pattern[3]=three

    pause 500
DumpCustChar:
    addr=0
    char=0
    repeat
        lcdout char
        reaDCODE custchar+addr,char
        addr=addr+1
        until char=eol

Main:  
    offset=0
    LCDOUT comm, clr
    pause 500
    lcdout comm, line[0], "T", _
           COMM, LINE[1], "E", _
           COMM, LINE[2], "S", _
           COMM, LINE[3], "T"
    offset=2
    pause 500
    number=3 : gosub displaynumber
    pause 500
    number=1 : gosub displaynumber
    pause 500
    number=2 : gosub displaynumber
    pause 500
    number=1 : gosub displaynumber
    pause 500
    GOTO MAIN

DisplayNumber:
    actualline=0
    index=0
    lcdout comm,line[actualline]+offset
    Loop:
        readcode pattern[number]+index,char
        if char!=eol then 
            if actualline<4 then
                lcdout char
                else
                    offset=offset+char
                    Goto GetOut
                endif
            else
                actualline=actualline+1
                if actualline<4 then lcdout comm,line[actualline]+offset
            endif
        index=index+1
        goto loop
    GetOut:
        RETURN
I'll try your own... and see how much i could Shrink it to do the same thing. Forgive me, i won't try with a 16F84A