WDC 65C02 - WDC 65C02

W65c02s8p-14 lg.jpg
Mikroprozessor W65C02S in einem PDIP-40-Gehäuse.
Allgemeine Information
Gestartet 1981 ; Vor 40 Jahren ? ( 1981 )
Gängige Hersteller
Leistung
max. CPU- Taktrate 1 MHz bis 14 MHz
Geschichte
Vorgänger MOS-Technologie 6502

Der 65C02- Mikroprozessor des Western Design Center (WDC) ist eine verbesserte CMOS- Version der beliebten nMOS- basierten 8-Bit- MOS-Technologie 6502 . Der 65C02 behob mehrere Probleme des ursprünglichen 6502 und fügte einige neue Anweisungen hinzu, aber sein Hauptmerkmal war ein erheblich geringerer Stromverbrauch, in der Größenordnung von 10 bis 20 Mal weniger als der ursprüngliche 6502, der mit der gleichen Geschwindigkeit lief. Der reduzierte Stromverbrauch machte den 65C02 für tragbare Computer und Mikrocontrollersysteme in industriellen Umgebungen nützlich . Es wurde in einigen Heimcomputern sowie in eingebetteten Anwendungen, einschließlich implantierter medizinischer Geräte, verwendet.

Die Entwicklung begann 1981 und Muster wurden Anfang 1983 veröffentlicht. WDC lizenzierte das Design an Synertek , NCR , GTE und Rockwell Semiconductor . Rockwells Hauptinteresse galt dem Embedded-Markt und verlangte, dass mehrere neue Befehle hinzugefügt werden, um diese Rolle zu unterstützen. Diese wurden später wieder in die Basisversion kopiert, woraufhin WDC zwei eigene neue Befehle hinzufügte, um den W65C02 zu erstellen . Sanyo lizenzierte das Design später auch, und Seiko Epson produzierte eine weitere modifizierte Version als HuC6280 .

Frühe Versionen verwendeten ein 40-Pin-DIP-Gehäuse und waren in 1, 2 und 4 MHz-Versionen erhältlich. Spätere Versionen wurden in PLCC- und QFP- Paketen sowie PDIP und mit viel höheren Taktraten hergestellt. Die aktuelle Version von WDC, der W65C02S-14, hat einen vollständig statischen Kern und läuft offiziell mit Geschwindigkeiten von bis zu 14 MHz, wenn er mit 5 Volt betrieben wird.

Einführung und Funktionen

Der 65C02 ist ein kostengünstiger, universeller 8-Bit- Mikroprozessor (8-Bit- Register und Datenbus ) mit einem 16-Bit- Programmzähler und einem Adressbus . Der Registersatz ist klein, mit einem einzelnen 8-Bit- Akkumulator (A), zwei 8-Bit- Indexregistern (X und Y), einem 8-Bit-Statusregister (P) und einem 16-Bit-Programmzähler (PC). Zusätzlich zum einzelnen Akkumulator ermöglichen die ersten 256 Bytes des RAM, die "Nullseite" ( $0000bis $00FF), einen schnelleren Zugriff durch Adressierungsmodi, die eine 8-Bit-Speicheradresse anstelle einer 16-Bit-Adresse verwenden. Der Stack liegt in den nächsten 256 Bytes, Seite eins ($0100 bis $01FF) und kann nicht verschoben oder erweitert werden. Der Stack wächst rückwärts mit dem Stack-Pointer (S) beginnend bei $01FF und dekrementiert, wenn der Stack wächst. Es hat einen Befehlssatz variabler Länge , der zwischen einem und drei Bytes pro Befehl variiert.

Die grundlegende Architektur des 65C02 ist identisch mit der des ursprünglichen 6502 und kann als eine stromsparende Implementierung dieses Designs angesehen werden. Bei 1 MHz, der beliebtesten Geschwindigkeit des ursprünglichen 6502, benötigt der 65C02 nur 20 mW, während das Original 450 mW benötigt, eine Reduzierung um mehr als das Zwanzigfache. Der manuell optimierte Kern und der geringe Stromverbrauch sollen den 65C02 gut für stromsparende System-on-Chip- Designs (SoC) geeignet machen .

Für den Entwurf des W65C02S-Kerns in eine anwendungsspezifische integrierte Schaltung (ASIC) oder ein feldprogrammierbares Gate-Array (FPGA) ist ein Hardware-Beschreibungsmodell von Verilog verfügbar . Wie in der Halbleiterindustrie üblich, bietet WDC ein Entwicklungssystem an, das eine Entwicklerplatine , einen In-Circuit-Emulator (ICE) und ein Softwareentwicklungssystem umfasst.

Die W65C02S-14 ist die Serienversion ab 2020 und ist verfügbar in PDIP , PLCC und QFP - Paketen. Die maximal offiziell unterstützte Ø2 (primäre) Taktfrequenz beträgt 14 MHz bei Betrieb mit 5 Volt, angezeigt durch das Suffix der Teilenummer  –14 (Hobbyisten haben 65C02 Homebrew- Systeme entwickelt, die schneller laufen als die offizielle Nennleistung). Die Bezeichnung "S" zeigt an, dass das Teil einen vollständig statischen Kern hat , eine Funktion, die es ermöglicht, Ø2 ohne Datenverlust im hohen oder niedrigen Zustand zu verlangsamen oder vollständig zu stoppen. Typische Mikroprozessoren, die nicht in CMOS implementiert sind, haben dynamische Kerne und verlieren ihre internen Registerinhalte (und stürzen somit ab), wenn sie nicht kontinuierlich mit einer Rate zwischen einigen minimalen und maximalen spezifizierten Werten getaktet werden.

65C02-Register
1 5 1 4 1 3 1 2 1 1 1 0 0 9 0 8 0 7 0 6 0 5 0 4 0 3 0 2 0 1 0 0 (Bitposition)
Hauptregister
  EIN Ein Akkumulator
Indexregister
  x X Indexregister
  Ja Y- Indexregister
0 0 0 0 0 0 0 1 SP S tack P ointer
Programm zähler
PC P rogram C ounter
Statusregister
  n V - B D ich Z C S tatus R egister

Allgemeine Logikfunktionen

Die Aufnahme eines Sitronix ST2064B Mikrocontrollers zeigt den eingebetteten W65C02S- Kern oben rechts

Logikfunktionen

  • Vektor-Pull- VPBAusgang ( ) zeigt an, wenn Interrupt-Vektoren adressiert werden
  • Der MLBAusgang Memory Lock ( ) zeigt anderen Busmastern an, wenn ein Read-Modify-Write- Befehl verarbeitet wird
  • WA it-for- I nterrupt ( WAI) und ST o P ( STP) Anweisungen reduzieren den Stromverbrauch verringern Interrupt - Latenzzeit und ermöglicht die Synchronisation mit externen Ereignissen

Elektrische Eigenschaften

  • Versorgungsspannung angegeben bei 1,71 V bis 5,25 V
  • Stromaufnahme (Ader) von 0,15 bzw. 1,5 mA pro MHz bei 1,89 V bzw. 5,25 V
  • Befehlssatz mit variabler Länge, der eine Optimierung der Codegröße gegenüber Befehlssatzprozessoren mit fester Länge ermöglicht, führt zu Energieeinsparungen
  • Die vollständig statische Schaltung ermöglicht das Stoppen der Uhr, um Strom zu sparen

Taktfunktionen

Der W65C02S kann mit jeder geeigneten Versorgungsspannung (V DD ) zwischen 1,8 und 5 Volt (±5%) betrieben werden. Die Tabelle der AC-Eigenschaften des Datenblatts listet die Betriebseigenschaften bei 5 V bei 14 MHz, 3,3 V oder 3 V bei 8 MHz, 2,5 V bei 4 MHz und 1,8 V bei 2 MHz auf. Diese Informationen können ein Artefakt eines früheren Datenblatts sein, da eine Grafik zeigt, dass typische Geräte mit höheren Geschwindigkeiten betrieben werden können, als in der Tabelle der AC-Eigenschaften angegeben, und dass ein zuverlässiger Betrieb bei 20 MHz mit V DD bei 5 . leicht erreichbar sein sollte Volt, vorausgesetzt, die unterstützende Hardware lässt dies zu.

Die W65C02S-Unterstützung für beliebige Taktraten ermöglicht es, einen Takt zu verwenden, der mit einer Taktrate läuft, die für einen anderen Teil des Systems ideal ist, wie 13,5 MHz (digitale SDTV-Luma-Abtastrate), 14,31818 MHz (NTSC-Farbträgerfrequenz × 4), 14,75 MHz (PAL-Quadratpixel), 14,7456 (Baudrate Quarz) usw., solange V DD ausreicht, um die Frequenz zu unterstützen. Designer Bill Mensch hat darauf hingewiesen, dass F MAX von Faktoren außerhalb des Chips beeinflusst wird, wie beispielsweise der kapazitiven Belastung der Pins des Mikroprozessors. Die Minimierung der Last durch Verwendung kurzer Signalspuren und der wenigsten Geräte hilft, F MAX zu erhöhen . Die PLCC- und QFP-Packages haben eine geringere Pin-zu-Pin-Kapazität als die PDIP-Packages und sind sparsamer in der Nutzung des Leiterplattenplatzes .

WDC hat berichtet, dass FPGA-Realisierungen des W65C02S erfolgreich bei 200 MHz betrieben wurden.

Vergleich mit dem NMOS 6502

Grundarchitektur

Obwohl der 65C02 hauptsächlich als stromsparender 6502 angesehen werden kann, behebt er auch mehrere Fehler, die im Original gefunden wurden, und fügt neue Anweisungen, Adressierungsmodi und Funktionen hinzu, die den Programmierer beim Schreiben kleinerer und schneller ausführender Programme unterstützen können. Es wird geschätzt, dass das durchschnittliche 6502-Assemblersprachprogramm auf dem 65C02 um 10 bis 15 Prozent kleiner gemacht werden kann und eine ähnliche Leistungsverbesserung erzielt wird, hauptsächlich durch vermiedene Speicherzugriffe durch die Verwendung von weniger Befehlen, um eine bestimmte Aufgabe zu erfüllen.

Undokumentierte Anweisungen entfernt

Der ursprüngliche 6502 hatte 56 Befehle, die in Kombination mit verschiedenen Adressierungsmodi insgesamt 151 Opcodes der möglichen 256 8-Bit-Opcode-Muster erzeugten . Die verbleibenden 105 ungenutzten Opcodes waren undefiniert, wobei der Satz von Codes mit niederwertigen 4-Bits mit 3, 7, B oder F vollständig ungenutzt blieb, wobei der Code mit niederwertiger 2 nur einen einzigen Opcode hatte.

Der 6502 war berühmt dafür, dass einige dieser übrig gebliebenen Codes tatsächlich Aktionen ausführen. Aufgrund der Arbeitsweise des Befehlsdecoders des 6502 würde das einfache Setzen bestimmter Bits im Opcode dazu führen, dass Teile der Befehlsverarbeitung stattfinden. Einige dieser Opcodes ließen den Prozessor sofort zum Absturz bringen, während andere nützliche Funktionen ausführten und sogar von Benutzern mit inoffiziellen Assembler-Mnemoniken versehen wurden.

Der 65C02 fügte eine Reihe neuer Opcodes hinzu, die eine Reihe dieser zuvor "undokumentierten Befehls"-Slots verbrauchten, zum Beispiel wurde jetzt $FF für den neuen BBSBefehl verwendet (siehe unten). Diejenigen, die wirklich ungenutzt blieben, sollten NOPs ausführen . Programme, die diese Codes nutzten, funktionieren auf dem 65C02 nicht, aber diese Codes wurden immer als nicht betriebsbereit dokumentiert und hätten nicht verwendet werden dürfen.

Fehlerbehebung

Der ursprüngliche 6502 hatte bei seiner Einführung mehrere Errata. Frühere Versionen des Prozessors hatten einen defekten RORBefehl (nach rechts drehen), wodurch das Problem der MOS-Technologie behoben wurde, indem der Befehl nicht dokumentiert wurde. RORwurde sehr früh im Produktionslauf behoben und war für die allermeisten Maschinen, die den Prozessor verwenden, kein Problem.

Ein notorischer Fehler, der in allen NMOS-Varianten des 6502 vorhanden ist, betrifft dagegen den Sprungbefehl ( JMP) bei Verwendung der indirekten Adressierung . In diesem Adressierungsmodus wird die Zieladresse des JMPBefehls aus dem Speicher (dem Sprungvektor) geholt, anstatt ein Operand für den JMPBefehl zu sein. Zum Beispiel JMP ($1234)würde der Wert in den Speicherplätzen 1234 (niederwertiges Byte) und 1235 (höchstwertiges Byte) abgerufen und diese Werte in den Programmzähler geladen , was dann den Prozessor veranlassen würde, die Ausführung an der im Sprungvektor gespeicherten Adresse fortzusetzen.

Der Fehler tritt auf, wenn die Vektoradresse auf $FF endet, was die Grenze einer Speicherseite ist . In diesem Fall JMPwird das höchstwertige Byte der Zieladresse von $00 der Originalseite und nicht von $00 der neuen Seite abgerufen. Daher JMP ($12FF)würde das niedrigstwertige Byte der Zieladresse bei $12FF und das höchstwertige Byte der Zieladresse bei $1200 statt $1300 erhalten. Der 65C02 hat dieses Problem behoben.

Eher ein Versehen als ein Fehler, der Zustand des (D)ecimal-Flags im Statusregister des NMOS 6502 ist nach einem Reset oder Interrupt undefiniert . Dies bedeutet, dass Programmierer das Flag auf einen bekannten Wert setzen müssen, um Fehler im Zusammenhang mit arithmetischen Operationen zu vermeiden. Als Ergebnis findet man eine CLDAnweisung (CLear Decimal) in fast allen 6502 Interrupt- Handlern sowie früh im Reset-Code. Der 65C02 löscht dieses Flag automatisch, nachdem er das Statusregister als Reaktion auf einen beliebigen Interrupt oder als Reaktion auf einen Hardware-Reset auf den Stapel geschoben hat, wodurch der Prozessor wieder in den binären arithmetischen Modus versetzt wird.

Während der Arithmetik im Dezimalmodus aktualisiert der NMOS 6502 die Flags (N)egative, o(V)erflow und (Z)ero, um das Ergebnis der zugrunde liegenden binären Arithmetik widerzuspiegeln, d. h. die Flags spiegeln ein vor dem Prozessor berechnetes Ergebnis wider Dezimalkorrektur durchführen. Im Gegensatz dazu setzt der 65C02 diese Flags entsprechend dem Ergebnis der Dezimalarithmetik auf Kosten eines zusätzlichen Taktzyklus pro Rechenbefehl.

Wenn eine Lese-Modifizier-Schreib (RMW) Befehl ausführt, wie Varianten alle NMOS einen Doppelschreib auf tun addr , zuerst den aktuellen Wert bei gefunden Umschreiben addr und dann den geänderten Wert zu schreiben. Dieses Verhalten kann zu schwer zu behebenden Fehlern führen, wenn es sich bei addr um ein Hardwareregister handelt. Der 65C02 führt stattdessen einen doppelten Lesevorgang von addr durch , gefolgt von einem einzelnen Schreibvorgang. INC addr

Wenn beim Durchführen einer indizierten Adressierung die Indizierung eine Seitengrenze überschreitet, werden alle NMOS-Varianten von einer ungültigen Adresse lesen, bevor auf die richtige Adresse zugegriffen wird. Wie bei einem RMW-Befehl kann dieses Verhalten beim Zugriff auf Hardware-Register über Indizierung zu Problemen führen. Der 65C02 hat dieses Problem behoben, indem er einen Dummy-Lesen des Befehls-Opcodes durchführte, wenn die Indizierung eine Seitengrenze überschreitet. Mit diesem Fix wurde jedoch ein neuer Fehler eingeführt, der auftritt, wenn sich die Basisadresse an einer geraden Seitengrenze befindet (was bedeutet, dass die Indizierung niemals in die nächste Seite übergeht). Mit dem neuen Fehler wird vor der Indizierung ein Dummy-Lesevorgang an der Basisadresse durchgeführt, so dass LDA $1200,Xein Dummy-Lesevorgang auf $1200 durchgeführt wird, bevor der Wert von X zu $1200 addiert wird. Auch hier kann dieser Fehler bei der Indizierung auf Hardware-Registeradressen zu undefiniertem Verhalten führen.

Wenn ein NMOS 6502 einen BRK-Opcode (Software-Interrupt) holt, während gleichzeitig ein Hardware-Interrupt auftritt, wird BRK ignoriert, da der Prozessor auf den Interrupt reagiert. Das 65C02 handhabt diese Situation korrekt, indem es den Interrupt bedient und dann BRK ausführt.

Neue Adressierungsmodi

Der 6502 verfügt über zwei indirekte Adressierungsmodi, die über 16-Bit-Adressen, die in Seite Null gespeichert sind, dereferenzieren:

  • Indiziert indirekt, zB LDA ($10,X)fügt das X-Register zu der gegebenen Seitennulladresse hinzu, bevor der 16-Bit-Vektor gelesen wird. Wenn X beispielsweise 5 ist, liest es die 16-Bit-Adresse von der Position 15/$16. Dies ist nützlich, wenn auf Seite Null ein Array von Zeigern vorhanden ist.
  • Indirekt indiziert LDA ($10),Yfügt das Y-Register zu dem 16-Bit-Vektor hinzu, der von der gegebenen Seite-Null-Adresse gelesen wird. Wenn Y beispielsweise 5 ist und $10/$11 den Vektor $1000 enthält, wird der Wert von $1005 gelesen. Dies führt eine Zeiger-Offset-Adressierung durch.

Ein Nachteil dieses Modells besteht darin, dass, wenn keine Indizierung erforderlich ist, eines der Indexregister immer noch auf Null gesetzt und in einem dieser Befehle verwendet werden muss. Der 65C02 fügte LDA ($10)allen Befehlen, die indizierte indirekte und indirekt indizierte Modi verwendeten, einen nicht indizierten indirekten Adressierungsmodus hinzu , wodurch die Indexregister freigegeben wurden.

Der 6502- JMPBefehl hatte einen (unter den 6502-Befehlen) einzigartigen Adressierungsmodus, der als "absolut indirekt" bekannt ist und einen 16-Bit-Wert von einer gegebenen Speicheradresse liest und dann zu der Adresse in diesem 16-Bit-Wert springt. Wenn beispielsweise die Speicherstelle $A000 $34 enthält und $A001 $12 enthält, JMP ($A000)würde diese beiden Bytes gelesen, der Wert 1234 gebildet und dann zu dieser Stelle gesprungen.

Eine übliche Verwendung für die indirekte Adressierung besteht darin, Verzweigungstabellen zu erstellen , eine Liste von Einstiegspunkten für Unterprogramme , auf die über einen Index zugegriffen werden kann. Zum Beispiel kann ein Gerätetreiber könnte listet die Einstiegspunkte für OPEN, CLOSE, READ, usw. in einer Tabelle an den A000 $. READist der dritte Eintrag, null indiziert, und jede Adresse erfordert 16 Bits, also READwürde man etwas Ähnliches verwenden, um einen aufzurufen JMP ($A004). Wenn der Treiber aktualisiert wird und der Unterroutinencode in den Speicher verschoben wird, funktioniert jeder vorhandene Code noch, solange die Zeigertabelle bei $A000 bleibt.

Der 65C02 fügte den neuen Modus "indiziert absolut indirekt" hinzu, der die Verwendung von Verzweigungstabellen erleichtert. Dieser Modus addierte den Wert des X-Registers zur absoluten Adresse und nahm die 16-Bit-Adresse von der resultierenden Stelle. Um beispielsweise auf die READFunktion aus der obigen Tabelle zuzugreifen , würde man 4 in X speichern, dann JMP ($A000,X). Diese Art des Zugriffs macht den Zugriff auf Verzweigungstabellen einfacher, da eine einzelne Basisadresse in Verbindung mit einem 8-Bit-Offset verwendet wird.

Neue und geänderte Anleitungen

Neben den neuen Adressierungsmodi hat das "Basismodell" 65C02 auch eine Reihe neuer Befehle hinzugefügt.

  • INCund DECohne Parameter jetzt den Akkumulator inkrementieren oder dekrementieren. Dies war ein seltsames Versehen im ursprünglichen Befehlssatz, der nur INX/ DEX, INY/ DEYund / enthielt . Einige Assembler verwenden die alternativen Formen / oder / .INC addrDEC addrINADEAINC ADEC A
  • STZ addr, SPEICHERN Null in Adr . Ersetzt die Notwendigkeit und erfordert keine Änderung des Wertes des Akkumulators. Da diese Aufgabe in den meisten Programmen üblich ist, kann die Verwendung von STZ die Codegröße reduzieren, indem sowohl der LDA als auch jeglicher Code eliminiert wird, der zum Speichern des Werts des Akkumulators benötigt wird, normalerweise ein Paar.LDA #0;STA addrPHA PLA
  • PHX, PLX, PHY, PLY, schieben und ziehen Sie die X- und Y-Register zum/vom Stapel. Bisher verfügten nur der Akkumulator und das Statusregister über Push- und Pull-Befehle. X und Y könnten nur gestapelt werden, indem man sie zuerst mit TXAoder in den Akkumulator verschiebt TYA, dadurch den Akkumulatorinhalt ändert und dann mit PHA.
  • BRA, Filiale immer. Funktioniert wie a JMP, verwendet aber wie andere Zweige eine 1-Byte-Relativadresse, wodurch ein Byte gespart wird. Die Geschwindigkeit ist oft dieselbe wie beim absoluten 3-Zyklus, es JMPsei denn, eine Seite wird überquert, was den BRAZyklus der Version 1 länger machen würde (4 Zyklen). Da die Adresse relativ ist, ist sie auch beim Schreiben von verschiebbarem Code nützlich, eine übliche Aufgabe in der Ära vor Speicherverwaltungseinheiten .

Anweisungen zur Bit-Manipulation

Sowohl WDC als auch Rockwell trugen zu Verbesserungen der Bit-Test- und Manipulationsfunktionen im 65C02 bei. WDC fügte dem im 6502 vorhandenen BIT-Befehl neue Adressierungsmodi hinzu, sowie zwei neue Befehle für die bequeme Manipulation von Bitfeldern, eine häufige Aktivität in Gerätetreibern.

BIT im 65C02 fügt den Sofortmodus hinzu, eine durch X indizierte Nullseite und eine durch X-Adressierung absolut indizierte. Die Direktmodus-Adressierung ist insofern besonders praktisch, als sie vollständig zerstörungsfrei ist. Zum Beispiel:

LDA <registrieren>
BIT #%00010000

kann verwendet werden anstelle von:

LDA <registrieren>
UND #%00010000

Ersteres behält den aus <register> geladenen Wert bei, sodass mehr als ein Test damit durchgeführt werden kann. Die letztere Sequenz ist für den Registerwert destruktiv.

Zusätzlich zu den Verbesserungen des BIT-Befehls hat WDC zwei Befehle hinzugefügt, die entwickelt wurden, um Bitfelder bequem zu manipulieren:

  • TSB addrund , T est und S et B its und T est und R eset B seine.TRB addr
Eine Maske im Akkumulator ( .A) wird logisch mit dem Speicher bei addr UND-verknüpft , wobei die Stelle eine Nullseite oder absolut sein kann. Das Z-Flag im Statusregister wird entsprechend dem Ergebnis des logischen UND konditioniert – andere Statusregister-Flags werden nicht beeinflusst. Weiterhin werden Bits in addr entsprechend der Maske in gesetzt (TSB) oder gelöscht (TRB) .A. Kurz gesagt, TSB führt ein logisches ODER nach dem logischen UND durch und speichert das Ergebnis des logischen ODER bei addr , während TRB die Ergebnisse des logischen UND bei addr speichert . In beiden Fällen zeigt das Z-Flag im Statusregister das Ergebnis an, bevor der Inhalt von addr geändert wird. TRB und TSB ersetzen somit eine Folge von Befehlen, die im Wesentlichen den BIT-Befehl mit zusätzlichen Schritten zum Speichern der rechnerischen Änderungen kombinieren, jedoch auf eine Weise, die den Status des betroffenen Werts meldet, bevor er geändert wird..A AND addr

Rockwells Änderungen fügten weitere Bitmanipulationsbefehle hinzu, um jedes Bit direkt zu setzen und zu testen und das Testen, Löschen und Verzweigen in einem einzigen Opcode zu kombinieren. Die neuen Anweisungen waren von Anfang an in der R65C00-Familie von Rockwell verfügbar, waren jedoch nicht Teil der ursprünglichen 65C02-Spezifikation und wurden nicht in Versionen von WDC oder seinen anderen Lizenznehmern gefunden. Diese wurden später wieder in das Basisdesign kopiert und waren in späteren WDC-Versionen verfügbar.

Rockwell-spezifische Anweisungen sind:

  • SMBbit# zp/ . Bitnummer bit# im Nullseitenbyte zp setzen oder zurücksetzen (löschen) .RMBbit# zp
RMB und SMB werden verwendet, um einzelne Bits in einem Bitfeld zu löschen (RMB) oder zu setzen (SMB), die jeweils eine Folge von drei Befehlen ersetzen. Da RMB und SMB nur eine Nullseitenadressierung sind, sind diese Befehle in ihrer Nützlichkeit begrenzt und sind hauptsächlich in Systemen von Wert, in denen Geräteregister in einer Nullseite vorhanden sind. Die Bit# -Komponente des Befehls wird oft als Teil der Mnemonik geschrieben, die beispielsweise SMB1 $12Bit 1 in der Nullseitenadresse $12 setzt. Einige Assembler behandeln bit# als Teil des Operanden des Befehls, zB , was den Vorteil hat, dass es durch einen Variablennamen oder eine berechnete Zahl ersetzt werden kann.SMB 1,$12
  • BBR bit#,offset,addrund , Verzweigung bei Bit-Setzen/-Rücksetzen.BBS bit#,offset,addr
Dieselbe Zero-Page-Adressierung und Einschränkungen wie RMB und SMB, aber Verzweigung zur Adresse, wenn das ausgewählte Bit gelöscht (BBR) oder gesetzt (BBS) ist. Wie bei RMB und SMB ersetzen BBR und BBS eine Folge von drei Befehlen.

Energiesparmodi

Zusätzlich zu den oben genannten neuen Befehlen hat WDC auch die Anweisungen STPund WAIzur Unterstützung von Energiesparmodi hinzugefügt .

STP, Stoppen Sie den Prozessor, hielt die gesamte Verarbeitung an, bis ein Hardware-Reset ausgegeben wurde. Dies könnte verwendet werden, um ein System in den "Schlafmodus" zu versetzen und es dann mit einem Reset schnell aufzuwecken. Normalerweise würde dies ein externes System erfordern, um den Hauptspeicher aufrechtzuerhalten, und es war nicht weit verbreitet.

WAIEs hatte einen ähnlichen Effekt, indem es in den Low-Power-Modus wechselte, aber dieser Befehl weckte den Prozessor beim Empfang eines Interrupts wieder auf. Früher umfasste die Behandlung eines Interrupts im Allgemeinen das Ausführen einer Schleife, um zu überprüfen, ob ein Interrupt empfangen wurde, manchmal auch als " Spinning " bekannt, das Überprüfen des Typs beim Empfangen und das Springen zum Verarbeitungscode. Dies bedeutete, dass der Prozessor während des gesamten Prozesses lief.

Im Gegensatz dazu könnte beim 65C02 Interrupt-Code geschrieben werden, indem ein WAIunmittelbar gefolgt von einem JSRoder JMPan den Handler gesendet wird. Als das WAIaufgetreten ist, wurde die Verarbeitung gestoppt und der Prozessor ging in den Energiesparmodus. Als der Interrupt empfangen wurde, verarbeitete er JSRdie Anfrage sofort und bearbeitete sie.

Dies hatte den zusätzlichen Vorteil, dass die Leistung leicht verbessert wurde. Im Spinning-Fall könnte der Interrupt mitten in einem der Befehle der Schleife ankommen, und um ihm zu ermöglichen, nach der Rückkehr vom Handler neu zu starten, verbringt der Prozessor einen Zyklus, um seine Position zu speichern. Mit WAItritt der Prozessor an einer bekannten Stelle in den Niedrigleistungszustand ein, wo garantiert alle Befehle abgeschlossen sind, so dass, wenn der Interrupt ankommt, er unmöglich einen Befehl unterbrechen kann und der Prozessor sicher fortfahren kann, ohne einen Zyklussparzustand zu verbringen.

65SC02

Der 65 SC 02 ist eine Variante des WDC 65C02 ohne Bitbefehle.

Bemerkenswerte Anwendungen des 65C02

Heimcomputer

Videospielkonsolen

Andere Produkte

Siehe auch

Anmerkungen

Verweise

Zitate

Literaturverzeichnis

Weiterlesen

Externe Links