hola.me hizo falta realizar una rutina que convirtiera un numero HEX de 4 bytes (16bit) a un numero decimal.
utilizo dos registros: DEC_H y DEC_L para el valor hexagesimal.
y recojo el resultado en DEC_U,DEC_H y DEC_L.
el valor 0000h daria 0x00,0x00,0x00 =0
y el valor FFFFh daria 0x06,0x55,0x35 =65535.
despues de esto ya es facil coger estos valores y pasarlos a ASCII.o usarlos tal cual segun nuestras necesidades.
movlw 0Xff ;valor hexagesimal para el byte bajo a convertir
movwf DEC_L ;byte bajo del valor hexagesimal a convertir
movlw 0Xff ;valor hexagesimal para el byte alto a convertir
movwf DEC_H ;byte alto del valor hexagesimal a convertir
call BIN16_TO_DEC
NOP
;******************************************************* BIN16_TO_DEC ***************************************************
;conversor
BIN16_TO_DEC movff DEC_H,ADD_DEC_H
clrf CIENTOS ;registro de las centenas
clrf ACUMULADOR
clrf DEC_U
SUB1 movlw .100 ;valor a restar
subwf DEC_L,W ;restalo al acumulador
btfss STATUS,C
goto SUB ;si es menor salta a SUB.pero si es mayor o igual,sigue restando
movlw .100 ;valor a restar
subwf DEC_L,F ;restalo del byte bajo
incf CIENTOS,F ;incrementa el registro de las centenas
call incre_cientos ;incremento de los registros contadores
goto SUB1 ;repite
;*********************************************************** SUB ******************************************************
SUB movf DEC_L,W ;recoge el resto
addwf ACUMULADOR,F ;y sumalo al acumulador
movlw .100
subwf ACUMULADOR,w ;si no llega a 100,
btfss STATUS,C
goto acu1 ;continua calculo
movlw .100
subwf ACUMULADOR,F ;si ACUMULADOR es igual o superior a 100. resta 100 al acumulador y
incf CIENTOS,F ;incrementa el registro de las centenas
call incre_cientos ;incremento de los registros contadores
acu1 clrf WREG ;valor 0
cpfseq DEC_H ;comprueba el valor del registro de las centenas (fin del contaje)
goto acu5 ;salta aqui si se llego al tope de descuento del registro de centenas.
acu_fin movf ADD_DEC_H,W
addwf ACUMULADOR,f ;ajusta el valor final
btfsc STATUS,C
call incre_doble ;otro ajuste
movlw .100
subwf ACUMULADOR,w
btfss STATUS,C ;comprueba si ACUMULADOR es mayor o igual a 100
goto fin2
movlw .100 ;si es asi,
subwf ACUMULADOR,F ;resta elvalor a ACUMULADOR
incf CIENTOS,F ;he incrementa CIENTOS
call incre_cientos
;por si el valor era 200d
movlw .100
subwf ACUMULADOR,w
btfss STATUS,C ;comprueba si ACUMULADOR es mayor o igual a 100
goto fin2
movlw .100 ;si es asi,
subwf ACUMULADOR,F ;resta elvalor a ACUMULADOR
incf CIENTOS,F ;he incrementa CIENTOS
call incre_cientos ;incremento de los registros contadores
fin2 movlw .100
subwf CIENTOS,w ;comprueba si CIENTOS es superior a 100
btfss STATUS,C
goto fin3
movlw .100 ;si lo es,
subwf CIENTOS,f ;restale 100 al registro de las centenas
incf DEC_U,F ;he incrementa el de los diezmiles
fin3 movff ACUMULADOR,DEC_L ;intercambia registros
movff CIENTOS,DEC_H ;intercambia registros
return ;fin del la rutina
;******************************************************************************************************************
acu5 setf DEC_L ;setea el registro para una nueva resta
decf DEC_H,F ;decrementa el registro de las centenas
goto SUB1 ;vuelve al principio
;circunstancia que se da en el valor 0xB000.donde hay un desbordamiento que hay que ajustar.
incre_doble incf CIENTOS,F
incf CIENTOS,F
movlw .56
addwf ACUMULADOR,F
return
;incremento del contador de los cientos y los miles
incre_cientos movlw .100 ;valor a comparar
cpfseq CIENTOS;subwf CIENTOS,w
return ;retorna si no lo es
incf DEC_U,F ;incrementa el contador de los diez miles
clrf CIENTOS ;
return ;retorna