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 <