Motorola 68000 Introducción al micro y ASM

Avatar de Usuario
minter
Mensajes: 2227
Registrado: 22 Jul 2014 18:51
Agradecido : 1825 veces
Agradecimiento recibido: 788 veces

Motorola 68000 Introducción al micro y ASM

Mensajepor minter » 14 Mar 2019 12:32

Presentación:

En este hilo voy a comentar un poco como es la programación del Motorola 68000 desde el punto de vista de código máquina.
Escribiré de sus registros, instrucciones y modos de direccionamiento, sus modos de funcionamiento y pondré algún ejemplo sencillo de sumar peras con manzanas y mueve datos de un lugar a otro, que me molestan estos Bits aquí y me dan calor.

El micro Motorola lo desarrolló motorola allá por el año 1979 por recomendación de Jose María García, el del furbol.
Es un micro que tiene un (auto) Bus de datos de 16 plazas, aunque de pié entran 32. (bits)
Dispone de dos modos de funcionamiento; El modo usuario, para los patanes. Y modo supervisor, que puede ejecutar instrucciones que los patanes no pueden, acceder a zonas VIP de la memoria y esas cosas feas y peludas.

El 68000 se alimenta unicamente de +5V (Tensión estabilizada y pausterizada)

Dispone de un Bus de datos triestado de 23 bits (A1-A23).
Salidas FC0, FC1, FC2 que informan del estado del procesador.
Etc..etc.. Todo muy bonito!
Para luego!

Vamos a centrarnos en lo de dentro. Ya habrá tiempo para lo de fuera.

Veamos los registros del 68k

Registros M86k.jpg
Registros M86k.jpg (90.44 KiB) Visto 357 veces


REGISTRO DE ESTADO (SR)

El Registro de estado es donde están los FLAGS o BANDERAS que nos dicen que narices ha pasado después de realizar una determinada instrucción. Es como una madre, aunque no le digas nada, siempre se entera de lo que pasa.

Bien, este registro se llama SR (16 bits) y está compuesto, como casi todos, de las siguientes cositas:

El byte bajo de (SR) se denomina, Registro de Códigos de Condición - CCR y nos informa de los siguiente:

C (Carry) Nos indica el acarreo poniendose a 1. ¡Y me llevo una!
V (oVerflow) nos indica desbordamiento en una operacción aritmética en complemento a dos.
Z (Zero) Se activa a uno si el resultado de algo es igual a cero. Ejemplo: ¿Nuevos juegos de Oric en 2019?... Y se activa!
N (Negative) es cuando una operación nos reporta un resultado negativo. 5 Manzanas - 7 Manzanas= -2 Manzanas
X Es el bit de eXtensión. No cambia con las instrucciones de movimiento de datos. Lo hace con instrucciones aritméticas con signo, desplazamientos y rotación. Y lo hace igual que el de acarreo.


El Byte alto de SR solo es accesible desde el modo Supervisor y contiene los Flags de control del sistema.

I2- I1 - I0, son los bits de máscara de interrupción por niveles.
S Es el bit de modo Usuario, Supervisor
T (Trace) es el bit indicador de modo, paso por paso.


Vamos con los otros registros!!!

REGISTRO DE DATOS (D0-D7)

EN total, ocho registros de 32 bits.
La mayoría de las operaciones de manipulación de datos se efectúa en estos registros.
Son de uso general.
Cualquier operación está permitida.
No existe como en otros micros el ACUMULADOR, donde se realizan todas las operaciones. Aquí se realizan en estos registros.
Bueno... es como si tuviéramos 8 Acumuladores, pero se llaman desde D0 a D7

Estos registros se pueden manipular como 32 bits, 16bits u 8bits, indicando en los códigos mnemotécnicos el .L .W y .B ( Que deben de ser Long Word, Word y Byte)

Cuando se opera sobre una sección del registro (Palabra o Byte), la sección afectada será la de menor peso (bits 0 a 7 o a 15, según)y el resto de bits permanecen o no se consideran.

REGISTRO DE DIRECCIONES (A0 - A7)

El 68k cuenta con 8 registros de direcciones, del A0 al A7. Se consideran como punteros ya que contienen direcciones de datos en la memoria principal.
Los registros son de 32 bits y aunque las operaciones que se realizan son de WORD o LARGUE, si realizamos un cambio en la de menor peso, el registro es afectado por completo. Esto es así porque el contenido de los registro de dirección son valores co signo a dos. Las direcciones negativas se emplean como desplazamientos negativos relativos a una dirección dada.

Todos los registros tienen la misma funcion menos el A7, que es el registro de pila o STACK POINTER (SP)

Aunque el registro sea de 32 bits, solo son significativos los 24 de menor peso. Vamos, que solo direccionamos 16Mb.

CONTADOR DE PROGRAMA (PC)

Es el contador encargado de indicar siempre la dirección de la siguiente instrucción a ejecutar.
Es de 32 bits, aunque solo sabe contar hasta 24 bits, lo de menor peso.

Las "palabras" del micro están formadas por dos bytes consecutivos, por lo que obligatoriamente deben de comenzar en una dirección par de la memoria.
Ya que las palabras son pares, se considera que la señal de direcciones A0 está siempre a cero. Por lo que el 68k solo ve 8Mega palabras de 16 bits.

Por ahora esto...

Siguiente tema serán los modos de direccionamiento.

Salud! -drinks

Avatar de Usuario
Chema
Mensajes: 2075
Registrado: 21 Jun 2012 20:13
Ubicación: Gijón
Agradecido : 1428 veces
Agradecimiento recibido: 448 veces
Contactar:

Re: Motorola 68000 Introducción al micro y ASM

Mensajepor Chema » 14 Mar 2019 22:40

minter escribió:Ya que las palabras son pares, se considera que la señal de direcciones A0 está siempre a cero.


Uh? Esto no lo he entendido... -nb

Avatar de Usuario
minter
Mensajes: 2227
Registrado: 22 Jul 2014 18:51
Agradecido : 1825 veces
Agradecimiento recibido: 788 veces

Re: Motorola 68000 Introducción al micro y ASM

Mensajepor minter » 14 Mar 2019 23:06

Chema escribió:
minter escribió:Ya que las palabras son pares, se considera que la señal de direcciones A0 está siempre a cero.


Uh? Esto no lo he entendido... -nb


Esto es porque las instrucciones ocupan 2 bytes. Contienen la info del modo de direccionamiento y esas cosas. Mañana todo tendrá sentido.

Las instrucciones, por ejemplo: andi.l #0x3ffff,d0 ocupa 6 bytes.

Avatar de Usuario
explorer
Mensajes: 229
Registrado: 10 Ene 2016 18:43
Ubicación: Valladolid, España
Agradecido : 5 veces
Agradecimiento recibido: 212 veces
Contactar:

Re: Motorola 68000 Introducción al micro y ASM

Mensajepor explorer » 14 Mar 2019 23:18

Chema escribió:
minter escribió:Ya que las palabras son pares, se considera que la señal de direcciones A0 está siempre a cero.


Uh? Esto no lo he entendido... -nb

Bueno, la señal de direcciones A0 no está a cero. Bueno... a ver... en el encapsulado del 68000 no hay una patilla A0, pero sí la tiene el 68008. Cuando el 68000 necesita acceder a un byte, lo que hace en realidad es leer la palabra que contiene a ese byte, y se queda con lo que interesa.

Lo que quiere decir es que si el procesador hace una de estas cosas:
  • intenta acceder a una palabra (16 bits) o palabra larga (32 bits) en dirección impar
  • se intenta leer un código de operación en dirección impar
  • la dirección de pila está en dirección impar
se produce un error de dirección (excepción 3, "Address Error") y se salta al vector de la dirección $C (en los Atari ST, salen 3 bombas).

Pero esto no quiere decir que no podamos gestionar bytes sueltos en la memoria... Solo hay que recordarlo a la hora de leer palabras o palabras largas.

Avatar de Usuario
Chema
Mensajes: 2075
Registrado: 21 Jun 2012 20:13
Ubicación: Gijón
Agradecido : 1428 veces
Agradecimiento recibido: 448 veces
Contactar:

Re: Motorola 68000 Introducción al micro y ASM

Mensajepor Chema » 15 Mar 2019 00:12

Ah, vale. Lo que me confundió es el término "la señal de direcciones A0" que no sé qué es. No es el registro A0... ¿A qué se refiere?

Avatar de Usuario
WhatIsAMan
Mensajes: 170
Registrado: 10 Dic 2017 17:06
Ubicación: El castillo invertido
Agradecido : 41 veces
Agradecimiento recibido: 52 veces

Re: Motorola 68000 Introducción al micro y ASM

Mensajepor WhatIsAMan » 15 Mar 2019 01:42

Chema escribió:Ah, vale. Lo que me confundió es el término "la señal de direcciones A0" que no sé qué es. No es el registro A0... ¿A qué se refiere?


El 68k es un procesador con un bus de datos de 16b, pero fue pensado para que pudiera usar perifericos de la serie 6800/6500. Por lo tanto su bus de direcciones no está formado por los señales A23-A0 sino por A23-A1 y dos señales distintos para el bit de dirección con peso más bajo. De esta manera puede seleccionar en modalidad de 16 bits (memorias de 16 bits de ancho, perifericos de la serie 68k) o 8 bits (perifericos de la serie 6800/6500, memorias de 8 bits).

Avatar de Usuario
minter
Mensajes: 2227
Registrado: 22 Jul 2014 18:51
Agradecido : 1825 veces
Agradecimiento recibido: 788 veces

Re: Motorola 68000 Introducción al micro y ASM

Mensajepor minter » 15 Mar 2019 11:54

TIPOS DE DIRECCIONAMIENTOS:

Existe un rollo de que si las instrucciónes tiene muchos operandos (tres), como la suma (Dos sumandos y un resultado),que si tiene muchos bits... Que ocupamos muchos.... que la instrucciones son largas...que si perdemos tiempo cargando acumulador... que si la abuela fuma...

Bueno, pues me meto directamente como se direccionan las instrucciones y el resto, pues ya veremos.

Empezamos sin mas comeduras de bits.

DIRECCIONAMIENTOS:

DIRECTO:

El operando está en uno de los 16 registros que tenemos. O de dirección (de A0 a A7) o de datos (de D0 a D7)
Es decir, una instrucción y un operando guardado en un registro.

Ejemplo:

CLR.L D1

CLEAR (Borrar), el LONG WORD (Palabra larga que es 32bits), lo que hay en D1. Resumiendo: pone a cero, todos los bits

del registro D1.

ADD A1,A2

Suma el contenido de A1, con el de A2 y lo pone en A2. Ya... los A son los registros de direcciones, lo se... Pero

también puedes hacer estas cosas en estos registros.


INMEDIATO:

Es cuando el operando va incluido en la propia instrucción. Es decir, que indicas exactamente con lo que quieres operar. Es fijo.

ADD.W #5,D0

Sumas una palabra (.W es 16 bits. Solo operarás con los 16 bits de menor peso) el valor 5, en el registro D0.

Y nos preguntamos....? Y no hubiera valido .B? Pues también, 5 entra en un Byte. Si fuera sumar el valor 300, pues ya necesitamos 2 bytes y entonces emplearíamos .W


INDIRECTO DE REGISTRO:

En este modo el operando se encuentra siempre en memoria y en el calculo siempre interviene al menos un registro de direcciones que se incluye en la propia instruccion.

MOVE #27,(A3)

Guarda el valor 27 en la direccion que está contenida (a donde apunta) en el registro A3.
Si en A3 tenemos el valor $0000 1fff, pues guardará 27 en la posición de memoria $0000 1fff. Y A3 se queda mas a gusto que un arbusto.


Dentro de los indirectos de registro, disponemos de varios modos, incrementando los registros, decrementandolos, desplazandolos...con indices...


algunos ejemplos de INDIRECTOS DE REGISTRO:

Con INCREMENTO:

La dirección del operando está contenida en un registro. Una vez realizada la instrucción, incrementa el registo.

Ejemplo:

MOVE.L (A0)+,D1

Mueve todo (.L LARGE WORD = 32bits) lo que hay en la posición de memoria donde apunta el registro A0, al registro D1. Y luego incrementa el valor de A0 en 4.

No que mueva lo que hay en A0. Sino que mueva, lo que hay, donde dice que está A0. Y A0=A0+1
Por cierto... en ensamblador MOVE, no es como en el windows. Es como si fuera COPY. El contenido original no se altera.
:)
Es decir, después de operar, incrementa el PUNTERO


Con DECREMENTO:

La dirección del operando está contenida donde apunta un registro (PUNTERO). Pero antes de obtener el valor, decrementa el PUNTERO. Y se decrementa en 1, 2 o 4, según el tamaño del operando (.B, .W, .L)

Ejemplo:

CLR.L -(A0)

Resta 4 a A0 (ya que el operando es un .L) y después pone a cero la posición de memoria donde apunta A0, los 32 bits.


Con DESPLAZAMIENTO:

La dirección de memoria donde está el operando se obtiene al sumar el contenido de un registro de direcciones

(A0...A7), con el desplazamiento de 16 bits incluido en la instrucción, con signo.

CLR.W #9(A0)

Pone a cero la posición de memoria cuya dirección viene dada por la suma del número 9 con el contenido de A0.


Con REGISTRO CON INDICE:

La dirección de lo que queremos operar se obtiene al sumar, el contenido del registro de direcciones con una constante de 8 bits extendido en signo, con el contenido de un registro adicional que se denomina REGISTRO INDICE y que puede ser de datos o direcciones.

MOVE.B 5(A3,D3.W),D2

Suma 5 con lo que hay en A3 y lo que hay en D3 (pero solo .W (16 bits)). Y el resultado de esa suma es una posición de memoria, de donde coge el el valor que hay (Solo coge la parte .B, 8 bits) y lo deposita en D2.


ya fuera de los indirectos...


ABSOLUTO:

La dirección del operando se especifica directamente en la instrucción.

JMP $400

Salta a la dirección hexadecimal 0400.

MOVE 12000, D1

Copia el valor 12000 en el registro D1


RELATIVO AL CONTADOR DE PROGRAMA (Contador de Programa) con desplazamiento.

La dirección del operando se indica en función del contador de programa.

BEQ BUCLE

Salta a la posición representada por BUCLE sin la condición es cierta.



RELATIVO AL CONTADOR DE PROGRAMA CON INDICE Y DESPLAZAMIENTO:

La dirección del operando se obtiene al sumar el contenido del contador del programa con el valor del desplazamiento

extendido en signo y el contenido de un registro indice (A o D)

JMP #SALTO (A0.W)

Salta a la posición definida por la etiqueta SALTO, menos la palabra de menor peso de A0 extendida en signo.
Es decir: Se va a la posición SALTO, que puede estar en $1000... pero si en A0 hay un 5... pues SALTO+5. Si hay -5 (porque vamos con signo) Pues salta a SALTO-5



Bueno... esto es lo que tenemos de tipos de direccionamiento:

Un resumen en una Imagen de los direccionamientos que hay

Modos direccionamiento.jpg
Modos direccionamiento.jpg (87.69 KiB) Visto 214 veces


(No hagáis caso a los numeritos, que son de los ejemplos comentados)

Por el momento, lo que vemos es que es un follón de padre y muy señor mío. Igual cuando se pilla, es muy cómodo, pero por el momento, es un laberinto... laberinto...

En el siguiente, agruparé el conjunto de instrucciones e incluiré el Set de Instrucciones.
Y disculpar si veis errores o no se entiende. Estoy aprendiendo mientras escribo esto y cualquier ayuda es bienvenida. -nb

Incluyo una tabla donde viene el esquema de las instrucciones de una manera muy visual.

Salud!!! -drinks
Adjuntos
Tabla modos direccionamiento M68k.zip
Tabla modos direccionamientos
(60.06 KiB) Descargado 1 vez

Avatar de Usuario
Jinks
Mensajes: 1437
Registrado: 09 Oct 2013 16:47
Agradecido : 75 veces
Agradecimiento recibido: 135 veces
Contactar:

Re: Motorola 68000 Introducción al micro y ASM

Mensajepor Jinks » 15 Mar 2019 12:42

Chema escribió:Ah, vale. Lo que me confundió es el término "la señal de direcciones A0" que no sé qué es. No es el registro A0... ¿A qué se refiere?

Se refiere a la línea de menos peso del bus de direcciones, que en todos los procesadores se llama A0, y es la que pesa 1 si está activa. O sea, la que indica si la dirección es par o impar. El 68000 no tiene un pin para la línea A0. Supongo que se refiere a eso.

jjsaenz1969
Mensajes: 412
Registrado: 21 Oct 2016 15:45
Agradecido : 100 veces
Agradecimiento recibido: 108 veces

Re: Motorola 68000 Introducción al micro y ASM

Mensajepor jjsaenz1969 » 15 Mar 2019 16:15

Curso de Assembler para Amiga.
¿Donde hay que apuntarse?, yo ya tengo todo lo necesario para empezar, sólo me falta un empujón.

Avatar de Usuario
minter
Mensajes: 2227
Registrado: 22 Jul 2014 18:51
Agradecido : 1825 veces
Agradecimiento recibido: 788 veces

Re: Motorola 68000 Introducción al micro y ASM

Mensajepor minter » 15 Mar 2019 22:14

jjsaenz1969 escribió:Curso de Assembler para Amiga.
¿Donde hay que apuntarse?, yo ya tengo todo lo necesario para empezar, sólo me falta un empujón.


Nono... no es de Amiga! -no

Es de Motorola 68000 nada más.
Es para ponerme al día de 68000 para luego... entender los juegos que están comentados como el Bomb Jack o el Rygar. -grin

Luego... pues el Atari, Amiga, Mac, Bellota, QL... cada uno tendrá sus particularidades y direcciones de memoria y esas cosas. -drinks

jjsaenz1969
Mensajes: 412
Registrado: 21 Oct 2016 15:45
Agradecido : 100 veces
Agradecimiento recibido: 108 veces

Re: Motorola 68000 Introducción al micro y ASM

Mensajepor jjsaenz1969 » 15 Mar 2019 23:45

minter escribió:
jjsaenz1969 escribió:Curso de Assembler para Amiga.
¿Donde hay que apuntarse?, yo ya tengo todo lo necesario para empezar, sólo me falta un empujón.


Nono... no es de Amiga! -no

Es de Motorola 68000 nada más.
Es para ponerme al día de 68000 para luego... entender los juegos que están comentados como el Bomb Jack o el Rygar. -grin

Luego... pues el Atari, Amiga, Mac, Bellota, QL... cada uno tendrá sus particularidades y direcciones de memoria y esas cosas. -drinks


Pues si, eso es. Aprender como funciona el micro y luego ya lo adaptas a las necesidades de cada uno.
Con tu curso y con esto .............

Imagen

Igual se puede llegar a hacer algo -507

Avatar de Usuario
Kyp
Mensajes: 347
Registrado: 03 Oct 2013 17:13
Agradecido : 6 veces
Agradecimiento recibido: 53 veces

Re: Motorola 68000 Introducción al micro y ASM

Mensajepor Kyp » 16 Mar 2019 16:03

Tengo muy olvidado el ASM de 680x0 pero creo que hay que hacer un par de correcciones...
minter escribió:CLR.L D1
CLEAR (Borrar), el LONG WORD (Palabra larga que es 16bits), lo que hay en D1. Resumiendo: pone a cero, todos los bits

Palabra larga serían 32 bits, ¿no?

minter escribió:MOVE.L (A0)+,D1
Mueve todo (.L LARGE WORD = 32bits) lo que hay en la posición de memoria donde apunta el registro A0, al registro D1. Y luego incrementa el valor de A0 en 1.

Igual que como dices en el pre-decremento... el post-incremento es de 1, 2 o 4 en función del tamaño de la operación, en este caso si la operación es sobre .L se incrementaría A0 en 4 no en 1.

BlackHole
Mensajes: 974
Registrado: 03 Ago 2011 23:07
Ubicación: Aluche, Madrid
Agradecido : 7 veces
Agradecimiento recibido: 133 veces

Re: Motorola 68000 Introducción al micro y ASM

Mensajepor BlackHole » 16 Mar 2019 19:35

jjsaenz: Ufff... la biblioteca Addison-Wesley !!! Eso es pata fina, pero semanas y semanas de dedicación para hacer algo.

jjsaenz1969
Mensajes: 412
Registrado: 21 Oct 2016 15:45
Agradecido : 100 veces
Agradecimiento recibido: 108 veces

Re: Motorola 68000 Introducción al micro y ASM

Mensajepor jjsaenz1969 » 16 Mar 2019 23:01

BlackHole escribió:jjsaenz: Ufff... la biblioteca Addison-Wesley !!! Eso es pata fina, pero semanas y semanas de dedicación para hacer algo.


Los compré hace un par de años, cuando todavía se podía pagar un precio "normal" por ellos. Hoy día piden una burrada por estos libros.
Pero a lo que tengo más aprecio es al paquete DevPac 3, me costó mucho tiempo encontrar uno. Pero con paciencia al final aparece.


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