Labor Digitale Elektronik II X1 Y1 X2 Y2 Graphikprogramm Versuchsdurchführung Bericht Testat Mittwoch, 12.11.2001 Michael Legenbauer (562852) Labor Digitale Elektronik II Graphikprogramm Inhaltsverzeichnis Deckblatt Seite 1 Inhaltsverzeichnis Seite 2 Einleitung Seite 2 Aufgabenstellung Einschränkungen definieren Seite 3 Programmentwurf Seite 5 Korrekturen Seite 8 Programm in der lauffähigen Endversion Seite 9 Seite 4 Einleitung Der Benutzer wir Aufgefordert Koordinaten einzugeben. Diese dürfen im dreistelligen Bereich liegen, da der Videomodus 04h vom Intrrupt 10h verwendet wird. Das heisst es steht eine Fläche von 320*200 Pixel zur Verfügung, die mit vier Farben arbeitet. Nun soll ein blauer Hintergrund geschaffen werden und die Farbe für die Linie soll frei wählbar sein. Das Programm hat nun die Aufgabe die Beiden Punkte zu verbinden. Die erste Hürde wird sein, die eingelesenen Koordinaten aus drei Byte in eine Wort-Variable zu schreiben. Dabei soll der Benutzer nicht eingeschränkt werde, in dem er die Koordinaten 3 stellig in der Form 001 angeben zu müssen. Die nächste Problematik ist einen Algorhythmus zu finden, der eine diagonale Linie zeichnet. Michael Legenbauer 2 Labor Digitale Elektronik II Graphikprogramm Digitale Elektronik II – Labor Bearbeiter: Legenbauer Ausgabedatum: Aufgabe Übertragen Sie das Architekturprogramm in eine graphische Ebene. Dabei sollen X zwei Koordinaten in der Form 1 eingelesen und verbunden werden. Geben Y1 Sie dem „Zeichenbrett“ einen blauen Hintergrund. Die Linienfarbe soll frei wählbar sein. Michael Legenbauer 3 Labor Digitale Elektronik II Graphikprogramm Programm (ENDFASSUNG) page 56,132 title Graphic %NOSYMS ;****************************************************** ;* ;* Graphic_Architektur ;* Gruppe 31 Legenbauer ;* ;****************************************************** ; Definition der Konstanten Lf equ 0Ah Cr equ 0Dh ; Code Segment definieren _TEXT segment assume CS:_TEXT, DS:_TEXT, SS:_TEXT org 100h ; COM-Programm beginnt ; bei Offset 100h ;***************** Programmbereich ******************** Start: call CLS ;ruft die Funktion CLS auf Bildschirmloeschen lea dx,X_ACHSE_Sa ;Offset des Ausgabetextes laden call AUSGABE ;ruft die Funktion zur Textausgabe auf lea dx,koordinate ;laed die effektive Adresse der Variablen ;Koordinate call EINGABE ;ruft die Funktion zum einlesen der ;Koordinaten auf mov startlinex,ax ;die konvertierte Koordinate wird in ein Byte ;(passende Variable) geschrieben lea dx,Y_ACHSE_Sa ;die oben beschriebene Prozedur wird fuer ;alle call AUSGABE ;Koordinaten wiederholt lea dx,koordinate call EINGABE mov startliney,ax lea dx,X_ACHSE_Ea call AUSGABE lea dx,koordinate call EINGABE mov endlinex,ax lea dx,Y_ACHSE_Ea call AUSGABE lea dx,koordinate call EINGABE mov endliney,ax lea dx,FARBEa ;Offset des Aufforderungstext eine Farbe ;zwischen 1 und 15 einzugeben. call AUSGABE ;Da eine Zeichenkette eingelesen lea dx,koordinate ;wird, kann man die gleiche Eingabe wir bei ;den Koordinaten verwenden, call EINGABE ;in der jetzt der Farbwert in einer mov FARBE,al ;Bytevariablen abgelegt wird mov ax,0004h int 10h mov ax,0B00h Michael Legenbauer ;AH wird mit 0 und AL mit 4 geladen, damit ;wird der ;Videomodus 320*200 in 4 Farben initiiert und ;mit dem Interrupt aufgerufen ;AH=11 und AL=0 sind Parameter f•r den ;Hintergrund 4 Labor Digitale Elektronik II mov bx,0001h int 10h call putpixel call DRAWLINE mov ah,1h int 21h mov int ax,0003h 10h ; Programmende mov mov int Graphikprogramm ;BH=0 und in BL den Farbwert fuer den HG ;laden ;Hintergrundfarbe setzten ;Funktionsaufruf, um das erste Pixel zu ;setzen ;Funktionsaufruf, der die linie malt ;ist die Linie gemalt wird hier auf eine ;Eingabe gewartet, ;so dass man die Linie sehen kann und nicht ;gleich verschwindet al,0 ah,4Ch 21h ;Hier wird wieder der Textmodus gesetzt, ;Parameter AH=0 und AL=3 ; Fehlercode 0 ; Funktion: Programm verlassen ; Schnittstelle zu DOS ;***************** Unterprogramme ********************* EINGABE PROC NEAR mov ah,0Ah int 21h lea di,koordinate+1 mov bx,[di] mov bh,0 mov ax,di add ax,bx mov zeiger,ax mov cx,bx mov di,zeiger mov ax,[di] mov ah,0 sub al,30h mov temp,ax dec cx cmp cx,0 Michael Legenbauer ;Interruptaufruf, um eine Zeichenkette ;einzulesen ;In DI wird die Adresse geladen, in der die ;tatsaechliche Zeichenlaenger der Eingabe ;steht. Dies ist nach der Definition die ;effektive Adresse mit dem Abstand 1 ;der Inhalt auf der Adresse, auf die DI ;zeigt kommt in BX ;BH wird auf 0 gesetzt, damit in BX ;wirklich nur der Wert der Zeichenlaenge ;steht ;Die Adresse, auf die DI zeigt wird in AX ;geschrieben ;Zu dieser Adresse wird die Laenge der ;Zeichenkette addert, so dass in AX die ;Adresse steht, die auf den letzten Wert ;zeigt ;Diese Adresse aus AX wird nun in eine ;Variable ZEIGER gespeichert ;CX wird als Zaehler mit dem Wert aus BX ;geladen ;Der Adresse aus dem Zeiger wird in DI ;geschrieben ;Der Inhalt aus DI kommt in AX ;AH wird 0 gestezt, damit wirklich nur der ;Wert aus DI in AX steht ;Aus dem in AL stehenden ASCII-Wert wird ;durch Subtraktion von 30h eine Dezimalzahl ;erzeugt ;Die Dezimalzahl wird in der Variablen TEMP ;zwischengespeichert ;CX wird um den Wert 1 herabgesetzt ;CX wir mit 0 verglichen, das ist die ;Abbruchbedingung, d.h. es wurde nur eine ;einstellige Koordinate eingegeben 5 Labor Digitale Elektronik II je ok ;Bei CX = 0 erolgt ein Sprung zu OK sub zeiger,1 mov di,zeiger mov ax,[di] mov ah,0 sub al,30h mul zehn+1 add ax,temp mov temp,ax dec cx cmp cx,0 je ok sub mov mov mov sub mul add mov zeiger,1 di,zeiger ax,[di] ah,0 al,30h zehn ax,temp temp,ax ok: mov ax,temp ret EINGABE ENDP DRAWLINE: mov sub Graphikprogramm ;Der Zeiger wird um eine Adresse ;erniedrigt, nun zeigt der zeiger auf die ;zweite Stelle von hinter der Koordinaten ;Diese Adresse wird in DI geschrieben ;Der Inhalt aus DI, also der Wert an der ;zweiten Stelle von hintern, wird in AX ;geschrieben ;AH wird wieder auf 0 gesetzt, damit nur ;der Wert in AX steht ;Aus ASCII-Wert wird ein Dezimalwert ;gemacht ;In der Variablen Zehn sind Multipikatoren ;definiert. An der Stelle Zehn+1 steht eine ;10, also wird hier mit 10 multipliziert ;Zum Wert in AX wird der alte Wert aus TEMP ;hinzu addiert und steht in AX ;Der neue Summand wird in TEMP ;zwischengespeichert ;Der Z„hler CX wird um 1 erniedrigt ;Vergleich von CX mit 0 - Abbruchbedingung ;Ist die Abbruchbedingung erf•llt, wird zum ;Label OK gesprungen ;gleiche Vorgang wie einen Abstatz dr•ber ;Adresse der letzten Stelle der Koordinaten ;Inhalt=Wert der Adresse in AX ;AH=0 ;ASCII zu Dezimalwert ;Multiplikation mit 100 ;Addition der Werte aus AX und TEMP ;Den Summand in TEMP speichern ;Label OK, Wert aus TEMP in AX ;Zur•ck zum Aufruf der Eingabe ;Label DRAWLINE setzt eine Schleifenmarke, ;in der die vollstaendige Linie gezeichnet ;wird (Pixel fuer Pixel) ax,word ptr [endlinex] ;Der Wert aus endlinex wird ;in AX geschrieben. Word ;ptr damit der Assembler ;weiss, dass es sich um ein ;8Bit Wert handelt, der ;hinter der Adresse ;endlinex steckt ax,word ptr [startlinex] ;Wert aus startlinex von ;endlinex abziehen mov bx,word ptr [endliney] sub bx,word ptr [startliney] cmp ax,bx Michael Legenbauer ;Gleicher Vorgang wie drei ;Zeilen drueber, nur mit ;BX. ;Es wird die Laenge der ;noch zuzeichnenden Linie ;ermittelt ;Die Laenge der X- und Y;Linie wird verglichen 6 Labor Digitale Elektronik II putx: puty: Graphikprogramm ja putx ;Ist die interne Subtraktion des Befehls ;CMP groesser 0 wird ein X- Pixel gezeichnet ;Ergibt die Subtraktion aus CMP ein ;kleineren Wert als 0, so ist die y-Linie ;Laenger als die X-Linie und ein Y-Pixel wird ;gemalt ;Ist die x-Linie bis zum Schluss ;gezeichnet erfolgt ein Sprung zum Label ;RETURN jb puty cmp je ax,0h return inc word ptr [startlinex] inc word ptr [startliney] call putpixel jmp drawline inc word ptr [startlinex] call putpixel jmp drawline inc word ptr [startliney] call jmp putpixel drawline ;Aufruf der Funktion ein ;Pixel zu malen ;Sprung zum Label DRAWLINE ;(Schleife) return: ret putpixel: mov ah,0Ch mov cx, word ptr [startlinex] mov dx, word ptr [startliney] mov al,FARBE int 10h ret AUSGABE PROC NEAR mov ah,9 wird in AH geladen int 21h ret AUSGABE ENDP Michael Legenbauer ;Sind X- und Y-Strecke ;gleich lang wird weder ein ;X- noch Y- Pixel gemalt, ;sondern die Werte der ;Startpunkte ein 1 erhoeht ;In der Funktion PUTX wird ;die Koordinate erhoeht ;und die Fuktion aufgerufen ;ein Pixel zu malen, ;dann erfolgt der Sprung ;zum Schleifenafang ;Wie bei PUTX nur wird die ;Y-Koordinate erhoeht ;Sprung ins Hauptprogramm ;Die Funktion Grafikpixel ;setzen wird in AH geladen ;Die X-Koordinate wird in ;CX uebergeben ;Die Y-Koordinate wird in ;DX uebergeben ;In AL wird der Farbwert ;geschrieben ;Interrupt ruft die ;Funktion aus AH auf und ;fuehrt diese aus. ;zurueck zum Aufruf ;Unterprogramm zur Ausgabe eines Textes ;Funktion zur Ausgabe einer Zeichenkette ;Interrupt fuerht die geladene Funktion aus ;zurueck ins Hauptprogramm 7 Labor Digitale Elektronik II CLS PROC NEAR mov ax,0003 int 10h ret Graphikprogramm ;Unterprogramm zur loeschen des Bildschirms ;Funktion fuer den Textmodus wird in AL ;geladen, AX muss 0 sein ;Interrupt setzt den Textmodus neu ;zurueck ins Hauptprogramm CLS ENDP ;***************** Datenbereich *********************** X_ACHSE_Sa db "Startkoordinate X_ACHSE: ","$" Y_ACHSE_Sa db Cr,Lf,"Startkoordinate Y_ACHSE: ","$" X_ACHSE_Ea db Cr,Lf,"Endkoordinate X_ACHSE: ","$" Y_ACHSE_Ea db Cr,Lf,"Endkoordinate Y_ACHSE: ","$" FARBEa db Cr,Lf,"Farbe (1 fuer blau, 2 fuer gruen): ","$" FARBE db 0 startlinex dw 0 startliney dw 0 endlinex dw 0 endliney dw 0 koordinate db 4,?,0,0,0 ;Koordinate ist als Byte definiert, in der ;maximal 3 stellige Zahlen eingegeben ;werden duerfen temp dw 0 zehn db 100,10 ;Definition des Multipikator, der in einer ;Schleife gesteuert werden kann zeiger dw 0 _TEXT ends ; Codesegment schliessen end Start ; Ende des Quellprogramms Michael Legenbauer 8