1000 .TITLE "ATARI Floating Point ROM, Rewritten by C. W. Marslett" 1005 ; <<<< copyright 1981, by Charles W. Marslett >>>> 1010 ; <<<< Revision C, 30 November 1981 >>>> 1015 ; 1020 ; Most functions execute in 0.35 * standard ROM times. 1025 ; 1030 ROMADR=$D800 1035 FPREC = 6 1040 *= $D4 1045 FR0 *=*+FPREC 1050 FRE *=*+FPREC 1055 FR1 *=*+FPREC 1060 FR2 *=*+FPREC 1065 FRX *=*+FPREC 1070 EEXP =FRX+1 1075 NSIGN =FRX+2 1080 ESIGN =FRX+3 1085 FCHRFLG=FRX+4 1090 DIGRT =FRX+5 1095 CIX *=*+1 1100 INBUFF*=*+2 1105 Z1 *=*+2 1110 Z2 *=*+2 1115 Z3 *=*+2 1120 DEGRAD*=*+1 1125 FLPTR *=*+2 1130 FPTR2 *=*+2 1135 ; 1140 *=$057E 1145 LBPR1 *=*+1 1150 LBPR2 *=*+1 1155 LBUFF *=*+128 1160 PLYARG =LBUFF+$60 1165 FSCR =PLYARG+FPREC 1170 FSCR2 =FSCR+FPREC 1175 LBFEND =*-1 1180 *=ROMADR 1185 ; 1190 ; AFP = ASCII TO FLOATING PT. 1195 ; 1200 AFP JSR SKBLK 1205 JSR NXTCH 1210 BCS EXIT 1215 LDX #FRX 1220 JSR ZF1 1225 JSR ZFR0 1230 DEY 1235 STY DIGRT 1240 ; 1245 CHRLP STA FCHRFLG 1250 JSR GETCH 1255 BCS INVLD 1260 LDX FR0 1265 BNE NOTZER 1270 JSR SH0L4 1275 ORA FR0+FPREC-1 1280 STA FR0+FPREC-1 1285 LDX DIGRT 1290 BMI CHRLP0 1295 ; 1300 DECFND INC DIGRT 1305 ; 1310 NOTZER LDX DIGRT 1315 BPL CHRLP0 1320 INC EEXP 1325 CHRLP0 LDA #$FF 1330 BNE CHRLP 1335 INVLD CMP #'. 1340 BNE NODEC0 1345 LDX DIGRT 1350 BMI DECFND 1355 NODEC0 CMP #'E 1360 BNE NOEXP 1365 LDX CIX 1370 JSR GETCH 1375 BCC NOESG 1380 CMP #'+ 1385 BEQ SKESG 1390 CMP #'- 1395 BNE RSTEXP 1400 STA ESIGN 1405 SKESG JSR GETCH 1410 BCS RSTEXP 1415 EXPLP TAY 1420 LDA FRX 1425 ASL A 1430 ASL A 1435 ADC FRX 1440 ASL A 1445 STA FRX 1450 TYA 1455 ADC FRX 1460 NOESG STA FRX 1465 JSR GETCH 1470 BCC EXPLP 1475 BCS NUMEND 1480 ; 1485 ; BUFFER BUILDING ROUTINE 1490 ; 1495 CVASC ORA #'0 1500 STUFF STA LBUFF,Y 1505 INY 1510 EXIT RTS 1515 ; 1520 CDPNT DEC Z2 1525 BNE EXIT 1530 LDA #'. 1535 BNE STUFF 1540 ; 1545 ASCZER LDA #$B0 1550 LDY #0 1555 BEQ STUFF 1560 ; 1565 NOEXP LDX FCHRFLG 1570 BNE NUMEND 1575 CMP #'+ 1580 BEQ CHRLP0 1585 CMP #'- 1590 BNE NUMEND 1595 STA NSIGN 1600 BEQ CHRLP0 1605 ; 1610 RSTEXP STX CIX 1615 LDA #0 1620 STA FRX 1625 NUMEND LDA EEXP 1630 CLC 1635 ADC #$88 1640 LDX DIGRT 1645 BMI NODP 1650 SEC 1655 SBC DIGRT 1660 NODP LDX ESIGN 1665 BNE SUBEXP 1670 CLC 1675 ADC FRX 1680 JMP EXPOK 1685 SUBEXP SEC 1690 SBC FRX 1695 EXPOK LSR A 1700 BCC EVEXP 1705 JSR SH0L4 1710 EVEXP LDY FR0 1715 BEQ NORGT 1720 ADC #1 1725 LDX #FPREC-2 1730 SH0R LDY FR0,X 1735 STY FR0+1,X 1740 DEX 1745 BPL SH0R 1750 NORGT LDX NSIGN 1755 BEQ NOXOR 1760 EOR #$80 1765 NOXOR DEC CIX ;BACK UP OVER THE INVALID CHAR. 1770 JMP IFPE 1775 ; 1780 EXP3DG TXA 1785 SBC #100 1790 TAX 1795 LDA #'1 1800 BNE NNEXP 1805 ; 1810 NOEXPF JSR PRTDGT 1815 ORA #$80 1820 STA LBUFF,Y 1825 BNE GENMIN 1830 ; 1835 ; FASC = FP TO ASCII 1840 ; 1845 *=AFP+$00E6 1850 FASC JSR INITBF 1855 LDA FR0 1860 BEQ ASCZER 1865 ASL A 1870 ; 1875 SEC 1880 SBC #$7E 1885 CMP #FPREC+FPREC 1890 BCC NOEXPF 1895 SBC #2 1900 STA EEXP 1905 ; 1910 LDA #3 1915 JSR PRTDGT 1920 INY 1925 LDA #'E' 1930 JSR STUFF 1935 LDA #'+' 1940 LDX EEXP 1945 BPL NNEXP 1950 LDA #0 1955 SEC 1960 SBC EEXP 1965 TAX 1970 LDA #'-' 1975 NNEXP JSR STUFF 1980 CPX #100 1985 BCS EXP3DG 1990 TXA 1995 INY 2000 LDX #$FF 2005 SEC 2010 CVDLP SBC #10 2015 INX 2020 BCS CVDLP 2025 ADC #$8A 2030 JSR CVASC 2035 TXA 2040 ORA #'0' 2045 STA LBUFF-2,Y 2050 GENMIN LDA FR0 2055 BPL MINXIT 2060 DEC INBUFF 2065 LDY #0 2070 LDA #'-' 2075 STA (INBUFF),Y 2080 MINXIT RTS 2085 ; 2090 IFPSU STY FR0+2 2095 SED 2100 LDY #16 2105 IFPS ASL FR0+1 2110 ROL A 2115 DEY 2120 BCS IFPEN 2125 BPL IFPS 2130 CLD 2135 RTS 2140 ; 2145 IFPEN STA Z3 2150 IFPL LDA FR0+3 2155 ADC FR0+3 2160 STA FR0+3 2165 LDA FR0+2 2170 ADC FR0+2 2175 STA FR0+2 2180 ROL FR0+1 2185 ROL Z3 2190 DEY 2195 BPL IFPL 2200 ; 2205 LDA #$42 2210 BNE JIFPE 2215 ; 2220 FPICTU STY FR0 2225 BEQ FFRAC 2230 ASL A 2235 ASL A 2240 ASL A 2245 ASL A 2250 TAX 2255 ; 2260 CVTLP ASL FR0+4 2265 ROL FR0+3 2270 ROL FR0+2 2275 ROL FR0+1 2280 BCC CVTST 2285 LDA FR0 2290 ADC BITTAB,X 2295 STA FR0 2300 TYA 2305 ADC BITTAB+1,X 2310 TAY 2315 CVTST DEX 2320 DEX 2325 BNE CVTLP 2330 ; 2335 FFRAC LDA FR0+1 2340 CMP #$50 2345 LDA FR0 2350 ADC #0 2355 STA FR0 2360 TYA 2365 ADC #0 2370 STA FR0+1 2375 RTS 2380 ; 2385 CVTHEX PHA 2390 LSR A 2395 LSR A 2400 LSR A 2405 LSR A 2410 CLC 2415 JSR CVHDIG 2420 PLA 2425 AND #$0F 2430 JMP CVHDIG 2435 ; 2440 *= AFP+$01AA 2445 IFP LDA FR0+1 2450 LDX FR0 2455 STX FR0+1 2460 LDY #0 2465 STY FR0+3 2470 STY FR0+4 2475 STY FR0+5 2480 BEQ IFPSU 2485 ; 2490 FDIF5 LDA FR0,X 2495 SBC FR1+1,Y 2500 STA FR0,X 2505 DEX 2510 DEY 2515 BPL FDIF5 2520 FDIF6 DEX 2525 BMI FNME 2530 LDA FR0+1,X 2535 SBC #0 2540 STA FR0+1,X 2545 BCC FDIF6 2550 BCS FNORM 2555 ; 2560 ; 2565 ; FPI = FP TO INTEGER 2570 ; 2575 *= AFP+$01D2 2580 FPI LDY #0 2585 LDA FR0 2590 CMP #$43 2595 BCS ZFR0 2600 SBC #$3E ;REALLY 3F 2605 BCS FPICTU 2610 BCC ZFR0 2615 JIFPE BNE IFPE 2620 ; 2625 *=AFP+$01E7 2630 FNME BCS FNORM 2635 SEC 2640 LDX #FPREC-1 2645 FNM0 LDA #0 2650 SBC FR0,X 2655 STA FR0,X 2660 DEX 2665 BNE FNM0 2670 ; 2675 LDA FR0 2680 EOR #$80 2685 IFPE STA FR0 2690 FNORM CLD 2695 LDY #FPREC-1 2700 FNML LDA FR0+1 2705 BEQ FNM2 2710 CLC 2715 RTS 2720 ; 2725 FNM3 LDX #1-FPREC 2730 FNM4 LDA FR0+FPREC+1,X 2735 STA FR0+FPREC,X 2740 INX 2745 BNE FNM4 2750 DEY 2755 BNE FNML 2760 ; 2765 BEQ RZERO 2770 FR0BIG EOR #$FF 2775 ADC #FPREC-2 2780 BCC FNML 2785 TAY 2790 SED 2795 LDA FR0 2800 EOR FR1 2805 BMI FDIF5 2810 CLC 2815 FADD5 LDA FR0,X 2820 ADC FR1+1,Y 2825 STA FR0,X 2830 DEX 2835 DEY 2840 BPL FADD5 2845 ; 2850 FADD6 DEX 2855 BMI FHTST 2860 LDA FR0+1,X 2865 ADC #0 2870 STA FR0+1,X 2875 BCS FADD6 2880 BCC FHTST 2885 ; 2890 FNM2 STA FR0+FPREC 2895 FNMUL LDA FR0 2900 DEC FR0 2905 EOR FR0 2910 BPL FNM3 2915 ; 2920 ; RETURN A ZERO (CARRY CLEAR) AS RESULT 2925 ; 2930 RZERO CLC 2935 ; 2940 ; ZFR0 = ZERO FR0 2945 ; 2950 ZFR0 LDX #FR0 2955 ; 2960 ; ZF1 = ZERO ANY PAGE 1 FP REG 2965 ; 2970 ZF1 LDY #FPREC 2975 ; 2980 ; ZERO ANY OR ALL OF PAGE ZERO 2985 ; 2990 ZPG0 LDA #0 2995 ZF1LP STA 0,X 3000 INX 3005 DEY 3010 BNE ZF1LP 3015 RTS 3020 ; 3025 INITBF LDA #LBUFF/256 3030 STA INBUFF+1 3035 LDA #LBUFF&$FF 3040 STA INBUFF 3045 RTS 3050 ; 3055 DBLZ2 ASL Z2+1 3060 ROL Z2 3065 RTS 3070 ; 3075 *= AFP+$0260 3080 ; 3085 ; FSUB = FLOATING SUBTRACT 3090 ; 3095 FSUB LDA FR1 3100 EOR #$80 3105 STA FR1 3110 ; 3115 ; FADD = FLOATING POINT ADD 3120 ; 3125 FADD LDX #FPREC-1 3130 LDA FR1 3135 AND #$7F 3140 STA Z2 3145 LDA FR0 3150 AND #$7F 3155 SEC 3160 SBC Z2 3165 BPL FR0BIG 3170 ADC #FPREC-1 3175 TAY 3180 SED 3185 LDA FR0 3190 EOR FR1 3195 BMI FDIF0 3200 CLC 3205 DEY 3210 BMI FADD1 3215 FADD0 LDA FR0+1,Y 3220 ADC FR1,X 3225 STA FR0,X 3230 DEX 3235 DEY 3240 BPL FADD0 3245 FADD1 LDA FR1,X 3250 ADC #0 3255 STA FR0,X 3260 DEX 3265 BNE FADD1 3270 ; 3275 LDA FR1 3280 STA FR0 3285 FHTST BCC FADDX 3290 LDX #FPREC-2 3295 FADD2 LDA FR0,X 3300 STA FR0+1,X 3305 DEX 3310 BNE FADD2 3315 LDA #1 3320 STA FR0+1 3325 LDA FR0 3330 INC FR0 3335 EOR FR0 3340 ROL A 3345 FADDX CLD 3350 RTS 3355 ; 3360 FDIF0 SEC 3365 DEY 3370 BMI FDIF2 3375 FDIF1 LDA FR1,X 3380 SBC FR0+1,Y 3385 STA FR0,X 3390 DEX 3395 DEY 3400 BPL FDIF1 3405 FDIF2 LDA FR1,X 3410 SBC #0 3415 STA FR0,X 3420 DEX 3425 BNE FDIF2 3430 LDA FR1 3435 STA FR0 3440 JMP FNME 3445 ; 3450 *= AFP+$2D5 3455 NOOVFL LDX #FPREC-1 3460 STX Z3 3465 SED 3470 RTS 3475 ; 3480 ; FMUL = FLOATING MULTIPLY 3485 ; 3490 *= AFP+$02DB 3495 FMUL LDA FR1 3500 BEQ JZERO 3505 LDA FR0 3510 BEQ FDXIT 3515 ; 3520 TAX 3525 SEC 3530 SBC #$3F 3535 CLC 3540 ADC FR1 3545 JSR MDEXP 3550 MOVEL LDA FR0,X 3555 STA FRE,X 3560 STA FR2,X 3565 LDA #0 3570 STA FR0,X 3575 DEX 3580 BNE MOVEL 3585 STA FRE 3590 STA FR2 3595 STA Z3+1 3600 LDX #FRE 3605 JSR SHL4 3610 BEQ LOOPE 3615 ; 3620 MDEXP STA FR0 3625 TXA 3630 EOR FR1 3635 EOR FR0 3640 BPL NOOVFL 3645 ;JSR SHL4 3650 PLA 3655 PLA 3660 LDA FR0 3665 ROL A 3670 BMI JZERO 3675 ;BEQ LOOPE 3680 OVFLDV SEC 3685 RTS 3690 ; 3695 FDXIT CLC 3700 RTS 3705 ; 3710 JZERO JMP RZERO 3715 ; 3720 ; FDIV = FLOATING DIVIDE 3725 ; 3730 *= AFP+$0325 3735 LDDIV JSR FLD1P ;LOAD DIVISOR 3740 ; 3745 FDIV LDA FR1 3750 BEQ OVFLDV 3755 LDA FR0 3760 BEQ FDXIT 3765 TAX 3770 SEC 3775 SBC FR1 3780 CLC 3785 ADC #$40 3790 JSR MDEXP 3795 DSETUP LDA FR1,X 3800 STA FR2,X 3805 LDA FR0,X 3810 STA FR0+1,X 3815 DEX 3820 BNE DSETUP 3825 STX FR2 3830 STX FR0+1 3835 LDX #FR2 3840 JSR SHL4 3845 SEC 3850 LDX #0-FPREC 3855 JMP SUB10E 3860 ; 3865 LOOP0 LDA FR0+5 3870 STA Z3+1 3875 LDA FR0+4 3880 STA FR0+5 3885 LDA FR0+3 3890 STA FR0+4 3895 LDA FR0+2 3900 STA FR0+1,X 3905 STA FR0+3 3910 LDA FR0+1 3915 STA FR0+2 3920 STY FR0+1 3925 ; 3930 LOOPE LDX Z3 3935 LDA FR1,X 3940 BEQ NOONE 3945 LSR A 3950 LSR A 3955 LSR A 3960 LSR A 3965 BEQ NOTEN 3970 LDX #FRE 3975 JSR DOMULT 3980 LDX Z3 3985 NOTEN LDA FR1,X 3990 AND #$0F 3995 BEQ NOONE 4000 LDX #FR2 4005 JSR DOMULT 4010 NOONE DEC Z3 4015 BNE LOOP0 4020 LDA Z3+1 4025 STA FR0+6 4030 FNDIV CLD 4035 LDA FR0+1 4040 BNE FDXIT 4045 LDY #FPREC 4050 JMP FNMUL 4055 ; 4060 ; SKBLK = SKIP A STRING OF BLANKS (POSSIBLY NULL) 4065 ; 4070 ; 4075 *=AFP+$03A1 4080 SKBLK LDY CIX 4085 LDA #' ' 4090 BNE FSTTST 4095 LPBLK INY 4100 FSTTST CMP (INBUFF),Y 4105 BEQ LPBLK 4110 STY CIX 4115 RTS 4120 ; 4125 ; GCHAR = FETCH A CHARACTER AND CONVERT TO NUMERIC 4130 ; 4135 GCHAR LDY CIX 4140 LDA (INBUFF),Y 4145 SEC 4150 SBC #'0 4155 CMP #10 4160 RTS 4165 ; 4170 ; CHECK FOR A VALID NUMERIC FIELD 4175 ; 4180 NXTCH JSR GETCH 4185 BCC GDCHR 4190 CMP #'. 4195 BEQ DOTVLD 4200 CMP #'+ 4205 BEQ SGNCHK 4210 CMP #'- 4215 BNE BADCH 4220 ; 4225 SGNCHK LDA (INBUFF),Y 4230 CMP #'. 4235 ; 4240 BEQ GDCHR 4245 DOTVLD LDA (INBUFF),Y 4250 CMP #'0 4255 BCS MAYBE 4260 ; 4265 BADCH SEC 4270 RTS 4275 ; 4280 ; GETCH = GET A BYTE FROM A TEXT BUFFER 4285 ; 4290 GETCH JSR GETCH 4295 BCC UPCIX 4300 LDA (INBUFF),Y 4305 UPCIX INY 4310 STY CIX 4315 RTS 4320 ; 4325 ; SH0L4 = SHIFT FR0 LEFT 4 BITS 4330 ; 4335 *= AFP+$03E4 4340 SH0L4 LDX #FR0 4345 SHL4 LDY #4 4350 SHLM ASL 5,X 4355 ROL 4,X 4360 ROL 3,X 4365 ROL 2,X 4370 ROL 1,X 4375 ROL 0,X 4380 DEY 4385 BNE SHLM 4390 RTS 4395 ; 4400 MAYBE CMP #'9+1 4405 BCS BADCH 4410 GDCHR CLC 4415 DEC CIX 4420 RTS 4425 ; 4430 *=AFP+$0400 4435 NORMAL JMP FNORM ;ATARI NORMALIZATION ENTRY POINT 4440 ; 4445 ; 4450 ; DIVISION LOOP 4455 ; 4460 ; 4465 FDIVLP STY FRE+FPREC,X 4470 BMI SUB10E 4475 ; 4480 SUB10N INY 4485 SUB10E LDA FRE+6,X 4490 SBC FR2+5 4495 STA FRE+6,X 4500 LDA FRE+5,X 4505 SBC FR2+4 4510 STA FRE+5,X 4515 LDA FRE+4,X 4520 SBC FR2+3 4525 STA FRE+4,X 4530 LDA FRE+3,X 4535 SBC FR2+2 4540 STA FRE+3,X 4545 LDA FRE+2,X 4550 SBC FR2+1 4555 STA FRE+2,X 4560 LDA FRE+1,X 4565 SBC FR2 4570 STA FRE+1,X 4575 BCS SUB10N 4580 TYA 4585 ASL A 4590 ASL A 4595 ASL A 4600 ASL A 4605 ORA #10 4610 TAY 4615 ADD01N LDA FRE+6,X 4620 ADC FR1+5 4625 STA FRE+6,X 4630 LDA FRE+5,X 4635 ADC FR1+4 4640 STA FRE+5,X 4645 LDA FRE+4,X 4650 ADC FR1+3 4655 STA FRE+4,X 4660 LDA FRE+3,X 4665 ADC FR1+2 4670 STA FRE+3,X 4675 LDA FRE+2,X 4680 ADC FR1+1 4685 STA FRE+2,X 4690 LDA FRE+1,X 4695 ADC #0 4700 STA FRE+1,X 4705 DEY 4710 BCC ADD01N 4715 STY FRE+1,X 4720 TAY 4725 INX 4730 BMI FDIVLP 4735 JMP FNDIV 4740 ; 4745 DOMULT TAY 4750 CLC 4755 MULLP LDA Z3+1 4760 ADC 5,X 4765 STA Z3+1 4770 LDA FR0+5 4775 ADC 4,X 4780 STA FR0+5 4785 LDA FR0+4 4790 ADC 3,X 4795 STA FR0+4 4800 LDA FR0+3 4805 ADC 2,X 4810 STA FR0+3 4815 LDA FR0+2 4820 ADC 1,X 4825 STA FR0+2 4830 LDA FR0+1 4835 ADC 0,X 4840 STA FR0+1 4845 DEY 4850 BNE MULLP 4855 RTS 4860 ; 4865 BITTAB=*-2 4870 .WORD 0 4875 .WORD 1 4880 .WORD 3 4885 .WORD 7 4890 .WORD 9 4895 .WORD 19 4900 .WORD 39 4905 .WORD 79 4910 .WORD 99 4915 .WORD 199 4920 .WORD 399 4925 .WORD 799 4930 .WORD 999 4935 .WORD 1999 4940 .WORD 3999 4945 .WORD 7999 4950 .WORD 9999 4955 .WORD 19999 4960 .WORD 39999 4965 .BYTE $FF,$FF,$FF,$FF,$FF,$FF 4970 .BYTE $FF,$FF,$FF,$FF 4975 PRTDGT LSR A 4980 ROR CIX 4985 STA Z2 4990 LDX #1-FPREC 4995 LDY #0 5000 INC Z2 5005 DGTLP JSR CDPNT 5010 LDA FR0+FPREC,X 5015 LSR A 5020 LSR A 5025 LSR A 5030 LSR A 5035 JSR CVASC 5040 LDA FR0+FPREC,X 5045 AND #$0F 5050 JSR CVASC 5055 INX 5060 BMI DGTLP 5065 JSR CDPNT 5070 ; 5075 LDA #'0 5080 CMP LBUFF 5085 BEQ STRIPZ 5090 BCC DECSFT 5095 DEC INBUFF 5100 STA LBUFF-1 5105 BCS ZSCAN 5110 STRIPZ INC INBUFF 5115 BCS ZSCAN 5120 DECSFT LDA CIX 5125 BPL ZSCAN 5130 LDA LBUFF+1 5135 STA LBUFF+2 5140 LDA #'. 5145 STA LBUFF+1 5150 INC EEXP 5155 ZSCAN LDY #11 5160 ZSCNLP DEY 5165 BEQ LSTCHR 5170 LDA LBUFF,Y 5175 CMP #'0' 5180 BEQ ZSCNLP 5185 CMP #'.' 5190 BNE TRXIT 5195 DEY 5200 LSTCHR LDA LBUFF,Y 5205 TRXIT RTS 5210 ; 5215 RSTARG LDX #FPREC-1 5220 RSTALP LDA PLYARG,X 5225 STA FR1,X 5230 DEX 5235 BPL RSTALP 5240 RTS 5245 ; 5250 LDARG LDX #FPREC-1 5255 LDALP LDA PLYARG,X 5260 STA FR0,X 5265 DEX 5270 BPL LDALP 5275 RTS 5280 ; 5285 ; POLYNOMIAL X^N+A1*X^N-1... 5290 ; 5295 PLYONE JSR SAVARG 5300 CTUONE STA CIX 5305 BNE PLYADD 5310 RTS 5315 ; 5320 ; POLYNOMIAL A1*X^N... 5325 ; 5330 *= AFP+$0540 5335 PLYEVL JSR SAVARG 5340 CTUEVL STA CIX 5345 JSR LDPLY 5350 DEC CIX 5355 BNE PLYENT 5360 RTS 5365 PLYLP DEC CIX 5370 BEQ PLYXIT 5375 JSR RSTARG 5380 PLYENT JSR FMUL 5385 BCS PLYXIT 5390 PLYADD JSR LDPLY 5395 JSR FADD 5400 BCC PLYLP 5405 PLYXIT RTS 5410 ; 5415 LDPLY LDY #FPREC-1 5420 LDPLYL LDA (FPTR2),Y 5425 STA FR1,Y 5430 DEY 5435 BPL LDPLYL 5440 CLC 5445 LDA FPTR2 5450 ADC #FPREC 5455 STA FPTR2 5460 BCC LDPLX 5465 INC FPTR2+1 5470 LDPLX RTS 5475 ; 5480 SAVARG STY FPTR2+1 5485 STX FPTR2 5490 PUTARG TAY 5495 LDX #FPREC-1 5500 SAVALP LDA FR0,X 5505 STA PLYARG,X 5510 DEX 5515 BPL SAVALP 5520 TYA 5525 RTS 5530 ; 5535 ; LOAD FLOATING REGISTERS 5540 ; 5545 *= AFP+$0589 5550 FLD0R STX FLPTR 5555 STY FLPTR+1 5560 FLD0P LDY #FPREC-1 5565 FLD0L LDA (FLPTR),Y 5570 STA FR0,Y 5575 DEY 5580 BPL FLD0L 5585 RTS 5590 ; 5595 FLD1R STX FLPTR 5600 STY FLPTR+1 5605 FLD1P LDY #FPREC-1 5610 FLD1L LDA (FLPTR),Y 5615 STA FR1,Y 5620 DEY 5625 BPL FLD1L 5630 RTS 5635 ; 5640 FST0R STX FLPTR 5645 STY FLPTR+1 5650 FST0P LDY #FPREC-1 5655 FST0L LDA FR0,Y 5660 STA (FLPTR),Y 5665 DEY 5670 BPL FST0L 5675 RTS 5680 ; 5685 FMOVE LDX #FPREC-1 5690 FMOVL LDA FR0,X 5695 STA FR1,X 5700 DEX 5705 BPL FMOVL 5710 OVFEXP RTS 5715 ; 5720 ; EXPONENTIAL FUNCTIONS 5725 ; 5730 *= AFP+$05C0 5735 EXP LDY #INVL10/256 5740 LDX #INVL10&$FF 5745 JSR FLD1R 5750 JSR FMUL 5755 BCS OVFEXP 5760 ; 5765 EXP10 JSR FMOVE 5770 ASL FR0 5775 LSR FR0 5780 JSR FPI 5785 LDA FR1 5790 BPL PLSEXP 5795 SEC 5800 LDA #128 5805 SBC FR0 5810 STA Z1+1 5815 LDA #0 5820 SBC FR0+1 5825 BEQ EXPRV 5830 JMP RZERO 5835 ; 5840 PLSEXP CLC 5845 LDA FR0 5850 ADC #128 5855 STA Z1+1 5860 LDA #0 5865 ADC FR0+1 5870 BNE OVFEXP 5875 EXPRV STA Z1 5880 JSR IFP 5885 ASL FR0 5890 LDA #$7F 5895 CMP FR1 5900 ROR FR0 5905 JSR FADD 5910 ; 5915 LDA FR0 5920 AND #$7F 5925 CMP #$3F 5930 BNE EVALG 5935 LDA FR0+1 5940 CMP #$25 5945 BCC EVALG 5950 STA Z1 5955 LDY #HALF/256 5960 LDX #HALF&$FF 5965 JSR FLD1R 5970 LDA FR0 5975 ASL FR1 5980 ASL A 5985 ROR FR1 5990 BPL NODEC 5995 DEC Z1+1 6000 NODEC JSR FSUB 6005 EVALG LDY #FSCR/256 6010 LDX #FSCR&$FF 6015 JSR FST0R 6020 JSR FMOVE 6025 JSR FMUL 6030 LDY #EXPPLY/256 6035 LDX #EXPPLY&$FF 6040 LDA #2 6045 JSR PLYEVL 6050 JSR FLD1P 6055 JSR FMUL 6060 JSR FST0P 6065 JSR LDARG 6070 LDA #2 6075 JSR CTUONE 6080 JSR FLD1P 6085 JSR FSUB 6090 JSR FMOVE 6095 JSR FLD0P 6100 JSR FDIV 6105 JSR LDPLY 6110 JSR FADD 6115 JSR FMOVE 6120 JSR FADD 6125 LDA Z1 6130 BEQ NOSQR 6135 JSR LDPLY 6140 JSR FMUL 6145 NOSQR LSR Z1+1 6150 BCC NOSFT 6155 LDY #C10/256 6160 LDX #C10&$FF 6165 JSR FLD1R 6170 JSR FMUL 6175 NOSFT CLC 6180 LDA FR0 6185 ADC Z1+1 6190 SBC #$3F 6195 STA FR0 6200 CLC 6205 OVFLOG RTS 6210 *=AFP+$0695 6215 REDARG JSR FLD1R 6220 JSR PUTARG 6225 JSR FADD 6230 LDY #FSCR/256 6235 LDX #FSCR&$FF 6240 JSR FST0R 6245 JSR LDARG 6250 JSR FSUB 6255 JMP LDDIV 6260 ; 6265 ; EXPONENTIAL CONSTANTS 6270 ; 6275 *=AFP+$06AF 6280 EXPPLY .BYTE $40,$08,$70,$38,$83,$66 6285 .BYTE $40,$69,$01,$09,$31,$26 6290 .BYTE $40,$34,$04,$40,$20,$67 6295 .BYTE $40,$59,$94,$21,$33,$27 6300 SQR10 .BYTE $40,$03,$16,$22,$77,$66 6305 ; 6310 ; LOGRITHMS 6315 ; 6320 *=AFP+$06CD 6325 LOG LDA #$80 6330 BNE LOGS 6335 LOG10 LDA #0 6340 LOGS STA Z1+1 6345 LDA FR0 6350 ASL A 6355 BCS OVFLOG 6360 SBC #$7D 6365 STA Z1 6370 LDA FR0+1 6375 CMP #$10 6380 BCS NOLSFT 6385 DEC Z1 6390 JSR SH0L4 6395 NOLSFT LDX #$3F 6400 LDA FR0+1 6405 CMP #$31 6410 BCS NORSFT 6415 DEC Z1 6420 INX 6425 LDY #4 6430 RSLOOP LSR FR0+1 6435 ROR FR0+2 6440 ROR FR0+3 6445 ROR FR0+4 6450 ROR FR0+5 6455 DEY 6460 BNE RSLOOP 6465 NORSFT STX FR0 6470 LDY #NONE/256 6475 LDX #NONE&$FF 6480 JSR REDARG 6485 JSR FST0P 6490 JSR FMOVE 6495 JSR FMUL 6500 LDY #LOGPLY/256 6505 INX 6510 STX FR0+1 6515 LDX #LOGPLY&$FF 6520 LDA #3 6525 JSR PLYONE 6530 LDX #FSCR2&$FF 6535 JSR FST0R+2 6540 JSR LDARG 6545 LDA #3 6550 JSR CTUEVL 6555 JSR FLD1P 6560 JSR FDIV 6565 JSR RSTARG 6570 JSR FMUL 6575 JSR LDPLY 6580 JSR FADD 6585 LDX #FSCR&$FF 6590 JSR FLD1R+2 6595 JSR FMUL 6600 JSR FMOVE 6605 LDA Z1 6610 BPL INTPRT 6615 SEC 6620 TXA 6625 SBC Z1 6630 INTPRT STA FR0 6635 JSR IFP 6640 ASL FR0 6645 ASL Z1 6650 ROR FR0 6655 JSR FADD 6660 LDA Z1+1 6665 BEQ LOG10E 6670 JSR LDPLY 6675 JSR FMUL 6680 LOG10E RTS 6685 ; 6690 ; CONSTANTS USED IN LOGS 6695 ; 6700 *=AFP+$076C 6705 HALF .BYTE $3F,$50,0,0,0,0 6710 LOGPLY .BYTE $C0,$08,$19,$08,$00,$45 6715 .BYTE $40,$16,$96,$69,$81,$40 6720 .BYTE $C0,$10,$07,$04,$06,$96 6725 .BYTE $BF,$67,$35,$81,$60,$15 6730 .BYTE $40,$03,$16,$30,$34,$92 6735 .BYTE $C0,$02,$91,$56,$81,$44 6740 .BYTE $3F,$86,$85,$88,$96,$38 6745 LN10 .BYTE $40,$02,$30,$25,$85,$09 6750 ; 6755 ; EXPONENTIAL CONSTANTS 6760 ; 6765 INVL10 .BYTE $3F,$43,$42,$94,$48,$19 6770 C10 .BYTE $40,$10,0,0,0,0 6775 ; 6780 ; CONSTANTS FOR SIN/COS POLYNOMIAL 6785 ; (11 COEFFICIENTS) 6790 ; 6795 *=AFP+$07AE 6800 PLYSIN .BYTE $3E,$16,$05,$44,$49,$00 6805 .BYTE $BE,$95,$68,$38,$45,$00 6810 .BYTE $3F,$02,$68,$79,$94,$16 6815 .BYTE $BF,$04,$92,$78,$90,$80 6820 .BYTE $3F,$07,$03,$15,$20,$00 6825 .BYTE $BF,$08,$92,$29,$12,$44 6830 .BYTE $3F,$11,$08,$40,$09,$11 6835 .BYTE $BF,$14,$28,$31,$56,$04 6840 .BYTE $3F,$19,$99,$98,$77,$44 6845 .BYTE $BF,$33,$33,$33,$31,$13 6850 NONE .BYTE $3F,$99,$99,$99,$99,$99 6855 ; 6860 ; SIN(45 degrees) 6865 ; 6870 SIN45 .BYTE $3F,$78,$53,$98,$16,$34 6875 ; 6880 ; BINARY TO HEXADECIMAL CONVERSION ROUTINE 6885 ; 6890 CVHDIG SED 6895 ADC #$90 6900 ADC #$40 6905 STA (INBUFF),Y 6910 INY 6915 CLD 6920 RTS