Teil 2: Sortieren und Zählung:
Programmcode (020A0H-0210BH)
Register:
HL - Adressregister für die Wert, Speicheradresse für TWOSEG
IX - Zählregister für Vergleiche, Startadresse für DAK1
IY - Zählregister für Austausche
A - Register; Allzweckregister, Register für Wert 2
C - Register; Register für Wert 1
B - Register; Enthält die Anzahl der Werte
D - Zustandsregister; ob ein Austausch während eines Vorganges stattgefunden hat
Sprungmarken:
M2 - Dient zur Rückkehr aus dem Austausch
M4 - Dient zum Übergang von Sortierabschnitt und Anzeigeabschnitt
M6 - Begin des Anzeigealgorithmus
Bubble - Begin des Sortieralgorithmus
Start - Startmarke für ein neuen Durchgang
Vgl - Marke für Vergleichabschnitt
Vgl1 - Marke für Laden der Vergleichsanzahl
Vgl2 - Marke für Laden der Vergleichsanzahl (2)
Aus - Marke für Austauschabschnitt
Aus1 - Marke für Laden der Austauschanzahl
Anzeig - Marke für Anzeigen der Austauschanzahl und Vergleichsanzahl
Marke | Code | Kommentar |
BUBBLE: | LD IX,00000H | ;Vergleichanzahlreg. |
LD IY,00000H | ;Austauschanzahlreg. | |
START: | LD D,000H | ;Resete Statusreg. (dient zur Kontrolle für Austausch) mit 00H |
LD HL,02200H | ;Lade HL mit Zahlenfolgestartadresse | |
LD A,(021FFH) | ;Lade A mit Anzahl der Werten | |
LD B,A | ;Speichere Anzahl der Werte in B | |
LD A,(HL) | ;Lade A mit erster Zahl | |
VGL: | LD C,A | ;Lade C mit Vergleichswert 1 |
INC HL | ;Inkrementiere HL | |
LD A,(HL) | ;Lade A mit Vergleichswert 2 | |
INC IX | ;Inkrementiere IX -> Anzahl der Vergleich | |
CP C | ;Vergleiche C und A | |
JR C,AUS | ;Springe zu AUS wenn < C (CARRY FLAG) | |
M2: | DJNZ VGL | ;B:=B-1 -> Springe zu VGL wenn B <> 0 |
LD A,D | ;Lade A mit D -> D=000H Kein Austausch D=0FFH Austausch | |
CP 0FFH | ;Vergleiche A mit FFH | |
JR Z,START | ;Springe zu START wenn A=0FFH (ZERO FLAG) | |
JR M4 | ;Springe zu M4 -> Anzeige von IX und IY | |
AUS: | INC IY | ;Inkrementiere IY -> Anzahl der Austausche |
LD D,0FFH | ;Aktiviere D mit FFH | |
DEC HL | ;Dekrementiere HL (VORIGE ADRESSE) | |
LD (HL),A | ;Speichere Wert 2 (Reg. A) in HL | |
INC HL | ;Inkrementiere HL | |
LD A,C | ;Lade A mit Wert 1 (Reg. C) | |
LD (HL),A | ;Speichere Wert 1 (Reg. C) in HL | |
JR M2 | ;Springe zu M2 | |
M4: | LD A,000H | ;Lade A mit 00H |
LD (023F3H),A | ;Speichere 00H in 23F3H | |
JR VGL1 | ;Springe zu VGL1 | |
VGL2: | POP IX | ;Lade aus Speicher IX |
VGL1: | LD A,IXH | ;Lade DE aus IX |
LD D,A | ;Lade DE aus IX | |
LD A,IXL | ;Lade DE aus IX | |
LD E,A | ;Lade DE aus IX | |
CALL 008B7H | ;Rufe DADP | |
LD A,0E0H | ;Lade A mit E0H (=V) | |
LD (023F2H),A | ;Speichere E0H in 23F2H | |
PUSH IX | ;Speichere in Speicher IX | |
ANZEIG: | LD IX,023F2H | ;Lade IX mit 23F2H |
Call 085AH | ;Rufe DAK1 | |
CP 010H | ;ob "+" gedrückt wurde | |
JR Z,VGL2 | ;Springe wenn "+" zu VGL2 | |
CP 011H | ;ob "-" gedrückt wurde | |
JR Z,AUS1 | ;Springe wenn "-" zu AUS1 | |
CP 012H | ;ob "EXE" gedrückt wurde | |
JR Z,M6 | ;Springe wenn "EXE" zu M6 | |
JR ANZEIG | ;Springe zu ANZEIG | |
AUS1: | LD A,IYH | ;Lade DE aus IY |
LD D,A | ;Lade DE aus IY | |
LD A,IYL | ;Lade DE aus IY | |
LD E,A | ;Lade DE aus IY | |
CALL 008B7H | ;Rufe DADP | |
LD A,06FH | ;Lade A mit 6FH | |
LD (023F2H),A | ;Speichere 6FH in 23F2H | |
JR ANZEIG | ;Springe zu ANZEIG |
Die Hauptschleife
Dieser Abschnitt dient zum Laden der Grundeinstellungen, zur
Wiederholung des Durchganges und zur Kontrolle für die Beendigung des Programms.
Sobald ein Durchgang fertig ist wird kontrolliert ob es zu einem Austausch
während des Durchganges stattfand. Bei einem Austausch werden die
Grundeinstellungen neugeladen und ein neuer Durchgang wird gestartet, dies
geschieht so lange bis keine Austausch mehr stattfinden während eines
Durchganges und das Programm springt weiter zu "M4" und lädt somit die
Einstellungen für die "DADP" - Subroutine . Danach springt es auf den innere
Vergleichanzahlcodierung.
.
Die Nebenschleife
Diese Schleife ist in die Hauptschleife integriert. Grundsächlich
dient sie zum Voranschreiten während einem Durchgang. Das heißt das es ständig
zwei folgende Werte vergleicht. Dazu werdet man den "Compare" Befehl ,damit wird
der Wert des Register C vom Wert des Register A abgezogen wird. Wenn nun das
Ergebnis Negativ wird, setzt das Programm automatisch ein Carry Flag. Nun folgt
die bedingte Anweisung. Als nächsten werden die nächsten 2 Werte geladen
und vergleicht, bis man Ende des Durchgangs ist und wieder zur Hauptschleife
zurückkehrt.
Die bedingte Anweisung
Hier wird entschieden ob der Austausch zweier
Elemente nötig ist. Wenn nun das Carry Flag gesetzt ist springt das Programm zum
Austauschabschnitt und dann wieder zurück, ansonsten geht es direkt
weiter mit der Nebenswchleife.
Der Austausch
Hier werden die Werte 1 und 2 vertauscht. Um den Vorgang
besser verstehen zu können, dient das folgende Schema:
Die
Vergleichanzahlcodierung
Zuerst ist zusagen das es 2 Sprungmarken hierfür gibt. "VGL1" und
"VGL2". Da IX, das Register für die Anzahl der Vergleiche ist es aber auch
gleichzetig wichtig für die "DAK1" - Subroutine ist muss es ständig auf den
Speicher gesetzt werden mittels "POP" - und "PUSH" - Befehle. Beim ersten Mal
ist das IX jedoch nicht auf den Speicher und muss somit auch nicht runter
geladen werden. Deshalb wird der "POP" - Befehl ausgelassen.
Um die Vergleichanzahl später anzeigen zu können, muss sie erstmals umcodiert werden. Dazu verwenden wir die "DADP" - Subroutine. Dafür ist es notwendig einige Register umzuschreiben.
Die
Austauschanzahlcodierung
Um die Austauschanzahl später anzeigen zu können, muss sie erstmals
umcodiert werden. Dazu verwenden wir die "DADP" - Subroutine. Dafür ist es
notwendig einige Register umzuschreiben.
Die
Anzeige
In diesem Abschnitt werden die Austauschanzahl und Vergleichanzahl
angezeigt. Dazu benutzen wir die "DAK1" - Subroutine. Außerdem wird ständig
kontrolliert ob die Tasten "+", "-" oder "EXE" gedrückt werden um in Fall die
entsprechend Reaktionen zuaktivieren. Bei der Taste "+" würde die
Vergleichanzahl angezeigt, bei "-" die Austauschanzahl und bei der "EXE" - Taste
springt das Programm zum Anzeigealgorithmus und die sortierten Werte
darzustellen.
Strukturgram:
Um das Verstehen zu unterstützen gibt es dies hier in der Form eines Strukturgrames:
Download:
>
StruktEd32 - Download <