Labor Digitale Elektronik II

Werbung
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
Herunterladen