;***********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
               (
geocities.com/ece23314)