Motorola 68000 Introducción al micro y ASM

Avatar de Usuario
minter
Mensajes: 2336
Registrado: 22 Jul 2014 18:51
Agradecido : 2075 veces
Agradecimiento recibido: 892 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 671 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: 2176
Registrado: 21 Jun 2012 20:13
Ubicación: Gijón
Agradecido : 1629 veces
Agradecimiento recibido: 531 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: 2336
Registrado: 22 Jul 2014 18:51
Agradecido : 2075 veces
Agradecimiento recibido: 892 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: 255
Registrado: 10 Ene 2016 18:43
Ubicación: Valladolid, España
Agradecido : 7 veces
Agradecimiento recibido: 236 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: 2176
Registrado: 21 Jun 2012 20:13
Ubicación: Gijón
Agradecido : 1629 veces
Agradecimiento recibido: 531 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: 241
Registrado: 10 Dic 2017 17:06
Ubicación: El castillo invertido
Agradecido : 61 veces
Agradecimiento recibido: 69 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: 2336
Registrado: 22 Jul 2014 18:51
Agradecido : 2075 veces
Agradecimiento recibido: 892 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 528 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 4 veces

Avatar de Usuario
Jinks
Mensajes: 1492
Registrado: 09 Oct 2013 16:47
Agradecido : 94 veces
Agradecimiento recibido: 140 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: 442
Registrado: 21 Oct 2016 15:45
Agradecido : 116 veces
Agradecimiento recibido: 124 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: 2336
Registrado: 22 Jul 2014 18:51
Agradecido : 2075 veces
Agradecimiento recibido: 892 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: 442
Registrado: 21 Oct 2016 15:45
Agradecido : 116 veces
Agradecimiento recibido: 124 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: 359
Registrado: 03 Oct 2013 17:13
Agradecido : 11 veces
Agradecimiento recibido: 61 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: 1024
Registrado: 03 Ago 2011 23:07
Ubicación: Aluche, Madrid
Agradecido : 9 veces
Agradecimiento recibido: 158 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: 442
Registrado: 21 Oct 2016 15:45
Agradecido : 116 veces
Agradecimiento recibido: 124 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.

Avatar de Usuario
minter
Mensajes: 2336
Registrado: 22 Jul 2014 18:51
Agradecido : 2075 veces
Agradecimiento recibido: 892 veces

Re: Motorola 68000 Introducción al micro y ASM

Mensajepor minter » 20 Mar 2019 14:25

Juego de instrucciones del 68000.

El 68000 viene con un total de 56 instrucciones, donde se pueden agrupar en los siguientes apartados:

- Instrucciones aritméticas
- Funciones lógicas
- Desplazamientos y rotaciones
- Instrucciones de bifurcación
- Manipulación de un Bit y excepciones

Circulan por ahí varios sets de instrucciones, pero adjuntaré uno que vienen las instrucciones agrupadas por apartados.
Luego cada uno, pues puede sentirse mas cómodo con tablas que vienen ordenadas alfabéticamente.


No voy a explicar cada instrucción, porque eso daría para un libro. Así que veremos luego el uso de determinadas instrucciones en los ejemplos. El resto, estarán reflejadas en el set de instrucciones.

Escritura del Assembler del M68000

Pues se escribe como casi todos. Con cuatro columnas que serán los campos donde escribimos nuestros programas.

Serían así:

ETIQUETA INSTRUCCION OPERANDO COMENTARIOS

La ETIQUETA es lo que empleamos para dar nombre a una parte del programa. Si es una rutina, un lugar que contiene datos

que forman parte del programa... Ya lo dice su nombre, es una etiqueta. Y en el programa podemos referirnos a ella como

operando de una instruccion.Aunque existen algunos nombre reservados.

INSTRUCCIÓN, pues eso, una de las 56 instrucciones del M68000

OPERANDO es o son los datos que acompañan a una instrucción

COMENTARIOS, completamente opcionales y voluntarios. Luego, al ensamblar el programa, desaparecen. Hay que comenzar los

comentarios por asterisco, para que sean reconocidos como tal.


Expresiones en ensamblador:

El utilizar ETIQUETAS, tiene unas cuantas restricciones. Es decir, puedes poner el nombre a la etiqueta que te de la

gana, pero hay etiquetas reservadas que son registros del propio micro.
D0 a D7... pues no pueden ser una etiqueta, porque ya son D0 a D7
Los mismo para A0 a A7... SP... USP (Puntero de pila en modo supervisor)... CCR... SR...

El ensamblador del 68000 permite la utilización de operadores aritméticos y lógicos, con la condición de no incluir

espacio en las expresiones:

(-)Menos
(~)Negación
(>>)Desplazamiento a la derecha
(<<)Desplazamiento a la izquierda
(&)And
(!)Or
(^)xOr
(*)Multiplicacion
(/)División
(%)Módulo
(+)Suma
(-)Resta

Así como los números pueden expresarse en diferentes bases:

(%) Binario
(@) Octal
(&) Decimal
($) Hexadecimal

Considerando por defecto Decimal, si no se indica.

DIRECTIVAS:

Son como etiquetas, pero son para indicar inicios de variable y otras cosas del programa.

Las directivas mas importantes son:

ORG dirección de memoria => Dirección inicial del programa
END => Final del archivo fuente.
etiqueta EQU expresión => Definición de constantes simbólicas.
etiqueta DC operandos => Iniciación de datos en memoria.
etiqueta DS operandos => Reserva de memoria sin inicializar.



Bueno, con todo esto en plan escueto, voy a meter un ejemplo.
Así vamos viendo como se cuece esto.

Para realizar ejemplos, en este caso he empleado para compilar y probar el programa portable Easy68k.
Es un programa con un editor ensamblador "muy completo" para iniciarse como si fuera un entrenador.

Imagen
Imagen

Disponible en esta web:

http://www.easy68k.com/

Y se puede descargar la versión sin instalador portable en este enlace:

http://www.easy68k.com/files/EASy68K.zip

Este programa viene con muchos ejemplos, tutoriales y juegos realizados en ensamblador.

Bueno, con esta herramienta de desarrollo, podemos empezar a probar algún ejemplo:


SUMAR NÚMEROS:


Como siempre, un ejemplo de sumar dos números en memoria y ponemos el resultado en otro lugar de memoria.

En este caso, sumamos lo que está alojado en la dirección $0100 con $0101 y dejamos su resultado en $0110 y $0111.
Lo haremos mediante el cargar el puntero en el registro A0, el otro puntero de resultado en A1.

Y lo que hacemos es cargar el valor donde apunta A0 en D0 y avanzando el puntero (incrementamos A0) y realizamos una suma donde apunta ahora A0 con nuevamente D0.

Luego, dejamos el contenido de D0 donde apunta A1

Y finalizamos el programa.



Fuente:

Código: Seleccionar todo

*-----------------------------------------------------------
* Title      :SUMA DE DOS NUMEROS EN MEMORIA
* Written by :SOMEONE
* Date       :MARZO 2019
* Description:MINI TUTO DE 68000
*-----------------------------------------------------------
    ORG    $0400
START:                  ; first instruction of program

* Put program code here

        movea.w #$100,a0    En A0 la dirección del primer operando
        movea.w #$110,a1    En A1 la dirección del resultado
        eor     d1,d1       D1 a cero
        move.b (a0)+,d0     Carga operando y apunta al siguiente
        add.b (a0),d0       Suma y guarda el resultado en D0
        addx.b d1,d1        Byte alto en D1
        move.b d1,(a1)+     Byte alto del resultado a memoria
        move.b d0,(a1)      Byte bajo del resultado a memoria
       
    SIMHALT             ; halt simulator

* Put variables and constants here

    END    START        ; last line of source



Aquí el programa ejemplo, que también lo adjunto como archivo formato .X68 para poder cargarlo con el Easy68k

El programa lo cargamos con el EDIT68k

Editor Easy68k.jpg
Editor Easy68k.jpg (120.25 KiB) Visto 301 veces


luego pulsamos el PLAY verde de arriba y nos da un mensaje de errores y warnings... y si va todo bien... le podemos dar a LAUNCH para que arranque automáticamente el SIM68k

Codigo Ensamblado Easy68k.jpg
Codigo Ensamblado Easy68k.jpg (244.62 KiB) Visto 301 veces


Luego en el SIM68k, damos a VIEW => Memory y se nos abre la ventana de la memoria...

Nos vamos a la dirección de memoria del ejemplo... $0100 y $0101... y click encima con el ratón, ponemos los valores que queremos que nos sume el programa.

Memoria Easy68k.jpg
Memoria Easy68k.jpg (214.24 KiB) Visto 301 veces


Ya otra vez en la pantalla del SIM68k, pulsamos el botón verde de PLAY... y arrancará el programa, realizando la suma.

Si quieres probar de nuevo, hay que detener el programa y reiniciarlo pulsando en la exclamación con el circulo rojo que parece una Advertencia.

Los botones entre el PLAY y el PAUSE, es para ejecutar el programa sentencia por sentencia para poder ver lentamente los pasos y observar como van cambiando los registros.

Bueno, y esto por hoy. -thumbup
Adjuntos
Set Instrucciones M68k.zip
(758.24 KiB) Descargado 4 veces
Ejemplo 1.zip
(597 Bytes) Descargado 2 veces

Avatar de Usuario
minter
Mensajes: 2336
Registrado: 22 Jul 2014 18:51
Agradecido : 2075 veces
Agradecimiento recibido: 892 veces

Re: Motorola 68000 Introducción al micro y ASM

Mensajepor minter » 21 Mar 2019 12:36

Segundo ejemplo:

Ejemplo 2_1.jpg
Ejemplo 2_1.jpg (99.59 KiB) Visto 358 veces


Este ejemplo lo que hace es rellenar una zona de memoria con un dato almacenado en el registro D0.
Y lo va depositando en la zona de memoria donde apunta A0.

Ejemplo 2_2.jpg
Ejemplo 2_2.jpg (196.59 KiB) Visto 358 veces


Lo hace mediante un bucle y un incremento de contador hasta que se cumpla una condición.

Compara A0 con el valor $700 mediante CMPA y esa comparación devuelve un cambio en el registro de estado.
Mientras no sea igual, salta otra vez al inicio del bucle mediante BNE mientras no sea igual la comparación.

Cuando sea igual, entonces continua el programa. Que en este caso, continuar el programa, es finalizar. :)

Código: Seleccionar todo

*-----------------------------------------------------------
* Title      : RELLENAR UNA TABLA CON UN VALOR DETERMINADO
* Written by : SOMEONE
* Date       : MARZO 2019
* Description: MINI TUTO 68000
*-----------------------------------------------------------
    ORG    $0400
START:                  ; first instruction of program

* Put program code here

        movea.w #$600,a0    ;En A0 la dirección inicial
        move.b #$aa,d0      ;En D0 el dato (AA)
bucle   move.b d0,(a0)+     ;Guarda dato e incrementa A0 puntero
        cmpa.w #$700,a0     ;Compara A0 con el final
        bne.s bucle         ;Si no llegó al final salta a bucle
                         

    SIMHALT             ; halt simulator

* Put variables and constants here

    END    START        ; last line of source





Aquí tenemos una pequeña tabla de comparaciones para este tipo de bifurcaciones entre dos registros D1 y D0:

Relación Con Signo Sin Signo
-------------------------------------------------------
D1 < D0 BLT BCS (branch on Carry Set)
D1 <= D0 BLE BLS
D1 = D0 BEQ BEQ
D1 <> D0 BNE BNE (Branch not equal)
D1 > D0 BGT BHI
D1 >= D0 BGE BCC (branch on Carry Clear)


Adjunto el archivo para ensamblar.
Podéis modificar la linea de comparación, cambiando el $700, por $610 por ejemplo... y vais pulsando F8 para ver el programa paso por paso, para ver como se van modificando los registros y como finaliza.

Pues nada!
Mañana Mas! -thumbup
Adjuntos
Relleno tabla.zip
(584 Bytes) Descargado 2 veces


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