Вы находитесь на странице: 1из 52

Departamento de Eléctrica, Electrónica y

Telecomunicaciones

Tema: Programación del Z80 con Ensamblador.

Asignatura: Microprocesadores

NRC: 3193

Docente: Ing. Miroslava Aracely Zapata

Nombre: José Luis Pallo

Sangolquí,12 de diciembre del 2018


INFORME No.06

1. Tema: Programación del Z80 con Ensamblador.

2. Objetivos:
General:
 Aprender la programación del microprocesador Z80 en lenguaje
Ensamblador utilizando el software de simulación Z80 Simulator IDE
mediante la realización de ejercicios de aplicación.
Específicos:
 Conocer el set de instrucciones que posee el microprocesador Z80.
 Familiarizarse con el entorno del software Z80 Simulator IDE así como
aprender a utilizar todas sus herramientas.
 Dar solución a problemas de la vida real mediante la programación en
Ensamblador.

3. Software
 Z80 Simulator IDE

4. Marco Teórico

Microprocesador Z80

Es un procesador de 8 bits (su tamaño de palabra es de 8 bits), bus de


direcciones de 16 bits y tiene una capacidad de direccionamiento de 64
Kbytes (= 216 bytes).

El Z80 tiene una expansión adicional de 80 instrucciones de ahí se deriva su


nombre, su repertorio suma un total de 156 instrucciones.

Figura 1.Microprocesador Zilog Z80


Arquitectura Interna

Contiene registros que incluyen dos conjuntos de seis registros de propósito


general que pueden usarse individualmente como registros de 8 bits o como
pares de registros de 16 bits. Además, hay dos conjuntos de acumuladores y
registros de bandera.

La CPU Z80 también contiene un puntero de pila, un contador de programa,


dos registros índices, un registro REFRESH y un registro INTERRUPT. La
CPU es fácil de incorporar en un sistema ya que solo requiere una única
fuente de alimentación + 5V. Todas las señales de salida están totalmente
decodificadas y sincronizadas para controlar memoria estándar o circuitos
periféricos; la CPU Z80 es compatible con una amplia familia de
controladores periféricos.

La Figura 2 ilustra la arquitectura interna y los elementos principales de la


CPU Z80.

(Zilog, 2018)

Figura 2.Arquitectura interna de la CPU Z80


Registros de la CPU

La operación básica de un microprocesador consiste en la búsqueda y


posterior ejecución secuencial de instrucciones. Cada ciclo de ejecución de
instrucción tiene dos estados básicos: el estado de búsqueda y el estado de
ejecución. El primero, transfiere una instrucción desde memoria al
microprocesador y el segundo, ejecuta la instrucción. Para realizar esas
tareas, se utilizan los registros que se muestran en la Figura 3.
(Universidad de la Republica de Uruguay, 2018)

Figura 3.Configuración de registros de la CPU Z80. (Zilog, 2018)

Podemos clasificar estos registros en dos categorías. Los Registros de


Propósito General y los Registros de Propósito Especial.
 Registro de Propósito General

Además de los 2 acumuladores, el Z80 posee 12 registros de uso general,


de 8 bits: B, C, D, E, H y L por un lado y B’, C’, D’, E’, H’ y L’ por otro.
Estos conjuntos forman 2 bancos, de los cuales uno solo puede estar
activo en un momento dado, y también existe una instrucción para
seleccionar un banco o el otro.

Los registros de uso general pueden ser vistos como memoria muy rápida,
y por lo tanto privilegiada, de la que dispone el microprocesador. Puede
realizarse una transferencia de datos directamente entre cualquiera de
ellos y memoria, y, además, pueden utilizarse como segundo operando
en las operaciones lógicas y aritméticas.

Otra característica de los registros B, C, D, E, H y L es que, agrupados


por pares B,C; D,E y H,L, se comportan como registros de 16 bits. En
muchas operaciones, el contenido de estos registros representa una
dirección de memoria. Por ejemplo, el par H,L deriva su nombre de High
memory address y Low memory address. Por esta razón, diremos que
estos tres pares pueden trabajar como punteros
a memoria.
(Universidad de la Republica de Uruguay, 2018)

 Registro de Propósito Especial

Son los registros A, F, A’, F’, IX, IY, SP, PC, I y R. Alguno de ellos son
registros de 8 bits y otros son de 16 bits.

Acumulador (A) y Registro de banderas (F)


A una de las entradas de la ALU está el ACUMULADOR, en nuestro caso
el registro A, que es un registro especial, ya que es el único que se puede
utilizar para realizar las operaciones aritméticas y lógicas de dos
operandos, uno de ellos estará obligatoriamente en el acumulador.
El registro de estado, que contiene las banderas, se llama F en el Z80. Su
función es indicar las situaciones excepcionales que se dan en el interior
del microprocesador.
El estado de las banderas se utiliza para controlar el flujo del programa,
por ejemplo, ejecutar una determinada rutina si el resultado de la última
suma fue cero.
El formato del registro de estado es el siguiente:

Figura 4.Registro de banderas.

S – Signo
Z – Cero
H – Acarreo del tercer al cuarto bit para operaciones BCD.
P/V – Doble próposito: paridad / overflow
N – Bandera de resta, para resta BCD.
C –Carry
(Universidad de la Republica de Uruguay, 2018)

Registro PC

Este registro es el contador de programa (Program Counter). Contiene


una palabra de 16 bits que representa la dirección de la siguiente
instrucción. Para cada instrucción se incrementa el contenido del registro
en el número de bytes necesarios para la codificación de la instrucción
incluidos sus operandos. Se puede modificar por programa el valor del
PC, lo cual permite modificar la dirección de la siguiente instrucción y
saltar a distintos puntos en el programa.
Registro IX

Este registro de 16 bits se llama registro de índice. El microprocesador lo


utiliza para un modo de direccionamiento especial llamado
direccionamiento indexado (o con base). El dato contenido en IX es la
dirección de una casilla de memoria específica, elegida por el
programador.

Registro IY

Es otro registro de índice siendo su utilización idéntica a la del registro IX.

Registros I y R

Estos dos registros no son de ninguna utilidad para el programador. Son


utilizados únicamente por algunas configuraciones “hardware”.
(Lepape, 1985)

Registro SP

Este registro es el apuntador de la pila (Stack Pointer). Contiene una


palabra de 16 bits que representa una dirección de la pila.

La pila es una estructura de datos LIFO (last in, first out) es decir, el último
que entro es el primero en salir, en la Figura 5 se presenta el esquema de
un “stack”. La operación de poner un dato en el stack, será PUSH
(empujar) y la de extraer un dato, POP.
(Universidad de la Republica de Uruguay, 2018)

Figura 5.Esquema del funcionamiento de la pila.


Instrucciones de la CPU Z80

La CPU Z80 puede ejecutar 158 diferentes tipos de instrucciones, incluyendo


todos los 78 de la CPU 8080A.

La instrucción consta de:

 Un código de operación ("Opcode") que indica qué operación ha de


realizarse (común a todas las instrucciones). Este campo puede tener una
longitud de uno o dos bytes.
 En algunos casos, se requiere un byte de datos (direccionamiento
inmediato) o dos bytes (direccionamiento inmediato extendido). En
algunos casos, se requiere que en la propia instrucción se especifique una
dirección, lo que implica 2 bytes adicionales (direccionamiento directo,
relativo).

Las instrucciones se dividen en los siguientes grupos principales:

Transferencia e
Intercambio

Transferencia de
bloques y búsqueda
Tipos de Instrucciones

Aritmética y lógica

Girar y desplazar

Manipulación de bits
(set, reset, test)

Transferencia de
control

Entrada / Salida

Control básico de la
CPU

Figura 6.Grupos principales de instrucciones para la CPU Z80.

(Zilog, 2018)
Instrucciones de transferencia de datos

Se trata de instrucciones que transfieren un dato de 8 bits desde un registro


de la CPU, una posición de memoria, o un valor constante a un registro de la
CPU y viceversa. EL contenido del origen nunca se ve alterado por una
lectura. Por ejemplo:

LD B, 38H

También existe la transferencia de datos de 16 bits, permite que cualquier par


de registros BC, DE, HL o los registros SP, IX e IY sean cargados
directamente con una constante, por ejemplo:

LD IX, 48F3H

o que se realice una transferencia de 16 bits desde o hacia una dirección


constante de memoria:

LD BC, (3DB1)

Instrucciones de intercambio
Permiten:
 Intercambiar datos entre registros de 16 bits de un mismo banco de
registros.
EX DE, HL
 Intercambiar acumulador y palabra de estado inactivo por activo:
EX AF, AF’
 Intercambiar banco de registros de uso general activo e inactivo:
EXX
 Intercambiar el último dato del stack con HL, IX e IY:
EX (SP), IX

Instrucciones de transferencia de bloques

Dentro de las instrucciones de transferencia de bloques LDI, LDIR, LDD y


LDDR, se utilizan los siguientes registros:
BC: número de bytes a transferir (hasta 64 K)
HL: dirección de comienzo en origen del bloque a transferir
DE: dirección de comienzo en destino.

Figura 7.Uso del registro de transferencia de bloque.

Instrucciones de búsqueda

Las instrucciones de búsqueda CPD, CPI, CPDR, CPIR, son similares a


las de transferencia y permiten detectar en qué posición de memoria se
encuentra un byte "clave". Utilizan los siguientes registros:

A: Contiene la "clave"
BC: Tamaño del bloque, como en el caso anterior.
HL: Dirección de comienzo.

Instrucciones lógicas y aritméticas

Se utilizan para sumar, restar, comparar, hacer AND, OR, XOR entre 2
operandos de 8 bits, uno de los cuales está en el acumulador.
Existen 2 variedades de suma: ADD y ADC. La primera es la suma común
de dos datos de 8 bits. La segunda, además de la suma entre los 2
operandos, suma el contenido de la bandera de Carry: esto es útil para
trabajar con números de más de 8 bits.
Lo mismo es cierto para "el préstamo" de la resta, por lo cual existen dos
restas, la común SUB y SBC, que efectúa la resta común y al resultado le
resta el contenido anterior del carry.
Una instrucción muy interesante es la de comparación. Si efectuamos:
CP operando_8_bits el microprocesador efectúa la resta,
A-operando_8_bits,
y afecta las banderas de cero, signo, acarreo y H, pero descarta el
resultado de la resta, es decir, no lo guarda.

Este grupo de instrucciones se completa con las operaciones lógicas


habituales (AND, OR, XOR) y las de incremento y decremento
(INC y DEC).

Instrucciones aritméticas de propósito general y control de la CPU

Se trata de instrucciones que todas utilizan direccionamiento implícito,


involucrando uno o ningún operando.

 Operaciones de complemento del Acumulador


NEG: Complemento a 2 del acumulador.
CPL: Complemento lógico (complemento a 1)
 Existen instrucciones referentes a la bandera de carry:
SCF: Setea C = 1;
CCF: invierte el valor de C.
 Otras operaciones:
NOP: es una instrucción que no hace nada: sirve para, por
ejemplo, "rellenar" un bucle de tiempo.
HALT: Es una instrucción para detener al procesador. Típicamente,
se utiliza esta instrucción con dos finalidades. Una posibilidad, es
que el programa haya realizado todas sus tareas, y la otra, es que
el programa deba esperar por una interrupción.
DI, EI: deshabilita y habilita interrupciones enmascarables.
IM0, IM1, IM2: Se refieren al modo de interrupción, que se verá
después.
Rotación y desplazamiento

Este grupo de instrucciones tiene por finalidad la manipulación de los bits


de un registro o una posición de memoria.
En la Figura 8 se muestran cómo funcionan las instrucciones de rotación.

Figura 8.Instrucciones de rotación.

En cuanto a las instrucciones de desplazamiento se muestran en la Figura


9. En el desplazamiento aritmético a la derecha (SRA) se repite
el bit de signo, lo cual equivale a dividir por 2. En el desplazamiento
aritmético a la izquierda (SLA) se rellena con un cero, lo que implica
multiplicar por 2.
El desplazamiento lógico a la derecha puede verse también como una
división por dos en el caso de enteros sin signo.
Figura 9. Instrucciones de desplazamiento.

Bit set, reset y test

Existen tres operaciones básicas a ser realizadas sobre bits.


Estos bits pueden corresponder a uno de los registros de 8 bits de la CPU
o a un operando de memoria. La operación BIT B, R donde B es un No.
del 0 al 7 y R es un registro, setea la bandera Z si el bit B-ésimo de R es
0 y la resetea en caso contrario. También pueden setearse o resetearse
bits mediante SET, y RES:

RES 4, (HL)

Supongamos que HL = 2345, y que (2345) = F0, luego de la operación


será (2345) = E0.

Instrucciones de transferencia de control

Pueden dividirse en saltos (Jumps), Llamados a subrutinas (Calls) y


retornos (Returns).
 Los saltos causan la transferencia de control a otra posición de
memoria y no guardan el contenido anterior del PC.
 Los llamados a subrutinas realizan la misma acción que los jump, pero
salvan el PC en el stack de modo de que al retornar se ejecute la
instrucción que sigue al call.
 El Return realiza el "pop" del PC desde el Stack, provocando que se
ejecute la instrucción que estaba a continuación del call en el programa
principal.
 Las instrucciones CALL y RET se utilizan para procesar subrutinas.
 Decremento y salto
La instrucción DJNZ despl, decrementa B, y si el resultado no es
cero, salta. Si B = 0, no salta.

A los efectos de resumir todas las instrucciones que dependen del


estado de lasbanderas como los saltos, llamadas y retonos se presenta
la Tabla 1.

Tabla 1. Instrucciones que pueden utilizar los estados de las banderas.

Instrucciones de entrada y salida

El Z80 tiene un espacio de direccionamiento de I/O de 256 bytes. Puede


transferirse datos entre cualquiera de las direcciones de I/O y los registros
A, B, C, D, E, H y L. Para ello existen las instrucciones IN y OUT.
Permiten transferir un bloque de datos desde o hacia un determinado
puerto.
(Universidad de la Republica de Uruguay, 2018)
El Ensamblador del Z80

El único lenguaje que entiende un procesador es la secuencia de "0" y "1"


que lee de su memoria de programa e interpreta como instrucciones de su
repertorio. A esa secuencia de "0" y "1" se le llama código de máquina de un
programa.

El LENGUAJE ENSAMBLADOR o ASSEMBLER permite un mayor nivel de


abstracción que se encuentra encima del código de máquina, pero por debajo
de los lenguajes de alto nivel.

Ventajas del Lenguaje Ensamblador

 El assembler nos permite controlar todos los recursos del hardware


que estamos usando.
 Los programas escritos en assembler pueden ser muy eficientes
tanto en tiempo de ejecución como en tamaño.
 A cada instrucción del procesador le corresponde una abreviación
mnemotécnica o MNEMONICO que la hace más comprensible por
el programador.
 Se permite además definir símbolos para identificar direcciones de
memoria o valores utilizados a menudo a lo largo del programa.
Figura 10. Proceso de desarrollo de un programa.
5. Ejercicios de Aplicación

5.1. Suma de dos Números

Realizar la suma de dos números decimales, y presentar su resultado.


Utilizar rutinas y subrutinas.

Definición de la solución

Se necesita sumar dos números ingresados por el usuario, el resultado de


la suma deberá mostrarse en el puerto de salida para poder verificar que
el resultado sea correcto. Para realizar la operación se necesitará de lo
siguiente:

 Ingresar los datos (N1, N2).


 Almacenar los datos.
 Sumar los dos números anteriormente almacenados.
 Presentar el resultado (R).

Diagrama de Flujo

Teniendo en cuenta lo anterior se procede a realizar la lógica del programa


mediante un Diagrama de Flujo, Figura 11.

INICIO

N1=0,
N2=0, R=0

R=N1+N2

"Resultado= “, R

FIN

Figura 11.Diagrama de Flujo para la suma de dos números.


Programa

Se realiza el programa en Ensamblador que cumpla con la lógica


mostrada en el Diagrama de Flujo, para lo cual:

 El ingreso de los datos involucrados en la operación se realizará


por medio de la instrucción IN
 Se almacenan los datos en la RAM para ser utilizados
posteriormente.
 La suma de los dos números anteriormente almacenados se
realizará utilizando la instrucción ADD.
 Para presentar el resultado en base decimal se utilizará la
instrucción DAA (ajuste decimal del acumulador).
 El resultado se mostrará por medio de los puertos de salida con la
ayuda de la instrucción OUT.

Código en Ensamblador

A continuación, se presenta el código en Ensamblador que permite la


suma de dos números.

INICIO:
LD SP,1500H ;INICIALIZACION DE LA PILA (1500H)
LD HL,1000H ;INICIALIZACION DE LA RAM (1000H)
JP PROGRAMA

INPUT_VARIABLE:
IN A,(02H)
LD (HL),A
RET
SUMA:
ADD A,(HL)
DAA
RET
OUTPUT_VARIABLE:
OUT (03H),A
RET

PROGRAMA:
CALL INPUT_VARIABLE
INC HL
CALL INPUT_VARIABLE
DEC HL
CALL SUMA
CALL OUTPUT_VARIABLE
HALT
END
Prueba de funcionamiento

Como se observa en la Figura 12 se ingresará los datos 9 y 6 por el puerto


02H.

Figura 12.Ingreso de datos para la suma a través del puerto 02H.

Los datos ingresados anteriormente son almacenados en la RAM


inicializada en 1000H como se puede apreciar en la Figura 13. Estos
datos serán utilizados para la realización de la operación Suma. El
resultado esperado de la operación será 9+6=15.

Figura 13.Datos almacenados en la RAM.

Mediante el puerto de salida 03H se presenta el resultado, cabe recalcar


que el resultado se presenta en leds en formato BCD. En la Figura 14 se
observa que el valor mostrado es 15, que es el resultado esperado de la
operación.

Figura 14. Respuesta de la suma 9+6


5.2. Multiplicación de dos números

Realizar una multiplicación de dos números, la multiplicación será hasta


la tabla del 9. Utilizar rutinas y subrutinas.

Definición de la solución

Se necesita multiplicar dos números ingresados por el usuario, la máxima


multiplicación será 9x9, el resultado de la suma deberá mostrarse en el
puerto de salida para poder verificar que el resultado sea correcto. Para
realizar la operación se necesitará de lo siguiente:

 Ingresar los datos (N1, N2).


 Almacenar los datos.
 Sumar sucesivamente N2 cuantas veces indique N1.
 Presentar el resultado (R).

El proceso de multiplicación mediante sumas sucesivas se explicará


mediante un ejemplo:

Si N1=5 y N2=2, N1 indicara las veces que N2 debe sumarse, en este


caso el numero 2 debe sumarse 5 veces

2+2+2+2+2 = 10,

Obteniendo de esta manera el resultado de 5x2.

Teniendo en cuenta el análisis anterior se procede a realizar la lógica del


programa mediante un Diagrama de Flujo para la multiplicación mediante
sumas sucesivas.

Diagrama de Flujo

Teniendo en cuenta lo anterior se procede a realizar la lógica del programa


mediante un Diagrama de Flujo mostrado en la Figura 15.
INICIO

N1=0,
N2=0, R=0

Decremento
N1

NO
R=R+N2 N1 =0

SI

"Resultado= “, R

FIN

Figura 15.Diagrama de Flujo para la multiplicación mediante sumas sucesivas.

El Diagrama de Flujo muestra el proceso de la suma mediante sumas


sucesivas, este proceso se repetirá hasta que el primer operando (N1) sea
cero, caso contrario como muestra el DF seguirá decrementando N1 y
sumando N2, de este modo se logra obtener la multiplicación deseada.

Programa

Se realiza el programa en Ensamblador que cumpla con la lógica


mostrada en el Diagrama de Flujo, para lo cual:

 El ingreso de los datos involucrados en la operación se realizará


por medio de la instrucción IN
 Se almacenan los datos en la RAM para ser utilizados
posteriormente.
 Se decremento el primer operando con la instrucción DEC este dirá
la cantidad de veces que se sumará el segundo operando.
 Mediante LD se cargará al registro acumulador el valor actualizado
de la suma del segundo operando la cantidad de veces que el
primer operando lo indique.
 La suma sucesiva del segundo operando se realizará utilizando la
instrucción ADD.
 Para presentar el resultado en base decimal se utilizará la
instrucción DAA (ajuste decimal del acumulador).
 El resultado se mostrará por medio de los puertos de salida con la
ayuda de la instrucción OUT.

Código en Ensamblador

A continuación, se presenta el código en Ensamblador que permite la


multiplicación de dos números.

INICIO:
LD SP,1500H ;inicializa la PILA
LD HL,1000H ;inicializa la RAM
JP PROGRAMA ;salto-cuerpo del programa

INPUT:
;permite el ingreso de las variables a multiplicar
IN A,(00H)
LD B,10
CP B
JP NC,INPUT
RET C
MULT:
;realiza la multiplicacion mediante sumas sucesivas
ADD A,B
DAA
DEC (HL)
JP NZ,MULT
RET Z

PROGRAMA:
;cuerpo del programa, llama a las subrutinas necesarias
CALL INPUT
LD (HL),A
INC HL
CALL INPUT
LD (HL),A
LD B,A
LD A,0
DEC HL
CALL MULT
OUT (01H),A
HALT
END
Prueba de funcionamiento

Para comprobar el funcionamiento del programa se ingresa como ejemplo


los operados 8 y 5, los cuales son ingresados por el puerto (00H) como
se muestra en la Figura 16.

Figura 16.Entrada de datos para la multiplicación.

Los datos son almacenados en la RAM (1000H) para posteriormente


realizar el proceso de la multiplicación mediante sumas sucesivas.

El primer operando, 8, de la Figura 17, se decrementa y al mismo tiempo


se observa la suma actual en el registro acumulador.

Como se puede observar en la Figura 17 a medida que se decrementa el


primer operando (8,7,6,5,…,0) en el registro acumulador se actualiza el
resultado de la suma sucesiva.

Cuando el 8 ha llegado a cero, en el registro acumulador se tiene la


respuesta de la operación (8x5=40). Esto quiere decir que el número 5 se
ha sumado 8 veces sucesivamente.
Figura 17. Proceso de multiplicación mediante suma sucesiva.

El resultado determinado anteriormente se presenta en formato BCD


mediante leds en un puerto de salida (01H) como muestra la Figura 18, el
resultado es el correcto para la operación de multiplicación 8x5 verificando
el correcto funcionamiento del programa.

Figura 18.Resultado de la multiplicación 8x5 en el puerto (01H).


5.3. Conducir hasta la Universidad

Para conducir un auto hasta la universidad su primer paso es encenderlo


y verificar si tiene combustible, para poder llegar a su destino es
necesario determinar si el tanque de gasolina está por debajo de la mitad
y si es así irá a una gasolinera para llenarlo. Como no se sabe si está en
¼ o menos y solo se dispone de 15 dólares, se decidirá si se paga con
efectivo o con tarjeta de crédito. Con el tanque lleno se puede llegar al
destino.

Definición de la solución

Se necesita simular el proceso que realiza un auto con bajo nivel de


gasolina para poder llegar a su destino, para lo cual se establecerá un
nivel inicial de gasolina. Se asumirá que se llena con 8 galones, pero
dispone inicialmente de 2 galones.

Para iniciar el proceso, a continuación, se establecerá las condiciones con


las que se realizará el proceso:

 Se deberá primeramente encender el automóvil y si no enciende


se realizará un chequeo.
 Verificar el nivel de gasolina en este caso iniciara con 2 galones, si
el tanque está lleno ira hasta la universidad. Como el tanque estará
menos de la mitad se procederá a enviar el auto a la gasolinera.
 En la gasolinera solamente se podrá llenar el tanque
completamente de esta manera el proceso se simplificará.
 El pago después de llenar el tanque será con tarjeta de crédito o
con efectivo para lo cual se deberá realizar una consulta al usuario
para establecer la forma de pago.
 Una vez realizado este proceso se procede a conducir hasta la
universidad ya que el proceso a terminado.
Diagrama de Flujo

Teniendo en cuenta lo anterior se procede a realizar la lógica del programa


mediante un Diagrama de Flujo mostrado en la Figura 19.

INICIO

E=0, C=0,
P=0

Intentar
encender

NO
¿Encendió? Revisar auto

SI

¿Gasolina? Ir a la Llenar
NO
gasolinera tanque

SI

Tarjeta Efectivo
¿Pago?

Cancela con Cancela con


tarjeta efectivo

Conducir a la
Universidad

FIN

Figura 19.Diagrama de Flujo para el proceso de conducción de un automóvil.


Como se observa en el Diagrama de Flujo posee tres variables de entrada
que se necesitaran introducir al momento de realizar el programa. Estas
variables son E, para encender el auto, C, para el combustible, y P, para
indicar la forma de pago.

Programa

Para la realización del programa en Ensamblador se toma en cuenta lo


siguiente:

 El ingreso de las variables para el encendido, combustible y forma


de pago se realizará por medio de la instrucción IN.
El auto solo encenderá si se ingresa la letra “E” con cualquier otra
opción pedirá que verifique el estado del auto.
Para el llenado del tanque se deberá ingresar el número de galones
que falta en este caso “6” galones de gasolina.
La forma de pago se indicará con “E” si es efectivo y con “C” si es
tarjeta de crédito.
 El nivel de combustible inicial se almacenará en la RAM para ser
utilizados posteriormente en la operación de llenado de tanque.
 Mediante LD se transferirán las variables al acumulador para las
operaciones.
 Mediante la instrucción ADD se realiza la suma del combustible
que se pondrá al combustible que ya se disponía.
 La instrucción CP la utilizaremos para comparar las variables de
entrada y darle condiciones al flujo del programa.
 Para saltar a los diferentes subprocesos que realizara se utiliza JP
con las condiciones establecidas en el programa.
 Los mensajes y señales de estado de funcionamiento se mostrarán
en los puertos de salida con la instrucción OUT.

Código en Ensamblador

A continuación, se presenta el código en Ensamblador que permite


realizar el proceso de conducción de un automóvil hasta la universidad.
INICIO: GALON_6:
LD SP,1500H LD A,(HL)
LD HL,1000H ADD A,252
JP PROGRAMA OUT (03H),A
RET
ENCENDER: PAGAR:
IN A,(00H) ;ENCID CON "E" IN A,(02H)
LD B,0EH LD B,0EH
CP B CP B
JP NZ,VERIFICAR_AUTO JP Z,EFECTIVO
LD A,1 LD B,0CH
OUT (00H),A CP B
LD A,3 ;NIV. INIC. DE GAS. JP Z,CREDITO
OUT (03H),A JP NZ,PAGAR
LD (HL),A EFECTIVO:
RET Z LD A,45H
OUT (07H),A
VERIFICAR_AUTO: LD A,46H
LD A,56H OUT (07H),A
OUT (07H),A LD A,45H
LD A,45H OUT (07H),A
OUT (07H),A LD A,43H
LD A,52H OUT (07H),A
OUT (07H),A LD A,54H
LD A,49H OUT (07H),A
OUT (07H),A LD A,49H
LD A,46H OUT (07H),A
OUT (07H),A LD A,56H
LD A,49H OUT (07H),A
OUT (07H),A LD A,4FH
LD A,43H OUT (07H),A
OUT (07H),A RET
LD A,41H CREDITO:
OUT (07H),A LD A,43H
LD A,52H OUT (07H),A
OUT (07H),A LD A,52H
LD A,20H OUT (07H),A
OUT (07H),A LD A,45H
LD A,20H OUT (07H),A
OUT (07H),A LD A,44H
LD A,48H OUT (07H),A
JP ENCENDER LD A,49H
OUT (07H),A
COMBUSTIBLE: LD A,54H
LD B,31 OUT (07H),A
CP B LD A,4FH
JP C,CARGAR_COMB OUT (07H),A
RET NC RET

CARGAR_COMB: UNIVERSIDAD:
IN A,(02H) INC A
LD B,6 ;LLENADO 6 GAL. OUT (04H),A
CP B LD B,255
JP Z,GALON_6 CP B
JP NZ,CARGAR_COMB JP NZ,ADICION
RET Z
ADICION:
ADD A,A
JP UNIVERSIDAD
PROGRAMA:
;PROGRAMA PRINCIPAL
XOR A
OUT (00H),A ;LIMPIA PORTS
OUT (03H),A ;LIMPIA LOS PUERTOS OUTPUT
OUT (04H),A ;LIMPIA LOS PUERTOS OUTPUT

CALL ENCENDER
CALL COMBUSTIBLE
CALL PAGAR

OUT (05H),A
LD A,0

CALL UNIVERSIDAD

HALT
END

Prueba de funcionamiento

Al iniciar el programa la primera variable que solicita es la del encendido


del auto, como se muestra en la Figura 20, solo si se ingresa la letra “E”
como se mencionó anteriormente el auto encenderá, activando un led de
“auto encendido” por el puerto (01H).

Figura 20.Encendido del auto y led indicador de encendido.

En el caso de que se ingrese otra variable el auto no encendera y no se


activara el led de encendido, ademas el programa mostrara el mensaje
“Verificar”, Figura 21, indicando que se revise el auto y que se intente
encender nuevamente.
Figura 21.Auto no enciende, verificar estado del auto.

Una vez que el auto este encendido se muestra el nivel de gasolina por el
puerto (03H), los dos leds encendidos indican que el tanque dispone de 2
galones de gasolina al momento, al mismo tiempo este dato es guargago
en la RAM para ser utilizado posteriormente.

Figura 22.Nivel de gasolina inicial del auto.

Como el nivel de gasolina es bajo se procede a dirigirse a la gasolinera


para llenar el tanque, como se observo en la Figura 22, hacia falta 6
galones para llenar el tanque, en este paso el programa pedira ingresar
los galones necesarios para tener el tanque lleno. Como se observa en la
Figura 23 se ha ingresado el “6” y el tanque se ha llenado completamente.
Para esta operación se ha sumado el dato inicial de gasolina almacenado
en la RAM con el valor correspondiente para mostrar un tanque lleno (8
leds encendidos).

Figura 23.Tanque de gasolina lleno (8 leds encendidos).

La Figura 24 y 25 muestran el proceso a continuación en el cual se pide


al ususario que indique la forma de pago. Si se paga con efectivo se
ingresa la letra “E” y mostrara en el puerto (07H) el mensaje “EFECTIVO”,
si se ingresa la letra “C” se indicara que el pago es con tarjeta de credito,
mostrando por el mismo puerto el mensaje “CREDITO”.

Figura 24. Pago con Efectivo


Figura 25.Pago con Tarjeta de crédito.

Un barrido de leds simulara el movimiento del auto y a la vez indicando


que el proceso ha terminado y que se ha cumplido con todo lo requerido,
finalizando el programa.
5.4. Lavar la ropa blanca en la lavadora

Un estudiante desea lavar su ropa blanca en la lavadora para lo cual


deberá separar su ropa blanca de la de color y añadir 60 litros de agua
a la lavadora y posteriormente la ropa blanca. Para un buen lavado se
deberá agregar ¼ de detergente, encender la lavadora y dejar funcionar
por 25 min una vez trascurrido el tiempo se saca la ropa y si está limpia
se procede a sacarla de lavadora para secarla, si no está limpia se lava
por 5 min más. Se enjuaga en agua limpia y se exprime para luego
dejarla secar al sol.

Definición de la solución

Se necesita simular el proceso para el lavado de ropa blanca en una


lavadora. Como consta de procesos específicos solo es necesario
confirmar que dichas acciones se han realizado para que el programa siga
su curso. Únicamente para indicar la cantidad de detergente y si la ropa
está limpia se necesitará verificar las condiciones y procedimientos a
seguir en caso de que se cumpla o no la condición.

 Primero se deberá confirmar que se ha separado la ropa para luego


agregar los 60 litros de agua.
 Lo siguiente será poner la ropa y agregar el detergente.
 Para el detergente se deberá verificar si se ha colocado mucho o
poco.
 Con el nivel adecuado de detergente se deberá encender la
lavadora por 25 minutos.
 A continuación, para el buen lavado habrá que comprobar que esté
limpia y si no encenderla por 5 minutos más.
 Luego de este proceso ya se podrá simplemente proceder a sacar
la ropa, exprimirla y dejarla secar.
Diagrama de Flujo

Teniendo en cuenta lo anterior se procede a realizar la lógica del programa


mediante un Diagrama de Flujo, Figura 26.

INICIO

C=0, D=0,
L=0

Separar ropa
blanca

Añadir 60litros
de agua

Poner ropa
blanca en la
lavadora

Agregar
detergente

NO
1/4 de
detergente?

SI

Encender y
lavar 25 min

NO
¿Limpia?

Lavar 5 min mas


SI

Sacar la ropa

Enjuagar, exprimir y
secar al sol

FIN

Figura 26.Diagrama de Flujo para el proceso de Lavar ropa blanca en la lavadora.


Como se observa en el Diagrama de Flujo, este posee tres variables de
entrada que permitirán el flujo del programa. Estas variables son, C, para
la confirmación de las acciones, D, para el ingreso de detergente y L para
indicar si la ropa está Limpia.

Programa

Para la realización del programa en Ensamblador se toma en cuenta lo


siguiente:

 El ingreso de las variables para confirmar un proceso, ingreso de


detergente y para indicar si está limpio se realiza por medio de la
instrucción IN.
Con un “1” se indicará que se está listo para continuar con “0” para
indicar que no está listo.
Para el agua se digitará 60 que es la cantidad pedida si no es 60
no continuara el programa.
Para el detergente se deberá ingresar 14 para indicar 1/4 de
detergente.
 Mediante LD se transferirán las variables al acumulador para las
operaciones y comparaciones.
 La instrucción XOR limpiara los registros para poner en cero los
puertos de salida.
 La instrucción CP la utilizaremos para comparar las variables de
entrada y darle condiciones al flujo del programa.
 Para saltar a los diferentes subprocesos que realizara se utiliza JP
con las condiciones establecidas en el programa.
 Los mensajes y señales de estado de funcionamiento se mostrarán
en los puertos de salida con la instrucción OUT.

Código en Ensamblador

A continuación, se presenta el código en Ensamblador que permite


realizar el proceso de lavado de ropa blanca en una lavadora.
INICIO: OUT (07H),A LD A,43H
LD SP,1500H LD A,47H OUT (07H),A
LD HL,1000H OUT (07H),A LD A,4FH
JP PROGRAMA LD A,55H OUT (07H),A
OUT (07H),A LD A,20H
SEP_ROPA: LD A,41H OUT (07H),A
JP MENSAJE_1 OUT (07H),A LD A,44H
SEP_ROPA1: LD A,20H OUT (07H),A
IN A,(02H) OUT (07H),A LD A,45H
LD B,01H JP AGUA1 OUT (07H),A
CP B LD A,54H
JP NZ,MENSAJE_1 COLOCAR_ROPA: OUT (07H),A
RET Z JP MENSAJE_3 LD A,45H
MENSAJE_1: COLOC_ROPA1: OUT (07H),A
LD A,53H IN A,(02H) LD A,52H
OUT (07H),A LD B,01H OUT (07H),A
LD A,45H CP B LD A,47H
OUT (07H),A JP NZ,MENSAJE_3 OUT (07H),A
LD A,50H RET Z LD A,45H
OUT (07H),A MENSAJE_3: OUT (07H),A
LD A,41H LD A,50H LD A,4EH
OUT (07H),A OUT (07H),A OUT (07H),A
LD A,52H LD A,4FH LD A,54H
OUT (07H),A OUT (07H),A OUT (07H),A
LD A,45H LD A,4EH LD A,45H
OUT (07H),A OUT (07H),A OUT (07H),A
LD A,20H LD A,45H LD A,20H
OUT (07H),A OUT (07H),A OUT (07H),A
LD A,52H LD A,52H JP DETERGENTE1
OUT (07H),A OUT (07H),A MENSAJE_5:
LD A,2EH LD A,20H LD A,4DH
OUT (07H),A OUT (07H),A OUT (07H),A
LD A,20H LD A,52H LD A,55H
OUT (07H),A OUT (07H),A OUT (07H),A
LD A,42H LD A,4FH LD A,43H
OUT (07H),A OUT (07H),A OUT (07H),A
LD A,4CH LD A,50H LD A,48H
OUT (07H),A OUT (07H),A OUT (07H),A
LD A,41H LD A,41H LD A,4FH
OUT (07H),A OUT (07H),A OUT (07H),A
LD A,4EH LD A,20H LD A,20H
OUT (07H),A OUT (07H),A OUT (07H),A
LD A,43H JP COLOC_ROPA1 LD A,44H
OUT (07H),A OUT (07H),A
LD A,41H DETERGENTE: LD A,45H
OUT (07H),A JP PONER_DET OUT (07H),A
LD A,20H DETERGENTE1: LD A,54H
OUT (07H),A IN A,(02H) OUT (07H),A
JP SEP_ROPA1 LD B,14H LD A,45H
CP B OUT (07H),A
AGUA: ; LLENO=60H JP C,MENSAJE_4 LD A,52H
JP MSJ_2 JP NC,MUCHO OUT (07H),A
AGUA1: MUCHO: LD A,47H
IN A,(02H) JP NZ,MENSAJE_5 OUT (07H),A
LD B,60H RET Z LD A,45H
CP B MENSAJE_4: OUT (07H),A
;JP NZ MSJ_2 LD A,50H LD A,4EH
RET Z OUT (07H),A OUT (07H),A
MSJ_2: LD A,4FH LD A,54H
LD A,41H OUT (07H),A OUT (07H),A
LD A,45H OUT (07H),A OUT (07H),A
OUT (07H),A LD A,4EH LD A,52H
LD A,20H OUT (07H),A OUT (07H),A
OUT (07H),A LD A,44H LD A,49H
JP DETERGENTE1 OUT (07H),A OUT (07H),A
LD A,45H LD A,4DH
PONER_DET: OUT (07H),A OUT (07H),A
LD A,50H LD A,52H LD A,49H
OUT (07H),A OUT (07H),A OUT (07H),A
LD A,4FH LD A,20H LD A,52H
OUT (07H),A OUT (07H),A OUT (07H),A
LD A,4EH JP ENCENDER1
OUT (07H),A LD A,20H
LD A,45H LAVAR: OUT (07H),A
OUT (07H),A INC A LD A,59H
LD A,52H OUT (04H),A OUT (07H),A
OUT (07H),A LD B,25H LD A,20H
LD A,20H CP B OUT (07H),A
OUT (07H),A JP NZ,LAVAR LD A,53H
LD A,44H RET Z OUT (07H),A
OUT (07H),A LD A,45H
LD A,45H EXTRA: OUT (07H),A
OUT (07H),A LD A,4CH LD A,43H
LD A,54H OUT (07H),A OUT (07H),A
OUT (07H),A LD A,49H LD A,41H
LD A,45H OUT (07H),A OUT (07H),A
OUT (07H),A LD A,4DH LD A,52H
LD A,52H OUT (07H),A OUT (07H),A
OUT (07H),A LD A,50H LD A,20H
LD A,47H OUT (07H),A OUT (07H),A
OUT (07H),A LD A,49H RET
LD A,45H OUT (07H),A
OUT (07H),A LD A,41H ACTIVACION:
LD A,4EH OUT (07H),A LD A,01H
OUT (07H),A LD A,3FH OUT (00H),A
LD A,54H OUT (07H),A LD A,00H
OUT (07H),A LD A,20H OUT (00H),A
LD A,45H OUT (07H),A LD A,01H
OUT (07H),A OUT (00H),A
LD A,20H IN A,(02H) LD A,00H
OUT (07H),A LD B,01H OUT (00H),A
JP DETERGENTE1 CP B LD A,01H
LD A,0 OUT (00H),A
ENCENDER: RET Z LD A,00H
JP MSJ_6 MIN_5: OUT (00H),A
ENCENDER1: INC A LD A,01H
IN A,(02H) OUT (04H),A OUT (00H),A
LD B,01H LD B,5H LD A,00H
CP B CP B OUT (00H),A
RET Z JP NZ,MIN_5 LD A,01H
MSJ_6: JP EXTRA OUT (00H),A
LD A,45H LD A,00H
OUT (07H),A FINAL: OUT (00H),A
LD A,4EH LD A,45H LD A,01H
OUT (07H),A OUT (07H),A OUT (00H),A
LD A,43H LD A,58H LD A,00H
OUT (07H),A OUT (07H),A OUT (00H),A
LD A,45H LD A,50H RET
PROGRAMA:
;programa principal
XOR A
OUT (00H),A ;limpia el puerto
OUT (03H),A ;limpia el puerto
OUT (04H),A ;limpia el puerto
OUT (05H),A ;limpia el puerto

CALL SEP_ROPA
CALL ACTIVACION
CALL AGUA
OUT (03H),A
CALL COLOCAR_ROPA
CALL ACTIVACION
CALL DETERGENTE
CALL ACTIVACION
LD A,14H
OUT (05H),A

CALL ENCENDER
CALL ACTIVACION
CALL LAVAR
CALL EXTRA
CALL FINAL

HALT
END

Prueba de funcionamiento

Al iniciar el programa este me pide que separe la ropa blanca, como se


muestra en la Figura 27.

Figura 27.Accion que el usuario debe hacer para continuar el programa.

Mediante el puerto de entrada (02H) confirmo si se ha realizado lo que el


programa ha pedido, en la Figura 28 se aprecia que se ha ingresado el “1”
con el cual indico que sí y que el programa puede continuar, el led del
puerto de salida (00H) parpadea indicando que acepto el comando, en la
Figura 29 se aprecia que se ha ingresado el “0” indicando que no está
listo, el programa vuelve a mostrar el mensaje “SEPARE R. BLANCA” por
el puerto (07H).
Figura 28.Ingreso de "1" para confirmar. Figura 29.Ingreso de "0" para indicar que no
está listo.

Una vez que le haya confirmado al programa que se realizó la acción de


“separar ropa blanca” inmediatamente pasa a pedir la cantidad de agua,
si no se ingresa la cantidad correcta volverá a pedir hasta ingresar la
cantidad correcta, 60 litros, en la Figura 30 ya se ha ingresado dicha
cantidad y es mostrada por el puerto (03H).

Figura 30.Ingreso de la cantidad de agua requerida (60 litros).

Nuevamente me pide realizar una acción "PONER ROPA", para lo cual el


programa espera la confirmación, para la Figura 31 se ha digitado "1" para
indicar que se ha realizado la acción con lo cual el led parpadea, en la
Figura 32 se ha digitado "0" indicando que aún no se ha realizado la
acción, el programa responde volviendo a mostrar el mensaje "PONER
ROPA".
Figura 31.Se ha colocado la ropa, led Figura 32.No se ha colocado la ropa, led no
parpadea. parpadea.

Posteriormente solicitara que se ingrese la cantidad de detergente Figura


32, la cantidad de detergente que se necesita es un ¼ por lo que se deberá
ingresar el número “14”.

Figura 33.Solicitud de detergente.

Si la cantidad de detergente ingresada no es la correcta mostrara un


mensaje indicando “MUCHO DETERGENTE”, Figura 34, o “POCO
DETERGENTE”, Figura 35, según sea el caso.

Figura 34.Mucha cantidad de Figura 35.Poca cantidad de detergente


detergente ingresada. ingresada.

Solo en el caso de haber ingresado la cantidad correcta el programa


acepta el valor y lo muestra mediante el puerto (05H) como se observa en
la Figura 36.

Figura 36.Ingreso de cantidad correcta de detergente.


Al encender la lavadora mediante el puerto (04H) se realiza un conteo del
0 al 25 indicando los 25 minutos que estará funcionando la lavadora, una
vez se detenga en 25 (Figura 37) el programa procederá a preguntar si la
ropa se encuentra Limpia (Figura 38).

Figura 37.Puerto (04H) que mostrara el tiempo transcurrido, 25 min.

Figura 38.Mensaje para verificar si la ropa está limpia.

Si se digita “0” se indicará no se encuentra limpia y se realizará un conteo


del 0 al 5 para indicar los 5 minutos extra de lavado y volverá a preguntar
si la ropa se encuentra limpia, el bucle se repetirá hasta indicar que la ropa
está bien lavada (Figura 39).

Figura 39.Lavado extra, conteo de 5 min.


Si se digita “1” el proceso habrá terminado ya que se indicará al programa
que la ropa ha quedado limpia, se mostrara el mensaje “EXPRIMIR Y
SECAR” como indicara la Figura 40.

Figura 40.Final del proceso de lavado.


5.5. Proceso para bañarse

Una persona para bañarse sigue un mismo proceso siempre, si la


persona se encuentra o se siente sucio procede a bañarse, si él no se
encuentra sucio no se baña. En el caso de que la persona decida
bañarse, se preparará para hacerlo y seguidamente se dirigirá al baño,
ya en el baño verifica si tiene agua caliente (gas en el tanque). Hace lo
anterior ya que el únicamente se bañará si hay agua caliente. Si tiene
agua caliente en su casa se desvestirá y esperará a que se caliente el
agua. Para bañarse él se enjabonará y se enjuagará, una vez hecho esto
saldrá de la bañera y para completar su baño se secará.

Definición de la solución

Para solucionar el enunciado anterior debemos tener en cuenta los


siguientes puntos:

 Solo se baña si se encuentra sucio caso contrario no.


 Si la persona decide bañarse debe comprobar que haya agua
caliente, si no hay agua caliente no se bañara.
 Posteriormente se desviste y espera a que el agua se caliente.
 Si el agua está caliente se enjabona y se enjuaga.
 Si ya está listo sale y se seca, si no está listo se enjuaga
nuevamente hasta estar listo.

Diagrama de Flujo

Teniendo en cuenta lo anterior se procede a realizar la lógica del programa


mediante un Diagrama de Flujo (Figura 41).
INICIO

C=0

NO
¿Desea
bañarse?

SI

¿Hay agua NO
caliente?

SI

Desvestirse

Calentar agua,
15 s.

NO
¿Caliente?

SI

Enjabonar

Enjuagar

NO
¿Listo?

SI

Salir y secarse

FIN

Figura 41.Diagrama de Flujo para el proceso de bañado de una persona.


Como se observa en el diagrama de flujo de la Figura 41, el proceso
terminara si la persona no desea bañarse o si no tiene agua caliente. En
la parte de calentar el agua se lo realizará por 15 segundos y luego de
comprobar que está caliente se podrá continuar. De igual manera para
indicar que está listo caso contrario procederá a enjabonarse
nuevamente.

Programa

Para la realización del programa en Ensamblador se toma en cuenta lo


siguiente:

 La única variable de entrada sera para confirmar un proceso “1”


para sí, “0” para no, el ingreso se realiza por medio de la instrucción
IN.
 Mediante LD se transferirán las variables al acumulador para las
operaciones y comparaciones.
 La instrucción XOR limpiara el acumulador para posteriormente
limpiar los puertos.
 La instrucción CP se utiliza para comparar si se ingresa un 1 o un
0.
 Para saltar a los diferentes subprocesos que realizara se utiliza JP
con las condiciones establecidas en el programa.
 Los mensajes y señales de estado de funcionamiento se mostrarán
en los puertos de salida con la instrucción OUT.
 CALL se utiliza para llamar a las subrutinas.
 RET se utiliza para retornar al programa principal.

Código en Ensamblador

A continuación, se presenta el código en Ensamblador que permite


realizar el proceso para bañarse planteado anteriormente.
INICIO: LD A,45H LD A,3FH
LD SP,1500H OUT (07H),A OUT (07H),A
LD HL,1000H LD A,3FH LD A,20H
JP PROGRAMA OUT (07H),A OUT (07H),A
LD A,20H RET
;SUBRUTINAS............... OUT (07H),A MSJ_5:
MSJ_1: RET LD A,20H
LD A,44H OUT (07H),A
OUT (07H),A MSJ_3: LD A,45H
LD A,45H LD A,20H OUT (07H),A
OUT (07H),A OUT (07H),A LD A,4EH
LD A,53H LD A,44H OUT (07H),A
OUT (07H),A OUT (07H),A LD A,4AH
LD A,45H LD A,45H OUT (07H),A
OUT (07H),A OUT (07H),A LD A,41H
LD A,41H LD A,53H OUT (07H),A
OUT (07H),A OUT (07H),A LD A,42H
LD A,20H LD A,56H OUT (07H),A
OUT (07H),A OUT (07H),A LD A,4FH
LD A,42H LD A,2EH OUT (07H),A
OUT (07H),A OUT (07H),A LD A,4EH
LD A,41H LD A,2EH OUT (07H),A
OUT (07H),A OUT (07H),A LD A,41H
LD A,5CH LD A,2EH OUT (07H),A
OUT (07H),A OUT (07H),A LD A,52H
LD A,41H LD A,20H OUT (07H),A
OUT (07H),A OUT (07H),A LD A,53H
LD A,52H LD A,43H OUT (07H),A
OUT (07H),A OUT (07H),A LD A,45H
LD A,53H LD A,41H OUT (07H),A
OUT (07H),A OUT (07H),A LD A,20H
LD A,45H LD A,4CH OUT (07H),A
OUT (07H),A OUT (07H),A RET
LD A,3FH LD A,2EH MSJ_6:
OUT (07H),A OUT (07H),A LD A,20H
LD A,20H LD A,41H OUT (07H),A
OUT (07H),A OUT (07H),A LD A,45H
RET LD A,47H OUT (07H),A
MSJ_2: OUT (07H),A LD A,4EH
LD A,20H LD A,55H OUT (07H),A
OUT (07H),A OUT (07H),A LD A,4AH
LD A,48H LD A,41H OUT (07H),A
OUT (07H),A OUT (07H),A LD A,55H
LD A,41H LD A,21H OUT (07H),A
OUT (07H),A OUT (07H),A LD A,41H
LD A,59H LD A,20H OUT (07H),A
OUT (07H),A OUT (07H),A LD A,47H
LD A,20H RET OUT (07H),A
OUT (07H),A MSJ_4: LD A,41H
LD A,41H LD A,20H OUT (07H),A
OUT (07H),A OUT (07H),A LD A,52H
LD A,2EH LD A,43H OUT (07H),A
OUT (07H),A OUT (07H),A LD A,53H
LD A,43H LD A,41H OUT (07H),A
OUT (07H),A OUT (07H),A LD A,45H
LD A,41H LD A,4CH OUT (07H),A
OUT (07H),A OUT (07H),A LD A,20H
LD A,4CH LD A,49H OUT (07H),A
OUT (07H),A OUT (07H),A RET
LD A,49H LD A,45H MSJ_7:
OUT (07H),A OUT (07H),A LD A,20H
LD A,45H LD A,4EH OUT (07H),A
OUT (07H),A OUT (07H),A LD A,4CH
LD A,4EH LD A,54H OUT (07H),A
OUT (07H),A OUT (07H),A LD A,49H
LD A,54H LD A,45H OUT (07H),A
OUT (07H),A OUT (07H),A LD A,53H
OUT (07H),A OUT (07H),A
LD A,54H LD A,52H NO_LISTO:
OUT (07H),A OUT (07H),A CALL MSJ_6
LD A,4FH LD A,53H LD A,00H
OUT (07H),A OUT (07H),A CALL BAÑO
LD A,3FH LD A,45H CALL MSJ_7
OUT (07H),A OUT (07H),A JP DESCICION_2
LD A,20H RET NO:
RET LD A,4EH
MSJ_8: DESCICION: OUT (07H),A
LD A,20H IN A,(02H) LD A,4FH
OUT (07H),A LD B,0 OUT (07H),A
LD A,53H CP B HALT
OUT (07H),A JP Z,NO
LD A,41H LD B,1 CAL_AGUA:
OUT (07H),A CP B INC A
LD A,4CH RET Z OUT (01H),A
OUT (07H),A JP NZ,DESCICION LD B,0FH
LD A,49H DESCICION_1: CP B
OUT (07H),A IN A,(02H) JP NZ,CAL_AGUA
LD A,52H LD B,0 RET Z
OUT (07H),A CP B
LD A,20H JP Z,CAL_AGUA
OUT (07H),A LD B,1 BAÑO:
LD A,59H CP B INC A
OUT (07H),A RET Z OUT (03H),A
LD A,20H JP NZ,DESCICION_1 LD B,255
DESCICION_2: CP B
OUT (07H),A
IN A,(02H) JP NZ,ADICION
LD A,53H
LD B,0 RET Z
OUT (07H),A
CP B ADICION:
LD A,45H
JP Z,NO_LISTO AD A,A
OUT (07H),A
LD B,1 JP BAÑO
LD A,43H
CP B
OUT (07H),A
RET Z
LD A,41H JP NZ,DESCICION_2

PROGRAMA:
XOR A
OUT (00H),A ;limpia el puerto
OUT (01H),A ;limpia el puerto
OUT (03H),A ;limpia el puerto
CALL MSJ_1
CALL DESCICION
LD A,01H
OUT (00H),A
CALL MSJ_2
CALL DESCICION
LD A,03H
OUT (00H),A
CALL MSJ_3
LD A,00H
CALL CAL_AGUA
CALL MSJ_4
CALL DESCICION_1
CALL MSJ_5
CALL MSJ_6
LD A,00H
CALL BAÑO
CALL MSJ_7
CALL DESCICION_2
CALL MSJ_8
HALT
END
Prueba de funcionamiento

El programa inicia preguntando a través del puerto (07H) si el usuario


desea bañarse, como muestra la Figura 42.

Figura 42.Mensaje inicial del proceso.

En el caso de la Figura 43 se ha ingresado un “0” por el puerto de entrada


indicando que no desea bañarse por lo que mostrara el mensaje “NO” y
finalizara el programa ejecutando la instrucción HALT.

Figura 43.Finalización del programa en caso de no querer bañarse.

En la Figura 44 se muestra el caso en el que se ha ingresado un “1” por


el puerto de entrada indicando que, si desea bañarse, un led indicador se
encenderá para avisar que se puede continuar.

Figura 44.Indicador para continuar con el proceso de bañado.

Posteriormente en la Figura 45 el programa pregunta nuevamente al


usuario mediante el puerto (07H), en este caso el mensaje desplegado será
para confirmar si existe agua caliente.
Figura 45.Mensaje para la confirmación de agua caliente.

En el caso de la Figura 46 se ha ingresado un “0” por el puerto de entrada


indicando que no existe agua caliente en la ducha por lo que mostrara el
mensaje “NO” y finalizara el programa ejecutando la instrucción HALT.

Figura 46.Finalización del programa en caso de no tener agua caliente.

En la Figura 47 se muestra el caso en el que se ingresa “1” por el puerto


de entrada indicando que, si dispone de agua caliente, en este caso se
encenderá otro indicador. Además, al indicar que si se dispone de agua
caliente, el programa despliega un mensaje para indicar que debe
desvestirse y que está calentando el agua.

Para simular el calentamiento del agua, mediante el puerto (01H) se


muestra un encendido de leds, estos realizaran un conteo del 0 al 15,
indicando que han transcurrido 15 segundos para poder calentar el agua.

Figura 47. Calentamiento del agua, juego de leds por el puerto (01H).
En este punto el programa preguntará al usuario si el agua se encuentra
caliente (Figura 48), en caso de no estar lo suficientemente caliente al
ingresar “0” volverá a transcurrir 15 segundos más de calentamiento,
realizando el proceso de conteo a través del puerto (01H) como se indicó
en la Figura 47.

Figura 48.Mensaje para la confirmación de agua suficientemente caliente o no .

Si se ha indicado que el agua está caliente ingresando “1” en el puerto de


entrada como se observa en la Figura 49, el programa indica que se debe
“Enjabonar” y “Enjuagar”, además a través del puerto (03H) los leds se
encenderán uno a uno hasta completar los 8 leds encendidos para indicar
que el proceso de enjuague ha finalizado.

Figura 49.Proceso de enjabonarse y enjuagarse.

En la Figura 50 se observa el mensaje que se despliega luego de


completarse el proceso de enjuague (barrido de leds), se preguntara si el
usuario se encuentra “Listo” para terminar el baño. En caso de indicar que
no se encuentra listo, repetirá el proceso de enjuague anterior.

Figura 50.Mensaje para verificar si se encuentra listo o no para terminar la ducha.


Para finalizar el proceso se ha de indicar al programa que se encuentra
listo para terminar la ducha mediante el ingreso de “1” en el puerto de
entrada. Una vez que se ha indicado que se está listo el programa finaliza
todo el proceso indicando que debe “Salir y Secarse”.

Figura 51.Mensaje final al termino del proceso de bañado.


5. Conclusiones y Recomendaciones
Conclusiones
 Se ha realizado la programación del Z80 con Ensamblador,
observando que en este lenguaje de programación los programas
realizados son más extensos que en otros lenguajes de programación
de alto nivel, debido a que solo se puede utilizar una cantidad
específica de instrucciones dependiendo del microprocesador en este
caso el Z80, esto se ha logrado mediante la solución de problemas de
la vida real programados para el CPU Z80.
 El software para la programación del Z80, Z80 Simulator IDE, es de
gran ayuda ya que permite simular el funcionamiento real de un CPU
Z80, además de que posee muchas herramientas para el
programador como los registros con los que se puede interactuar,
también posee puertos de E/S con los que se puede manejar una
interfaz gráfica básica, además se puede mirar la memoria principal
donde se guarda el programa en Lenguaje Maquina.

Recomendaciones
 El no conocimiento de todas las instrucciones que componen el set de
instrucciones del Z80, conlleva a que se realice programas demasiado
extensos, por lo que es necesario conocer el funcionamiento de cada
instrucción antes de aventurarse a realizar programas demasiado
complejos.

6. Bibliografía

[1]Lepape, O. (1985). Programación del Z80 con Ensamblador. Madrid: PARANINFO S.A.
[2]Universidad de la Republica de Uruguay. (11 de diciembre de 2018). ProEVA. Obtenido de
ProEVA:
https://eva.fing.edu.uy/pluginfile.php/54385/mod_folder/content/0/Un_microprocesador_
de_8_bits_Z80.pdf?forcedownload=1
[3]Zilog. (11 de diciembre de 2018). Zilog. Obtenido de Zilog:
http://www.zilog.com/manage_directlink.php?filepath=docs/z80/um0080&extn=.pdf

Вам также может понравиться