Codigo:
;****************************************************************************
; DIVIDE: Rutina para dividir un número de 48bits entre otro de 24 bits
; Formula: dividendo = dividendo/divisor
;
; Ram usada: dividendo 6 bytes ( 48 bits )
; divisor 3 bytes ( 24 bits )
; temp 3 bytes
; bitcount 1 byte (Contador de bucles)
;****************************************************************************
divide movlw 0x04
movwf divisor1
movlw 0x78
movwf divisor2
movlw 0x69
movwf divisor3 ;Carga el Divisor
clrf temp1
clrf temp2
clrf temp3 ;Borra los temporales
movlw d"48"
movwf bitcount ;Carga el contador
bcf status,c ;Borra el carry
bckdiv rlf dividendo6,f
rlf dividendo5,f
rlf dividendo4,f
rlf dividendo3,f
rlf dividendo2,f
rlf dividendo1,f
rlf temp3,f
rlf temp2,f
rlf temp1,f ;Desplaza todos los registros
movf divisor1,w
subwf temp1,w ;Comprueba si temp > divisor
btfss status,2
goto nochk
movf divisor2,w ;Si los MSB son iguales checkea los siguientes
subwf temp2,w
btfss status,2
goto nochk
movf divisor3,w ;Si estos son iguales checkea los siguientes
subwf temp3,w
nochk btfss status,c ;El carry esta a 1 si temp > divisor
goto skip ;Sino, no se resta
movf divisor3,w ;Resta los 24 bits del temporal a los
subwf temp3,f ;24 bits del temp
btfss status,c
decf temp2,f
movf divisor2,w ;temp - divisor --> temp
subwf temp2,f
btfss status,c
decf temp1,f
movf divisor1,w
subwf temp1,f
bsf status,c ;Se mete un 1 en el carry si se resta
skip decfsz bitcount,f ;Decrementa el contador
goto bckdiv
rlf dividendo6,w ;Mete el último carry en el resultado
movwf dds4 ;y mete el resutado en los registros del DDS
rlf dividendo5,w
movwf dds3
rlf dividendo4,w
movwf dds2
rlf dividendo3,w
movwf dds1
rlf dividendo2,f
rlf dividendo1,f
return