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)
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.
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. |
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. |
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 ^^.