*** math11routines.asm.old Wed Nov 25 16:07:54 1998 --- math11routines.asm Thu Dec 10 16:09:13 1998 *************** *** 869,944 **** ****************************************************************************** * * ! FLTDIV EQU * ! LDAA MANTSGN2 ; get fpacc2 mantissa sign. ! EORA MANTSGN1 ; set the sign of the result. ! STAA MANTSGN1 ; save the result. ! TST FPACC2EX ; is the divisor 0? ! BNE FLTDIV1 ; no. go see if the dividend is zero. ! LDAA #DIV0ERR ; yes. return a divide by zero error. ! JMP RTNDIV0 ; flag error and return. ! FLTDIV1 TST FPACC1EX ; is the dividend 0? ! BNE FLTDIV2 ; no. go perform the divide. ! CLRB ; yes. answer is zero. no errors. ! CLR MANTSGN1 ; sign of zero is positive. ! RTS ! FLTDIV2 LDAA FPACC1EX ; now compute exponent - get numerator exponent ! SUBA FPACC2EX ; subtract denominator exponent ! BHS FLTDIV8 ; if carry clear, result must be positive ! BMI FLTDIV6 ; result in range ! JMP RTNZERO ; underflow - return zero ! FLTDIV8 BMI FLTDIV7 ; overflow - return max. number ! FLTDIV6 ADDA #$7E ; put back exponent bias ! STAA FPACC1EX ; store corrected quotient exponent ! LDD FPACC1MN ; to do divide, numerator mantissa must be less ... ! SUBD FPACC2MN ; ... than denominator mantissa. ! BMI FLTDIV3 ; branch if numerator less than denominator mantissa ! BNE FLTDIV4 ; test lsbs only if numerator = denominator ! LDAA FPACC1MN+2 ; check lsbs since bytes 1 and 2 of ... ! SUBA FPACC2MN+2 ; numerator and denominator are same. ! BMI FLTDIV3 ; branch if numerator less than denominator mantissa ! FLTDIV4 LDD FPACC1MN ; divide numerator by 2 so it is smaller than denom ! LSRD ; shift to divide bytes 1 and 2 ! ROR FPACC1MN+2 ; shift byte 3 ! STD FPACC1MN ; put bytes 1 and 2 back ! INC FPACC1EX ; now increment exponent ! BNE FLTDIV3 ; check for overflow ! FLTDIV7 JMP RTNMAX ; return maximum magnitude number ! FLTDIV3 LDD FPACC1MN ; get partial numerator ! LDX FPACC2MN ; get partial denominator ! INX ; partial quotient must be less than full quotient ! BNE FLTDIV5 ; if x register rolled over, we blew it ... ! DEX ; ... so restore x register to where it was ! FLTDIV5 FDIV ; compute partial quotient ! PSHY ; save y register ! LDY FPACC1MN ; temporary storage for numerator ! STX FPACC1MN ; partial quotient to multiply by denominator ! PSHX ; save partial quotient ! LDX #0 ; set up work space on the stack. ! PSHX ! PSHX ! TSX ; set up pointer to work space. ! LDAA FPACC2MN+2 ; multiply denominator ls byte ... ! LDAB FPACC1MN+1 ; ... by numerator ls byte ! MUL ! STAA 3,X ; save partial result on stack ! JSR REMCOMP ; jump into floating multiply to finish operation ! STY FPACC1MN ; restore numerator ! LDD FPACC1MN+1 ; move numerator bytes 2 and 3 to d ! SUBD 1,X ; subtract to compute remainder (assume byte 1 same) ! LDX FPACC2MN ; load denominator ! FDIV ; divide remainder by denominator ! STX FPACC1MN+1 ; store second partial product ! CLR FPACC1MN ; ms byte of second partial product is zero ! PULX ; scrap stack workspace ! PULX ! PULA ; retrieve first partial product ! PULB ! PULY ; retrieve y register ! ADDD FPACC1MN ; add to second partial product to get quotient ! STD FPACC1MN ; save quotient in floating accumulator ! CLRB ; no errors ! RTS * * * --- 869,989 ---- ****************************************************************************** * * ! FLTDIV EQU * ! LDX #FPACC2EX POINT TO FPACC2. ! JSR CHCK0 IS THE DIVISOR 0? ! BNE FLTDIV1 NO. GO SEE IF THE DIVIDEND IS ZERO. ! LDAA #DIV0ERR YES. RETURN A DIVIDE BY ZERO ERROR. ! SEC FLAG ERROR. ! RTS RETURN. ! FLTDIV1 LDX #FPACC1EX POINT TO FPACC1. ! JSR CHCK0 IS THE DIVIDEND 0? ! BNE FLTDIV2 NO. GO PERFORM THE DIVIDE. ! CLC YES. ANSWER IS ZERO. NO ERRORS. ! RTS RETURN. ! FLTDIV2 JSR PSHFPAC2 SAVE FPACC2. ! LDAA MANTSGN2 GET FPACC2 MANTISSA SIGN. ! EORA MANTSGN1 SET THE SIGN OF THE RESULT. ! STAA MANTSGN1 SAVE THE RESULT. ! LDX #0 SET UP WORK SPACE ON THE STACK. ! PSHX ! PSHX ! PSHX ! LDAA #24 PUT LOOP COUNT ON STACK. ! PSHA ! TSX SET UP POINTER TO WORK SPACE. ! LDD FPACC1MN COMPARE FPACC1 & FPACC2 MANTISSAS. ! CPD FPACC2MN ARE THE UPPER 16 BITS THE SAME? ! BNE FLTDIV3 NO. ! LDAA FPACC1MN+2 YES. COMPARE THE LOWER 8 BITS. ! CMPA FPACC2MN+2 ! FLTDIV3 BHS FLTDIV4 IS FPACC2 MANTISSA > FPACC1 MANTISSA? NO. ! INC FPACC2EX ADD 1 TO THE EXPONENT TO KEEP NUMBER THE SAME. ! * DID OVERFLOW OCCUR? ! BNE FLTDIV14 NO. GO SHIFT THE MANTISSA RIGHT 1 BIT. ! FLTDIV8 LDAA #OVFERR YES. GET ERROR CODE. ! SEC FLAG ERROR. ! FLTDIV6 PULX REMOVE WORKSPACE FROM STACK. ! PULX ! PULX ! INS ! JSR PULFPAC2 RESTORE FPACC2. ! RTS RETURN. ! FLTDIV4 LDD FPACC1MN+1 DO AN INITIAL SUBTRACT IF DIVIDEND MANTISSA IS ! SUBD FPACC2MN+1 GREATER THAN DIVISOR MANTISSA. ! STD FPACC1MN+1 ! LDAA FPACC1MN ! SBCA FPACC2MN ! STAA FPACC1MN ! DEC 0,X SUBTRACT 1 FROM THE LOOP COUNT. ! FLTDIV14 LSR FPACC2MN SHIFT THE DIVISOR TO THE RIGHT 1 BIT. ! ROR FPACC2MN+1 ! ROR FPACC2MN+2 ! LDAA FPACC1EX GET FPACC1 EXPONENT. ! LDAB FPACC2EX GET FPACC2 EXPONENT. ! NEGB ADD THE TWO'S COMPLEMENT TO SET FLAGS PROPERLY. ! ABA ! BMI FLTDIV5 IF RESULT MINUS CHECK CARRY FOR POSS. OVERFLOW. ! BCS FLTDIV7 IF PLUS & CARRY SET ALL IS OK. ! LDAA #UNFERR IF NOT, UNDERFLOW ERROR. ! BRA FLTDIV6 RETURN WITH ERROR. ! FLTDIV5 BCS FLTDIV8 IF MINUS & CARRY SET OVERFLOW ERROR. ! * Used to add "$81" to add bias+1. But the bias is now $7f. And ! * I can't figure out why the +1, so I'm omitting it. Basically, ! * the deal is that the exponents come in biased by $7f, but this ! * routine expects them biased by $80. I hope this one change ! * fixes the whole shebang. jonh 4/29 (#$81 => #$7f) ! FLTDIV7 ADDA #$7f ADD BACK BIAS+1 (THE '1' COMPENSATES FOR ALGOR.) ! STAA FPACC1EX SAVE RESULT. ! FLTDIV9 LDD FPACC1MN SAVE DIVIDEND IN CASE SUBTRACTION DOESN'T GO. ! STD 4,X ! LDAA FPACC1MN+2 ! STAA 6,X ! LDD FPACC1MN+1 GET LOWER 16 BITS FOR SUBTRACTION. ! SUBD FPACC2MN+1 ! STD FPACC1MN+1 SAVE RESULT. ! LDAA FPACC1MN GET HIGH 8 BITS. ! SBCA FPACC2MN ! STAA FPACC1MN ! BPL FLTDIV10 SUBTRACTION WENT OK. GO DO SHIFTS. ! LDD 4,X RESTORE OLD DIVIDEND. ! STD FPACC1MN ! LDAA 6,X ! STAA FPACC1MN+2 ! FLTDIV10 ROL 3,X ROTATE CARRY INTO QUOTIENT. ! ROL 2,X ! ROL 1,X ! LSL FPACC1MN+2 SHIFT DIVIDEND TO LEFT FOR NEXT SUBTRACT. ! ROL FPACC1MN+1 ! ROL FPACC1MN ! DEC 0,X DONE YET? ! BNE FLTDIV9 NO. KEEP GOING. ! COM 1,X RESULT MUST BE COMPLEMENTED. ! COM 2,X ! COM 3,X ! LDD FPACC1MN+1 DO 1 MORE SUBTRACT FOR ROUNDING. ! SUBD FPACC2MN+1 ( DON'T NEED TO SAVE THE RESULT. ) ! LDAA FPACC1MN ! SBCA FPACC2MN ( NO NEED TO SAVE THE RESULT. ) ! LDD 2,X GET LOW 16 BITS. ! BCC FLTDIV11 IF IT DIDNT GO RESULT OK AS IS. ! CLC CLEAR THE CARRY. ! BRA FLTDIV13 GO SAVE THE NUMBER. ! FLTDIV11 ADDD #1 ROUND UP BY 1. ! FLTDIV13 STD FPACC1MN+1 PUT IT IN FPACC1. ! LDAA 1,X GET HIGH 8 BITS. ! ADCA #0 ! STAA FPACC1MN SAVE RESULT. ! BCC FLTDIV12 IF CARRY CLEAR ANSWER OK. ! ROR FPACC1MN IF NOT OVERFLOW. ROTATE CARRY IN. ! ROR FPACC1MN+1 ! ROR FPACC1MN+2 ! INC FPACC1EX Compensate the exponent for rotate right. Added 12/17/91 G.S.D. ! BNE FLTDIV12 if the exponent didn't go to zero, the answer's OK. ! JMP FLTDIV8 if not an overflow occurred. ! FLTDIV12 CLC NO ERRORS. ! JMP FLTDIV6 RETURN. ! * * *