;*******************************************************************
;                           SAMPLE.ASM
;              8x8 Software Multiplier for 16Cxxx Family
;*******************************************************************
;
;   The 16 bit result is stored in 2 bytes
;
; Before calling the subroutine " mpy ", the multiplier should
; be loaded in location " mulplr ", and the multiplicand in
; " mulcnd " . The 16 bit result is stored in locations
; H_byte & L_byte.
;
;*******************************************************************
;
        LIST    p=16F84 ; PIC16F84 is the target processor

	#include "P16F84.INC" ; Include header file

	cblock 0x10   ; Temporary storage
	   mulcnd     ; 8 bit multiplicand
	   mulplr     ; 8 bit multiplier, this register will be set to zero after multiply
	   H_byte     ; High byte of the 16 bit result
	   L_byte     ; Low byte of the 16 bit result
	   count      ; loop counter
	endc
;
        org   0

        goto    start
;
; *****************************         Begin Multiplier Routine
mpy_S  	clrf    H_byte
	clrf    L_byte
        movlw   8
        movwf   count
        movf    mulcnd,w
        bcf     STATUS,C        ; Clear the carry bit in the status Reg.
loop    rrf     mulplr,F
        btfsc   STATUS,C 
        addwf   H_byte,F
        rrf     H_byte,F
        rrf     L_byte,F
        decfsz  count,F
        goto    loop
;
        retlw   0
;
;********************************************************************
;               Test Program
;*********************************************************************
start   clrw
       
main    movlw   0x35
        movwf   mulplr          ; test 0x35 times 0x2D
        movlw   0x2D
        movwf   mulcnd
;
call_m  call    mpy_S           ; The result is in file registers
                                ;   H_byte & L_byte and should equal 0x0951
;
        goto    main
;
;
     END


