Mos Technology INC MCS6502 Instruction Set

Avatar de Usuario
minter
Mensajes: 1357
Registrado: 22 Jul 2014 18:51
Agradecido : 581 veces
Agradecimiento recibido: 288 veces

Mos Technology INC MCS6502 Instruction Set

Mensajepor minter » 19 Nov 2017 11:18

Buenas,

Después de la charla de gacaffe, a alguno le habrá entrado la curiosidad con el 6502.
No voy a explicar que es el MOS6502, porque gacaffe ya lo ha hecho en su charla y con sus transparencias.

Así que...
Estoy rescatando unos simuladores de 6502 empleados en la escuela. Aún no se como funciona uno de ellos (tengo los apuntes en otra casa), pero lo subo por si alguien quiere probarlo.
6502 Simulador 1.JPG
6502 Simulador 1.JPG (53.15 KiB) Visto 430 veces


También he rescatado otro simulador, que al disponer de ayuda, se pueden hacer mas cosas.
6502 Simulador 2.JPG
6502 Simulador 2.JPG (56.57 KiB) Visto 430 veces


Además, como para programar, hay que saber lo que se escribe, adjunto las referencias rápidas de programación, por si alguien quiere imprimir en A4 y las tiene a mano mientras programa.

Bueno, hay que tener en cuenta que el 6502 dispone de unos registros, donde se realizan las operaciones e instrucciones.¿El resto? No es mas que memoria. Todo el bacalao se reparte en unos pocos lugares.
Registros 6502.JPG
Registros 6502.JPG (31.12 KiB) Visto 430 veces


Bueno, con esta información, yo creo que los que tengan curiosidad por cacharrear en ensamblador con el 6502, están de enhorabuena. No hay que crear un juego, ni una aplicación para saber ensamblador. Y libros... a patadas disponéis para poder agarrar un ejemplo de sumar dos bytes, crear una mascara, multiplicar o comparar...

Por ejemplo:

Código: Seleccionar todo

Programa que suma sin signo los contenidos de las direcciones 00A0h y 00A1h y guarda el resultado en la posiciones 00B0h y 00B1h.

            ORG  0000h
INICIO:     LDA  0A0h       ;Carga el primer operando
            CLC             ;Borra el Carry
            ADC  0A1h       ;Suma a A el contenido de 00A1h
            STA  0B0h       ;Almacena el byte bajo del resultado
            BCC  NOCARRY    ;Salta a NOCARRY si C=0
            LDA  #01        ;Carga 1 en A
            STA  0B1h       ;Almacena el byte alto (el acarreo)
            JMP  FIN       
NOCARRY:    LDA  #00h       ;Si no hay acarreo, byte alto a cero
            STA  0B1h       
FIN:        NOP
            END  INICIO


Salud!
Adjuntos
6502 Set reference Card.rar
(2.46 MiB) Descargado 7 veces
6502ARJ.rar
(166.64 KiB) Descargado 7 veces

Avatar de Usuario
Silicebit
Mensajes: 1326
Registrado: 16 May 2011 21:13
Ubicación: La buhardilla del silicio.
Agradecido : 30 veces
Agradecimiento recibido: 78 veces
Contactar:

Re: Mos Technology INC MCS6502 Instruction Set

Mensajepor Silicebit » 19 Nov 2017 12:05

Hasta el propio Oricutron, Euphoric y creo que VICE tienen un simulador de 6502 con ejecución paso a paso.

Oricutron.png
Oricutron.png (105.79 KiB) Visto 420 veces
El 6809 es el Rolls-Royce de los 8bits, el 6502 es el Mercedes, y el Z80 el SEAT 850. Sorry, but... I think different. :-P -0r1c -m3s3x -t4nd1 -cbmja YouTube

Avatar de Usuario
minter
Mensajes: 1357
Registrado: 22 Jul 2014 18:51
Agradecido : 581 veces
Agradecimiento recibido: 288 veces

Re: Mos Technology INC MCS6502 Instruction Set

Mensajepor minter » 19 Nov 2017 12:40

Que bueno! no sabía lo del oricium.
Aunque mi objetivo era centrarme únicamente en el micro procesador, no el micro orientado en la máquina huésped, que de eso debe de haber tanto como micros, con sus particularidades.
Mis primeros pasos con el 6502 fueron con el Hesmon bajo C64 y con un AIM65, pero en las escuelas nos enseñaban sobre micro básico.
He recopilado información de los micros más típicos y quiero ponerme al día. 6502,8088,Z80,6800,68000... y ponerme como objetivo el hacer cosas sencillas sin orientarme en ningún equipo en partícular.
Pero si no hago un post... seguro que no acabo haciendo nada. Así me obligo. -507

Avatar de Usuario
Chema
Mensajes: 1549
Registrado: 21 Jun 2012 20:13
Ubicación: Gijón
Agradecido : 463 veces
Agradecimiento recibido: 188 veces
Contactar:

Re: Mos Technology INC MCS6502 Instruction Set

Mensajepor Chema » 19 Nov 2017 13:57

Ahem un apunte.
Oricium-» Mi juego de naves
Oricutron-» El emulador de -0r1c

Me pasa por no pensarme los nombres dos veces -banghead

Avatar de Usuario
minter
Mensajes: 1357
Registrado: 22 Jul 2014 18:51
Agradecido : 581 veces
Agradecimiento recibido: 288 veces

Re: Mos Technology INC MCS6502 Instruction Set

Mensajepor minter » 19 Nov 2017 16:01

jo! no puedo corregir desde el móvil, pero tomo nota. XD
Es que se me mezclan los nombres.

Avatar de Usuario
Chema
Mensajes: 1549
Registrado: 21 Jun 2012 20:13
Ubicación: Gijón
Agradecido : 463 veces
Agradecimiento recibido: 188 veces
Contactar:

Re: Mos Technology INC MCS6502 Instruction Set

Mensajepor Chema » 19 Nov 2017 17:12

A ti y a mucha otra gente XD ya te digo.

Me pareció gracioso lo de Oricium, pero creo que fue una metedura de pata...

Como el nombrecito de «oricutron» que solo suena un poco mejor que el que tenía originalmente el emulador y que era «Oriculator» :)

BlackHole
Mensajes: 698
Registrado: 03 Ago 2011 23:07
Agradecido : 1 vez
Agradecimiento recibido: 37 veces

Re: Mos Technology INC MCS6502 Instruction Set

Mensajepor BlackHole » 20 Nov 2017 01:48

Mi primer contacto tardío con el ensamblador de 6502, allá por 1988 (si mi memoria no me juega una mala pasada) ya fue con el monitor que incluía el cartucho Action Replay 4.
Hoy en día, el emulador VICE x64 incorpora un excelente monitor de 6502 (en realidad 6510) para poder cacharrear con la máquina.
La diferencia entre el 6502 y el 6510 es que éste último incorpora líneas I/O extras para paginar y despaginar las 3 ROMs que usa el Commodore 64.

Avatar de Usuario
minter
Mensajes: 1357
Registrado: 22 Jul 2014 18:51
Agradecido : 581 veces
Agradecimiento recibido: 288 veces

Re: Mos Technology INC MCS6502 Instruction Set

Mensajepor minter » 21 Nov 2017 19:00

Holas!

Como siempre se empieza a hablar de código máquina ,pero siempre se queda a medias por pereza... he transcrito parte del curso de código máquina de la Commodore World.

Explica como funcionan las rutinas y sus modos de uso. He completado un poco con algún ejemplo.

Así que... a leer un poco!!! -grin

DIRECCIONAMIENTO INMEDIATO

El operando de la instrucción está situado justo detrás de la propia instrucción, por lo que no requiere acceder a mas posiciones de memoria.

Ejemplo:

LDA #2 que quiere decir carga en el acumulador el valor de 2.
ADC #5Bh suma al acumulador el número 5Bh

DIRECCIONAMIENTO ABSOLUTO

Se ponen detrás de la instrucción dos bytes que apuntan a la posición de memoria donde se encuentra el dato.
Ejemplo:

LDA $1000

Carga en el acumulador lo que contenga en la posición $1000


DIRECCCIONAMIENTO EN ACUMULADOR

Esta forma de direccionamiento utiliza instrucciones de un solo byte, no necesita especificar la dirección donde se encuentra el operando ya que se trata del propio acumulador.
Solo un tipo de instrucciones lo utilizan: Las de rotación y desplazamiento.
Las instrucciones de desplazamiento equivalen a multiplicar o dividir por dos el contenido del registro A, dependiendo de que el desplazamiento sea a la izq. o a la der.

Ejemplo:

ROL A
Rota el contenido del acumulador a la izquierda. Que sería como multiplicar por 2. Y 2 en binario es 10. Ósea, como si multiplicáramos por 10 un número binario.
El contenido del acarreo también rota con el acumulador. Entra su valor en el bit de menos peso y su valor es sustituido por el bit de mayor peso del Acumulador.


DIRECCIONAMIENTO IMPLICITO

Las instrucciones que lo utilizan también son de un solo byte. Pues como su nombre indica, el operando va implícito en la instrucción.

Por ejemplo:

INX significa Incrementar el registro índice X.
TAX pasa el dato que hay en el acumulador A, al registro X


DIRECCIONAMIENTO INDIRECTO ABSOLUTO

Solo existe una instrucción que lo utiliza, es la de salto indirecto, los dos bytes que siguen a la instrucción apuntan a una posición de memoria donde se encuentra un vector (otros dos bytes) que es el que realmente indica la dirección a donde debe saltar un programa.

Ejemplo:

JMP 1000h

Salto incondicional a la dirección que forma el contenido de las direcciones 1000h (Byte bajo) 1001h (byte alto)
Si en 1000h hay 10h y en 1001h hay 20h, entonces saltaremos a la posición de memoria 2010h.

DIRECCIONAMIENTO EN PÁGINA CERO

Este modo de direccionamiento aumenta la velocidad de los programas en código maquina y ahorra memoria al acortar la longitud del programa.
Se trata de una versión recortada del modo de direccionamiento absoluto. En este último utilizábamos 3 bytes para cada instrucción (1 de instrucción y 2 de dirección de operando), que te teníamos que indicar a cualquiera de las 65536 posiciones de memoria, pero cuando lo hacemos a las primeras primera 256 el byte de mayor peso de la dirección es siempre cero y nuestra CPU está dotadas de otro potente medio de direccionamiento que permite omitir el byte alto, con esto se ahora uno de cada tres bytes y se incrementa la velocidad de ejecución al no tener que leer toda la dirección.

Antes:
STA $0033 era $8D $33 $00

y con este modo:
STA $33 es $85 $33... un byte menos!

DIRECCIONAMIENTO RELATIVO

Este modo de direccionamiento salta hacia delante o detrás desde el punto donde se ejecuta el programa.
Se salta cuando se cumple una condición determinada.

Ejemplo:

BEQ $02 (Branch of EQual) Salta si es igual a cero y salta $02, ósea, dos bytes hacia la siguiente instrucción.

Aquí tengo que decir que los saltos no hace falta calcularlos. (Si es igual.. sumo un byte, quito tres, me llevo una...) Para eso, cuando escribimos en mnemónicos, empleamos las etiquetas. Y cuando compilamos este programa a código máquina, ya se encarga el compilador en calcular esos saltos en función de las etiquetas que hemos puesto.

DIRECCIONAMIENTO PÁGINA CERO INDEXADO

Esta forma de direccionamiento es utilizada aprovechado los registros - índices X e Y, denominándose "Página cero, X" o "Página cero, Y", según el índice utilizado. Dado que se trata de un modo de direccionamiento en página cero, el contenido del segundo byte de la instrucción se suma al del registro-índice despreciando el acarreo y el resultado es la dirección en la página cero donde se encuentra el operando de la instrucción.

Ejemplo:

LDA 1Bh,X

Carga en el Acumulador el contenido de la dirección de memoria en página cero (los 256 primeros bytes) que resulta de sumar 1Bh más el registro X. Si X es Cero... pues cargaría en el Acumulador lo que está en la posición 001Bh.

DIRECCIONAMIENTO ABSOLUTO INDEXADO

Al igual que el anterior puede ser "Absoluto, X" o "Absoluto, Y", según el índice utilizado. La dirección de del operando se calcula sumando el contenido del índice a la dirección contenida en el segundo y tercer byte de la instrucción. Este modo de direccionamiento de muy utilizado por nuestros equipos para acceder a tablas de mensajes de deben salir a pantalla, valores que deben transferirse, etc.
Es muy util cuando debemos manejar en una rutina datos que ocupan posiciones de memoria consecutivas.

Ejemplo:

ADC 1000h,X

Suma al acumulador el contenido que hay en la posición de memoria resultado de sumar 1000h con el contenido del registro X (o también puede ser Y).
Si en X tengo 33h, pues entonces cargará en el Acumulador el contenido que hay en la posición de memoria (1000h + 33h) ósea, la posición de memoria 1033h.
Y si en 1033h hay FFh, pues cargará FF en el Acumulador.

DIRECCIONAMIENTO INDEXADO DIRECTO o PREINDEXADO

También se denomina Preindexado, ya que el segundo byte de la instrucción se suma al contenido del registro índice X despreciando el arrastre, la dirección en página cero a la que señala la suma contiene la parte baja y la siguiente la parte alta de las dirección real del operando.
Otra denominación utilizada es la de "Indirecto X"

Ejemplo:

LDA 10h,X

Carga en el acumulador el dato contenido en la dirección de memoria que sale de sumar 10h con el contenido del registro X. Pero en página cero y sin acarreo.
Si X es cero... pues carga en el Acumulador lo que está en la posición de memoria 0010h.
Si X es FFh... pues carga en el Acumulador lo que está en la posición 10h+FFh=10Fh, pero sin la 1. Osea, cargo lo contenido en 000fh
Siempre en página cero y solo con el registro X.

DIRECCIONAMIENTO INDIRECTO INDEXADO o POSTINDEXADO

Denominado también "Post-Indexado" o "(Indirecto), Y" el segundo byte de la instrucción señala a una posición en la página cero que contiene la parte baja de la dirección, la siguiente posición contiene la parte alta y a este vector se le suma el contenido del registro índice.
Y el resultado es la dirección real del operando.

Ejemplo:

LDA 20h, Y

Carga en el acumulador el dato contenido en la dirección obtenida de sumar el contenido del registro Y con el número que se guarda (de 16bits) en las direcciones 20h(bajo) y 21h (alto)

Si en Y tengo 08h
En 20h tengo 10h
En 21h tengo 15h...
Entonces suma lo que hay en la dirección 1510h con lo que hay en Y, y lo carga en el Acumulador.
Si en 1510h tengo 01h y se lo sumamos a Y, tendremos 08h + 01h = 09h y este valor aparecerá en el Acumulador.


Bueno... y estos son las maneras que se pueden emplear las instrucciones.

Luego, en las cartas de referencia rápida, se puede observar que pueden o no pueden hacer cada una de las instrucciones.

Esto es lo normal. Primero aprender a escribir... para luego ya ir haciendo redacciones y comentarios de texto.

Los Libros y Best Sellers se los dejamos para los gurus (sabéis quienes sois! -507)

Salud! -drinks

Avatar de Usuario
minter
Mensajes: 1357
Registrado: 22 Jul 2014 18:51
Agradecido : 581 veces
Agradecimiento recibido: 288 veces

Re: Mos Technology INC MCS6502 Instruction Set

Mensajepor minter » 22 Nov 2017 10:11

REGISTRO DE ESTADO o TAMBIÉN LLAMADO REGISTRO "P" DEL PROCESADOR

Este registro es donde se consulta al Micro que tal le ha sentado la cena. Si le duele la tripa. Si está cansado. Si está lleno... etc. -507

Cuando se realiza una operación o instrucción, dependiendo de su naturaleza, se producen efectos secundarios es este registro del tamaño de un byte.

En la guia rápida de instrucciones, hay una columna que indica que bits de ese registro se ven modificados en cada instrucción.

Estos son los Bits del registro de estado "P"

N V - B D I Z C

Siendo C el bit de menor peso (bit 0) y N el de mayor peso (bit 7)

Y ahora procedo a explicar donde le duele al paciente:

Empiezo por el de menor peso y vamos subiendo:

C - Bit de acarreo. Es cuando nos llevamos una.

Z - Bit de cero. Es cuando una operación nos da cero.

I - Bit de mascara de interrupción. Si está a 0, acepta las interrupciones. Si está a 1, no atiende las interrupciones

D - Modo decimal: Cuando está a 1, se realizan las operaciones en decimal o BCD en la ALU. A cero, realiza las operaciones en hexadecimal o binario.

B - Break: Indica si una interrupción ha sido realizada por el software, poniéndose a 1, o por la línea de IRQ por hardware, poniéndose a 0.

Rallita : Es un hueco la mar de majo que no sé para que vale, pero es el bit 5 (Eso si llamamos al 'C' bit 0 y a 'N' bit 7)

V - Desbordamiento: Con operaciones con signo, indica que el resultado de una operación no puede representarse mediante el número de bits dedicados.

Ejemplo: Si en una mano tengo 10 manzanas y en la otra mano tengo 12 peras... ¿Que es lo que tengo? Pues unas manos de la ostia!!!

N - El signo de la operación realizada, siendo 1, negativo y 0 positivo.

Pues ya está...

Ya sabemos que si damos patadas al 6502, tiene maneras muy interesantes de quejarse.

Saludos!!! -drinks

Avatar de Usuario
Chema
Mensajes: 1549
Registrado: 21 Jun 2012 20:13
Ubicación: Gijón
Agradecido : 463 veces
Agradecimiento recibido: 188 veces
Contactar:

Re: Mos Technology INC MCS6502 Instruction Set

Mensajepor Chema » 22 Nov 2017 12:34

XD Cómo mola... habrá que hacer un PDF cuando acabes, aunque sea sólo para partirse un rato leyéndolo...

Yo confieso que siempre encontré los modos de direccionamiento del 6502 infernales. De hecho paso de ellos, ni intento recordarlos. Normalmente en ensamblador (si es algo moderno) ayuda con la notación y basta con un par de reglas para recordarlo todo. Me las estoy medio-inventando en un hueco, espero no dejarme nada...
1- El 6502 tiene todo registros de 8 -bits: un acumulador A, dos registros índices X e Y, el puntero de pila SP (la pila va en una posición fija - $100, así que esto es un offset en una página de 256 bytes) y el registro de estado P. Sólo es de 16 bits el contador de programa PC. El registro afectado suele ir en el propio nemónico de la instrucción, como lda, ldx o txs

2- Hay instrucciones que operan sólo sobre registros . En el propio nemónico se indica (si no se pone nada, es sobre el Acumulador), así que tax pha tya rol lsr ror... Otras sobre banderas individuales, como sei clc o cld

3- Todo el mundo usa etiquetas en lugar de direcciones. Si una instrucción opera sobre una etiqueta o una dirección, se refiere al contenido de la misma lda $1234 carga en A lo que haya en la dirección $1234. Si la dirección está en página cero no se deben poner los ceros de delante (ej: $12, no $0012) y se usa ese modo de direccionamiento la instrucción ocupa menos y es más rápida.

4- Si queremos cargar un valor determinado, se pone el símbolo de número (también llamado almohadilla o, como dicen mis alumnos ahora, hashtag) lda #01 carga en A el valor 01. El parámetro solo puede ser de 1 byte. Si lo queremos poner en hexadecimal, se añade el símbolo $, lda #$ff

5- Los índices se pueden usar así: lda mitabla,x o lda mitabla,y que carga en A el contenido de la dirección mitabla+lo que contenga X o Y. Si mitabla vale $1000 y X $10, lda mitabla,x carga lo que haya en $1010. Se usan muchísimo para copiar trozos de memoria o acceder a tablas.

6- Se usan paréntesis para indicar indirecciones, es decir, el operando * del C para extraer el contenido de un puntero. Con los registros índices X e Y, el puntero tiene que ser una dirección de la página cero, para poder poner sólo un byte así: lda ($03),y o lda ($03,x). La primara opción saca la dirección de 16 bits contenida en $03 y $04 y accede Y bytes más allá. La segunda opción suma X primero y luego extrae la dirección: $03+x y $03+x+1. El primero se usa mucho para copiar zonas de memoria y la segunda para arrays con punteros.

Otro ejemplo: jmp $dead salta a la dirección $dead y jmp ($dead) extrae la dirección contenida en $dead y $dead+1 y salta allí.

7- Los saltos condicionales son las instrucciones de BRANCH y usan las banderas como condición beq, bcs,... Su operando es un desplazamiento de 8-bits con signo, así que no se puede saltar muy lejos (-128,+127). Todo el mundo usa etiquetas, pero si te vas muy lejos el ensamblador dará un error.

Quitando el hecho de que no todos los modos están disponibles para todas las instrucciones y que no todas operan con cualquier registro, el uso en el día a día con un buen ensamblador como el XA es muy sencillo, aunque leyendo los detalles técnicos parezca que no. Son poquitas instrucciones y te acostumbras a ellas enseguida. Yo todavía tengo que consultar de vez en cuando a ver si determinado modo existe, o el tiempo de ejecución de alguna (por ejemplo http://www.6502.org/tutorials/6502opcodes.html).

Por cierto: el error más común con mucho es querer cargar un registro con un valor, por ejemplo un uno, y hacer lda $01, que lo que hace es cargar A con el valor *contenido* en la dirección de página cero $01 (que puede ser cualquier cosa). Lo correcto es lda #$01.

Vaya, siento haber secuestrado un poco tu hilo, minter... te dejo con el curro que estabas haciendo, que está genial...

Avatar de Usuario
minter
Mensajes: 1357
Registrado: 22 Jul 2014 18:51
Agradecido : 581 veces
Agradecimiento recibido: 288 veces

Re: Mos Technology INC MCS6502 Instruction Set

Mensajepor minter » 22 Nov 2017 14:32

Chema escribió:Vaya, siento haber secuestrado un poco tu hilo, minter... te dejo con el curro que estabas haciendo, que está genial...


Que va, Chema!
Genial con tu ayuda!!! -thumbup

Me pillaste preparando la descripción de los registros. Aunque con lo que has dicho, aclara mogollón de cosas.

Esto lo escribo a modo de recordatorio. Me obligo a refrescar y aprender. Hay mucha información sobre programación, pero es que se meten algunos tutoriales en unos fregados... que enseguida tiras la toalla.
Así que estoy recopilando un poco de información y mascándola un poco.

Gracias! -thumbup

BlackHole
Mensajes: 698
Registrado: 03 Ago 2011 23:07
Agradecido : 1 vez
Agradecimiento recibido: 37 veces

Re: Mos Technology INC MCS6502 Instruction Set

Mensajepor BlackHole » 22 Nov 2017 23:45

Solo un pequeño inciso porque acabo de ver una ligera errata que me ha chirriado los dientes. Espero no te molestes, minter
Quería apuntar que si bien el opcode de STA para el direccionamiento absoluto es $8D, para el direccionamiento de página cero es $85 y no otra vez $8D
Obviamente ésta es la labor de los programas ensambladores: evitarte tener que recordar qué byte está detrás de cada instrucción real.

En algunos ensambladores, como el mutiplataforma WLA DX que uso desde hace 10 años, si quieres usar absoluto en posiciones de página cero (que obviamente se puede aunque malgastemos un byte mas) tienes que usar el sufijo .w (por "wide") para indicar que quieres la forma ancha, por si a la hora del preprocesado en el ensamblador o en la fase del linkado, hubiese inconsistencias en las etiquetas. Igualmente si programamos en 65816 (Apple IIGS, Super Nintendo) por si quieres usar posiciones en el banco $00 de los primeros 64 KB usando direccionamiento absoluto largo: STA $001234

Avatar de Usuario
minter
Mensajes: 1357
Registrado: 22 Jul 2014 18:51
Agradecido : 581 veces
Agradecimiento recibido: 288 veces

Re: Mos Technology INC MCS6502 Instruction Set

Mensajepor minter » 23 Nov 2017 08:14

BlackHole escribió:Solo un pequeño inciso porque acabo de ver una ligera errata que me ha chirriado los dientes. Espero no te molestes, minterQuería apuntar que si bien el opcode de STA para el direccionamiento absoluto es $8D, para el direccionamiento de página cero es $85 y no otra vez $8D


Corregido! -grin

Si, efectivamente se me coló la errata. Transcripción errónea mía. No lo vi. -banghead

Para nada me molestan las correcciones! Faltaría más! Siempre se agradecen. -thumbup
Y la información adicional también!!!

Avatar de Usuario
minter
Mensajes: 1357
Registrado: 22 Jul 2014 18:51
Agradecido : 581 veces
Agradecimiento recibido: 288 veces

Re: Mos Technology INC MCS6502 Instruction Set

Mensajepor minter » 23 Nov 2017 09:58

REGISTROS

Imagen

Muy interesante... unas fotocopias llenas de cuadraditos escritas en rúnico...
Unos programas que no me funcionan bajo Windows 10...
Unos direccionamientos que no los entiende ni el "Garmin Navigator"...
Unos registros de estado que registran...
Todo muy interesante, pero llevo un buen cacho hablando de Acumulador, registro X, Y, la pila... la batería, el bajo y la guitarra.

Bueno, pues al esquema puesto al principo me remito.
Y voy a intentar explicarme para que vale cada cosa, así voy entendiendo el funcionamiento.
Me lo voy a explicar con patitos. Es decir, como si estuvera en la cafetería con los amigos.
Así, si observáis que un concepto no lo tengo claro o el ejemplo es un sin sintido, pues lo comentamos y se modifica.
Disculpar que esto sea un poco infantil... pero esta es mi manera de comprenderlo. Son mis mnemónicos. -grin

Al lío...


ACUMULADOR

Este registro es nuestra calculadora, patio de recreo, nuestro papel en sucio...
Aquí realizamos operaciones del tipo lógico o pasos intermedios que no podemos realizar directamente sobre la memoria.
No se pueden hacer operaciones directamente sobre zonas de memoria, porque son solo un almacén.
Hay que cogerlas del almacén, meterlas en un sitio, jugar con ellas y el resultado, volverlo a dejar en memoria (el almacén).
Esto es debido a que los registros son los únicos lugares que disponen de las herramientas para realizar operaciones (electrónica en forma de lógica). Y como antes comente... la memoria es un mero almacén.

Ejemplo:
Tengo una tabla en una zona de memoria. Tengo un clavo en otra zona de memoria. Quiero clavarlas, pero no tengo herramientas.
Pues cojo la tabla... me la llevo al Acumulador (El taller), agarro el martillo (Instrucción) y con la otra mano, agarro el clavo que está almacenado en otro lado y le pego un martillazo.
Ahora tengo en el taller (Acumulador) una tabla con un clavo.

¿Me la quedo aquí? Bueno... si te gusta el resultado... puedes guardarlo en otra zona del almacén (Memoria)
Y si no lo guardas... pues se tira al cajón.

REGISTRO X

El registro mas usado comúnmente. Se emplea para saltos, cargar y grabar en memoria valores.

No puede hacer operaciones lógicas, pero sí se puede sumar y restar unidades.
Se emplea como contador de bucles, o direccionamientos indexados. Útil en tablas.

Es como jugar a la piñata y tener un amigo que te dice: A la derecha..., mas..., mas..., ZAS! Le has dado!
El que le da a la piñata... pues el único amigo que tiene el martillo, el Acumulador.
El registro X te va indicando, como un índice.

REGISTRO Y

Como el REGISTRO X, pero este es niña.

CONTADOR DE PROGRAMA PC (Program Counter)

Lo forman dos subregistros de 8 bits. PCL y PCH.
Es el índice de la memoria por donde va ejecutándose el programa. Por aquí ejecuta.... sigue...
Y también puedo saltar. Empieza a ejecutar por aca...

Vamos! Como un libro y su número de página.
¿Alquilen recuerda los libros de aventuras que dependiendo de tu decisión ibas a un lugar del libro u otro?
Pues esto es mi mismo. Vas leyendo hacia delante... pero igual tomas una decisión y debes de cambiar de página. Pues el contador de programa, lo mismo. Va para delante, hasta que nadie diga lo contrario.

Es un contador, ni mas ni menos. Pero podemos jugar con el.
Pero ojo. Este contador, mientras avanza... el micro va leyendo y ejecutando lo que se encuentra por delante.
Sin criterio. Si lee cosas coherentes, realizará tareas coherentes. Y seguirá.
Pero si lee cosas tontas... entonces puede entrar en barrena, quedar en bucle y lo que coloquialmente llamamos... "colgarse"


¿Y porque son dos bytes? Porque puede leer libros del tamaño de FFh FFh, que es... 65.535 posiciones de memoria.
O que es lo mismo... El microprocesador solo puede leer memorias de ese tamaño, de 64kb.

STACK POINTER o PUNTERO DE PILA

Este registro nos da una dirección, no un valor.
En este registro es donde te dice donde cuantas cosas tenemos apiladas en una cosa que se llama PILA (o bueno, lo que queda libre).

La PILA del 6502 es como una pila de platos. Ni dios los lava, pero ahí van quedando, un encima de otro.
Esto se llama PILA FILO o LIFO. El primero que entra, se queda abajo. Y es el último en salir. No se puede alterar el orden. No puede coger un dato del medio de la pila.
"Pasen.. pasen... que hay sitio al fondo..."

Y el último que entró en el bar, es el primero en salir. Y tu te quedas en el fondo, esperando a que salga todo el mundo para poder salir tú y respirar un poco.
La alegría dura poco, ya que te al salir, te pilla el paisano del Acumulador y te da un martillazo con un clavo. -507

La PILA, STACK empieza a contar desde el número más alto (FFh) y va descendiendo hasta llegar a cero.

Es decir, lo que tenemos en el STACK POINTER es la cantidad de planos que nos quedan por llenar la pila. Pero no nos dice lo que hay en cada plato. Eso lo sabremos únicamente cuando sacamos las cosas y las ponemos encima de la mesa del taller.

La pila la manejamos únicamente con cuatro instrucciones: PHA, PHP y PLA, PLP. Que es poner en la pila (Push) el contenido del Acumulador (A) o el estado (P) y sacar (Pop) los datos de vuelta al Acumulador (A) o al estado (P)

Y los datos se guardan desde la dirección 01FF a la 0100 (ver Memory Map de las guías rápidas)

El 6502 permite guardar 256 pilas de 256 posiciones. Pero inicialmente está en el segundo bloque de 256, encima de la página cero.

REGISTRO P o REGISTRO DE ESTADO

Ya estaba explicado anteriormente.

BlackHole
Mensajes: 698
Registrado: 03 Ago 2011 23:07
Agradecido : 1 vez
Agradecimiento recibido: 37 veces

Re: Mos Technology INC MCS6502 Instruction Set

Mensajepor BlackHole » 23 Nov 2017 14:20

Hahaha! Bueno, es una forma amena y divertida de explicar conceptos que más o menos son comunes a todos los procesadores existentes -507

Avatar de Usuario
minter
Mensajes: 1357
Registrado: 22 Jul 2014 18:51
Agradecido : 581 veces
Agradecimiento recibido: 288 veces

Re: Mos Technology INC MCS6502 Instruction Set

Mensajepor minter » 24 Nov 2017 18:20

Código: Seleccionar todo

            ORG  0000h
INICIO:     LDA  0A0h       ;Carga el primer operando
            CLC             ;Borra el Carry
            ADC  0A1h       ;Suma a A el contenido de 00A1h
            STA  0B0h       ;Almacena el byte bajo del resultado
            BCC  NOCARRY    ;Salta a NOCARRY si C=0
            LDA  #01        ;Carga 1 en A
            STA  0B1h       ;Almacena el byte alto (el acarreo)
            JMP  FIN       
NOCARRY:    LDA  #00h       ;Si no hay acarreo, byte alto a cero
            STA  0B1h       
FIN:        NOP
            END  INICIO


Vamos a explicar este sencillo programa antes indicado:

Este programa suma dos números que están en memoria y deja el resultado en otro punto de la memoria.

Un apunte:

Si sumamos dos número que no superan el valor 255 en decimal o FF en hexadecimal, nos vale un solo byte para guardar el resultado.

Pero si el valor de la suma de dos bytes es mayor a 255 o FF, entonces necesitaremos en segundo byte.

Bien, pero la suma mas grande que se puede realizar con dos bytes es FF+FF=1FE (255+255=510).
Por lo que unicamente emplearemos un bit del byte de otra posición de memoria para seguir representando los valores que van desde 100 a 1FE. Este byte lo llamaremos byte alto.

¿Como sabemos que esa suma es superior a FF? Pues cuando la realizamos, el registro C (de acarreo) nos dice que hubo acarreo.
Es decir: de la suma, me llevo una.

El programa hace eso:
Suma dos números. Que están en la posición de memoria A0 y A1.

El resultado que da en el Acumulador lo pone como byte bajo en B0.

Y si el resultado ha dado acarreo, pone en 1 el bit de menor peso del byte alto B1. Aunque lo hace a lo bestia, poniendo directamente el valor de todo el byte de mayor peso con el valor 1.

Y si no da acarreo, pone el bit de mayor peso B1 a cero . Pero también a lo bestia, pone a cero todo el byte alto.

Y fin!


Volver a “Lenguajes de Programación y herramientas Dev”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado