Teil 1: Zufallszahlen:
Programmcode (02000H-0209FH)
Register:
HL - Adressregister
IX - Startadresse für DAK1
A - Allzweckregister
B - Zähler für Multiplikation
C - Faktor für Multiplikation
E - Zähler in Schleife für Zufallszahlen
Sprungmarken:
N1 - A wird bis NMI inkrementiert
N3 - A wird bis NMI inkrementiert
N5 - C addieren bis B=0, Multiplikation
M6 - Beginn des Anzeigealgorithmus
Eingabe - Beginn Zahleneingabe
A_Ok - A liegt im Toleranzbereich
Erzeugen - Schleife Erzeugung der Zufallszahlen
Marke | Code | Kommentar |
LD A,(0202AH) | ;NMI vorbereiten | |
LD (02341h),A | ;dazu 2341H und 2342H | |
LD A,(0202BH) | ;mit entsprechenden Werte | |
LD (02342H),A | ;laden | |
N1: | INC A | ;A inkrementieren... |
JR N1 | ;...bis der NMI ausgelöst wird | |
LD (0202EH),A | ;ersten Wert in Speicher schreiben T(200F) | |
LD A,(0202CH) | ;NMI für Zweiten Wert vorbereiten | |
LD (02341H),A | ;wieder 2341H und 2342H modifizieren | |
LD A,(0202DH) | ;entsprechende Werte... | |
LD (02342H),A | ;auf die Speicherzellen | |
N3: | INC A | ;zweiten Wert ermitteln |
JR N3 | ;also A inkrementieren bis NMI | |
LD (0202FH),A | ;zweiten Wert in Speicher schreiben | |
JR EINGABE | ;Springe zur Eingabe, über Daten Hinweg | |
SETBASE 0202AH | ; | |
DEFB 00FH | ;für NMI-Umlenkung | |
DEFB 020H | ; | |
DEFB 021H | ; | |
DEFB 020H | ; | |
DEFB 000H | ;für Berechnungsgrundlage | |
DEFB 000H | ; | |
DEFB 000H | ;für DAK | |
DEFB 000H | ; | |
DEFB 000H | ; | |
DEFB 000H | ; | |
DEFB 048H | ; | |
DEFB 068H | ; | |
SETBASE 02040H | ; | |
EINGABE: | LD IX,02030H | ;Pointer setzen |
CALL 0085AH | ;"nr" Anzeigen lassen per DAK1 | |
LD (02036H),A | ;eingetippten Wert speichern | |
LD IX,02030H | ;selbes Prozedere für zweiten Wert | |
CALL 0085AH | ;"nr" Anzeigen lassen per DAK1 | |
LD (02037H),A | ;erst einmal sichern | |
LD A,(02036H) | ;nochmal erste Ziffer holen | |
SLA A | ;viermal nach links schieben | |
SLA A | ;so wird aus der letzen Ziffer | |
SLA A | ;die erste Ziffer | |
SLA A | ; | |
LD B,A | ;das ganze nach B | |
LD A,(02037H) | ;A mit zweiter Ziffer laden | |
ADD A,B | ;Gesamtwert errechnen | |
LD (02038H),A | ;sichern! LD(2038H), A | |
LD A,(02038H) | ;schauen, wie viele Zahlen gewünscht | |
CP 032H | ;bitte nicht mehr als 50d (=32H) | |
JR C,A_OK | ;weniger? In Ordnung | |
JR Z,A_OK | ;genau 50d? In Ordnung | |
LD A,032H | ;zuviel, also 32H festlegen | |
LD (02038H),A | ;und sichern | |
A_OK: | LD HL,02200H | ;ab hier Zahlen in Speicher |
LD A,(02038H) | ;wie viele Zahlen gebraucht? | |
LD E,A | ;nach E | |
ERZEUGEN: | LD A,(0202EH) | ;erster Faktor, Sprungziel |
LD B,A | ;nach B für DJNZ | |
LD A,(0202FH) | ;zweiter Faktor | |
LD C,A | ;nach C | |
DEC B | ;um Zufall zu garantieren | |
N5: | ADD A,C | ;C B mal zu A addieren |
DJNZ N5 | ;mit DJNZ | |
RLA | ;um Zufall zu garantieren | |
LD (HL),A | ;Zufallszahl speichern | |
LD (0202EH),A | ;mit A wird als Faktor weitergerechnet | |
INC HL | ;auf nächste Speicherzelle rutschen | |
DEC E | ;eine Zahl weniger noch zu erzeugen | |
LD A,E | ;für den Vergleich | |
JR NZ,ERZEUGEN | ;wenn nicht fertig, dann weiter machen! | |
LD A,(002038H) | ;Lade Anzahl der Werte | |
DEC A | ;Dekrementiere A | |
LD (021FFH),A | ;Speichere A in 21FFH für Bubblesort | |
LD A, 000H | ;Lade A mit 00H | |
LD (021FEH),A | ;Speichere 00H in 21FEH für Bubblesort | |
JR M6 | ;Springe zur Anzeiger der Zahlen |
NMI
vorbereiten
Der NMI muss zwei mal benutzt werden. Er lässt die CPU dabei auf
verschiedene Stellen im Programm springen, weswegen die Speicherzellen 2341H und
2342H umgeschrieben werden müssen.
Zufällige Werte ermitteln
Das Register A wird solange inkrementiert und läuft so lange über,
bis der Benutzer den NMI auslöst. Wie lange sich der Nutzer Zeit lässt, ist
nicht vorauszusagen. Deshalb ist dieser Wert für unsere Zwecke zufällig genug.
Anzahl der Zahlen ermitteln
Zwei mal wird die DAK1 verwendet, um die Anzahl der gewünschten
Zahlen ziffernweise eingeben zu lassen.
Anzahl der Zahlen ermitteln 2.0
Aus den beiden Ziffern wird jetzt eine Zahl.
Prüfung
Es wird geprüft, ob die gewünschte Menge an Zahlen überhaupt zulässig
ist. Mehr als 32h (50d) sollten es nicht sein.
Vorbereitung
Die Erzeugung der Zufallszahlen wird vorbereitet, indem die Zähler
geladen werden.
Erzeugung
In einer Schleife werden die Zufallszahlen erzeugt und abgespeichert.
Vorbereitung für Bubblesort
Die Übergabewerte für den weiteren Ablauf des Programmes werden
bereitgestellt.
Strukturgram:
Um das Verstehen zu unterstützen, gibt es dies hier in der Form eines Strukturgrammes:
Download:
>
StruktEd32 - Download <