
;Memoria en programa de toda la biblioteca 39
;Memoria Ram reservada 7 bytes

	cblock
	Dato_A_H
	Dato_A_L
	Dato_B_H
	Dato_B_L
	Resultado_H
	Resultado_L
	index
	endc
	
suma_16_bits

      movf   Dato_A_L,W      ;Carga menos peso del dato A
      addwf   Dato_B_L,W      ;Suma menos peso del dato B
      movwf   Resultado_L      ;Almacena el resultado
      movf   Dato_A_H,W      ;Carga más peso del dato A
      btfsc   STATUS,C                      ;Hubo acarreo anterior ??
      addlw   1         ;Si, suma 1 al acumulador
      addwf   Dato_B_H,W      ;Suma más peso del dato B
      movwf   Resultado_H      ;Guarda el resultado

      return

resta_16_bits

      movf   Dato_B_L,W      ;Carga menos peso del dato B (sustraendo)
      subwf   Dato_A_L,W      ;Resta menos peso del dato A (minuendo)
      movwf   Resultado_L      ;Almacena el resultado
      movf   Dato_B_H,W      ;Carga más peso del dato B (sustraendo)
      btfss   STATUS,C                      ;Hubo acarreo (CARRY = 0) anterior ??
      addlw   1                      ;Si, añade 1 al acumulador (sustraendo)
      subwf   Dato_A_H,W      ;Resta más peso del dato A (minuendo)
      movwf   Resultado_H      ;Guarda el resultado

      return


; MULTIPLY multiplier, multiplicand
; Multiply two 16-bit numbers into a 16-bit product, permitting overflow. 


Multiply
             CLRF Resultado_H                 ; Clear product to make
             CLRF Resultado_L                 ; way for new calculation.
             MOVLW .16                ; Number of bits to calc.
             MOVWF index
Multiply_loop
             BCF STATUS,C               
             RLF Resultado_L                  ; Shift product left.
             RLF Resultado_H                  
             BCF STATUS,C               
             RLF Dato_A_L                  ; Shift multiplicand left.
             RLF Dato_A_H                  
             BTFSS STATUS,C             ; If carry, add multiplier
             GOTO Multiply_skip
             MOVF Dato_B_L,w               ; to the product. Else skip.
             ADDWF Resultado_L
             BTFSC STATUS,C             ; 16-bit addition: prod+mulp
             INCF Resultado_H                 
             MOVF Dato_B_H,w               
             ADDWF Resultado_H
Multiply_skip
             DECFSZ index               
             GOTO Multiply_loop
             RETLW 0h

