Abro este hilo ya que en otro hilo se me ha faltado al respeto inventándose cosas sobre mí que nunca he dicho y lanzando acusaciones de plagio... ¿Y todo por qué? Porque se me ocurrió discutirle a cierto usuario una información que leyó en la wikipedia y que interpretó mal por lo que parece.
El caso que nos centra es el del micro SPC700 que es el procesador de audio de la SNES y el micro 6502, que fue usado, a parte de en algunos ordenadores famosos de 8 bits, por la aclamada NES. Según la
wikipedia:
The Sony SPC700[3] is the S-SMP's integrated 8-bit processing core manufactured by Sony with an instruction set similar to that of the MOS Technology 6502 (as used in the Commodore 1541 diskette drive and the Vic 20, Apple II, BBC Micro and in modified form in the original NES).
The SPC700 instruction set is quite similar to that of the 6502 microprocessor family, but includes many additional instructions, such as XCN (eXChange Nibble), which swaps the upper and lower 4-bit portions of the 8-bit accumulator, and an 8-by-8-to-16-bit multiply instruction. Sony also re-mapped all the opcode values (eg. 00h no longer is BRK, A9h no longer is LDA) and renamed the opcode mnemonics in their assembler (eg. TXY becomes "MOV x,y")[4].
En ningún momento se dice que el SP700 sea un 6502 como se comenta en
este hilo.No, si los de Sony seguro que se enfadan si de alguna manera un producto suyo no parece tan original, pero lo que es, es, y lo siento pero la cpu integrada en el SPC700 es un 6502 pero de cajón, aunque no le quieran llamar.
Lo primero de todo es que el micro 6502 es de MOS Technology, una compañía que nada tiene que ver con Sony; dudo mucho que quisieran vender la IP del microprocesador a Sony para que estos se forraran vendiendo el SPC700 en millones de consolas SNES. Pero aun así, esto no es definitivo, ya que por giros del destino, parte de la arquitectura llegó a manos de Wester Digital para hacer su 65C816 compatible con el 6502.
Las diferencias reales vienen en la arquitectura. Primero de todo, os pongo dos enlaces para los que tengáis interés en estos micros:
Juego de instrucciones 6502Juego de instrucciones SPC700Añado el juego de instrucciones de la versión NMOS, aunque las diferencias no son relevantes para este caso:
Juego de instrucciones 6502 (NMOS)La primera gran diferencia viene en los modos de direccionamiento:
Para el 6502 tenemos estos:
A .... Accumulator OPC A operand is AC
[b]abs .... absolute [/b] OPC $HHLL operand is address $HHLL
[b]abs,X .... absolute, X-indexed[/b] OPC $HHLL,X operand is address incremented by X with carry
[b]abs,Y .... absolute, Y-indexed[/b] OPC $HHLL,Y operand is address incremented by Y with carry
[b]# .... immediate[/b] OPC #$BB operand is byte (BB)
[b]impl .... implied[/b] OPC operand implied
[b]ind .... indirect [/b] OPC ($HHLL) operand is effective address; effective address is value of address
[b]X,ind .... X-indexed, indirect [/b] OPC ($BB,X) operand is effective zeropage address; effective address is byte (BB) incremented by X without carry
[b]ind,Y .... indirect, Y-indexed[/b] OPC ($LL),Y operand is effective address incremented by Y with carry; effective address is word at zeropage address
[b]rel .... relative[/b] OPC $BB branch target is PC + offset (BB), bit 7 signifies negative offset
[b]zpg .... zeropage[/b] OPC $LL operand is of address; address hibyte = zero ($00xx)
[b]zpg,X .... zeropage, X-indexed[/b] OPC $LL,X operand is address incremented by X; address hibyte = zero ($00xx); no page transition
[b]zpg,Y .... zeropage, Y-indexed[/b] OPC $LL,Y operand is address incremented by Y; address hibyte = zero ($00xx); no page transition
Para el SPC700 tenemos estos:
Accumulator
Absolute
Absolute (R-M-W)
[i][b]Absolute Indexed Indirect[/b][/i] (parecido al X-indexed, indirect del 6502, pero aquí es con dirección absoluta y no con dirección en Zeropage)
Absolute, X
Absolute, Y
Direct (que es el ZeroPage en el 6502)
Direct (R-M-W)
Direct Immediate (que es el #immediate del 6502)
[b][i]Direct Indexed Indirect[/i][/b]
Relative (que es el relative del 6502)
Direct, X
Direct, X (R-M-W)
Direct, Y
[b][i]Indirect (x) [/i][/b](en el 6502 sólo se puede indirecta con el registro Y indexado)
Indirect (x)+
Implied
[b][i]Bit[/i][/b] (que es la gran novedad del SPC700, manipulación directa de bits al estilo de microcontroladores)
[b][i]Stack s[/i][/b]
Como veis, no son iguales, de hecho el SPC700 tiene más modos de direccionamiento, que son los marcados en negrita y cursiva. Además, tiene otros modos de direccionamiento combinados como Direct Relative, Indirect Indirect y demás que son específicos de una serie de instrucciones que no equivalen a ninguna del 6502.
Esta diferencia implica que el control del pipeline para obtener los datos de cada modo de direccionamiento es diferente entre los dos micros.Pero además, podemos seguir viendo diferencias en el timing de las instrucciones. Por ejemplo, si miramos las instrucción Add With Carry (ADC), tenemos para el 6502:
zeropage ADC oper 65 2 3
Donde vemos que la operación de suma con la página directa dura 3 ciclos siempre.
En el SPC700:
6a. Direct dp
ADC, AND, CMP, EOR, MOV, OR, SBC
14 OpCodes, 2 bytes, 3 and 4 cycles
La operación dura 4 ciclos si hay un cilo de escritura. Esto es importante porque el SPC700 añade un ciclo extra a ciertas instrucciones cuando se ha de escribir. El 6502 añade ese ciclo extra por ejemplo cuando pasas el boundary de una página, pero no en los ciclos de escritura.
Esta diferencia es bastante importante porque implica que los ciclos de IO no son iguales, y son asimétricos en el caso del SPC700.Además, podemo seguir comparando timings; por ejemplo de la instrucción BCC (Branch if Carry Clear); para el 6502 tenemos:
relative BCC oper 90 2 2**
Donde vemos que la instrucción dura 3 ciclos si el salto es en la misma página y 4 si ocurre en otra página directa diferente.
Para el SPC700 tenemos:
19a. Relative rel
BCC, BCS, BEQ, BMI, BNE, BPL, BRA,
BVC, BVS
9 OpCodes, 2 bytes, 2 and 4 cycles
Vemos que la instrucción dura 2 ciclos si el salto no se realiza y 4 si el salto se realiza, independientemente de la página donde ocurra éste.
Esta diferencia también es muy importante puesto que cambia la gestión del Delay Slot cuando se toma un salto condicional. El SPC700 vacía el pipeline de ejecución si se tiene que saltar a otro Program Counter, por eso toma 2 ciclos extra, cosa que no hace el 6502, que sólo toma unos ciclos extra si la página es diferente, puesto que hay que sumar el byte alto para obtener la dirección final (por cierto, algo muy típico de procesadores RISC, ahora alguien dirá que yo he dicho que el 6502 es un microprocesador RISC, pero no lo he dicho

).
Y luego hay más diferencias que son más obvias en cuando al juego de instrucciones, de algunas que no existe en el 6502 y sí en el SPC700 (TCALL, PCALL, DBNZ, CBNE, las de gestión de flags...), o que cada instrucción está codificada de forma diferente. Esto también es importante, porque quiere decir que
la etapa de Instruction Decode es completamente diferente, y por tanto ni tan siquiera comparten unidad microcableada o microcontrolada (depende de lo que tenga cada uno).Si veis alguna cosa en la que me he equivocado comentármelo, que muchas de las cosas que he puesto las he recordado al vuelo y otras las he ido mirando entre los datasheets y otra información que tengo de ambos chips.
Y espero que quede claro ya por fin que ambos son dos microprocesadores diferentes con alguna similitud en el juego de instrucciones como bien dice la página en inglés de Wikipedia, pero no son el mismo micro ni por asomo.
¡Saludos!