;************************************** ;* Einen Kreis mittels Coprozessor * ;* berechnen und grafisch darstellen * ;* 2010 H.V.Viehof * ;************************************** include graphics.inc ;______________________________________ ; ; stapelsegment : ;______________________________________ stack segment stack word 'stack' dw 40 dup (?) stack ends CODE SEGMENT WORD PUBLIC 'CODE' ASSUME CS:CODE, DS:data, SS:stack, ES:variablen ;---------------------------------------------------------- ; coSinus Prozedur ;---------------------------------------------------------- coSinus PROC NEAR ; Sinus und Cosinus in einer Prozedur fninit ; Coprozessor initialisieren fild es:w ein ; Wert aus Speicherstelle laden fdiv ds:d korr ; durch Korrekturwert teilen fldpi ; und mit PI fmul ; multiplizieren = Grad zu Rad umwandeln fsincos ; jetzt kann man den Sinus (ST1) / Cosinus (ST0) bilden fmul ds:d fakt ; mit Faktor 240 multiplizieren frndint ; auf ganze Zahl runden fistp es:w aus ; ST0 in den Speicher schreiben fmul ds:d fakt ; mit Faktor 240 multiplizieren frndint ; auf ganze Zahl runden fistp es:w aus2 ; ST1 in den Speicher schreiben fwait ; die CPU soll warten, damit das Ergebniss vorliegt wenn es gebraucht wird ret coSinus ENDP start: mov ax, seg Info ; das ist der erste Infotext mov ds, ax mov dx, offset Info mov ah, 9 int 021 mov ah, 1 int 021 ;---------------------------------------------------------- ; In Videomodus 640 * 480 mit 16 Farben wechseln ;---------------------------------------------------------- mov al, 012h ; 012h ist genau der richtige Modus SetGraph ;---------------------------------------------------------- ; Raster zeichnen ;---------------------------------------------------------- mov al, 0fh ; Weiss mov bx, 020h ; Rasterabstand call Grid ;---------------------------------------------------------- ; Kreis zeichnen ;---------------------------------------------------------- mov ax, seg ein mov es, ax mov ax, seg fakt mov ds, ax mov es:w ein, 1440 ; der Kreis hat 360 Grad entra: call coSinus mov dx, 240 sub dx, es:w aus mov cx, 320 sub cx, es:w aus2 mov al, 0fh ; Punkt in weisser Farbe DrawPixel dec es:w ein jnz entra ;---------------------------------------------------------- ; Textdarstellung ;---------------------------------------------------------- mov dh, 13 ; Positionen laden mov di, 27 ; Anfang der dargestellten Zeile mov ax, seg message ; ds auf datensegment I umstellen mov ds, ax mov si, offset message ; Anfang des Textes mov bl, 5 ; violett call TextA ; Anzeigen des Textfensters ;---------------------------------------------------------- ; Auf Eingabe eines Zeichens warten, ; Videomodus zurückschalten und Programm beenden ;---------------------------------------------------------- mov ah, 7 ; auf Tastendruck warten int 021h mov al, 3 ; Modus 3 = Text 80 Spalten x 25 Zeilen SetGraph mov ah, 04Ch ; geplantes Ende int 021h CODE ENDS ;______________________________________ ; ; Datensegment I: Text, feste Faktoren ;______________________________________ data segment public word 'daten' fakt dd 240.0 ; dieser Multiplikator ergibt den Radius korr dd 720.0 ; würde eine Genauigkeit in Grad ausreichen müsste hier 180.0 stehen message db "ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿",0a db "³ use any Key to quit ! ³",0a db "³ 2010 < H.V.Viehof > ³",0a db "ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ",0 Info db "***********************************************************************",0a,0d db "* Berechnet und Zeichnet einen Kreis *",0a,0d db "* *",0a,0d db "* Kurzbeschreibung: *",0a,0d db "* *",0a,0d db "* mittels der FSINCOS Coprozessor Funktion werden die X/Y Koordinaten *",0a,0d db "* einer Kreislinie berechnet. *",0a,0d db "* Da der Coprozessor den Winkel im Bogenmass (Radiant) benoetigt, *",0a,0d db "* muss der Wert vorher angepasst werden: *",0a,0d db "* Bogenmass [rad] = Winkel [grad] / 180.0 x PI *",0a,0d db "* um jedoch eine optisch bessere Ausgabe zu erhalten, verwende ich in *",0a,0d db "* diesem Beispiel 1440 Winkelschritte, damit keine Zwischenwerte *",0a,0d db "* interpoliert werden muessen. *",0a,0d db "* *",0a,0d db "* beliebige Taste = Start 2010 < H.V.Viehof > *",0a,0d db "***********************************************************************",0a,0d,024 data ends ;______________________________________ ; ; Datensegment II: 'echte' Variablen ;______________________________________ variablen segment public word 'daten' ein dw ? aus dw ? aus2 dw ? variablen ends END start