Motorola 68000 Introducción al micro y ASM

Avatar de Usuario
minter
Mensajes: 2572
Registrado: 22 Jul 2014 18:51
Agradecido : 2463 veces
Agradecimiento recibido: 1076 veces

Re: Motorola 68000 Introducción al micro y ASM

Mensajepor minter » 21 Mar 2019 12:36

Último mensaje de la página anterior:

Segundo ejemplo:

Ejemplo 2_1.jpg
Ejemplo 2_1.jpg (99.59 KiB) Visto 926 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 926 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 13 veces

Avatar de Usuario
minter
Mensajes: 2572
Registrado: 22 Jul 2014 18:51
Agradecido : 2463 veces
Agradecimiento recibido: 1076 veces

Re: Motorola 68000 Introducción al micro y ASM

Mensajepor minter » 22 Mar 2019 09:06

Este siguiente ejemplo, copia un bloque de una zona de memoria en otra zona.

Ejemplo 3_2.jpg
Ejemplo 3_2.jpg (110.25 KiB) Visto 255 veces


Aquí el programa coge un dato de un lugar de la memoria y lo deposita en otro lugar de la memoria.

Primero carga en los registros A0 y A1 los punteros de donde tiene que coger y donde tiene que dejar.

A1 contendrá la posición de memoria donde tiene que coger el dato, en este caso $0600.
A0 contendrá la posición de memoria donde tiene que dejar el dato, en este caso $1000.

Luego hace una copia al vuelo. Coge de donde apunta A1 y lo deja donde apunta A0.
Y de paso, incrementa el valor de ambos registros.

Incrementa A0 y A1 su valor en 1, porque lo que ha cogido ha sido un BYTE. (Si hubiera cogido un WORD, hubiera incrementado esos punteros en 2.)

Después compara si A1 ha llegado al valor $0700. (Que es el límite que le ponemos para que pare de copiar memoria. Podemos poner más lejos esa posición de memoria o mas cerca, como $0610.)

Si el resultado es negativo, vuelve al bucle.

Si el resultado es positivo, continua el programa hacia abajo... y es FIN

En el ejemplo anterior puse las condiciones de salto.

Código: Seleccionar todo

*-----------------------------------------------------------
* Title      : COPIA DE UN BLOQUE DE MEMORIA
* Written by : SOMEONE
* Date       : MARZO 2019
* Description: MINI TUTO 2019
*-----------------------------------------------------------
    ORG    $0400
START:                  ; first instruction of program

* Put program code here

        movea.w #$0600,a1   ;Dirección origen en A1
        movea.w #$1000,a0   ;Dirección destino en A0
bucle   move.b (a1)+,(a0)+  ;Copia e incrementa las direcciones
        cmpa.w #$0700,a1    ;Compara con la última dirección
        bne.s bucle


    SIMHALT             ; halt simulator

* Put variables and constants here

    END    START        ; last line of source



Un detalle:

Como el simulador cuando arranca, tiene toda la memoria en FF, pues se puede rellenar un bloque entero con un dato.
Se pone la dirección de origen en FROM y hasta donde con TO. Se pone el tipo de dato que queremos poner... y damos a FILL de rellenar. Y cambiamos un bloque entero.

Ejemplo 3_1.jpg
Ejemplo 3_1.jpg (187.17 KiB) Visto 255 veces


Luego, si te apetece escribir encima, pues pulsas con el ratón y rellenas una dedicatoria.

Ejemplo 3_1_2.jpg
Ejemplo 3_1_2.jpg (220.62 KiB) Visto 255 veces


Así cuando se lanza en programa en el simulador, se ve que efectivamente ha realizado la copia de esa zona de memoria.

Mañana más!
Otro ejemplo sencillito! -thumbup
Adjuntos
Copia Bloque.zip
(548 Bytes) Descargado 6 veces

Avatar de Usuario
minter
Mensajes: 2572
Registrado: 22 Jul 2014 18:51
Agradecido : 2463 veces
Agradecimiento recibido: 1076 veces

Re: Motorola 68000 Introducción al micro y ASM

Mensajepor minter » 23 Mar 2019 20:00

Ejemplo 4

Buscar el Byte mayor y menor de una tabla.

Ejemplo4_1.jpg
Ejemplo4_1.jpg (150.67 KiB) Visto 226 veces


Este programa lo que hace es buscar entre una tabla dada en memoria, cual es el BYTE mayor y cual es el menor. Y dejar estos en unas determinadas posiciones de memoria.

Primeramente, el programa carga los punteros en los registros.
En A0 pone la posición de memoria donde empieza la tabla donde vamos a buscar esos BYTEs mayores y menores.
En A1 pone la posición donde va a depositar en memoria el BYTE mayor.
En A2 pone la posición donde va a depositar en memoria el BYTE menor.

Entonces, cargamos en desde la tabla en primer valor al acumulador D0 y lo depositamos en MAYOR y MENOR.
Sumamos una unidad al puntero A0, para que apunte al siguiente dato de la tabla.
Cargamos el siguiente dato de la tabla en D0 y de paso, aunmentamos el puntero A0 nuevamente.

Comparamos lo que tenemos en D0 ahora, con lo que habíamos dejado anteriormente donde apunta A1 (Es decir, comparamos el contenido de D0 con la posición de memoria $620)

En la comparación, vigilamos como ha cambiado el bit de accarreo.

si es mayor D0 al contenido de $620, entonces deposita D0 en $620
Si no fuera mayor D0 respecto al contenido de $620, entonces deja $620 y salta a la siguiente etiqueta.

Comparamos el contenido de D0 con en contenido de $630, y volvemos a vigilar el acarreo.
Si fuera mayor el contenido de D0 respecto a lo contenido en $630, entonces salta a la siguiente etiqueta.
Si por el contrario, fuera menor D0 respecto a lo contenido en $630, el programa guarda el contenido de D0 en $630.

Comprueba si hemos llegado al final de la tabla. Es decir, A0 con el valor $610
Y si no hemos acabado la tabla, vuelve al principio.
En caso contrario, que fuera el final de la tabla, sigue el programa para acabar.

Pues el resultado del programa sería así:

Ejemplo4_2.jpg
Ejemplo4_2.jpg (177.44 KiB) Visto 226 veces


FUENTE:

Código: Seleccionar todo

*-----------------------------------------------------------
* Title      : BUSCAR EL MAYOR Y EL MENOR DE LOS BYTES
* Written by : SOMEONE
* Date       : MARZO 2019
* Description: MINI TUTO 68000
*-----------------------------------------------------------
    ORG    $0400
START:                  ; first instruction of program

* Put program code here

inicio  movea.w #$600,a0     ;En A0 la dirección de los datos
        movea.w #$620,a1     ;En A1 la dirección del mayor
        movea.w #$630,a2     ;En A2 la dirección del menor
        move.b (a0),d0       ;En D0 el dato a comparar
        move.b d0,(a1)
        move.b d0,(a2)
        adda.w #$1,a0
bucle   move.b (a0)+,d0
        cmp.b (a1),d0       ;(Destino-Fuente) D0-(A1)
        bcs nomayor         ;Si hay acarreo D0 no es mayor
        move.b d0,(a1)
nomayor cmp.b (a2),d0       ;(Destino-Fuente) D0-(A2)
        bcc nomenor         ;Si hay acarreo D0 no es menor
        move.b d0,(a2)
nomenor cmpa #$610,a0
        bne  bucle          ;Si A0 es 610h termina


    SIMHALT             ; halt simulator

* Put variables and constants here

    END    START        ; last line of source


BCC = Branch if the Carry is Clear (Salta a la rama si el acarreo es cero)
BCS = Branch if the Carry is Set (Salta a la rama si es acarreo es uno)
Adjuntos
MayoryMenor.zip
(669 Bytes) Descargado 5 veces

Avatar de Usuario
minter
Mensajes: 2572
Registrado: 22 Jul 2014 18:51
Agradecido : 2463 veces
Agradecimiento recibido: 1076 veces

Re: Motorola 68000 Introducción al micro y ASM

Mensajepor minter » 26 Mar 2019 11:56

Ejemplo 5:

Ejemplo 5_1.jpg
Ejemplo 5_1.jpg (83.82 KiB) Visto 194 veces

Buenas de nuevo!

Esta vez vamos a emplear la PILA (STACK) para este ejemplo.
Una PILA es eso que se le pasa a uno por la cabeza. Un montón de cosas que se acumulan una encima de otra.
En un ordenador, es una zona de memoria donde se van guardando datos de manera consecutiva.

En este caso, va a ser una PILA FILO.

FILO: (Firts In, Last Out)(El primero que entra, es el último que sale) O para que quede más gráfico... es el plato de abajo de un montón de platos.(El último plato que friega Chema, a pesar de ser el primero al acabar de cenar para ponerse a ver Amiga Wave)

Bien, esta PILA se encuentra donde apunta el puntero de PILA, o (SP=Stack Pointer).
El SP en el 68000 es también el registro A7.

Existen dos nombres diferentes para el SP dependiendo si uno está en modo Supervisor (USP) o Usuario (SSP). A nosotros, ahora mismo, nos la trae al fresco.

El SP (puntero de pila) o registro A7, decrementa a medida que se van introduciendo datos en la PILA. Y se incrementa a medida que sacamos los datos. Siempre apunta al último dato almacenado.

En el ejemplo, lo que hacemos es leer una zona de la memoria y vamos guardandola en la PILA.
En este caso, en la zona de memoria que leemos, se encuentra la palabra "RETROWIKI*"

Mediante LEA, metemos en el registro A5, la dirección de memoria donde se encuentra el TEXTO.

Y metemos en el registro A6, el valor del SP donde se encuentra en ese momento. En el ejemplo es cero, pero en otro programa puede tener otro valor, porque igual hay otras cosas apiladas.

Vamos a realizar un bucle de lectura metiendo los datos en la PILA, hasta que se cumpla la condición de encontrarnos con el carácter "*".

Vamos incrementando el registro A5, donde apunta la palabra que estamos apilando, y vamos reduciendo el valor del SP (o A7). Y comparamos el valor donde apunta A5, con el valor "*". Y si no es igual... vuelve al bucle.

Encontrado, dejamos de meter cosas en la pila y seguimos a la siguiente parte del programa.

Y ahora lo sacamos.

Volvemos a cargar en el registro la posición donde empieza el TEXTO. Pero ahora vamos sacando lo de la pila desde la ultima letra, hasta la primera.
Como lo hacemos desde el principio, pues se nos escribirá del revés.

Y lo va haciendo, sacar letras (o valores) hasta que coincida el valor del puntero de pila SP, con el valor que cogimos del puntero de pila al principio del programa y almacenado en el registro A6.

Una vez que el puntero de pila SP, está en el valor inicial del programa... finaliza.

Y se nos ha quedado escrita la palabra, de forma inversa!!! -drinks


Fuente:

Código: Seleccionar todo

*-----------------------------------------------------------
* Title      : INVERTIR UNA TABLA O TEXTO
* Written by : SOMEONE
* Date       : MARZO 2019
* Description: MINI TUTO 68000
*-----------------------------------------------------------

* Put program code here

    ORG     $0400
   
TEXTO   
    DC.B    'RETROWIKI*'
   
START
    lea     TEXTO,A5
    movea.w SP,A6
   
METE
    move.b  (A5)+,-(SP)
    cmpi.b  #'*',(A5)
    bne     METE
   
    lea TEXTO,A5
SACA
    move.b  (SP)+,(A5)+
    cmpa.w  SP,A6
    bne SACA
   
    SIMHALT             ; halt simulator

* Put variables and constants here

    END    START        ; last line of source



El programa antes de lanzarlo tendía la palabra "RETROWIKI*" escrita bien...

Ejemplo 5_2.jpg
Ejemplo 5_2.jpg (211.45 KiB) Visto 194 veces


Y después de pasar por la pila y sacarlo de sentido correcto, pero empezando desde el principio nuevamente... pues queda escrito del revés.

Ejemplo 5_3.jpg
Ejemplo 5_3.jpg (179.86 KiB) Visto 194 veces


Espero que se me haya entendido eso del DERECHO y REVÉS.

Me fumé esa clase de Sesame Street. -507


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