;*************16-BIT ADDITION************
; BY: ENG'R ROLAND MICHAEL A. DELA PEŅA *
;****************************************

;	RECALL:	
;		   16BIT BINARY     DECIMAL 
;		00000000   00000101 = 5
;	       HIGH BYTE   LOW BYTE
;		MSB	     LSB	

        LIST            P=16F84
	ERRORLEVEL      -302
	#include p16f84.inc

;************************************************************
; REGISTER DEFINITIONS
;************************************************************
	CBLOCK	0CH
		HBYTE		; HIGH BYTE OF THE 16 BIT RESULT
	   	LBYTE		; LOW BYTE OF THE 16 BIT RESULT 
		ADD1HI		; HIGH BYTE FOR ADD ROUTINE
		ADD1LO		; LOW BYTE FOR ADD ROUTINE
		ADD2HI		; (CONSTANT) HIGH BYTE FOR ADD ROUTINE SET TO 00000000
		ADD2LO		; (CONSTANT) LOW BYTE FOR ADD ROUTINE SET TO 00000101
		SUB1HI		; HIGH BYTE FOR ADD ROUTINE
		SUB1LO		; LOW BYTE FOR ADD ROUTINE
		SUBT2HI		; (CONSTANT) HIGH BYTE FOR SUBTRACT ROUTINE SET TO 00000000
		SUBT2LO		; (CONSTANT) LOW BYTE FOR SUBTRACT ROUTINE SET TO 00000101
		ANSHI		; HIGH BYTE FOR THE ANSWER
		ANSLO		; LOW BYTE FOR THE ANSWER
		ROLAND		; TEST REGISTER

	ENDC

	GOTO START

;********************************************************************
; 		16 BIT ADDITION 
;	THIS ADDS CONSTANT 5 TO THE 16 BIT RESULT - HBYTE LBYTE
;    ADD1HI ADD1LO + ADD2HI ADD2LO = ANSHI ANSLO
;*********************************************************************
	CLRF	ADD2HI		; MAKE ADD2HI=0
	MOVLW	b'00000101'	; MOVE CONSTANT VALUE=5 TO W
	MOVWF	ADD2LO		; MOVE W TO ADD2LO REG. TO MAKE SB1LO=5
ADD
	MOVFW	HBYTE		; STORE THE 16-BIT RESULT TO ADD1HI & ADD1LO
	MOVWF	ADD1HI
	MOVFW	LBYTE
	MOVWF	ADD1LO		
 	MOVFW 	ADD1LO
	ADDWF 	ADD2LO,F 	; ADD LOW BYTES ADD1LO & ADD2LO
	BTFSC 	STATUS,C 	; TEST IF THE RESULT EXCEEDED 256. IS THERE A CARRY?
	INCF 	ADD2HI,F	; YUP, ADD 1 TO ADD2HI
	MOVFW 	ADD1HI		; NOPE, DON'T ADD 1 TO ADD2HI
	ADDWF 	ADD2HI,F 	; ADD HIGH BYTES ADD1HI & ADD2HI
	CLRW
	MOVFW	ADD2HI
	MOVWF	ANSHI		; STORE THE HIGH BYTE ANSWER TO ANSHI
	MOVFW	ADD2LO
	MOVWF	ANSLO		; STORE THE LOW BYTE ANSWER TO ANSLO
	RETURN


; OR...

START				; EXAMPLE OF 100 + 357 = 457
	MOVLW	b'01100100'
	MOVWF	ADD1LO	
	MOVLW	b'00000000'
	MOVWF	ADD1HI

	MOVLW	b'01100101'
	MOVWF	ADD2LO
	MOVLW	b'00000001'
	MOVWF	ADD2HI

	CALL ADD0
;	RESERVED FOR PROGRAM LINES
;
;
	GOTO START	

;********************************************************************
; OR...
;     ADD1HI ADD1LO + ADD2HI ADD2LO = ADD2HI ADD2LO
;*********************************************************************

ADD0
	MOVFW 	ADD1LO
	ADDWF 	ADD2LO,W
	MOVWF	ADD2LO
	MOVFW 	ADD1HI
	BTFSC 	STATUS,C
	ADDLW 	D'1'		; IF A CARRY OCCURRED, ADD 1
	ADDWF 	ADD2HI,W
	MOVWF	ADD2HI
	RETURN




	END

    Source: geocities.com/ece23314/prog

               ( geocities.com/ece23314)