
**********************************************
* 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
*


