CURSO de ASM 6502 [NES]

Instrucciones básicas

Por DaRKWiZaRDX

¡Hola! ^^ Aquí toy de nuevo xD... Ahora vamos a estudiar (aunque probablemente no te hará falta estudiar, se aprenden solas xD) algunas de las instrucciones más importantes del 6502 (todas son importantes, pero estas las usarás más :P)

INSTRUCCIONES QUE ACTÚAN SOBRE EL ACUMULADOR

INSTRUCCIÓN

EJEMPLO

DESCRIPCIÓN

LDA LDA #$14 Carga el valor en el acumulador, si el valor tiene un $ antes significa que se trata de un valor hexadecimal (casi siempre :P).
Cuando hay un # (numeral) significa que estamos cargando un valor constante, si no está significa que estamos cargando el valor que está dentro de ese offset.
En el ejemplo estamos cargando el valor $14, si no estuviera el # estaríamos cargando lo que haya dentro del offset $14 en memoria.
STA STA $2112 Guarda el valor contenido en A en el offset del operando.

 

ASL ASL A (*) Gira todos los bits de A una vez a la izquierda, y pone el bit más significativo (el que está más a la izquierda) en el flag de carry, y el bit menos significativo (el de más a la derecha) pasará a ser 0. Esto es equivalente a multiplicar por 2
LSR LSR A (*) Gira todos los bits de A una vez a la derecha, y pone el bit menos significativo (el que está más a la derecha) en el flag de carry, y el bit más significativo (el de más a la izquierda) pasará a ser 0. Esto es equivalente a dividir por 2
PHA PHA Mete A en la pila (mira la sección de la pila para más detalles).
PLA PLA Saca el último valor puesto en la pila y lo coloca en A.
AND AND #$80 Hace un AND lógico entre A y el operando.
ORA ORA #$80 Hace un OR lógico entre A y el operando.
EOR EOR #$80 Hace un XOR lógico entre A y el operando.
ROR ROR (*) Similar a LSR, la única diferencia es que en lugar de poner el bit más significativo a 0 lo pone al valor del carry.
ROL ROL (*) Similar a ASL, la única diferencia es que en lugar de poner el bit menos significativo a 0 lo pone a lo que haya en el carry.
SBC SBC #$15 Resta un valor del acumulador, según cómo resulte la resta se "setearán" o "resetearán" algunos flags del registro P. En la sección de branches y saltos veremos esto con más detalles.
ADC ADC #$15 Suma un valor al acumulador, según cómo resulte la suma se "setearán" o "resetearán" algunos flags del registro P. En la sección de branches y saltos veremos esto con más detalles.

(*) Algunos ensambladores piden que especifiques A como operando. Por ejemplo: LSR A (ya que LSR puede usarse sobre direcciones de memoria también, no sólo sobre el acumulador) mientras que otros asumirán que un LSR sin operandos actúa sobre A.

INSTRUCCIONES QUE ACTÚAN SOBRE Y y/o X

INSTRUCCIÓN

EJEMPLO

DESCRIPCIÓN

LDX LDX #$14 Como un LDA, pero actúa sobre X.
LDY LDY #$14 Como un LDA, pero actúa sobre Y.
STX STX $1248 Guarda en valor contenido en X en el offset del operando (como STA).
STY STY $1248 Guarda en valor contenido en Y en el offset del operando (como STA).
INX INX Incrementa X por 1.
INY INY Incrementa Y por 1.
DEX DEX Decrementa X por 1.
DEY DEY Decrementa Y por 1.

TRANSFERENCIAS

INSTRUCCIÓN

EJEMPLO

DESCRIPCIÓN

TAX TAX Transfiere A a X.
TAY TAY Transfiere A a Y.
TXA TXA Transfiere X a A.
TYA TYA Transfiere Y a A.

OTRAS INSTRUCCIONES:

INSTRUCCIÓN

EJEMPLO

DESCRIPCIÓN

SEC SEC Pone el Carry a 1. Hay que poner el carry a 1 antes de hacer una resta.
CLC CLC Pone el Carry a 0. Hay que poner el carry a 0 antes de hacer una suma.
SEI SEI Pone el flag de interrupción a 1.
CLI CLI Pone el flag de interrupción a 0.
CLV CLV Pone el flag de desbordamiento (overflow) a 0.
NOP NOP No hace nada ¬¬ Útil para anular rutinas.

Aclaro un poco el funcionamiento de SBC y ADC. La ecuación real que se hace es:

ADC -> A = A + operando + carry (por eso hay que poner el carry a 0 antes de hacer una suma).

SBC -> A = A - operando + 1 - carry (por eso al poner el carry a 0 se nulifica el +1)

¡Oops! Por ahí lei también que la operación del SBC es A = A - operando - 1 + carry, pero bueno, lo importante es que hay que poner el carry a 1 para hacer una resta y ponerlo a 0 para hacer una suma.

También están las instrucciones de control de flujo del programa, que nos permitirán controlar qué código debe ejecutarse y qué no, pero esas las veremos con más detalle en la sección de saltos y branches ^^. Pero por ahora seguiremos con lo más básico, lo que nos lleva a la siguiente sección, la pila ^^.

<< Anterior - Siguiente >>