12.07.2015 Aufrufe

6502 Programmieren - Teil 8# - Strotmann.de

6502 Programmieren - Teil 8# - Strotmann.de

6502 Programmieren - Teil 8# - Strotmann.de

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

<strong>6502</strong> <strong>Programmieren</strong> - <strong>Teil</strong> <strong>8#</strong>von Uwe Rö<strong>de</strong>r#Hallo Freaks!In diesem <strong>Teil</strong> unseres Kurses wer<strong>de</strong> ich endlich und ausschließlich auf die Flags eingehen. DieFlags (Flaggen) dienen dazu, <strong>de</strong>m Programm gewisse Zustän<strong>de</strong> <strong>de</strong>s Rechners mitzuteilen, so dassdas Programm genau weiß, wie die eine o<strong>de</strong>r an<strong>de</strong>re Operation verlaufen ist. Ohne diese Flags wärees unmöglich Rechnungen o<strong>de</strong>r Vergleiche richtig durchzuführen.Der <strong>6502</strong> verfügt über 7 Flags:Negative-, Overflow-, Break-, Decimal-, Interrupt-, Zero- und Carry-Flag;Ich wer<strong>de</strong> die Funktion <strong>de</strong>r Flags nun im Einzelnen darlegen:Das Negativ-Flag N-Flag (Vorzeichen-Flag)#Das N-Flag entspricht in aller Regel <strong>de</strong>m Bit 7 <strong>de</strong>s zuletzt bearbeiteten Bytes. Bit 7 wird in <strong>de</strong>r Regelals Vorzeichen-Anzeige benutzt wenn man mit positiven und negativen Zahlen arbeiten möchte. Istdas Bit gesetzt, so ist das Byte negativ. Das N-Flag gibt in <strong>de</strong>m Fall also an, dass die Zahl negativ ist.Auch wenn man nicht mit negativen Zahlen arbeitet, kann die Funktion <strong>de</strong>s N-Flags von Nutzen sein,da es, wie gesagt, immer <strong>de</strong>n Zustand von Bit 7 <strong>de</strong>s zuletzt bearbeiteten Bytes angibt. Dieses Bitwird dadurch zum am leichtesten zu untersuchen<strong>de</strong>n Bit.Das N-Flag wird immer nach einem <strong>de</strong>r folgen<strong>de</strong>n Befehle aktualisiert:ADC, AND, ASL, BIT, CMP, CPX, CPY, DEC,DEX, DEY, EOR, INC, INX, INY, LDA, LDX,LDY, LSR, ORA, PLA, PLP, ROL, ROR, RTI,SBC, TAX, TAY, TSX, TXA, TYADas Overflow-Flag V-Flag (Übertrags-Flag)#Das V-Flag gibt einen Übertrag von Bit 6 nach Bit 7 an. Dies hat wie<strong>de</strong>r mit <strong>de</strong>r beson<strong>de</strong>ren Funktion<strong>de</strong>s Bit 7 als Vorzeichen-Flag beim Rechnen mit negativen Zahlen zu tun. Wenn zum Beispieldas Ergebnis einer Rechenoperation grösser als 127 ist, so wird das Bit 7 zu <strong>de</strong>r Darstellung <strong>de</strong>sErgebnisses benötigt.Da <strong>de</strong>r Prozessor ja nicht weiß, ob ich jetzt mit negativen Zahlen o<strong>de</strong>r im normalen Dualsystemarbeite, setzt <strong>de</strong>r Rechner das V-Flag, falls ein Übertrag von Bit 6 nach Bit 7 stattgefun<strong>de</strong>n hat.Falls ich wirklich mit durch Vorzeichen gekennzeichneten Zahlen (Zweierkomplement-Zahlen)gearbeitet habe, wird mir durch dieses Flag angezeigt, dass eventuell das Vorzeichen-Bit benutztwur<strong>de</strong> und dass dadurch das Ergebnis verfälscht ist.Nachfolgen<strong>de</strong> Befehle haben Einfluss auf <strong>de</strong>n Zustand <strong>de</strong>s V-Flags: ADC, BIT, CLV, PLP, RTI, SBCEine Beson<strong>de</strong>rheit stellt hier <strong>de</strong>r BIT Befehl dar. Nach Ausführung <strong>de</strong>s BIT-Befehles gibt dasOverflow-Flag <strong>de</strong>n Zustand <strong>de</strong>s 6. Bits wie<strong>de</strong>r.


Das Break-Flag B-Flag#Das B-Flag gibt an, dass <strong>de</strong>r Prozessor bei <strong>de</strong>r Durcharbeitung <strong>de</strong>s Programmes auf <strong>de</strong>n Befehl BRKgestoßen ist.Dies hat nichts mit <strong>de</strong>r Break-Taste zu tun!!!Ist das B-Flag durch einen BRK-Befehl gesetzt wor<strong>de</strong>n, so wird das Programm an <strong>de</strong>r in $FFFE/$FFFF eingetragenen Adresse fortgesetzt.Das B-Flag kann nur durch <strong>de</strong>n Befehl BRK verän<strong>de</strong>rt wer<strong>de</strong>n.Das Dezimal-Flag D-Flag#Wenn das D-Flag gesetzt ist, so arbeitet <strong>de</strong>r Computer im Dezimal-Modus. Das be<strong>de</strong>utet, dass 9+1wie üblich 10 und nicht $0A ist. Das Rechenergebnis wird dann auch als 10 abgelegt. Dabei gehenvier Bits pro Ziffer drauf. Bei Berechnungen mit ADC o<strong>de</strong>r SBC kann ein Byte lediglich die Werte 0bis 99 annehmen. Ist das Ergebnis grösser als 99 so wird das Carry-Flag gesetzt.Das D-Flag wird durch CLD, SED, PLP und RTI beeinflusst.Das Interrupt-Flag I-Flag#Ist das I-Flag gesetzt, so wird vom Prozessor kein Interrupt (IRQ) mehr zugelassen. Das be<strong>de</strong>utet,dass keine I/O-Operationen mehr ausgeführt wer<strong>de</strong>n können, da nur POKEY und PIA einen IRQauslösen können.Dies ist zum Beispiel dann nützlich, wenn man Daten in <strong>de</strong>n RAM Speicher unter <strong>de</strong>mBetriebssystem-ROM legen möchte, da man dazu das ROM wegschalten muss. Hätte man dasROM weggeschaltet ohne die Interrupts zu sperren, wür<strong>de</strong> <strong>de</strong>r Computer sich aufhängen, da dieInterrupts Adressen anspringen, die im weggeschalteten ROM liegen. Ein NMI (VBI) Interrupt kannnicht gesperrt wer<strong>de</strong>n.Die Befehle BRK, SEI, CLI, PLP und RTI beeinflussen dieses Flag.Das Zero-Flag Z-Flag#Hier kommen wir endlich zu meinem Lieblings Flag! Das Zero-Flag ist gesetzt, wenn das Ergebnisirgen<strong>de</strong>iner Operation 0 ergeben hat o<strong>de</strong>r wenn bei einem Zahlenvergleich bei<strong>de</strong> Zahlen gleich großsind, also die Differenz gleich 0 ist.Das Zero-Flag wird von folgen<strong>de</strong>n Befehlen hin- und hergesetzt:ADC, AND, ASL, BIT, CMP, CPX, CPY, DEC,DEX, DEY, EOR, INC, INX, INY, LDA, LDX,LDY, LSR, ORA, PLA, PLP, ROL, ROR, RTI,SBC, TAX, TAY, TSX, TXA, TYA;Das Carry-Flag C-Flag#Das Carry-Flag hat nur zwei Funktionen. Die eine Funktion wur<strong>de</strong> im letzten <strong>Teil</strong> dieses Kursesbesprochen als wir uns mit allen möglichen Arten <strong>de</strong>s Shiftens befassten. Hierbei dient das C-Flag dazu das überschüssige o<strong>de</strong>r herausgeschobene Bit aufzunehmen, damit es nicht verlorengeht. Außer<strong>de</strong>m zeigt das C-Flag <strong>de</strong>n Übertrag bei einer Rechenoperation an. Das heißt, wenn dasErgebnis einer Binär-Operation grösser als 255=$FF ist, wird dies durch das C-Flag angezeigt. ImDezimal-Modus ist dies <strong>de</strong>r Fall, wenn ein Ergebnis grösser als 99 ist.


Und nun wie gewohnt die Auflistung <strong>de</strong>r für das C-Flag relevanten Befehle:ADC, ASL, CLC, CMP, CPX, CPY, LSR, PLP,ROL, ROR, RTI, SBC, SEC;Um nun die Flags genauer zu untersuchen, gibt es zwei Möglichkeiten. Man kann über <strong>de</strong>n BefehlPHP das Statusbyte, in welchem die Flags zusammengefasst sind, auf <strong>de</strong>m Stapel ablegen und mitPLA in <strong>de</strong>n Akku übertragen. Jetzt kann man alle Bits genau überprüfen. Das Statusbyte setzt sichwie folgt zusammen:Bit 0 ? CarryBit 1 ? ZeroBit 2 ? InterruptBit 3 ? DezimalBit 4 ? BreakBit 5 - keine FunktionBit 6 ? OverflowBit 7 ? NegativFür vier <strong>de</strong>r Flags existieren bedingte relative Sprünge. Das heißt, dass je nach Status <strong>de</strong>szugehörigen Flags ein Sprung ausgeführt wird o<strong>de</strong>r nicht. Die Sprungweite eines solchen Befehlsbeträgt effektiv 126 Bytes nach hinten o<strong>de</strong>r 129 Bytes nach vorne.Negative Flag#BMI adr: Branch on minus Verzweigen falls N=1 BPL adr: Branch on plus Verzweigen falls N=0Overflow Flag#BVS adr: Branch on overflow set Verzweigen falls V=1 BVC adr: Branch on overflow clearVerzweigen falls V=0Zero Flag#BEQ adr: Branch if equal Verzweigen falls Z=1 BNE adr: Branch if not equal Verzweigen falls Z=0Carry Flag#BCS adr: Branch on carry set Verzweigen falls C=1 BCC adr: Branch on varry clear Verzweigen fallsC=0Auf diese Art und Weise lässt sich nach je<strong>de</strong>r Operation <strong>de</strong>s Prozessors genau untersuchen ob alleswie erwünscht abgelaufen ist o<strong>de</strong>r ob man Korrekturen ausführen muss.Dazu nun zwei kurze Beispiele:1. Inkrement einer 16 Bit ZahlINC LOWBNE .1INC HIGH.1 RTSWenn ich eine 16 Bit Zahl um eins erhöhe, so muss ich immer wenn das Low-Byte <strong>de</strong>n Wert 255überschreitet und dadurch wie<strong>de</strong>r 0 wird, das High-Byte um 1 erhöhen. Mit <strong>de</strong>m Befehl BNE .1wird <strong>de</strong>r Status <strong>de</strong>s Zero-Flags untersucht. Wenn <strong>de</strong>r Status gleich 0 ist, be<strong>de</strong>utet dies, dass dasInkrementieren einen Wert ungleich 0 zum Ergebnis hatte. Dann wird <strong>de</strong>r Sprung nach .1 ausgeführt


und das High-Byte nicht verän<strong>de</strong>rt. Ist <strong>de</strong>r Status gleich 1, heißt dies <strong>de</strong>mentsprechend, dass dasLow-Byte die 255 überschritten hat und wie<strong>de</strong>r 0 ist. Somit ist <strong>de</strong>r Status <strong>de</strong>s Zero-Flags 1 und <strong>de</strong>rSprung nach .1 wird nicht ausgeführt. Das Programm wird also bei INC HIGH weitergeführt, so dassin diesem Falle sowohl Low- als auch High-Byte inkrementiert wer<strong>de</strong>n.2. Addition einer 8-Bit Zahl zu einer 16-Bit ZahlLDA LOWCLCADC ZAHLSTA LOWBCC .1INC HIGH.1 RTSWenn die erste Addition Low + Zahl zu einem Ergebnis führt, das grösser als 255 ist, wird das Carry-Flag gesetzt. Ist dies <strong>de</strong>r Fall so wird das High-Byte inkrementiert, da <strong>de</strong>r Befehl BCC .1 dann nichtsbewirkt.Wäre das Ergebnis <strong>de</strong>r ersten Addition kleiner o<strong>de</strong>r gleich 255 gewesen und somit das Carry-Flaggleich 0, so hätte <strong>de</strong>r Befehl BCC .1 einen Sprung nach .1 an das En<strong>de</strong> <strong>de</strong>r Routine bewirkt.Dies soll soweit reichen. Im nächsten Monat wer<strong>de</strong> ich dazu noch einige weitere Sachen wie z.B. dieVergleichsbefehle einführen und dann auch endlich ein Beispielprogramm abliefern.Bis dann viel Spaß am Assembler wünschtUwe Rö<strong>de</strong>rCSM / 3.1989Der Artikel entstammt <strong>de</strong>r Kursreihe ?<strong>6502</strong> <strong>Programmieren</strong>? <strong>de</strong>s Compy Shop Diskettenmagazins.Die Kursreihe besteht aus 14 Kursen, die im Laufe <strong>de</strong>s Jahres 2011 in unregelmäßigen Abstän<strong>de</strong>neinzeln veröffentlicht wer<strong>de</strong>n, bzw. anschließend als Zusammenzug als ABBUC-Buch ?<strong>6502</strong><strong>Programmieren</strong>? erscheinen.Koordination: Volkert Barr (volkert@nivoba.<strong>de</strong>)Version 1.1 / 2011-01-23

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!