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