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

;	RECALL:	
;		   16BIT BINARY     DECIMAL 
;		00000000   00000101 = 5
;	       HIGH BYTE   LOW BYTE
;		MSB	     LSB	
;
;	NOTE: 
;		SUBWF	ROLAND,W    IS:   ROLAND - W = W  OR...  F - W = W
;								 F MEANS FILE REGISTER
;
;		SUBLW	d'1'	    IS:   1 - W = W  OR...  K - W = W
;							    K MEANS CONSTANT	

        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
		SUB2HI		; (CONSTANT) HIGH BYTE FOR SUBTRACT ROUTINE SET TO 00000000
		SUB2LO		; (CONSTANT) LOW BYTE FOR SUBTRACT ROUTINE SET TO 00000101
		ANSHI		; HIGH BYTE FOR THE ANSWER
		ANSLO		; LOW BYTE FOR THE ANSWER
		ROLAND		; TEST REGISTER
		TEMP1		; TEMPORARY REGISTER
		TEMP2		; TEMPORARY REGISTER
		SIGN		; SIGN OF THE RESULT IF 00000000 IT IS POSITIVE & 00000001 IT IS NEGATIVE

	ENDC

	GOTO START

;********************************************************************
; 		16 BIT SUBTRACTION
; NEGATE FIRST THEN ADD
; THIS SUBTRACT CONSTANT 5 TO THE 16 BIT RESULT - HBYTE LBYTE
; SUB1HI SUB1LO - SUB2HI SUB2LO = ANSHI ANSLO
;*********************************************************************
	CLRF	SUB2HI		; MAKE SUB2HI=0
	MOVLW	b'00000101'	; MOVE CONSTANT VALUE=5 TO W
	MOVWF	SUB2LO		; MOVE W TO SUB2LO REG. TO MAKE SB1LO=5
SUBTRACT
	MOVFW	HBYTE		; STORE THE 16-BIT RESULT TO SUB1HI & SUB1LO
	MOVWF	SUB1HI
	MOVFW	LBYTE
	MOVWF	SUB1LO	
 	COMF 	SUB1LO,F	; NEGATE SUB1LO OR GET THE COMPLIMENT
	INCF 	SUB1LO,F	; INCREMENT SUB1LO
	BTFSC 	STATUS,Z	; IS SUB1LO BECOMES ZERO?
	DECF 	SUB1HI,F	; YUP, SUBTRACT 1 TO SUB1HI
	COMF 	SUB1HI,F	; NO, GET COMPLIMENT OF SUB1HI
	MOVFW 	SUB1LO
	ADDWF 	SUB2LO,F 	; ADD SUB1LO & SUB2LO
	BTFSC 	STATUS,C 	; TEST IF THE RESULT EXCEEDED 256. IS THERE A CARRY?
	INCF 	SUB2HI,F	; YUP, ADD 1 TO SUB2HI
	MOVFW 	SUB1HI		; NOPE, DON'T ADD 1 TO ADD2HI
	ADDWF 	SUB2HI,F 	; ADD SUB1HI & SUB2HI
TEST1	
	BTFSS	STATUS,Z	; IS THE ANSWER IS ZERO?
	GOTO TEST2		; NO, THEN TEST IF THE ANSWER IS NEGATIVE
	RETURN			; YES
TEST2
	MOVFW	SUB2HI		; TEST FOR NEGATIVE ANSWER
	MOVWF	ROLAND		; USE NEW FILE_REG
	SWAPF	ROLAND		; MAKE 1111XXXX TO XXXX1111
	MOVLW	b'11110000'	; MOVE 11110000 TO W
	ANDWF	ROLAND		; AND ROLAND WITH 11110000

	MOVLW	h'F'		; MOVE 00001111 TO W ( UPPER NIBBLE NOT LESS THAN 'F')
	SUBWF	ROLAND		; '00001111' - 'XXXXROLAND'
	BTFSS	STATUS,Z	; TEST FOR A DIFFERENCE OF 0. IS THE ANSWER NEGATIVE?
	GOTO NOTNEG		; NOT NEGATIVE
	GOTO YESNEG		; YES, IT'S NEGATIVE, PROCEED WITH CONVERSION TO POSITIVE
	;
YESNEG	MOVFW	SUB2HI		; MOVE SUB2 TO
	MOVWF	SUB1HI		; SUB1
	MOVFW	SUB2LO		; PURPOSE: TO PERFORM 255 - ROLAND
	MOVWF	SUB1LO
	MOVLW	h'FF'		; MOVE 11111111 TO
	MOVWF	SUB2HI		; SUBT2HI
	MOVLW	h'FF'		; MOVE 11111111 TO
	MOVWF	SUB2LO		; SUBT2LO
	RETURN
NOTNEG
;	RESERVED FOR PROGRAM LINES
;
;
	GOTO NOTNEG


; OR...

START				; EXAMPLE OF 100 - 357 = -257
	MOVLW	b'01100100'
	MOVWF	SUB1LO	
	MOVLW	b'00000000'
	MOVWF	SUB1HI

	MOVLW	b'01100101'
	MOVWF	SUB2LO
	MOVLW	b'00000001'
	MOVWF	SUB2HI

	CALL SUBTRUCT0
;	RESERVED FOR PROGRAM LINES
;
;
	GOTO START
;********************************************************************
; OR...
; SUB1HI SUB1LO - SUB2HI SUB2LO = SUB1HI SUB1LO
;*********************************************************************
SUBTRUCT0

	CLRF	SIGN		;

	MOVFW	SUB1LO
	MOVWF	TEMP1		; SAVE SUB1LO TO TEMPORARY REGISTER TEMP1
	MOVFW	SUB1HI
	MOVWF	TEMP2		; SAVE SUB1HI TO TEMPORARY REGISTER TEMP2

	MOVFW 	SUB2LO
	SUBWF 	SUB1LO 		; SUB1LO - SUB2LO = SUB1LO
	BTFSC 	STATUS,C	; IS RESULT NEGATIVE?
	GOTO 	SUBTRUCT1	; NO.
	DECF 	SUB1HI		; YES, THEN BORROW

SUBTRUCT1

	MOVFW 	SUB2HI
	SUBWF 	SUB1HI		; SUB1HI - SUB2HI = SUB1HI



	MOVLW	B'11110000'		  	
	ANDWF	SUB1HI,W
	XORLW	B'11110000'
	BTFSS	STATUS,2	; IS SUB1 > THAN SUB2 
	RETURN			; YES

;**************************************************************
; THIS ROUTINE IS OPTIONAL. IT ONLY CONVERTS TO DECIMAL FORMAT 
; WITH SIGN REGISTER AS THE SIGN IF + OR -
;**************************************************************
	BSF	SIGN,0		; MAKE THE SIGN NEGATIVE
	COMF	SUB1LO		
	COMF	SUB1HI
	INCF	SUB1LO
	MOVLW	D'0'
	XORWF	SUB1LO,0
	BTFSS	STATUS,2
	RETURN
	INCF	SUB1HI
	RETURN
		
	END

    Source: geocities.com/ece23314/prog

               ( geocities.com/ece23314)