******************************** * * * APPLE-II FLOATING * * POINT ROUTINES * * * * S. WOZNIAK * * * ******************************** * * * TITLE: * * "FLOATING POINT ROUTINES" * * * ******************************** SIGN EQU $F3 X2 EQU $F4 M2 EQU $F5 X1 EQU $F8 M1 EQU $F9 E EQU $FC OVLOC EQU $3F5 ORG $F425 ******************************** ADD CLC ;CLEAR CARRY LDX #$2 ;INDEX FOR 3 BYTE ADD. ADD1 LDA M1,X ADC M2,X ;ADD A BYTE OF MANT2 TO MANT1 STA M1,X DEX ;INDEX TO NEXT MORE SIGNIFICANT BYTE BPL ADD1 ;LOOP UNTIL DONE RTS ;RETURN MD1 ASL SIGN ;CLEAR LSB OF SIGN JSR ABSWAP ;ABS VAL OF M1, THEN SWAP WITH M2 ABSWAP BIT M1 ;MANT1 NEGATIVE? BPL ABSWAP1 ;NO, SWAP WITH MANT2 AND RETURN JSR FCOMPL ;YES, COMPLEMENT IT INC SIGN ;INCR SIGN, COMPLEMENTING LSB ABSWAP1 SEC ;SET CARRY FOR RETURN TO MUL/DIV SWAP LDX #$4 ;INDEX FOR 4 BYTE SWAP SWAP1 STY E-1,X LDA X1-1,X ;SWAP A BYTE OF EXP/MANT1 WITH LDY X2-1,X ;EXP/MANT2 AND LEAVE A COPY OF STY X1-1,X ;MANT1 IN B (3 BYTES). E+3 USED STA X2-1,X DEX ;ADVANCE INDEX TO NEXT BYTE BNE SWAP1 ;LOOP UNTIL DONE RTS ;RETURN FLOAT LDA #$8E ;INIT EXP1 TO 14, STA X1 ;THEN NORMALIZE TO FLOAT NORM1 LDA M1 ;HIGH ORDER MANT1 BYTE CMP #$C0 ;UPPER TWO BITS UNEQUAL? BMI RTS1 ;YES, RETURN WITH MANT1 NORMALIZED DEC X1 ;DECREMENT EXP1 ASL M1+2 ROL M1+1 ;SHIFT MANT1 (3 BYTES) LEFT ROL M1 NORM LDA X1 ;EXP1 ZERO? BNE NORM1 ;NO, CONTINUE NORMALIZING RTS1 RTS ;RETURN FSUB JSR FCOMPL ;CMPL MANT1, CLEARS CARRY UNLESS 0 SWPALGN JSR ALGNSWP ;RIGHT SHIFT MANT1 OR SWAP WITH FADD LDA X2 CMP X1 ;COMPARE EXP1 WITH EXP2 BNE SWPALGN ;IF #, SWAP ADDENDS OR ALIGN MANTS JSR ADD ;ADD ALIGNED MANTISSAS ADDEND BVC NORM ;NO OVERFLOW, NORMALIZE RESULT BVS RTLOG ;OV: SHIFT M1 RIGHT, CARRY INTO SIGN ALGNSWP BCC SWAP ;SWAP IF CARRY CLEAR, * ELSE SHIFT RIGHT ARITH. RTAR LDA M1 ;SIGN OF MANT1 INTO CARRY FOR ASL ;RIGHT ARITH. SHIFT RTLOG INC X1 ;INCR X1 TO ADJUST FOR RIGHT SHIFT BEQ OVFL ;EXP1 OUT OF RANGE RTLOG1 LDX #$FA ;INDEX FOR 6 BYTE RIGHT SHIFT ROR1 ROR E+3,X INX ;NEXT BYTE OF SHIFT BNE ROR1 ;LOOP UNTIL DONE RTS ;RETURN FMUL JSR MD1 ;ABS VAL OF MANT1, MANT2 ADC X1 ;ADD EXP1 TO EXP2 FOR PRODUCT EXP JSR MD2 ;CHECK PROD EXP AND PREPARE FOR MUL CLC ;CLEAR CARRY FOR FIRST BIT MUL1 JSR RTLOG1 ;M1 AND E RIGHT (PROD AND MPLIER) BCC MUL2 ;IF CARRY CLEAR, SKIP PARTIAL PROD JSR ADD ;ADD MULTIPLICAND TO PRODUCT MUL2 DEY ;NEXT MUL ITERATION BPL MUL1 ;LOOP UNTIL DONE MDEND LSR SIGN ;TEST SIGN LSB NORMX BCC NORM ;IF EVEN, NORMALIZE PROD, ELSE COMP FCOMPL SEC ;SET CARRY FOR SUBTRACT LDX #$3 ;INDEX FOR 3 BYTE SUBTRACT COMPL1 LDA #$0 ;CLEAR A SBC X1,X ;SUBTRACT BYTE OF EXP1 STA X1,X ;RESTORE IT DEX ;NEXT MORE SIGNIFICANT BYTE BNE COMPL1 ;LOOP UNTIL DONE BEQ ADDEND ;NORMALIZE (OR SHIFT RT IF OVFL) FDIV JSR MD1 ;TAKE ABS VAL OF MANT1, MANT2 SBC X1 ;SUBTRACT EXP1 FROM EXP2 JSR MD2 ;SAVE AS QUOTIENT EXP DIV1 SEC ;SET CARRY FOR SUBTRACT LDX #$2 ;INDEX FOR 3 BYTE SUBTRACTION DIV2 LDA M2,X SBC E,X ;SUBTRACT A BYTE OF E FROM MANT2 PHA ;SAVE ON STACK DEX ;NEXT MORE SIGNIFICQNT BYTE BPL DIV2 ;LOOP UNTIL DONE LDX #$FD ;INDEX FOR 3 BYTE CONDITIONAL MOVE DIV3 PLA ;PULL BYTE OF DIFFERENCE OFF STACK BCC DIV4 ;IF M2