Floating Point Routines#
00010 .LI OFF
00020 ------------------------------
00030 * *
00040 * FLOTINGPOINT BERECHNUNGEN *
00050 * *
00060 ------------------------------
00070 *
00080 *
00090 *
00100 *
00110 LBUFF .EQ $580 WIRD VOM ROM FESTGELEGT
00120 *
00130 INBUFF .EQ $F3 POINTER AUF LBUFF
00140 CIX .EQ $F2 INDEXREGISTER. NORMAL =0
00150 FR0 .EQ $D4
00160 FR1 .EQ $E0
00170 FPPNTR .EQ $FC POINTER AUF FP ZAHL
00180 *
00190 ------------------------------
00200 AFP .EQ $D800 ASCII=>FLOATING POINT (FP)
00210 FASC .EQ $D8E6 FP=>ASCII IN LBUFF
00220 IFP .EQ $D9AA INTEGER FR0 ($D4)=> FP
00230 FPI .EQ $D9D2 FP=>INTEGER IN FR0 ($D4)
00240 FSUB .EQ $DA60 FR0<= FR0-FR1
00250 FADD .EQ $DA66 FR0<= FR0+FR1
00260 FMUL .EQ $DADB FR0<= FR0*FR1
00270 FDIV .EQ $DB28 FR0<= FR0/FR1
00280 ------------------------------
00290 FLD0R .EQ $DD89 LADE FR0 MIT ZAHL
00300 * AUF DIE DIE REGISTER <X> UND <Y>
00310 * ZEIGEN. <X>=MSB, <Y>=LSB
00320 FLD0P .EQ $DD8D LADE FR0 MIT ZAHL
00330 * AUF DIE DER POINTER FPPNTR
00340 * ZEIGT.
00350 FLD1R .EQ $DD98 WIE FLD0R DOCH MIT FR1
00360 FLD1P .EQ $DD9C WIE FLD0P DICH MIT FR1
00370 FSTOR .EQ $DDA7 WIE FLD0R NUR IN ANDERER
00380 * RICHTUNG (SPEICHERN)
00390 FSTOP .EQ $DDAB WIE FSTOR NUR DURCH
00400 * FPPNTR ADRESSIERT.
00410 FMOVE .EQ $DDB6 FR0=>FR1
00420 *
00430 ------------------------------
00440 INITFP LDA #0 FP-ROUTINEN
00450 STA CIX INITIALISIEREN
00460 LDA #LBUFF
00470 STA INBUFF
00480 LDA /LBUFF
00490 STA INBUFF+1
00500 RTS
00510 ------------------------------
00520 *
00530 ------------------------------
00540 PRINTFR0 JSR INITFP INITIALISIERUNG
00550 JSR FASC FP=>ASCII WANDELN
00560 LDY #0
00570 .1 STY WERT ZEICHEN AUS
00580 LDA (INBUFF),Y PUFFER HOLEN
00590 BMI ENDE INVERS? JA: LETZTES ZEICHEN
00600 JSR PUTCHAR AUSGEBEN
00610 LDY WERT NAECHSTES ZEICHEN
00620 INY
00630 BNE .1 HIER EIN JUMP
00640 ENDE AND #$7F INVERSES ZEICHEN ALS
00650 JMP PUTCHAR NORMALZEICHEN AUSGEBEN
00660 *
00670 WERT .HX 00 ZWISCHENSPEICHER
00680 *
00690 ------------------------------
00700 *
00710 ------------------------------
00720 PUTCHAR TAX VECTOR
00730 LDA $E407 JUMP
00740 PHA UEBER
00750 LDA $E406 ROM
00760 PHA
00770 TXA
00780 RTS JMP
00790 *
00800 ------------------------------
00810 CLRFR0 LDY #5 FR0
00820 LDA #0 LOESCHEN
00830 .1 STA FR0,Y
00840 DEY
00850 BPL .1
00860 RTS
00870 ------------------------------
00880 CLRFR1 LDY #5 FR1
00890 LDA #0 LOESCHEN
00900 .1 STA FR1,Y
00910 DEY
00920 BPL .1
00930 RTS
00940 ------------------------------
Floating Point Demo#
00010 .LI OFF
00020 .OR $4000
00030 *
00040 *
00050 * DAS FOLGENDE PROGRAMM
00060 * ENTSPRICHT DER BASIC-ZEILE:
00070 *
00080 * FOR I=0 TO 255:?I,I*I:NEXT I
00090 *
00100 *
00110 *
00120 *
00130 *
00140 *
00150 *
00160 *
00170 *
00180 START JMP DEMO
00190 ------------------------------
00200 *
00210 .IN "D:FPOINT.INC"
00220 *
00230 ------------------------------
00240 DEMO JSR CLRFR0 FR0 UND SCHLEIFEN-
00250 STA DWERT WERT LOESCHEN
00260 STA DWERT
00270 *
00280 DLOOP JSR IFP INTEGER=> FP UMRECHNEN
00290 JSR PRINTFR0 ZAHL AUSGEBEN
00300 LDA #' TAB
00310 JSR PUTCHAR AUSGEBEN
00320 JSR FMOVE ZAHL NACH FR1 SCHIEBEN
00330 JSR FMUL UND MIT FR0 MULTIPLIZIEREN
00340 BCS ERROR IST DAS CAARY GESETZT SO LAG FEHLER VOR
00350 JSR PRINTFR0 ZAHL AUSGEBEN
00360 LDA #$9B CR AUSGEBEN
00370 JSR PUTCHAR
00380 INC DWERT INTEGERWERT
00390 LDA DWERT HOCHZAEHLEN
00400 STA FR0 NACH FR0
00410 BEQ ERROR BEI UEBERSCHLAG => ENDE
00420 LDA #0 MSB LOESCHEN
00430 STA FR0+1
00440 .1 JMP DLOOP SCHLEIFE FORTFUEHREN
00450 ERROR RTS
00460 *
00470 DWERT .HX 00