He modificado esta rutina a partir de una que funciona que es de 8 digitos tranformados en un binario de 32 bits. la he modificado para que acepte 12 dígitos y los transforme en 40 bits. Pruebala antes con el simulador del MPLAB:
Codigo:
;*********************************************************************
;DEC2BIN: Tranforma el código bcd de los digitos en uno binario
; de 40 bits y lo guarda en los registros resultadox
; siendo resultado4 el MSB y resultado0 el LSB
; Los registros digitox deben definirse como digito0 LSB
; y digito11 el MSB, todos seguidos, ya que se utiliza
; el fsr para direccionarlos
;*********************************************************************
dec2bin movlw d"40" ;Hay que rotar 40 bits
movwf temp0 ;Contador de bits
d2bbck1 movlw digito0-1 ;Puntero al digito msb
movwf fsr
movlw d"12"
movwf temp1 ;Contador de dígitos
movlw d"10"
bcf status,c ;Borra el carry
d2bbck2 incf fsr,f
btfsc status,0
addwf indf,f ;Add 10 if "1" bit from prev digit
rrf indf,f ;Shift out LSB of digit
decfsz temp1,f ;Siguiente dígito
goto d2bbck2
rrf resultado4,f ;Shift in carry from digits
rrf resultado3,f ;Shift in carry from digits
rrf resultado2,f
rrf resultado1,f
rrf resultado0,f
decfsz temp0,f ;Siguiente bit
goto d2bbck1
return
Es muy sencillo ampliarla hasta los 64 bits si se quiere.
La rutina anterior no la he probado sino que la he modificado a partir de esta que si que funciona perfectamente:
Codigo:
;*********************************************************************
;DEC2BIN: Tranforma el código bcd de los digitos en uno binario
; de 32 bits y lo guarda en los registros dividendox
;*********************************************************************
dec2bin movlw d"32"
movwf temp0 ;Contador de bits
d2bbck1 movlw disp0-1 ;Puntero al digito msb
movwf fsr
movlw 0x08
movwf temp1 ;Contador de dígitos
movlw d"10"
bcf status,c ;Borra el carry
d2bbck2 incf fsr,f
btfsc status,0
addwf indf,f ;Add 10 if "1" bit from prev digit
rrf indf,f ;Shift out LSB of digit
decfsz temp1,f ;Siguiente dígito
goto d2bbck2
rrf dividendo3,f ;Shift in carry from digits
rrf dividendo4,f
rrf dividendo5,f
rrf dividendo6,f
decfsz temp0,f ;Siguiente bit
goto d2bbck1
return
Prueba esta de 32 bits y si no te funciona es que tienes algo mal a la hora de definir o tratar los registros
El fallo está en la definición de los registros:
Codigo:
BCD_0 equ 0x12
BCD_1 equ 0x13
BCD_2 equ 0x14
BCD_3 equ 0x15
BCD_4 equ 0x16
BCD_5 equ 0x17
BCD_6 equ 0x18
BCD_7 equ 0x19
y en mi comentario en el programa como acabo de darme cuenta:
Codigo:
d2bbck1 movlw BCD_0 ;Puntero al digito msb
queria decir LSB...

Tienen que empezar por el lsb y definirse en direcciones consecutivas. Pruebalo acon esta modificación verás como funcionan.