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

Kapitel 6

Projekt “Laufschrift” - Teil 2

Wenn wir das Programm “DV3-Info.bin” auf unserem DV3 ausführen sehen wir, daß der Text “DV3-Info!” angefangen beim “!” Zeichen für Zeichen von links nach rechts an eine vorherbestimmte Position läuft.
Der dazugehörige Text ist im Speicherbereich 82007Eh bis 820098h abgelegt. Wie wir mit dem Hexeditor sehen können, wird jedes einzelne Zeichen des Textes, angefangen mit “!”, als eigener Text-String (siehe Kapitel 3) behandelt. Jeder Text-String beginnt mit einem Leerzeichen, gefolgt vom eigentlichen Textzeichen und dem Code 00, der das Ende eines Text-Strings markiert.

Als Speicherplatz für die Kontrollvariablen unseres Programms sind die Adressen
- 8200A0h (Adresse des aktuellen Text-Strings -> Startwert 7Eh),
- 8200A2h (aktueller Spaltenwert -> Startwert 00h),
- 8200A4h (Spaltenbegrenzungswert -> Startwert 62h) und
- 8200A6h (Text-String Bereich Endadresse -> 99h)
vorgesehen.

Wir setzen die eigentliche Programmbeschreibung fort :
- 82013Ch :  MOV DP0, 0082h
Das Spezialregister DP0 wird mit dem Segmentwert 0082h geladen, da weiter unten aufgeführte Befehle nur mit einem einfachen Adresswert arbeiten und den dazugehörigen Segmentwert im Register DP0 erwarten !
- 820140h :  MOV R2, [00A0h]
- 820144h :  MOV R3, 0082h
Wie in der Beschreibung der Textausgaberoutine in Kapitel 3 beschrieben, sollen die Register R2 und R3 mit Adresse und Segmentwert des ersten auszugebenden Text-Strings geladen werden. Der Befehl MOV R2, [00A0h] lädt das Register R2 indirekt mit dem Wert, der unter 8200A0h abgespeichert ist (82h -> DP0) !
- 820148h :  PUSH R3; -82014Ah : PUSH R2 (siehe Kapitel 3)
- 82014Ch :  MOV R2, 0032h; -820150h : PUSH R2 (LCD-Ausgabezeile)
- 820152h :  MOVB R2, [00A2h]
Das Register R2 wird mit dem, unter 8200A2h abgespeicherten, aktuellen Spaltenwert geladen !
- 820156h :  SCALL 82h: 1EE0h; -82015Ah :  ADD R15, 08h;
- 82015Ch :  MOV R2, 00h; - 82015Eh :  PUSH R2 (orig. Textausgaberoutine)
- 820160h :  MOV DP0, 0082h
Da im Rahmen des durch SCALL 82h: 1EE0h aufgerufenen Unterprogramms der Inhalt von DP0 geändert wird, muß der Segmentwert 0082h erneuert werden.
- 820164h :  MOVB R2, [00A2h]
- 820168h :  ADD R2, 02h
- 82016Ah :  MOVB [00A2h], R2
Der letzte Spaltenwert aus 8200A2h wird in R2 geladen und dort um 02h erhöht. Der um 02h erhöhte Inhalt von R2 wird anschließend wieder unter 8200A2h abgespeichert. Wir beabsichtigen, unseren aktuellen Text-String um 2 Pixel nach rechts zu versetzen ! Da der Text-String mit einem Leerzeichen beginnt, wird das an der alten Position ausgebene Textzeichen automatisch gelöscht.
- 82016Eh :  CMP R2, [00A4h]
Der erhöhte Spaltenwert in R2 wird mit dem unter 8200A4h abgespeicherten Spaltenbegrenzungswert verglichen. Dies geschieht, indem intern der Inhalt von 8200A4h von R2 subtrahiert wird. Ein Signalregister Z (Flag Z) wird gesetzt, falls das Ergebnis 0 ist. Andernfalls bleibt Z ungesetzt.
Vorgriff :
- 82017Ch :  JMP.NZ 0820140h
Unter der Bedingung, daß Flag Z nicht gesetzt ist (NotZ), wird das Programm an Adresse 820140h fortgesetzt und der aktuelle Text-String zwei Pixel weiter rechts ausgegeben, wobei die vorhergehende Position durch das Leerzeichen im Text-String überschrieben wird.
Dieser Vorgang wiederholt sich, bis der aktuelle Spaltenwert gleich dem Spaltenbegrenzungswert ist und der Text-String somit seine vorherbestimmte Position erreicht hat !
Da dieser Vorgang in Maschinensprache (Assembler) so schnell abläuft, daß wir ihn garnicht beobachten könnten, ist von 820172h bis 820178h eine Warteschleife installiert, mit der wir in Kapitel 7 fortsetzen !

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