008
03.12.2024, 03:31 Uhr
Crawler
|
Hallo Alexander,
es freut mich zu sehen, daß du dich momentan mit dem EDAS auf dem KC 85/4 auseinandersetzt. Ich fand das damals Ende der 80er (anfangs sogar noch mit reinem Maschinencode, also ohne Assembler) unglaublich faszinierend, was man alles so mit den verschiedenen Befehlen anfangen kann und es macht mir noch immer Spaß damit herumzuexperimentieren. 
Was ich hier noch beisteuern möchte ist Folgendes:
Leerzeilen kannst du einfach mit einem Semikolon am Zeilenanfang realisieren. Neben den Pseudooperationen DEFB und DEFS gibt es auch noch DEFW und DEFM. Mit DEFW kannst du gleich ein ganzes Wort (2-Byte-Wert) im Speicher ablegen. Daher kann man den Prolog des Vorspanns auch so schreiben:
DEFM kann dann für das Ablegen der Zeichenkette verwendet werden
und DEFB für den Epilog des Vorspanns:
Mit dem EDAS 1.64 kann der komplette Vorspann mittels DB sogar in nur einer Zeile geschrieben werden:
| Quellcode: | DB 7FH,7FH,'WORT',1
|
SCF setzt das Carry-Flag und CCF liefert das Komplement des jeweils aktuellen Zustands des Carry-Flags. Die Sequenz
ist zum Löschen des Carry-Flags vorgesehen, was hier zur korrekten Berechnung des Ergebnisses von SBC HL,DE notwendig ist. Allerdings kann man das Löschen des Carry-Flags auch auf andere Weise und dazu noch einfacher bewerkstelligen:
Aber die 16-Bit-Arithmetik ist an der Stelle auch gar nicht nötig, wie du inzwischen bereits weißt.
Die Variable(n), würde man, wie Matthias bereits angedeutet hat, eher am Ende des Programms definieren, damit die CPU bei der Ausführung nicht einfach drüber läuft.  In deinem Beispiel funktioniert das zufällig(?), da zu Beginn hier 0 gespeichert ist, was einem NOP-Befehl (No Operation) entspricht, welcher einfach nichts macht und die Ausführung mit dem nächsten Befehl fortsetzt. Nachdem der Wert geändert wurde, wird der betreffende Teil des Codes auch nicht mehr erreicht.
Man kann sich die Variable in 007 auch komplett sparen, indem man den Inhalt von B auf dem Stack zwischenspeichert. Das ist nicht nur kürzer sondern auch schneller.
B kann für 256 Schleifendurchläufe mit 0 initialisiert werden, da DJNZ zunächst das Dekrement durchführt und dann erst auf != 0 prüft.
Damit ergibt sich in etwa folgender Code:
| Quellcode: | ; DB 7FH,7FH,'WORT',1 ; LD B,0 ; LOOP: ; PUSH BC ; LD HL,8001H LD DE,8000H LD BC,255 LDIR ; POP BC ; DJNZ LOOP ; RET
|
Der Effekt wird übrigens beim Z 9001 zum Löschen des Bildschirms verwendet und geht dort allerdings über die komplette Bildschirmbreite. 
Schöne Grüße, Stefan |