
**********************************************
* KREISE ZEICHNEN MIT FLOATING POINT
* AUFRUF: X=USR (ADR,XM,YM,RADIUS)
* ASSEMBLER: ATMAS-II
* PETER FINZEL 1986
**********************************************
*
* EINSPRUNGADRESSEN DES FP-ROMS:
*

AFP      EQU $D800         ATASCII NACH FP
FASC     EQU $D8E6         FP NACH ATASCII
IFP      EQU $D9AA         INTEGER NACH FP
FPI      EQU $D9D2         FP ZU INTEGER
FSUB     EQU $DA60         SUBTRAKTION
FADD     EQU $DA66         ADDITION
FMUL     EQU $DADB         MULTIPLIKATION
FDIV     EQU $DB28         DIVISION
FLD0R    EQU $DD89         FR0 VIA REGISTER LADEN
FLD0P    EQU $DD8D         FR0 VIA POINTER LADEN
FLD1R    EQU $DD98         FR1 VIA REGISTER LADEN
FLD1P    EQU $DD9C         FR1 VIA POINTER LADEN
FST0R    EQU $DDA7         FR0 VIA REGISTER SPEICHERN
FST0P    EQU $DDAB         FR0 VIA POINTER SPEICHERN
FMOVE    EQU $DDB6         FR0 NACH FR1 KOPIEREN
PLYEVL   EQU $DD40         POTENZREIHE BERECHNEN
EXP      EQU $DDC0         EXPONENTIALFUNKTION E^X
EXP10    EQU $DDCC         EXPONENTIALFKT. 10^X
LOG      EQU $DECD         NATUERLICHER LOGARITHMUS
LOG10    EQU $DED1         ZEHNER-LOGARITHMUS
ZFR0     EQU $DA44         FR0 LOESCHEN

*
* ARBEITSREGISTER DER FP-ROUTINEN
*

FR0      EQU $D4           FP-AKKU O
FLPTR    EQU $FC           ZEIGER (POINTER)
DEGFLG   EQU $FB           O: BOGENMASS, 6: GRAD

*
* ATARI-SYSTEMKONSTANTE
*

ICCOM    EQU $342          IOCB-KONSTANTE
ICBLL    EQU $348
ICBLH    EQU $349
CIOV     EQU $E456         CIO-EINSPRUNG
CPBIN    EQU $0B           PUT BINARY
ROWCRS   EQU $54           CURSORZEILE
COLCRS   EQU $55           CURSORSPALTE
COLOR    EQU $C8           COLOR-WERT VON BASIC

**********************************************
* PLOT-ROUTINE FUER KREIS
**********************************************

         ORG $7000,$A800   LAEUFT AB $7000

FPKREIS  PLA               ARGUMENTE
         LDA #0            BOGENMASS
         STA DEGFLG        EINSCHALTEN
         PLA
         STA FR0+1         'X' VOM STACK
         PLA
         STA FR0
         JSR IFP           IN FP WANDELN
         LDX #XMFP         UND SPEICHERN
         LDY #XMFP/256
         JSR FST0R         VIA REGISTER
         PLA
         STA FR0+1         'Y' VOM STACK
         PLA
         STA FR0
         JSR IFP                 IN FP
         LDX #YMFP
         LDY #YMFP/256
         JSR FST0R
         PLA
         STA FR0+1         'R' VOM STACK
         PLA
         STA FR0
         JSR IFP
         LDX #RADFP
         LDY #RADFP/256
         JSR FST0R

*
*
* 1/R FUER SCHRITTWEITE DES WINKELS
*
         JSR FMOVE
         LDX #EINS         EINS IN FP-
         LDY #EINS/256     DARSTELLUNG
         JSR FLD0R         IN FR0
         JSR FDIV          DIVIDIEREN
         LDX #STEPFP       SCHRITTWEITE
         LDY #STEPFP/256   MERKEN
         JSR FST0R

*
* SCHLEIFENZAEHLER AUF NULL
*
         JSR ZFR0          FR0 LOESCHEN
         LDX #GRADFP
         LDY #GRADFP/256
         JSR FST0R

*
* SCHLEIFE
*

SCHLEIF  LDX #GRADFP       ZUERST DEN
         LDY #GRADFP/256   SINUS BERECHNEN
         JSR FLD0R
         JSR SIN
         LDX #RADFP        MAL RADIUS
         LDY #RADFP/256
         JSR FLD1R         Y=SIN(X)*R
         JSR FMUL
         LDX #YFP
         LDY #YFP/256
         JSR FST0R         ALS Y SPEICHERN

*
* Y=COS(X)*R
*
         LDX #GRADFP       DANN COSINUS
         LDY #GRADFP/256   BERECHNEN
         JSR FLD0R
         JSR COS
         LDX #RADFP        MIT RADIUS
         LDY #RADFP/256    MULTIPLIZIEREN
         JSR FLD1R
         JSR FMUL
         LDX #XFP
         LDY #XFP/256
         JSR FST0R

         JSR PLOT4         4 PUNKTE PLOTTEN
*
* JETZT DIE X UND Y-WERTE VERTAUSCHEN
* DAMIT WIRD DER KREIS AUS INSGESAMT
* 8 SEGMENTEN ZU JE 45 GRAD GEBILDET.
*
         LDX #5
XYTSCH   LDA XFP,X
         PHA
         LDA YFP,X
         STA XFP,X
         PLA
         STA YFP,X
         DEX
         BPL XYTSCH
         JSR PLOT4         NOCHMAL 4 PUNKTE

*
* STEP-WERT ZUM MOMENTANEN WINKEL
* ADDIEREN: GRAD=GRAD+STEP
*
         LDX #GRADFP
         LDY #GRADFP/256
         JSR FLD0R         WINKEL LADEN
         LDX #STEPFP
         LDY #STEPFP/256   SCHRITTWEITE
         JSR FLD1R         LADEN
         JSR FADD          ADDIEREN
         LDX #GRADFP       UND WIEDER
         LDY #GRADFP/256   SPEICHERN
         JSR FST0R
         JSR FMOVE

*
* IST GRAD SCHON GROESSER ALS PI/4?
*
         LDX #PIVIER       WINKEL STEHT
         LDY #PIVIER/256   NOCH IN FR1
         JSR FLD0R         PI/4 IN FRO
         JSR FSUB          PI/4 - GRAD
         LDA FR0           ERGEBNIS < 0?
         BMI ENDE          JA, ENDE'
         JMP SCHLEIF       WEITER - >

ENDE     RTS               ZU BASIC

**********************************************
* UNTERPGM. PLOTTET 4 PUNKTE DES KREISES
**********************************************

PLOT4    LDA #0
         JSR SEGPLOT
         LDA #$40
         JSR SEGPLOT
         LDA #$80
         JSR SEGPLOT
         LDA #$C0
         JSR SEGPLOT
         RTS

**********************************************
* UNTERPROGRAMM ZUM PLOTTEN EINES KREISPUNKTES
* FLAG BESTIMMT, OB XM+X ODER XM-X BZW/
* YM+Y ODER YM-Y
* BERECHNET WIRD.
**********************************************

SEGPLOT  STA FLAG          FLAG MERKEN
         LDX #XFP
         LDY #XFP/256      X UND XM LADEN
         JSR FLD1R
         LDX #XMFP
         LDY #XMFP/256
         JSR FLD0R         ADDIEREN ODER
         BIT FLAG          SUBTRAHIEREN
         BVS SUB1
         JSR FADD
         JMP SEG1
SUB1     JSR FSUB
SEG1     JSR FPI           ERGEBNIS IN INTEGER

         LDA FR0           SPALTE EINTRAGEN
         STA COLCRS
         LDA FR0+1
         STA COLCRS+1
*
* Y-KOORDINATE BESTIMMEN 
*
         LDX #YFP          Y UND YM LADEN
         LDY #YFP/256
         JSR FLD1R
         LDX #YMFP
         LDY #YMFP/256
         JSR FLD0R
         BIT FLAG          ADDIEREN OD.
         BMI SUB2          SUBTRAHIEREN?
         JSR FADD
         JMP SEG2
SUB2     JSR FSUB
SEG2     JSR FPI

         LDA FR0+1         >255??
         BNE KEINPLT       NICHT ERLAUBT!
         LDA FR0           IN CURSORZEILE
         STA ROWCRS        EINTRAGEN
*
* ES FOLGT DER PLOT-BEFEHL
*
         LDX #$60          IOCB #6
         LDA #CPBIN        PUT BINARY
         STA ICCOM,X
         LDA #0            EIN PUNKT
         STA ICBLL,X
         STA ICBLH,X
         LDA COLOR         AKTUELLE FARBE
         JSR CIOV
KEINPLT  RTS

**********************************************
* BERECHNEN DES SINUS NACH DER FUNKTIONENREIHE
* SIN(X)=X*(1 - X^2/3! + X^4/5! -...)
* ABBRUCH NACH DEM 3. GLIED
**********************************************

SIN      LDX #FPHILF
         LDY #FPHILF/256
         JSR FST0R         ARGUMENT MERKEN
         JSR FMOVE         NACH FR1
         JSR FMUL          ARGUMENT QUADRIEREN
         LDA #3            3 GLIEDER
         LDX #SINKOEF      KOEFFIZIENTEN-
         LDY #SINKOEF/256  TABELLE
         JSR PLYEVL        POTENZREIHE P(X*X)
         LDX #FPHILF       ARGUMENT LADEN
         LDY #FPHILF/256
         JSR FLD1R
         JSR FMUL          UND: X*P(X*X)
         RTS

*
* DIE KOEFFIZIENTENTABELLE DER SINUSREIHE
* ALS BRUECHE: 1/120, -1/6, 1
*
SINKOEF  DFB $3E,$83,$33,$33,$33,$33
         DFB $BF,$16,$66,$66,$66,$67
EINS     DFB $40,$01,$00,$00,$00,$00

**********************************************
* BERECHNUNG DES COSINUS NACH DER FUNKTIONEN-
* REIHE COS(X)=1 - X^2/2! + X^4/4! ...
* ABBRUCH NACH DEM DRITTEN GLIED
**********************************************

COS      JSR FMOVE         ARGUMENT
         JSR FMUL          QUADRIEREN
         LDA #3            3 KOEFFIZIENTEN
         LDX #COSKOEF      TABELLE DER
         LDY #COSKOEF/256  KOEFFIZIENTEN
         JSR PLYEVL        POTENZREIHE
         RTS               FERTIG
*
* KOEFFIZIENTENTABELLE DES COS
* ALS BRUECHE: 1/24, 1/2, 1
*
COSKOEF  DFB $3F,$04,$66,$66,$66,$67
         DFB $BF,$50,$00,$00,$00,$00
         DFB $40,$01,$00,$00,$00,$00
*
* 1/4 * PI (45 GRAD) IN FP-DARSTELLUNG
*

PIVIER   DFB $3F,$78,$53,$98,$16,$34

FLAG     DFB 0             MERKER F. VERSCHIEDENE ZWECKE

RADFP    ORG *+6           SPEICHERPLATZ FUER
GRADFP   ORG *+6           FP-VARIABLE
STEPFP   ORG *+6
XMFP     ORG *+6
YMFP     ORG *+6
XFP      ORG *+6
YFP      ORG *+6
FPHILF   ORG *+6

