Nice job Paul & Ingvar..;o}

Yet another version.
Code:
    DEFINE OSC 4

'   BASIC/ASM version = 172 words
    
    x   var word
    i   var byte
    RelayNum var PORTA
    
'    High byte = FSR / Low byte = port pin (or multiple pins)
    RLY1 CON %0000010100000001 ' PORTA|Bit0
    RLY2 CON %0000011001000000 ' PORTB|Bit6
    RLY3 CON %0000011100010000 ' PORTC|Bit4
    RLY4 CON %0000100000000100 ' PORTD|Bit2
    
    ADCON1 = 7
    PORTA = 0 : PORTB = 0 : PORTC = 0 : PORTD = 0
    TRISA = 0 : TRISB = 0 : TRISC = 0 : TRISD = 0
    
ASM
RelayOn macro
    movf  _x+1,w ; high byte = pointer to port file reg
    movwf FSR    ; load FSR
    movf  _x,w   ; low byte = port bit to change
    xorwf INDF,f ; toggle port pin
    endm
ENDASM

ASM
RelayOff macro
    movf  _x,w   ; reload port pin to toggle
    xorwf INDF,f ; do it
    endm
ENDASM
                         
main:
    for i = 0 to 3
        LOOKUP2 i, [RLY1,RLY2,RLY3,RLY4], x ' lookup file reg & XOR pattern
        @ RelayOn
        PAUSE 500
        @ RelayOff
        PAUSE 500
    next i
    
    END