Jeder Computer arbeitet mit Bits und Bytes. Ein Byte besteht bei der 6502-CPU aus acht Bit. Ein Bit kann die geringste Information als 0 oder 1 darstellen.
Man muss sich jedes Bit wie einen Schalter vorstellen, der entweder eingeschaltet = 1 (Strom fließt) oder ausgeschaltet = 0 (kein Strom fließt) darstellen kann. Wenn man ein Byte in zwei vier Bit-Teile zerlegt, spricht man von einem Nibble. Die unteren vier Bit stellen das Low- und die oberen erwartungsgemäß das High-Nibble dar. Mit vier Bit können die Zahlen 0 -15 dargestellt werden. Demnach ergeben zwei Nibbles in der Multiplikation: 16*16=256 (0-255).7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
(MSB) | (LSB) |
In der Tabelle erkennt man die jeweiligen dezimalen Werte jedes Bits. Ein komplettes Byte kann also eine Zahl zwischen 0 und 255 darstellen.
Wir wollen Bit 1, 3 und 5 setzen. Hierzu werden einfach die entsprechenden Werte addiert: 2 + 8 + 32 = 42. Diese dezimale Zahl muss dann in die passende Speicherzelle geschrieben werden.
Binäre ArithmetikUm nicht mit achtstelligen Binärzahlen rechnen zu müssen, wurde das Hexadezimal-System erfunden. Diese einfach Notation kann jeden Wert zwischen 0 und 255 als nur zweistellige Hexadezimalzahlen darstellen. Hierzu werden die Zahlen 0-9 und die Buchstaben A-F verwendet.
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
$00 | $01 | $02 | $03 | $04 | $05 | $06 | $07 |
8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
$08 | $09 | $0A | $0B | $0C | $0D | $0E | $0F |
Da die 6502-CPU über sechzehn Adress-Leitungen verfügt, kann sie damit bis zu (0-) 65535 Speicherzellen erreichen. Das entspricht genau 64 Kilobyte. Hierzu wird eine entsprechende Adresse benötigt.
Nehmen wir zum Beispiel die dezimale Adresse 1234. Dezimale Byte-Werte werden beim Assembler mit der Raute (#) angeführt. Hexadezimale Adressen werden mit dem Dollar-Zeichen ($), hex. Werte mit #$ und Binärzahlen mit dem Prozentzeichen (%) dargestellt.
1234 / 256 = 4 Rest 210 / 16 = 13 Rest 2 (nicht mehr teilbar)
Nun muss nur noch die passende Notation verwendet werden: 4= $04, 13 =$0d und 2=$02 : unsere hexadezimale Adresse lautet $04D2 . Mit dieser Adresse wollen wir in den folgenden Beispielen weiterarbeiten.
Die 6502-CPU bietet zwei Opcodes (operation code, ist eine Zahl, die die Nummer eines Maschinenbefehls für einen bestimmten Prozessortyp angibt. Alle Opcodes zusammen bilden den Befehlssatz des Prozessors oder der Prozessorfamilie) zum Rechnen. Hierbei handelt es sich um ADC: Addieren und SBC : Subtrahieren. Da wir nur mit Zahlen im Bereich von 0-255 arbeiten können, wird zur Berechnung ein Prozessor-Flag hinzugezogen. Ein Beispiel: Für 200 + 100 würde unser Bereich (0-255) nicht mehr ausreichen.
In diesem Beispiel werden erstmal nur das Carry-Flag (C) und die Befehle ADC und SBC verwenden. Zudem bietet die CPU drei weitere wichtige Speicherzellen. Eine davon ist der Akkumulator (A), der an fast allen Operationen beteiligt ist.
Ein erstes Programm:
CLC LDA #$C8 ADC #$64 STA $04d2 RTS
Mit CLC wird erstmal das Carry-Flag gelöscht. Danach werden 100 + 200 ($c8 + $64) addiert und das Ergebnis in unsere vorab berechnete Adresse geschrieben. Mit RTS wird das Programm "sauber" beendet. Nach dem Programmlauf wird man feststellen, dass das Carry-Flag gesetzt (1) ist.
Der binäre Gegenversuch: %01100100 100 + %11001000 200 %100101100 = 300 (- 256 Carry-Flag) - C %00101100 = 44
Dank des gesetzten Carry-Flag, das wie ein neuntes Bit funktioniert, weiß man, dass ein Übertrag stattgefunden hat. In unsere Speicherzelle wurde bei diesem kleinen Programm allerdings nur der dezimale Wert 44 geschrieben. Das gesetzte Carry-Flag kann aber zur weiteren Verarbeitung hinzugezogen werden, damit z.B. eine größere Zahl auf dem Bildschirm ausgegeben werden kann. Bei der Subtraktion von acht Bit Zahlen wird das Carry-Flag vorab mit SEC gesetzt. Bei unseres Berechnung 100 - 200 würde dann ein Unterlauf auftreten und das Carry-Flag gelöscht.
LDA $04d2 ; %00101100 = dezimal 44 AND %11110000 STA $04d2 ; %00100000 = dezimal 32 RTS
Wir lesen mit LDA den vorher geschriebenen Wert aus unserer Speicherzelle in den Akkumulator. Mit AND %11110000 werden die unteren vier Bit gelöscht. Danach wird der neue Wert wieder in unsere Lieblings-Speicherzelle geschrieben und mit RTS der Programmlauf beendet.
ORA: Logisches Oder entspricht 1+1=1 ; 0+1=1; 1+0=1; 0+0=0;
LDA $04d2 ; %00100000 = dezimal 32 ORA %00001100 STA $04d2 ; %00101100 = dezimal 44 RTS
Mir ORA wird ein oder mehrere Bit gesetzt. Im Programm-Beispiel haben wir nun die unteren Bit 2 und 3 wieder restauriert.
EOR: Logisches Exklusives Oder ; das Ergebnis ist immer 1, wenn beide Werte ungleich sind. Dieser Opcode kommt in der Praxis eher selten zum Einsatz.
Letzte Änderung: 2019-01-04 12:57:18