Programacion Z80 en Ensamblador

Departamento de Eléctrica, Electrónica y Telecomunicaciones Tema: Programación del Z80 con Ensamblador. Asignatura: Mi

Views 456 Downloads 10 File size 1MB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

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

Tipos de Instrucciones

Transferencia de bloques y búsqueda 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

R=R+N2

NO

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 gasolinera

Llenar NO tanque

SI Tarjeta

Efectivo

¿Pago?

Cancela con tarjeta

Cancela con 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: LD SP,1500H LD HL,1000H JP PROGRAMA ENCENDER: IN A,(00H) ;ENCID CON "E" LD B,0EH CP B JP NZ,VERIFICAR_AUTO LD A,1 OUT (00H),A LD A,3 ;NIV. INIC. DE GAS. OUT (03H),A LD (HL),A RET Z VERIFICAR_AUTO: LD A,56H OUT (07H),A LD A,45H OUT (07H),A LD A,52H OUT (07H),A LD A,49H OUT (07H),A LD A,46H OUT (07H),A LD A,49H OUT (07H),A LD A,43H OUT (07H),A LD A,41H OUT (07H),A LD A,52H OUT (07H),A LD A,20H OUT (07H),A LD A,20H OUT (07H),A LD A,48H JP ENCENDER COMBUSTIBLE: LD B,31 CP B JP C,CARGAR_COMB RET NC CARGAR_COMB: IN A,(02H) LD B,6 ;LLENADO 6 GAL. CP B JP Z,GALON_6 JP NZ,CARGAR_COMB

GALON_6: LD A,(HL) ADD A,252 OUT (03H),A RET PAGAR: IN A,(02H) LD B,0EH CP B JP Z,EFECTIVO LD B,0CH CP B JP Z,CREDITO JP NZ,PAGAR EFECTIVO: LD A,45H OUT (07H),A LD A,46H OUT (07H),A LD A,45H OUT (07H),A LD A,43H OUT (07H),A LD A,54H OUT (07H),A LD A,49H OUT (07H),A LD A,56H OUT (07H),A LD A,4FH OUT (07H),A RET CREDITO: LD A,43H OUT (07H),A LD A,52H OUT (07H),A LD A,45H OUT (07H),A LD A,44H OUT (07H),A LD A,49H OUT (07H),A LD A,54H OUT (07H),A LD A,4FH OUT (07H),A RET UNIVERSIDAD: INC A OUT (04H),A LD B,255 CP B 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: LD SP,1500H LD HL,1000H JP PROGRAMA SEP_ROPA: JP MENSAJE_1 SEP_ROPA1: IN A,(02H) LD B,01H CP B JP NZ,MENSAJE_1 RET Z MENSAJE_1: LD A,53H OUT (07H),A LD A,45H OUT (07H),A LD A,50H OUT (07H),A LD A,41H OUT (07H),A LD A,52H OUT (07H),A LD A,45H OUT (07H),A LD A,20H OUT (07H),A LD A,52H OUT (07H),A LD A,2EH OUT (07H),A LD A,20H OUT (07H),A LD A,42H OUT (07H),A LD A,4CH OUT (07H),A LD A,41H OUT (07H),A LD A,4EH OUT (07H),A LD A,43H OUT (07H),A LD A,41H OUT (07H),A LD A,20H OUT (07H),A JP SEP_ROPA1 AGUA: ; LLENO=60H JP MSJ_2 AGUA1: IN A,(02H) LD B,60H CP B ;JP NZ MSJ_2 RET Z MSJ_2: LD A,41H

OUT (07H),A LD A,47H OUT (07H),A LD A,55H OUT (07H),A LD A,41H OUT (07H),A LD A,20H OUT (07H),A JP AGUA1 COLOCAR_ROPA: JP MENSAJE_3 COLOC_ROPA1: IN A,(02H) LD B,01H CP B JP NZ,MENSAJE_3 RET Z MENSAJE_3: LD A,50H OUT (07H),A LD A,4FH OUT (07H),A LD A,4EH OUT (07H),A LD A,45H OUT (07H),A LD A,52H OUT (07H),A LD A,20H OUT (07H),A LD A,52H OUT (07H),A LD A,4FH OUT (07H),A LD A,50H OUT (07H),A LD A,41H OUT (07H),A LD A,20H OUT (07H),A JP COLOC_ROPA1 DETERGENTE: JP PONER_DET DETERGENTE1: IN A,(02H) LD B,14H CP B JP C,MENSAJE_4 JP NC,MUCHO MUCHO: JP NZ,MENSAJE_5 RET Z MENSAJE_4: LD A,50H OUT (07H),A LD A,4FH OUT (07H),A

LD A,43H OUT (07H),A LD A,4FH OUT (07H),A LD A,20H OUT (07H),A LD A,44H OUT (07H),A LD A,45H OUT (07H),A LD A,54H OUT (07H),A LD A,45H OUT (07H),A LD A,52H OUT (07H),A LD A,47H OUT (07H),A LD A,45H OUT (07H),A LD A,4EH OUT (07H),A LD A,54H OUT (07H),A LD A,45H OUT (07H),A LD A,20H OUT (07H),A JP DETERGENTE1 MENSAJE_5: LD A,4DH OUT (07H),A LD A,55H OUT (07H),A LD A,43H OUT (07H),A LD A,48H OUT (07H),A LD A,4FH OUT (07H),A LD A,20H OUT (07H),A LD A,44H OUT (07H),A LD A,45H OUT (07H),A LD A,54H OUT (07H),A LD A,45H OUT (07H),A LD A,52H OUT (07H),A LD A,47H OUT (07H),A LD A,45H OUT (07H),A LD A,4EH OUT (07H),A LD A,54H OUT (07H),A

LD A,45H OUT (07H),A LD A,20H OUT (07H),A JP DETERGENTE1 PONER_DET: LD A,50H OUT (07H),A LD A,4FH OUT (07H),A LD A,4EH OUT (07H),A LD A,45H OUT (07H),A LD A,52H OUT (07H),A LD A,20H OUT (07H),A LD A,44H OUT (07H),A LD A,45H OUT (07H),A LD A,54H OUT (07H),A LD A,45H OUT (07H),A LD A,52H OUT (07H),A LD A,47H OUT (07H),A LD A,45H OUT (07H),A LD A,4EH OUT (07H),A LD A,54H OUT (07H),A LD A,45H OUT (07H),A LD A,20H OUT (07H),A JP DETERGENTE1 ENCENDER: JP MSJ_6 ENCENDER1: IN A,(02H) LD B,01H CP B RET Z MSJ_6: LD A,45H OUT (07H),A LD A,4EH OUT (07H),A LD A,43H OUT (07H),A LD A,45H

OUT (07H),A LD A,4EH OUT (07H),A LD A,44H OUT (07H),A LD A,45H OUT (07H),A LD A,52H OUT (07H),A LD A,20H OUT (07H),A JP ENCENDER1 LAVAR: INC A OUT (04H),A LD B,25H CP B JP NZ,LAVAR RET Z EXTRA: LD A,4CH OUT (07H),A LD A,49H OUT (07H),A LD A,4DH OUT (07H),A LD A,50H OUT (07H),A LD A,49H OUT (07H),A LD A,41H OUT (07H),A LD A,3FH OUT (07H),A LD A,20H OUT (07H),A IN A,(02H) LD B,01H CP B LD A,0 RET Z MIN_5: INC A OUT (04H),A LD B,5H CP B JP NZ,MIN_5 JP EXTRA FINAL: LD A,45H OUT (07H),A LD A,58H OUT (07H),A LD A,50H

OUT (07H),A LD A,52H OUT (07H),A LD A,49H OUT (07H),A LD A,4DH OUT (07H),A LD A,49H OUT (07H),A LD A,52H OUT (07H),A LD A,20H OUT (07H),A LD A,59H OUT (07H),A LD A,20H OUT (07H),A LD A,53H OUT (07H),A LD A,45H OUT (07H),A LD A,43H OUT (07H),A LD A,41H OUT (07H),A LD A,52H OUT (07H),A LD A,20H OUT (07H),A RET ACTIVACION: LD A,01H OUT (00H),A LD A,00H OUT (00H),A LD A,01H OUT (00H),A LD A,00H OUT (00H),A LD A,01H OUT (00H),A LD A,00H OUT (00H),A LD A,01H OUT (00H),A LD A,00H OUT (00H),A LD A,01H OUT (00H),A LD A,00H OUT (00H),A LD A,01H OUT (00H),A LD A,00H OUT (00H),A 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 parpadea.

Figura 32.No se ha colocado la ropa, led no 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 detergente ingresada.

Figura 35.Poca cantidad de detergente 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

¿Desea bañarse?

NO

SI

¿Hay agua caliente?

NO

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 OUT (07H),A LD A,3FH OUT (07H),A LD A,20H OUT (07H),A RET

LD SP,1500H LD HL,1000H JP PROGRAMA ;SUBRUTINAS............... MSJ_1: LD A,44H OUT (07H),A LD A,45H OUT (07H),A LD A,53H OUT (07H),A LD A,45H OUT (07H),A LD A,41H OUT (07H),A LD A,20H OUT (07H),A LD A,42H OUT (07H),A LD A,41H OUT (07H),A LD A,5CH OUT (07H),A LD A,41H OUT (07H),A LD A,52H OUT (07H),A LD A,53H OUT (07H),A LD A,45H OUT (07H),A LD A,3FH OUT (07H),A LD A,20H OUT (07H),A RET MSJ_2: LD A,20H OUT (07H),A LD A,48H OUT (07H),A LD A,41H OUT (07H),A LD A,59H OUT (07H),A LD A,20H OUT (07H),A LD A,41H OUT (07H),A LD A,2EH OUT (07H),A LD A,43H OUT (07H),A LD A,41H OUT (07H),A LD A,4CH OUT (07H),A LD A,49H OUT (07H),A LD A,45H OUT (07H),A LD A,4EH OUT (07H),A LD A,54H OUT (07H),A

LD A,3FH OUT (07H),A LD A,20H OUT (07H),A RET MSJ_5: LD A,20H OUT (07H),A LD A,45H OUT (07H),A LD A,4EH OUT (07H),A LD A,4AH OUT (07H),A LD A,41H OUT (07H),A LD A,42H OUT (07H),A LD A,4FH OUT (07H),A LD A,4EH OUT (07H),A LD A,41H OUT (07H),A LD A,52H OUT (07H),A LD A,53H OUT (07H),A LD A,45H OUT (07H),A LD A,20H OUT (07H),A RET

MSJ_3: LD A,20H OUT (07H),A LD A,44H OUT (07H),A LD A,45H OUT (07H),A LD A,53H OUT (07H),A LD A,56H OUT (07H),A LD A,2EH OUT (07H),A LD A,2EH OUT (07H),A LD A,2EH OUT (07H),A LD A,20H OUT (07H),A LD A,43H OUT (07H),A LD A,41H OUT (07H),A LD A,4CH OUT (07H),A LD A,2EH OUT (07H),A LD A,41H OUT (07H),A LD A,47H OUT (07H),A LD A,55H OUT (07H),A LD A,41H OUT (07H),A LD A,21H OUT (07H),A LD A,20H OUT (07H),A RET

MSJ_6: LD A,20H OUT (07H),A LD A,45H OUT (07H),A LD A,4EH OUT (07H),A LD A,4AH OUT (07H),A LD A,55H OUT (07H),A LD A,41H OUT (07H),A LD A,47H OUT (07H),A LD A,41H OUT (07H),A LD A,52H OUT (07H),A LD A,53H OUT (07H),A LD A,45H OUT (07H),A LD A,20H OUT (07H),A RET

MSJ_4: LD A,20H OUT (07H),A LD A,43H OUT (07H),A LD A,41H OUT (07H),A LD A,4CH OUT (07H),A LD A,49H OUT (07H),A LD A,45H OUT (07H),A LD A,4EH OUT (07H),A LD A,54H OUT (07H),A LD A,45H OUT (07H),A

MSJ_7: LD A,20H OUT (07H),A LD A,4CH OUT (07H),A LD A,49H OUT (07H),A LD A,53H

OUT (07H),A LD A,54H OUT (07H),A LD A,4FH OUT (07H),A LD A,3FH OUT (07H),A LD A,20H RET MSJ_8: LD A,20H OUT (07H),A LD A,53H OUT (07H),A LD A,41H OUT (07H),A LD A,4CH OUT (07H),A LD A,49H OUT (07H),A LD A,52H OUT (07H),A LD A,20H OUT (07H),A LD A,59H OUT (07H),A LD A,20H OUT (07H),A LD A,53H OUT (07H),A LD A,45H OUT (07H),A LD A,43H OUT (07H),A LD A,41H

OUT (07H),A LD A,52H OUT (07H),A LD A,53H OUT (07H),A LD A,45H OUT (07H),A RET DESCICION: IN A,(02H) LD B,0 CP B JP Z,NO LD B,1 CP B RET Z JP NZ,DESCICION

DESCICION_1: IN A,(02H) LD B,0 CP B

NO_LISTO: CALL MSJ_6 LD A,00H CALL BAÑO CALL MSJ_7 JP DESCICION_2

NO: LD A,4EH OUT (07H),A LD A,4FH OUT (07H),A HALT CAL_AGUA: INC A OUT (01H),A LD B,0FH CP B JP NZ,CAL_AGUA

RET Z

JP Z,CAL_AGUA

LD B,1 CP B RET Z JP NZ,DESCICION_1

DESCICION_2: IN A,(02H) LD B,0 CP B JP Z,NO_LISTO

LD B,1 CP B RET Z 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

BAÑO: INC A OUT (03H),A LD B,255 CP B JP NZ,ADICION

RET Z ADICION: AD A,A JP BAÑO

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