von Frederik Holst Zu Beginn greife ich den Hinweis unseres Lesers Andreas Weiß auf, der mich auf einen fatalen Fehler aufmerksam machte, den ich in dem Artikel über VBI-Programmierung begangen habe: Am Ende des VBIs stand der Befehl JMP $E477, was einen Kaltstart auslöst. Richtig hätte es heißen müssen: JMP $E462. Andreas hat übrigens für diesen Hinweis die DFÜ benutzt. Dies ist eine günstige Möglichkeit um mit mir in Kontakt zu treten. Wer also irgendeinen Netzanschluß besitzt, kann mich so auch erreichen, Hinweise, Kritiken oder Fragen an mich senden. Meine Adressen finden Sie am Ende dieses Artikels. In dieser Ausgabe wollen wir einmal das Rechnen betrachten. Zwar gibt es in der 8-Bit Maschinensprache nur Additions- und Subtraktionsbefehle im engeren Sinne, doch soll uns dies für's erste genügen. Die zentralen Befehle lauten hierzu ADC und SBC. Sie können sowohl mit absoluten Zahlen als auch in Bezug auf Speicherstellen ausgeführt werden. Angenommen wir wollen das triviale Rechenproblem "Eins plus Eins" ausrechnen. In Assembler würde es so lauten: ORG $A800 LDA #1 ADC #1 STA 1536 RTS Hier wird also eine eins in dem Akku geladen (der erste Summand) und dazu eine eins (2. Summand) addiert. ADC bedeutet nämlich ADd with Carry. Was bedeutet nun das Carry-Flag ? Wenn bei einer Addition zweier Zahlen der Wert 255 überschritten wird, so wird das Carry-Flag gesetzt. Das bedeutet also, daß zu dem Ergebnis, das in unserem Beispiel in 1536 abgelegt wird, noch 256 addiert werden muß, da im Akku ja nur das LOW-Byte steht. Ein Beispiel: Das Carry Flag ist zu Beginn null. In den Akku laden wir eine 250 und addieren dazu eine 10. Das Ergebnis wäre also 260. Da 260 sich nicht mit acht Bit darstellen lassen, werden nur die unteren acht Bit in 1536 abgelegt, was einer vier entspricht. Da aber das Carry-Flag durch den Überschlag gesetzt ist, müssen noch 256 hinzugerechnet werden. Für die Subtraktion gilt das gleiche mit dem Befehl SBC. Nun muß man aber aufpassen, daß das Carry-Flag nicht automatisch bei einer Operation gelöscht wird, dies wäre auch fatal, wenn man mehrere Additionen hintereinander ausführen müßte. Das Löschen muß von dem Programmierer selbst mit dem Befehl CLC - CLear Carry - vorgenommen werden. Dies ist immer zweckmäßig vor jede eigenständige Operation zu setzen, also: ORG $A800 CLC LDA #250 ADC #10 STA 1536 RTS Natürlich ist es auch möglich, den Inhalt von Speicherstellen vom Akku abzuziehen oder zu addieren: CLC LDA #250 SBC 18 STA 1536 RTS Hier wird spaßeshalber der Wert der internen Uhr als Minuend für den Subtrahend 250 verwendet. Eine Operation mit 16-Bit Zahlen, die dann immerhin den Zahlenraum bis 65535 ermöglichen, ist recht einfach mittels eines Macros zu realisieren, da man die 16 Bit Zahl in Hi- und Lo-Byte zerlegt und jeweils für sich behandelt: Ein Beispiel: Die Zahl 1025 soll von 2050 abgezogen werden. 2050 ist in 8-Bit zahlen zerlegt 8 (Hi) und 2 (Lo), 1025 ist in 8-Bit zahlen zerlegt 4 (Hi) und 1 (Lo). Das Ergebnis ist also 8-4 (Hi) und (2-1) Lo gleich 4 (Hi) und 1 (Lo), was 1025 entspricht und das richtige Ergebnis ist. Für weitere Fragen und Anregungen stehe ich gerne zur Verfügung.