por fin logre realizar el programa que convierte un numero de 5 digitos bcd en binario natural, tiene los comentarios, el resultado se expresa en el registro bitmayor, msb y lsb en ese mismo orden, esta desarrollado para pic 16f84, cualquier duda pueden preguntar
Es un poquito largo, pero solo un poco, existe una forma mas reducida de hacerlo pero todavia no he hecho el programa.
Basicamente lo que se hace es multiplicar el numero BCD por su valor posicional para luego sumar todos los resultados.
---------------------------------------------------------------------------------------------------------
estado equ 0x03
decenamil equ 0x0c
milcentena equ 0x0d
decunidad equ 0x0e
h equ 0x0f
m equ 0x10
contador equ 0x11
conta equ 0x12
bcd equ 0x13
constantea equ 0x14
constanteb equ 0x15
numero equ 0x16
lsba equ 0x17
msba equ 0x18
num equ 0x19
bitmayor equ 0x1a
msb equ 0x1b
lsb equ 0x1c
;--------------------------------------------------------------------------------------------------------
;Este programa realiza la conversion de un numero BCD hasta de
;cinco digitos y saca su equivalente en binario natural.
;--------------------------------------------------------------------------------------------------------
;aqui se cargan los numeros en bcd
movlw b"xxxx"
movwf decenamil
movlw b"xxxxyyyy"
movwf milcentena
movlw b"xxxxyyyy"
movwf decunidad
;se coloca el contador para saber que numero se esta tratando
movlw .5
movwf contador
;se comienza a trabajar con las unidades
unidad movf decunidad,0
movwf m
movwf h
;se va a detectar el numero BCD a convertir en la posicion de las unidades
call numerob
;se verifica que el valor no sea cero para continuar,
;si es cero se pasa a determinar las decenas
btfss num,0
goto decrementa
movf bcd,0
movwf lsb
goto decrementa
;se va a trabajar con las decenas y primero se determina el numero BCD asociado
;a esta posicion
decena call numerob
;se verifica que el numero no sea cero, en caso de ser asi se
;pasa a calcular las centenas
btfss num,0
goto decrementa
;se carga el 10, numero a multilplicar por las decenas
movlw .10
movwf constantea
clrf constanteb
goto multiplica
;se trabaja con las centenas, primero se guarda el
;registro que contiene las centenas y las unidades
;de mil, para luego separalas examinar cada BCD
centena movf milcentena,0
movwf m
movwf h
;se determina el valor BCD a multiplicar por 100
call numerob
;se verifica si es cero el numero BCD
btfss num,0
goto decrementa
;se carga la constantea con el valor 100, que luego
;se multiplica con el numero en BCD
movlw .100
movwf constantea
clrf constanteb
goto multiplica
;se detecta las unidades de mil, que quedaron del registro
;que las contenia
unimil call numerob
;se verifica que el numero no sea cero
btfss num,0
goto decrementa
;en este caso mil ocupa 10 bits, se guarda el LSB en
;constantea y los otros 2 en constanteb para luego
;multiplicar por separado
movlw b"11101000"
movwf constantea
movlw b"11"
movwf constanteb
goto multiplica
;aqui como las decenas de mil utilizan solo un registro
;se guarda en el BCD y se verifica si el valor es cero
decmil bcf estado,2
movf decenamil,0
;se prueba si es cero
btfsc estado,2
goto final
movwf bcd
movwf m
movwf h
;aqui pasa igual, diez mil ocupa 14 bits, se guarda el LSB
;en constantea y MSB en constanteb para multiplicalos por
;separado
movlw b"10000"
movwf constantea
movlw b"100111"
movwf constanteb
goto multiplica
;como su nombre lo indica, aqui se determina con que
;valor posicional se esta trabajando, se comienza por
;las unidades y se va aumentando de valor posicional
;a medida que el contador vaya decrementando, cuando el
;contador llegue a cero, se termino el proceso
determina movf contador,0
sublw 4
btfsc estado,2
goto decena
movf contador,0
sublw 3
btfsc estado,2
goto centena
movf contador,0
sublw 2
btfsc estado,2
goto unimil
movf contador,0
btfss estado,2
goto decmil
goto final
;aqui se separan los numeros guardados en los registros
;para decifrar el BCD, mientras el siguiente numero BCD
;guardado en el registro m
numerob movlw .4
movwf conta
rota rrf m,1
rrf bcd,1
decfsz conta,1
goto rota
;se crea una condicion, si el BCD es cero, el registro
;num se resetea, si es mayor que cero el BCD el num se
;setea para su posterior prueba en los respectivos valores
;posicionales
revision bcf estado,2
clrf num
movf bcd,0
btfsc estado,2
return
swapf bcd,0
movwf h
movwf bcd
movlw .1
movwf num
return
;se decrementa el contador de las posciones
decrementa decf contador,1
goto determina
;se multiplica la constantea por el valor BCD con el metodo
;de desplazamiento de registros
multiplica movlw .8
movwf conta
bcf estado,0
movf constantea,0
clrf lsba
clrf numero
rotaa rrf bcd,1
btfsc estado,0
addwf numero,1
rrf numero,1
rrf lsba,1
decfsz conta,1
goto rotaa
;una vez culminada la multiplicacion se suma el resultado
;con el lsb (donde se guarda el resultado final), se va
;realizando sumas parciales a medida que se va multiplicando
sumaa movf lsb,0
addwf lsba,0
movwf lsb
btfsc estado,0
call ajustarl
movf numero,0
btfss estado,2
goto lsbc;acarreo del lsb
;se verifica si el valor de la constanteb es cero para
;ver si se realiza o no la multiplicacion de la constanteb
numerb movf constanteb,0
btfss estado,2
goto multiplicab
goto decrementa
;si existe un acarreo en el lsb, se suma al msb, y se
;guarda en dicho registro
lsbc addwf msb,1
goto numerb
;en caso que la constanteb sea un numero valido se multiplica
;con el BCD
multiplicab clrf numero
movlw .8
movwf conta
bcf estado,0
movf h,0
movwf bcd
movf constanteb,0
rotab rrf bcd,1
btfsc estado,0
addwf numero,1
rrf numero,1
rrf msba,1
decfsz conta,1
goto rotab
;se suma el msb con el resultado de la mutiplicacion de
;la constanteb
sumab movf msb,0
addwf msba,0
movwf msb
btfsc estado,0
call ajustarm
movf numero,0
addwf bitmayor,1
goto decrementa
;se acomoda el desborde de 256 en el lsb
ajustarl movf msb,0
addlw 1
movwf msb
return
;se ajusta el desborde de 256 en el msb
ajustarm movf bitmayor,0
addlw 1
movwf bitmayor
return
final
end