;****** Debemos declarar las variables primero, estas son:
;***************************************************
;****** Factor_A
;****** Factor_B
;****** Result_H
;****** Result_L
;****** Dividendo_H
;****** Dividendo_L
;****** Divisor
;****** Cociente_H
;****** Cociente_L
;***************************************************
;Se cargan Previamente en Factor_A y Factor_B los valores a multiplicar
;El resultado quedará almacenado en Result_H y Result_L
Multiplicar
clrf Result_L ;borramos para inicializar
clrf Result_H
movf Factor_B,F ;Si es cero...
btfsc STATUS,Z ;En Caso que el Factor "B" Sea Cero
return ;volver con resultado= 0
movf Factor_A,W ;cargamos el Factor "A"
Mult_Bucle
addwf Result_L,F ;Sumamos "A", Tantas veces como sea "B"
btfsc STATUS,C ;Existe Acarreo?...
incf Result_H,F ;...Si. Incrementamos el byte Mayor
decfsz Factor_B,F ;Terminó la Multiplicación?...
goto Mult_Bucle ;... No, Seguimos haciendo sumas.
return ;Si. Volvemos a la rutina principal
;Se carga previamente en Dividendo_H y Dividendo_L el valor total del Dividendo
;y en Divisor el valor del divisor. El resultado quedará en Cociente_H y Cociente_L
;y el resto quedará en Dividendo_L
;(Nota: Dividendo_H y Dividendo_L serán borrados en el proceso de división)
Dividir
clrf Cociente_L ;Limpiamos el valor del resultado
clrf Cociente_H
VerifDiv
movfw Dividendo_H ;Si la parte alta del Dividendo...
btfss STATUS,Z ;contiene algún valor...
goto PuedeDividir ;... Podemos dividir
movfw Divisor ;Si no es el caso...
subwf Dividendo_L,W ;...Verificamos que la parte baja del Dividendo...
btfss STATUS,C ;...sea mayor que el divisor
return ;En caso de ser menor, la división no se realiza
PuedeDividir
incf Cociente_L,F ;Aumentamos el valor del cociente bajo...
btfsc STATUS,Z ;...en caso de llegar al máximo...
incf Cociente_H,F ;...aumentamos el cociente alto
movfw Divisor ;Cargo el valor del Divisor en W...
subwf Dividendo_L,F ;...y le resto al dividendo el valor del divisor
btfsc STATUS,C ;Si el valor es positivo...
goto VerifDiv ;...continuo con la división...
decf Dividendo_H,F ;...Si fue negativo decremento la parte alta del dividendo y...
goto VerifDiv ;...continuo con la división.