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