# WDC 65C02

Il WDC 65C02 è un microprocessore ad 8 bit prodotto nel 1982 da Western Design Center (WDC) come evoluzione in tecnologia CMOS del popolare 6502 di MOS Technology, realizzato in tecnologia NMOS. Il processore, nel corso degli anni, è stato prodotto su licenza anche da National Cash Register (NCR), GTE, Rockwell, Synertek e Sanyo.
Il 65C02 fu progettato da Bill Mensch dopo che questi lasciò MOS Technology nel 1976 per fondare WDC (1978). Attualmente il chip continua ad essere prodotto e venduto da WDC.

## Informazioni generali

Il nome completo del processore è W65C02S: la lettera "W" indica il produttore (WDC); la lettera "C" indica che il processore è una versione CMOS del 6502; la lettera "S" indica che il componente ha un core completamente statico, ossia che il clock principale può essere rallentato indefinitamente fino a fermarlo completamente, sia nello stato alto che in quello basso.
Il W65C02S ha un'architettura interna ad 8 bit e può indirizzare fino a 65.536 locazioni di memoria (spazio di indirizzamento a 16 bit). Grazie alla die di dimensioni ridotte ed al set di istruzioni di lunghezza variabile, il processore è indicato per applicazioni di tipo SoC (System on a Chip).
WDC fornisce anche il sorgente Verilog del core del 65C02 per la programmazione di integrati ASIC e FPGA.

### Caratteristiche tecniche principali

* package: PLCC44 o DIP40
* bus dati ad 8 bit
* bus indirizzi a 16 bit (fornisce uno spazio di indirizzamento di 64 kB)
* Unità aritmetica e logica (ALU) ad 8 bit
* registri ad 8 bit:
** accumulatore
** puntatore di stack
** registri indice
** registro di stato
* Program counter a 16 bit
* 69 istruzioni, implementate con 212 opcode
* 16 modalità di indirizzamento, inclusa l'indirizzamento in "pagina zero"
* istruzioni per il risparmio energetico: WAI ("WAit-for-Interrupt") e STP ("SToP") riducono il consumo di energia, diminuiscono la latenza degli interrupt e permettono la sincronizzazione con eventi esterni
* tensione di alimentazione: da 1,8 a 5,00 Volt (tolleranza ±5%)
* consumo energetico: 0,15 e 1,5 mA per MHz, rispettivamente a 1,89 e 5,25 V
* frequenza di clock: da 2 MHz (1,8 V) a 14 MHz (5,0 V)*
    * il valore massimo è indicativo, dato che i dati tecnici forniti da WDC indicano che il chip può operare anche a clock superiori (18 MHz a 4,5 V)

## Differenze rispetto al 6502
### Istruzioni

Il 65C02 condivide con il suo predecessore l'architettura ad 8 bit delle istruzioni e l'indirizzamento della memoria a 16 bit aggiungendo però alcune migliorie, tra cui gli opcode per inserire e togliere dallo stack i registri "X" e "Y". Gli opcode non definiti presenti nel set di istruzioni del 6502 sono stati convertiti in operazioni NOP ("NO Operation"), di lunghezza diversa.
Il 65C02 risolve anche il bug sull'istruzione di salto indiretto JMP indirizzo che affligge il 6502: tale istruzione non funziona correttamente se il byte basso dell'indirizzo contiene il valore $FF (quindi con tutti gli indirizzi $xxFF). L'istruzione è stata migliorata ampliandola con il supporto al registro X (JMP (indirizzo,X)) permettendo l'implementazione di una semplice tabella di salti.
Il 65C02 introduce anche istruzioni per la manipolazione dei singoli bit (RMB, SMB, BBR and BBS), la cui assenza nel 6502 ha limitato la diffusione di software quali quelli per la compressione dei dati.

### Registro di stato

Altri problemi del 6502 risolti nella versione CMOS di WDC sono quelli relativi al registro di stato, che contiene 8 singoli flag che possono essere impostati a 1 oppure a 0. Tali impostazioni possono avvenire sia come risultato di un'operazione aritmetica o di manipolazione dei bit sia tramite codice.
Significato dei flag di stato del 6502: :
| N | -- | risultato negativo |
| V | -- | overflow di un'operazione |
| 1 | -- | Non definito (sempre impostato a 1) |
| B | -- | Flag di "break" (impostato dall'istruzione BRK) |
| D | -- | Modalità BCD (aritmetica decimale) attiva |
| I | -- | Richiesta di interrupt (IRQ) disabilitata |
| Z | -- | Risultato dell'operazione uguale a zero |
| C | -- | Flag di resto di un'operazione |
In tutte le versioni NMOS del 6502 il flag decimale "D" non è inizializzato correttamente dopo un reset o quando viene eseguito un interrupt, per cui si possono avere comportamenti anomali del software. Il 65C02 sistema questo bug forzando a 0 il flag "D" dopo un reset o al momento dell'inizio del trattamento di un interrupt. Il 6502 ha, inoltre, un altro bug che affligge il flag "N", che non viene influenzato dalle operazioni in modalità BCD: anche in questo caso il 65C02 risolve il problema, al costo di un ciclo di clock aggiuntivo nel tempo di esecuzione del codice.

## 65SC02 e derivati

Il 65SC02 è un processore derivato dal 65C02 rispetto al quale si differenzia per alcune istruzioni aggiuntive: non è chiaro chi fu il progettista originale del chip, anche se in commercio era distribuito da GTE. Dal 65SC02 derivano l'Hudson HuC6280, usato nella console TurboGrafx-16, ed il 65CE02, utilizzato nel microcontrollore CSG 4510 del prototipo di computer Commodore 65.

## Impieghi
### Home computer

* Apple IIc - versione compatta dell'Apple II (1,023 MHz)
* Apple Enhanced IIe (1,023 MHz)
* BBC Master, computer didattico prodotto da Acorn Computers (65SC12 a 2 MHz con un 65C102 a 4 MHz come coprocessore)
* Replica 1 di Briel Computers, un clone dell'Apple I (1 MHz)
* Laser 128, una linea di cloni dell'Apple II

### Console giochi

* Atari Lynx (65SC02 a 4 MHz)
* TurboGrafx-16, alias PC Engine (Hudson HuC6280 a 1,78 MHz e 7,16 MHz)
* GameKing, palmare di Time Top (6 MHz)
* Watara Supervision, palmare (65SC02 a 4 MHz)

### Altri prodotti

* Scheda acceleratrice "TurboMaster" per il Commodore 64 (65C02 a 4,09 MHz)
* molti computer dedicati al gioco degli scacchi come "Mephisto MMV", "Novag Super Constellation", "Fidelity Elite" ed altri (da 4 a 20 MHz)