|
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 !
|