;************************************** ;* Sinus- und Cosinusfunktion mittels * ;* Coprozessor berechnen und grafisch * ;* darstellen. 2010 H.V.Viehof * ;************************************** include graphics.inc ;______________________________________ ; ; stapelsegment : ;______________________________________ stack segment stack word 'stack' dw 100 dup (?) stack ends CODE SEGMENT WORD PUBLIC 'CODE' ASSUME CS:CODE, DS:data, SS:stack, ES:variablen ;---------------------------------------------------------- ; Sinus Prozedur ;---------------------------------------------------------- Sinus PROC NEAR fninit ; Coprozessor initialisieren fild es:w ein ; Wert aus Speicherstelle laden fdiv ds:d korr ; durch Korrekturwert teilen (/180) fldpi ; und mit PI fmul ; multiplizieren = Grad zu Rad umwandeln fsin ; jetzt kann man den Sinus bilden fmul ds:d fakt ; mit Faktor 240 multiplizieren frndint ; auf ganze Zahl runden fistp es:w aus ; in den Speicher schreiben fwait ; die CPU soll warten, damit das Ergebniss vorliegt wenn es gebraucht wird ret Sinus ENDP coSinus PROC NEAR fninit ; Coprozessor initialisieren fild es:w ein ; Wert aus Speicherstelle laden fdiv ds:d korr ; durch Korrekturwert teilen (/180) fldpi ; und mit PI fmul ; multiplizieren = Grad zu Rad umwandeln fcos ; jetzt kann man den Cosinus bilden fmul ds:d fakt ; mit Faktor 240 multiplizieren frndint ; auf ganze Zahl runden fistp es:w aus2 ; in den Speicher schreiben fwait ; die CPU soll warten, damit das Ergebniss vorliegt wenn es gebraucht wird ret coSinus ENDP start: mov ax, seg xPos ; Vorbereiten von mov ds, ax ; Datensegment und mov ds:w xPos, 27 ; x Position des Textfensters mov ds:w yPos, 1 ; y Position mov ax, seg Info ; das ist der 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 ;---------------------------------------------------------- drawall: mov al, 012h ; 012h ist genau der richtige Modus SetGraph ; 06a wäre 800 x 600 ;---------------------------------------------------------- ; Raster zeichnen ;---------------------------------------------------------- mov al, 2 ; Farbe Gruen mov bx, 020h ; Rasterabstand call Grid ;---------------------------------------------------------- ; Funktionsgraph zeichnen ;---------------------------------------------------------- mov ax, seg korr ; dort sind Konstanten mov ds, ax mov ax, seg ein ; und da Variablen mov es, ax mov es:w ein, 5120 ; Doppelte Werteanzahl entry: mov cx, es:w ein ; shr cx, 3 call Sinus ; jetzt den Sinus bilden mov dx, 240 ; 240 ist die Bildschirmitte von oben sub dx, es:w aus ; davon subtrahiere ich die Ausgabe der Sin. Funkt. mov al, 04 ; Farbe: Rot DrawPixel ; das Macro zeichnet den Punkt an cx/dx dec es:w ein jnz entry ; solange Wert > 0 das oben alles wiederholen mov es:w ein, 5120 ; entro: mov cx, es:w ein ; cx = x Wert shr cx, 3 call coSinus ; jetzt den coSinus bilden mov dx, 240 ; 240 ist die Bildschirmitte von oben sub dx, es:w aus2 ; davon subtrahiere ich die Ausgabe der Sin. Funkt. mov al, 01 ; Farbe: Blau DrawPixel ; das Macro zeichnet den Punkt an cx/dx dec es:w ein jnz entro ; solange Wert > 0 das oben alles wiederholen ;---------------------------------------------------------- ; Textdarstellung ;---------------------------------------------------------- mov ax, seg xPos ; das Segment der Positionen des Textfensters mov ds, ax ; verwenden ... mov dh, ds:w yPos ; Positionen laden mov di, ds:w xPos ; 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 ;---------------------------------------------------------- mov ax, seg xPos ; Die Positionen koennen veraendert werden mov ds, ax Key: mov ah, 7 ; auf Tastendruck warten int 021h cmp al, 'l' jnz W1 dec ds:w xPos jmp drawall W1: cmp al, 'r' jnz W2 inc ds:w xPos jmp drawall W2: cmp al, '+' jnz W3 dec ds:w yPos jmp drawall W3: cmp al, '-' jnz W4 inc ds:w yPos jmp drawall W4: cmp al, 'q' jnz Key ;---------------------------------------------------------- ; Videomodus zurückschalten und Programm beenden ;---------------------------------------------------------- mov al, 3 SetGraph mov ah, 04Ch int 021h CODE ENDS ;______________________________________ ; ; Datensegment I: Text, feste Faktoren ;______________________________________ data segment public word 'daten' message db "ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿",0a db "³ use Key to quit ! ³",0a db "³ use <+> <-> to ³",0a db "³ shift this Message ³",0a db "³ 2010 < H.V.Viehof > ³",0a db "ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ",0 Info db "********************************",0a,0d db "* Berechnet und Zeichnet Sinus *",0a,0d db "* und Cosinus Funktion *",0a,0d db "* 2010 < H.V.Viehof > *",0a,0d db "* beliebiege Taste = Start *",0a,0d db "********************************",0a,0d,024 fakt dd 240.0 korr dd 1440.0 data ends ;______________________________________ ; ; Datensegment II: 'echte' Variablen ;______________________________________ variablen segment public word 'daten' yPos dw ? xPos dw ? ein dw ? aus dw ? aus2 dw ? variablen ends END start