0100 ; FPMAC.LIB›0110 ;›0120 FPMAC›0130 ;›0140 .IF .NOT .DEF OSEQU›0150 .ERROR "Must include OSEQU.LIB"›0160 .ENDIF ›0170 ;›0180 ; floating point macros›0190 ;›0200 ;›0210 ; MACRO: @A2FP›0220 ;›0230 ; FORM: @A2FP inbuff›0240 ;›0250 ; converts 10 byte or less›0260 ; ascii number at inbuff to›0270 ; FP number in FR0›0280 ;›0290 .MACRO @A2FP ›0300 LDA # <%1›0310 STA INBUFF›0320 LDA # >%1›0330 STA INBUFF+1›0340 LDA #0›0350 STA CIX›0360 JSR AFP ;[D800]›0370 BCC @B1›0380 JMP FPERROR›0390 @B1 NOP ›0400 .ENDM ›0410 ;›0420 ;›0430 ;›0440 ; MACRO: @FP2A›0450 ;›0460 ; FORM: @FP2A›0470 ;›0480 ; converts a FP number in FR0 to›0490 ; ascii and places it in LBUFF›0500 ; pointed to by INBUFF›0510 ;›0520 .MACRO @FP2A ›0530 JSR FASC ;[D8E6]›0540 .ENDM ›0550 ;›0560 ;›0570 ;›0580 ; MACRO: @FP2MEM›0590 ;›0600 ; FORM: @FP2MEM buffer›0610 ;›0620 ; moves reslut of FP to ASCII›0630 ; conversion to memory›0640 ;›0650 .MACRO @FP2MEM ›0660 LDA # <%1›0670 STA TO›0680 LDA # >%1›0690 STA TO+1›0700 LDY #$FF›0710 @LOOP INY ›0720 LDA (INBUFF),Y›0730 STA (TO),Y›0740 CMP #$80›0750 BCS @LOOP›0760 AND #$7F›0770 STA (TO),Y›0780 INY ›0790 LDA #$9B›0800 STA (TO),Y›0810 .ENDM ›0820 ;›0830 ;›0840 ;›0850 ; MACRO: @WRD2FP›0860 ;›0870 ; FORM: @WRD2FP›0880 ;›0890 ; converts a two byte word in›0900 ; FR0 to FP›0910 ;›0920 .MACRO @WRD2FP ›0930 JSR IFP ;[D9AA]›0940 .ENDM ›0950 ;›0960 ;›0970 ;›0980 ; MACRO: @FP2WRD›0990 ;›1000 ; FORM: @FP2WRD›1010 ;›1020 ; converts a FP number in FR0›1030 ; to a two byte word›1040 ;›1050 .MACRO @FP2WRD ›1060 JSR FPI ;[D9D2]›1070 BCC @B1›1080 JMP FPERROR›1090 @B1 NOP ›1100 .ENDM ›1110 ;›1120 ;›1130 ;›1140 ; MACRO: @LODFR0›1150 ;›1160 ; FORM: @LODFR0 buffer›1170 ;›1180 ; loads FR0 with 10 byte ASCII›1190 ; number at buffer›1200 ;›1210 .MACRO @LODFR0 ›1220 LDA # <%1›1230 STA FLPTR›1240 LDA # >%1›1250 STA FLPTR+1›1260 JSR FLD0P ;[DD8D]›1270 .ENDM ›1280 ;›1290 ;›1300 ;›1310 ; MACRO: @LODFR1›1320 ;›1330 ; FORM: @LODFR1 buffer›1340 ;›1350 ; loads FR1 with 10 byte ASCII›1360 ; number at buffer›1370 ;›1380 .MACRO @LODFR1 ›1390 LDA # <%1›1400 STA FLPTR›1410 LDA # >%1›1420 STA FLPTR+1›1430 JSR FLD1P ;[DD9C]›1440 .ENDM ›1450 ;›1460 ;›1470 ;›1480 ; MACRO: @STFR0›1490 ;›1500 ; FORM: @STFR0 buffer›1510 ;›1520 ; stores number in FR0 to buffer›1530 ;›1540 .MACRO @STFR0 ›1550 LDA # <%1›1560 STA FLPTR›1570 LDA # >%1›1580 STA FLPTR+1›1590 JSR FSTOP ;[DDAB]›1600 .ENDM ›1610 ;›1620 ;›1630 ;›1640 ; MACRO: @FR02FR1›1650 ;›1660 ; FORM: @FR02FR1›1670 ;›1680 ; moves FP number from FR0 to›1690 ; FR1›1700 ;›1710 .MACRO @FR02FR1 ›1720 JSR FMOVE ;[DDB6]›1730 .ENDM ›1740 ;›1750 ;›1760 ;›1770 ; MACRO: @MATH›1780 ;›1790 ; FORM: @MATH op addr,buffer1,buffer2 [,buffer3]›1800 ;›1810 ; performs FP math function as›1820 ; called by other FP macros with›1830 ; result to buffer 3 if no›1840 ; buffer 3 is specified the›1850 ; result is stored in buffer 1›1860 ;›1870 .MACRO @MATH ›1880 @A2FP %3›1890 @FR02FR1 ›1900 @A2FP %2›1910 JSR %1 ; FP operation addr›1920 BCC @B1›1930 JMP FPERROR›1940 @B1 @FP2A ›1950 .IF %0<4›1960 @FP2MEM %2›1970 .ELSE ›1980 @FP2MEM %4›1990 .ENDIF ›2000 .ENDM ›2010 ;›2020 ;›2030 ;›2040 ; MACRO: ADD›2050 ;›2060 ; FORM: ADD buffer1,buffer2 [,buffer3]›2070 ;›2080 ; adds buffers 1 and 2›2090 ; uses the macro @MATH›2100 ; see @MATH for details›2110 ;›2120 .MACRO ADD ›2130 .IF %0=2›2140 @MATH FADD,%1,%2›2150 .ELSE ›2160 @MATH FADD,%1,%2,%3›2170 .ENDIF ›2180 .ENDM ›2190 ;›2200 ;›2210 ;›2220 ; MACRO: SUB›2230 ;›2240 ; FORM: SUB (as in ADD)›2250 ;›2260 ; subtracts buffer2 from buffer1›2270 ; see @MATH for details›2280 ;›2290 .MACRO SUB ›2300 .IF %0=2›2310 @MATH FSUB,%1,%2›2320 .ELSE ›2330 @MATH FSUB,%1,%1,%3›2340 .ENDIF ›2350 .ENDM ›2360 ;›2370 ;›2380 ;›2390 ; MACRO: MUL›2400 ;›2410 ; FORM: MUL (as in ADD)›2420 ;›2430 ; multiplies buffer1 by buffer2›2440 ; see @MATH for details›2450 ;›2460 .MACRO MUL ›2470 .IF %0=2›2480 @MATH FMUL,%1,%2›2490 .ELSE ›2500 @MATH FMUL,%1,%1,%3›2510 .ENDIF ›2520 .ENDM ›2530 ;›2540 ;›2550 ;›2560 ; MACRO: DIV›2570 ;›2580 ; FORM: DIV (as in ADD)›2590 ;›2600 ; divides buffer1 by buffer2›2610 ; see @MATH for details›2620 ;›2630 .MACRO DIV ›2640 .IF %0=2›2650 @MATH FDIV,%1,%2›2660 .ELSE ›2670 @MATH FDIV,%1,%1,%3›2680 .ENDIF ›2690 .ENDM ›2700 ;›2710 ;›2720 ;›2730 ; MACRO: LOG›2740 ;›2750 ; FORM: LOG buffer1 [,buffer2]›2760 ;›2770 ; takes the natural logarithm›2780 ; of buffer1 and stores it in›2790 ; buffer2 if no buffer2 is›2800 ; specified then the result is›2810 ; put back in buffer1›2820 ;›2830 .MACRO LOG ›2840 @A2FP %1›2850 JSR LOG ;[DECD]›2860 .IF %0=2›2870 @FP2MEM %2›2880 .ELSE ›2890 @FP2MEM %1›2900 .ENDIF ›2910 .ENDM ›2920 ;›2930 ;›2940 ;›2950 ; MACRO: CLOG›2960 ;›2970 ; FORM: CLOG buffer1 [,buffer2]›2980 ;›2990 ; takes the base 10 logarithm›3000 ; of buffer1 as in LOG›3010 ;›3020 .MACRO CLOG ›3030 @A2FP %1›3040 JSR LOG10 ;[DED1]›3050 .IF %0=2›3060 @FP2MEM %2›3070 .ELSE ›3080 @FP2MEM %1›3090 .ENDIF ›3100 .ENDM ›3110 ;›3120 ;›3130 ;›3140 ; MACRO: LET›3150 ;›3160 ; FORM: LET label,string›3170 ;›3180 ; asigns a string or floating›3190 ; point number to a label›3200 ; FP numbers are up to 10 bytes›3210 ; either must be in quotes›3220 ;›3230 .MACRO LET ›3240 SAVEPC =*›3250 *= %1›3260 .BYTE %2›3270 *= SAVEPC›3280 .ENDM ›3290 ;›3300 ;›3310 ;›