;***********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