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 <