6502 Códigos opcionales no documentados

Basado en el Atari 8-bit 6502C (CO14806)
Versión 3.1, 28/6/1999 Por Freddy Offenga


Esta versión es una continuación directa de la lista de códigos opcionales no documentados (opcodes ilegales) de Joakim Atterhal (WosFilm) y mía que se publicó en la revista de discos de 8 bits de Atari llamada Mega Magazine número 6. La mayoría de los opcode en esta lista se originó a partir de un desensamblador para el Atari (The Symbolic Disassembler por HiasSoft).



1. La CPU Atari de 8 bits


De hecho hay dos versiones personalizadas del 6502 para el Atari. El 6502 personalizado CO14377 es el primero que probablemente sólo se utiliza en algunos de los primeros Atari 400/800. La 6502C personalizada CO14806 se utiliza en todos los modelos Atari de 8 bits (400/800/XL/XE y XEGS).

2. Créditos


  • Joakim Atterhal
  • Adam Vardy
  • Craig Taylor

3. Referencias


  1. Illegal opcodes, WosFilm y Frankenstein, Mega Magazine nº 2, diciembre de 1991.
  2. Illegal opcodes v2, WosFilm y Frankenstein, Mega Magazine nº 6, octubre de 1993.
  3. Illegal Opcodes der 65xx-CPU, Frank Leiprecht, ABBUC Sondermagazin 10, Top-Magazin Oktober 1991.
  4. Erg «nzung zu den Illegalen OP-Codes, Peter W «tzel, Top-Magazin Januar 1992.
  5. 6502 Opcodes and Quasi-Opcodes, Craig Taylor, 1992.
  6. Extra Instructions Of The 65XX Series CPU, Adam Vardy, 27 Sept. 1996.

4. Cambios desde la versión 2.0


La versión 2.0 fue comparada con dos listas basadas en Commodore 8-bit encontradas en internet. Había algunas diferencias en los nombres de los opcodes, así que incluí los otros nombres también.


  • Los nombres entre paréntesis son los nombres tomados de la lista compilada por Craig Taylor.
  • Los nombres entre corchetes son los tomados de la lista de Adam Vardy.
  • La antigua lista también se comparó con otras dos listas basadas en Atari 8-bit (de Frank Leiprecht y Peter W «tzel). No se encontró nada nuevo en estas listas.
  • Los valores de tiempo (ciclos de reloj) de todos los opcodes fueron comparados con los valores de la lista de Adam Vardy. No hubo diferencias.
  • Los modos de direccionamiento para las instrucciones «DOP» (double nop) y «TOP» se copiaron de la lista de Craig Taylor. La razón es que los diferentes modos de direccionamiento explican las diferencias en los valores de temporización.
  • Se eliminó el opcode $8B de la tabla «AAX». El comportamiento de este opcode parece ser comlex (como señalaron varias personas).
  • Tal vez haya más información en la próxima versión de este documento. Por ahora este opcode se llama «XAA».
  • El modo de direccionamiento para el opcode $A3 (LAX) era falso en la lista anterior. Se ha cambiado a (indirecto,x).
  • Los modos de direccionamiento para los opcodes $13 y $03 (SLO) estaban cambiados. Corregido en esta versión.
  • El modo de direccionamiento para el opcode $B7 (LAX) era «página-cero,x», pero debería ser «página-cero,y». Corregido.
  • Cambiado el sospechoso opcode $93. Este se llamaba «DOP», pero en realidad es otra instrucción «AXA».
  • Probado el comportamiento de $9E (SXA), $9C (SYA) y $9B (XAS).
  • Allí el AND estático con 7 mencionado en la lista antigua era falso.
  • La observación de la función «AND con el byte alto del argumento + 1» (de la lista de Adam Vardy) parece ser correcta.

5. Códigos opcionales


En la versión 2.1 se añade una sección sobre las dos CPU's Atari personalizadas 'quizás diferentes'. Se necesita más información :


Opc : Opcode en hexadecimal.
Sz : Tamaño en bytes.
n : Número de ciclos de reloj.
* : Añade un ciclo cuando se cruza el límite de página.

5.1. AAC (ANC) [ANC]


AND byte con acumulador. Si el resultado es negativo, se establece el acarreo.
Banderas de estado: N,Z,C.


DireccionamientoMnemónicosOpcSzn
InmediatoAAC #arg$0B22
InmediatoAAC #arg$2B22

5.2. AAX (SAX) [AXS]


Registro AND X con acumulador y almacenamiento del resultado en memoria.
Banderas de estado: N,Z


DireccionamientoMnemónicos OpcSz n
Página ceroAAX arg$87 23
Página cero,YAAX arg,Y$9724
(Indirecto,X)AAX (arg,X)$8326
AbsolutoAAX arg$8F34

5.3. ARR (ARR) [ARR]


AND byte con acumulador, luego girar un bit a la derecha en acumulador y comprobar bit 5 y 6:
Si ambos bits son 1: fija C, borra V.
Si ambos bits son 0: borra C y V.
Si sólo el bit 5 es 1: activa V, desactiva C.
Si sólo el bit 6 es 1: poner C y V.
Banderas de estado: N,V,Z,C.


Direccionamiento Mnemónicos OpcSz n
InmediatoARR #arg $6B22

5.4. ASR (ASR) [ALR]


AND byte con acumulador, luego desplazar un bit a la derecha en el acumulador.
Banderas de estado: N,Z,C.


Direccionamiento Mnemónicos OpcSz n
InmediatoASR #arg$4B22

5.5. ATX (LXA) [OAL]


AND byte con acumulador, luego transfiere el acumulador al registro X.
Banderas de estado: N,Z.


DireccionamientoMnemónicosOpcSzn
InmediatoATX #arg$AB22

5.6. AXA (SHA) [AXA]


AND registro X con acumulador luego AND resultado con 7 y almacenar en memoria.
Banderas de estado: -


DireccionamientoMnemónicosOpcSzn
Absoluto,YAXA arg,Y$9F35
(Indirecto),YAXA arg$9326

5.7. AXS (SBX) [SAX]


Suma el registro X con el acumulador y almacena el resultado en el registro X, luego resta el byte del registro X (sin préstamo).
Banderas de estado: N,Z,C


DireccionamientoMnemónicosOpcSzn
InmediatoAXS #arg$CB22

5.8. DCP (DCP) [DCM]


Resta 1 de la memoria (sin préstamo).
Banderas de estado: C.


DireccionamientoMnemónicosOpcSzn
Página ceroDCP arg$C725
Página cero,XDCP arg,X$D726
Absoluto DCP arg $CF36
Absoluto,XDCP arg,X$DF37
Absoluto,YDCP arg,Y$DB37
(Indirecto,X)DCP (arg,X)$C328
(Indirecto),YDCP (arg),Y$D328

5.9. DOP (NOP) [SKB]


Ninguna operación (doble NOP). El argumento no tiene significado.
Banderas de estado: -


Direccionamiento Mnemónicos OpcSzn
Página cero DOP arg $04 2 3
Página cero,X DOP arg,X $14 2 4
Página cero,X DOP arg,X $34 2 4
Página cero DOP arg $44 2 3
Página cero,X DOP arg,X 54$ 2 4
Página cero DOP arg $64 2 3
Página cero,X DOP arg,X $74 2 4
Inmediato DOP #arg $80 2 2
Inmediato DOP #arg $82 2 2
Inmediato DOP #arg $89 2 2
Inmediato DOP #arg $C2 2 2
Página cero,X DOP arg,X $D4 2 4
Inmediato DOP #arg $E2 2 2
Página cero,X DOP arg,X $F4 2 4

5.10. ISC (ISB) [INS]


Aumenta la memoria en uno, luego resta memoria del acumulador (con préstamo).
Banderas de estado: N,V,Z,C.


Direccionamiento Mnemónicos OpcSz n
Página cero ISC arg $E7 2 5
Página cero,X ISC arg,X $F7 2 6
Absoluto ISC arg $EF 3 6
Absoluto,X ISC arg,X $FF 3 7
Absoluto,Y ISC arg,Y $FB 3 7
(Indirecto,X)ISC (arg,X)$E3 2 8
(Indirecto),YISC (arg),Y$F3 2 8

5.11. KIL (JAM) [HLT]


Parada del contador de programa (bloqueo del procesador).
Banderas de estado: -


DireccionamientoMnemónicosOpcSzn
ImplícitoKIL$021-
ImplícitoKIL$121-
ImplícitoKIL$221-
ImplícitoKIL$321-
ImplícitoKIL$421-
ImplícitoKIL$521-
ImplícitoKIL$621-
ImplícitoKIL$721-
ImplícitoKIL$921-
ImplícitoKIL$B21-
ImplícitoKIL$D21-
ImplícitoKIL$F21-

5.12. LAR (LAE) [LAS]


AND memoria con puntero de pila, transfiere resultado a acumulador, registro X y puntero de pila.
Banderas de estado: N,Z.


DireccionamientoMnemónicosOpcSzn
Absoluto,YLAR arg,Y$BB34 *

5.13. LAX (LAX) [LAX]


Carga el acumulador y el registro X con memoria.
Banderas de estado: N,Z.


DireccionamientoMnemónicosOpcSzn
Página ceroLAX arg $A723
Página cero,YLAX arg,Y$B724
AbsolutoLAX arg $AF34
Absoluto,YLAX arg,Y$BF34 *
(Indirecto,X)LAX (arg,X)$A326
(Indirecto),YLAX (arg),Y$B32 5 *

5.14. NOP (NOP) [NOP]


Sin operación
Indicadores de estado: -


DireccionamientoMnemónicos OpcSz n
ImplícitoNOP$1A12
ImplícitoNOP$3A12
ImplícitoNOP$5A12
ImplícitoNOP$7A12
ImplícitoNOP$DA12
ImplícitoNOP$FA12

5.15. RLA (RLA) [RLA]


Gira un bit a la izquierda en memoria, luego AND acumulador con memoria.
Banderas de estado: N,Z,C.


DireccionamientoMnemónicosOpcSzn
Página ceroRLA arg$2725
Página cero,XRLA arg,X$3726
AbsolutoRLA arg$2F36
Absoluto,XRLA arg,X$3F37
Absoluto,YRLA arg,Y$3B37
(Indirecto,X)RLA (arg,X)$2328
(Indirecto),YRLA (arg),Y$3328

5.16. RRA (RRA) [RRA]


Gira un bit a la derecha en la memoria, luego suma la memoria al acumulador (con acarreo).
Banderas de estado: N,V,Z,C.


DireccionamientoMnemónicosOpcSzn
Página ceroRRA arg$6725
Página cero,XRRA arg,X$7726
AbsolutoRRA arg$6F36
Absoluto,XRRA arg,X$7F37
Absoluto,YRRA arg,Y$7B37
(Indirecto,X)RRA (arg,X)$6328
(Indirecto),YRRA (arg),Y$7328

5.17. SBC (SBC) [SBC]


Igual que el opcode legal $E9 (SBC #byte)
Banderas de estado: N,V,Z,C.


DireccionamientoMnemónicosOpcSzn
InmediatoSBC #byte$EB22

5.18. SLO (SLO) [ASO]


Desplazar un bit a la izquierda en memoria, luego OR acumulador con memoria.
Banderas de estado: N,Z,C.


DireccionamientoMnemónicosOpcSzn
Página ceroSLO arg $0725
Página cero,X SLO arg,X $1726
Absoluto SLO arg $0F36
Absoluto,X SLO arg,X $1F37
Absoluto,Y SLO arg,Y $1B37
(Indirecto,X)SLO (arg,X)$0328
(Indirecto),YSLO (arg),Y$1328

5.19. SRE (SRE) [LSE]


Desplazar un bit a la derecha en memoria, luego EOR acumulador con memoria.
Banderas de estado: N,Z,C.


DireccionamientoMnemónicosOpcSzn
Página ceroSRE arg$4725
Página cero,XSRE arg,X$5726
AbsolutoSRE arg$4F36
Absoluto,XSRE arg,X$5F37
Absoluto,YSRE arg,Y$5B37
(Indirecto,X)SRE (arg,X)$4328
(Indirecto),YSRE (arg),Y$5328

5.20. SXA (SHX) [XAS]


AND el registro X con el byte alto de la dirección destino del argumento +1. Almacenar el resultado en memoria.
M = X AND ALTO(arg) +1
Banderas de estado: -


DireccionamientoMnemónicosOpcSzn
Absoluto,YSXA arg,Y$9E35

5.21. SYA (SHY) [SAY]


AND el registro Y con el byte alto de la dirección de destino del argumento +1. Almacenar el resultado en memoria.
M = Y AND ALTO(arg) + 1
Banderas de estado: -


DireccionamientoMnemónicosOpcSzn
Absoluto,XSYA arg,X$9C35

5.22. TOP (NOP) [SKW]


Ninguna operación (triple NOP). El argumento no tiene significado.
Banderas de estado: -


DireccionamientoMnemónicosOpcSzn
AbsolutoTOP arg$0C34
Absoluto,XTOP arg,X$1C34 *
Absoluto,XTOP arg,X$3C34 *
Absoluto,XTOP arg,X$5C34 *
Absoluto,XTOP arg,X$7C34 *
Absoluto,XTOP arg,X$DC34 *
Absoluto,XTOP arg,X$FC34 *

5.23. XAA (ANE) [XAA]


Operación exacta desconocida. Lea los documentos referenciados para más información y observaciones.


DireccionamientoMnemónicosOpcSzn
InmediatoXAA #arg$8B22

5.24. XAS (SHS) [TAS]


AND el registro X con el acumulador y almacena el resultado en el puntero de pila, luego AND el puntero de pila con el byte alto de la dirección de destino del argumento + 1. Almacena el resultado en memoria. Almacenar el resultado en memoria.
S = X AND A, M = S AND HIGH(arg) + 1
Banderas de estado: -


Direccionamiento MnemónicosOpcSzn
Absoluto,YXAS arg,Y$9B35