6502 Basico – Registros

El 6502 es muy simple, es un micro de 8 bits, tiene 40 y pico de instrucciones, puede direccionar hasta 64K, tiene 3 registros internos (un acumulador y dos de uso general)… no hay demasiado que decir. En el ejemplo anterior hicimos un programita simple, al que vamos a ampliar con un poco de teoria.

Registros

Tenemos 3 registros internos, la ventaja que tienen es que son de uso inmediato, la desventaja es que son pocos 😦
Vamos a explicar como funciona el acumulador, que es el mas importante a mi parecer de los 3. Los otros dos registros tienen otras aplicaciones, que ya iremos viendo.

A (acumulador)

Maneja toda la aritmetica y logica, cualquier operacion de suma y resta la tendremos que hacer con este registro, asi como tambien las operaciones logicas (AND, OR, NOT). Las 2 principales instrucciones para utilizar este registro son LDA y STA, la primera carga en el acumulador, y la segunda almacena el contenido del acumulador donde indiquemos.

Aqui tenemos una tablita con los modos de direccionamiento (ya veremos de que se tratan) y la sintaxis.

LDA STA
Direccionamiento Sintaxis Direccionamiento Sintaxis
Immediate LDA #$44 Zero Page STA $44
Zero Page LDA $44 Zero Page,X STA $44,X
Zero Page,X LDA $44,X Absolute STA $4400
Absolute LDA $4400 Absolute,X STA $4400,X
Absolute,X LDA $4400,X Absolute,Y STA $4400,Y
Absolute,Y LDA $4400,Y Indirect,X STA ($44,X)
Indirect,X LDA ($44,X) Indirect,Y STA ($44),Y
Indirect,Y LDA ($44),Y

Modos de direccionamiento

Immediate: el mas basico, lo que quiere decir es que el operando que le pongamos se cargará en el acumulador. Notar que antes del 44 hay dos simbolos: # y $, el primero indica que es inmediato, el segundo que es un valor hexadecimal. Es la asignacion de variables de toda la vida que tenemos en cualquier otro lenguaje de alto nivel.

Zero Page: esto ya es mas raro, carga en A el contenido que se encuentre en la memoria, en la direccion que le pasamos. ¿Por que es Zero Page? porque hace referencia a los primeros 256 bytes de memoria, conocida como la pagina cero. El 6502 tiene estas instrucciones Zero Page debido a que consumen menos memoria y ciclos de clock, asi que si necesitamos optimizar codigo, es bueno utilizarlas, siempre teniendo en cuenta que contaremos con 256 para manejar, nada mas.

Absolute: lo mismo que Zero Page, pero pudiendo utilizar toda la memoria. Obviamente, la instruccion ocupa mas en memoria, porque el operando es de 16 bits, y tambien consume mas ciclos de reloj.

Modos indexados absolutos y zero page: son aquellos que se adiciona ,X ,Y. Lo que hacen es adicionar al valor que le pasamos como operando el valor del registro (X o Y). Este modo es util cuando queremos copiar bloques de datos, cadenas, manejar arreglos, etc. Despues son lo mismo que los anteriores, absolutos o zero page.

Indirecto X, Indirecto Y: son mas complicados de utilizar que los anteriores, se basan en que el operando que le pasamos contiene el byte bajo, y la siguiente el alto de la direccion que apunta, ademas del indice X o Y. Como pueden ver en la sintaxis difieren, es porque segun el registro que utilicemos se realiza el calculo de una u otra forma. Como de momento no voy a utilizar este direccionamiento (y tampoco lo tengo tan claro como para explicarlo, je), les paso un enlace donde esta explicado mas detalladamente: Assembly in one step

NOTA INTERESANTE (encontrado en el link anterior):

   Indexed Indirect Addressing

   Find the 16-bit address starting at the given location plus the 
   current X register.  The value is the contents of that address.  For 
   example,

      LDA ($B4,X)  where X contains 6

   gives an address of $B4 + 6 = $BA.  If $BA and $BB contain $12 and 
   $EE respectively, then the final address is $EE12.  The value at 
   location $EE12 is put in the accumulator.

   Indirect Indexed Addressing

   Find the 16-bit address contained in the given location ( and the one 
   following).  Add to that address the contents of the Y register.  
   Fetch the value stored at that address.  For example,

      LDA ($B4),Y  where Y contains 6

   If $B4 contains $EE and $B5 contains $12 then the value at memory 
   location $12EE + Y (6) = $12F4 is fetched and put in the accumulator.

NOTA: es importante tener claro como funcionan los diferentes modos de direccionamiento, tanto para programar como para optimizar codigo. Algunas instrucciones tienen menos modos, otras creo que mas (no estoy seguro). Los registros auxiliares, por ejemplo, tienen modos distintos entre ellos, o sea que lo que podes hacer con X no lo podes hacer con Y…

Para mas informacion podes ir aqui, para una lista completa de los opcodes del 6502.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s