Bits und Bytes
Suche
Index
FAQ
Kontakt
Zurück

Bits und Bytes

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.


Eine kleine Aufgabe

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 Arithmetik

Um 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.

Rechnen

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.

Logische Verknüpfungen


Mit AND, EOR und ORA können Werte verknüpft werden. In der Regel werden sie zum Setzen oder Löschen einzelner Bits verwendet. AND: Logisches Und entspricht 1+1=1 ; 0+1=0; 1+0=0; 0+0=0;
 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
  Rubrik:  CBM PET
Rubriken-Übersicht
 4 Besucher online 

Valid XHTML 1.0 Transitional Valid CSS!