------+---------------------+-------------+----+---------+------+-----------------------+------------------------------------------------------------------- Line | # File Line | Line Type | MX | Reloc | Size | Address Object Code | Source Code ------+---------------------+-------------+----+---------+------+-----------------------+------------------------------------------------------------------- 1 | 1 UniFP.asm 1 | Comment | 11 | | 0 | 00/8000 | * @com.wudsn.ide.asm.hardware=APPLE2 2 | 1 UniFP.asm 2 | Comment | 11 | | 0 | 00/8000 | *********************** 3 | 1 UniFP.asm 3 | Comment | 11 | | 0 | 00/8000 | * * 4 | 1 UniFP.asm 4 | Comment | 11 | | 0 | 00/8000 | * APPLE-II FLOATING * 5 | 1 UniFP.asm 5 | Comment | 11 | | 0 | 00/8000 | * POINT ROUTINES * 6 | 1 UniFP.asm 6 | Comment | 11 | | 0 | 00/8000 | * * 7 | 1 UniFP.asm 7 | Comment | 11 | | 0 | 00/8000 | * COPYRIGHT 1977 BY * 8 | 1 UniFP.asm 8 | Comment | 11 | | 0 | 00/8000 | * APPLE COMPUTER INC. * 9 | 1 UniFP.asm 9 | Comment | 11 | | 0 | 00/8000 | * * 10 | 1 UniFP.asm 10 | Comment | 11 | | 0 | 00/8000 | * ALL RIGHTS RESERVED * 11 | 1 UniFP.asm 11 | Comment | 11 | | 0 | 00/8000 | * * 12 | 1 UniFP.asm 12 | Comment | 11 | | 0 | 00/8000 | * S. WOZNIAK * 13 | 1 UniFP.asm 13 | Comment | 11 | | 0 | 00/8000 | * * 14 | 1 UniFP.asm 14 | Comment | 11 | | 0 | 00/8000 | *********************** 15 | 1 UniFP.asm 15 | Comment | 11 | | 0 | 00/8000 | * TITLE "FLOATING POINT ROUTINES for //c memory" 16 | 1 UniFP.asm 16 | Comment | 11 | | 0 | 00/8000 | * 17 | 1 UniFP.asm 17 | Equivalence | 11 | | 0 | 00/8000 | SIGN EQU $EB ; $F3 18 | 1 UniFP.asm 18 | Empty | 11 | | 0 | 00/8000 | 19 | 1 UniFP.asm 19 | Comment | 11 | | 0 | 00/8000 | ** FP2 4 Bytes ** 20 | 1 UniFP.asm 20 | Equivalence | 11 | | 0 | 00/8000 | X2 EQU $EC ; $F4 21 | 1 UniFP.asm 21 | Equivalence | 11 | | 0 | 00/8000 | M2 EQU $ED ; $F5 - $7 22 | 1 UniFP.asm 22 | Empty | 11 | | 0 | 00/8000 | 23 | 1 UniFP.asm 23 | Comment | 11 | | 0 | 00/8000 | ** FP1 4 Bytes + E extension ** 24 | 1 UniFP.asm 24 | Equivalence | 11 | | 0 | 00/8000 | X1 EQU $FA ; $F8 25 | 1 UniFP.asm 25 | Equivalence | 11 | | 0 | 00/8000 | M1 EQU $FB ; $F9 - $FB 26 | 1 UniFP.asm 26 | Equivalence | 11 | | 0 | 00/8000 | E EQU $FE ; $FC 27 | 1 UniFP.asm 27 | Empty | 11 | | 0 | 00/8000 | 28 | 1 UniFP.asm 28 | Equivalence | 11 | | 0 | 00/8000 | OVLOC EQU $3F5 29 | 1 UniFP.asm 29 | Empty | 11 | | 0 | 00/8000 | 30 | 1 UniFP.asm 30 | Directive | 11 | | 0 | 00/8000 | ORG $8000 31 | 1 UniFP.asm 31 | Empty | 11 | | 0 | 00/8000 | 32 | 1 UniFP.asm 32 | Code | 11 | | 1 | 00/8000 : 18 | ADD CLC ;CLEAR CARRY 33 | 1 UniFP.asm 33 | Code | 11 | | 2 | 00/8001 : A2 02 | LDX #$2 ;INDEX FOR 3-BYTE ADD. 34 | 1 UniFP.asm 34 | Code | 11 | | 2 | 00/8003 : B5 FB | ADD1 LDA {$FB},X 35 | 1 UniFP.asm 35 | Code | 11 | | 2 | 00/8005 : 75 ED | ADC {$ED},X ;ADD A BYTE OF MANT2 TO MANT1 36 | 1 UniFP.asm 36 | Code | 11 | | 2 | 00/8007 : 95 FB | STA {$FB},X 37 | 1 UniFP.asm 37 | Code | 11 | | 1 | 00/8009 : CA | DEX ;INDEX TO NEXT MORE SIGNIF. BYTE. 38 | 1 UniFP.asm 38 | Code | 11 | | 2 | 00/800A : 10 F7 | BPL ADD1 ;LOOP UNTIL DONE. 39 | 1 UniFP.asm 39 | Code | 11 | | 1 | 00/800C : 60 | RTS ;RETURN 40 | 1 UniFP.asm 40 | Code | 11 | | 2 | 00/800D : 06 EB | MD1 ASL {$EB} ;CLEAR LSB OF SIGN. 41 | 1 UniFP.asm 41 | Code | 11 | | 3 | 00/800F : 20 12 80 | JSR ABSWAP ;ABS VAL OF M1, THEN SWAP WITH M2 42 | 1 UniFP.asm 42 | Code | 11 | | 2 | 00/8012 : 24 FB | ABSWAP BIT {$FB} ;MANT1 NEGATIVE? 43 | 1 UniFP.asm 43 | Code | 11 | | 2 | 00/8014 : 10 05 | BPL ABSWAP1 ;NO, SWAP WITH MANT2 AND RETURN. 44 | 1 UniFP.asm 44 | Code | 11 | | 3 | 00/8016 : 20 7F 80 | JSR FCOMPL ;YES, COMPLEMENT IT. 45 | 1 UniFP.asm 45 | Code | 11 | | 2 | 00/8019 : E6 EB | INC {$EB} ;INCR SIGN, COMPLEMENTING LSB. 46 | 1 UniFP.asm 46 | Code | 11 | | 1 | 00/801B : 38 | ABSWAP1 SEC ;SET CARRY FOR RETURN TO MUL/DIV. 47 | 1 UniFP.asm 47 | Code | 11 | | 2 | 00/801C : A2 04 | SWAP LDX #$4 ;INDEX FOR 4 BYTE SWAP. 48 | 1 UniFP.asm 48 | Code | 11 | | 2 | 00/801E : 94 FD | SWAP1 STY {$FE}-1,X 49 | 1 UniFP.asm 49 | Code | 11 | | 2 | 00/8020 : B5 F9 | LDA {$FA}-1,X ;SWAP A BYTE OF EXP/MANT1 WITH 50 | 1 UniFP.asm 50 | Code | 11 | | 2 | 00/8022 : B4 EB | LDY {$EC}-1,X ;EXP/MANT2 AND LEAVE A COPY OF 51 | 1 UniFP.asm 51 | Code | 11 | | 2 | 00/8024 : 94 F9 | STY {$FA}-1,X ;MANT1 IN E (3 BYTES). E+3 USED 52 | 1 UniFP.asm 52 | Code | 11 | | 2 | 00/8026 : 95 EB | STA {$EC}-1,X 53 | 1 UniFP.asm 53 | Code | 11 | | 1 | 00/8028 : CA | DEX ;ADVANCE INDEX TO NEXT BYTE 54 | 1 UniFP.asm 54 | Code | 11 | | 2 | 00/8029 : D0 F3 | BNE SWAP1 ;LOOP UNTIL DONE. 55 | 1 UniFP.asm 55 | Code | 11 | | 1 | 00/802B : 60 | RTS ;RETURN 56 | 1 UniFP.asm 56 | Code | 11 | | 2 | 00/802C : A9 8E | FLOAT LDA #$8E ;INIT EXP1 TO 14, <--------------- int to fp 57 | 1 UniFP.asm 57 | Code | 11 | | 2 | 00/802E : 85 FA | STA {$FA} ;THEN NORMALIZE TO FLOAT. 58 | 1 UniFP.asm 58 | Code | 11 | | 2 | 00/8030 : A5 FB | NORM1 LDA {$FB} ;HIGH-ORDER MANT1 BYTE. 59 | 1 UniFP.asm 59 | Code | 11 | | 2 | 00/8032 : C9 C0 | CMP #$C0 ;UPPER TWO BITS UNEQUAL? 60 | 1 UniFP.asm 60 | Code | 11 | | 2 | 00/8034 : 30 0C | BMI RTS1 ;YES, RETURN WITH MANT1 NORMALIZED 61 | 1 UniFP.asm 61 | Code | 11 | | 2 | 00/8036 : C6 FA | DEC {$FA} ;DECREMENT EXP1. 62 | 1 UniFP.asm 62 | Code | 11 | | 2 | 00/8038 : 06 FD | ASL {$FB}+2 63 | 1 UniFP.asm 63 | Code | 11 | | 2 | 00/803A : 26 FC | ROL {$FB}+1 ;SHIFT MANT1 (3 BYTES) LEFT. 64 | 1 UniFP.asm 64 | Code | 11 | | 2 | 00/803C : 26 FB | ROL {$FB} 65 | 1 UniFP.asm 65 | Code | 11 | | 2 | 00/803E : A5 FA | NORM LDA {$FA} ;EXP1 ZERO? 66 | 1 UniFP.asm 66 | Code | 11 | | 2 | 00/8040 : D0 EE | BNE NORM1 ;NO, CONTINUE NORMALIZING. 67 | 1 UniFP.asm 67 | Code | 11 | | 1 | 00/8042 : 60 | RTS1 RTS ;RETURN. 68 | 1 UniFP.asm 68 | Code | 11 | | 3 | 00/8043 : 20 7F 80 | FSUB JSR FCOMPL ;CMPL MANT1,CLEARS CARRY UNLESS 0 <---- sub 69 | 1 UniFP.asm 69 | Code | 11 | | 3 | 00/8046 : 20 56 80 | SWPALGN JSR ALGNSWP ;RIGHT SHIFT MANT1 OR SWAP WITH 70 | 1 UniFP.asm 70 | Code | 11 | | 2 | 00/8049 : A5 EC | FADD LDA {$EC} ;<------------------------------------- add 71 | 1 UniFP.asm 71 | Code | 11 | | 2 | 00/804B : C5 FA | CMP {$FA} ;COMPARE EXP1 WITH EXP2. 72 | 1 UniFP.asm 72 | Code | 11 | | 2 | 00/804D : D0 F7 | BNE SWPALGN ;IF #,SWAP ADDENDS OR ALIGN MANTS. 73 | 1 UniFP.asm 73 | Code | 11 | | 3 | 00/804F : 20 00 80 | JSR ADD ;ADD ALIGNED MANTISSAS. 74 | 1 UniFP.asm 74 | Code | 11 | | 2 | 00/8052 : 50 EA | ADDEND BVC NORM ;NO OVERFLOW, NORMALIZE RESULT. 75 | 1 UniFP.asm 75 | Code | 11 | | 2 | 00/8054 : 70 05 | BVS RTLOG ;OV: SHIFT M1 RIGHT, CARRY INTO SIGN 76 | 1 UniFP.asm 76 | Code | 11 | | 2 | 00/8056 : 90 C4 | ALGNSWP BCC SWAP ;SWAP IF CARRY CLEAR, 77 | 1 UniFP.asm 77 | Comment | 11 | | 0 | 00/8058 | * ELSE SHIFT RIGHT ARITH. 78 | 1 UniFP.asm 78 | Code | 11 | | 2 | 00/8058 : A5 FB | RTAR LDA {$FB} ;SIGN OF MANT1 INTO CARRY FOR 79 | 1 UniFP.asm 79 | Code | 11 | | 1 | 00/805A : 0A | ASL ;RIGHT ARITH SHIFT. 80 | 1 UniFP.asm 80 | Code | 11 | | 2 | 00/805B : E6 FA | RTLOG INC {$FA} ;INCR X1 TO ADJUST FOR RIGHT SHIFT 81 | 1 UniFP.asm 81 | Code | 11 | | 2 | 00/805D : F0 75 | BEQ OVFL ;EXP1 OUT OF RANGE. 82 | 1 UniFP.asm 82 | Code | 11 | | 2 | 00/805F : A2 FA | RTLOG1 LDX #$FA ;INDEX FOR 6:BYTE RIGHT SHIFT. 83 | 1 UniFP.asm 83 | Code | 11 | | 2 | 00/8061 : 76 01 | ROR1 ROR {$FE}+3,X 84 | 1 UniFP.asm 84 | Code | 11 | | 1 | 00/8063 : E8 | INX ;NEXT BYTE OF SHIFT. 85 | 1 UniFP.asm 85 | Code | 11 | | 2 | 00/8064 : D0 FB | BNE ROR1 ;LOOP UNTIL DONE. 86 | 1 UniFP.asm 86 | Code | 11 | | 1 | 00/8066 : 60 | RTS ;RETURN. 87 | 1 UniFP.asm 87 | Code | 11 | | 3 | 00/8067 : 20 0D 80 | FMUL JSR MD1 ;ABS VAL OF MANT1, MANT2 <-------------- mul 88 | 1 UniFP.asm 88 | Code | 11 | | 2 | 00/806A : 65 FA | ADC {$FA} ;ADD EXP1 TO EXP2 FOR PRODUCT EXP 89 | 1 UniFP.asm 89 | Code | 11 | | 3 | 00/806C : 20 BD 80 | JSR MD2 ;CHECK PROD. EXP AND PREP. FOR MUL 90 | 1 UniFP.asm 90 | Code | 11 | | 1 | 00/806F : 18 | CLC ;CLEAR CARRY FOR FIRST BIT. 91 | 1 UniFP.asm 91 | Code | 11 | | 3 | 00/8070 : 20 5F 80 | MUL1 JSR RTLOG1 ;M1 AND E RIGHT (PROD AND MPLIER) 92 | 1 UniFP.asm 92 | Code | 11 | | 2 | 00/8073 : 90 03 | BCC MUL2 ;IF CARRY CLEAR, SKIP PARTIAL PROD 93 | 1 UniFP.asm 93 | Code | 11 | | 3 | 00/8075 : 20 00 80 | JSR ADD ;ADD MULTIPLICAND TO PRODUCT. 94 | 1 UniFP.asm 94 | Code | 11 | | 1 | 00/8078 : 88 | MUL2 DEY ;NEXT MUL ITERATION. 95 | 1 UniFP.asm 95 | Code | 11 | | 2 | 00/8079 : 10 F5 | BPL MUL1 ;LOOP UNTIL DONE. 96 | 1 UniFP.asm 96 | Code | 11 | | 2 | 00/807B : 46 EB | MDEND LSR {$EB} ;TEST SIGN LSB. 97 | 1 UniFP.asm 97 | Code | 11 | | 2 | 00/807D : 90 BF | NORMX BCC NORM ;IF EVEN,NORMALIZE PROD,ELSE COMP 98 | 1 UniFP.asm 98 | Code | 11 | | 1 | 00/807F : 38 | FCOMPL SEC ;SET CARRY FOR SUBTRACT. <--------------- not 99 | 1 UniFP.asm 99 | Code | 11 | | 2 | 00/8080 : A2 03 | LDX #$3 ;INDEX FOR 3 BYTE SUBTRACT. 100 | 1 UniFP.asm 100 | Code | 11 | | 2 | 00/8082 : A9 00 | COMPL1 LDA #$0 ;CLEAR A. 101 | 1 UniFP.asm 101 | Code | 11 | | 2 | 00/8084 : F5 FA | SBC {$FA},X ;SUBTRACT BYTE OF EXP1. 102 | 1 UniFP.asm 102 | Code | 11 | | 2 | 00/8086 : 95 FA | STA {$FA},X ;RESTORE IT. 103 | 1 UniFP.asm 103 | Code | 11 | | 1 | 00/8088 : CA | DEX ;NEXT MORE SIGNIFICANT BYTE. 104 | 1 UniFP.asm 104 | Code | 11 | | 2 | 00/8089 : D0 F7 | BNE COMPL1 ;LOOP UNTIL DONE. 105 | 1 UniFP.asm 105 | Code | 11 | | 2 | 00/808B : F0 C5 | BEQ ADDEND ;NORMALIZE (OR SHIFT RT IF OVFL). 106 | 1 UniFP.asm 106 | Code | 11 | | 3 | 00/808D : 20 0D 80 | FDIV JSR MD1 ;TAKE ABS VAL OF MANT1, MANT2. <--------- div 107 | 1 UniFP.asm 107 | Code | 11 | | 2 | 00/8090 : E5 FA | SBC {$FA} ;SUBTRACT EXP1 FROM EXP2. 108 | 1 UniFP.asm 108 | Code | 11 | | 3 | 00/8092 : 20 BD 80 | JSR MD2 ;SAVE AS QUOTIENT EXP. 109 | 1 UniFP.asm 109 | Code | 11 | | 1 | 00/8095 : 38 | DIV1 SEC ;SET CARRY FOR SUBTRACT. 110 | 1 UniFP.asm 110 | Code | 11 | | 2 | 00/8096 : A2 02 | LDX #$2 ;INDEX FOR 3-BYTE SUBTRACTION. 111 | 1 UniFP.asm 111 | Code | 11 | | 2 | 00/8098 : B5 ED | DIV2 LDA {$ED},X 112 | 1 UniFP.asm 112 | Code | 11 | | 2 | 00/809A : F5 FE | SBC {$FE},X ;SUBTRACT A BYTE OF E FROM MANT2. 113 | 1 UniFP.asm 113 | Code | 11 | | 1 | 00/809C : 48 | PHA ;SAVE ON STACK. 114 | 1 UniFP.asm 114 | Code | 11 | | 1 | 00/809D : CA | DEX ;NEXT MORE SIGNIFICANT BYTE. 115 | 1 UniFP.asm 115 | Code | 11 | | 2 | 00/809E : 10 F8 | BPL DIV2 ;LOOP UNTIL DONE. 116 | 1 UniFP.asm 116 | Code | 11 | | 2 | 00/80A0 : A2 FD | LDX #$FD ;INDEX FOR 3-BYTE CONDITIONAL MOVE 117 | 1 UniFP.asm 117 | Code | 11 | | 1 | 00/80A2 : 68 | DIV3 PLA ;PULL BYTE OF DIFFERENCE OFF STACK 118 | 1 UniFP.asm 118 | Code | 11 | | 2 | 00/80A3 : 90 02 | BCC DIV4 ;IF M2