Está en la página 1de 11

CODIFICACIÓN EN LENGUAJE ENSAMBLADOR PARA MICROPROCESADOR

MOTOROLA 6802

Cada microprocesador tiene cierto número de instrucciones, las cuales se encargan de realizar toda
la lógica posible, según sus alcances y la habilidad de resolver problemas del programador.

Es muy recomendable saber que hace cada una de estas instrucciones y la combinación de las
mismas, por lo cual a continuación se hará énfasis en la forma de utilizar las instrucciones del
microprocesador Motorola 6800-6802 en un sistema de computador básico.

A continuación se muestra la hoja de instrucciones del microprocesador Motorola 6800-6802


Una forma de realizar proyectos de manera sencilla utilizando las instrucciones anteriormente
mostradas, es logrando realizar algoritmos e interpretarlos en lenguaje ensamblador; por lo cual el
objetivo de este material es interpretar mediante nemónicos y código los algoritmos aprendidos
anteriormente. A continuación se muestra los elementos principales de un algoritmo.

PROCESO

CONDICIONAL

CICLO

SUB FUNCION

ENTRADA O SALIDA

CONECTOR O SALTO

INICIO O FINAL

El algoritmo más sencillo es el que solo contiene procesos sencillos de realizar.

El siguiente algoritmo muestra como sumar el valor almacenado en dos espacios de memoria y
guardar el resultado en otro espacio de memoria.
Una vez elaborado el algoritmo, con las instrucciones disponibles se puede traducir el algoritmo
elaborado en nemónicos y códigos del microprocesador 6800, o de algún otro lenguaje o
procesador.

DISEÑO DE CONTROL DE COMPUTADOR BÁSICO (MOTOROLA 6800)

Para continuar con la explicación es necesario dimensionar los espacios utilizados para la memoria
de trabajo (RAM) y memoria de programa (ROM), ademas de las direcciones de los registros de
configuración de puertos y dirección de los mismos

En este caso se asumirá un diseño de control en base a un decodificador 3 a 8

E000 - FFFF

A000: CS; SR
A001: PS

8000: CRA
8001: PA
8002: CRB
8003: PB

0000 – 07FF
Las líneas rojas representan la manera en la que el microprocesador activa cada una de las
memorias y de las interfaces asignándoles direcciones específicas. Si el decodificador recibe una
combinación a su entrada binaria a su entrada, éste solo activará una salida correspondiente a alguna
memoria o interfaz.

Las líneas azules representan la forma de interacción de datos entre el microprocesador y los demás
componentes. Por ejemplo, el microprocesador puede recibir datos de una interfaz o enviar datos a
la misma, de igual manera con la memoria RAM. Sin embargo sólo puede leer datos de la memoria
ROM, y no escribir datos en ella

Nota.- En otros tipos de diseño, si se permite la escritura en parte de la memoria ROM, esta suele
estar disponible para que el usuario guarde algunas configuraciones de su pragrama, pero la parte de
memoria de programa sigue sin poder ser escrita por el mismo microprocesador.

CONFIGURACION DE SISTEMAS DE NUMERACION (MOTOROLA 6800)

Para realizar la escritura de un programa en los diferentes lenguajes, se utiliza diferentes tipos de
numeración, haciendo que el código sea más facil de entender para el programador . Los
microprocesaores solo entienden el sistema binario, pero para su codificación se escribe en sistema
hexadecimal; el programador suele estar mas familiarizado con el sistema decimal; para la
transmision de datos entre un sistema de computador básico a otro sistema computarizado
(microcontrolador, PC, celular) se utiliza datos en forma de caracter, que son una combinación
especial de numeros hexadecimales para identificar letras o caracteres.

En el caso de usar nemónicos del microprocesador Motorola 6800, se podrá identificar cada
sistema de numeración de la siguiente forma:

%: el número que viene está en sistema binario


$: el número que viene está en sistema hexadecimal
‘ ‘: el número o letra encerrado en los apostrofes es un caracter.

Ejemplo:

%00001000 es el número 8 en binario

$FF es el número 255 en binario

‘1’ es el caracter 1, en hexadecimal representa el número 31h

50: representa el número 50 decimal. En este caso no se antepone nigun signo.

DIRECCIONES Y CONSTANTES:

Para la codificación del Motorola 6800 debe especificarse también si el número escrito representa
un número constante o una dirección, ya sea de memoria o registro de Interfaz.
Para hacer esta distinción, cuando se desee establecer que el número es una constante, se utilizará el
signo “#”

Ejemplo:

#%00000100 representa el número constante 4

%00000100 representa la direccion 0004 en binario.

#$0F representa el número constante 15

$0F representa la dirección 15 en hexadecimal

Para darle un mayor orden a la escritura, se recomienda que las direcciones sean escritas en
hexadecimal.

ETIQUETAS.

para un mayor órden y simplicidad al momento de realizar saltos o utilizar ciertos espacios de
memoria, es posible utilizar las etiquetas; que no son nada mas que la designación de un nombre
para una determinada direccion.

Ejemplo: se creará la etiqueta “BUCLE”

BUCLE
BUCLE:

LDAA #$02

ADDA #$04

STAA $10

BRA BUCLE

Al poner al inicio del código la etiqueta “BUCLE”, y al momento de nombrarla en un salto, el


compilador hará el salto hacia la etiqueta “BUCLE” sin necesidad de calcular dicho salto.

De la misma manera se puede utilizar para saltos condicionales y saltos a subrutinas.


BUCLE
BUCLE:

LDAA $10

ADDA #$04

CMPA #40

BNE BUCLE
Si
No STAA $10

CÓDIGO DE CONDICIONES (FLAGS)

El último ejemplo muestra cómo realizar un salto condicional hacia una etiqueta. Sin embargo para
poder realizar dicho salto se debe cumplir cierta condición (A distinto de 40 en el ejemplo). Al
momento de realizar un algoritmo cualquiera, se puede plantear varias condiciones (si llave está
cerrada, si jugador está cansado, etc.) pero dado el caso de programar con el Microprocesador
Motorola 6800, debe utilizarse solamente las condiciones disponibles para este chip. Para ello, este
microprocesador viene con ciertas “banderas” o casillas que cambian de estado (0 o 1) según la
operación ejecutada. Este chip cuenta con las siguientes banderas:

H: Half carry; acarreo a mitad.- Se utiliza solo al sumar dos números en hexadecimal. Si la suma de
los dos números da como resultado un número que solo utiliza mitad de un byte, H =0. Si la suma
de ambos números da como resultado un número que utiliza más de la mitad de byte, H=1

Ejemplo:

$03 + $07 = $0A ⇒ H=0

$09 + $07 = $10 ⇒ H=1

I: interrupciones.- Si se activa una interrupción y ésta es detectada por el microprocesador, I=1; una
vez atendida la interrupción, debe ponerse a I en 0 manualmente. Si no se detecta una interrupción
I=0

N: Negativo.- Se debe recordar que el microprocesador Motorola 6800 es de 16 bits de datos, por lo
cual solo puede realizar un conteo de 0 a 255 en decimal; pero considerando valores negativos el
conteo será:

0-127 ⇒ representa los números positivos de 0 a 127

128 ⇒ representa que hubo un error en algún proceso.


129-255 ⇒ representa los números negativos de 127 a 1

Si el resultado de una operación es un número que se encuentra en el rango de 0 a 128, N=0. Si el


resultado es un número que se encuentra en el rango de 129 a 255, N=1

Z: Zero; Cero.- Si el resultado de una operación es cero, Z=1; caso contrario Z=0

V: Overlow; Desborde.- Si se realiza una operación cuyo resultado sale del rango disponible para
el chip, V=1, caso contrario V=0

Ejemplo:

95 + 10 = 105 (el resultado está en el rango 0-127 para representar números positivos) ⇒ V=0

95 + 40 = 135 (el resultado está en el rango 129-255, representa un número negativo) ⇒ V=1

(-120)+ (-02)= (-122) (el resultado no sale del rango de números negativos) ⇒ V=0

(-120)+ (-30) = (-150) (no está en el rango de números negativos) ⇒ V=1

Si el resultado de una operación da como resultado el número 128 decimal, V=1

C: Carry; acarreo.- Si la operación utiliza un acarreo para dar el resultado, C=1

SUBRUTINAS.

Cuando un conjunto de instrucciones deben repetirse constantemente en algún programa, es


conveniente convertir dicho conjunto en una subrutina

BUCLE DELAY

BUC

Si

No
RTS
En el ejemplo se creó la subrutina “DELAY”; cuando en el programa principal se escribe el salto a
la subrutina “DELAY”, hará la secuencia que se encuentra debajo de la pestaña DELAY, cuando
acabe las instrucciones, la instrucción RTS hace que con otro salto vuelva al programa principal,
justo después del salto a dicha subrutina.

Gracias a ello el programa principal es mucho más corto y más fácil de entender.

Las instrucciones para el salto a una subrutina son: BSR y JSR; para volver de una subrutina se
utiliza la instrucción RTS.

BUCLE:
INC $0010
JSR DELAY
INC $0010
JSR DELAY
DEC $0010
JSR DELAY
BRA BUCLE
DELAY:
LDAB #255
BUC:
DECB
BNE BUC
RTS

Se puede notar que el uso de etiquetas facilita los saltos de subrutina. Además la subrutina debe ser
escrita debajo de la última instrucción del programa principal. Para volver de una subrutina, no se
debe olvidar escribir la instrucción RTS

PUNTERO STAC

Cuando se escribe la instrucción JSR o BSR, el contador de programa del microprocesador se


incrementa de tal modo que llegue a una nueva dirección para ejecutar las instrucciones de la
subrutina. Para poder regresar de la subrutina, el microprocesador debe saber en en que dirección
quedó el contador de programa antes de saltar. Para ello hace uso de la “STAC” que es un pequeño
espacio de memoria RAM en el cual guarda temporalmente los datos de contador de programa.
Cuando se escribe la instrucción RTS, el microprocesador consulta a la STAC a que dirección debe
volver para salir de la subrutina.

En algunos microprocesadores y microcontroladores hay un pequeño espacio de memoria RAM


destinado a la STAC; pero en el caso de Motorola 6800, este espacio debe salir de la memoria RAM
implantada, y es necesaria su configuración.

Cada salto a subrutina utilizará dos espacios de memoria RAM para almacenar al contador de
programa hacia donde el microprocesador intentará volver.
Para configurar el espacio de memoria designado para la STAC, se utilizará el código LDS.

Ejemplo:

LDS #$07

La línea anterior configura al microprocesador para utilizar el espacio de la RAM desde la dirección
0007 hacia atrás. Como cada salto a subrutina utiliza dos espacios, en este caso el programa
soportará hasta cuatro saltos a subrutina en cascada. Si vuelve de una subrutina con la instrucción
RTS, los dos espacios anteriormente usados, vuelven a estar disponibles.

Si se ejecuta un salto a subrutina, el puntero STAC utilizará los espacios de memoria 0007 y 0006.

Si dentro de la subrutina, se le pide hacer otra subrutina, el puntero STAC utilizará los espacios de
memoria 0005 y 0004.

Cuando vuelva de esta última subrutina, el puntero STAC devolverá los espacios de memoria 0004
y 0005, y si vuelve de la otra subrutina, el puntero STAC devuelve los espacios de memoria 0006 y
0007.

Si en algún momento el puntero STAC llegara la dirección 0000 y se hace un nuevo salto, no podrá
ser capaz de guardar en algún espacio de memoria al contador de programa, y no podrá volver de la
subrutina, por lo tanto el programa quedará congelado.

TIEMPO DE EJECUCION DE INSTRUCCIONES.

Para controlar algunos dispositivos, es necesario ajustar el tiempo necesario en que estos deban
funcionar, o cambiar de estado; para ello es necesario saber qué tiempo está demorando el
microprocesador en realizar las instrucciones de control a los dispositivos.

En la hoja de instrucciones de Motorola 6800 adjuntada al inicio de este documento se puede ver:

Para cada instrucción existe una columna con el signo “~”, esta columna indica el número de ciclos
que demora en ejecutarse una instrucción. Según el diseño predeterminado de computadora básica
con microprocesador Motorola 6800, se utiliza un cristal oscilador de 4 MHz, lo que significa que
cada ciclo demora 1 micro segundo en ejecutarse.
Por ejemplo la instrucción ADDA en modo inmediato, según la tabla anterior demora 2 ciclos en
ejecutarse, por tanto demorará 2 microsegundos.

A medida que se anotan más instrucciones, el microprocesador perderá más tiempo en ejecutarlas,
aunque para la percepción humana es “casi nada”.

Sin embargo algunos dispositivos si requieren tiempos exactos: un servo motor debe tener un nivel
alto por 1,5 milisegundos y 18,5 milisegundos para que su eje esté a 90 grados; una matriz de leds
debe hacer una multiplexación en sus filas de 10 milisegundos para aparentar que se encienden
todos sus leds a la vez. Otros dispositivos necesitaran estar encendidos por tiempos mayores: un
motor DC debe permanecer encendido 20 segundos para realizar algún trabajo, etc.

Por ser un lenguaje de bajo nivel, no se cuenta con instrucciones “DELAY” o “retardo” en la cual el
chip puede quedarse cierto tiempo sin “hacer nada”; deberá crearse cada una de estas subrutinas,
calculando el tiempo que demorarán.

Ejemplos:

LDAA $11 3~
STAA $10 4~
NOP 2~
NOP 2~
NOP 2~

En total se demorará 13 ~ o 13 microsegundos en realizar todas esas instrucciones

Como algunos dispositivos requerirán un tiempo mayor en su funcionamiento; se deberá hacer


rutinas de bucle que hagan perder más tiempo al microprocesador.

LDAA $11 3~
STAA $10 4~
LDAA #255 2~
Buc:
DECA 2~
BNE Buc 4~

En este caso, se hizo un bucle finito que repite 255 veces en el cual el acumulador A va
decrementando de 1 en 1 hasta llegar a 0. Las instrucciones DECA y BNE se repiten 255 veces.
En total el microprocesador se demorará 3~+4~+2~+ (2~+4~)*255=1539~ ó 1539
microsegundos, equivalentes a 1,5 milisegundos aproximadamente.
De este modo se podrá generar retardos, dependiendo la cantidad de instrucciones y de bucles
finitos.

También podría gustarte