Muchas gracias antoniof, utilicé tu versión, pero no me funcionó, aunque al final, de tanto darle vueltas, y entre unos y otros códigos, conseguí hacer una rutina que me funciona. Me convierte de hexadecimal a BCD en el rango 00-59.
El código es este:
hex2bcd
movwf Temporal_1 ;Copiamos el número que vamos a convertir a Temporal_1
andlw 0xF0 ;Enmascaramos el nibble bajo y operamos con el alto
movwf Temporal_2 ;Copia de W para siguientes comparaciones
swapf Temporal_2,1 ;Preparamos el nibble para sus comparaciones
;Las comparaciones de nibble son las siguientes:
;0x00 ---> BCDhi=0
;0x01 ---> BCDhi=16
;0x02 ---> BCDhi=32
;0x03 ---> BCDhi=48
sublw 0x00 ;Comparamos con cero
btfsc STATUS,Z
goto Es_0 ;Si es cero,
movf Temporal_2,0 ;Si no es cero, volvemos a comparar
sublw 0x01 ;Comparamos con uno
btfsc STATUS,Z
goto Es_1 ;Si es uno
movf Temporal_2,0 ;Si no es uno, volvemos a comparar
sublw 0x02 ;Comparamos con dos
btfsc STATUS,Z
goto Es_2 ;Si es dos
movf Temporal_2,0 ;Si no es dos, volvemos a comparar
sublw 0x03 ;Comparamos con cero
btfsc STATUS,Z
goto Es_3 ;Si es tres
;Si no es tres, nos hemos pasado de rosca
Es_0
movwf BCDhi ;Si es cero, BCDhi es 0h
goto SigueBCD ;Otropaso
Es_1
movlw 0x16 ;Si es uno, BCDhi es 16h
movwf BCDhi
goto SigueBCD ;Otropaso
Es_2
movlw 0x32 ;Si es dos, BCDhi es 32h
movwf BCDhi
goto SigueBCD ;Otropaso
Es_3
movlw 0x48 ;Si es tres, BCDhi es 48h
movwf BCDhi
movf Temporal_1,W ;Los puntos debiles de este algoritmo
andlw 0x0F ;Comprobamos si es 38h o 39h
movwf ContW
sublw 0x08
btfsc STATUS,Z
goto Es_38
goto Mas
Mas
movf ContW,W
sublw 0x09
btfsc STATUS,Z
goto Es_39
goto SigueBCD ;Otropaso
;Ahora analizamos el nibble bajo
Es_38
movlw 0x56
movwf ContW
goto AcabarBCD
Es_39
movlw 0x57
movwf ContW
goto AcabarBCD
SigueBCD
movf Temporal_1,W ;Vamos a sacar el nibble bajo ahora
andlw 0x0F ;Enmascaramos es nibble alto y trabajamos con el bajo
movwf BCDlo ;Lo copiamos en BCDlo
addlw 0x06 ;Le sumamos 6h para ajustar
btfss STATUS,1 ;Si hubo acarreo (bit DC), es preciso el ajuste
addlw -0x06 ;Si no hubo acarreo (bit DC), es preciso reajustar
addwf BCDhi,0 ;Sumamos el nibble bajo con el alto, el rdo queda en W
;Ahora, debemos ajustar el resultado, en caso de ser necesario
movwf ContW ;Pasamos el resultado a ContW
andlw 0x0F ;Sacamos el nibble bajo
movwf BCDlo ;Lo copiamos en BCDlo
addlw 0x06 ;Le sumamos 6h para ajustar
btfss STATUS,1 ;Si hubo acarreo (bit DC), es preciso el ajuste
goto AcabarBCD
goto AjustarBCD ;Saltamos al ajuste
AjustarBCD
movf ContW,W ;Realizamos el ajuste
addlw 0x06
movwf ContW ;pasamos el resultado ajustado ya a ContW
AcabarBCD
movf ContW,W ;Cada nibble a su variable
andlw 0x0F ;Nibble bajo
movwf BCDlo
movf ContW,W
andlw 0xF0 ;Nibble alto
movwf BCDhi
swapf BCDhi,1
return
Gracias y un saludo desde Madrid, aunque mi madre es de un pueblo de Badajoz.
Seguiré dando la lata con más dudas, pues este proyecto se sale de lo habitual en mi carrera, y no tengo otro lugar donde resolver dudas.
Lo dicho, que muchas gracias.