DV3-Info
Start-Deutsch
Ergebnisse
Assembler und DV3
Downloads!
Mailing-List!
Thanks to...
Links!
Assembler und DV3

Kapitel 7

Projekt “Laufschrift” - Teil 3

Wie in Kapitel 6 erwähnt, kann es notwendig werden, einen Programmablauf künstlich zu verzögern. Neben dem Grund, daß insb. Maschinenprogramme zu schnell ablaufen können, ist es auch aufgrund der LCD-Anzeige des DV3 notwendig, die Geschwindigkeit sich bewegender Objekte zu verringern.
Im Gegensatz zu herkömmlichen Bildschirmen benötigt eine LCD-Anzeige mehr Zeit zum Löschen gesetzter Pixel. Deshalb zieht ein sich schnell bewegendes Objekt eine Spur über die Anzeige. Das Display “schmiert”. Diesen Effekt kann man einerseits gezielt verwenden, im vorliegenden Programm wollen wir aber versuchen, ihn zu vermeiden.
Die Geschwindigkeit, mit der sich unser Zeichen über die Anzeige bewegt, bestimmen wir somit über folgende Warteschleife :
- 820172h :  MOV R8, 9999h
- 820176h :  NOP
- 820178h :  DBNZ R8, 0820176h
Zunächst laden wir ein unbenutztes Register (R8 bietet sich an) mit einem Wert X (hier 9999h). Der nächste Befehl NOP tut nichts.
Dann wird es aber interessant ! Der Befehl DBNZ R8, 0820176h subtrahiert den Wert in R8 um eins und überprüft, ob das Ergebnis null ist. Solange dies nicht der Fall ist (NotZero) wird die Adresse 820176h angesprungen. Dies bedeutet, daß das Programm im Kreis springt, bis der Inhalt von R8 null wird. Der Ursprungswert mit dem wir R8 geladen haben, stellt also die Anzahl der Wiederholungen der Schleife dar ! Je größer dieser Wert ist, um so größer wird die Programmverzögerung.
Experimentiert mit der Zeitverzögerung, indem ihr den Wert 9999h verändert. Die maximal mögliche Anzahl von Wiederholungen ist FFFFh.

An 82017Ch folgt der bedingte Sprungbefehl JMP.NZ 0820140h. Das NZ in DBNZ R8 und in JMP.NZ darf nicht verwechselt werden. Während DBNZ R8 prüft, ob der Inhalt von R8 null geworden ist, prüft JMP.NZ, ob das Signalregister Z (Flag Z) nicht gesetzt ist.
Wir erinnern uns :
Flag Z wird in Abhängigkeit vom CMP-Befehl (CoMPare) gesetzt, wenn der aktuelle Spaltenwert in R2 den Spaltenbegrenzungswert aus 8200A4h erreicht. Dies ist der Fall, wenn unser aktueller Textstring seine vorgesehene Endposition ereicht hat ! Jetzt verzweigt der JMP.NZ-Befehl nicht mehr an Adresse 820140h sondern das Programm geht normal an Adresse 820180h weiter !
- 820180h :  SUB R2, 06h
- 820182h :  MOVB [00A4h], R2
Wie der CMP-Befehl gezeigt hat, hat der aktuelle Spaltenwert in R2 den Spaltenbegrenzungswert erreicht. Wir erniedrigen diesen Wert (SUB) in R2 um 06h und laden ihn als neuen Spaltenbegrenzungswert nach 8200A4h !
- 820186h :  MOV R2, 00h
- 820188h :  MOV [00A2h], R2
Wir laden R2 mit 0 und übertragen diesen Wert als aktuellen Spaltenwert nach 8200A2h.
- 82018Ch :  MOVB R2, [00A0h]
- 820190h :  ADD R2, 03h
- 820192h :  MOVB [00A0h], R2
Zunächst übertragen wir die Adresse des aktuellen Textstrings aus 8200A0h nach R2. Dort erhöhen wir diese Adresse um 03h (ADD) und übertragen dann diesen Wert als neue aktuelle Textstringadresse zurück nach 8200A0h !
Was haben wir durch diese Maßnahmen erreicht ?

  1. Durch den neuen Spaltenbegrenzungswert in 8200A4h wird die vorgesehene Endposition des nächsten Zeichens der Laufschrift um 6 Pixel reduziert.
  2. Durch den neuen Spaltenwert in 8200A2h beginnt der nächste Textstring wieder an Spalte 00h.
  3. Durch Erhöhung der aktuellen Textstringadresse in 8200A0h um 03h wird der nächste vorgesehene Textstring ausgegeben.

- 820196h : CMP R2, [00A6h]
- 82019Ah : JMP.NZ 0820140h
- 82019Eh :  HALT
Die noch in R2 enthaltene neue aktuelle Textstringadresse wird mit der Endadresse des Text-String Bereichs (99h) verglichen. Nur wenn dieser Wert noch nicht erreicht wurde, springt das Programm wieder nach 820140h um dort die Textausgaberoutine mit den neuen Werten zu versorgen.
Wurde jedoch der Wert der Endadresse des Text-String Bereiches erreicht, bedeutet dies, daß alle vorgesehenen Zeichen ausgegeben wurden und das Programm stoppt bei 82019Eh mit dem bekannten HALT-Befehl.

Zusammenfassung :
Das Programm besteht im wesentlichen aus einer inneren und einer äußeren Schleife. Die innere Schleife, die die Textausgaberoutine enthält, wiederholt sich für den aktuellen Textstring bis der jeweilige Spaltenbegrenzungswert erreicht wird.
Innerhalb der äußeren Schleife wird der Spaltenbegrenzungswert reduziert, der aktuelle Spaltenwert auf 0 zurückgesetzt und die Textstring-Adresse für das nächste Zeichen festgelegt. Anschließend wird die Kontrolle an die innere Schleife zurückgegeben.
Die äußere Schleife wiederholt sich also jeweils nach Abarbeitung der inneren Schleife, bis das letzte Zeichen ausgegeben wurde.

[DV3-Info] [Start-Deutsch] [Ergebnisse] [Start-Englisch] [Results]