BARD WARE PARA UN SISTEMA MINIM0 BASADO …148.206.53.84/tesiuami/UAM5222.pdf · Está disponible...

105
UNIVERSIDAD AUTONOMA METROPOLITANA UNIDAD IZTAPALAPA "DIVISION DE CIENCIAS BASICAS E INGENIERIA DEPARTAMENTO DE INGENIERiAELECTRICA mGENIERLA ELECTRONICA Proyecto Terminal: J"SOFTWARE Y BARD WARE PARA UN SISTEMA MINIM0 BASADO EN EL MICROPROCESADOR 80188" "Alumno: Silverio Edgar León Julio Asesor: M. En C. Agustin Suaréz Fernández Febrero de 1996 - Mexico D.F. , Mexico

Transcript of BARD WARE PARA UN SISTEMA MINIM0 BASADO …148.206.53.84/tesiuami/UAM5222.pdf · Está disponible...

UNIVERSIDAD AUTONOMA METROPOLITANA

UNIDAD IZTAPALAPA

"DIVISION DE CIENCIAS BASICAS E INGENIERIA

DEPARTAMENTO DE INGENIERiA ELECTRICA

mGENIERLA ELECTRONICA

Proyecto Terminal:

J"SOFTWARE Y BARD WARE PARA UN SISTEMA MINIM0 BASADO EN EL MICROPROCESADOR 80188"

"Alumno: Silverio Edgar León Julio

Asesor: M. En C. Agustin Suaréz Fernández

Febrero de 1996 - Mexico D.F. , Mexico

PROPOSITO DEL PROYECTO

En la Licenciatura de Ingeniería Electrónica y de Ingeniería Biomédica se

imparten los cursos de Sistemas Digitales I, II y Ill en los Trimestres 9, 10 y 11 respectivamente, de los cuales la parte experimental es en gran medida la base

primordial. Para dichos cursos se debe proporcionar un microprocesador o microcontrolador, diseñar del sistema mínimo, para luego usar la técnica de alambrado, para lo que

indica el trabajo de días solo para alambrar el sistema, aunado al alto costo de las

bases para los circuitos integrados, además del alambre utilizado.

En un principio solo se pretendía reducir el tiempo de diseño y construcción del

sistema mínimo, mediante una tarjeta de circuito impreso. Esta tarjeta deberia cubrir todos los requerimientos esenciales para los cursos de Sistemas Digitales I ,

II y Ill, por lo que para este sistema mínimo se selecciono, el rnicroprocesador 80186/188 el cual cubre las siguientes características como son:

o

a

o

o a

De uso común, ya que pertenece a la familia del 8088186

microprocesador de las computadoras personales IBM, por lo que su

disponibilidad lo hace mas atractivo.

Utilización de ensamblador, que proporcione flexibilidad de uso o de

interacción con otros lenguajes.

Fácil de encontrar en el mercado. Bajo costo, en función de su grado de integración.

Manuales y literatura disponible, con fácilidad para consultar.

Posibilidad de enlace para colocar programas en la SRAM de este sistema minimo, a travez de:

?. Teclado 2. Puerto serial

OBJETIVOS PRIMARIOS

El presente trabajo pretende satisfacer la necesidad de contar con un sistema que

permita realizar aplicaciones específicas, de un microprocesador de la familia 80X8X, en el sistema de evaluación UAMI-188 o que se desarrolle en éste y se traslade a una computadora personal y tuvo como principales objetivos:

1) Tener, principalmente, para propósitos didácticos un sistema mínimo que permita utilizar en aplicaciones específicas un microprocesador

de la familia 80X8X y los periféricos más comunmente utilizados en

tarjetas madre de computadoras personales del tipo IBM-PC y compatibles.

2) Utilizar un microprocesador con varios periféricos integrados a fin de conocer las ventajas que tienen en el diseño y construcción de

prototipos el utilizar dispositivos, VLSI, de muy alto nivel de

integración.

3) Lograr un sistema digital altamente aprovechable, y compatible en

un alto porcentaje con el sistema BIOS de la PC. 4) El monitor que resida en el sistema digital, debe ser amigable con el

usuario. Permitiendo realizar a el usuario los siguiente: e Examinar y modificar cualquiera de los registros internos

del 80188. e Cargar y ejecutar programas en memoria RAM, desde el

e Examinar, modificar, buscar o cargar un valor específico teclado o desde una computadora anfitrión.

en memoria RAM, localidad a localidad o en bloques de hasta 64K.

a Introducir puntos de ruptura para la depuración de

e Proporciona servicios similares a algunos de los servicios programas de aplicación.

de las interrupciones del BIOS: Int. 09H, Int. 15H, Int. 16H, Int. 17H.

Los objetivos para la construccion de este sistema minimo son los siguientes:

1) Proporcionar una base eperimental, de bajo costo fácilmente reproducible, para los cursos de Sistemas Digitales.

2) Que los alumnos tengan oportunidad de adquirir habilidades que les serán útiles en su vida profesional y que, particularmente la técnica de

soldadura, no es posible adquirir en el medio académico universitario.

3) Dar mayores posibilidades a la aplicación del sistema mínimo,

particularmente, para los proyectos terminales.

4) Trabajar con un microprocesador de la familia 808618088 a fin de estar en posibilidades de realizar aplicaciones dedicadas, que tienen un alto valor agregado, en una computadora personal.

ARQUITECTURA DEL PROYECTO

El propósito de este punto es describir cómo está diseñada la interfaz entre la tarjeta

tarjeta madre, la PC, la tarjeta adicional para impresion tanto en hardware como en software. Comenzamos discutiendo la arquitectura del proyecto a nivel de hardware.

PARTE A: HARDWARE

Tarjeta Madre principal:

Para ella se seleccionaron los siguientes dispositivos de uso comun y general como son:

l. Un microprocesador 801 88.

2. Logica de multiplexion para separar los buses de datos y direcciones (parte

baja) que consiste en TTL 74LS373.

3. Memoria EPROM de 8Kbytes 2764. 4. Memoria SRAM de 8 Kbytes 6264. 5. Controlador de teclado 8279. 6. Logica de seleccion para Display ANDXXX, que consiste en TTL 74LSOO. 7 . Contolador de bus 8288. 8. Controlador de puerto serial 8250. 9. Logica de multiplexion para teclado consistente en 74LS138 .

10. Sistema de HARD RESET que consiste en 74LS14, capacitores, resistencia y boton normalmente abierto de una via.

11. Buffers de transmision y de recepcion 1488 y 1489 respectivamente.

12. Peine IBMJ1, para XT.

13. lnterfase DB9M

Tarjeta de impresion:

Esta tarjeta tiene el proposito de implementar un puerto de impresion y/o una interfaz de indole paralela. Para esto se requirio los siguientes dispositivos:

l. Controlador de puerto paralelo 8255 2. Logica de seleccion que consiste en TTL 74LS138 y compuerta 74LS02

3. lnterfase DB25H

DISEÑO AI inicio de la fase de diseño se plantearon los siguientes objetivos:

1. DeSaKOllar, principalmente, para propósitos didácticos un sistema de evaluación mínimo que permita utilizar en aplicaciones específicas un microprocesador de la familia 80X8X y los periféricos más utilizados. Ya

que dichos elementos son de los más utilizados en computadoras

personales del tipo IBM-PC y compatibles.

2. Utilizar un microprocesador con varios periféricos integrados a fin de

conocer las ventajas que tienen en el diseño y construcción de prototipos

el utilizar dispositivos, VLSI, de muy alto nivel de integración.

En la actualidad, para que un prototipo sea competitivo es indispensable que utilice

dispositivos de muy alto nivel de integración. Así, se seleccionó para el presente trabajo

un microprocesador 80188 que además de la unidad de procesamiento central 8088 incluye los periféricos siguientes:

[a] Generador de reloj a una frecuencia de 8 MHz. [b] Dos canales independientes de acceso directo a memoria. [c] Un controlador de interrupciones programable. [dl Tres temporizadores programables de 16 bits. [e] Lógica programable para señales de habilitación tanto para memoria como

para el espacio de entradakalida.

Además el 80188 proporciona, simultáneamente, las señales de control de modo mínimo

y modo máximo. Está disponible en un encapsulado de 68 terminales en varias presentaciones, con un costo alrededor de sesenta mil pesos, de las que se seleccionó la PLCC (Plastic Lead Chip Carrier, encapsulado que tiene diecisiete terminales por lado

y se monta en una base) ya que es la que presenta las mayores facilidades, con las herramientas disponibles, para la construcción de un prototipo. Asimismo por mejoras en

su diseño, tiene una velocidad de ejecución que es de tres a seis veces más rápida que

un 8086/8088 a 8 MHZ y ejecuta diez instrucciones adicionales. S u empleo permitió

reducir, en forma considerable, el número de componentes utilizados. Los periféricos

integrados del 80188 se controlan mediante registros que forman parte de un bloque de control interno mapeado [6] en las últimas doscientas cincuenta y seis localidades del

espacio de entradakalida. Es posible reubicar el bloque de control tanto en el espacio de entradakalida como en memoria. No se requiere de ninguna instrucción especial para tener acceso a los registros del bloque de control y pueden ser accesados en cualquier

momento.

CONSTRUCCION Y PRUEBAS INICIALES

Se diseñó y construyó un prototipo del sistema utilizando la técnica de alambrado "wire-

wrap" y una tablilla de próposito general, aproximadamente de 30 X 15 cm. a fin de realizar pruebas iniciales y para tener una idea clara acerca de las posibilidades del

sistema. AI principio se soldaron las bases del 80188 y los demás circuitos utilizados. El

alambrado se inició con los voltajes de alimentación y referencias utilizando cable

telefónico de calibre 22. A continuación se alambraron los canales de direcciones y

datos, con sus señales de control y habilitación respectivas, y las memorias ROM y RAM para, previa comprobación de su funcionamiento, continuar con el resto de los circuitos.

Todo el alambrado se realizó en forma muy cuidadosa a fin de reducir las posibilidades

de fallas y al final se obtuvo una construccción funcional y estética.

Como se habrá observado, en el rango de direcciones que ofrece un sistema PC, sólo

disponemos de 10 direcciones para mapear cualquier dispositivo de I/O.

El Microprocesador 801 88

Actualmente, para que un prototipo sea competitivo es indispensable que utilice dispositivos de muy alto nivel de integración. Así, se seleccionó un microprocesador

80188 que además de la unidad de procesamiento central 8088 incluye los periféricos

siguientes:

(a) Generador de reloj hasta una frecuencia de 8 Mhz. (b) Dos canales independientes de acceso directo a memoria (c) Un controlador de interrupciones programable.

(d) Tres temporizadores programables de 16 bits. (e) Lógica programable para señales de habilitación tanto para memoria

como para el espacio de entrada-salida.

Además el 80188 proporciona, simultáneamente, las señales de control de modo mínimo

y modo máimo. Está disponible en un encapsulado de 68 terminales en varias presentaciones, con un costo alrededor de sesenta nuevos pesos, de las que se seleccionó la PLCC (Plastic Lead Chip Carrier, encapsulado que tiene diecisite terminales por lado y se monta en una base) ya que es la que presenta las mayores facilidades, con las herramientas disponibles, para el diseño y construcción de un circuito impreso. Asimismo por mejoras en su diseño, tiene una velocidad de ejecución que es

de tres a seis veces más rápida que un 8086/8088 a 8 Mhz y ejecuta diez instrucciones

adicionales. S u empleo permitió reducir, en forma considerable, el número de

componentes utilizados. Los periféricos integrados del 80188 se controlan mediante registros que forman parte de un bloque de control interno mapeado (3) en las últimas

doscientas cincuenta y seis localidades del espacio de entrada-salida. Es posible reubicar el bloque de control tanto en el espacio de entrada-salida como en memoria. No

se requiere de ninguna instrucción especial para tener acceso a los registros del bloque

de control y pueden ser accesados en cualquier momento.

Arquitectura del CPU 80188

La unidad de procesamiento central del microprocesador 80188 es esencialmente la misma que la del 8086/8088 y tiene como principal característica incorporar dos unidades independientes de procesamiento. Estas son la unidad de ejecución (EU), y la unidad de interfase del canal (BIU). La unidad de ejecución decodifica y ejecuta las

instrucciones y la unidad de interfase del canal realiza todas las operaciones del canal

del sistema como son los ciclos de recuperación de código (fetch), lectura de datos y

escritura de resultados. Las dos unidades trabajan de manera independiente y paralela,

que es una de las principales características de los microprocesadores de tercera generación, esta forma de funcionamiento les proporciona mayor velocidad ya que en un alto porcentaje del programa la unidad de ejecución tiene disponible, en la cola de instrucciones, el código de la siguiente instrucción a ejecutar.

BUS DE DIIECCWNES

I * H A L I

I I

BH BL I REOplllOS I 0EHKRU.ES I

CH EL I I

DH DL I I I I I I I I I I I SS

S1 I I ES I I I I t I

a

SP

BP

DI

cs DS

P ALU - BUS DK DATOS

( 1 6 B n S ) I RKOLPIROS DE

! COUWMCACIOH INTERNA

1

Figura 1 80188 Diagrama Funcional Simplificado a Bloques

Unidad de Ejecuci6n

Es la responsable de decodificar y ejecutar todas las instrucciones, está constituida por los 4 registros de propósito general, 2 registros base, 2 registros apuntadores, un registro de banderas y la unidad aritmética y lógica. Ya que no posee conexión con el canal del sistema, obtiene las instrucciones de una cola de 4 bytes (6 bytes para el 8086) que forma parte de la unidad de interfase del canal (BIU). Cuando una instrucción requiere accesar a la memoria o a un periférico, la unidad de interfase del canal ejecuta los ciclos de canal necesarios ya sea para leer o escribir los datos.

Registros de prop6sito general

Son los registros: AX, BX, CX, DX y pueden considerase completos o dividirse en una

parte alta: AH, BH, CHI DH y en una parte baja: AL, BL, CL, DL. Por lo tanto, cada uno puede ser utilizado como un registro de 16 bits o dos registros independientes de 8 bits.

Cualquiera de estos registros se puede utilizar como acumulador al llevar a cabo operaciones aritméticas y lógicas.

Registros indice y apuntadores

Los registros BP, SP, SI, DI sólo se pueden utilizar completos. BPI realiza la función de apuntador base en el segmento de pila y para varias formas de direccionamiento. SP es

el apuntador del segmento de pila. SI es un apuntador a un arreglo fuente de datos y DI es el apuntador a un arreglo destino. Estos 4 registros se utilizan en los diferentes modos de direcionamiento del microprocesador. Unidad aritmetica y 16gica

En esta unidad se realizan todas las operaciones aritméticas y lógicas que puede

ejecutar el microprocesador y el resultado de éstas afecta los diferentes bits del registro de banderas a fin de ejecutar instrucciones condicionales de transferencia del programa.

Registro de banderas

Posee 6 banderas de estado y tres de contro. Las banderas de estado reflejan el resultado de una operación aritmética o lógica y permiten al programa cambiar la

secuencia de su ejecución, dependiendo del estado de alguna bandera.

Figura 2 Registro de Estado

Banderas de estado

Las banderas de estado son las siguientes:

CF bandera de acarreo. Si se activa, en uno, indica que ocurrió un acarreo o un “préstamo” del bit más significativo como resultado de una operación aritmética o lógica de 8 o 16 bits.

PF bandera de paridad. Si está activa, en uno, indica que el resultado de una

operación tiene paridad par. Esta bandera se utiliza para checar errores en

caracteres transmitidos y sólo checa la paridad en los 8 bits menos significativos.

AF bandera de acarreo auxiliar. Si se activa, en uno, indica que en la instrucción

ejecutada, se presentó un acarreo o un “préstamo” del bit 3 al 4 del registro destino. Esta bandera la utilizan en forma implícita las instrucciones de ajuste decimal y ascii.

ZF bandera de cero. Si se activa, en uno, indica que el resultado de una operación aritmética o lógica fue cero.

SF bandera de signo. Indica que el resultado de una instrucción, normalmente aritmética es negativo. Las instrucciones que la afectan se ejecutan en aritmética

de complemeto a 2, en la que el valor del bit mas significativo, 7 O 15, da el signo.

Por lo tanto, si SF = O, se trata de un número positivo y si SF = 1, es un numero negativo.

OF bandera de sobreflujo. Indica que ocurrió un sobreflujo. Esto es, el tamaño del

resultado excede el tamaño del destino.

Banderas de control

Estas banderas permiten controlar tres estados del microprocesador y son las siguientes:

TF bandera de trampa. Si se activa, con uno, ésta bandera el procesador pasa a

ejecutar el programa instrucción por instrucción con fines de depuración. Ya que

no existen instrucciones ni para activarla ni para desactivarla se requiere ejecutar un enmascaramiento o desenmascaramiento mediante instrucciones lógicas con el registro de banderas.

IF bandera de habilitaci6n de interrupciones. AI activarla, en uno, se habilitan

las interrupciones enmascarables que están dedicadas, usualmente, a los periféricos del sistema.

DF bandera de direcci6n. AI activarla, con uno, las instrucciones para cadenas o arreglos ejecutan un autodecremento de las direcciones fuente y destino. Si se

desactiva, con cero, esas instrucciones se ejecutan con incremento de ambas

direcciones.

Unidad de interfase del canal

Ya que la unidad de ejecución no tiene una conexión directa al canal del sistema, obtiene código, operandos y datos a través de la unidad de interfase del canal que ejecuta todos los ciclos necesarios. Esta unidad consta de 4 registros de segmento, registros de comunicación interna, el apuntador de instrucciones, una cola de 4 bytes, la lógica de control del canal, y un sumador dedicado para formar la dirección física. Mientras la unidad de ejecución decodifica y ejecuta una instrucción la unidad de interfase del canal ejecuta un ciclo en el que lee y almacena en la cola, el byte de la siguiente localidad de memoria. Esto es, ambas unidades del CPU trabajan en forma

paralela. Por lo tanto, en un alto porcentaje del programa la unidad de ejecución tiene

disponible, en la cola, el código de la siguiente instrucción a ejecutar y de esta forma, prácticamente “desaparece” el tiempo del ciclo de recuperación de memoria (fetch) lo que resulta en un incremento muy notable en la velocidad de ejecución de la mayoría de los programas. La unidad de ejecución, normalmente, mantiene llenos los 4 bytes de la cola ya que al estar vacío un byte ejecuta un nuevo ciclo a fin de llenarlo.

Registros Segmentados

El espacio de memoria de los miembros originales de la familia 8086/8088 es de 1

Mbyte que se divide en segmentos lógicos de 64 Kbytes. La unidad de interfase del canal tiene cuatro registros de segmento:

CS segmento de código

DS segmento de datos ES segmento extra SS segmento de pila

El registro CS tiene la dirección del segmento de 64kbytes donde se encuentra el programa en ejecución. DS es un segmento de datos y ES, típicamente, también lo es. Estos registros dan a esta familia una de sus características principales: la memoria segmentada que les proporciona facilidades únicas para relocalizar programas. Así

conviene analizar, en detalle, la forma en que se forma una dirección para tener acceso

a la memoria. Como ya se mencionó el 80188 es capaz de direccionar hasta 1 MByte de memoria, para lo que se requiere una dirección de 20 bits. Si ni en la unidad de ejecución ni en la unidad de interfase del canal existe un registro de 20 bits; cómo se forma una dirección?

Sumador dedicado de 20 bits

La dirección física la forma el sumador dedicado de la unidad de interfase del canal con

el contenido de un registro de segmento, más un desplazamiento (offset). Por ejemplo en la reinicialización, varios de los microprocesadores de esta familia inician la ejecución del programa en la localidad FFFFOH. En este caso, el contenido de todos los registros del microprocesador es OOOOH con excepción del registro del segmento de código que

“despierta” con FFFFH. La dirección de 20 bits se forma en el sumador mediante la suma

del segmento multiplicado por 16 más el desplazamiento:

CS FFFFOH +

IP OOOOH Direcci6n = FFFFOH

La forma usual para dar las direcciones es mediante una dirección lógica que da las direcciones del segmento y del desplazamiento que para la reinicialización es: FFFFH:OOOOH a partir de la direccibn lógica se forma la dirección física mediante una suma como la anterior.

Apuntador de Instrucciones

El registro apuntador de instrucciones (IP), es de 16 bits y siempre apunta a la dirección de la siguiente instrucción. Por lo tanto, es muy similar al registro PC de los

microprocesadores 2-80, 8080, 8085 y 8051. Ninguna instrucción tiene acceso directo a

este registro pero, indirectamente mediante algunas instrucciones se puede cambiar, salvar o incluso sacar del segmento de pila.

PARTE B SOFTWARE

PROGRAMA MONITOR

Para cualquier sistema basado en un microprocesador la mayor parte del tiempo de

desarrollo se invierte en la programación. Así, el costo de desarrollo de la programación

respecto a la circuitería se considera que está por lo menos en una relación de dos a uno.

En el caso presente se requiere de un programa monitor que permita utilizar al máximo los recursos que el sistema está en posibilidades de ofrecer.

PROGRAMACION DEL MONITOR

El programa monitor denominado VECTORSL-188, se desarrolló en lenguaje

ensamblador, en una computadora personal compatible 80386 SX, y permite al usuario la utilización, en aplicaciones propias, del prototipo del sistema de evaluación UAMI-188 ya sea con el teclado del sistema o desde una computadora anfitrión a través

de un puerto serie 8250A. El programa monitor VECTORSL-188 permite realizar las

funciones siguientes:

Cargar y ejecutar programas en memoria RAM desde el teclado del sistema o desde una computadora anfitrión.

Ejecutar programas desde una ROM optativa.

Programar aplicaciones que ocupen localidades de memoria o de

entradalsalida no utilizadas por el sistema.

Examinar y modificar cualquiera de los registros internos del 80188.

Examinar y modificar, buscar, o cargar un valor específico en memoria RAM localidad a localidad o por bloques hasta de 64K.

Examinar localidades de memoria RAM y ROM.

Introducir puntos de ruptura para la depuración de programas de

aplicación.

Proporciona funciones similares y compatibles con algunos de los servicios de las interrupciones, del sistema básico de entradalsalida (BIOS), siguientes: int. 09H e int. 16H para el teclado; int. 15H para leer

memoria extendida por el usuario; int. 17H impresora.

Como servicios adicionales: limpieza del despliegue, interrupción para división entre cero, sobreflujo, alarma audible.

10) Permite programar los periféricos, integrados, del 80188 que se

encuentran disponibles.

Así, el programa monitor permite utilizar todos los recursos que el prototipo del sistema sistema de evaluación UAMI-188 proporciona.

DESCRIPCION GENERAL

El programa monitor VECTORSL-188, Fig. 2, al encender o reinicializar el sistema

ejecuta una subrutina de inicialización que programa la señal de habilitación de la memoria superior para una memoria 2764 de 8Kb, deshabilita las interrupciones para

después brincar al inicio del programa monitor. A continuación inicializa los registros internos de los segmentos de memoria a fin de configurar la memoria RAM del sistema

en forma segmentada en esta parte, del programa, se inicializa el stack en su parte superior. El mapa de memoria del sistema queda configurado de la forma siguiente:

ROM FEO0:O a FFFF:F VECTORSL-188 0400:O a 05FF:F Usuario (reubicable)

RAM

0OOO:O a O1 FF:F Del sistema

0200:O a 03FF:F Usuario

Los valores de inicialización de los registros segmentados son:

INICIALIZACION DEL UCS PARA BLOQUE DE 8 KB

r #

INICIALIZACION DEL BLOQUE DE PROGRAMACION

.t r * SUBRUTINA

"VERIFIC"

NO

( PARO TOTAL DEL SISTEMA) CON PRESENTACION DEL MENSAJE DE ERROR "ERRO EN EL SISTEMA BASICO"

\

8

SUBRUTINA4 PROGOPER

# I

FIGURA 2. Diagrama general de flujo del programa monitor VECTORSL-188.

Registro DS 0080

Registro ES O000

Registro SS 0180

Registro CS FEO0

El registro SP se inicializa con el valor 07FF. Así el Stack va de 0180:O a 01FF:F.

Denotando un espacio de 2Kb. A continuación llama a la subrutina "VERIFIC" que autocomprueba la ROM del

sistema por suma total, checksum, y de las memorias RAM mediante lectura/escritura. Si no se encuentra error se llama a la subrutina "BIOSINICIA

que inicializa los periféricos tanto del 80188 como los externos. El valor del registro de relocalización del bloque de control del 80188 no se altera. Por lo tanto, se mantiene en la parte alta del espacio de entraddsalida; asimismo se inicializa el puerto sene 8250:

velocidad de transmisión: 2400 baudios interrupción: por recepción

paridad: no

longitud de TWRX : 8 bits por caracter

Registro de recepción: reseteado

El controlador de teclado/despliegue 8279 se configura: despliegue: entrada derecha a izquierda 8 dígitos de

segmentos. teclado: rastreo codificado de n teclas

oprimidas.

reloj: externo dividido entre 31.

a

Si existe algún error la misma subrutina despliega el mensaje "-ERROR- VERIFICAR MEMORIAS" y se ejecuta una instrucción "HALT" que para al

sistema.

En caso de no existir error la subrutina "PROGOPER" despliega el mensaje "MS-

188 1993". A continuación se entra a una subrutina de reconocimiento de

comandos a fin de que el usuario seleccione cualquiera de las funciones disponibles.

Algunos de los comandos disponibles son:

Rev que revisa cualquiera de las cuatro memorias del sistema a partir de un

desplazamiento dado por el usuario.

Edit que edita en la RAM de usuario desde cualquier desplazamiento

proporcionado por el usuario. Este facilita la introducción de programas del usuario desde el teclado del sistema.

Ejec que ejecuta cualquier programa desde la RAM o ROM de usuario a partir de

un desplazamiento proporcionado por el usuario. También permite llamar algunas rutinas de "VECTORSL-188".

Trans que permite la comunicación con una computadora a través del puerto sene del sistema.

Imp que envía a una impresora el contenido de la RAM de usuario. Se deben

especificar el desplazamiento inicial y final.

La Fig. 3 ilustra en diagrama de flujo la estructura de la subrutina de reconocimiento de comandos. Esta se inicia limpiando los dígitos alfanúmericos y despliega en el extremo izquierdo una "C--" el cursor parpadea marcando el sitio

inicial en que se va a escribir el comando del usuario; también se apunta a un buffer para el teclado con el registro DX. Una vez que el usuario introduce un comando cuya válidez se verifica mediante una comparación entre la cadena de

caracteres introducida por el usuario y una tabla de las cadenas de caracteres

correspondientes a los comandos disponibles. En caso de que existan dos cadenas iguales se procede a ejecutar el comando seleccionado. En caso contrario, la subrutina despliega momentáneamente "error" y a continuación brinca al inicio de esta subrutina.

PRESENTACION DEL SISTEMA POR LA INT 69H

POR MEDIO DE LA INT 69H

t7 DIRECCIONAMIENTO EN DX ' DEL BUFFER DEL TECLADO

L J

LLAMADOAINT16HPARA ' RECOLECCION EN EL BUFFER Y ESCRITURA EN DIGITOS DE LAS TECLAS PRESIONADAS

"BUFFERTEC"

t b

DIRECCIONAMIENTO DE BUFFERTEC" AL REGISTRO "SI

r \ DIRECCIONAMIENTO EN "DI" DE LA PRIMERA CADENA A COMPARAR

(PRIMERA SUBRUTINA) \ J

L.LAMADAA r\ PRIMERA SUBRUTINA

SEGUNDA CADENA A COMPARAR

b SUBRUTMA CMPCAD

SEGUNDA SUBRUTMA LLAMADA A

f b. \ ESCRITURA EN LOS

MENSAJE "ERROR" DIGITOS DEL 8279 ' r\

FIGURA 3. Diagrama de bloques de la subrutina de reconocimiento de comandos

Además se desarrollaron dos programas en lenguaje “C” que facilitan tanto la transmisión como la recepción a través del puerto serie. Uno de estos programas permite la transferencia, empleando una interrupción, de un archivo de la computadora anfitrión al sistema.

Está a disposición de los interesados un listado completo tanto de VECTORSL- 188 como de los programas de comunicación.

A continuacion se describen los comandos involucrados en el monitor VECTORSL:

COMANDO EJECUCION (€J€C)

Permite ejecutar un programa desde una localidad de memoria. Esta memoria puede ser

la RAM de sistema (O), la RAM de usuario (1) o la EPROM del sistema (2). Cuando se invoca despliega el mensaje “EJECUCION DE PROGRAMAS” para, a continuación, solicitar la memoria en que se realizará la ejecución la cual se indica, presionando el numero correspondiente, “EJEC” automáticamente determina el valor del segmento, que solo es una parte de la dirección dentro de la memoria seleccionada. Ya

que, hay que recordar, una dirección física esta formada por la suma de un registro de segmento y un desplazamiento. El segmento lo proporciona el programa

automáticamente, pero el desplazamiento el usuario debe proporcionarlo al sistema

cuando éste se lo pida mediante el mensaje OFFSET- . Este se debe proporcionar en hexadecimal con 4 dígitos hexadecimales, si hay uno erróneo, se indicará que existe un error y se solicita, nuevamente, el desplazamiento.

Si el desplazamiento del programa es 0900H el monitor lo ejecuta transfiriendo el control a la interrupción 43H, la cual se encarga de la ejecución del programa. En caso contrario se ejecuta mediante una llamada, previa verificación de su dirección inicial.

Si el programa no funciona como se espera o se desea finalizar, el usuario puede oprimir la tecla “Q”, esto hace que el programa finalice y el programa monitor regeresa al menú principal .

COMANDO RECEPCION (RECEP)

Permite, que un programa se transfiera, mediante la UART, de la PC al sistema digital. El programa se coloca en la dirección 0090:OH, dirección que se encuentra dentro de la memoria del sistema.

AI momento que se llama a esta subrutina, se despliega el mensaje "RECEPCION DE PROGRAMA POR PUERTO SERIE y a continuación "AUTOEJECUCION DE PROGRAMA RECIBIDO ?, a la que se deberá responder. Si se dá una respuesta afirmativa ( S ), el monitor lo ejecuta ( ejecución automática ), pero si se le indica que no ( N ), después de recibirlo se tiene que ejecutar mediante "EJEC" proporcionando como desplazamiento la dirección 09O:O H. En cualquiera de los dos casos, se despliega Rx, en la línea superior, mientras se transmite el programa, por medio de una subrutina auxiliar a VECTORSL (programa en PC anfitrión). Cuando se transmite por el UART el programa para su posible ejecución, en la pantalla del LCD se muestra una Rx la línea inferior. Si en esta etapa, desea interrumpir la recepción, solo tiene que presionar la tecla que codifica a la letra "Q".

Cuando se le indica al procedimiento "RECEP que NO se desea la autoejecución, al

encontrar el fin de archivo mediante el cual la PC anfitrión finaliza la transmisión serial se despliega, en el LCD, el mensaje: "FIN DE RECEPCION". Si se selecionó la autoejecución se ejecuta el programa recibido.

Cuando el usuario escribe un programa para ser transmitido a través de la UART, éste debe inicializarse en la dirección 0900H, se utilice o no la definici6n de cadenas. Si se

definen variables el segmento de DATOS, debe colocarse después del segmento de código, por ejemplo:

= O000 = 0040

= 0177

O000

O900 O900

O900

LINEA1 EQU OOH

LINEA2 EQU 40H

DS-Usuario EQU 0177H

code segment assume cs:code,ds:data

org 900H

ProgOper proc Near ;Programa operativo EVEN

OPER:

O900 1E

O901 88 0177

0904 8E D8 0906 C6 06 O000 R O 0 90 090C 1F

090D CD 67 090F 88 O000 0912 8E CO 0914 81 O 0

0916 BA 0941 R O919 CD 69 091B B9 FFFF

O91 E 091E E2 FE 0920 B8 O000 0923 8E CO

0925 B1 40 0927 BA 0952 R 092A CD 69 092C ?E 092D 88 0177

0930 8E D8 0932 FE 06 O000 R

0936 A0 O000 R 0939 1F

093A 3C OA

093C 74 02

093E EB CO 0940 0940 CF

0941 4D 6F 6E 69 74 6F 722056454354 4F 52 53 4C 24

0952 20 20 20 20 20 20 20 20 20 20 20 20 20 55 41 4D 2D 49

push ds

mov ax,DS-USUARIO mov ds,ax

mov cuenta,O

POP ds INT 67H mov ax ,O

mov es,ax mov cl,lineal mov dx,OFFSET(ProgoperMens) INT 69H mov cx,OFFFFH

AQUI: loop aqui mov ax,O mov es,ax

rnov cl,linea2 mov dx,OFFSET(UAMMens)

INT 69H push ds

mov ax,DS-Usuario

mov ds,ax inc cuenta mov al,cuenta

POP ds cmp al, 1 O

je salida jmp oper

SALIDA: ¡ret ProgOperMens db 'Monitor VECTORSL$

UAMMens db I UAM-lztapalapa$'

7A 74 61 70 61 6C 61 70 61 24

096E ProgOper endp 096E code ends

O000 O000 O000 O0

O001

data segment org O H

cuenta db ? ;variable que lleva la cuenta

data ends end

Hay que recalcar algo importante:

1 .-

2.-

3.-

4.-

5.-

6.-

Existe un bloque de memoria SRAM del sistema , el cual el usuario puede utilizar

para definir sus variables. Este bloque va de la localidad 01770H a la 17FFH. Como se. ve en el ejemplo anterior, se declara una variable cuenta que se utiliza en el programa, que se inicia salvando el valor del registro DS evitando que, al redefinirlo, para utilizar la variable se pierda su valor inicial. Antes de finalizar el programa lo recupera. El valor inicial, de DS determina la dirección de las

variables del monitor. El usuario puede utilizar el segmento de pila ya que este segmento se conmuta,

al detectar al usuario, por lo que no es necesario redefinirlo.

Los programas del usuario deben finalizar con la instrucción IRET ya que, corno se explicó anteriormente, el programa del usuario se ejecuta mediante una

interrupción. Si alguna vez verifica, mediante a subrutina de revisión su programa, y observa

que este inicia con el byte del código de la instrucción ST1 y que NO pertenece a

su programa, NO esta mal el programa ya que el comando " E JEC inserta este byte. Si el programa no se ejecuta en la forma esperada o se sale de control, basta

presionar la tecla 'CY. Esta tecla realiza un escape simulando la secuencia cntl-alt- del, reinicializando la tarjeta. El programa se ubica, mediante el directivo ORG (recolocador de apuntador) en la dirección 0900H el directivo EVEN, asegura que la siguiente instrucción se encuentre el una localidad par acelerando la ejecución del programa de transmisión.

La comunicación entre la PC y su sistema digital se realiza mediante el UART, y un

cable a cinco líneas:

4

Rx

GND GND

Rx Tx

Tx

CTS

CTS RTS

RTS

Sistema Digital t DCD

DSR

DTR

I Fig 4 Cable de conexion serial entre tarjeta madre del sistema minimo y PC

INTERRUPCIONES DEL MONITOR

NUMERO DE

INTERRUPCION

12 H

14 H

PARAMETROS QUE NESCESITA LA INT. FUNCION QUE REALIZA LA

INTERRUPCION

ENTRADA ninguna Permite la lectura del teclado,

SALIDA devuelve? la bandera ZR si se utilizando para ello la tabla presionó tecla y en 'al' se devuelve el cod. proporcionada. ASCII de la tecla presionada Utiliza las variables CSTeclado y OFFTeclado para ubicar la tabla que utiliza.

DX = O PUERTO A USAR Transmite un caracter por el UART

AH = O 0 inicializar puerto

ENTRADA

AL = Palabra de los registros internos

del 8250 bit 7-5 =Frecuencia en baudios

donde: OOOb = 110 baudios 001 b = 150 baudios

OlOb = 300 baudios O 1 1 b = 600 baudios

100b = 1200 baudios 1 O1 b = 2400 baudios

110b = 4800 baudios 11 1 b = 9600 baudios

bit 4-3 = Bits de Paridad: OOb = ninguna Olb = impar

10b = ninguna l l b =par

bit 2 = Bits de paro: Ob = 1 bit de paro l b = 2 bits de paro

bit 1-0 = Tamaño de caracter: 10b = caracter de 7 bits 11 b = caracter de 8 bits

SALIDA AH = Estado del registro de

estado de la linea AL = Estado del registro del

estado del modem

AH = O 1 fmnsmifircaracfer ENTRADA AL = caracter a enviar

SAL1 DA AH = Estado del registro del estado de la línea.

AL = caracter no cambiado

AH = 02 recibircamcfer

ENTRADA AL = no importa SALIDA: AH = Estado del LSR

AL = caracter recibido

AH = 03 leer estado del puerto serial

ENTRADA AL = no importa SALIDA: AH = Estado del LSR

AL = Estado del MSR

17 H DX = O PUERTO A USAR

AH = O 0 imprimircaracfer

ENTRADA AL = caracter a imprimir SALIDA AH = estado de la impresora

AH = O1 inicializarla impresora

ENTRADA AL = no importa SALIDA AH = estado de la impresora

AH = 02 lectura del estado de la impresora

ENTRADA AL = no importa

SALIDA AH = estado de la impresora

32 H Nada

Imprime un caracter

Esta interrupción da prioridad al usuario para colocar

memorias de expansión en la

memoria media, usando los

MCSO-4 en cuatro bloques de 16K para obtener inicialmente un bloque total de 64K para propósito general, este bloque va de:

10000H - 13FFFH MCSO 14000H - 17FFFH MCSI 18000H - 1 BFFFH MCS2

ICOOOH - IFFFFH MCS3

33 H Indica el tamaño actual de la Memoria Media Imprime en el LCD, el valor

actual de la memoria media.

42 H Previamente debe colocar en la variable Permite la depuración de un ResguardoCS y ResguardoSS, el valor de programa los registros CS y SS respectivamente.

67 H Nada Borra el LCD (clrscr)

68 H Nada Hace que una bocina emita un sonido, indicando al usuario,

está sucediendo algo anormal?, por lo que le debe prestar atención al sistema.

69 H DX debe apuntar al inicio de la cadena. Imprime en el LCD una ES debe contener el segmento donde se cadena de caracteres, dicha

encuentra la cadena. cadena debe terminar en $.

CL el valor de la línea del LCD, donde deseamos desplegar la cadena.

O 0 Línea 1 40 Línea 2

DIRECCIONES DE VARIABLES IMPORTANTES

DlRECClON REAL QUE SE ENCUENTRA EN ESA DlRECClON

00486H Lugar donde se encuentra el desplazamiento de la dirección de la tabla de teclado, la cual es utilizada el procedimiento de FTECaASCII, para generar los códigos necesarios, para la escritura

de caracteres al LCD.

00486H

00467H

Lugar donde se encuentra el segmento de la dirección de tabla de teclado utilizada por el procedimiento de FTECaASCII, el cual genera los códigos necesarios, para la escritura de caracteres al LCD.

Lugar para la Variable ResguardoCS, la cual aloja el valor del registro CS utilizado en la INT 42H. (interrupción de depuración)

00475H Lugar para la variable ResguardoSS, la cual se aloja el valor del SS antes de llamar a la INT 42H.

MAPA DE LA MEMORIA SRAM DEL SISTEMA

PILA PARA EL SISTEMA

Y USUARIO

AREA DE DATOS PARA USUARIO

...............................

..............................

PROGRAMA RECIBIDO POR UART

PROGRAMA EDITADO POR TECLADO ..............................

AREA DE VARIABLES PARA EL MONITOR

...............................

AREA DE VECTORES

e OlFFFH

t O 1800H

4- 01700H

00900H

e OO800H

4- 00400H

4- OOOOOH

SUBRUTINA IMPRESION (IMP)

Esta subrutina permite el envio de un bloque de N bytes, a través de un 8255

(Puerto paralelo de EntradaiSalida ), mapeado en el espacio de EntraddSalida en la dirección del PCS3, cuya direccion física es de 0180H a O 1 FFH. El 8255 puede ser utilizado también por el usuario de manera

independiente,configurándolo de la manera que el desee, para su propósito específico. Cuando se llama esta subrutina con el comando "IMP, y presionar el ENTER, el monitor proporciona el mensaje 'I IMPRESION DE BLOQUE DE MEMORIA I', para a

continuación solicitar la memoria desde la que se va a hacer la impresion,

colocando para este propósito un menú de las memorias disponibles. La memoria se indica, presionando el numero correspondiente, "IMP automhticamente determina el valor del segmento. Como se trata de la impresión de un bloque "IMP" solicita el desplazamiento inicial del bloque, el cual se válida y si es correcto se solicita el desplazamiento final y con esto el sistema comienza la impresión luego de verificar que la impresora este encendida y con papel.

Si dentro de los 4 dígitos hexadecimales del desplazamiento proporcionado es incluido un dígito erróneo, se proporciona un mensaje de error y se solicita el desplazamiento nuevamente. Si en cualquier momento la impresora se ve afectada, el procedimiento es interrumpido y envia al monitor al menú principal. Luego de terminada la impresión vuelve al menu principal.

Comandos permitidos

Q Permite salir del procedimiento en cualquier

lugar, para esto nos envia al menú principal.

SUBRUTINA REVISION (REV)

La memoria se indica, presionando el numero correspondiente, "REV automáticamente determina el valor del segmento, pero si se desea salir al menu

principal solo se tiene que presionar la tecla "Q".

Cuando se llama esta subrutina con el comando "IMP, y presionando el ENTER, el monitor proporciona el mensaje inicial " REVISION DE DATOS en MEMORIAS ", para a continuación solicitar la memoria desde la cual se desea realizar la revision, colocando para este propósito un menú de las memorias disponibles. Cuando se ha proporcionado la memoria a revisar, se coloca en el LCD la direccion que se esta revisando y el valor en esta localidad en formato hexadecimal. Dentro de esta subrutina existen teclas claves para ciertas acciones como son:

J Se utiliza para saltar a otra localidad dentro de la misma memoria, esto indica que el segmento para el calculo de la direccion, se

O

Q -r

.1

conserva. AI momento que se presiona automaticamente el monitor

le pide el nuevo desplazamiento. Se utiliza para revisar otra memoria sin tener que salir de la subrutina “REV”, al momento de ser presionada esta tecla, el monitor pide la memoria que se va revisar y el desplazamiento dentro de ella. Permite salir al procedimiento principal. Permite incrementar el desplazamiento y con esto revisar el

siguiente dato. Permite disminuir el desplazamiento y con esto revisar el dato

anterior.

SUBRUTINA EDICION (EDIT) Permite, que un programa sea editado mediante teclado byte a byte. El programa puede se colocado desde la direccion 0080:OH hasta la direccion 008F:FH, cuya dirección que se encuentra dentro de la memoria SRAM del sistema. Cuando se llama esta subrutina con el comando “EDIT”, y presionando el ENTER, el monitor proporciona el mensaje inicial “ EDITOR DE PROGRAMAS ‘I, para a

continuación solicitar la direccion desde la cual se va a iniciar la edicion del programa.

Cuando la subrutina solocita el desplazamiento desde el cual, se va editar esto lo hace colocando en el LCD el la primera linea OFFSET” y el la segunda linea el

intervalo permitido para la edicion [800H - 8FFHI.

Luego de dar el desplazamiento, coloca en el LCD el desplazamiento dado y el valor que posee en ese momento dicha direccion, ademas coloca el cursor sobre el primer caracter que se puede cambiar. En este momento, el usuario debe poporcionar al sistema el valor que vaya a editar en dicho desplazamiento, para que el sistema

acepte este valor debe presionar la tecla de aceptado (ENTER), y el sistema incrementa automaticamente la direccion a editar. Pero si se desea:

J Salta a otra direccion, dentro de la subrutina “EDIT’.

Q Permite salir al procedimiento principal. -r Permite incrementar el desplazamiento y con esto revisar o editar el

.1 Permite disminuir el desplazamiento y con esto revisar o editar el siguiente dato.

dato anterior.

SUBRUTINA TRANSMISION (TRANS)

Esta subrutina permite el envio de un bloque de N bytes, a través de un 8250

(Puerto serial), mapeado en el espacio de EntraddSalida en la dirección del PCS2, cuya direccion física es de O I O O H a 017FH. El 8250 puede ser utilizado también por el usuario de manera independiente,configurándolo de la manera que el desee, para su propósito

específico. Cuando se llama esta subrutina con el comando "TRANS, y presionar el ENTER, el monitor proporciona el mensaje I' TRANSMISION x PTO SERIAL ", y continuación

solicita la memoria desde la que se va a hacer la impresion, colocando para esto un menú de las memorias disponibles. La memoria se indica, presionando el numero correspondiente, "TRANS" automáticamente determina el valor del segmento. Como se trata de la impresión de un bloque "TRANS" solicita el desplazamiento inicial del bloque, el cual se válida y si es correcto se solicita el desplazamiento final

y con esto el sistema comienza la transmision.

AI igual que en la subrutina "IMP, si dentro de los 4 dígitos hexadecimales del desplazamiento proporcionado es incluido un dígito erróneo, se proporciona un

mensaje de error y se solicita el desplazamiento nuevamente. Luego de terminada la impresión vuelve al menu principal.

Comandos permitidos

Q Permite salir del procedimiento en cualquier

lugar, y nos envia al menú principal.

Para el ensamblaje del monitor VECTORSL-188, se utilizo el macroensambler MASM" con ciertas utilerias realizadas en TC++ de BoriandTM. A cntinuacion se presenta una guia de programacion de este lenguaje, utilizada en la elaboracion del programa monitor:

PROGRAMACION PARA UN SISTEMA DIGITAL 80188

Un programa un lenguaje ensamblador, puede ser definido como una sene de sentencias ejecutables, las cuales le indican al ensamblador que debe realizar. Esta sene de sentencias ejecutables se le denominan código fuente.

S e puede a grandes rasgos definir dentro de este código fuente, 4 regiones o campos

los cuales son:

Regi6n nombre Regi6n operaci6n Regi6n operando Regi6n comentarios

No todas las regiones son utilizadas en las instrucciones.

Regi6n Nombre La región nombre, es a menudo denominado región de rótulos, la cual es la asignación de un nombre simbólico a cierta dirección de memoria real. Dicho nombre simbólico permite referenciar una instrucción o un bloque de ellas sin tener que seguir

una dirección necesitada.

AI utilizar el ligador (LINK o TLINK), la referencia simbólica (rótulo) es asignada a una dirección para cada vez que sea llamada.

Este rótulo ó nombre puede comenzar con un carácter alfabético y puede tener una extensión hasta 31 caracteres incluyendo:

0 Todas las letras del alfabeto 0 Dígitos del O al 9

0 Los siguientes símbolos: - $ . ? YO @

Cuando se escoge un nombre se debe tener cuidado de que dicho nombre, no coincida con una palabra reservada o directivo propio del ensamblador, además debemos aclarar que si dicho nombre incluye al símbolo (.) este debe ser el primer caracter.

La región nombre se encuentra compuesta de nombre de variables, etiquetas o nombre de constantes.

Cuando se declara un valor de una constante, este puede darse en binario, en decimal, en hexadecimal o en octal; para esto se debe poner al final del valor de la constante el sufijo necesario.

Para declarar que la constante es un decimal se debe colocar una “d” despues de la

cantidad ( 65d ), o tambien dejar solo la cantidad sin ningun sufijo ( 65 ). Para declarar que una constante debe ser tomada como un valor binario se le debe colocar el sufijo “b” (O1 10001 b ). Para declarar una constante hexadecimal se le coloca el sufijo “H” despues de la constante ( 67FCH ). Para indicarle al ensamblador que la constante que se esta declarando debe ser considerada de caracter octal se le debe

colocar el sufijo “ O o el “Q” despues de la constante ( 35q o 350 ).

Regi6n Operaci6n

Este campo contiene un neumónico para una instrucción real del microprocesador. El neumónico es una instrucción la cual codifica una acción, la cual es una abreviación en inglés, lo cual hace mas fácil de leer y comprender que debe hacer dicha instrucción. Este neumónico, que puede representar una instrucción, un llamada a macroinstrucción o una pseudo-operación.

Cada neumónico le indica al ensamblador no solo cuantas instrucciones se pueden ejecutar, sino cuantos operandos se necesitan y de que tipo deben ser.

Regi6n Operando

Este campo contiene la posición o las posiciones donde se encuentran los datos que

van a ser manipulados por el campo operación. En dado caso que la operación

requiera dos o mas operandos estos deben ir seguidos de la instrucción separados ya sea por una coma, por un espacio, y en otras ocasiones no existen.

Cuando una operación espera dos operandos, el operando más próximo a la instrucción se denomina operando destino y el más lejano operando fuente, por ejemplo si se tiene:

IN AL,DX

Esta operación sugiere un movimiento en el espacio de EntraddSalida. Dicho movimiento se va realizar desde el operando fuente que es la direccion que apunta el

registro DX, hasta el operando destino que va a ser registro AX, en su parte baja AL.

Este movimento es de 8 bits ( 1 Byte ).

Regi6n Comentario

Este es el último de las cuatro regiones, esta puede ser el más útil para aquellas personas que desean saber como se realiza un programa.

S e utiliza para comentar internamente un programa.

Esta región es ignorada por el ensamblador y es listada por éI, en su ayuda al formar

el archivo *.kt. Cuando se quiere agregar, un comentario para que forme parte de la

región comentario solo basta preceder éste con punto y coma ( ; ), por ejemplo:

MOV AX,79Q ;Movemos el valor octal de 79 al registro AX

PSEUDO OPERANDOS DEL ENSAMBLADOR

Cuando realizamos un buen programa en ensamblador, es necesario adicionar lo que llamaremos pseudo-operandos para especificar al ensamblador que debe hacer y

como realizar tal tarea. Tales pseudo-operandos son considerados ordenes para

ensamblador.

Dichas pseudo-operanciones no causan un código máquina adicional al programa inicial, mas bien lo robustecen, dando forma y enfatizando operaciones generales.

Cada microprocesador posee un ensamblador especifico para éI, y los pseudo- operadores pueden cambiar de un ensamblador a otro. Una gran ventaja dentro de los microprocesadores de Intel es que la gran compatibilidad y ascendencia, de tal suerte un programa relizado para un sistema 8088 puede correr en un sistema 80286 sin problemas. En el mercado existen en la actualidad dos ensambladores para los

microprocesadores de Intel, el Ensamblador de Microsoft y el Ensamblador de Borland, ambos son casi idénticos. Estas notas se enfocaran hacia un sistema 8Ox8x, y nos dedicarenos en primera instancia a describir y ejecitar con ejemplos los pseudo-opemados utilizados.

Pseudo Operandos

AI igual que las intrucciones para un microprocesador específico, los pseudooperandos pueden ser divididos en categorias muy diversas.

Los pseudo-operandos se dividen en las siguientes categorias:

a.- Pseudo-operandos de modo b.- Pseudo-operandos de datos c.- Pseudo-operandos de listados d.- Pseudo operandos para macros e.- Pseudo-operandos condicionales

Pseudo-operandos de modo

Estos pseudo-operandos determina el conjunto de instrucciones que de debe permitido al ensamblar el programa.

,8086

Dicho operador es permitido por los dos ensambladores MASM y TASM y hace que el ensamblador opere solo para el modo 8088/8086. FORMATO: .8086 (no operandos)

.186

Permite el conjunto de intrucciones para el microprocesador 801881186 en modo no

protegido y 8088/8086, y se puede utilizar con los ensambladores MASM y TASM.

FORMATO: .I86 (no operandos)

.286C

Es utilizado en los ensambladores MASM y TASM y permite el uso de las intrucciones para el 80286 en el modo no protegido y 8086/88. FORMATO: .286C (no operandos)

.286P

Determina que el programa permita el uso del conjunto de intstrucciones para el 8086/88, 80286 en el modo protegido y el 80286 en el modo no protegido. Es permitido por los ensambladores MASM y TASM. FORMATO: .286P (no operandos)

Ejemplo ilustrativo:

.186 ;Se coloca al inicio del programa para que permita

;el uso del conjunto de intrucciones de 80188

Pseudo-operando de datos

Estos pseudo-operandos realizan operaciones de asignación a nombres que determinan variables.

EQU Pseudo-operando que inicializa una variable a un valor específico. Es permitido por los

ensambladores TASM y MASM. FORMATO: (variable) EQU (valor)

- - Se utiliza en la definición y redefinición de valores constantes dentro del programa. Es permitido por los ensambladores MASM y TASM. FORMATO: (rótulo) = (valor)

DB

Detemima un byte, que es utilizado en la definición de una variable ó tabla colocada en una dirección dentro del programa. Esta dirección mediante este pseudo-operando separa un esoacio de memoria 8 bits (1 byte). El nombre de variable es opcional.

La expresión puede ser: a.- una constante b.- un caracter c.- una cadena de caracteres ó quizás una tabla de constantes.

Cuando se trata de cadenas y tablas cada byte debe ser separado por una coma.

Cuando es una constante, esta puede ser un valor definido ( 04FH en hexadecimal, 55d en decimal, etc), un signo de interrogar (?) -el cual solo separa el espacio de memoria-, ó

una orden para duplicar el espacio en “paquetes” de un byte. Cuando la constante es una orden para duplicar [(cantidad) DUP]. La cantidad determina cuantos (O al 255 en decimal) “paquetes” de un bytes se desea. Si no se coloca número alguno, por default el ensamblador determina uno (1).

Dicho pseudo-operando es permitido por los ensambladores, MASM y TASM. FORMATO: <variable> DB (expresión)

DW Determina una palabra (dos bytes), que es utilizado en la definicion de una variable o tabla en una dirección dentro del programa. Esta direccion separa un tamairo de 16 bits (2 bytes). El nombre de variable es opcional. La expresion puede ser

a.- una constante b.- un caracter c.- una cadena de caracteres o quizas una tabla de constantes.

Cuando se trata de cadenas y tablas cada byte debe ser separado por una coma. Cuando es una constante, esta puede ser un valor definido ( 04FFEH en hexadecimal, 755d en decimal, etc), un signo de interrogar (?) -el cual solo separa el espacio de memoria-, ó una orden para duplicar el espacio en “paquetes” de una palabra. Cuando la constante es una orden para duplicar [(cantidad) DUP], la cantidad determina cuantos (O al 255 en decimal) “paquetes” de una palabra se desea. Y si no se coloca

número alguno por default el ensamblador le coloca uno (1). Es permitido por los ensambladores, MASM y TASM.

FORMATO: <variable> D W (expresión)

DD

Determina una doble palabra (cuatro bytes), que es utilizado en la definición de una

variable o tabla en una dirección dentro del programa. En dicha direccion se separa un

tamaño de 32 bits (4 bytes).

El nombre de variable es opcional. La expresion puede ser:

a.- una constante b.- un caracter

c.- una cadena de caracteres o quizas una tabla de constantes. Cuando se trata de cadenas y tablas cada byte debe ser separado por una coma. La constante puede ser un valor definido ( 03054FFEH en hexadecimal, 66755d en decimal, etc), un signo de interrogar (?) -el cual solo separa el espacio de memoria-, o una orden para duplicar el espacio en “paquetes” de dos palabras. Cuando la constante es una orden para duplicar [(cantidad) DUP], la cantidad determina cuantos (O al 255 en decimal) “paquetes” de dos palabras se desea. Si no se coloca la cantidad por default el ensamblador determina uno (1). Es permitido por los ensambladores, MASM y TASM.

FORMATO: <variable> DD (expresión)

DQ Determina una quatruple palabra (ocho bytes), que es utilizado en la definición de una variable o tabla en una dirección dentro del programa. Esta dirección separa un tamaño de 64 bits (8 bytes). El nombre de variable es opcional. La expresión puede ser:

a.- una constante b.- un caracter C.- una cadena de caracteres o quizas una tabla de constantes.

Cuando se trata de cadenas y tablas cada byte debe ser separado por una coma. La

constante puede ser un valor definido ( 03054FFEH en hexadecimal, 66755d en decimal, etc), un signo de interrogar (?) -el cual solo separa el espacio de memoria-, o una orden

para duplicar el espacio en "paquetes" de cuatro palabras.

Cuando la constante es una orden para duplicar [(cantidad) DUP], la cantidad determina cuantos (O al 255 en decimal) "paquetes" de cuatro palabras se desea. Si no se coloca la cantidad por default el ensamblador determina uno (1). Es permitido por los ensambladores, MASM y TASM. FORMATO: <variable> DQ (expresión)

ASSUME

Proporciona una directiva al ensamblador para que busque y encuentre un segmento que coincida con un registro de segmento. Es válido para los segmentos CS, DS, ES y

SS. FORMATO: ASSUME (resgistro-segmento):(nombre-del segmento)

COMMENT

Permite un comentario, dentro de un programa sin tener que hacer uso de punto y coma (;) al inicio del comentario. Este pseudo-operando hace el uso de un delimitador que es un signo escogido por el programador y la longitud del mensaje puede ser tan larga como se desee. FORMATO:

COMMENT <signo delimitador> (Comentario) <signo delimitador>

END

Denota la finalización del programa. La expresión es opcional. FORMATO: END <expresión>

ENDS

Denota la finalización de una estructura o segmento. FORMATO: <nombre-del-segmento> ENDS

ENDP

Denota la finalización de un procedimiento. FORMATO: <nombre-del-procedimiento> ENDP

EVEN

Se asegura que la siguiente instrucción, sea colocada en una localidad par FORMATO: EVEN <sin-comentarios>

INCLUDE

Le indica al ensamblador, que se incluya al programa principal, procedimientos externos

sin ensamblar, el cual le indica la ruta en la que estos se encuentran.

FORMATO: INCLUDE [drive]: \[dirección]\ [nombre].[extensión]

ORG Relocaliza el contador de localidad, a la dirección señalada.

FORMATO: ORG (dirección)

SEGMENT

Determina que el nombre que le precede, se le debe asignar un segmento.

FORMATO: <nombre> SEGMENT

PROC

Identifica a un bloque de código fuente, como un procedimiento. Este bloque continua, hasta encontrar un final de procedimiento (ENDP 6 RET). El pseudo-operando PROC

posee un attributo, que puede ser NEAR o FAR. El atributo far o near depende de cuanta distancia de codigo, se debe recorrer el contador del programa principal para

alcanzar este procedimiento. Si no se coloca el atributo, el ensamblador lo considera por

default near. FORMATO: <nombre- de-procedimiento> PROC <atributo>

EXTRN

Se utiliza este pseudo-operando para indicar que el <nombre>, ya sea procedimiento ó variable, no se encuentra dentro del mismo bloque de programa sino que se encuentra

en un programa auxiliar ó externo. El atributo, si se trata de un procedimiento es far ó near; si se trata de una variable esta puede tener atributo: byte, word, dword, qword, etc. FORMATO: EXTRN <nombre>:<atributo>

PUBLIC

Este pseudo-operando determina que el símbolo indicado(procedimiento, variables, etc), puede ser utilizado por un programa externo.

FORMATO: PUBLIC <símbolo>

GROUP Reune todos los segmentos indicados por este pseudo-operanado en un segmento físico de longitud 64K.

FORMATO: GROUP <nombre-del-segmento>

Ejemplo ilustrativo:

.186

COMMENT @ Este programa es un ejemplo del uso de los pseudo-operandos, para robustecer un

programa @ """""""" &a para Constantes . . . . . . . . . . . . . . . . . . . . . . . . .

VARl EQU 0345H ;Definición de una contanste llamada Varl con un ;valor

hexadecimal constante

VAR2 - - 0575b ;Definición de una constante que puede ser ;redefinida dentro

del programa principal

BUSYDISP EQU 0342H ;Se define una constante """"""""""""""""""""-""""""""""""""

IF1 ;Se explicara en pseudo-operandos condicionales

INCLUDE

a:\prueba\digit.lib ;Se le dice al ensamblador que hay procedimientos ;que no encuentra en proc.

principal, se da la ruta ;donde puede encontrarlos.

ENDIF' ;Se explicara en pseudo-operandos condicionales

""""""" ha para segmento de datos --I_-------_------_----- , Data SEGMENT ;Definicibn inicio de segmento, - de datos - PUBLIC DataVar2 ;Indicamos que la variable DataVar2, puede ser ;llamado por procedimiento externo

DataVar db 078H

DataVarl db ?

DataVar3 db 20 dup (?)

DataVar2 dw 95

DataVar4 dd 35 dup (55d)

Data ends

EXTRN valocbyte

Code SEGMENT

ASSUME CS:CODE,DS:DATA

PUBLIC busy

ORG 0250H

db 56H

EVEN

busy PROC near

mov dx,BUSYDISP

Espera5 :

in al,&

and al,80H

jnz espera5

; S e define variable de un byte con un valor definido ;078H

;Definicibn de variable de un byte, la que solo separa el ;espacio

dentro del segmento, no importanto su valor ;inicial.

;Variable definida en paquetes de un byte, cuya ;extensión es de

20 bytes, y su valor inicial no debe ;importar.

;Variable de longitud de 1 palabra (2 bytes ), cuyo ;valor

asignado es de 95 decimal ( 5FH )

;Variable definida en paquetes de doble palabra ( 4 ;bytes ), de

una extensión de 35 dobles palabras y cuyo ;valor es de 55

decimal (37H).

;Define fin de segmento abierto

;Se abre un nuevo segmento - code -, dicho este ;segmento es el

programa principal.

;Se le avisa al ensamblador que debe incorporar ;todos los

segmentos vAlidos para su ensamblaje

;indicamos que el procedimiento busy, puede ser ;llamado por

otro programa externo a este

;Se recoloca el contador de localidades a un valor de ;250H

;Se define un byte con un valor de 56H

;Se hace que el contador de localidades se coloque en ;una

localidad par

;Se define el inicio de un procedimiento de nombre ;busy, con

atributo near

;Cuerpo del procedimiento

mov al, valor

cmp al , 15H

je espera5

ret

busy ENDP

db 'CADENA DE LETRAS'

Code ENDS

END

;Transferimos el contenido de una variable externa a ;este

procedimiento, a la parte baja del registroAX

; S e cierra el procedimiento busy

;Se define una cadena, para que el ensamblador nos ;devuelva el

ascii de esta cadena, esto se logra colocando ', al inicio y, ' al

final de la cadena.

;Se cierra el segmento - code - ;FIN DE PROGRAM4

Pseudo-operando de listados

PAGE

lnicializa o modifica las dimensiones de cada página del listado de salida. Cuando no es colocada el ensamblador determina por default 58 renglones por página y 80 caracteres

por renglon. La opcion-renglones puede ir de 10 a 255 y la opcion-caracteres-en-renglon puede ir de 60 a 132.

FORMATO: PAGE (opcion-renglones),(opcion-caracteres-en-renglon)

%OUT

Puede indica el progreso del ensamblador al estar ensamblando un programa. Cuando

un programa es ensamblado se podra visualizar en donde se encuentra dicha etapa, por

medio de este pseudo operador. Es permitido por los ensambladores MASM y TASM. FORMATO: %OUT (mensaje)

TITLE

Determina el titulo que se dá, a cada página del listado del programa. Dicho nombre puede ser dado solo una vez dentro del programa.

FORMATO: TITLE <cadena>

SUBTTL Determina un subtitulo, el sual es listado debajo del título principal. FORMATO: SUBTTL <cadena>

Programa ilustrativo

.186

PAGE 80,132 ;Se determina que el ensamblador

proporcione una ;salida *.la con 80

renglones por pagina y 132 ;caracteres por

cada rengl6n.

TITLE PROGRAMA DE EJEMPLO

SUBTTL EMPLEO DE PSEUDO-OPERADORES DE LISTADOS

%OUT SEGMENTO DE DATOS ENSAMBLANDOSE

;Cuando el ensamblador encuentre la linea

anterior ;producira una salida en el monitor,

igual al mensaje

;Se abre un nuevo segmento

denominado segmento de ;&go

Code Segment

ASSUME CS:CODE,DS:DATA

SU PROGRAMA SE COLOCA AQUl

Code ends

end

Pseudo-operando de Macros

Dichos pseudo-operandos se aplican a estructuras denominadas MACROS.

MACRO

Determina que el código encontrado entre la definición MACRO y el fin de macro ENDM debe ser considerado como un macro. FORMATO: <nombre> MACRO <parámetros>

ENDM

Determina el fin de un código, el cual es considerado como macro. FORMATO: ENDM <sin parámetros>

LOCAL

Se utiliza dentro de una MACRO. Con este pseudo-operando el ensamblador determina un símbolo Único para cada etiqueta dentro de una llamada a la macro, esto evita que una llamada multiple, a un macro tome un lugar diferente al deseado.

FORMATO: LOCAL <nombre-de-etiqueta>

Programa ilustrativo

.186

COMMENT @ Este programa es un ejemplo de uso de los pseudo-operandos, para robustecer un

programa @ PAGE 80,132 ;Se determina que el ensamblador proporcione

una ;salida *.kt con 80 renglones por página y

132 ;caracteres por cada renglón.

EVEN delay MACRO X

LOCAL rte2,rtel

mov al,X

xor &,ah

rte2: mov cx,OfB

rtel:

loop rtel

dec al

jnz rte2

ENDM

Code Segment

ASSUME CS:CODE,DS:DATA

ORG 0250H

db 56H

DELA Y I OH

;Se abre un nuevo segmento - de codigo -,

dicho ;segmento es el programa principal.

;Se recoloca el contador de localidades a 250H

;Se define un byte con un valor de 56H

;Llamada a la MACRO dando el párametro

10H, ;el cual ella, lo transforma en X.

Code ends

end ;fin de programa

Pseudo-operando Condicionales

Son pseudo-operadores que determinan un condición, para determinar un camino a seguir en el proceso de ensamblado.

IFxxx ( IF, IFE, IF1, IF2, IFDEF, IFNDEF, IFB, IFNB, IFDN, IFDIF)

Este pseudo-opemando ondicional, comprueba que se cumpla una condición especificada antes que se prosiga un camino determinado. Es similar a IF en Turbo C.

Su característica se vuelve altemante con el uso de ELSE.

PSEODO-OPERANDO DEFINICION IF (0perando)Cierto si operando es < o > O

IFE (operando) Cierto si operador es <> O

IF1 ( no operando) Cierto si paso 1, del ensamblador IF2 (no operando) Cierto si paso 2, del ensamblador IFDEF (operando) Cierto si simbolo o variable definida IFNDEF (operando) Cierto si no es simbolo o variable definida

IFB (operando) Cierto si operando es un blanco

IFNB (operando) Cierto si variable definida no es un blanco IFDN (operandol), (operando2) Cierto si operandol es idéntico a operando 2

IFDIF (operandol), (operando2) Cierto si operando 1 no es idéntico a operando 2

FORMATO: IFxxxx (operando-de-condicion) (codigo-extra)

ENDIF

ENDIF

Pseudo-operando de cierre de condicionales. Es utilizada para que coincida cada condicional IFxxx. FORMATO: ENDIF (no operandos)

ELSE

Pseudo-operador que da una salida alterna a situación de condicionalidad. FORMATO ELSE (no operandos)

Programa ilustrativo

.186

COMMENT @ Este programa es un ejemplo de uso de los pseudoqxxandos, para robustecer un

programa @ PAGE 80,132 ;Se determina que el ensamblador proporciones

una ;salida *.M con 80 renglones por y

132 ;caracteres por cada renglón. """"""""_ ha para Constantes ~ ~ ~ - ~ ~ ~ ~ ~ _ - ~ ~ ~ ~ _ I ---___--

9

VARW - - OH ;Definición de una contanste llamada VarIFcon un ,valor

hexadecimal constante """""""""""""""""""""""""""""""""- ,

IF VARE

INCLUDE A:\MACROS.MAC

ELSE

'%OUT NO SE ENCUENTRA EL MACRO DESEADO

ENDIF

Code Segment ;Se abre un nuevo segmento -codigo-, dicho

segmento ;proporciona el programa principal.

ASSUME CS:CODE,DS:DATA

ORG 0250H ;Se recoloca el contador de localidades a 250H

db 56H ;Se define un byte con un valor de 56H

DELA Y IOH ;Llamada a la MACRO pasando como

parametro lOH, ;el cual ella, lo transforma en

X.

Code ends

end ;fin de programa

Macro contenida en una archivo llamado MACROS-MAC EVEN

delay MACRO X

mov al,X

xor ah,&

rte2: mov cx,OfEh

rtel:

loop rtel

dec al

jnz rte2

ENDM

INICIO DE UN PROGRAMA PARA UN SISTEMA 80188

Cuando se propone, realizar un programa en ensamblador para un microprocesador de la familia 8Ox8x, de Intel, no sabemos por donde comenzar un programa. Las

primeras preguntas que nos surge es, ¿ Cómo el microprocesador ve al programa ?, ¿

Qué secuencia debo seguir para escribir mi programa, de tal manera que el sistema entienda lo que debe hacer ?, ¿ Qué son los segmentos y cúantos de ellos debo utilizar

?. Estas preguntas al igual que otras nos hemos hecho, aquellos que hemos realizado

programas en ensamblador para microprocesadores de Intel.

Para empezar un programa, lo que primero que se debe tener en cuenta es la

cantidad de segmentos de van a utilizar ( segmento de código, segmento de datos,

segmento extra o adicional, segmento de pila), donde cada segmento aporta una

función específica.

Nuestro programa principal esta en el segmento de código, por cual este siempre se

encuentra presente. En los que respecta a los otros segmentos, si vamos a utilizar variables, debemos

abrir el segmento de datos, si vamos a utilizar llamadas, servicios de interrupciones y

almacenamientos en la pila debemos abrir el segmento de pila, pero si deseamos utilizar

interrupciones ya sea por software o por medio del hardware debemos abrir el segmento adicional o extra.

Cuando ya hemos decidido cual o cuales segmentos vamos a utilizar, lo siguiente es

saber en que forma se debe modular el programa para que realice de manera efectiva el propósito de su creación.

Por ejemplo si decidimos realizar un programa que calcule la raíz cuadrada de un

número mayor o igual a cero, donde el resultado sea desplegado en un LCD (Display de Cristal Líquido) de dos líneas y 16 dígitos por línea.

Primero sabemos que el segmento de codigo, se debe abrir. Como vamos a adquirir un número para sacarle la raiz cuadrada y este es dado externamente asignamos una variable y le decimos al ensamblador que es externa. El resultado decidimos guardarlo,

en algun lugar de memoria, por lo que debemos en este caso abrir el segmento de

datos, ademas decidimos utilizar procedimientos para la raiz cuadrada y escritura al LCD del resultado, por lo que debemos abrir el segmento de pila. Como no vamos a realizar,

interrupciones no es necesario abrir el segmento extra o adicional. Para facilitarnos, utilizaremos constantes por lo que abrimos uns zona de EQUATES o

constantes en donde asignamos sus valores.

Para no hacer el programa principal extenso, y como sabemos que un delay o retardo en cualquier programa se utiliza, hacemos que este procedimiento se encuentre en una libreria alterna. AI estar el Delay o retardo en esta libreria alterna necesitamos decirle al

ensamblador que es externo y donde buscarlo.

Hay tener presente que la lógica para realizar un programa es personal. Aquí solo se

pretende dar un primer acercamiento, a un sistema digital basado en el microprocesador 80188, de tal suerte estoy seguro que Ud. realizaría este programa de una manera muy diferente a la presentada aquí.

.186

page 80,132

COMMENT OUso de pseudo-operadores y diseilo de programas para sistema digital a base de

microprocesador 80C188°

TITLE PROGRAMA EJEMPLO

SUBTTL CALCULO DE RAE CUADRADA e**************************************** , ;* DECLARACIONDE CONSTANTES * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PUMCS EQU OFE3EH ;Palabra del registro UMCS

DUMCS EQU OFFAOH ;Direction del registro UMCS

CDISPLAY EQU SOH ;Direcion de control de Display, A0 = O

DDISPLAY EQU 81H ;Direction de datos de Display, A0 = 1

BUSYDISPLAY EQU 82H ;Direction para verificar el bit BUSY

DATOS-SEGMENTO Segment

NUM dw ?

ANS dw ?

VAL-ASC dw ?

DATOS-SEGMENTO ends

IF1

INCLUDE A:\MACROS.MAC

;Variable en donde se coloca el numero, que se le va a ;sacar ;la

raíz cuadfada

;Variable en donde se coloca el resultado

;Deposito de ascii del procedimiento HEX-ASC

;utilizamos la biblioteca de macro hecha

;anteriormente

ENDIF

* *

CODIGO-SEGMENTO Segment

ASSUME

CS:codigo-segmento,DS:datos-segmento

ORG OOOOH

;Inicialización de registros Segmentados propios del 80 188

BiosInicia:

mov =,Oh

mov es,= ;colocamos el registro adicional

;a un valor base de OH

mov =,SOH

mov ds,ax ;el valor para el registro DS es SOH

mov ax, 1 SOH ;stack segment en 1800H (2K)

mov SS,= ;colocamos el SS a un valor de 18OH

mov s p , ; r F F H ;y el SP en 7FFH

call IniLCD ;procedimiento que inicializa al LCD en:

;2 lineas por 16 caracteres en CAinea

Calcula-raiz:

mov ax,NUM ;llamanos a la variable NUM

call raiz-cuadrada ;saca la raiz cuadrada de NUM

mov ax,ANS

call HEX-ASC ;convirtamos el valor de ANS de

hexadecimal

;a un valor ASCII

mov =,VAL-ASC ;movemos el valor de raiz cuadrada en ascii

call despliega ;despliega en LCD el valor de ANS

Delay O A F H

jmp calcula -raiz

Calcula proc Near

xor dx,dx

mov cx,OlH

Call:

sub ax,cx

j l salida

inc dx

add cx,02H

jmp cal 1

salida:

mov ANS,dx

ret

calcula endp

;esperamos mediante un macro de espera

;salta a etiqueta calcula-raiz

;numero que va a restarse

;se resta un impar entero

;se incrementa el valor de raiz cuadrada

;se da el siguiente numero impar

;mueve el resultado a ANS

Despliega proc

mov bqax ;respaldar atributo de la interrupcion

mov dx,CDisplay ;LCD palabra de control A0 = O

mov al,00000100b ;write display DDRAM (No autoinc)

call busy ;verifícamos la bandera de ocupado

out &,al

call busy ;verificamos la bandera de ocupado

or ah, loooOO0Ob rnov al,&

out d x , a l ;enviamos al LCD la posicion

;en donde se va a escribir el caracter

mov al,bl

mov dx,DDisplay ;LCD datos A0 = 1

call busy ;verificamos la bandera de ocupado

out d x , a l ;desplegar caracter en display

ret

despliega endp

BUSY proc near

mov dx,BUSYDISPLAY

EsperaS:

in al,&

and al,80H

jnz espera5

ret

BUSY endp

ORG O lFFOH

cli

mov ax,PUMCS

mov dx,DUMCS

out dx,d

db OEAH

dw OOOOH

dw OFEOOH db 3 DUP (Om

;recibimos el registro de estado

;esperamos hasta que el LCD se encuentre

;libre para atendemos

;programa el registro UMCS para una

memoria

;superior de 8K con 2 waits

;salto tipo far a la dirección CS igual

OFEOOH

;e lP igual a OOOOH

;Duplicamos un byte tres veces y le

colocamos

;el valor de O F F H

CODIGO-SEGMENTO ends

END

lnclusidn del Segmento de Pila o Stack

Cuando se realiza un programa para un sistema digital 80188, se puede definir el segmento de PILA o STACK de dos modos.

Modo A

Definir el segmento de pila, como un segmento mas dentro del programa para el sistema, como se muestra en la figura:

REGION DE CONSTANTES I I SEGMENTO DE DATOS I I SEGMENTO DE PILA ]

CODIGO

1 Programa Total

El segmento de pila es declarado como un segmento m& del programa total. Y cuando le digamos al segmento de codigo en el ASSUME cuales segmentos debe asumir, debemos incluir el de STACK definido para el SS.

Modo B

De esta manera no se declara el segmento de pila externamente, sino que se declara dinamicamente, dentro del segmento de código por ejemplo:

Supongamos que se desea un espacio de pila de 3 Kbytes dentro de una memoria de 8 Kbytes. Y que la dirección de esa memoria va de [02000H a 03FFFH)

en el espacio de memoria. Ahora decidamos en que parte de la memoria deseamos la pila.

Suponga que decidimos que en la porción media, para ser mas exactos deseamos que

la pila comience en la dirección 02800H, por lo tanto si se desea un bloque de 3 Kbytes de pila debe terminar en 033FFH, a todo esto sabemos que:

SS + SP es la dirección real del apuntador de pila, por lo cual se coloca el SS con un valor de 0280H, y el SP con un valor de OBFFH, así dentro de mi programa dentro del

segmento de codigo, coloco lo siguiente:

mov ax,0280H

mov SS, ax mov sp,OBFFH

Con esto el apuntador de pila queda colocado en la dirección:

SS 0280:O H SP 0OBF:F H apuntador de pila 033F:F H

Para terminar la presente tesis se da el primer seudocodigo, utilizado en la prueba de este sistema minimo, hay que tomar en cuenta que el programa monitor VECTORSL-188 se encuentra en manos de su creador. El siguiente programa sirve de guia para todos aquellos que desean adentrarse en el maravilloso mundo de los sistemas digitales:

page ,132 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * ,

;* UNIVERSIDAD AUTONOMA METROPOLITANA * .* .* * , Iztapalapa * , ;* PROGRAMA DE PROYECTO TERMINAL I1 * ;* MONITOR DEL MICROPROCESADOR * .* * ,

;* MC-80188 * .* * 9

;* A CARGO DEL * ;* PROFESOR AGUSTIN SUAREZ *

;* INTEGRANTES: * ;* SlLVERIO E. LEON JULIO *

.* * 3

.* *

.* *

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ,

.I86 ;Asegura saltos relativos de 16 bits (+/- 32,768)

;* DIRECCION DE LA PROGRAMACION DEL BLOQUE * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ,

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ~REGRELOC EQU 020FFH ;Palabra del registro de relocacion DREGRELOC EQU OFFFEH ;Direction del registro de relocacion

DUMCS EQU OFFAOH ;Direccion del registro UMCS PLMCS EQU OOIFEH ;Palabra del registro LMCS DLMCS EQU OFFA2H ;Direccion del registro LMCS

PMPCS-ext EQU 088BEH ;Palabra del MPCS para memoria extendida DMPCS EQU OFFASH ;Direction del MPCS

PMMCS-ext EQU O 1 lFEH ;Palabra del MMCS para memoria extendida DMMCS EQU OFFA6H ;Direction del registro MMCS

PUMCS EQU OFE3EH ;Palabra del registro UMCS

PMPCS EQU 084BEH ;Palabra del MPCS

PMMCS EQU 09FEH ;Palabra del registro MMCS

PPACS DPACS COUNT-TIMERl-regA COUNT-TIMERl-regB Control-Timer 1 TIMER 1 -regA TIMERl-regB TIMERl-control COUNT-TIMER2-regA Control-Timer2 TIMEM-regA TIMER2-control DE01 PEOI-int PEOI-into PEOI-int 1 PPMR DPMR PINTO DINT0 PINT1 DINT1

EQU 03EH EQU OFFA4H EQU O F F F F H EQU O F F F F H EQU OCOOBH EQU O F F S A H EQU OFFSCH EQU OFFSEH EQU OO5H EQU OCOOlH EQU OFF62H EQU OFF66H EQU OFF22H EQU 08OOOH EQU OOCH EQU OODH EQU 002H EQU OFF2AH EQU OOOH EQU OFF38H EQU OOOH EQU OFF3AH

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . , ;* DIRECCION DE LOS PERIFERICOS *

PCONFIG55 = SOH PDAT55 EQU SOH

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

PCONT55 PSTATUS55 PBOUT55 impresora PALARMA55 CWORD79 DWORD79 D8250TXD Tx D8250RXD Rx D8250BAL T x O R X D8250BAH O R X D8250IER D8250IIR D8250LCR D8250MCR D8250LSR D8250MSR

EQU 83H EQU 88H EQU 89H

EQU SOH EQU 07H EQU 04H EQU lOOH

EQU lOOH

EQU lOOH

EQU lOlH

EQU lOlH EQU 102H EQU 103H EQU 104H EQU lO5H EQU 106H

;Palabra del registro PACS ;Direccion del registro PACS ;Palabra para el registro B del TIMER 1 ;Palabra para el registro A del TIMER 1 ;Palabra para el registro de control del TIMER 1 ;Direccion del registro A del TIMER 1 ;Direccion del registro B del TIMER 1 ;Direccion del registro de CONTROL del TIMER 1 ;Palabra para el registro A del TIMER 2 ;Palabra de control para el TIMER 2 ;Direccion del registro A del TIMER 2 ;Direccion del registro de control del TIMER 2 ;Direction del registro EO1 ;Palabra de EO1 noespecifíca ;Palabra de Fin de Int especifico para la I N T O ;Palabra de Fin de Int especifico para la INTl ;Palabra del registro PMR ;Direccion del registro PMR ;Palabra del registro I N T O ;Direction del registro I N T O ;Palabra del registro INTl ;Direccion del registro INTl

;Configura al 8255 como PA,PB y PC salidas ;Datos de 8255(impresora) A 0 4 ; A 1 4 segun rango ;del PCS 1 del microprocesador ;Control de 8255(impresora) AO=l ; Al=l ;Estado del 8255 cuando se usa como impresora ;Direccionamiento del puerto B cuamdo el 8255 es

;Direction del 8255 para la alarma(escritura en PA) ;Direccion de palabra de Control del 8279, A0 = 1 ;Diremion de Palabra de Dato del 8279, A0 = O ;Con bit DBAL = O direccion de lectura del buffer de

;Con bit DBAL = O direccion de lectura del buffer de

;Con bit DBAL = 1 parte baja del divisor del reloj de

;Con bit DBAL = 1 parte alta del divisor del reloj de TX

;Direccion del registro IER del 8250 ;Direccion del registro IIR del 8250 ;Diremion del registro LCR del 8250 ;Direccion del registro MCR del 8250 ;Direction del registro LSR del 8250 ;Direction del registro MSR del 8250

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . , ;* DIRECCION DE LAS TABLAS *

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

DTECal6seg EQU OlEEOH ;Direccion de las tablas de mensajes ;Cuya direccion de la tabla va de ;OEEOH a O F D F H

; DATA SEGMENT declaracion de variables

DATA SEGMENT

;funciones savehestor stack1 dw? axtemp dw?

;INT 69, Despliega Mensajes dxptr dw ?

;Procedimiento ProgOper buffeffec db 9d dup(?)

;Procedimiento ALARMA cont db?

;procedimiento EDITAR ptractualedit dw ? posdisplay db ? finptrdisp db? inicptrdisp db? insertflag db ? ayuda-direc dw ?

;procedimiento REVISAR tipoMem db? segaw dw?

;procedimiento EJECUTAR saltoLC dd? regdiram2 dw ? regdirom2 dw ? buffermem db 9d dup(?)

; I N T 4cH ptrdisplay db ? numcaractec db? ulcaractec db? axtemp4c dw ? axtempHA dw ? llegodisp7 db ? digit db? HEXaASCII db 5 dup(?) ASCIIaHEX db 9 dup(?) axFASCIIaHEX dw ? serie& dw? spaux dw?

;variable para salvar la direccion de rutina ;variable para salvar el registro AX

;guarda temporalmente el valor de DX

;buffer del teclado

;cuenta las veces que el procedimiento se hace

;apuntador a la direccion de edicion (actual) ;indica la posicion del display en uso

;O:Modo INS, 1 :Modo Normal (No Ins) ;apuntador del OFFSET de la direccion de edicion

; 1:Memoria RAM1 ,2:Memoria ROM ,3:Memoria RAM2 ;segmento con el cual se direcciona memoria

;direction de saltos ;guarda el CS para direccionar la segunda RAM ;gusrda el CS para direccionar la segunda ROM ;buffer de memoria

;apuntador al display [O-71

;variable para salvar registro ax ;variable temporal del registro ax (procedi FHEXaASCII) ;O:no es display #7 : 1:es display #7 ;variable para salvar digito seleccionado ;variable para salvar la conv de cod. Hexa a cod ASCII

;direction de inicio para recepcion de datos serie ;interruption 40h actualiza la bandera ZR/NZ

;procedimiento CURSOR caracter db? ;caracter leido de la RAM display

;procedimiento TRANSMISION SerialBit db ? ;Variable de respuesta en procedimiento

;para indicar el tamauo de la memoria utilizada indtammem db ?

;procedimiento IMPRESION DirDi dw ? ;Variable que guarda el OFFSET de inicio de impresion DirSi dw ? ;Variable que guarda el OFFSET de fin de impresion PrintBit db? ;Variable que nos da respuesta si esta bien la impresora

; INT 14H DISCOAL db 7 BAHNum db? BALNum db? StatusDigit dw ?

; INT 17H contint 17 db ? continterno db ? ImpCS dw?

; INT 42H ResguardoAx dw ? ResguardoBx dw ? ResguardoCS dw ? ResguardoCx dw ? ResguardoDx dw ? Resguardosi dw ? ResguardoDi dw ? ResguardoEs dw ? ResguardoSP dw 7 ResguardoSS dw 7 ResguardoDS dw BitResp db ? IndMens db ? RegEnUso dw?

DATA ENDS

;CODE SEGMENT 9

CODE SEGMENT

;Variable temporal para lo que se encuentra en registro A ;Variable que direcciona el registro BAL del 8250 ;Variable que direcciona el registro BAH del 8250

;contador de secuencia para configurar la impresora ;contador provisional ;Guarda el valor de CS de la memoria elegida

;variable en la cual se guarda el valor de AX ;variable en la cual se guarda el valor de BX ;variable en la cual el usuario guarda el CS ;variable en la cual se guarda el valor de CX ;variable en la cual se guarda el valor de DX ;variable en la cual se guarda el valor de Si ;variable en la cual se guarda el valor de Di ;variable en la cual se guarda el valor de Es ;variable en la cual el usuario guarda el Sp ;variable en la cual se guarda el valor de SS ;variable en la cual se guarda el valor de DS ;respuesta interna de servicio en INT ;indicador de el mensaje en uso ;guarda el registro que se va a desplegar

, ASSUME CS:CODE, DS:DATA

;Inicializacion de registros internos BiosInicia: mov =,Oh ;extra segment en Oh para

org OOOOH

mov es,= ;tabla de interrupciones (2K)

mov %SOH ;data segment en 8OOH (4K) mov &,ax mov ax, 180H ;stack segment en 18OOH (2K) mov =,ax mov sp,7FFH ;stack pointer en 7FTH (stack = IFFFH)

;tope a 2K de Ira RAM

;cargar bloque de programacion ;el registro de relocacion despierta con 020FFH ;por lo que no quisimos cambiar la ubicacion del ;bloque de control que de encuentra en memoria ;VO y de OFFOOH A O F F F F H

mov ax,PLMCS ;programando el registro LMCS para una memoria mov dx,DLMCS ;inferior de SK, con 2 waits out CIxJll mov ax,PMPCS ;el registro MPCS es programado para una memoria mov dx,DMPCS ;de 32K, perifericos en bloque VO y PCSO - PCS7

;ademas de 2 waits para PCSO - PCS3 out &,al mov ax,PMMCS ;esta palabra c o l o c a a la memoria central en un

;bloque de memorias de expansion central, usando los ;MCSO-4 en cuatro bloques de 8K para obtener un bloque ;total de 32K para proposito general(usuari0)este bloque ;va de 8OOOH a FFFFH ; 8000H-9FFFH MCSO ; AOOOH-BFFFH MCSl ; COOOH-DFFFH MCS2 ; EOOOH-FFWH MCS3

mov dx,DMMCS out &al mov ax,PPACS ;el bloque para los CS de los perifericos esta en mov dx,DPACS ;memoria YO y abarca de OOOOH a 02FFH, dando la

;siguiente distribucion de PCSO - PCS2: ; PCSO OOOOH - 007EH * Para el 8279 ; PCSl 007FH - OOFEH * Para el 8255 (impresora

; PCS2 OOFFH - 017EH * Para el 8251 , y usuario)

; PCS3 017FH - OlFEH * LIBRE ; PCS4 OlFFH - O2FEH * LIBRE

out &,al mov dx,DPMR ;Enmascaramos los niveles no utilizados rnov ax,PPMR ;y dejamos libres los niveles de las out &,al ; I N T O e INTl mov &,DINTO ;Colocamos la I N T O de manera que funcione en: mov ax,PINTO ; 1.- Prioridad alta

; 2.- Modo Edge-Triggered ; 3 .- Modo no mascarable y directo ; 4. - Modo Fully Nested

mov &,DINT1 ;Ponemos la INTl de la siguiente manera: mov ax,PINTl ; 1.- Prioridad alta

out &al

; 2.- Modo Edge-Triggered ; 3.- Modo no mascarable y directo ; 4.- Modo Fully Nested

out &,al

; c a r g a r tabla de vectores de interrupcion

mov =,OH mov es,= mov word ptr es:[OOH*4H+2H],CS mov word ptr es:[OOH*4H],Offset(intrOO) mov word ptr es:[OlH*4H+2H],CS mov word ptr es:[OlH*4H],Offset(intrOl) mov word ptr es:[02H*4H+2H],CS mov word ptr es: [02H*4H],Offset(intr02) mov word ptr es:[03H*4H+2H],CS mov word ptr es: [03H*4H],Offset(intr03) mov word ptr es:[04H*4H+2H],CS mov word ptr es:[04H*4H],Of€set(intr04) mov word ptr es:[06H*4H+2H],CS mov word ptr es:[06H*4H],Offset(intr06) mov word ptr es:[07H*4H+2H],CS mov word ptr es:[07H*4H],Of€set(intr07) mov word ptr es:[OCH*4H+2H],CS mov word ptr es:[OCH*4H],Of€set(intr09) mov word ptr es:[ODH*4H+2H],CS mov word ptr es:[ODH*4H],Offset(intr63) mov word ptr es:[14H*4H+2H],CS mov word ptr es:[14H*4H],Offset(intrl4) mov word ptr es: [ 16H*4H+2H],CS mov word ptr es:[16H*4Hj,Offset(intrl6) mov word ptr es: [ 17H*4H+2H],CS mov word ptr es:[17H*4H],Offset(intrl7) mov word ptr es:[12H*4H+2H],CS mov word ptr es:[12H*4H],Offset(intrl2) mov word ptr es:[33H*4H+2H],CS mov word ptr es:[33H*4H],Offset(intr33) mov word ptr es:[42H*4H+2H],CS mov word ptr es:[42H*4H],Offset(intr42) mov word ptr es:[62H*4H+2H],CS mov word ptr es:[62H*4H],Offset(intr62) mov word ptr es:[67H*4H+2H],CS mov word ptr es: [67H*4H],Offset(intr67) mov word ptr es:[69H*4H+2H],CS mov word ptr es:[69H*4f.T1,0ffset(intr69) pop es sti

tipos: pushes

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . , ;* inicializacion de datos * ;* por default (MemRAM) * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

;carga CS de INT tipo OH ;carga OFFSET de INT tipo OOH ;carga CS de INT tipo 1H ;carga OFFSET de INT tipo 01H ;carga CS de INT tipo 2H ; c a r g a OFFSET de INT tipo 02H ; c a r g a CS de INT tipo 3H ;carga OFFSET de INT tipo 03H ;carga CS de INT tipo 4H ;carga OFFSET de INT tipo 04H ;carga CS de INT tipo 6H ;carga OFFSET de INT tipo 06H ;carga CS de INT tipo 7H ;carga OFFSET de INT tipo 07H ;carga CS de INT tipo 12H ;carga OFFSET de INT tipo 12H ;carga CS de INT tipo 13H ;carga OFFSET de INT tipo 13H

;carga CS de INT tipo 14H ; c a r g a OFFSET de INT tipo 14H ;carga CS de INT tipo 16H ; c a r g a OFFSET de INT tipo 16H ;carga CS de INT tipo 17H ;carga OFFSET de INT tipo 17H ;carga CS de INT tipo 32H ;carga OFFSET de INT tipo 32H ;carga CS de INT tipo 33H ;carga OFFSET de INT tipo 33H ;carga CS de INT tipo 42H ;carga OFFSET de INT tipo 42H ;carga CS de INT tipo 62H ;carga OFFSET de INT tipo 62H ;carga CS de INT tipo 67H ;carga OFFSET de INT tipo 67H ;carga CS de INT tipo 69H ;carga OFFSET de INT tipo 69H

mov digit,'$' ;$:indica que no hay tecla presionada mov serieRx,OH ;reception de datos del puerto serie

mov indtammem,OlH ;indicador del tamaao de l a s memoria media en ;es200 serieRx:500 dir física: 2500H

;que se esta usando en ese momento mov regdiram2,SOOH ;indicador inicial del CS de la RAM 2 mov regdirom2,OAOOH ;indicador inicial del CS de la ROM 2

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ;* INICIALIZACION DEL 8255 * ;* PUERTO PARALELO DE ENTRADNSALIDA * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ,

mov dx,pcont55 ;Configuramos el Ro Paralelo inicialmente mov al,pconfíg55 ;para que tenga todos los puertos de entrada out &al

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ;* INICIALIZACION DEL 8279 * ;* CONTROLADOR DEL TECLADO *

set79: INT 67H ;Intermpion por software que limpia los . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

;displays mov dx,CWord79 ;Ponemos en DX, la palabra de control, A0 = 1 mov al,OOOlOOlOb ;Keyboard/Displays Mode set

;8 8bit character display, right entry ;Encoded Scan Keyboard N-Key-Rollover

out &,al mov al,OO11111 l b ;Se programa el reloj, dividiendo la frecuencia

out &,al ;del reloj entre 3 1, eso es 258KHz

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

;* INICIALIZACION DEL 8250 * ;* PUERTO SERIAL DE ENTRADNSALIDA * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

rnov &,OH mov ah,OOH ;Inicializamos el Puerto Serie con mov al,10100011b ; DX = O

; 101 o1 O 11 ; 24OObaudios Odd Parity 1 bit de paro 8bits carac.

INT 14H mov dx,D8250RXD ;limpiamos el registro RX, por si el reset no lo in al,& ;ha hecho mov &,D8250ER ;Habilitamos la interrupcion de Rx en el 8250

mov al,OO000001b ;para que responda el 8250 en Rx por interrupcion

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . , ;* Procedimientos del Programa *

Progoper proc Near ;Programa operativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

mov ax,cs mov es,ax mov dx,OFFSET@rogopermens) INT 69H mov ah, 10h ;delay call intr4b

Oper: INT 67H ;clear display mov ax,cs ;apuntar a memoria ROM para desplegar los mensajes mov es,= mov dx,OFFSET(UnidadMens) INT 69H mov d,2h ;seleccionar display #2 mov dx,OFFSET(BuEerTec);leer caracteres INT 16H ;revisar caracteres de control cmp ah,Oh ;ENTER

;revisar si se selecciono h c i o n v lida mov si,OFFSET(Buf€erTec) mov di,OFFSET(RevMens) call cmpcad jnz Verrevisar jmp revisar ;procedimiento revisar

mov di,OFFSET(EditMens) call cmpcad jnz Vereditar jmp editar ;procedimiento editar

rnov di,OFFSET(EjecMens) call cmpcad jnz Verejecutar jmp ejecutar ;procedimento ejecutar

mov di,OFFSET(TxMens) call cmpcad jnz Vertrans jmp Transmision ;procedimiento transmision

mov di,OFFSET(PrintMens) call cmpcad jnz Verotro jmp Impresion ;procedimiento impresion

;en otro caso ERROR mov dx,OFFSET(ErrorOperMens) CALL ALARMA INT 69H jmp oper

j e oper

Verrevisar:

Vereditar:

Verejecutar:

Vertrans:

Verotro:

ProgOperMens db ' * MS-80188 1992 * $' UnidadMens db 'C-$' RevMens db 'REV$' EditMens db 'EDIT$' EjecMens db 'EJEC$' TxMens db 'TRANS$' PrintMens db 'IMPS' ErrorOperMens db ' ERROR $' ProgOper endp

;Procedimiento para transmisign de un bloque en memoria ;( 1) SRAM 6 (2) EPROM de usuario, solo introduciendo la ;opcign de la memoria deseada y el OFFSET inicial y final ; DirDi Offset Inicial ; DirSi Offset Final

Transmision proc near rnov q c s mov es,= mov dx,OFFSET(TransMens) ;pone en display el mensaje "TRANSMIT" INT 69H mov ah, 10H call intr4b

INT 67H mov ax,cs mov es,= mov dx,OFFSET(SaltoCortoMens) INT 69H mov dx,OFFSET(opcionMens) INT 69H mov al,7h mov dx,OFFSET@uffermem) INT 16H cmp al,'l' j e TxRam2 cmp al,'2' j e TxRom2 CALL ALARMA mov dx,offset(ErrorQerMens) INT 69H jmp pretx

mov qRegDiRam2 mov ImpCs,ax jmp iniciotx

mov ax,RegDiRom2 mov ImpCS,ax

mov ax,cs mov es,= mov dx,OFFSET(InicialDirMens) ;pedimos el OFFSET del inicio de la INT 69H ;impresion mov d,4h mov dx,OFFSET(ASCIIaHEX) INT 16H ;revisar comandos de el programa cmp al,'Q jne contx ;salir a procedimento operativo

PreTx:

TxRam2:

TxROM2:

InicioTx:

jmp oper ConTx:

cmp ah,4h

j e contxini mov dx,OFFSET(ErrorlMens) CALL ALARMA INT 69H jmp iniciotx

call FASCIIaHEX j z seguirtx mov dx,OFFSET(ValidosMens) INT 69H jmp iniciotx

mov DirD1,ax

rnov dx,OFFSET(FinalDirMens) ;pedimos el OFFSET del final de la INT 69H jmpresion mov d,4h mov dx,OFFSET(ASCIIaHEX) INT 16H ;revisar comandos del programa cmp d,'Q ;salir a procedimiento operativo jne alinitx

ContxIni:

SeguirTx:

FinalTx:

jmp oper AIIniTx:

cmp ah,4h j e contxfinal mov dx,OFFSET(ErrorlMens) CALL ALARMA INT 69H jmp finaltx

call FASCIIaHEX j z prosiguetx mov dx,OFFSET(ValidosMens) INT 69H jmp finaltx

mov DirSi,ax cmp DirDi,ax ;comparamos las direcciones iniciales dadas jbe iniciatx ;por el usuario CALL ALARMA jmp iniciotx

INT 62H ;transmitir mensaje

ConTxFinal:

ProsigueTx:

IniciaTx:

jmp oper

TransMens db ' * TRANSMISION PORPUERTO SERIE $' RecepcionMens db' * RECIBIENDO$' NoTransMens db ' TRANSMISION NO REALIZADA $' mewjeTx db 'UNIVERSIDAD AUTONOMA METROF'OLITANA - IZTAPALAPA'

db ' PROYECTO DE INGENIERIA ELECTRONICA I' db' SISTEMA BIOS ' db ' UNIDAD DE EJECUCION' db 'DESARROLLADO POR:'

db' - ERNESTO GONZALEZ NENA ' db - RICARDO MARTINEZ ' db' - SILVERIO LEON db ' MEXICO 20 DE MAYO DE 1992$'

Transmision endp

Editar proc Near mov inserdlag,Oh ;colocar la tecla INS mov ax,cs mov es,= ;apuntar a memoria ROM para desp. los mensajes mov dx,OFFSET(EditarMens) ;desplegar mensaje de presentacion INT 69H mov ah,15h ;delay call intr4b

mov ax,cs mov es,= mov dx,OFFSET(saltoipMens) ;pedx direc. de inicio de programa INT 69H mov al,4h ;display #4, leer 4 caracteres mov dx,OFFSET(ASCIIaHEX) INT 16H ;revisar los comandos del programa cmp al,'Q ;salir de la edicion jne volver

otradirec:

jmp oper ;programa operativo volver:

;revisar que se hayan presionado 4 teclas cmp ah,4h j e revvalidos mov dx,OF'FSET(EmorlMens) CALL ALARMA INT 69H jmp otradirec

call FASCIIaHEX ;convertir el numero leido de teclado j z revRango ;de codigo ASCII a codigo Hexadecimal mov dx,OFFSET(ValidosMen) CALL ALARMA INT 69H jmp otraDirec

mov c1,04H mov Ayuda-Direc,ax ;verificamos si el rango inferiror es el mov dx,regdiram2 ;el correcto para poder iniciar la edicion rol dx,cl add ax,& cmp ax,8000H jge RevRangSup mov dx,OFFSET(ErrRangInfMens) CALL ALARMA INT 69H jmp otradirec

revValidos:

revRango:

revRangSup:

cmp ax,SFFFH ;verificar rango superior J% EmpEdit cmp indtammem,OlH je Bloque32

mov dx,OFFSET(ErrRangSupMens2) CALL ALARMA INT 69H jmp otradirec

mov dx,OFFSET(ErrRangSupMens 1) CALL ALARMA INT 69H jmp otradirec

INT 67H ;clear display mov ptractualedit,ax ;guardar apuntador a inicio de la direccion

mov ah,4h ;escribir en disp. ##4: '-' mov al,'-' CALL INTR4a mov cx,4h ;desplegar 4 digitos de direccion mov posdisplay,Oh ;selec. disp. #o mov ax,ptractualedit ;convertir reg 'ax' a cod. ASCII

mov bx,OFFSET(HEXaASCII)

mov ah,posdisplay mov al, [bx] CALL INTR4a inc bx inc posdisplay loop desmrec mov posdisplay,5h ;selec. disp. #5 mov bx,ayuda-direc ;apuntar a Memoria RAM mov ax,regdiram2 mov es,ax mov ah,es:[bx] ;leer contenido de la memoria call FHEXaASCII mov bx,OFFSET(HEXaASCII) mov cx,2h ;desplegar 2 caracteres

mov ah,posdisplay mov al, [bx] CALL INTR4a inc bx inc posdisplay loop despCont mov ah, 10H ;delay call intr4b mov dx,OFFSET(ASCIIaHEX) ;leer 2 caracteres mov al,5h ;selec. disp #5 INT 16H

bloque64:

bloque32:

empEdit:

otrodat:

call FHEXaASCII ;guardar en la var. HEXaASCII

despchrec:

despcont:

;revisar los caracteres de control cmp al,'@' ;insertar linea (tecla INS) jne inverotro jmp insertarlinea

cmp allmh' ;flecha arriba jne otramover jmp moverlinea

cmp al,',' ;flecha abajo jne interoper jmp moverlinea

;revisar comandos especiales cmp al,'Q ;salir de la edicion jne buscaotradirec

inverotro:

otramover:

interoper:

jmp oper buscaotradirec:

cmp al,'J' ;saltar a otra direccion jne revcant jmp otradirec

;revisar que sean validos cmp ah,2h ;se presionaron 2 caracteres? je revcontval mov ax,cs mov es,ax mov dx,OFFSET(Error2Mens) CALL ALARMA INT 69H jmp otrodat

call FASCIIaHEX ;conv. el num. tec. a cod. HEX jz guardarDato mov ax,cs mov es,ax mov dx,OFFSET(ValidosMens) CALL ALARMA INT 69H jmp otrodat

;apuntar a Memoria RAM mov bx,regdiram2 mov es,bx mov bx,ayuda-direc mov es: [bx],ah ;guardar en memoria dato tecleado

mov ah, 10H call intr4b inc Ayuda-Direc rnov c1,04H mov ax,AyudaDirec mov dx,RegDiRam2 rol dx,cl

revcant:

revContVal:

guardarDato:

NoInsert:

add ax,& inc ptractualedit ;verificar el limite maxim0 8FFFH cmp -8FFFH jne receso mov ax,cs mov es,= mov dx,OFFSET(FullMens) CALL ALARMA INT 69H dec ptractualedit jmp otrodat

jmp otrodat receso:

EditarMens db ' * EDITOR DE PROGRAMAS S' DirecMens db ' DJR--S' ErrorlMens db ' ERROR 4 DIG S' ValidosMens db ' NUM VALIDOS-O-F S' ErrRangIMens db ' ERROR MIN 8000 $' ErrRangSupMensl db ' ERROR MENOR A 8FFF $' ErrRangSupMens2 db ' ERROR MENOR A 1 lFFF $' Error2Mens db ' ERROR 2 DIG $' FullMens db ' MEMORIALLENA $' InsMens db' INS $' NoInsMens db ' NO INS S'

Editar endp

InsertarLinea proc Near mov ah, 10H c a l l intr4b mov ax,cs mov es,= ;apuntar a memoria ROM para desp. los mensajes mov aljnsertflag cmp al, 1 h j e modoINS mov insertflag, 1 h ;NO INS mov dx,OFFSET(NoInsMens) INT 69H jmp otrodat

mov insertflagoh ;INS mov dx,OFFSET(InsMens) INT 69H jmp otrodat

modoINS:

InsertarLinea endp

Moverlinea proc Near push ax mov ah, 10H c a l l intr4b POP ax cmp al,'A' ;flecha arriba j e arriba

;en otro caso desplazar hacia abajo mov bx,ptractualedit cmp bx,8FFFH jge otroedi inc Ayuda-Direc ;incrementamos los apuntadores mov c1,04H ;de la direccion de edicion mov ax,AyudaDirec mov hRegDiRam2 rol dx,cl add ax,dx mov ptractualedit,ax ;procedimiento editar jmp otrodat

mov bx,ptractualedit cmp bx,8000H

dec Ayuda-Direc ;decrementamos los apuntadores mov c1,04H ;de la direccion de edicion mov ax,AyudaDirec mov dx,RegDiRam2 rol dx,cl add ax,dx

mov ptractualedit,ax ;procedimiento editar

jmp otrodat

arriba:

Jk O b o e d i

0trOedi:

Moverlinea endp

Impresion proc Near mov ax,cs mov es,ax mov dx,OFFSET(ImprimirMens) INT 69H INT 67H mov dx,OFFSET(saltocortoMens) INT 69H mov dx,OFFSET(opcionMens) INT 69H mov d,7h mov dx,OFFSET(bufFermem) INT 16H cmp al,'l' j e ImpRAM2 cmp al,'2' j e ImpROM2 CALL ALARMA jmp impresion

mov ax,RegDiRam2 mov ImpCs,ax jmp pedirinicio

mov ax,RegDiRom2 mov ImpCS,ax

impRam2:

impROM2:

pedirInicio:

mov a x p mov es,=

mov dx,OFFSET(InicialDirMens) ;pedimos el OFFSET del inicio de la INT 69H ;impresion mov al,4h mov dx,OFFSET(ASCIIaI-IEX) INT 16H ;revisar comandos de el programa cmp al,'Q jne alco ;salir a procedimento operativo jmp oper

ala: cmp ah,4h j e continicio mov dx,OFFSET(ErrorlMens) CALL ALARMA INT 69H jmp pedirinicio

call FASCIIaHEX j z seguir mov dx,OFFSET(ValidosMen) INT 69H jmp pedirinicio

mov DirD1,ax

mov dx,OFFSET(FinalDirMens) ;pedimos el OFFSET del final de la INT 69H jmpresion mov d,4h mov dx,OFFSET(ASCIIaHEX) INT 16H ;revisar comandos del programa cmp al,'Q ;salir a procedimiento operativo jne alinicio

continicio:

seguir:

pednfínal:

jmp oper alinicio:

cmp ah,4h j e conttinal mov dx,OFFSET(ErrorlMens) CALL ALARMA INT 69H jmp pedirfinal

c a l l FASCIIaHEX j z continuacion mov dx,OFFSET(ValidosMens) INT 69H jmp pedirfinal

mov DirSi,ax cmp DirDi,ax ;comparamos las direcciones iniciales dadas be iniciacommandos ;por el usuario CALL ALARMA

conttinal:

continuacion:

jmp pedirinicio iniciaCommandos:

mov dx,Palarma55 mov al,OH out &al mov contintl7,OH mov continterno,OH mov dx,OH mov ah,OlH INT 17H

mov ax,ImpCS mov es,ax Call EsImpresora

mov PrintBifOH

comenzarImp:

revInicioImp:

;inicializamos la impresora

;Se inicia la impresion colocando el bit ;de senalizacion(PrintBit) que es el ;que nos indica si imprimio el caracter

mov bx,DirDi

mov ah,es: [bx] call FHexaAscii mov bx,OFFSET(HexaAscii) rnov &OH mov cx,O2H

mov al, [bx] mov ah,OH INT 17H call espera inc bx loop alaimpresora

and a h , O F H cmp ah,OlH j e contimp mov c1,OH

mov ah,02H mov &OH INT 17H and ah,OFH cmp ah,OlH j e contimp mov a h , O F H call intr4b inc cl cmp c1,02H j e printerror jmp estimp

mov dx,OH mov &,OH mov al,' '

inicioImpresion:

alaImpresora:

revEstImp:

estImp:

contI mp:

INT 17H inc continterno cmp continterno,OFH J& externoint c a l l espera mov al,ODH INT 17H c a l l espera mov a l , O A H INT 17H c a l l espera mov al,ODH INT 17H C a l l EsImpresora mov continterno,OH

inc DirDi mov bx,DirDi cmp bx,DirSi j e Adios jmp RevInicioImp

mov ax,cs mov es,ax INT 67H mov dx,OFFSET(ErrorImp) INT 69H

externoInt:

prinmrror:

adios: jmp oper

ImprimirMens db' * IMPRESION $' InicialDirMens db ' INICIAL OFF--$' FinalDirMens db FINAL OFF--$' ErrorImp db' ERROREN IMPRESORA S' ImpMens db ' IMPRESION$'

Impresion endp

Espera proc Near push cx mov cx,OlH POP cx ret

Espera endp

EsImpresora proc Near CALL SAVE mov ax,cs mov es,= INT 67H mov dx,OFFSET(ImpMens) INT 69H CALL RESTOR ret

EsImpresora endp

Revisar proc Near mov q c s mov es,= mov dx,OFFSET(RevisarMens) ;se da los numeros asignados a las memorias INT 69H ;de las cuales se quiere informacion

; s e pide opcion de la memoria a ver

;leer caracteres

selecMem: mov =,cs mov es,= mov dx,OFFSET(OpcionMens) INT 69H mov dx,OFFSET(ASCIIaHEX) mov al,7h ;disp. #7 INT 16H ;revisar caracteres de control cmp al,'Q ;salir jne alinic jmp oper

alrnic: cmp al,'l' j e re-rdir cmp al,'2' j e revpedxdir cmp al,'3' j e revpedirdir cmp al,'4' j e req.xArdir CALL ALARMA jmp selecmem

cmp al,'l' j e esRAM cmp al,'3' j e esRAM

re-rdir:

;en otro caso es ROM #1 o ROM #2

cmp al,'2' j e esROMl mov tipomem,V' ; guardamos el valor de la memoria utilizada mov qregdirom2 ; para la revision, ademas colocamos en la mov segaux,ax ; variable 'segaux' el valor del CS de la jmp contirev ; memoria referida. Esto se hace desde

mov tipomem,'2' mov segaux,cs jmp contirev

cmp al,'l' j z esRAMl mov tipomem,3' mov qregdiram2 mov segaux,ax jmp contirev

esROM:

esROM 1 : . *** A Q U ***

esRAM:

esRAM 1 :

mov tipomem,'l' mov segaw0h ; *** HASTA AQUI *** mov ax,cs ;apuntar memoria ROM para desplegar los mov -,ax ;mensajes INT 67H mov dx,OFFSET(SaltoipMens) ;pedir OFFSET de inicio de programa INT 69H mov al,4h ;display #M, leer 4 caracteres mov dx,OFFSET(ASCIIaHEX) INT 16H ;revisar los comandos del programa cmp al,'Q ;salir de la edicion jne alini ;salto a programa operativo

contirev:

jmp oper alIni:

;revisar que se hayan presionado 4 teclas cmp ah,4h j e teclas4bien mov dx,OFFSET(ErrorlMens) CALL ALARMA INT 69H jmp contirev

call FASCIIaHEX j z TeclasOFbien mov dx,OFFSET(ValidosMens) CALL ALARMA INT 69H jmp contirev

INT 67H ;clear display mov ptractualedit,ax ;OFFSET en ptractualedit mov ah,4h ;selec. disp. #4 mov al,'-' CALL INTR4a

mov cx,4h ;desplegar 4 dig. que indican la direccion mov posdisplay,Oh ;disp #O mov ax,ptractualedit ;conv. reg. 'ax' a cod. ASCII c a l l FHEXaASCII mov bx,OFFSET(HEXaASCII)

mov ah,posdisplay mov al , [bx] CALL INTR4a inc bx inc posdisplay loop despcllrrev mov qsegaux ;colocamos el valor del registro segmentado rnov es,= ;para direccionar a la memoria mov posdisplay,5h ;disp. #5 rnov bx,ptractualedit mov &es: [bx] ;leer contenido de memoria

taladbien:

teclas0Fbien:

inicdespliegue:

despdirrev:

call FHEXaASCII mov bx,OFFSET(HEXaASCII) mov cx,2h ;desp. 2 caract.

mov ah,posdisplay mov alJbx] CALL INTR4a inc bx inc posdisplay loop despcontrev

call intr60 jnz revtecrev ;revisar los caracteres de control cmp al,'"' ;flecha arriba j e moverarriba cmp al,',' ;flecha abajo j e moverabajo cmp al,'Q ;salir jne interno

despoontrev:

revtecrev:

jmp oper interno:

cmp al,'J' ;saltar a otra direccion jne conti jmp contirev

cmp al,'O' ;seleccionar otra memoria jne VerSelecMem jmp SelecMem

jmp revtecrev

mov ah,SH call intr4b inc ptractualedit ;incrementamos la direccion jmp reintentar

mov ah,SH call intr4b dec ptractualedit ;decrementamos la direccion

mov ah,SH call intr4b ;delay jmp inicdespliegue

conti:

verSelecMem:

moverabajo:

moverarriba:

reintentar:

RevisarMens db ' * REVISAR MEMORIA 1-PRIMERA RAM 2-PRIMERA ROM 3- SEGUNDA RAM'

db ' 4-SEGUNDA ROM $' opcionMens db 'OPCION--$'

Revisar endp

Ejecutar proc Near mov ax,cs mov es,= ;apuntar a memoria ROM mov dx,OFFSET(saltoMens) INT 69H rnov dx,OFFSET(bu€€ertec)

mov d,7h ;selec disp #7 INT 16H ;revisar los comandos del programa cmp d,'Q j e intern cmp al,'s' j e saltolargo cmp al,'N' j e saltocorto CALL ALARMA jmp leersalto

mov bx,OFFSET(saltoLC) ;programas de la memoria ROM mov [bx+2],cs jmp pedirOFFSET

mov dx,OFFSET(saltocortoMens) INT 69H mov dx,OFFSET(opcionMens) INT 69H mov d,7h mov dx,OFFSET(bu€€ermem) INT 16H cmp d,'l' j e SRAM2 cmp d,'2' j e sROM2 cmp d,'Q je intern CALL ALARMA jmp saltocorto

leersalto:

saltolargo:

saltocorto:

intern:

s R A M 2 : jmp oper

mov bx,OFFSET(saltoLC) mov ax,regdiram2 mov [bx+2],ax jmp pedirOFFSET

mov bx,OFFSET(saltoLC) mov ax,regdirom2 mov [bx+2] ,ax

rnov dx,OFFSET(saltoipMens) INT 69H mov d,4h ;disp. #4 mov dx,OF'FSET(ASCIIaHEX)

sROM2:

pedirOFFSET:

INT 16H ;revisar comandos del programa cmp al,'Q ;salir j e inter ;revisar que se hayan presionado 4 teclas cmp ah,4h j e rewalsal mov dx,OFFSET(ErrorlMens) CALL ALARMA INT 69H jmp ~ ~ ~ I ~ O F F S E T

inter:

rewalsal: jmp oper

call FASCIIaHEX jz saltar mov dx,OFFSET(ValidosMens) CALL ALARMA INT 69H jmp pedirOFFSET

mov bx,OFFSET(saltoLC) mov [bx],ax ;guardar offset jmp saltoLC ;saltar al programa

saltar:

SaltoMens db ' * SALTO LARGO SI-NO-$' saltoipMens db ' DIR OFF--$' SaltocortoMens db ' 1-SEGUNDA RAM 2-SEGUNDA ROM $'

ejecutar endp

cmpcad procNear ;compara 2 cadenas terminadas en '$, ;ENTRADA: DS:[SI] : cadena de caracteres a comparar con: ; ES:[DI] ;SALIDA: devuelve la bandera ZR si la cadenas son iguales

push si push di push ax ;cld: DFQ :incrementar los apuntadores (S1,DI) ;ad: DF<-1 :decrementar los apuntadores (S1,DI) cld mov ah,Oh ;colocar la bandera NZ sahf

mov al,[si] cmp al,'$' ;es fin de cadena? j e fincadFuente cmpsb jz compara ;en otro caso no son iguales

mov &,Oh ;colocar la bandera NZ sahf

compara:

NZcomp:

jmp finCmpCad

mov al,es:[di] cmp al,'$' ;fin de cadena de la fuente? jne NZcomp ;en otro caso l a s cadenas son iguales mov ah,40h ;colocar la bandera ZR sahf

finCmpCad: POP

finCadFuente:

POP di POP si ret

cmpcad endp

SAVE: mov axtemp,ax ;salva ax POP ax ;saca direc de retorno mov stack 1 ,ax ;salva direc de retorno mov ax,axtemp ;salva estado del proceso push ax push bx push cx push dx Push bP push si push di push ds push es mov ax,stackl ;devuelve direc de retorno push ax ;guarda direc de subrutina mov ax,axtemp ret

RESTOR: pop ax ;saca direc de ret de subrutina mov stack1,ax ;salva direc de ret de subrutina POP es ;restablece estado del proceso POP ds POP di POP si POP bP POP dx

POP bx POP cx

POP ax mov axtemp,ax ;salva ax mov ax,stackl ;restablece direc de ret de subrutina push ax ;guarda direc de ret de subrutina mov ax,axtemp ;restablece ax ret

; INTERRUPCION 67H ; CLEAR DISPLAY

;Pone en blanco los displays utilizados en el MS-80188

EVEN INTR67: call save ;rutina para salvar estado del procesador

mov dx,CWord79 ;S279 palabra de control AO=1 mov al, 1101 1 lOOb ;clear display todos unos out &al

in al,& ;leer estado rol al, 1 ;bit 'DU' al carry

wait79:

J% Wait79 ;esperar si el display ;no esta habilitado

mov ptrdisplay,Oh ;apuntar al LSD CALL restor ;restaura estado del microprocesador iret ;retorno de la intermpcion

; INTERRUF'CION 69H ; Escribir Cadena de Caraters Terminados en 'S'

9

;ENTRADA dx :apunta al inicio de la cadena ; es :es el segmento y 'dx' es el offset del

;SALIDA despliegue en display del 8279 mensaje

;despliega maxim0 8 caracteres, si la cadena ;tiene mas de 8 caracteres el programa se encarga ;de generar un retardo para luego desplegar los ;restantes

EVEN

mensaje a desplegar

,

INTR69: call save ;guarda reg. del procesador

repintr69: mov d x p t r , d x ;guardar apuntador a la cadena

mov k c w o r d 7 9 ;S279 palabra de control AO=1 mov al,100100OOb ;write display RAM (autoincremento)

mov dx,Dword79 ;S279 datos AO=O mov cx,8h ;desplegar hasta 8 caracteres rnov di,dxptr ;apuntar al inicio del mensaje

cmp al,'$' jz finintr69 ;transformar el codigo ASCII del caracter ;a codigo siete segmentos

inc di ;apuntar sig caracter loop desp mov al,es:[di] cmp al,'$' jz fiNntr69 mov ah, 12H ;retardo que simula el desplazamiento call intr4b ;delay( Is) inc dxptr

out &,al ;display menos significativo

desp : mov al,es:[di] ;leer caracter

out &,al ;mostrar caracter en display

jmp repintr69

call restor iret

finintr69:

;INTERRUPCION 4a: escribir un caracter en el display

;ENTRADA ah: seleccionar numero de display [validos 0-71

;SALIDA ninguna

9

al: caracter a desplegar, en codigo ASCII

EVEN INTR4a: call save

mov bx,ax ;respaldar atributo de la intermpcion mov &,Cword79 ;8279 palabra de control AO=1 and ah, 100001 1 lb ;write display RAM (No autoinc) or ah, 1OOOOOOOb mov al,& out &,al mov al,bl mov dx,Dword79 ;a279 datos AO=O out &,al ;desplegar caracter en display call restor ret

;funcion ASCIIaHEX ;finaliza la conversion cuando de encuentra un 'S' en la cadena ;caracteres validos O - F ;los caracteres a convertir deben encontrarse en la var: , ASCIIaHEX db MSB,?,?,LSB,$ ;se regresa la bandera ZR si se convirtio exitosamente y en 'ax' el numero ;hexadecimal equivalente. En otro caso se devuelve la bandera NZ no se ;modifica ningun registro. ;se asume que 'ds' apunta a memoria RAM (ds<-40h)

FASCIIaHEX proc NEAR call save cld ;DF<-O bandera de direccion en incremento mov ax,OFFSET(ASCIIaHEX) mov si,= mov ax& mov es,= mov di,si

lodsb ;leer caracter ASCII cmp al,'$' ;revisar si se llego a fin de cadena je hexaRegistroAX cmp al,'9' jg esletra cmp al,'O' jb errorNZ sub al,30h stosb ; g u a r d a r codigo hem de caracter

otrocarac:

jmp otrocarac

cmp al,’F’ jg errorNZ sub al,37h stosb jmp otrocarac

mov ah,Oh ;colocar la bandera NZ sahf call restor ret

call FHExaREGax mov axFASCIIaHEX,ax mov ah,40h ;colocar la bandera ZR sahf call restor mov ax,axFASCIIaHEX ret

FASCIIaHEX endp

esletra:

errorNZ:

hexAregistroAX:

FHEXaREGax proc Near ;devuelve en ax el numero hem equivalente que se encuentra en ;la variable ASCIIaHEX

push bx push cx mov bx,OFFSET(ASCIIaHEX) mov ah, [bx] ;caracter mas significativo mov c1,4h ;rotar a la izq. 4 veces sal ah,cl inc bx add ah, @x] ;segundo caracter mas significativo inc bx rnov al, [bx] ;tercer caracter mas significativo sal al,cl inc bx add al, @x] ;caracter menos sigrufiicativo POP cx POP bx ret

FHEXaREGax endp

;INTE~UPCION 4b,GENEFWR UN RETARDO - DELAY ;estructura para generar el retardo: ; para (ah=dat,hasta ah*) hacer ; { ; para (cx=f€fth,hasta cx=O) hacer

; ah=ah-1 ; I ;donde se recibe en ‘ah’ en numero de veces que ;se repide el segundo loop

CX%X- 1

EVEN INTR4B: call save

mov al,& xor ah,&

rte2: mov cx,Of€Eh rte 1 : loop rte 1

dec al jnz rte2 call restor ret

; INTERRUPCION 16H ; Lectura de Caracteres con ECO

;ENTRADA al :especifica el numero de display para el cursor [validos 0-71 ; dx :apunta a la variable donde se guardan los datos ;SALIDA al :ultimo caracter tecleado [alfanumerico o de control] ; ah :numero de caracteres tecleados

EVEN INTR16:

call save call procLef€Entry ;configurar el 8279 para entrada por la izq. and al,ooo0011 lb ;configurar numero de display ;inicializar apuntadores mov ptrdisplay,al mov inicptrdisp,al mov finptrdisp,al xor &,ah mov numcaracteqah mov llegodisp7,ah mov bx,dx ;apuntar a la var. donde se guardaran los datos

call cursor cmp al,'$' ;ENTER j z medio mov ulcaractec,al ;revisar primero los caracteres de control cmp al,'&' ;Del Line j e medio cmp al,'<' ;flecha izq. <-- j e movercursor cmp al,'@ ;INS j e finintr4c cmp a l , l h ' ;flecha arriba

j e finintr4c cmp al,'>' ;flecha der. --> j e movercursor cmp al,',' ;flecha abajo j e finintr4c ;en otro caso es un caracter alfanumerico

LeerCarac:

Medio:

mov ah,ptrdisplay ;desplegar caracter CALL INTR4a mov @x],al ;guardar carac. alfanumerico cmp ah,7h jne incapuntadores mov al,'$' mov bx+l],al mov alJlegodisp7 cmp al,Oh jne leercarac inc numcaractec mov llegodisp7,l h jmp leercarac

inc ptrdisplay ;actualizar # de display inc bx ; " apuntador de datos mov ah,finptrdisp mov al,ptrdisplay cmp ah,d jge leercarac ;en otro caso es caracter nuevo mov al,'$' ;fin de cadena mov @x],al inc finptrdisp inc numcaractec jmp leercarac

cmp al,'<' ;cursor izq jnz escursorder mov ah,ptrdisplay mov al,inicptrdisp cmp ah,al j g moverizq jmp leercarac

dec bx ;act. apuntador de datos tecleados dec ptrdisplay jmp leercarac

mov ah,finptrdisp mov al,ptrdisplay cmp &,al j g moverder jmp leercarac

moverder: inc bx inc ptrdisplay jmp leercarac

c a l l restor mov al,ulcaractec mov ah,numcaractec iret

incApuntadores:

movercursor:

moverizq:

escursorder:

finintr4c:

ProcLeftEntry proc Near push dx push ax mov dx,Cword79 ;AO=l 8 8-bit character display-left entry mov al,00000010b ;Encoded Scan Keyboard N Key Rollover out &al POP ax POP dx ret

ProckfEntry endp

FHEXaASCII proc Near ;transforma el numero Hexadecimal de "ax" ;a codigo ASCII (4 bytes + fin de cadena) ;se guarda la conversion en la var: HEXaASCII db MSB,?,?,LSB,$

call save mov bx,OFFSET(HEXaASCII) mov axtempHA,ax mov cx,2h

otraVezHEXaASCI1: push cx andah,11110000b mov c1,4h ;rotar a la der. 4 veces shr ah,cl cmp ah,9h jg HexesLetra ;en otro caso es un numero entre: O - 9 add ah,30h mov [bx],ah inc bx jmp conAH4bitBajos

add ah,37h mov [bx],ah inc bx ;convertir los 4 bits mas bajos de 'ah'

mov ax,axtempHA and ah,OOOO111 lb cmp ah,9h jg Hexesletra2 ;en otro caso es un numero entre: 0-9 add ah,30h mov [bx],ah inc bx jmp convAL

Hexesletra2: add ah,37h mov [bx],ah inc bx ;convertir 'al' a codigo ASCII

Hexesletra:

ConAH4bitBajos:

ConvAL:

mov ax,axtempHA mov &,al mov axtempHA,ax POP cx loop otravezHEXaASCI1 mov al,'$' mov [bx],al ;fin de cadena call restor ret

FHEXaASCII endp

;procedimiento CURSOR ;en AL regresa el caracter tecleado en &go ASCII ;[enter/carac. de control y caracteres alfanumericos] Cursor proc NEAR

push dx

mov al,ptrdisplay and al,O110011 lb ;instruction de lectura RAM disp or d,O1 lOOOOOb mov dx,Cword79 ;AO=l out d x , a l

mov dx,dword79 ;A04 leer caracter del display in al,& mov caracter,al ; g u a r d a r caracter en memoria

repcursor:

mov al,ptrdisplay and al,OOOOOl 1 lb or al, lOOOOOOOb mov dx,Cword79 out d x , a l

mov dx,Dword79 mov al,caracter cmp a l , O f f h jz outblanco mov al,' ' jmp contcaract

mov al,'-'

out d x , a l

mov ah,4h call intr4b mov al,caracter out %al mov &,4h call intr4b call intr60 jnz repcursor POP dx mov al,digit ret

Cursor endp

outblanco:

contcaract:

;instruction de escritura de RAM disp

;AO=1

;A04

;espacio en blanco

;Cursor

;Delay

;Delay ;Leemos lo que contiene el 8279

; IN'IERRUPCION 60 ; LEER TECLADO , ;ENTRADA ninguna ;SALIDA devuelve la bandera ZR si se presiono tecla ; y en 'al' se devuelve el cod. ASCII de la tecla ; presionada

EVEN IN"R60: mov spaux,sp

call save mov dx,CWORD79 ;AO=18279 in a l , d x ;leer estatus (numero de caracteres FIFO) and al,OOOOO11 lb ;encontrar numero de carac tecleados jz banderaNZ ;salir si no se presiono tecla mov al,O101111 lb ;instr. de lectura (FIFO) del 8279 out d x , a l

mov dx,Dword79 ; A 0 4 lectura del teclado in a l , d x

call FTECaASCII mov digit,al ;guardar ultima tecla presionada en codigo ASCII ;dejar la bandera ZR puesta mov ah,40h sahf jmp salintr60

mov &,Oh sahf

call restor mov al,digit ret ;retorno de la intermpcion

banderaNZ:

salintr60:

;recibe en 'al' el caracter a convertir de codigo ;se regresa en 'al' el codigo ASCII de la tecla ;'&'se le asigna el valor de Oh FI'ECaASCII proc NEAR

push bx mov bx,DTECal6SEG ;apuntar la tabla de conversion con bx mov ah,Oh add bx,ax mov al,cs:px] ;al<- cod ASCII de la tecla presionada POP bx ret

FTECaASCII endp

; INTOOH ;intermpcion division por cero ;RETORNO CIEGO (Con desabilitacion de interrupciones)

EVEN

IntrOO: push ax push dx mov a x , O F F F F H pop POP ax iret

; INT01H ;intempcion por Single Step ;RETORNO CIEGO (Con desabilitacion de interrupciones)

EVEN Intr0 1 :

push ax push dx mov ax,PEOI-int mov &,DE01 out &,al POP dx pop ax iret

; INT02H ;interruption NO ENMASCARABLE ;RETORNO CIEGO (Con desabilitacion de interrupciones)

EVEN Intr02:

iret

; INT03H jnterrupcion por Breakpoint ;RETORNO CIEGO (Con desabilitacion de interrupciones)

EVEN intr03:

push ax push dx mov ax,PEOI-int rnov &,DE01 out &,al POP dx POP ax iret

; INT04H ;interruption por desbordamiento

;salvamos los registros que modificaremos ;dentro del programa de servicio

EVEN intrO4:

push ax push dx push es mov ah,30H add ah,2OH mov ax,cs mov es,= INT 67H mov dx,OFFSET(Error-Memje) INT 69H POP es POP dx POP ax iret

Error-Mensaje db ’ REBASE ARITMETICO $’

; INT06H ;interruption por Opcode Unused ;RETORNO CIEGO (Con desabilitacion de interrupciones)

EVEN intr06:

push ax push dx mov ax,PEOI-int mov &,DE01 out &,al POP dx POP ax iret

; INT07H ;interrupcion por Opcode Unused ;RETORNO CIEGO (Con desabilitacion de interrupciones)

EVEN intrO7:

push ax push dx mov ax,PEOI-int mov &,DE01 out &al POP dx POP ax iret

; INT 12H ;esta intermpcion da prioridad al usuario para colocar ;memorias de expansion en la memoria central, usando los ;MCSO-4 en cuatro bloques de 16K para obtener un bloque ;total de 64K para proposito general, este bloque va de ;10000h a lFFWh ; 10000H- 13FFFH MCSO ; 14000H- 1'7FFFN MCSl ; 18000H- lBFFFH MCS2 ; 1COOOH- lFFFFH MCS3

EVEN intrl2:

push dx push ax mov dx,DMPCS mov ax,PMPCS-ext out &,al mov dx,DMMCS mov ax,PMMCS-ext out &,al mov indtammem,02H mov regdiram2, lOOOH mov regdirom2,1400H POP ax

iret POP dx

EVEN intr3 3 :

CALL SAVE mov ax,cs mov es,= INT 67H cmp IndTamMem,O 1H jne Tam64 mov dx,OFFSET(TamMem32Mens) INT 69H jmp tout

mov dx,OFFSET(TamMem64Mens) INT 69H

Tout : CALL RESTOR iret

Tam64:

TamMem32Mens db ' TAMAW ACTUAL DE MEMORIA CENTRAL ES DE 32 KBYTES $' TamMem64Mens db ' TAMAW ACTUAL DE MEMORIA CENTRAL ES DE 64 KBYTES $'

; INT42H ;Interruption especial para la depuracion de los programas ;donde solo se tiene que con anterioridad haber cargado el ;CS en la variable ResguardoCS y ResguardoSS que estan en ;la direcciones DS:[60H] y DS:[70] respectivamente

EVEN INTR42 :

CALL SAVE mov resguardoAx,ax mov resguardoBx,bx mov resguardoCx,cx mov resguardoDx,dx mov resguardoSi,si mov resguardoDi,di mov resguardoES,es mov resguardoSS,ss mov resguardoDS,ds mov bitresp,OH mov indmens,OH INT 67H mov ax,cs mov es,= rnov dx,OFFSET(RevRegMens) INT 69H mov ah, 1OH call intr4b

RevisarReg: INT 67H mov ax,cs mov es,= mov dx,OFFSET(PedirRegMens) INT 69H

mov al3H mov dx,OFFSET(Buf€erTec) INT 16H cmp &,OH j e RevisarReg ;revisar que registro se desea ver mov si,OFFSET(Buf€erTec) mov di,OFFSET(AxMens) call cmpcad jnz VerBx mov ax,resguardoAx mov RegEnUs0,ax mov indmens,O 1H call VisualReg cmp bitresp, 10H jne EtiqAx jmp salidaint

jmp RevisarReg

VerReg:

EtiqAx:

VerBx:

mov di,OFFSET(BxMens) c a l l cmpcad jnz VerCx mov bx,ResguardoBx mov RegEnUs0,bx mov indmens,02H call VisualReg cmp bitresp, 1 OH jne EtiqBx jmp salidaint

jmp RevisarReg

mov di,OFFSET(CxMens) call cmpcad jnz VerDx mov cx,resguardoCx mov RegEnUs0,cx mov indmens,03H call VisualReg cmp bitresp, 10H jne EtiqCx jmp salidaint

jmp RevisarReg

mov di,OFFSET@xMens) call cmpcad jnz VerSi mov dx,ResguardoDx mov RegEnUs0,dx mov indmens,04H call VisualReg cmp bitresp, 10H jne EtiqDx jmp salidaint

jmp RevisarReg

mov di,OFFSET(SiMens) call cmpcad jnz VerDi mov ax,resguardoSi mov RegEnUs0,ax mov indmens,05H call VisualReg cmp bitresp, 1OH jne EtiqSi jmp salidaint

jmp RevisarReg

mov di,OFFSET@iMens) call cmpcad

EtiqBx:

VerCx:

EtiqCx:

VerDx:

EtiqDx:

VerSi:

EtiqSi:

VerDi:

jnz VerEs mov qresguardoDi mov RegEnUs0,ax mov indmens,MH c a l l VisualReg cmp bitresp, 10H jne EtiqDi jmp salidaint

jmp RevisarReg

mov di,OFFSET(EsMens) call cmpcad jnz VerDs mov ax,resguardoES mov RegEnUs0,ax mov indmens,07H call VisualReg cmp bitresp, 1OH jne Etiqreg jmp salidaint

jmp RevisarReg

mov di,OFFSET@sMens) c a l l cmpcad jnz VerSs mov ax,resguardoDS mov RegEnUs0,ax mov indmens,OSH call VisualReg cmp bitresp, 1 OH j e salidaint jmp RevisarReg

mov di,OFFSET(SsMens) call cmpcad jnz VerSp mov ax,resguardoSS mov RegEnUs0,ax mov indmens,09H c a l l VisualReg cmp bitresp, 10H j e salidaint jmp RevisarReg

mov di,OFFSET(SpMens) c a l l cmpcad jnz VerCs mov ax,resguardoSp mov RegEnUs0,ax mov indmens,OAH c a l l VisualReg cmp bitresp, 10H

EtiqDi:

VerEs:

Etiqreg:

VerDs:

VerSs:

VerSp:

j e salidaint jmp RevisarReg

mov di,OFFSET(CsMens) call cmpcad jnz VerCicloide mov ax,resguardoCS mov RegEhUs0,Ax mov indmens,OBH c a l l VisualReg cmp biuesp, 10H j e salidaint jmp RevisarReg

VerCicloide: call ALARMA jmp RevisarReg

CALL RESTOR iret

VerCs:

SalidaInt:

m e n s db'AX$' BxMens db 'BX$' CxMens db 'CX$' DxMens db 'DX$' SiMens db 'SI$' DiMens db PI$' EsMens db 'ES$' DsMens db IDS$' SsMens db 'SS$' SpMens db 'SP$' CsMens db'CS$' RevRegMens db ' REVISION DE REGISTROS $' PedirRegMens db 'REG.-- $'

VisualRegistro proc Near

VisualReg: CALL SAVE mov ax,cs mov es,= cmp indmens,OlH jne ver02 mov dx,OFFSET(Mensl) jmp ComDesp

cmp indmens,02H jne ver03 mov dx,OFFSET(MensZ) jmp ComDesp

cmp indmens,03H jne ver04 mov dx,OFFSET(Mens3)

Ver02:

Ver03:

jmp ComDesp

cmp indmens,04H jne ver05 mov dx,OFFSET(Mens4) jmp ComDesp

cmp indmens,05H jne ver06 mov dx,OFFSET(MensS) jmp ComDesp

cmp indmens,06H jne ver07 mov dx,OFFSET(Mens6) jmp ComDesp

cmp indmens,07H jne ver08 mov dx,OFFSET(Mens7) jmp ComDesp

cmp indmens,08H jne ver09 mov dx,OFFSET(MensS) jmp ComDesp

cmp indmens,09H jne ver0A mov dx,OFFSET(Mens9) jmp ComDesp

cmp indmens,OAH jne verOB mov dx,OFFSET(MensA) jmp ComDesp

mov dx,OFFSET(MensB)

INT 69H mov cx,04H mov posdisplay,3H mov ax,RegEnUso Call FHEXaASCII mov bx,OFFSET(HEXaASCII)

DesplegarReg: mov ah,posdisplay mov al,Dx] c a l l intr4a inc bx inc posdisplay loop DesplegarReg

RevTecReg: c a l l intr60

Ver04:

Ver05 :

VerO6:

Ver07:

VerO8:

VerO9:

VerOA:

VerOB:

ComDesp:

jnz revtecreg ;revisar fin de ver cmp al,'$' jne regverificar call proseguir CALL RESTOR ret

CALL ALARMA jmp RevTecReg

RegVerificar:

Mens 1 Mens2 Mens3 Mens4 Mens5 Mens6 Mens7 Mens8 Mens9 MensA MensB

db'" $' db 'BX- $' db'CX- S' db 'DX- S' db 'SI- $' db 'DI- $' db 'ES- S' db 'DS- S' db'SS- $' db 'SP- S' db 'CS- $'

VisualRegistro endp

Proseguir proc Near

Interior: CALL SAVE INT 67H nlov dx,OFFSET(CambioMens) INT 69H mov dx,OFFSET(Buf€erTec)

mov d,7H INT IGH ;revisar respuesta del usuario cmp al,'S' je dejarbit crnp al,'N' je moverbit CALL ALARMA jrnp SaltoRev

MoverBit: rnov bitresp, 10H

DejarBit: CALL RESTOR ret

SaltoRev:

CambioMens db 'DESEAS VER OTRO REG.--$'

Proseguir endp

; INT 14 ;Interruption para el uso d e l puerto serie ;en esta interrupcion tenemos:

;DX = O PUERTO A USAR 9

, ; A H = 00 ENTRADA: inicializar puerto , AL = Palabra de los registros internos del 8250

, OOOb = 110 baud , 00lb = 150 baud , OlOb = 300 baud 9 O1 l b = 600 baud , lOOb = 1200 baud , lOlb = 2400 baud

1 lob = 4800 baud , 11 lb = 9600 baud 3 bit 4-3 = Odd Parity, donde: 9 OOb =ninguna , Olb = impar 9 lob = ninguna , l lb =par , bit 2 = Numero de bits de paro, donde: 9 Ob = 1 bit de paro

, bit 1-0 = TamaBo de caracter, donde:

bit 7-5 = Baud rate, donde:

lb = 2 bits de paro

10b = caracter de 7 bits 1 lb = caracter de 8 bits

SALIDA: AH = Estado del LSR 9 AL = Estado del MSR 9

; A H = O 1 ENTRADA: transmitir caracter 9 AL = caracter a enviar , SALIDA: AH = Estado del LSR 5 AL = caracter no cambiado

;AH = 02 ENTRADA: recibir caracter

, SALIDA: AH = Estado del LSR , AL = caracter recibido

,

AL = no importa

, ;AH = 03 ENTRADA. leer estado del puerto , AL = no importa , SALIDA: AH = Estado del LSR

AL = Estado del MSR

EVEN INTR14:

STI push dx push cx

push ax cmp &,OH j e SerieCont POP ax jmp Fuera

mov c1,OH cmp ah,OOH jne Prosigue jmp Inicializar

cmp ah,O 1 H je Enviar cmp ah,02H j e Recibir cmp ah,03H je Status POP ax

POP cx POP dx iret

mov dx,D8250LSR in al,& and a l , O 1 lOOOOOb cmp d , O 1 lOOOOOb j e TxEnviar mov ah, 10H c a l l intr4b inc cl cmp c1,03H je stadoenviar jmp enviar

POP ax mov dx,D8250TXD out &,al push ax jmp bienstadoenviar

mov serialbit,OlH

mov dx,D8250LSR in al,& mov DiscoAL,,al POP ax mov ah,DiscoAl jmp Fuera

mov dx,D8250LSR in al,& cmp al,OO00000lb j e Rxrecibir

SerieCont:

Prosigue:

Fuera:

Enviar:

TxEnviar:

StadoEnviar:

BienStadoEnviar:

Recibir:

mov a h , O F H call intr4b inc cl cmp c1,02H je malestado jmp recibir

mov serialbit,O 1H

rnov dx,D8250LSR in al& mov ah,al rnov dx,D8250RXD in al,& mov statusdigit,ax POP mov ax,statusdigit jmp Fuera

mov dx,D8250LSR in al& mov &,al mov dx,D8250MSR in al,& mov statusdigit,ax POP ax mov ax,statusdigit jmp Fuera

POP ax rnov DISCOAL,al push ax mov al,80H mov dx,D8250LCR out &,al mov al,DISCOAL and al,ll lOOO00b cmp al,OH je AI lObaud cmp al,20H je A15Obaud cmp al,40H je A300baud cmp al,60H je A600baud cmp al,80H je A1200baud cmp al,OAOH je A2400baud cmp al,OCOH je A4800baud cmp al,ODOH je A9600baud jmp A1200baud

" a d o :

RxRecibir:

Status:

Inicializar:

A l lobaud: mov BALNum, 17H mov BAHNum,04H jmp incrustar

mov BALNum,OOH mov BAHNum,03H jmp incrustar

mov BALNum,80H mov BAHNum,OlH jmp incrustar

mov BALNum,OCOH mov BAHNum,OOH jmp incrustar

mov BALNum,60H mov BAHNum,OOH jmp incrustar

mov BALNum,30H mov BAHNum,OOH jmp incrustar

mov BALNum, 18H mov BAHNum,OOH jmp incrustar

mov BALNum,OCH mov BAHNum,OOH

mov al,BALNum mov dx,D8250BAL out d x , a l

mov al,BAHNum mov dx,D8250BAH out &,al mov al,DISCOAL and al,OOO1111 l b mov hD8250LCR out &,al jmp status

A 150baud:

A300baud:

A-ud:

A 12OObaud:

A24OObaud:

A4800baud:

A96OObaud:

Incrustar:

; INT17H ;P~ogramacion para la intermpcion de servicio de la impresora ;donde: , ;DX = O PUERTO A USAR

; A H = O0 ENTRADA : imprimir caracter

; SALDA : AH = estado de la impresora

7

, AL = caracter a imprimir

3

; A H = O1 ENTRADA : inicializar la impresora

; SALIDA : AH = estado de la impresora

; A H = 02 ENTRADA : lectura del estado

; SALIDA : AH = estado de la impresora

, AL = no importa

,

, AL = no importa

, ; A H = 03h - FFh (Reservado)

EVEN INTR17:

Sti

push bx push cx push dx

push ax cmp dx,OH j e correcto ;Verificamos que la impresora sea la correcta POP ax jmp salida

cmp &,OH j e inicio-impresion ; A h = O vamos a imprimir algun caracter cmp ah,OlH j e inicializacion ; A h = 1 inicializamos el 8255 para puente a impresora cmp ah,O2H j e estado ; A h = 2 se desea el estado en que se encuentra la impresora POP ax

Internacion:

correcto:

Salida: POP dx POP cx POP bx iret

Inicializacion: mov al,OH ;Limpiamos el Control primero mov dx,PCont55 ;Direccion del control A0 = 1, Al = 1 out d x , a l

mov cx,OlFFH

loop pausa mov al,10010100b ;inicializamos al puerto A, B y C de modo 1

Pausa: ;esperamos aprox. lms

out d x , a l ;PA = entrada al 8255 y PB = salida del 8255 Estado: ;PC = control del sistema

mov dx,PStatusJS in al& ;el puerto A se encarga de damos el estado de mov &al ;impresora mov statusdigit,ax

POP ax mov bx,statusdigit mov ah,bh jmp salida

Inicio-impresion: mov c1,OH mov dx,PCont55 mov al,00001001b out dx,al

mov al,00001010b out &,al mov al,0000001 l b out d x , a l

rnov dx,PCont55 mov al,00000101b out dx,al

mov dx,PBout55

Impresora:

; D i m i o n de Control del 8255 A0 = 1, A l = 1 ;Ponemos el bit del STROBE en HIGH (PC4)

;Ponemos el bit de INIT en LOW (PC5)

;Ponemos el PC1 en HIGH

;Ponemos el bit de INTR en HIGH (PCO), poniendo (PC2) HIGH

;Direccionamos a el PB en el cual se deian POP ax ;los datos que se van a imprimir out dx,al

push ax mov kPCont55 ;Direccion de Control A0 = 1 ,Al = 1 mov al,00001000b ;Ponemos el STROBE en LOW out d x , a l

mov ah,OlH call intr4b mov al,00001001b ;Ponemos el STROBE en HIGH out d x , a l

rnov al,00000100b ;Ponemos el MTR en LOW out dx,al

rnov al,00OOOOlOb ;Ponemos el PC1 en LOW out d x , a l

jmp estado ;saltar a estado Salir:

; INT09H jntempcion de lectura del tablero por hardware

EVEN INTROB:

push dx push ax push cx

mov dx,DPMR ;Enmascaramos los niveles no utilizados mov ax,PPMR ;y dejamos libres los niveles de las out &,ax ; I N T O e INTl mov &,DINTO ;Colocamos la I N T O de manera que funcione en: mov ax,PINTO ; 1.- Prioridad alta

leer:

; 2.- Modo Edge-Triggered ; 3 .- Modo no mascarable y directo ; 4.- Modo Fully Nested

out &,ax mov &DE01 ;Desabilitamos la intermpcion INT 12H mov al,PEOI-into ;enviando el EO1 especifíco out d x , a x

POP =x

POP ax POP iret

;Procedimiento usado para la ALARMA que le indica al usuario ;que los que hizo se encuentra fuera de lo pedido por el ;programa en esa seccion. ;-No recibe nada de entrada y solo genera sonido en el "beeper" Alarma proc NEAR Entrada: CALL SAVE

InicC:

mov dx,PCont55 mov ax,PConfíg55 out d x , a l mov dx,Palarma55 mov a l , O F F H out &,al mov dx,"ERl_Control in ax& mov bx,ax mov dx,TIMER2_Control in ax,& mov cx,ax mov cont,OH

rnov dx,TIMER2_regA rnov ax,COUNT-TIMEM-regA out d x , a l

rnov dx,TIMERl_regA mov ax,COUNT_TrA4ERl_regA out &,al mov dx,TIMERl-regB mov ax,COUNT-TIMERl_regB out &,al mov dx,TIMERl_Control mov ax,Control_Timerl out &,al mov dx,TIMER2_control rnov ax,Control_Timer2 out &,al inc cont cmp cont,02H jz FinAlarma mov ah,3FH call intr4b jmp InicC

FinAlarma: mov dx,Palarma55 mov al,OH out &,al mov dx,TIMER2_Control mov ax,cx out dx,a l

mov ax,bx

mov dx,TIMERl-Control out d&al CALL RESTOR ret

Alarma endp

;int 62h Transmision Serie ;dx: apunta al inicio del buffer de transmision ;es: es el segmento con que se direcciona. ;El mensaje o los datos deben terminar en 3 ' .

INTR62: call save mov bx,DirDi ;guardar apuntador a buffer mov serialbifOH ;inializamos bit de respuesta mov ax,ImpCS mov c1,OOH mov es,ax INT 67H

cmp c1,OFH j e prequit inc cl mov dx,OH mov ah,03H INT 14H and a h , O l lOOOOOb ;verificamos que Tx Holding y cmp ah,O 1 lOOOOOb ;Tx transmiter estan vacios

;listo para un nuevo byte? jne poll ;No -> esperar mov ax,DirSi cmp bx,ax ;comparar si es el ultimo byte? j g quit ;si -> salir mov al,es:[bx] ;no -> buscar caracter mov ah,OlH mov dx,OH INT 14H cmp serialbit,OlH ;vemos si se envio el Byte correctamente j e prequit push es mov ax,cs mov ax,es mov dx,OFFSET(EnvioMens) ;se le indica a el usuario que el sistema INT 69H ;se encuentra transmitiendo (esta vivo) mov ah, 10H call intr4b INT 67H pop es inc bx ;incrementar apuntador mov c1,OH

Poll:

jmp poll ;repetir el ciclo PreQult:

mov qcs mov es,ax mov dx,OFFSET(TxErrorMens) INT 69H mov ah, 10H call intr4b

call restor iret

Quit:

EnvioMens db' TX$' TxErrorMens db I ERROR EN PTO SERIALS'

;int 63h Recepcion Serie ;guardar los datos leidos en la direccion de la variable: ; RegDiRam2: [SerieRx] -> dddd

EVEN INTR63 :

CALL SAVE mov ax,cs mov es,= INT 67H mov dx,OFFSET(RecepcionMens) INT 69H mov bx,SerieRx

mov dx,OH mov ah,03H INT 14H ;verificamos si el byte recibido se encuentra and ah,00000001b ;listo y dentro del Buffer Registro de Recepcion j e rxcompleta mov ah, 15H call intr4b jmp aceptar

mov &,OH mov ah,OZH ;solicitamos mediante la INT 14H el caracter en INT 14H ;el buffer cmp serialbit,OlH j e final ;verificamos si lo recibido es lo correcto mov c1,al mov ax,900H mov es,ax mov es:lbx],cl ; Dato Recibido --> RegDiRam2:[SerieRx] inc bx ;incrementamos la base jmp aceptar

mov dx,DPMR ;Enmascaramos los niveles no utilizados mov ax,PPMR ;y dejamos libres los niveles de las out d x , a x ; I N T O e INTl mov dx,DINTl ;Ponemos la INTl de la siguiente manera: mov ax,PINTl ; 1.- Prioridad alta

Aceptar:

RxCompleta:

Final:

; 2.- Modo Edge-Triggered ; 3.- Modo no masarable y directo ; 4. - Modo Fully Nested

out &,ax mov &,DE01 ;Desabilitamos la intermpcion INT 13H mov al,PEOI-intl ;enviando el EO1 especifico out &ax CALL RESTOR iret

;tabla para la conversion TECLADO-ASCII-16segmentos org DTECal6seg ;( lEEOH ROM) db O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O ;OH - OFH db O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O ;10H - 1FH db O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O ;20H - 2FH db O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O ;30H - 3FH db O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O ;40H - 4FH db O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O ;SOH - 5FH db O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O ;60H - 6FH db O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O ;70H - 7FH db 047H db 04BH db OASH db 052H db 056H db 05AH db OOOH db OOOH db 048H db 04CH db 04FH db 053H db 057H db 02AH db OOOH db OOOH db 049H db 04DH db 050H db 054H db 058H db 02DH db OOOH db OOOH db 04AH db 04EH db 051H db 055H db 059H db 024H db OOOH db OOOH

db O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O ;AOH - AFH db O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O ;BOH - BFH db 30H db 34H db 38H db 43H db 40H db 5EH db OOH db OOH db 31H db 35H db 39H db 44H db 3CH db 3EH db OOH db OOH db 32H db 36H db 41H db 45H db 21H db 2CH db OOH db OOH db 33H db 37H db 42H db 46H db 20H db 24H db OOH db OOH

;o ;4 ;8 ;C ;INS ;A (mueve el cursor hacia arriba)

;1 ;5 ;9 ;D ;<--- (mueve el cursor hacia la izquierda) ; ---> (mueve el c m r hacia la derecha)

;2 ;6 ;A ;E ;PAUSE ;(mueve el cursor abajo)

db O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O ;EOH - EFH db O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O ;FOH - FFH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . , ;* Programa Inicial * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ,

org O lFFOH cli mov ax,PUMCS mov dx,DUMCS ;programa el registro UMCS para una memoria out &,al ;superior de 8K con 2 waits db OEAH dw OOOOH dw OFEOOH db 3 DUP (Om

code ends

end