well I managed to get round it...not sure if it'll be of any use, but you never know, somebody my find it in the archives in years to come...
case 0x3F:
IDENT_PORT = 0X01;
j = 0x3F;
lower_nibble = (j && 0xf0);
PORTB = lower_nibble;
DelayMs(50);
asm( " swapf _j " );
asm( " andlw 0x0f0 " );
asm( " movwf _upper_nibble ");
PORTB = upper_nibble;
break;
or completly in c...
case 0x3f:
j = 0x3f;
upper_nibble = j & 0x0f0;
PORTB = upper_nibble;
RB3 = 1;
asm( " nop " );
RB3 = 0;
k = (j << 4) | (j >> 4);
lower_nibble = k & 0x0f0;
PORTB = lower_nibble;
RB3 = 1;
asm( " nop " );
RB3 = 0;
PORTB = 0x00;
break;
and heres the assembly code I was working on which (should) do the same thing...
#asm
movlw 0x3f
movwf _tempstore
andlw 0x0f0
movwf _PORTD
call pulse_e
call Delay5
swapf _tempstore
andlw 0x0f0
movwf _PORTD
call pulse_e
call Delay255
movlw 0x00
goto DoNothing
pulse_e: bsf _PORTC, ENABLE
call Delay100
bcf _PORTC, ENABLE
retlw 0x00
Delay255: movlw 0xff
goto d0
Delay100: movlw 0x64
goto d0
Delay10: movlw 0x0a
goto d0
Delay5: movlw 0x05
d0: movwf _count1
d1: movlw 0xE7
movwf _counta
movlw 0x04
movwf _countb
Delay_0: decfsz _counta, f
goto $+2
decfsz _countb, f
goto Delay_0
decfsz _count1 ,f
goto d1
retlw 0x00
DoNothing:
nop
#endasm
Not the most attractive of solutions but are still fairly robust...any questions or critisims just holla...