D. - 148.206.53.84148.206.53.84/tesiuami/UAM4041.pdf · ... se muestra un panorama general sobre...

121
EV386EX lnte1386TM EX Embedded Microprocessor Evaluation Board Reporte Final de Proyecto de Ingeniería Electrónica Prof.: Agustín Suárez Fernández A z 9 ' ,. Ricardo Carlos lvison Mata " . : Matrícula 95322020 Francisco Javier Martinez Magos Matrícula 95322208 Roman Ramírez Garcia Matrícula 95321 609 México D. F. Octubre 200 l.

Transcript of D. - 148.206.53.84148.206.53.84/tesiuami/UAM4041.pdf · ... se muestra un panorama general sobre...

EV386EX lnte1386TM EX

Embedded Microprocessor Evaluation Board

Reporte Final de Proyecto de Ingeniería Electrónica

Prof.: Agustín Suárez Fernández

A

z 9 ' , . Ricardo Carlos lvison Mata

" . : Matrícula 95322020

Francisco Javier Martinez Magos Matrícula 95322208

Roman Ramírez Garcia Matrícula 95321 609

México D. F. Octubre 200 l .

EV386EX lnte1386TM EX earrlaudtlew

lndice

Prefacio

Introducción+ los Microprocesadores

Microprocesadores Antiguos

El Microprocesador 80386

MODO PROTEGIDO Modo protegido vs Modo real

Direccionamiento (Parte I ) Linkers o Ligadores

Direccionamiento (Parte I I ) Sistemas de Protecciones Llamadas a Puentes Otras Características Conclusiones

Diagrama de Bloques del 80386

Versiones del 80386

Registros del 80386

Vectores de Interrupción predefmidos

Nuevas Instrucciones del 80386

ApBUlLDER Descripción del ambiente

FLASHLDR

Demostraciones BIOS/DOS

APÉNDICE A

2 2 5 9 0 0 Página

3

4

5

6

7

8 10

12 12 14 15 15

16

17

17

27

28

30 31

40

53

54

-

(Software de evaluación para Tarjetas con procesadores EX, BIOS 2.2, y DOS 2.2)

APÉNDICE B 58 (Programas de la tarjeta EV386EX)

APÉNDICE c (Diagramas de la tarjeta EV386EX)

108

Octubre 200 1 Págma 1

EV386EX lnte1386TM EX c a r u a w r l ~

Conclusiones

Bibliografía

Lista de programas

RSTARTUP~SM

REGISTROS.ASM

DMA.ASM

HELL0.C

HELLO.FLC

1cu.c

RSENT1NTR.C

SER1AL.C

T1MER.C

80386EX.H

EV86386EX.H

80386EX.IN

127

129

59

64

70

75

77

83

84

91

93

95

1001

Octubre 200 1 Págma 2

EV386EX lnte1386TM EX WmrCww

Prefacio

En la actualidad se requiere actuar en campos de estudios que involucran computadoras, para ello es indispensable conocer o entender la programación e interfaces de un lenguaje específico, así como el hardware que se desea manipular mediante aplicaciones de software.

En este trabajo, se busca familiarzar al ledor, en primer término, con. la evolución de los microprocesador&s, además de hacer una comparación entre ellos, así como su funcionamiento interno, para lo cual se intenta detallar su arquitectura, memoria, códigos de instrucción, registros internos y diversas estructuras internas, a fin de lograr un enfoque sobre la arquitectura de computadores.

Aunque durante el desarrollo de este trabajo, se muestra un panorama general sobre los microprocesadores Intel, específicamente del 80x386, nuestro objetivo es conocer y evaluar software de aplicación sobre una especificación de este microprocesador, la cual se refiere a una tarjeta de evaluación denomina EV386EX, cuya aplicación puede darse en campos disímiles como la industria e investigación,

,. Los programas que el lector puede encontrar en éI, se encuentran codificados en lenguajes como

Ensamblador y C, estos últimos conocidos por cualquier estudiante con carrera afines como electrónica y computación, en aigunos de ellos se encuentran referancias a manuales propios del microporcesador y la tarjeta EV386EX, que seran de utilidad para entender los requerimientos de hardware.

Además en el desarrollo de este trabajo, podrá encontrar información a cerca de una herramienta muy útil llamada ApBUlLDER que ayuda a evaluar y comparar microprocesadores o microcontroladores, además de una lista de dispositivos utilizados en este proyecto y que soporta este software, más aún, una breve descripción sobre el ambiente de trabajo del ApBUILDER.

Este trabajo engloba lo aprendido e investigado durante los cursos de los Proyectos de Ingeniería Electrónica I y I I , aportando los diagramas correspondientes a la estructura física de la tarjeta en cuestión, además consideramos que puede ser de gran utilidad a estudiantes que en el futuro lleguen a desarrollar aplicaciones para este hardware.

Octubre 200 1 Página 3

FV386FX lnte1386TM EX w-#GidLrW

Introducción a los Microprocesadores

En 1981, IBM lanza al mercado un nuevo modelo de computadoras denominadas “PC” o bien Computadoras Personales, cuyo éxito residió en la facilidad que tenían para ser copiadas. Estas máquinas tenían en su interior un microprocesador llamado 8088 fabricado por Intel.

El microprocesador 8088 estaba basada en la versión reducida de microprocesador 8086, marcando de es& manera la pauta para las s3uientes generaciones de microprocesadores Intel, conocidas con el prefijo “86” , por ejemplo: el 80186 y el 80286 de 16 bits y con velocidades de hasta 20 MHz, utilizados principalmente para controlar periféricos de WS, no fue sino hasta 1987, que se pudo contar con un microprocesador de 32 bits que permitió idear un software mas moderno, con novedosas funcionalidades como multitarea real, es decir, disponer de más de un programa trabajando al mismo tiempo. Desde entonces, todos los microprocesadores fabricados por Intel han sido e 32 bits, incluso las actuales Pentium I I y 111.

Es importante tener en cuenta que el mundo PC no limita al mundo de la informática personal, es posible también encontrar en el mercado ordenadores como los Atari o los Apple, cuyos microprocesadores estaban fabricados por Motorola. Sin embargo tenían la desventaja que el software que soportaban no interpretaba instrucciones de la familia 8086 de Intel, considerados por este motivo como no compatibles.

Aunque si es posible encontrar en el mercado integrados compatibles con los fabricados por otras empresas de la familia 80x86, por ejemplo destacan AMD y Cyrix. Estas ultimas empresas iniciaron copiando flagrantemente los diseños de Intel, tal es el caso de el 386 de ADM, que llegaba a velocidades de 4MHz frente 33MHz ofrecida por Intel, algo similar sucedió con 486.

Los microprocesadores evolucionaron de manera sorprendente, sobre todo hablando de velocidad y desempeño, por ejemplo, el microprocesador 486, que consistia de un 386 con un coprocesador matemdtico incorporado, además de una memoria caché integrada, permitiendo a los nuevos usuarios de computadoras acceder a los nuevos recursos e manera más sencilla y fácil. Desde entonces todos los microprocesadores incluyen coprocesadores matemáticos y memoria caché.

PCCO tiempo después aparece una nueva generación de microprocesadores, conocida como la familia Pentium, llamándola de esta manera par evitar que surgieran 586 marca AMD o Cyrix, además porque no se permitía patentar un número, pero sí un nombre, permitiéndoles sacar fuertes campañas de publicidad bajo el nombre de “Intel Inside” (Intel dentro), hasta llegar a los técnicos informáticos de colores que anunciaban los Pentium MMX y los Pentium I I , etc.

Octubre 2001 Página 4

FV386EX lnte1386TM FX E#r4uwdrwvu

Microprocesadores antiguos

Con el advenimiento de nuevos microprocesadores en el mercado, éstos se fueron clasificando por generaciones, tal es el caso de el 8086 y el 8088 clasificados como XT, mientras que el 286 se conocían como AT. Los microprocesadores de ambas generaciones, sólo contaban con un bus interno o externo de 8 y 16 bits respectivamente, con lo que se limitaban sus posibilidades considerablemente, por ejemplo en cuanto al entorno que manejan casi Único es DOS, aunque puede correr Windows 3.1 1 sobre un 286 a 16 ó 20 MHz siempre y cuando las aplicaciones utilifadas no sean exigentes de re“cursos.

Entre los microprocesadores con mejoras considerables se encuentran los de 32 bits, como por ejemplo, el 386 y 386 SX, éste último es de 32 bits internamente, pero es de 16 bits en su bus externo, lo que lo hace hasta un 25% más lento que el original, conocido con el sufijo DX.

La versión SX es lanzada al mercado por una táctica comercial adoptada por Intel, que esta basada en dejar adelantos tecnológicos en reserva, manteniendo los precios altos, mientras se sacan versiones reducidas a precios más bajos. Siendo por ende la versión original del 386 es la más potente. Aunque ambas pueden soportar software de 32 bits. Su entorno natural es DOS y Windows 3.x, permitiendo manejar aplicaciones con calidad profesional como Microsoft Word sin demasiados problemas, y hasta incluso navegar en Internet de forma razonablemente rápida. Ahora bien, si lo que se quiere es multitarea y software de 32 bits en un 386, es recomendable utilizar los sistemas operativos alternos como OS12 o LINUX, aunque teniendo en cuenta que las versiones actuales de LINUX requieren de mucho más poder de procesamiento ya que poco a poco han venido incorporando interfaces visuales mismas que producen una mayor demanda de recursos.

Cuando aparecieron los microprocesadores 486, la historia se repite. El nombre original de estos microprocesadores es 80486DX, que consistió básicamente en: Un núcleo 386 actualizado, depurado y afinado, un coprocesador matematic0 para punto flotante integrado y una memoria caché de 8Kb en el DX original de Intel.

Es de notar que la puesta a punto del núcleo 386 y sobre todo la memoria caché lo hacen mucho más rápido, casi al doble, que en 386 a su misma velocidad de reloj.

En general las variantes de este tipo de microprocesadores (486), pueden resumirse de la siguiente manera:

0 486 SX: Es una versión del DX con el coprocesador matern&ico incluido, tras lo cual en vez de “DX” se escribe “SX” sobre este integrado.

486 DX2: También conocido como el “2x1”, 486 “completo”, que va de forma interna el doble de rápido que externamente. Así, un 486 DX2-66 con velocidad de 66MHz en su interior y a 33MHz en su comunicación con la tarjeta, ya sea e el acceso a la memoria caché o la secundaria. 486 DX4: Ocurre algo parecido que en el caso anterior , con la diferencia que ahora multiplicando por tres en vez de dos. (DX4-100 significa 33x3 = 99 ).

Octubre 2001 Página 5

FV386FX lnte1386TM FX WlwsadWlp)

Contando con un 486 es posible realizar cualquier tarea, sobre todo si se superan los 66MHz de velocidad y contando con suficiente memoria RAM.

El microprocesador 80386

El 80386:consiste en una unidad cen€ral de proceso (CPU), una unidad de manejo de memoria ("U) y una unidad de interfaz con el bus (BIU).

El CPU está compuesto por la unidad de ejecución y la unidad de instrucciones. La unidad de ejecución contiene los ocho registros de 32 bits de propósito general que se utilizan para el cálculo de direcciones y operaciones con datos y un barrel shifter de 64 bits para acelerar las operaciones de desplazamiento, rotación, multiplicación y división. Por el contrario de los microprocesadores previos, la lógica de división y multiplicación utiliza un algoritmo de un bit por ciclo de reloj. El algoritmo de multiplicación termina la iteración cuando los bits más significativos del multiplicador son todos cero, lo que permite que las multiplicaciones típicas de 32 bits q,, *: realicen en menos de un microsegundo.

La unidad de instrucción decodifica los códigos de operación (también conocidos co opcodes) de las instrucciones que se encuentran en una cola de instrucciones (cuya longitud es de;i: .: 16 bytes) y los almacena en otra cola similar pero de instrucciones decodificadas (con un espacio: para tres instrucciones).

El sistema de control de la unidad de ejecución es el encargado de decodificar las instrucciones que le envía la cola y enviarle las órdenes a la unidad aritmética y lógica (ALU) según una tabla que se encuentra almacenada en la memoria ROM llamada CROM (Control Read Only Memory).

Además este microprocesador incluye una unidad de paginado, la cual se utiliza para segmentación. La segmentación permite el manejo del espacio de direcciones lógicas agregando un componente de direccionamiento extra, para que el código y los datos se puedan reubicar fácilmente. El mecanismo de paginado opera por debajo y es transparente al proceso de segmentación, para permitir el manejo del espacio de direcciones físicas. Cada segmento se divide en uno o más páginas de 4 kilobytes. Para implementar un sistema de memoria virtual (es aquél donde el programa tiene un tamaño mayor que la memoria física y debe cargarse por páginas desde el disco duro), el 80386 permite seguir ejecutando los programas después de haberse detectado fallos de segmentos o bien de páginas. Si una página determinada no se encuentra en memoria, el 80386 se lo indica al sistema operativo mediante la interrupción 74, luego éste carga dicha página desde el disco y finalmente puede seguir ejecutando el programa, como si hubiera estado la página faltante todo el tiempo. Como se puede observar, este proceso es transparente para la aplicación, por lo que el programador no tiene que preocuparse por cargar partes del código desde el disco ya que esto lo hace el sistema operativo con la ayuda del microprocesador.

Octubre 2001 Página 6

FV386FX lnte1386TM F X Er#alwdwrvu

La memoria se organiza en uno o m& segmentos de longitud variable, con un tamaño máximo de 4 Gigabytes. Estos segmentos, tienen atributos asociados, que incluyen su ubicación, tamaño, tipo (pila, código o datos) y características de protección.

La unidad de segmentación provee cuatro niveles de protección para aislar y proteger aplicaciones y el sistema operativo. Este tipo de protección por hardware permite el diseño de sistemas con un alto grado de integridad.

El 80386 liene dos modos de operaciów el modo de direccionamiento real (o modo real), y el modo de direccionamiento virtual protegido (modo protegido). En modo real el 80386 opera como un 8086 muy rápido, con extensiones de 32 bits si se desea. El modo real se requiere primeramente para preparar el procesador para que opere en modo protegido. El modo protegido provee el acceso al sofisticado manejo de memoria y paginado.

Modo Protegido

Modo Protegido vs. Modo Real en el 80386

El Modo Protegido del 386 cambia totalmente a la segmentación con respecto a la familia del 80x86. El modo protegido ofrece acceso directo a direcciones de 32 bits. Aunque los registros del segmento todavía forman parte en cada cálculo de dirección, su papel no es más que especificar una dirección directamente. En el modo protegido los registros de segmento son apuntadores a estructuras de datos que definen los límites y direcciones de la segmentación.

En un 386 operando en modo real se tiene acceso a prácticamente cada característica que el 386 tiene que ofrecer, (con la excepción de un direccionamiento de 32 bits), Casi todas las nuevas instrucciones están disponibles. Todos los operandos pueden ser de 8, 16, o incluso 32 bits. Los programas en modo real pueden manejar fácilmente datos de doble palabra , usando registros de 32 bits. En como sigue:

rnov al,[lOOO] mov ax,[ 1 0001 mov eax,[l 0001

Manipulando datos de

add al,cl add eax,ecx

el 386, en modos real o protegido, se puede acceder. a los operandos

; cargar 8 bits ; cargar una palabra ; cargar una doble palabra

la misma manera:

; suma dos bytes ; suma dos números de 32 bits

Se pueden usar los registros de 32 bits para direccionar memoria, pero en modo real la dirección física no puede exceder 20 bits. El 386 generará una interrupción si la dirección es demasiado grande.

Se pueden aprovechar las instrucciones extendidas del 386 (incluso en modo real), para acelerar en gran manera el procesamiento:

Octubre 200 1 Página 7

FV386FX lnte1386TM FX E#r*wwrdwruu

mu1 eax,edx ;multiplicación de 32 x 32, el resultado se guarda en edx:eax

El procesador incluye registros de segmento extras. Un CPU 80x88 sólo proporciona ES, DS, SS, y CS, El 386 agrega los registros FS y GS que se pueden usar en modo real o protegido.

Direccionarniento en Modo Protegido (Parte 1) - ' *-

Los registros de segmento se conocen como "selectores" cuando operan en modo protegido, para distinguir su funcionamiento del modo real. Para estos registros se realiza un proceso de selección de hecho, en modo protegido, el registro de segmento simplemente apunta a una estructura de datos que contiene la información requerida para acceder una localidad.

Cada programa en modo protegido debe incluir una tabla de "descriptores", qué son estructuras de datos de 8 bytes que definen el inicio y el final de un segmento. Dependiendo del tipo de segmento, un descriptor puede tener otra información como por ejemplo; derechos de acceso. Un descriptor típico contiene la siguiente información, compactada en un paquete de 8 bytes:

J Inicio del seqmento: Dirección de 32 bits absoluta

J Fin del segmento: Dirección máxima a la que este segmento puede hacer referencia

J Estado del Seqmento: Nivel del privilegio, segmento actual, segmento disponible, tipo del segmento, etc.

De esta manera, el descriptor provee todo lo que se necesita saber sobre acceder a datos o codificar en un segmento al 386. Los accesos a memoria están calificados por el descriptor seleccionado por el registro de segmento actual. Este selector es un número de 12 bits que indica qué entrada usar en la tabla de descriptores; si el selector es O, se toma el primer descriptor, un selector con valor 1 toma el segundo, etc. El 386 multiplica al selector por 8 (8 bytes por entrada), y agrega esto a la dirección base de la tabla de descriptores (contenida en un registro interno del 386 cargado por el programador antes de cambiar al modo protegido.)

Por ejemplo, un código de fetch siempre usa el CS (Code Segment) actual. En modo protegido el fetch empieza por multiplicar al CS por 8 y después le suma el registro base del descriptor. El 386 entonces lee un paquete completo de 8 bytes desde la tabla de descriptores. La entrada describe el inicio del segmento; el procesador suma el apuntador de la instrucción actual a este inicio para conseguir la dirección lineal.

Un acceso a datos se comporta de la misma manera. Un dato cargado desde la localidad DS:1000 hace que el procesador lea un descriptor cambiando los 3 bits mas a la izquierda del DS (es decir, cronometra 8), sumando la dirección base de la tabla (guarda la tabla de registros de descriptores del 386), y lee los 8 bytes del descriptor en esa dirección. El descriptor contiene la dirección de inicio del segmento que se agrega al desplazamiento en la instrucción (en este caso

Octubre 2001 Página 8

FV386EX lnte1386TM FX EIIy#WdMIw

1000). Los desplazamientos y las direcciones de inicio de segmentos, son números de 32 bits. Así es muy fácil la referencia a cualquier localidad en memoria.

Cada acceso a memoria trabaja a través de estos descriptores de 8 bytes. Si sólo se guardaran en la RAM del usuario el procesamiento del 386 sería de muy bajo desempeño, a partir de que cada referencia de memoria necesita la información. ¿Cómo esperar por 8 bytes leídos antes de cada acceso de memoria? Realmente, el procesador esconde un descriptor para cada selector (uno para CS , uno para DS, etc.) en el chip. Así la traducción del segmento no requiere ninguna sobrelectura. Sin embargo, cada carga de un selector (como MOV DS, AX o POP ES) hará que el 386-pare y leerá todos los 8 bytesen el caché interior reduciendo la velocidad por un bit.

El CPU manipula estas estructuras de datos 8 bytes automáticamente y leyendo, analizando, y trabajando con ellos como sea necesario, sin la intervención del programador (una vez que están inicializados).

No sólo el CPU traduce direcciones como se ha descrito. En paralelo verifica cada referencia de memoria para asegurar que se comporte correctamente. Existe un rango límite para cada descriptor. Si la dirección lineal (base más el desplazamiento) es mayor que este límite, el 386 aborta la instrucción y genera la interrupción de la violación como protección. Se puede incluso especificar que un segmento de solo-lectura, escriba, en dado caso se creará la misma interrupción.

Hasta este punto podría parecer que los segmentos no se usan, sin embargo, la segmentación es prácticamente esencial.

En un procesador 80x88 frecuentemente se escriben programas divididos en más de un segmento de código. El ligador combina los segmentos llamados de la misma manera juntos, y entonces los agrupa en un mismo bloque. En el mundo empotrado (embedded), usando un Localizador, se pueden separar segmentos nombrados en direcciones de una RAM específica o ROM para igualar los matices del ambiente de un hardware particular. El 386 toma este paso más adelantado.

El ligador agrupa los segmentos llamados-igualmente juntos. Entonces, si se desea, se puede asignar cualquier grupo a cualquier descriptor. Aunque el selector sólo usa 12 bits para escoger un descriptor, otro bit selecciona de cual de las dos tablas de descriptores leerá al descriptor (las tablas Local o Global), restringiendo a 81 92 segmentos separados.

Esto es mucho poder; la mayoría de los usuarios de DOS lo ignoran. Es ideal para las aplicaciones Dedicadas. Si se tuviera mapeada la E/S de una memoria: se podría agrupar en un segmento con determinado nombre asignándole atributos de lectura/escritura. Aun mejor, separar puertos de lectura y escritura en segmentos diferentes para asegurar que el código no pueda accidentalmente acceder a una dirección incorrectamente. Hecho el código de fetch, los accesos ilegales crearán protecciones contra errores de violación, la depuración será mucho más fácil teniendo esto habilitado.

Algunos sistemas empotrados incluyen una versión del ROM de DOS. DOS sólo corre en modo real, así que se puede usar la segmentación del 386 para definir segmentos reales y protegidos. Los reales no tienen grandes mecinismos de protección. Estos se restringen a direcciones bajas (por debajo de 20 bits), y después poner el código de modo protegido en la

Octubre 200 1 Página 9

EV386EX lnte1386TM FX s-alww"

región alta. El código del modo real no podrá físicamente generar una dirección alta que podría efectuar el código del modo protegido.

Linkers o Ligadores

Los descriptores están arreglados en un formato confuso y duro de ensamblar. Afortunadamente, Intel y otros fabricantes proporcionan ligadores que hacen todo el trabajo duro para las aplicaciones.

Es un poco tedioso realmente cambiar de modo real a protegido, pero las notas de aplicación Intel hacen un trabajo bastante bueno en la tarea de describir el procedimiento. Allí parece ser sorprendentemente pequeño lo escrito sobre construir una aplicación real. Resulta que el ligador hace la mayoría del trabajo de construir descriptores.

Un programa está constituido solamente en 4 segmentos. Real-code es código en modo real ejecutado de vez en cuando por el programa. Cgroup es el volumen del programa. Dgroup es una área de datos. Flat-seg es un segmento especial definido para que el programa pueda realizar una dirección lineal en cualquier parte de la memoria. Nótese cómo los segmentos, en muchos casos, tienen direcciones absolutas asignadas y definen su inicio. El ligador pone automáticamente los límites.

Flat-seg es un caso especial; en este caso se ha puesto el inicio en O y el final al final de la memoria. Esto más o menos desvía la verificación de protección, como la definición del segmento evita un error de direccionamiento. A veces, en sistemas empotrados es necesario acceder cualquier área para llegar a un hardware específico.

Un programa que opera con esta estructura tendrá todo su código en el segmento cgroup, y todos los datos en Dgroup. El programa empezará con un código similar a este:

dgroupsegment datal dd data2 dd dgroupends cgroupsegment assume cs: mov ax,dgroup mov ds,ax mov eax.data1

Esto se parece

use32 ; segmento de datos ? ? -

cgroup, ds:dgroup

; pone el selector DS a dgroup ; usando DS, hacer referencia al dato1

exactamente al código 80x88. Ahora, suponga que se quiere una referencia absoluta en cualquier parte en memoria (por ejemplo, algún dispositivo de hardware del cual se desea leer). Se puede realizar lo siguiente:

mov ax,flat-seg

Octubre 200 1 Página 10

LV386EX lnte1386TM EX E#I-L15*sw

mov es,ax ; poner el selector E S en flat-seg mov esi,<algunas direcciones> mov al,es:[esi] ; leer desde una dirección absoluta

A partir de que el selector E S apunta a un descriptor que es un banco, es decir, 32 bits de espacio de direcciones, cualquier número en ES1 es un desplazamiento de 32 bits agregado a la dirección de inicio O de flat-seg.

Es recom_endable evitar escribir códigosue corre en uno de los 32 espacios del segmento. Efectivamente, es la manera más fácil de generar un programa grande. Pero se perderán los beneficios de la verificación de protección del 386's. ¿Es esto especialmente mortal con un código a partir de ROM, ¿Cómo podrá saberse que el código a veces no es accidental si se escribe por encima de la ROM? Una ROM escrita no es el problema, pero normalmente indica alguna falla del software que puede ir no detectada.

El código para los selectores es simplemente como el código del modo real del 80x88 pone los registros de segmento. No hay realmente ninguna diferencia. El ligador reemplaza referencias del segmento con apuntadores a la tabla de descriptores. En el archivo de comandos del ligador, hemos definido a la "GDT" (la Tabla de Descriptores Global), y entradas específicas para cada segmento. Entradas de GDT del 1 a 8 son reservadas en este caso, pero 9 corresponden al Dgroup, 10 al Cgroup, etc. El ligador construirá el GDT y lo insertará en el programa.

Ejemplo:

segment *segments ( dpl = O ), real-code( dpl = O, base = 08000h, usereal ), dgroup( dpl = O), cgroup( dpl = O, base=200000h ), flat-seg( dpl = O, base=O, Iimit=Ommffh),

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

table gdt (location = gdt-start,

reserve = ( 1 ..8), entry =

( 9: dgroup, 1 O: cgroup, 1 1 :flat-seg);

end; Figura 1: Típico Archivo de Comandos del ligador

Direccionamiento en Modo Protegido (Parte 2)

Octubre 2001 Página 11

FV386FX lnte1386TM EX fwaw!#dMw

En la parte anterior se introdujo la arquitectura del 386, y se describió cómo usar los registros de "segmento" para acceder a un espacio de 4 Gb de direccionamiento. Aunque muchos creen que la segmentación no se usa en modo protegido, de hecho es tan crucial como en un 80x88. Cada referencia de dirección se hace vía la segmentación sea modo real o protegido, sin embargo, los segmentos del modo protegido pueden ser cualquier tamaño, de un solo byte hasta de 4 Gb (32 bits).

Para reswnir la descripción del direccistnamiento del 386, cada referencia de memoria en modo protegido usa un selector, un desplazamiento, y un descriptor para formar una dirección lineal. Los registros CS, DS, ES , SS, FS, y G S (registros de segmento en modo real) se llaman "selectores", y son apuntadores a estructuras de datos que definen las características de un segmento. Estas estructuras de datos de 8 bytes son conocidas como "descriptores", y se agrupan en tablas. La Tabla de Descriptores Globales (GDT) está disponible para cada tarea en un programa para un 386, y contiene hasta 8192 descriptores. Las Tabla de Descriptores locales (LDTs) puede ser privada para realizar tareas individuales, y también contiene hasta 8192 descriptores.

Cada descriptor contiene la dirección de inicio del segmento (un número absoluto de 32 bits), la dirección final (para verificar errores fuera-del-límite), y el acceso misceláneo a bits de I

derecho de acceso.

Como en modo real, un "registro de segmento" es asociado con cada tipo de acceso de memoria. En modo protegido, estos selectores contienen un índice de 13 bits en el GDT o LD. La instrucción:

MOV AX,[data] (.*

usa el selector DS (por defecto) para indexar dentro de GDT o LDT, donde el procesador encuentra la dirección baja del segmento que contiene el elemento "datos." El CPU agrega esta 1 dirección base al desplazamiento (es decir, la dirección de los "datos" se guarda en los bytes de la instrucción) para crear una dirección lineal para enviar los datos a memoria.

Así, las tablas de descriptores definen las bases y tamaños de cada segmento en el programa, y definen las áreas de memoria que son direccionables. Es fácil cargar las Tablas de descriptores que usan los 386 con los ligadores disponibles en el mercado.

Los Sistemas de protecciones

Hasta ahora se han englosado por encima los detalles del formato de selectores y descriptores De hecho, cada uno contiene información usada para mantener programas de comportamiento anormal en chequeo. El problema entero de capturar errores de violación de direcciones es quizás un bit nuevo en el mundo empotrado, pero con la proliferación de sistemas cada vez más complejos este será muy importante en los próximos años. Alguien que ha sufrido a través de mirar programas que truenan y después sobre escribirlos, encontrará impresionante mirar celosamente como el código del 386 se recupera de prácticamente cualquier insulto hecho sobre éI; los mecanismos de las protecciones aseguran que el código nunca se borre, y que el sistema operativo, si existe, permanezca intacto y funcional.

Octubre 2001 Página 12

FV386FX lnte1386TM FX WrmrdWw

El 386 soporta 3 niveles de privilegio, numerados del O al 3. El nivel más privilegiado es el O. Un programa que corre a este nivel puede ganar el acceso a cualquier recurso del 386. Se restringen programas que corren con niveles de privilegio más bajos en su capacidad de usar memoria EIS, y algunas instrucciones.

Los niveles de privilegio están intimamente ligados a los descriptores. Como ya se mencionó, el descriptor contiene la dirección baja de un segmento, el tamaño del segmento, y los bits de derecho3 de acceso. Dos de estos bcts especifican el Nivel de Privilegio del Descriptor (DPL). Los privilegios son así asociados con segmentos, un concepto nuevo cuando se considera que la mayoría de los CPUs simplemente tienen un sólo privilegio global cuyos efectos son iguales a toda la memoria.

Antes de describir cómo el DPL de un segmento efectúa derechos de acceso de memoria, tiene sentido contestar la pregunta obvia: ‘Qué define el nivel de privilegio del procesador? Esto se maneja completamente dentro del contexto de privilegios del segmento. El CPU corre al nivel del privilegio definido dentro del DPL del segmento de código actual - el Nivel del Privilegio Actual (CPL). Los privilegios están algo alejados del código. Una trasferencia a un segmento con un DPL de O (por ejemplo, del sistema operativo), siempre correrá con los derechos de acceso más grandes. Una aplicación con un segmento de código con DPL=3 será muy limitado en su habilidad de correr rápidamente.

Cada vez que cualquier sección de código accesa otro segmento, el hardware del 386 compara el CPL con el segmento referenciado DPL (es decir, compara el nivel de privilegio, el CPU está corriendo a un nivel de privilegio definido para el segmento). Si el CPL es el mismo o más alto (un número más pequeño) que el DPL, entonces puede proceder con el acceso. Un intento por acceder un segmento más privilegiado que el CPL de la computadora produce una interrupción y nos permite saber que algo está equivocado.

Por lo tanto, código que corre en un segmento con un DPL de O lleva el CPU hasta un CPL de O , y da al CPU acceso a cualquier otro segmento.

Para Programadores de ensamblador principiantes puede parecer compleja la estructura de segmentos y grupos de segmentos. A veces los ASSUMES, GROUPS, y otros pseudo- operandos parecen ser una porción horrible de problema. Cuando se cambia repentinamente al 386 estas estructuras adquieren sentido perfecto: agrúpar como los segmentos y agrupar niveles de privilegio simultáneamente. Quizás el sistema operativo se agrupará en un segmento con un DPL de O para acceder a cualquier recurso. Quizá los controladores de dispositivos pueden encajar en un grupo menos importante dándoles así tanto control como necesiten, pero no más, impidiéndoles desechar código. Finalmente, ejecutar el programa de la apli@ción a un privilegio muy bajo (es decir, el número alto, como 3), para que no pueda afectar estructuras de datos del sistema o E/S.

Se ha hablado hasta ahora de aproximadamente dos niveles independientes de protección. El primero es definido por tamaños del segmento: ninguna tarea puede acceder fuera de cualquier segmento que está intentando usar, si una dirección excede el rango de tamaño del segmento el descriptor generará una interrupción. Obviamente, los errores de subencriptameinto de serie no pueden causar caídas mayores si los segmentos se definen correctamente. El

Octubre 2001 Página 13

FV386FX lnte1386TM FX m segundo nivel de protección es el chequeo del DPL que previene accesos a los segmentos privilegiados más altos.

Además, el procesador proporciona protección de hardware de ciertas instrucciones peligrosas. Obviamente, la instrucción de HLT es una que se limita a las tareas muy privilegiadas. Además, esas instrucciones que cargan los registros de control interiores del 386 (incluso los registros de depuramiento), y aquellos que cargan los apuntadores base a la tabla de descriptores deben restringirse a sólo unas cuantas tareas. Éstos y algunas otras instrucciones causarán una interrupción si s ~ n ejecutados por un código Wrriendo con un CPL mayor que O.

Las instrucciones de E/S también están protegidas. El nivel de una protección de E/S se define en el registro de EFLAGS del procesador. Las instrucciones para habilitar y desactivar interrupciones causarán una interrupción si se ejecutan en una sección de código menos privilegiada que el nivel de protección de US. Cualquier instrucción de E/S sólo creará un error similar si un puerto particular se pone a "protegido" en el mapa de bits de permiso de US, una serie de 64kb indica el estado de la protección para cada uno y cada puerto.

Llamadas a Puentes

Dado que una tarea de bajo privilegio no puede acceder código o datos con un privilegio más alto (número más bajo), entonces, ¿Cómo puede invocar cualquier tarea el sistema operativo? El sistema operativo corre probablemente a CPL O y puede acceder fuera de éI; un mecanismo es necesitado para permitir que programas de aplicación acceden a los recursos del so.

El 386 usa "Call Gates" para acceder rutinas privilegiadas más altas. Un Call Gate es un tipo especial de descriptor, guardado en el GDT o LDT que contiene un apuntador a un punto de entrada. Para invocar una rutina de privilegio más alta el ligador reemplazará sus instrucciones CALL con un CALL que trabaja indirectamente a través de esta nueva forma de descriptor.

Donde un descriptor normal contiene simplemente la dirección base del segmento, longitud, y los bits de derecho de acceso, un CALL GATE (qué también tiene 8 bytes de longitud) tiene solamente la rutina de destino del selector, desplazamiento, y DPL. El Call Gate es un apuntador indirecto al descriptor del segmento de destino.

Aunque éste es un bit tramposillo, esencialmente todos los Call Gate quitan al selector y desplazamiento de la instrucción CALL (donde estas cosas normalmente irían), y los pone dentro de la tabla del descriptor. Es decir, el CALL GATE contiene los parámetros completos de la selección de dirección destino. La propia instrucción CALL tiene un selector (eso selecciona el Call Gate, así como cualquier selector escoge un descriptor), y un desplazamiento ignorado ( el desplazamiento a la rutina está en el Call Gate).

Si se acostumbra usar un Call Gate para acceder rutinas del SO, el ligador reemplazará su CALL con un CALL al puente - cargará al seleccionador con el índice del puente en la tabla del descriptor y probablemente ponga basura en la parte del desplazamiento de la instrucción. En ejecución, el 386 ve la llamada, usa al selector para leer los 8 bytes del puente, ahorra la parte del desplazamiento del descriptor, y usa al selector del descriptor para cargar en la dirección de

Octubre 2001 Página 14

A +V386EX lnte1386TM FX GwdWIw

destino el código del segmento del descriptor. Esto rinde una dirección baja (y longitud y derechos de acceso) que se agrega al desplazamiento del Call Gate y genera la dirección física de la rutina.

El 386 usa el DPL en el Call Gate para asegurar que el invocador permita usar el puente: la visita debe ser por lo menos tan privilegiada como el puente. Entonces conmuta al nivel de privilegio indicado en el descriptor apuntado por el puente. Así, una aplicación de nivel bajo llama las rutinas para el servicio del sistema operativo utilizando un Call Gate. El traslado a través del puente levantará el nivel de privilegio hasta el del SO. - .*.

Los Call Gates agregan otro nivel de complejidad todavía a la estructura de un programa, pero la mayoría de los detalles pueden quedar al ligador. Uno de las ventajas del puente es que cada llamada a éI usa el mismo selector. Si el puente define algung sagrada localidad que nunca cambia de versión en versión, entonces el puente es puesto como una tabla de salto.

Los Call Gates están diseñados principalmente cuando se necesitan transiciones de niveles de privilegio. Puesto que ellos se encuentran en la Tabla del descriptor, se está limitado en el número de puentes que el sistema puede soportar. El GDT y cada LDT se limitan a entradas de 8k, que están lejos de la infinidad. Generalmente, los puentes son usados para las demandas para el servicio del sistema operativo a través de un solo despachador del SO.

Otras Características

El procesador también soporta memoria virtual. Uno de los bits de atributo en cada descriptor de segmento indica si el segmento está presente. Una referencia a un segmento no- presente crea una interrupción y permite al software del sistema cargar el segmento requerido del disco.

El manejo de la memoria del procesador tiene otro nivel todavía más allá de la segmentación. Opcionalmente, se puede dividir los 4 Gb de espacio de direccionamiento en paquetes más pequeños y entonces nuevamente mapear la dirección física de cada bloque corto a través de las tablas de página. Se pueden definir las tablas de página para traducir prácticamente alguna dirección en cualquier otra. Así, podrían compilarse dos tareas a las direcciones idénticas, todavía corridas a las direcciones físicas diferentes usando paginación diferente.

El 386 incluye un numero de registros de depuración que permiten poner puntos de ruptura en a lo más 4 direcciones de hardware simultáneamente. Estos puntos de ruptura trabajan más bien como aquellos producidos por un emulador: Estos son no-intrusos, y trabajan en ROM o RAM. Se pueden poner en código o accesos a datos.

Conclusión sobre el modo protegido

¿Por qué usar modo protegido en aplicaciones dedicadas? La atracción más grande es que 32 bits de espacio para direccionamiento están inmediatamente disponibles. Por supuesto, la mayoría de los CPU’s de 32 bits dará acceso más fácil a mucha memoria.

Octubre 2001 Página 15

+V386EX lnte1386TM FX Wllrwrdwrw

Los ciclos de desarrollo rápidos exigen herramientas probadas, y es muy difícil defenderse contra aquéllos del mundo de DOS. Con el 386 se puede ejecutar DOS como una tarea en su propio segmento, y ejecutar otras aplicaciones concurrentemente.

Finalmente, el modo protegido realmente protege su código. Con la segmentación correcta, prácticamente nunca podrá verse un programa sobreescribir el código. Esto podría ser importante en aplicaciones de vida críticas, médicas y otras.

- ' c '

Diagrama en bloques del 80386

El 80386 tiene la siguiente arquitectura interna:

UNIDAD DE UNIDAD DE UNIDAD DE SEGMENTACION PAGINACION CONTROL DEL BUS

Figura 2. Estructura Interna 80386

Octubre 2001 Página 16

"

FV386EX lnte1386TM EX

Versiones del 80386

80386: En octubre de 1985 la empresa Intel lanzó el microprocesador 80386 original de 16 MHz, con una velocidad de ejecución de 6 millones de instrucciones por segundo y con 275.000 transistores. La primera empresa en realizar una computadora compatible com IBM PC AT basada en .el 80386 fue Compaq con su Compaq Deskpro 386 al arlo siguiente.

386SX: Para facilitar la transición entre las computadoras de 16 bits basadas en el 80286, aparecib en junio de 1988 el 80386 SXTon bus de datos de 16 bits y 24 bits de direcciones (al igual que en el caso del 80286). Este microprocesador permitió el armado de computadoras en forma económica que pudieran correr programas de 32 bits. El 80386 original se le cambió de nombre:80386-DX.

386SL: En 1990 Intel introdujo el miembro de alta integración de la familia 386: el 80386 SL con varias características extras (25 MHz, frecuencia reducida ó O MHz, OJO AGREGAR CONSUMO TlPlCO interfaz para caché opcional externo de 16,32 ó 64 KB, soporte de LIM 4.0 (memoria expandida) por hardware, generación y verificación de paridad, ancho de bus de datos de 8 ó 16 bits) que lo hacen ideal para equipos portátiles.

Registros del 80386

El 80386 tiene registros de 32 bits en las siguientes categorías:

Registros de propósito general. 0 Registros de segmento.

Apuntador de instrucciones Indicadores.

0 Registros de control (nuevos en el 80386). Registros de direcciones de sistema.

0 Registros de depuración (debug) (nuevos en el 80386). Registros de prueba (nuevos en el 80386).

Todos los registros de los microprocesadores 8086, 80186 y 80286 son un subconjunto de los del 80386.

La siguiente tabla muestra los registros de la arquitectura base del 80386, que incluye los registros de propósito general, el apuntador de instrucciones y el registro de banderas. Los contenidos de estos registros y de los selectores del párrafo siguiente son específicos para cada tarea, así que se cargan automáticamente al ocurrir una operación de cambio de tarea. La arquitectura base también incluye seis segmentos direccionables directamente, cada uno de 4 gigabytes de tamaño máximo. Los segmentos se indican mediante valores de selectores puestos en los registros de segmento del 80386. Si se desea se pueden cargar diferentes selectores a medida que corre el programa.

Octubre 200 1 Página 17

~- -

FV386FX lnte1386TM FX Wrplrrrrrwlu,

Registros de la arquitectura base

uso general

De segment

O

Otros

No aplicable: estos registros son de 16 bits

Segmentos de datos

EIP EIP31-16 EIP15-0 = IP Apuntador de instrucciones

EFlags EFlags31-16 EFlagslw = Flags lndicadores

Registros de propósito general

Los ocho registros de propósito general de 32 bits mantienen datos y direcciones. Estos registros soportan operandos de 1, 8, 16, 32 y 64 bits y campos de bits de 1 a 32 bits. Soportan operandos de direcciones de 16 y de 32 bits. Los nombres simbólicos son: EAX, EBX, ECX, EDX, ESI, EDI, EBP y ESP. Los 16 bits menos significativos se pueden acceder separadamente. Esto se hace usando los nombres A X , BX, CX, DX, SI, DI, BP y SP, que se utilizan de la misma manera que en los procesadores previos. AI igual que en el 80286 y anteriores, AX se divide en AH y AL, BX se divide en BH y BL, CX se divide en CH y CL y DX se divide en DH y DL.

Los ocho registros de uso general de 32 bits se pueden usar para direccionamiento indirecto. Cualquiera de los ocho registros puede ser la base y cualquiera menos ESP puede ser el índice. El índice se puede multiplicar por 1, 2, 4 u 8.

Ejemplos de direccionamiento indirecto:

MOV ECX,[ESP] MOV AL, [EAX + ED1 * S]

e ADD CL, [€DX + €DX + 8245525hl INC DWORD PTR TABLA[EAX * 41

En modo real y en modo 8086 virtual, la suma de la base, el índice y el desplazamiento debe estar entre O y 65535 para que no se genere una interrupción 13. El segmento implícito por default

Octubre 200 1 Página 18

FV386EX lnte1386TM FX c w p a p l w v ~ ~

es SS. Si se utiliza EBP o ESP como base, en caso contrario es DS. En el caso de usar direccionamiento de 16 bits, sólo se pueden usar las mismas combinaciones que para el 8088. No se pueden mezclar registros de 16 y de 32 bits para direccionamiento indirecto.

Apuntador de instrucciones

El apuntsdor de instrucciones es unJegistro de 32 bits llamado EIP, el cual mantiene el offset de la próxima instrucción a ejecutar. El o7fset siempre es relativo a la base del segmento de código (CS). Los 16 bits menos significativos de EIP conforman el apuntador de instrucciones de 76 bits llamado IP, que se utiliza para direccionamiento de 16 bits.

Registro de banderas

Es un registro de 32 bits llamado EFlags. Los bits definidos y campos de bits controlan ciertas operaciones e indican el estado del 80386. Los 16 bits menos significativos (bits 15-0) llevan el nombre de Flags, que es más útil cuando se ejecuta código de 8086 y 80286. La descripción de los indicadores es la siguiente:

VM (Virtual 8086 Mode, bit 17): Este bit provee el modo 8086 virtual dentro del modo protegido. Si se pone a 1 cuando el 80386 está en modo protegido, entrará al modo 8086 virtual, manejando los segmentos como lo hace el 8086, pero generando una interrupción 13 (Violación general de protección) en instrucciones privilegiadas (aquéllas que sólo se pueden ejecutar en modo real o en el anillo O). El bit VM sólo puede ponerse a 1 en modo protegido mediante la instrucción IRET (ejecutando en nivel de privilegio cero) y por cambios de tarea en cualquier anillo. El bit VM no cambia con la instrucción POPF. La instrucción PUSHF siempre pone un cero en el bit correspondiente en la pila, aunque el modo 8086 virtual esté activado. La imagen de EFlags puesta en la pila durante el procesamiento de una interrupción o salvada durante cambios de tarea, contendrá un uno en el bit 17 si el código interrumpido estaba ejecutando una tarea tipo 8086 virtual.

RF (Resume Flag, bit 16): Este indicador se utiliza junto con los registros de depuración. Se verifica en las fronteras de instrucciones antes del procesamiento de los puntos de ruptura (breakpoints). Cuando RF vale 1, hace que se ignoren las faltas (hechos que ocasionan una interrupción) de depuración. RF se pone automáticamente a cero luego de ejecutar correctamente cualquier instrucción (no se señalan faltas) excepto las instrucciones IRET y POPF y en los cambios de tarea causados por la ejecución de JMP, CALL e INT. Estas instrucciones ponen RF al valor especificado por la imagen almacenada en memoria. Por ejemplo, al final de la rutina de servicio de los Puntos de Ruptura, .la instrucción IRET puede extraer de la pila una imagen de EFlags que tiene RF = 1 y resumir la ejecución del programa en la dirección del punto de parada sin generar otra falta de punto de parada en el mismo lugar.

NT (Nested Task, bit 14): Este indicador se aplica al modo protegido. NT se pone a uno para indicar que la ejecución de la tarea está anidada dentro de otra tarea. Si está a uno, indica que el segmento de estado de la tarea (TSS) de la tarea anidada tiene un apuntador válido al TSS de la tarea previa. Este bit se pone a cero o uno mediante transferencias de

Octubre 2001 Página 19

EV386EX lnte1386TM FX Emrwrlwlw

control a otras tareas. La instrucción IRET verifica el valor de NT para determinar si debe realizar un retorno dentro de la misma tarea o si debe hacer un cambio de tarea. Un POPF o IRET afectará el valor de este indicador de acuerdo a la imagen que estaba en la pila, en cualquier nivel de privilegio.

0 IOPL (InpuVOutput Privilege Level, bits 13-12): Este campo de dos bits se aplica al modo protegido. IOPL indica el CPL (Current Privilege Level) numéricamente máximo (esto es, con menor nivel de privilegio) permitido para realizar instrucciones de entradakalida sin generar M a interrupción 13 (Violacióngeneral de protección) o consultar el mapa de bits de permiso de E/S (este mapa está ubicado en el segmento de estado de tarea (TSS) con el nuevo formato que provee el 80386). Además indica el máximo valor de CPL que permite el cambio del indicador IF (indicador de habilitación de La terminal OJO Terminal INTR) cuando se ejecuta POPF e IRET. Estas dos últimas instrucciones sólo pueden alterar IOPL cuando CPL = O. Los cambios de tarea siempre alteran el campo IOPL, cuando la nueva imagen de los indicadores se cargan desde el TSS de la nueva tarea.

OF (Oveflow flag, bit 1 1 ) : Si vale 1 , hubo un desborde en una operación aritmética con signo, esto es, un dígito significativo se perdió debido a que tamaño del resultado es mayor que el tamaño del destino.

0 DF (Direction f lag, bit 10): Define si ES1 y/o ED1 se autoincrementan (DF = O) o autodecrementan (DF = 1 ) durante instrucciones de cadena.

IF (INTR enable Flag, bit 9): Si vale 1 , permite el reconocimiento de interrupciones externas señaladas en la terminal INTR. Cuando vale cero, las interrupciones externas señaladas en la terminal INTR no se reconocen. IOPL indica el máximo valor de CPL que permite la alteración del indicador IF cuando se ponen nuevos valores en EFlags desde la pila.

0 TF (Trap enable f lag, bit 8): Controla la generación de la interrupción 1 cuando se ejecuta código paso a paso. Cuando TF = 1 , el 80386 genera una interrupción 1 después que se ejecuta la instrucción en curso. Cuando TF = O, la interrupción 1 sólo puede ocurrir como resultado de las direcciones de punto de parada cargados en los registros de depuración (DRO-DR3).

0 SF (Sign Flag, bit 7): Se pone a 1 si el bit más significativo del resultado de una operación aritmética o lógica vale 1 y se pone a cero en caso contrario. Para operaciones de 8, 16, 32 bits, el indicador SF refleja el estado de los bits 7, 15 y 31 respectivamente.

ZF (Zero flag, bit 6): Se pone a 1 si todos los bits del resultado valen cero, en caso contrario se pone a cero.

AF (Auxiliary carry Flag, bit 4): Se usa para simplificar la adición y sustracción de cantidades BCD empaquetados. AF se pone a 1 si hubo un préstamo o acarreo del bit 3 al 4. De otra manera el indicador se pone a cero.

PF (Parity flag, bit 2): se pone a uno si los ocho bits menos significativos del resultado tienen un número par de unos (paridad par), y se pone a cero en caso de paridad impar

Octubre 2001 Página 20

FV386EX lnte1386TM EX WiemrdWIw

(cantidad impar de unos). El indicador PF es función de los ocho bits menos significativos del resultado, independientemente del tamaño de las operaciones.

CF (Carry Flag, bit O): Se pone a uno si hubo arrastre (suma) o préstamo (resta) del bit más significativo del resultado.

Los bits 5 y 3 siempre valen cero, mientras que el bit 1 siempre vale uno. m ' "

Registros de segmento del 80386

Son seis registros de 16 bits que mantienen valores de selectores de segmentos identificando los segmentos que se pueden direccionar. En modo protegido, cada segmento puede tener entre un byte y el espacio total de direccionamiento (4 gigabytes). En modo real, el tamaño del segmento siempre es 64 KB.

Los seis segmentos direccionables en cualquier momento se definen mediante los registros de segmento CS, DS, ES, FS, GS, SS. El selector en CS indica el segmento de código actual, el selector en SS indica el segmento de pila actual y los selectores en los otros registros indican los segmentos actuales de datos.

Registros descriptores de segmento: Estos registros no son visibles para el programador, pero es muy útil conocer su contenido. Dentro del 80386, un registro descriptor (invisible para el programador) está asociado con cada registro de segmento (visible para el programador). Cada descriptor mantiene una dirección base de 32 bits, un límite (tamaño) de 32 bits y otros atributos del segmento.

Cuando un selector se carga en un registro de segmento, el registro descriptor asociado se cambia automáticamente con la información correcta. En modo real, sólo la dirección base se cambia (desplazando el valor del selector cuatro bits hacia la izquierda), ya que el limite y los otros atributos son fijos. En modo protegido, la dirección base, el límite y los otros atributos se cargan con el contenido de una tabla usando el selector como indice.

Siempre que ocurre una referencia a memoria, se utiliza automáticamente el registro descriptor de segmento asociado con el segmento que se está usando. La dirección base de 32 bits se convierte en uno de los componentes para calcular la dirección, el límite de 32 bits se usa para verificar si una referencia no supera dicho límite (es decir, que la referencia no esté fuera del segmento) y los atributos se verifican para determinar si hubo alguna violación de protección u otro tipo.

Registros de control

El 80386 tiene tres registros de control de 32 bits, llamados CRO, CR2 y CR3, para mantener el estado de la máquina de naturaleza global (no el específico de una tarea determinada). Estos registros, junto con los registros de direcciones del sistema, mantienen el

Octubre 200 1 Página 21

FV386EX lnte1386TM EX "dwlw

estado de la máquina que afecta a todas las tareas en el sistema. Para acceder los registros de control, se utiliza la instrucción MOV.

CRO (Reqistro de control de la máquina): Contiene seis bits definidos para propósitos de control y estado. Los 16 bits menos significativos de CRO también se conocen con el nombre de palabra de estado de la miquina (MSW), para la compatibilidad con el modo protegido del 80286. Las instrucciones LMSW y SMSW se toman como casos particulares de carga y almacenamiento de CRO donde sólo se opera con los 16 bits menos significativos de CRO. Para lograr la compatibilidad cQn sistemas operativos del 8Q286 la instrucción LMSW opera en forma idéntica que en el 80286 (ignora los nuevos bits definidos en CRO). Los bits definidos de CRO son los siguientes:

P G (Paging Enable, bit 31 de CRO): Este bit se pone a uno para habilitar la unidad de paginado que posee el chip. Se pone a cero para deshabilitarlo. El paginado sólo funciona en modo protegido, por lo que si P G = 1, deberá ser P E = 1. Nuevo en 80386.

0 E T (Processor Extension Type, bit 4 de CRO): Indica el tipo de coprocesador (80287, 80387) según se detecte por el nivel de la terminal /ERROR al activar la terminal RESET. El bit E T puede ponerse a cero o a uno cargando CRO bajo control del programa. Si E T = 1, se usa el protocolo de 32 bits del 80387, mientras que si E T = O, se usa el protocolo de 16 bits del 80287. Para lograr la compatibilidad con el 80286, la instrucción LMSW no altera este bit. Sin embargo, al ejecutar SMSW, se podrá leer en el bit 4 el valor de este indicador. Nuevo en 80386.

TS (Task Switched, bit 3 de CRO): Se pone a uno cuando se realiza una operación de cambio de tarea. Si TS = 1, un código de operación ESC del coprocesador causarh una interrupción 7 (Coprocesador no disponible). El manejador de la interrupción típicamente salva el contexto del 80287/80387 que pertenece a la tarea previa, carga el estado del 80287180387 con los valores de la nueva tarea y pone a cero el indicador TS antes de retornar a la instrucción que causó la interrupción.

EM (Emulate Coprocessor, bit 2 de CRO): Si este bit vale uno, hará que todos los códigos de operación de coprocesador causen una interrupción 7 (Coprocesador no disponible). Si vale cero, permite que esas instrucciones se ejecuten en el 80287/80387 (éste es el valor del indicador después del RESET). El código de operación WAIT no se ve afectado por el valor del indicador.

MP (Monitor Coprocessor, bit 1 de CRO): Este indicador se usa junto con TS para determinar si la instrucción WAIT generará una interrupción 7 cuando TS = l. Si MP = TS = 1, al ejecutar WAIT se genera la interrupción. Nótese que TS se pone a uno cada vez que se realiza un cambio de tarea.

P E (Protection Enable, bit O de CRO): Se pone a uno para habilitar el modo protegido. Si vale cero, se opera otra vez en modo real. P E se puede poner a uno cargando MSW o CRO, pero puede ser puesto a cero sólo mediante una carga en CRO. Poner el bit P E a cero es apenas una parte de una secuencia de instrucciones necesarias para la transición

Octubre 200 1 Página 22

FV386FX lnte1386TM FX fsrr#wurrwrw

de modo protegido a modo real. Nótese que para la compatibilidad estricta con el 80286, PE no puede ponerse a cero con la instrucción LMSW.

CR2 (Dirección lineal de falta de páqina): Mantiene la dirección lineal de 32 bits que causó la última falta de página detectada. El código de error puesto en la pila del manejador de la falta de página cuando se la invoca provee información adicional sobre la falta de página.

Un cambio de tareas a través de un TSS que cambie el valor de CR3, o una carga explícita de CR3 con cualquier valor, invalidará todas las entradas en la tabla de páginas que se encuentran en el caché de la unidad de paginación. Si el valor de CR3 no cambia durante el cambio de tareas se considerarán válidos los valores almacenados en el caché.

Registros de direcciones del sistema

Cuatro registros especiales se definen en el modelo de protección del 80286180386 para referenciar tablas o segmentos. Estos últimos son:

0 GDT (Tabla de descriptores globales). 0 IDT (Tabla de descriptores de interrupción). 0 LDT (Tabla de descriptores locales). 0 TSS (Segmento de estado de la tarea).

Las direcciones de estas tablas y segmentos se almacenan en registros especiales, llamados GDTR, IDTR, LDTR y TR respectivamente.

GDTR e IDTR: Estos registros mantienen la dirección lineal base de 32 bits y el limite de 16 bits de GDT e IDT, respectivamente. Los segmentos GDT e IDT, como son globales para todas las tareas en el sistema, se definen mediante direcciones lineales de 32 bits (sujeto a traducción de página si el paginado está habilitado mediante el bit PG) y límite de 16 bits.

LDTR y TR

Estos registros mantienen los selectores de 16 bits para el descriptor de LDT y de TSS, respectivamente. Los segmentos LDT y TSS, como son específicos para cada tarea, se definen mediante valores de selector almacenado en tos registros de segmento del sistema. Nótese que un registro descriptor del segmento (invisible para el programador) está asociado con cada registro de segmento del sistema.

Registros de depuración

AI igual que en los procesadores anteriores, el 80386 tiene algunas características que simplifica el proceso de depuración de programas. Las dos características compartidas con los microprocesadores anteriores son:

1 ) El código de operación de punto de ruptura INT 3 (OCCh). 2) La capacidad de ejecución paso a paso que provee el indicador TF.

Octubre 200 1 Página 23

FV386FX lnte1386TM FX korR#rrrwilrr

Lo nuevo en el 80386 son los registros de depuración. Los seis registros de depuración de 32 bits accesibles al programador, proveen soporte para depuración (debugging) por hardware. Los registros DRO-DR3 especifican los cuatro puntos de ruptura (breakpoints). Como los puntos de ruptura se indican mediante registros en el interior del chip, un punto de ruptura de ejecución de instrucciones se puede ubicar en memoria ROM o en código compartido por varias tareas, lo que no es posible utilizando el código de operación INT 3. El registro de control DR7 se utiliza para poner y habilitar los Puntos de Ruptura y el registro de estado DR6 indica el estado actual de los Puntos de Ruptura. Después del reset, los Puntos de Ruptura están deshabilitados. Los Puntos de Ruptura que ocurren debido a los registros de depuración generan una interrupción

Registros de direcciones lineales de puntos de ruptura (DRO - DR3)

Se pueden especificar hasta cuatro direcciones de puntos de ruptura escribiendo en los registros DRO a DR3. Las direcciones especificadas son direcciones lineales de 32 bits. El hardware del 80386 continuamente compara las direcciones lineales de los registros con las direcciones lineales que genera el software que se está ejecutando (una dirección lineal es el resultado de computar la dirección efectiva y sumarle la dirección base de 32 bits del segmento). Nótese que si la unidad de paginación del 80386 no está habilitada (mediante el bit PG del registro CRO), la dirección lineal coincide con la física (la que sale por el bus de direcciones), mientras que si está habilitada, la dirección lineal se traduce en la física mediante dicha unidad.

Registro de control de depuración (DR7)

La definición de los bits de este registro es la siguiente:

Campo LEN¡ (Campo de especificación de longitud del punto de parada): Por cada punto de ruptura existe un campo de dos bits LEN. Este campo especifica la longitud del campo que produce el punto de ruptura. En GI caso de punto de ruptura por acceso de datos se puede elegir 1 , 2 ó 4 bytes, mientras que los de lectura de instrucciones deben tener una longitud de un byte (LENi = 00). La codificación del campo es como sigue: LEN¡ = O0 ( 1 byte): Los 32 bits de DRi se utilizan para especificar el punto de parada. LEN¡ = O1 (2 bytes): Se utilizan los bits 31-1 de DRi. LEN¡ = 10: Indefinido. No debe utilizarse. LEN¡ = 1 1 (4 bytes): Se utilizan los bits 31-2 de DRi.

Campo RWi (Bits calificadores de acceso a memoria): Existe un campo RW de dos bits por cada uno de los Puntos de Ruptura. Este campo especifica el tipo de uso de memoria que produce el punto de parada: RWi = 00: Solamente ejecución de instrucciones. RWi = 01: Solamente escritura de datos.

Octubre 2001 Página 24

A FV386EX lnte1386TM FX Wrpwrudlrspr

RWi = 10: Indefinido. No debe utilizarse. RWI = 11: Solamente lectura y/o escritura de datos.

Los puntos de ruptura (interrupción 1 ) debido a la ejecución de instrucciones ocurren ANTES de la ejecución, mientras que los Puntos de Ruptura debido a acceso a datos ocurren DESPUES del acceso.

Uso de LEN¡ y RWi para poner un punto de ruptura debido a acceso a datos, esto se realiza cargando la dirección lineal deldato en DRi (i=0-3). RWi puede valer O1 (sólo parar en escritura) o 1 1 (parar en lectura/escritura). pueLENi de ser igual a O0 (un byte), O1 (2 bytes) ó 1 1 (4 bytes). Si un acceso de datos cae parcial o totalmente dentro del campo definido por DRI y LEN¡ y el punto de ruptura está habilitado, se producirá la interrupción l .

Uso de LEN¡ y RWi para poner un punto de interrupción debido a la ejecución de una instrucción: Debe cargarse DRi con la dirección del comienzo (del primer prefijo si hay alguno). RWi y LEN¡ deben valer OO. Si se está por ejecutar la instrucción que comienza en la dirección del punto de parada y dicho punto de parada está habilitado, se producirá una interrupción 1 antes de que ocurra la ejecución de la instrucción.

0 Campo GD (Detección de acceso de registros de depuración): Los registros de depuración sólo se pueden acceder en modo real o en el nivel de privilegio cero en modo protegido (no se pueden acceder en modo 8086 virtual). El bit GD, cuando vale uno, provee una protección extra contra cualquier acceso a estos registros aun en modo real o en el anillo O del modo protegido. Esta protección adicional sirve para garantizar que un depurador por software (Codeview, Turbo Debugger, etc.) pueda tener el control total de los recursos provistos por los registros de depuración cuando sea necesario. El bit GD, cuando vale 1, causa una interrupción 1 si una instrucción trata de leer o escribir algún registro de depuración. El bit GD se pone automáticamente a cero al ocurrir dicha interrupción, permitiendo al manejador el control de los registros de depuración.

0 Bits GE y LE (Punto de parada exactamente cuando ocurre el acceso a datos, global y local): Si GE o LE valen uno, cualquier punto de parada debido a acceso a datos se indicará exactamente después de completar la instrucción que causó la transferencia. Esto ocurre forzando la unidad de ejecución del 80386 que espere que termine la transferencia de datos antes de comenzar la siguiente instrucción. Si GE = LE = O, la parada ocurrirá varias instrucciones después de la transferencia que lo debería haber causado. Cuando el 80386 cambia de tarea, el bit LE se pone a cero. Esto permite que las otras tareas se ejecuten a máxima velocidad. El bit LE debe ponerse a uno bajo control del software. El bit GE no se altera cuando ocurre un cambio de tarea. Los Puntos de Ruptura debido a la ejecución de instrucciones siempre ocurren exactamente, independientemente del valor de GE y LE.

Bits Gi y Li (Habilitación del punto de parada, global y local): Si cualquiera de estos bits vale uno, se habilita el punto de parada asociado. Si el 80386 detecta la condición de parada ocurre una interrupciónl. Cuando se realiza un cambio de tareas, todos los bits Li se ponen a cero, para evitar excepciones espúreas en la nueva tarea. Estos bits deben ponerse a uno bajo control del software. Los bits Gi no se afectan durante un cambio de

Octubre 200 1 Página 25

EV386FX lnte1386TM FX fwulrrrrdwllrpr

tarea. Los bits Gi soportan Puntos de Ruptura que están activos en todas las tareas que se ejecutan en el sistema.

Registro de estado de depuración (DR6): Este registro permite interrupción 1 determine fácilmente por qué fue llamado. El manejador resultado de uno de los siguientes eventos:

que el manejador de la puede ser invocado como

1 . Punto de parada debido a DRO. 2. Punto deparada debido a DRI. . * .

3. Punto de parada debido a DR2. 4. Punto de parada debido a DR3. 5. Acceso a un registro de depuración cuando GD = 1 6. Ejecución paso a paso (si TF = 1 ) . 7. Cambio de tareas.

El registro DR6 contiene indicadores para cada uno de los eventos arriba mencionados. Los otros bits son indefinidos. Estos indicadores se ponen a uno por hardware pero nunca puestos a cero por hardware, por lo que el manejador de la interrupción 1 deberá poner DR6 a cero.

Registros de Prueba

Se utilizan dos registros para verificar el funcionamiento del RAMlCAM (Content Addressable Memory) en el buffer de conversión por búsqueda (TLB) de la unidad de paginado del 80386. TR6 es el registro de comando del test, mientras que TR7 es el registro de datos que contiene el dato proveniente del TLB. El TLB guarda las entradas de tabla de página de uso más reciente en un caché que se incluye en el chip, para reducir los accesos a las tablas de páginas basadasen RAM.

Acceso a registros

a continuación. Escr = Escritura del registro, Lect = Lectura del registro. Hay algunas diferencias en el acceso de registros en modo real y protegido, que se indican

Octubre 2001 Página 26

A FV386EX lnte1386TM EX Wmmdwrr

TR

No No CPL=O CPL=O sí sí Registros de test No No CPL=O CPL=O sí sí Registros de depuración No No sí CPL=O No No

CPL=O: Los registros se pueden acceder sólo si el nivel de privilegio actual es cero. IOPL: Las instrucciones PUSHF y POPF son sensibles al indicador IOPL en modo 8086 virtual.

Compatibilidacj Y

Algunos bits de ciertos registros del 80386 no están definidos. Cuando se obtienen estos bits, deben tratarse como completamente indefinidos. Esto es esencial para la compatibilidad con procesadores futuros. Para ello deben seguirse las siguientes recomendaciones:

1 ) No depender de los estados de cualquiera de los bits no definidos. Estos deben ser , 1

enmascarados (mediante la instrucción AND con el bit a enmascarar a cero) cuando se utilizan los registros.

2) No depender de los estados de cualquiera de los bits no definidos cuando se los almacena ~: ~

en memoria u otro registro. ; ". . I' 5" I'

3) No depender de la habilidad que tiene el procesador de retener información escrita en bits .:::: marcados como indefinidos. ... ".

i;: f.. 4) Cuando se cargan registros siempre se deben poner los bits indefinidos a cero. , .

5) Los registros que se almacenaron previamente pueden ser recargados sin necesidad de :I

enmascarar los bits indefinidos.

Los programas que no cumplen con estas indicaciones, pueden llegar a no funcionar en 80486, Pentium y siguientes procesadores, donde los bits no definidos del 80386 poseen algún significado en los otros procesadores.

Vectores de interrupción predefinidos

Las siguientes son las interrupciones que puede generar el microprocesador, por lo que, en modo real, deberán estar los vectores correspondientes (en la zona baja de memoria) que apunten a los manejadores, mientras que en modo protegido, deberán estar los descriptores correspondientes en la tabla de descriptores de interrupción (IDT).

Octubre 200 1 Página 27

FV386EX lnte1386TM FX , f+praw&#rrwlsrr

Excepción de depuración 1 Cualquier instrucción

Interrupción NMI 2 INT 2 o NMI NO nterrupción de un INT NO

Sobreflujo NO INTO 4 byte . r % -

Fuera de rango

El dispositivo no SI Instrucción ilegal 6 Código inválido SI BOUND 5

ESC, SI existe

Cualquier instrucción que pueda Doble falta

generar una interrupción TSS inválido SI JMP, CALL, IRET, INT 10 Segmento no

nresente 11 1 ICarga de registro de segmento

Falta de pila

SI ESC, WAIT 16 Error del

SI Acceso a memoria 14 Falta de página

SI Referencia a memoria 13 Violación de SI Referencia a la pila 12

. "_. ."

protección

coprocesador

Reservado 32 17-

Interrupción de 2 INT O- 255 bytes - NO

Nuevas instrucciones del 80386 -.

Aparte de las instrucciones del 8088, y las nuevas del 80186 y del 80286, el 80386 tiene las siguientes nuevas instrucciones:

BSF dest, src (Bit Scan Forward): Busca el primer bit puesto a 1 del operando fuente src (comenzando por el bit cero hasta el bit n-1). Si lo encuentra pone el indicador ZF a 1 y carga el destino dest con el índice a dicho bit. En caso contrario pone ZF a O.

BSR dest, src (Bit Scan Reverse): Busca el primer bit puesto a 1 del operando fuente src (comenzando por el bit n-1 hasta el bit cero). Si lo encuentra pone el indicador ZF a 1 y carga el destino dest con el índice a dicho bit. En caso contrario pone ZF a O.

Octubre 200 1 Página 28

FV386FX lnte1386TM EX fyymtyw

BT dest, src (Bit Test): El bit del destino dest indexado por el valor fuente se copia en el indicador CF.

BTC dest, src (Bit Test with Complement): El bit del destino dest indexado por el valor fuente se copia en el indicador CF y luego se complementa dicho bit.

BTR dest, src (Bit Test with Reset): El bit del destino dest indexado por el valor fuente src se copia en el indicador CF y luego pone dicho bit a cero.

1

BTS dest, src (B-Lt Test with Set): El bit del destino dest indexado por el valor fuente src se copia en el indicador CF y luego pone dicho bit a uno.

-.+.

CDQ (Convert Doubleword to Quadword): Convierte el número signado de 4 bytes en EAX en un número signado de 8 bytes en EDX:EAX copiando el bit más significativo (de signo) de EAX en todos los bits de EDX.

CWDE (Convert Word to Extended Doubleword): Convierte una palabra signada en el registro AX en una doble palabra signada en EAX copiando el bit de signo (bit 15) de AX en los bits 31-16 de E M .

JECXZ label (Jump on ECX Zero): Salta a la etiqueta label si el registro ECX vale cero.

LFS, LGS, LSS dest, src (Load pointer using FS, GS, SS): Carga un apuntador de 32 bits de la memoria src al registro de uso general destino dest y FS, GS o SS. El offset se ubica en el registro destino y el segmento en FS, GS o SS. Para usar esta instrucción la palabra en la dirección indicada por src debe contener el offset, y la palabra siguiente debe contener el segmento. Esto simplifica la carga de apuntadors lejanos (far) de la pila y de la tabla de vectores de interrupción.

MOVSX dest, src (Move with Sign extend): Copia el valor del operando fuente src al registro destino dest (que tiene el doble de bits que el operando fuente) extendiendo los bits del resultado con el bit de signo. Se utiliza para aritmética signada (con números positivos y negativos).

MOVZX dest, src (Move with Zero extend): Copia el valor del operando fuente src al registro destino dest (que tiene el doble de bits que el operando fuente) extendiendo los bits del resultado con ceros. Se utiliza para aritmética no signada (sin números negativos).

POPAD (Pop All Doubleword Registers): Retira los ocho registros de uso general de 32 bits de la pila en el siguiente orden: EDI, ESI, EBP, ESP, EBX, EDX, ECX, E M . El valor de ESP retirado de la pila se descarta.

POPFD (Pop Doubleword Flags): Retira de la pila los indicadores completos (32 bits).

PUSHAD (Push All Doubleword Registers): Pone los ocho registros de uso general de 32 bits en la pila en el siguiente orden: EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI.

PUSHFD (Push Doubleword Flags): Pone los 32 bits del registro de indicadores en la pila.

Octubre 2001 Página 29

. _ " .~

FV386EX lnte1386TM FX Wrw4udrWrw

SETcc dest (Set Byte on Condition cc): Pone el byte del destino dest a uno si se cumple la condición, en caso contrario lo pone a cero. Las condiciones son las mismas que para los saltos condicionales (se utilizan las mismas letras que van después de la "J").

SHLD dest, src, count (Shift Left Double precision): Desplaza dest a la izquierda count veces y las posiciones abiertas se llenan con los bits más significativos de SE.

SHRD dest, src, count (Shift Left Double precision): Desplaza dest a la derecha count veces y las posiciones abiertas se llenan con los bits menesignificativos de src.

ApBUlLDER

ApBUlLDER es una herramienta para evaluar y comparar microprocesadores o microcontroladores, como de la familia 80x86. La versión utilizada durante este proyecto soporta los siguientes dispositivos:

80C186EA I 80C188EA 80C186EB I 80C188EB 80C186EC I 80C188EC 80C186XL I 80C188XL 8XC196KD 8XC196KC 8XC196KB 8XC198 8XC196KR 8XC196KQ 8XC196KT 8XC196JR 8XC196JQ 8XC 1 96 JT 8XC196NP 8XC196NT 8XC196NU lnte1386(TM) EX 8XC52 8XC58 8XC51 FA 8XC51 FB 8XC51 FC 8XC251 SB

Octubre 2001 Página 30

FV386FX lnte1386TM FX w#4wJmaw

Descripción del Ambiente 2 2 5 9

Esta aplicación consta de tres áreas, como se muestra en la imagen:

-2

3

1) La barra de herramientas donde encontramos cinco menús:

- File. - Tiene como opciones comenzar una nueva configuración (New Configuration), para editar una nueva configuración de un-dispositivo con el que ya se ha trabajado o con uno nuevo; Abrir (Open), para abrir una configuración previamente guardada; Guardar (Save), guardar los cambios hecho a una configuración; Guardar Como ... (Save As...), dar nombre a una nueva configuración ; Salir (Exit), terminar la sesión del ApBUILDER.

- Select-Device. - En este menú se dan las diferentes opciones de dispositivos con los que se pueden trabajar desde el ApBUILDER.

- Tools. - Sus opciones son las mismas que se dan en la barra de iconos que se describirán en el punto 2.

- Help. - Todo lo referente al uso del ApBUILDER, así como una acceso al tutorial del mismo.

Octubre 200 1 Página 31

FV386EX lnte1386TM EX

2) La barra de iconos:

A partir de este icono se puede accesar a las guías de información en forma de hipertexto. AI elegir algún periférico del diagrama del dispositivo y dar un clic sobre este icono se desplegará la información especifica a él.

Como pwde verse la ventana abierta para el manual tiene las características de una ventana de ayuda, de tal forma que se facilita su uso.

The channel4 and channel1 stgnals are selected indindually In contrast. the channel-2 slgnals ( N R C U O . TMRGATEZ. TMROLITZ) are selected as a group. Note that uslng the channel-2 stgnals precludes use ofthe coprocessor stgnals (PEREO. BUSY#. and ERROR#) Also. you must choose tndrndually between tnlenupt Inputs and ltmer clock stgnals (NRClHMNT4.MRCLKlANT6) and between tntemrpl Inputs and ttmer gate stgnals ( T M R G A T E M M S . M R G A T E l A K n )

Dwlca Codgundon

Omice Confinurahon

Pzrloheral Concmurahon

p Conmuratton

Ystno me DhWC~nlt~tth Edernal Center

DM4 Semte to an SI0 of SS10 Penoneral

U w o me Timer TO lhdlefe D M T n n s l e E

I tmttahotis Due TO Pin Stanal MuIttoIemu

IntSnuDt Control UndConfiaurahok

TlmerlCounter Unlt Confiaurahon

hmrhmnous Senal U0 Confiourabon

Sena1 Smchronous VO Connauranon

Core Conftwrahon

Pin conmuratlon

Derre Confiluranon Procedure

Gcnswralton Eramolr

Eramole Desman Reaulrernents

Exaru le Deslo? ScIut!3n

Por medio de este icono se puede accesar a un menú sobre el producto que se 1)11 esta evaluando. A través de este menú se pueden obtener datos sobre el producto, o Fa@ sobre la familia a la que pertenece, aií como formación acerca de tarjetas de

evaluación, emuladores de circuitos y herramientas de software para el desarrollo.

Este menú incluye acceso a las hojas de datos (Data Sheet), si estas han sido instaladas ya sea en línea o residente en la máquina donde se este evaluado el dispositivo.

Octubre 2001 Página 32

FV386FX lnte1386TM FX rwrswrrdlrw

lt1te1386~ EX Embedded Microprocessor

Datasheet

AI seleccionar este icono se entra a una sección llamada preguntas y respuestas, la cual, como su nombre lo indica contiene las repuestas a las preguntas, más importantes para poder desarrolla un diseño con el ApBUILDER. La ventana que se desplegará es en tabla de contexto forma de hipertexto, el cual contiene una lista para cada periférico del dispositivo seleccionado. Si al oprimir el icono se tiene seleccionado un periférico, entonces se ira directamente a la sección específica.

Cuando se oprime este icono y se tiene seleccionado un componente del dispositivo, se depliega una pequeña ventana, con información acerca de la arquitectura de dicho componente. Esto también funciona si primero se selecciona el icono y después el dispositivo.

AI presionar este icono se accesa a una nueva ventana, llamada, editor de periféricos, por medio de la cual se puede, estudiar la configuración apropiada para el periférico que se haya escogido o cambiarla, según se requiera.

Octubre 200 1 Página 33

~ " .~ - - -

FV386FX lnte1386TM FX

C H

Como se puede observar, esta ventana consta de varios componentes visuales cuyo funcionamiento es:

A. -Radio Buttons. - El periférico seleccionado puede funcionar en mas de un modo, por lo que con esto componentes se puede seleccionar el modo en el que se requiere.

B. -Check Boxes. - Se despliegan una serie de estos componetes, que representan las opciones del periférico, de tal forma que se pueden habilitar o deshabilitar.

C. Combo Box y Drop Down List Box. - También nos sirve para seleccionar cierta opcion de las lista que se despliega por el componente.

D. Edit Text Box. - Se puede capturar algun valor que se requiera.

E. Language. - Selecciona el lenguaje del código del periferico, este puede ser en ensamblado en en codigo tipo C.

F. Descripgtion Box. - Este componente es la parte que aparcere bajo Language, y es donde se despliega la información adicional, acerca de cada uno de los componentes de la ventana.

G. Botón Showcode. - AI oprimir este botón se abre una nueva ventana en la cual se despliega el código que se ha generado a partir de las opciones que se han seleccionado para el periférico.

Octubre 2001 Página 34

~.~ "

FV386FX lnte1386TM EX brawudrww

H. Botón Copy. - Si se requiere guardar el código en una aplicación aparte, al presionar este botón, se copia en el portapapeles, y así poder pegarlo.

LOS botones que no se mencionan, tienen una funcionalidad generica en todas las aplicaciones.

A continuacion, se despliega un ejemplo, tomando el Timer O del microprocesador 80386EX

AI Seleccionar este icono, se entra a una nueva ventana en la que se puede .~- estudiar y manipular los registros del sipositivo, bit a bit. Los componentes de esta

ventana y sus funciones, son las siguientes:

Octubre 200 1 Página 35

A FV386FX lnte1386TM FX EwsrrpyI#dwlq(y

H

A. - Una barra de Menús en la que encuentran tres opciones:

1 ) List By.- La forma en la que aparecerán los registros, está determinadoG, por las opciones de este menú, de esta forma se podrán ver alfabétivamente a estos, ya sea por su descripción o por su mnemónico.

2) Find .... - Esta opción nos proporciona una sencilla forma de encontrar un registro, al mostrarse una ventana, donde ya se capturando el nombre dell registro o buscandólo en una lista se puede acceder a él. Una vez que se ha selecionado el registro, se presiona el botón OK, y el la ventana de registros, se visualizarán sus características .

Octubre 2001 Página 36

FV386FX inte1386TM FX wnracurrawrw

3) Options. - Las opciones que se presentan en este menú, son para establecer de que modo se aplicarán los cambios hechos a la configuración de un registro, cuando se ha dejado de trabajar con el, de tal forma que siempre se guardarán (always save), nunca se guardarán (never save), o se preguntará si se desea guardar (query save).

B. - El campo de registros. - En este componente se puede escoger algunos de los registros del componente.

C. Indica q w tipo de registro es con el q w se está trabajando.

D. indica la direccion del registro y su valor de inicialización.

E. Se indican los bits del registro, el mas significativo es el que se encuentra a la izquierda, debajo de cada uno de ellos se encuentra en nmenómico con que se identifica.

F. Indica el valor hexadécimal que tiene el registro.

G. En este componente se describe la funcionalidad del bit seleccionado en ese momento.

H. En la parte superior de este componente se puede escoger el leguaje, en que se codificará la instrucion para el registro.

I. Este botón sirve para seleccionar la función que se requiere, como por ejemplo una lectura, escritura, etc ...

Octubre 2001 Página 37

EiemDlo:

/Instruction1

A partir de este icono se accede a una ventana en la cual se puede conocer las instrucciones con las que puede trabajar el dispositivo, los componetes de esta ventana son, (la imagen se muietra en la siguiente página):

A. - Aparece la descripción y las opciones de operación de la descripción.

B. - Es una lista, mediante la cual se puede escoger la instrucción con la que se quiere trabajar.

C. - Es una lista de los formatos para los operandos con los que puede trabajar la instrucción.

D. - La lista de los operandos.

E. - Los tiempos de reloj que ocupa la instrucción y la frecuencia del dispositivo.

Octubre 200 1 Página 38

FV386EX lnte1386TM FX cGi-ii* F. - El ancho del canal de datos.

A

B

C

D E

ejemplo:

~~

Octubre 200 1 Página 39

FV386EX lnte1386TM F X fyvsyllllltlLw

Con este icono se accede a una procesador de texto, para codificar las inStrCCiones para el dispositivo.

Alseleccionarlo se accede a la ayuda, en la cual se puede consultar todo lo que se ha descrito en este documento , acerca del ApBUILDER.

3) Finalmete, encontramos el área de trabajo, en el cual aparace el diagrama del dispositivo seleccionado (ya sea un microcontrolador o un microprocesador), desglosado en cada uno sus componentes, como son los puertos, lod timers, los canales, etc ...

FLASHLDR

A continuación se describirá las características del Software que viene adjunto con la Fk, Q \"?

tarjeta de evaluación EV80386EX. Para instalar este Software en necesario introducir en el unidad 2 de 3 %, el disco con título Intel386EXFlashUtility, y ejecutar el comando Install, de esta forma & :'; comenzará el proceso de instalación, durante el cual es posible indicar la ruta donde se alojara el ,? k Software, sino se indica la ruta será C:\lntel\EV386EX.

Se podrá ver que se han creado cuatro subdirectorios los cuales son: c $. E ',

:: Q# *...

DEMOS. - Contiene archivos ejemplo para cargar un bios o sistemas operativos a la tarjeta. ..-(I f

I - I .

v.*

'$ * -

DESING. - Aquí se pueden encontrarla información de diseño de la tarjeta de evaluación EV386EX, como algunos diagramas y ecuaciones PLD, etc.

EXAMPLE. - Se incluye un programa de ejemplo, con las instrucciones para construirlo, cargarlo y ejecutarlo en la tarjeta

FLASH. - Este directorio contiene la aplicación principal (FLASHLDR), mediante la cual se podrá interactuar directamente con la tarjeta a través de una P C , usando los comandos con los que se cuentan (archivos '.FLC). Tambien se puede cargar el archivo HELLO.HEX, que es un ejemplo. Para poder trabajar es necesario cargar a la tarjeta los archivos 386TARG.BIN and 386TARG.HEX, que permitirán reporogramar el dispositivo trabajar con el.

Octubre 200 1 Página 40

EV386FX lnte1386TM EX fwr~lsww

Nota: Posteriormente se entrará a una explicación más a detalle sobre los archivos que se encuentran en estos directorios.

Características de FLASHLDR V2.0:

Las siguientes sw algunas de las característiws de esta aplicación:

Controlador de interrupciones para el de interrupciones para el servidor de comunicaciones.

Alcanza los 57600 baudios utilizando windows. Si ocasionalmente ocurre un error, hay que tratar de ejecutarlo con la opción "Exclusive", en el menú de control de ventanas del DOS o con de un archivo *.PIF. Los nombre de los puertos comlpoll, com2poll, etc, deben ser usados para acceder al modo de manejador de encuesta antiguo.

Bloque de 'arranque reporoqramable.

El bloque de arranque puede se reprogramado, a través de la manipulación de la memoria.

Memoria virtual para el dispositivo (Tarieta EV386EX).

Un bloque flash es ta amplio como la memoria RAM disponible y esta puede ser programada. Si durante el usa de la tarjeta no es suficiente su memoria, se utiliza parte de la memoria RAM de la P C o maquina que se utilizando como interfase.

Archivos de commando de Flash.

Si un error de comando ocurre en un archivo *.flc, los demás comandos son abortados. Si se necesita que el archivo *.flc continúe de cualquier forma, es necesario agregar un símbolo de cierre de admiración I ! ' al comando, y de esta forma cualquier error será ignorado, ya que se inhabilita la posibilidad de que se detenga el proceso esperando alguna confirmación.

Procesamiento de archivos HEX rápido.

AI procesar los archivos HEX, y bajarlos a la memoria virtual para la tarjeta lo hace de forma eficiente y así se consigue buena velocidad en este proceso.

Octubre 2001 Página 41

FV386EX lnte1386TM FX frwrPlrru4-

Comando ‘boot’

Permite un inmediato arranque del sistema en la tarjeta y ejecución de algún programa. Con esto se logra que no sea necesario verificar que se haya inicializado correctamente alguno de los procesos.

Comando ‘update’. - ‘ V .

Inmediatamente se logra actualizar las tablas de la memoria virtual del flash.

Opción ‘cmdpath’

Se indica el path para los comandos de Flash, (archivos *.flc). Si un archivo *.flc el llamado con los modificadores w/o, en una ruta especifica, la siguiente búqueda es ejecutada:

1 ) Directorio actual

2) Directotios especificados el la opción cmdpath

3) Directorio donde el ejecutable Flasldr se encuentra

Opción ‘porqpath’

Establece el path de busqueda para los archivos *.hex, *.bin, etc, esta búsqueda es similar a la opción cmdpath.

Opción ‘Memory’

Especifica cual es el tipo de memoria para bajar y programas. El valor inicial (memory=flash), quiere decir solo usará los bloques normales del flash, si seleccionamos mernory=boot permite programas una dirección de arranque si la opción es memory=ram permite que los archivos tanto de código como de datos sean bajados a la tarjeta.

comando ‘echo’

Despliega mensajes de usuario que se encuentran en archivos de commando, similar a al echo de DOS.

Octubre 2001 Página 42

FV386EX lnte1386TM FX

EVB21 .NET 1 PROTEL

EVB21 .BOM

U7.ABL 1 PLD

U1 1 .ABL 1 PLD

U 16.ABL

U7.JED

U1 1 .JED 1 PLD

U16.JED PLD

UW

un

Librería de dispositivos utilizados el los esquemas

Lista de pads en formato ASCII, creado usando el NetList de PROTEL

Materiales creados por PROTEL

Archivos creados en lenguaje PLD

.A.

un

U"

Archivos Jedec

un

un

I .O Construyendo la aplicación de ejemplo

El programa de ejemplo fue realizado y probado utilizando la siguientes herramientas:

Microsoft Visual C/C++ Version 1.5 Microsoft Assembler (MASM) Version 6.1 1 Borland C/C++ Version 4.5 Borland Turbo Assembler Version 4.0 Watcom C/C++ Version 10.0 (IDE version 1 .O) Watcom Assembler Version 1 .O - CSI-Locate Version 1.31

Cada ejemplo se encuentra dentro de su mismo directorio:

MSVC86 -- Modo real construido utilizando las herramientas de Microsoft. BCC86 -- Modo real construido utilizando las herramientas de Borland. WCC86 -- Modo real construido utilizando las herramientas de Watcom. WCC386 -- Modo protegido construido utilizando las herramientas de Watcom.

Para ensamblar el programa de ejemplo utilizar los comandos de DOS que requiera cada compilador/ensamblador, y cambiarse al subdirectorio deseado donde:

Octubre 200 1 Página 45

FV386EX lnte1386TM EX tb#W#dW

5b) Dese la lista "Tools:" seleccionar "CSI-Locate" , y dar clic en

5c) Verificar que el cuadro de edit "Path:" contenga la .ruta correcta 5d) Verificar que la caja de texto edit "Command line" sea HELLO-D.CMD

o HELLO.CMD (HELLO-D.CMD para cargarse dentro del depurador, HELLO.CMD para cargarse en la flash).

"Edit"

5e) Dar clic en "OK*, y posteriormente en "Close".

Para utilizar+A CSI-Locate desde el IDE d e . Borland seleccionar el submenú "Tool"-"CSI- LOCATE" desde al barra de menú.

Para utilizar CSI-Locate desde la terminal de commandos para DOS introducir cualquiera de las siguientes opciones.

Si se cargará la aplicación dentro del depurador teclear: CSlLOC HELLO-D.CMD.

Si la aplicación se cargará dentro de la memoria flash teclear: CSlLOC HELLO.CMD.

ó

3.2 INFORMACION IMPORTANTE PARA EL USO DEL IDE DE BORLAND

Cuando se utiliza el código start-up para el IDE de Borland, este código permanece ligado a la largo del start-up incluido en el ejemplo. El IDE de Borland crea los registros de inicialización para inicializar el CS:IP para apuntar al código del start-up del IDE de Borland.

Esto es algo que no conviene realizar, por lo que para encontrar la dirección de inicio correcta es importante seguir los siguientes pasos:

1) Ver el archivo mapa creado por el ligador de Borland, el cual debe ser

2) Localizar el símbolo START y anotar el offset. Para el ejemplo fue 41 h. 3) Ver el archivo mapa creado por el CSI-LOCATE, que ó HELLO.CM 6

4) Localizar el segmento RESET-CODE y anotar el base. 5) Utilizar el base del paso anterior y el offset del paso 2. Para HELLO.CM

fue 8000h:41 h, para HELLO-D.CM fue 09E2h:41 h.

HELLO.MAP

HELLO-D.CM (Por la misma razón que en el paso 5 anterior).

En este momento ya se tendrá la base y el offset correcto para los códigos de ejemplo del start- up. Utilizar esta información cuando se cargue el código dentro de la flash o del depurador.

Cuando se cargue dentro de la flash poner la en la opción VECTOR el valor que se haya determinado antes de ejecutar el comando SETBOOT. Se debe modificar el archivoHELLO.FLC para igualar el valor el CS:IP CS:IP quese haya configurado.

Octubre 2001 Página 49

FV386FX lnte1386TM FX W#wdblllYy

Cuando se carge el código dentro del depurador del CSI Soft-Scope, una vez cargado, se deben siguientes pasos has: Seleccionar el submenú "Data"-"Registers" desde la barra de menú. Dar doble clic sobre "cs". poner el valor de "$cs=" al valor base determinado en la sección de arriba (09E2h). Dar clic en "OK. Dar doble clic sobre "eip". Poner e l valor de "$eip=" al valor delvoffset determinado arriba (41h). Dar click sobre " O K . Se debe revisar el código ensamblador del archivo rStartUp.ASM, después empiécese a

4.0 Utilizando el Ambiente de Desarrollo Integrado (IDE) para Watcom C/C++

4.1 Inicialización y Construcción del Proyecto 1 ) Para modo protegido:

Abrir al archivo de proyecto HELLO.WPJ que se encuentra dentro del directorio EXAMPLE\WCC386.

PaRa modo real: Abrir el archivo de Proyecto HELLO.WPJ que se encuentra dentro del directorio

EXAMPLE\WCC86.

2) Poner la variable de definición -DEBUG- para los archivos fuente "C. Para realizar esto: 2a) Desde la ventana del listado del código fuente con el nombre "HELLO.EXE"

2b) Seleccionar desde el menú "Options"-"C Compiler switches...". 2c) Desde la lista desplegable "Switches for making *.c in target

2d) Modificar la variable _DEBUG-=l bajo "Macro definitions:[-dl" para igualar el valor

parapadeando (esto se hace realizando un clic en) la línea "(.c) [sw]".

HELLO.EXE", seleccionar opción "3. Source Switches".

deseado para el ambiente de construcción (1 para cargarse sobre el depurador del CSI Soft- Scope, O para cargarse sobre la memoria flash)

2e) Dar clic en "OK

3) Poner la variable de definición "DEBUG- para los archivos fuente ASM. Para realizar esto: 3a) Desde la ventana de listado de código fuente con el nombre "HELLO.EXE

3b) Seleccionar desde el menú "Options"-"Assembler switches...". 3c) Desde la lista desplegable "Switches for making *.asm in target

3d) Modificar a agregary la variable _DEBUG-=l bajo "Macro

parpadeando (debido a realizar un clic sobre) la línea "(.asm) [sw]" .

HELLO.EXE", seleccionar la opción "6. Miscellaneous Switches".

definitions:[-dl" para igualar el valor deseado para el ambiente de construcción (1 para cargarse sobre el depurador del CSI Soft-Scope, O para cargarse sobre la memoria flash)

Octubre 2001 Página 50

FV386EX lnte1386TM EX fwawlrratrrvrr

3e) Dar click en "OK". 2 2 5 y $ ] 4) Poner CSI-Locate para ejecutar después de un "make" normal. Par realizar esto:

4a) Desde la barra de menú seleccionar "File"-"After ..." . 4b) Agregar o modificar el comando CSILOC. Especificaró "CSILOC

HELLO-D.CMD" (si se ha puesto -DEBUG- = 1) o "CSILOC HELLO.CMD" (si se ha puesto -DEBUG-=O).

4c) Dar clic en "OK". > ..+

5) Listo para construirse. Para construirse seleccionar el submenú "Targets"-"Make" desde la barra de menú.

4.2 Notas Importantes Acerca de la instalación del proyecto en Watcom . 4.2.1 Depurar el soporte para el proyecto en Modo Protegido. Para habilitar tanto el

depuramiento como las funciones en línea, el depurador ha sido inhabilitado desde la pantalla "Debugging Switches" y habilitado desde la consola "Miscellaneous Switches" "-d2". Se realizó debido a que "-d2" aparece después del parámetro "-o¡" del

Fue realiza do para que el control "-o¡" apareciera después que el control "-d2" . compilador, por lo que el control the "-oil' es ignorado. Cambiando el lugar en el proyecto

4.2.2 Úsese el IDE de Watcom para construir el ejemplo en modo real. La utilidad CSI-Locate puede se utilizada si se utiliza el IDE Watcom para construir el ejemplo

en una operación de modo real.

DesempeñoAgregado : Desconocido.

5.0 Descripción de los archivos incluidos Código del Start-up en Lenguaje Ensamblador

rStartUp.ASM Código de instalación en Modo Real StartUp.ASM Código de instalación en Modo Protegido

Archivos fuente en "C" Hel1o.c El programa principal Seria1.c Rutinas de manejo del Puerto serial Timer.c Unidad de rutinas para el manejo del TimerKounter 1cu.c Unidad de rutinas para el manejo de control de interrupciones rSet1ntr.c

Rutina del vector para la interrupción para establecer el Modo-Real pSet1ntr.c Rutina del vector para la interrupción para establecer el Modo-Protegido

Archivos Include . "C" archivos include *.H, Archivos de ensamblador *.INC

80386EX.INC Archivos de inclusión para la compatibilidad para el ApBUlLDER 80386EX.H Archivos de inclusion para la definición de los registros del 80386EX

EV386EX.H Define símbolos y funciones utilizados en el ejemplo EV386EX.INC El programa.

Octubre 2001 Página 5 1

EV386FX lnte1386TM EX fwnlwrrdllrsw

Archivo de Comandos Flash

desde FlashLdr Hello.FLC Archivo utilizado pra la carga de programas dentro de la memoria flash

Archivos para la construcción de programas de ejemplo Build.bat Para Contruir el prograwde ejemplo utilizando las herramientas basadas en

DOS MSVC86. bat Para correr en DOS utilizando basándose en el compilador Microsoft "C" BC86.bat Para correr en DOS utilizando basándose en el compilador Borland "C"

WC86. bat Para correr en DOS utilizando basándose en el compilador Watcom 86 "C WC386.bat Para correr en DOS utilizando basándose en el compilador Watcom 386 'IC"

HELLO.CMD Archivo de comandos del CSI-Locate para cargarse dentro de la flash Compiler

HELLO-D.CMD Archivo de comandos del CSI-Locate para cargarse dentro del depurador de Soft-Scope

HELLO.FLT Archivo de comando para el ligado

Archivos del Proyecto para el IDE de Microsoft para construir el programa de ejemplo HELLO.MAK Abre este archivo HELLO.VCW HELLO.WSP

Archivos del Proyecto para el IDE de Borland para construir el programa de ejemplo

HELLO.IDE

Archivos del Proyecto para el IDE de Watcom para construir el programa de ejemplo

HELLO.WPJ Abre este archivo HELLO.TGT

Archivos de Texto - Readme.txt En texto estándar ANSI Readme.wri En formato de escritura Microsoft

Octubre 200 1 Página 52

APÉNDICE A

Software de Evaluación

(Tarjetas con procesador EX, BIOS 2.2 y DOS 2.2)

Octubre 200 I Página 54

A FV386FX lnte1386TM FX frr"

General Software

A continuación se dan las instrucciones para el uso del software de evaluación para tarjetas de procesador EX, BIOS 2.2 Y DOS 2.2.

Propósito: - m Y - c

Se explicará como trabajar con la tarjeta de evaluación 80C386-EX de Intel y los productos de General Software

Los dos archivos suministrados con este demo están en formato DHEX de Intel; Este es exactamente el tipo requerido para que le programa utilitario FLASLDR de Intel pueda instalarlo en la tarjeta de evaluación EX.

Después de instalar el software, se puede arrancar la tarjeta de evaluación utilizando el BIOS y el DOS de General Software, desde la memoria flash y comenza a usar la tarjeta.

Requerimientos de hardware:

l . Un cable conectado del puerto COMl de la computadora principal al puerto de depuración (P2) de la tarjeta de evaluación EX de Intel (MB1). El cable debe ser de trayectoria directa. La salida de video y entrada de teclado del BIOS y DOS serán ruteados a través de esta conexión por el BIOS. El BIOS generará secuencias de escape ANSI, para la posición del cursor. n

2. Una conexión estándar de poder para PC, es necesaria para conectarla al jumper J3, con los voltajes apropiados. Si no se cuenta con una de estas conexiones, simplemente hay que buscar un PC que no se utilice, quitar la alimentación de la tarjeta madre y usarla. Se utilizarán las conexiones de +/- 5v y la de +/- 12V.

Procedimiento:

Octubre 2001 Página 55

EV386FX lnte1386TM F X fy)flly(llulgy

1 . Colocar el jumper JP! Sobre la tarjeta de evaluación. Esto configurará a la tarjeta de evaluación en el modo de carga y así el programa FLASHLDR se podrá almacenar datos en flash.

2. Hacer lasonexión la terminal 9 (depuración), del puerto serial (P2), al puesto serial de la computadora principal por medio de un-able serial. Ya sea que se utilice el puerto COMl o el puesto COM2 de la computadora principal.

3. Aplicar la alimentación a la tarjeta de evaluación.

4. Ejecutar el programa FLASHLDR desde la computadora principal. Ahora la lista completa de los comandos que se deben ejecutar para realizar la carga completa de los productos BIOS y DOS, de General Software a la tarjeta de evaluación, lo que aparece después de las dobles diagonales, se interpretan como comentarios:

FLASH CMD: PORT=COMl //Selecciona el Puerto com apropiado

FLASH CMD: BAUD=9600 //Establece la velocidad de baudios

FLASH CMD: INlT //Inicializa las comunicaciones

FLASH CMD: LoadDemo //Carga los programas a la tarjeta de evaluación

5. Después de bajar el software, apagar la tarjeta.

6. Ejecutar algún programa de emulación de terminal que podría ser el PROCOMM, el CroosTalk o el Windows Terminal, o utilizando el comendo VT dentro del programa FLAHLDR. FLASHLDR, no soporta las secuencias del estancar ANSI, ya que el BIOS está configurado para reconocer secuencias a partir del cursor direccionando las funciones de video. Para mejores resultados, utilizar programas de MODEM propios. Asegurándose que se está especificando el mimo puerto COM, al que la tarjeta de evaluación se encuentra conectada.

7. Encender la tarjeta. Se observará que la tarjeta de evaluación arranca con el BIOS, a través del POST, y se iniciará el DOS, con el AUTOEXEC.BAT y se imprimirán en pantalla algunas sugerencias para comenzar a trabajar con la tarjeta de evaluación EV386EX de

Octubre 2001 Página 56

FV386FX lnte1386TM FX crumsrr

Intel.

8. Si se tienen algunas preguntar, llamar a General Software al teléfono (206) 3914205.

Octubre 200 1 Pagina ~ 57

FV386FX lnte1386TM EX

Y '

APÉNDICE B

Programas de la tarjeta EV386EX

;;Embedded lnte1386[tm] EX Evaluation processors ;;Modifying the 386EX[tm] Processor Evaluation Board ;;Coding Example to Run Using Assembly Alone

Octubre 200 1 Página 58

A ;;Este código ejemplo es encontrado con el procesador 386EX de la tarjeta de ;;evaluación-. Se encuentra en el directorio ev386ex\example\msvc86.

..................................... rstadup.asm ********C*******C***********t** 1 )

;; Copyright (C) Intel Corporation 1994 ;; All Rights Reshed. ;; The Software is provided "AS IS."

' V

.186 name Startup .XLIST

;;; Include 80386ex register definitions and register getlset macros include 80386ex.inc

;;; Include EV386EX board specific definitions and macros include EV386EX.inc

.LIST

; ;extrn -DataSeg:WORD ; ;public a c r t u s e d ;* Required for Microsoft C .. 1- acrtused equ O

stack segment para stack 'stack' STACK-SIZE equ 4*1024 public stack-top ;Symbol marks initial top of stack. db STACK-SIZE dup (?) stack-top label word stack ends

;extrn -main:FAR

RESET-CODE segment word 'code' assume CS:RESET-CODE

public -HelloString - Hellostring db "Hello from the EV386EX Rev. 2.1 Evaluation Board",ODh,OAh,O

START LABEL FAR ;;inicializando etiqueta para las herramientas ;; CS:IP S inicializadas al segmento correcto Segment:offset ;; cuando llamamos el programa vía flashu jmp FAR PTR LoadCS-IP LoadCS-IP:

Octubre 2001 Página 59

A F V 3 8 6 F F

cli ;; deshabilitando interupciones

;out ;IF "DEBUG- ;; inicializando la pila. Normalmente configurar primero el chip mov ax, seg stack mov SS, ax mov sp, ss:stack top ;ENDIF T 'V.

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

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . f t

EV386EX initialization code **********tt************

t 9

;; configurando la operación de la dirección A20 - SetEXRegByte 92h, OOH ;; Bit 1: =1 A20 no modificado, =O A20 siempre O

; Bit O: =1 causa un CPU only reset.

;; Habilitando el acceso a los registros peripheral y direcciones I/O MOV AX, 8000H OUT REMAPCFGH, AL XCHG AL, AH OUT REMAPCFGL, AL OUT REMAPCFGL. AX

;; Watch Dog Timer Status = Disabled - SetEXRegByte WDTSTATUS, 01H

;Inicializa el Refresh Control Unit para: ; dirección Refresh 0000H. ; Refresh gate between rows is 15.6uSec ; Usando un CLK2 frecuencia de 50 MHz (25Mhz operación de CPU) ; habilitando la unidad de control del refresh ; la terminal refresh no se usa

- SetEXRegWord RFSCIR, 390 ;Programa el intervalo refresh - SetEXRegWord RFSBAD, OOH ;Programa la dirección base

- SetEXRegWord RFSCON, 8000H ;Programa habilitar el bit.

*

- SetEXRegWord RFSADD, OOH ;Programa el registro de direcciones

;inicializa Clock y Power Management Unit para: ; Clock frecuencia de 50 MHz ; prescalar el clock output of 1 .I 9318 MHz (Matches standard PC configuration) ; Posiblemente afecte la operación de Timer/Counters & SS10

- SetEXRegByte PWRCON, OOH - SetEXRegWord CLKPRS, 15H

Octubre 2001 Página 60

A FV386FX lnte1386TM FX wmuw

.. **************** 1 ) Inicializa la configuración de terminales******************* ;inicializa 110 Puerto 1 para: ; TERMINAL O = 1, DCDO ;; Si usa SI0 O es para comunicaciones ; TERMINAL 1 = I, RTSO ;; Si no usa SI0 O se ponen terminales 0-4 2 2 5 9 0 8 ; TERMINAL 2 = 1, DTRO ;;Como puerto de terminales. Use ApBUlLDER para modificar ; TERMINAL 3 = 1, DSRO ; TERMINAL 4 = 1, RIO ; TERMINAL 5 = O, OutPort (FLASH Vpp Enable, O=Enable 1 =Disable) ; TERMINAL 6 =%, OutPort (PIG-HOLD to EV36EX option header JP7 terfinal 5) ; TERMINAL 7 = O, OutPort (P17-HLDA to EV386EX option header JP7 terminal 3)

- SetEXRegByte P I LTC, OFFH - SetEXRegByte P I DIR, OOH - SetEXRegByte P I CFG, O 1 FH

;inicializa 110 Puerto 2 para: ; TERMINAL O = O, OutPort (P20_CSO# to EV386EX option header JP7 terminal 11) ; TERMINAL 1 = O, OutPort (P21_CSI# to EV386EX option header JP7 terminal 9) ; TERMINAL 2 = 1, CS2# (SMRAM) ;; si no usa CS2 puede configurarlo como puerto I/O ; TERMINAL 3 = O, OutPort (No Connect) ; TERMINAL 4 = 1, CSM (DRAM) ; TERMINAL 5 = 1, RXDO input ;; para 1/0 port 1 terminales 0-4 ; TERMINAL 6 = 1, TXDO output ; TERMINAL 7 = 1, CTSO# input

- SetEXRegByte P2LTC, OFFH - SetEXRegByte P2DIR, OOH - SetEXRegByte P2CFG, OF4H

;inicializa I/O Puerto 3 para: ; TERMINAL O = O, InPort JPI pullup (Downloader: out,O=Bypass in,l=Execute) (P31-TOO to ;386EX option header J7 terminal 25) ; TERMINAL 1 = O, OutPort (P31-TOI to EV386EX option header J7 terminal 23) ; TERMINAL 2 = 1, OutPort (P32-11 to EV386EX option header J7 terminal 21) ; TERMINAL 3 = 1, lNTl (P33-15 to EV386EX"option header J7 terminal 19) ; TERMINAL 4 = 1, INT2 (P34-16 to EV386EX option header J7 terminal 17) ; TERMINAL 5 = 1, INT3 (P35-17 to EV386EX option header J7 terminal 15) ; TERMINAL 6 = O, InPort (Debugger Break P36-PWRD to EV386EX option header J7 terminal 13) ; TERMINAL 7 = 1, COMCLK input of 1.8432 Mhz OSCl oscillator. ; ;; se usa COMCLK como el fuente para el puerto serial

- SetEXRegByte P3LTC, OFFH - SetEXRegByte P3DIR, 41 H - SetEXRegByte P3CFG, OB8H

; inicializa configuración de terminales Peripheral ; TERMINAL O = O, SSIOTX ; TERMINAL 1 = O, SRXCLK

Octubre 200 1 Página 61

FV386FX lnte1386TM EX "14wr

; 51 2KB of flash & 51 2KB of RAM ;solamente usa UCS y CS4

- SetChipSelects REAL, O, 512, 512

....******** I l l 1 Finaliza inicialización de la tarjeta EV386EX ********

.. *********** I t Código de Aplicación ************ mov ax, SEG sta'ck mov SS, ax mov sp, OFFSET ss:stack-top ; mov ax, SEG -DataSeg ; mov ds, ax ; mov es, ax MOV CX,5 LOOP1 :

.*-

PUSH CX MOV CX,03FFFH ; Reatardo de 3FFFFFH

PUSH CX MOV CX,OFFH

LOOP2:

;LOOP3: LOOP LOOP3 POP cx ; LOOP LOOP2

- SetEXRegByte P2LTC, OF7H

MOV CX,03FFFH ;retardo de 3FFFFFH LOOP4:

PUSH CX MOV CX,OFFH

;LOOP5 LOOP LOOP5 POP cx ; LOOP LOOP4

- SetEXRegByte P2LTC, OFFH

-

POP cx LOOP LOOP1

; jmp FAR PTR -main

RESET-CODE ends

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . I

jmp

end START ;; Embedded lnte1386[tm] processors ;;ecuaciones y macros que simplifican la programación en ensamblador de ;lnte1386(TM) ;;este programa usa direcciones en hexadecimal directamente como instrucción

Octubre 200 1 Página 63

FV386EX lnte1386TM FX twsrwullrw

;; Copyright (C) Intel Corporation 1994 ;; All Rights Reserved. ;; The Software is provided "AS IS."

..................................... registros.asm ..................................... I S

; 80386EX Register definitions ;%*DEFINE(SetEXRegWord - I ) (reg,val))( ; mov dx,%reg ~

; mov ax,%val ; out dx,ax ;) .o , /o * DEFlNE(SetEXRegByte (reg,val))( ; mov dx,%reg ; mov al,o/oval ; out dx,al ; I

- SetEXRegByte MACRO reg, val

IFlDNl cal>,<&val> ;; If value is the al don't reload it IF reg GT 255 ;; Check if DX needs to be loaded mov dx, reg out dx, al ELSE out reg, al ENDIF ELSElFlDNl <ax>,<&val> ;; If value is the ax don't reload it IF reg GT 255 ;; Check if DX needs to be loaded mov dx, reg out dx, al ELSE out reg, al ENDIF ELSE ;; Value is NOT the AX or AL mov al, val IF reg GT 255 ;; Check if DX needs to be loaded mov dx, reg out dx, al ELSE out reg, al ENDIF ENDIF ENDM - SetEXRegWord MACRO reg, val IFlDNl cax>,c&val> ;; If value is the AX don't reload it IF reg GT 255 ;; Check if DX needs to be loaded mov dx, reg

*

Octubre 2001 Página 64

FV386FX lnte1386TM EX m out dx. ax ELSE out reg, ax ENDIF ELSE ;; Value is NOT the AX, therefore load it mov ax, val IF reg GT 255 ;; Check if DX needs to be loaded mov dx, reg out dx, ax ELSE out reg, ax ENDIF ENDIF ENDM

” ‘ V

; mapeando las direcciones de los registros REMAPCFGH EQU 0023H REMAPCFGL EQU 0022H REMAPCFG EQU 0022H

; interrupciones registros de control -- SLOT 15 ( direcciones) ICW 1 M EQU OF020H ICWlS EQU OFOAOH ICW2M EQU OF021H ICW2S EQU OFOAIH ICW3M EQU OF021 H ICW3S EQU OFOAI H ICW4M EQU OF021 H ICW4S EQU OFOAIH OCWI M EQU OF021 H OCW 1 S EQU OFOAl H OCW2M EQU OF020H OCW2S EQU OFOAOH OCW3M EQU OF020H OCW3S EQU OFOAOH &

;interrupciones registros de control -- SLOT O (direcciones) lCWl MDOS EQU 0020H ICW 1 SDOS EQU OOAOH ICW2MDOS EQU 0021H ICW2SDOS EQU OOAIH ICW3MDOS EQU 0021H ICW3SDOS EQU OOAlH ICW4MDOS EQU 0021H ICW4SDOS EQU OOAlH OCWI MDOS EQU O021 H OCWI SDOS EQU OOAl H OCW2MDOS EQU 0020H

Octubre 2001 Página 65

OCWZSDOS EQU OOAOH OCW3MDOS EQU 0020H OCW3SDOS EQU OOAOH

; configuración de registros DMACFG EQU OF830H INTCFG EQU OF832H TMRCFG EQU O_F834H SIOCFG EQU OF836H PICFG EQU OF820H P2CFG EQU OF822H P3CFG EQU OF824H PINCFG EQU OF826H

' U

; WATCHDOG registros del TIMER WDTRLDH EQU OF4COH WDTRLDL EQU OF4C2H WDTCNTH EQU OF4C4H WDTCNTL EQU OF4C6H WDTCLR EQU OF4C8H WDTSTATUS EQU OF4CAH

;registros de control del TIMER -- SLOT 15 (direcciones) TMRO EQU OF040H TMRI EQU OF041H TMR2 EQU OF042H TMRCON EQU OF043H

;registros de control del TIMER -- SLOT O (direcciones) TMRODOS EQU 0040H TMRI DOS EQU 0041 H TMRZDOS EQU 0042H TMRCONDOS EQU 0043H

; puerto I/O unidad de registros P I PIN EQU OF860H PILTC EQU OF862H P I DIR EQU OF864H P2PIN EQU OF868H P2LTC EQU OF86AH P2DIR EQU OF86CH P3PIN EQU OF870H P3LTC EQU OF872H P3DIR EQU OF874H

; serial asíncrono CHANNEL O -- SLOT 15 (direcciones) RBRO EQU OF4F8H THRO EQU OF4F8H

Octubre 200 1 Página 66

FV386FX lnte1386TM FX fwlwyllylw

TBRO EQU OF4F8H DLLO EQU OF4F8H IERO EQU OF4F9H DLHO EQU OF4F9H IlRO EQU OF4FAH LCRO EQU OF4FBH MCRO EQU OF4FCH LSRO EQU OF4FDH MSRO EQU OF4FEH SCRO EQU OF4FFH

v

;serial asíncrono CHANNEL O -- SLOT O (direcciones) RBRODOS EQU 03F8H THRODOS EQU 03F8H TBRODOS EQU 03F8H DLLODOS EQU 03F8H IERODOS EQU 03F9H DLHODOS EQU 03F9H IIRODOS EQU 03FAH LCRODOS EQU 03FBH MCRODOS EQU 03FCH LSRODOS EQU 03FDH MSRODOS EQU 03FEH SCRODOS EQU 03FFH

;serial asíncrono CHANNEL 1 -- SLOT 15 (direcciones) RBRI EQU OF8F8H THRI EQU OF8F8H TBRI EQU OF8F8H DLLl EQU OF8F8H IERl EQU OF8F9H

DLHl EQU OF8F9H I lRl EQU OF8FAH LCRl EQU OF8FBH MCRI EQU OF8FCH LSRI EQU OF8FDH MSRI EQU OF8FEH SCRI EQU OF8FFH

L

;serial asíncrono CHANNEL 1 -- SLOT O (direcciones) RBRI DOS EQU 02F8H THRI DOS EQU 02F8H TBRI DOS EQU 02F8H DLLl DOS EQU 02F8H IERIDOS EQU 02F9H DLHl DOS EQU 02F9H l lRl DOS EQU 02FAH LCRI DOS EQU 02FBH

Octubre 200 1 Página 67

FV38EX lnte1386TM FX "laraw

MCRI DOS EQU 02FCH LSRIDOS EQU 02FDH MSRI DOS EQU 02FEH SCRlDOS EQU 02FFH

;serial síncrono CHANNEL SSIOTBUF EQU OF480H SSIORBUF EQU OF482H SSIOBAUD EQlr'OF484H SSlOCONl EQU OF486H SSIOCON2 EQU OF488H SSIOCTR EQU OF48AH

;registros del CHIP SELECT CSOADL EQU OF400H CSOADH EQU OF402H CSOMSKL EQU OF404H CSOMSKH EQU OF406H CS1 ADL EQU OF408H CSlADH EQU OF40AH CS1 MSKL EQU OF40CH CS1 MSKH EQU OF40EH CS2ADL EQU OF410H CS2ADH EQU OF412H CS2MSKL EQU OF414H CS2MSKH EQU OF416H CS3ADL EQU OF418H CS3ADH EQU OF41AH CS3MSKL EQU OF4lCH CS3MSKH EQU OF41EH CS4ADL EQU OF420H CS4ADH EQU OF422H CS4MSKL EQU OF424H CS4MSKH EQU OF426H CS5ADL EQU OF428H CS5ADH EQU OF42AH CS5MSKL EQU OF42CH CS5MSKH EQU OF42EH CS6ADL EQU OF430H CSGADH EQU OF432H CSGMSKL EQU OF434H CSGMSKH EQU OF436H UCSADL EQU OF438H UCSADH EQU OF43AH UCSMSKL EQU OF43CH UCSMSKH EQU OF43EH

;registros de control del REFRESH

n

Octubre 2001 Página 68

EV386EX lnte1386TM FX Enwrr#lmw

RFSBAD EQU OF4AOH RFSCIR EQU OF4A2H RFSCON EQU OF4A4H RFSADD EQU OF4A6H

;registros de control del POWER MANAGEMENT PWRCON EQU OF800H CLKPRS EQU OF804H ;registros de DM& -- SLOT 15 (direcciones) DMAOTAR EQU OFOOOH DMAOBYC EQU OF001 H DMAlTAR EQU OFOOZH DMAlBYC EQU OF003H DMACMDl EQU OF008H DMASTS EQU OF008H DMASRR EQU OF009H DMAMSK EQU OFOOAH DMAMODl EQU OFOOBH DMACLRBP EQU OFOOCH DMACLR EQU OFOODH DMACLRMSK EQU OFOOEH DMAGRPMSK EQU OFOOFH DMAOREQL EQU OFOlOH DMAOREQH EQU OFOl 1 H DMAl REQL EQU OFOl 2H DMAl REQH EQU OF013H DMABSR EQU OFOl 8H DMACHR EQU OF019H DMAIS EQU OF019H DMACMDZ EQU OFOlAH DMAMOD2 EQU OFOlBH DMAIEN EQU OFOICH DMAOVFE EQU OFOlDH DMACLRTC EQU OFOl EH DMAlTARPL EQU OF083H DMAITARPH EQU OF085H DMAOTARPH EQU OF086H DMAOTARPL EQU OF087H DMAOBYCH EQU OF098H DMAlBYCH EQU OF099H ; registros de DMA -- SLOT O (direcciones) DMAOTARDOS EQU OOOOH DMAOBYCDOS EQU O001 H DMAITARDOS EQU 0002H DMAl BYCDOS EQU 0003H DMACMDl DOS EQU 0008H DMASTSDOS EQU 0008H DMASRRDOS EQU 0009H

Octubre 2001 Página 69

386FX lnte1386TM FX

DMAMSKDOS EQU OOOAH DMAMODlDOS EQU OOOBH DMACLRBPDOS EQU OOOCH DMACLRDOS EQU OOODH DMACLRMSKDOS EQU OOOEH DMAGRPMSKDOS EQU OOOFH DMAITARPLDOS EQU 0083H DMAOTARPLDOS - EQU 0087H

; A20 gate and fast CPU reset -- SLOT 15(direcciones) PORT92 EQU OF092H

. % .

; A20GATE and fast CPU reset -- SLOT O (direcciones) PORT92DOS EQU 0092H

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . / ;; Embedded lnte1386[trn] processors ;;código ejemplo que ilustra la transferencia de DMA a memoria ;;inicialización de la unidad DMA ;; The Software is provided "AS IS."

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . dmaSasm t******ct*tlrH***mm**cz*c*flr****w*t*rc

.I86 9

.XLIST ;;; Include 80386ex register definitions and register get/set macros include 80386ex.inc ;;; Include some more 80386ex dma register definitions include dma386ex.inc .LIST

STACK SEGMENT STACK DW 4096 STACK ENDS

DATA SEGMENT ZERO-TO-FOUR DB '0','1','2 !1,'31,1

CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,SEG DATA ;Inicializa el registro DS MOV DS,AX MOV SI,OFFSET ZERO-TO-FOUR ;Set SI to point to ZERO-TO-FOUR

Octubre 200 1 Página 70

FV38SFX lnte1386TM FX "IIYIW

MOV D1,1600 ;Display ZEROJO-FOUR at line 10 MOV CX,10 ;Show 10 bytes of ZEROJO-FOUR ZTFl: MOV AL,[SI] ;Move displayed byte to AL CALL DISPLAY-8-BITS-OF-AL ;Display the byte ADD D1,20 ;Increment the screen address INC SI ;Point to the next character LOOP ZTFl

;DMACMDl ~ 1 2 % ;bits 7-5 podrían escribirse con ceros ;bit4 deshabilita la rotación de prioridad para el bus ;bit3 podría ser cero ;bit2 deshabilita los canales ;bits 1-0 podrían ser ceros

' y '

- SetEXRegByte DMACMDl, 4 ;DMACMDl p12-35

;DMACFG p. 13-32 ;este registro configura hardware

;DMACLRBP pp. 12-33,12-50 ;este registro escribe algún dato en el puerto y limpia el byte pointer - SetEXRegByte DMACLRBP, OFH

;DMAOREQO, DMAOREQl , DMAOREQ2, DMAOREQ3 p.12-33 ;la dirección de DATA se obtiene como un segmento par-offset y es transferida como una ;dirección física

MOV AX, SEG DATA ;mueve el segmento DATA a ax MOV DX, OFFSET ZERO-TO-FOUR SHL AL, 4 ADD AL, DL

- SetEXRegByte DMAOREQO, AL

;calcula el top word de la dirección física MOV A X , SEG DATA MOV DX, OFFSET ZERO-TO-FOUR SHR DX, 4 ADD AX, DX SHR AX, 4

L

- SetEXRegByte DMAOREQl, AL ;escribe en el byte medio de la dirección

- SetEXRegByte DMAOREQ2, AH ;escribe en el byte tope de la dirección

- SetEXRegByte DMAOREQ3, OOH ;escribe O en el byte tope en modo real

Octubre 200 1 Página 71

FV386EX lnte1386TM FX twrr#rrd!lw@

;DMAOTARO, DMAOTARl, DMAOTAR2, DMAOTAR3 p.12-33 MOV AX, SEG DATA MOV DX, OFFSET FIVE-TO-NINE SHL AL, 4 ADD AL, DL

- SetEXRegByte DMAOTARO, AL ;escribe en el byte bajo de la dirección

MOV AX, SEG EATA ' T .

MOV DX, OFFSET FIVE-TO-NINE SHR DX, 4 ADD AX, DX SHR AX, 4

- SetEXRegByte DMAOTARl, AL ;escribe en el byte medio de la dirección - SetEXRegByte DMAOTAR2, AH ;escribe en el byte tope de la dirección - SetEXRegByte DMAOTAR3, OOH ;escribe O en el byte tope como en modo real

;DMAOBYCO, DMAOBYCl, DMAOBYC2 p.12-33 - SetEXRegByte DMAOBYCO, OAH - SetEXRegByte DMAOBYCl, OOH - SetEXRegByte DMAOBYC2, OOH

;DMAOVFE p.12-34 ;bits 7-4 son reservados ;bits 3-0 son incrementados o decrementados MOV DX,DMAOVFE IN AL,DX OR AL,OFH OUT DX,AL

iDMACMD2 p.12-37 ;bits 7-4 son reservados podrían ser ceros ;bits 3-2 Bus Request priority ;bit1 EOP# sampling is to be done synchrono&ly ;bit0 DREQ sampling is also to be done synchonously

- SetEXRegByte DMACMD2,07H ;DMACMD2 p. 12-37

iDMAMOD1 p.12-39 ;bits 7-6 Block transfer mode is chosen ;bit5 The target address is to be incremented ;bit4 deshabilita la autoinicialización ;bits 3-2 Data is to be transfered from the target to the requester ;bit1 cero para corregir operación ;bit0 para canal O

- SetEXRegByte DMAMODl, 10001OOOB ;DMAMODl p.12-39

Octubre 2001 Página 72

FV386FX lnte1386TM FX fusrPwdlur,

;DMAMOD2 p.12-41 ;bit7 2 ciclos operación seleccionada ;bit6 petición en espacio en memoria ;bit5 espacio en memoria ;bit4 modificar dirección ;bit3 incremento ;bit2 The target address is to modified ;bit1 podría ser &ro ;bit0 canal cero

- SetEXRegByte DMAMOD2,l OOOOOOOB ;DMAMOD2 p.12-41

;DMAGRPMSK p.12-45 ;bits 7-2 son reservados ;bit1 Mask channel 1's hardware requests ;bit0 Mask channel O's hardware requests

MOV DX,DMAGRPMSK ;DMAGRPMSK p.12-45 IN AL,DX AND AL,OFCH OR AL,3H OUT DX,AL

;DMABSR p.12-46 ;bits 7,5,3-lson reservados, podrían ser ceros ;bit6 The requester has a 16bit bus size ;bit4 The target also has a 16 bit bus size ;bit0 The above affect channel O

- SetEXRegByte DMABSR, O ;DMABSR p.12-46

;DMACHR p.12-47 ;bits 7-3 son reservados ;bit2 Disable chaining buffer transfer mode ;bit1 Should be written to zero ;bit0 The above affect channel O - SetEXRegByte DMACHR, O ;DMACHR p.12-47

;DMAIEN p.12-48 ;bits 7-2 are reserved and should not be modified ;bit1 Channel 1 Transfer Complete Interrupt connect disabled ;bit0 Channel O Transfer Complete Interrupt connect disabled

IN AL,DX AND AL,OFCH OUT DX,AL

MOV DX,DMAIEN ;DMAIEN p.12-48

Octubre 2001 Página 73

FV386FX lnte1386TM FX f r ro~dwlw

iDMACMD1 PI 2-35 ;bits 7-5 should be written to zeros ;bit4 disable priority rotation for bus control arbitration ;bit3 should be written to zero ;bit2 enable both channels ;bit1 should be written to zero - SetEXRegByte DMACMDI, O ;DMACMDI p12-35

;DMASRR pl2-35 ' % -

;bits 7-3 should be written to zeros ;bit2 is set to one to generate a software request ;bit1 select channel zero MOV DX,DMASRR IN AL,DX AND AL,OF8H OR AL,04H OUT DX,AL

MOV AX,SEG DATA ;Initialize the DS register MOV DS,AX MOV SI,OFFSET ZERO-TO-FOUR MOV D1,3200 ;Display ZEROJO-FOUR at line 20 MOV CX,10 ;Show 10 bytes of ZERO-TO-FOUR ZTF2: MOV AL,[SI] ;Move displayed byte to AL CALL DISPLAY-8-BITS-OF-AL ;Display the byte ADD D1,20 ;Increment the screen address INC SI ;Point to the next character LOOP ZTF2

;return to DOS MOV AH,04CH INT 21 H

DISPLAY-8-BITS-OF-AL: PUSHA ;Save the registers on the stack MOV DX,OB800H ;Set ES to video memory segment MOV ES,DX MOV DH,4 ;set the color to red MOV CX,8 ;set to display 8 bits DISPLAY-8-BITS-OF-AL-LOOP: ROL AL,1 ;rotate the bit into bit position zero MOV DL,AL ;use the DL register so that AL is preserved AND DL,00000001B ;clear bits 1-7 OR DL,0011 OOOOB ;add 30h to convert to asci MOV ES:[DI],DX ;move the character to the screen INC DI ;increment DI twice INC DI

"

Octubre 200 1 Página 74

LOOP DlSPLAY-8-BlTS-OF-AL-LOOP POPA RET

CODE ENDS END START

I* Copyright (C) Intel Corporation 1994 All Rights Reserved.

The Software is provided "AS IS."

LIMITATION OF LIABILITY: NEITHER INTEL NOR ITS VENDORS OR AGENTS - .

SHALL BE LIABLE FOR ANY LOSS OF PROFITS, LOSS OF USE, LOSS OF DATA, INTERRUPTION OF BUSINESS, NOR FOR INDIRECT, SPECIAL, INCIDENTAL OR

OTHERWISE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

r

CONSEQUENTIAL DAMAGES OF ANY KIND WHETHER UNDER THIS AGREEMENT OR " . (I ;I

.r

*I r :<! -L: + ," I ¡ 4 0 ; ," ' +!

r: ,,;, ci: c:: .x,

~L

- . i 3

#include "80386EX.h" #include "EV386EX.h" #include <string.h> #include <conio. h> #include <DOS.h>

- ..

'> *

. _. 71

, .

extern char far HelloStringO; void interrupt far TimerlSR(void);

#define BAUD-CLKIN 1843200L I* Clock rate of COMCLK, ¡e. External clocking *I

I* -DEBUG- most be defined on the command Line. The debugger uses SIO-O for communications to host. So while under the debugger we must avoid using Sto-O

*I #if -DEBUG- == O #define SIO-PORT SIO-1 #else #define SIO-PORT SlO-O #end if

#define TIMER TMR-1

int DataSeg; /* Created for Assembly language Data Segment register initialization */ volatile int DelayFlag; I* Declare volatile so compiler does not optimize out accesses *I

Octubre 2001 Página 75

FV386F.X lnte1386TM EX

void main(void) { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ***** Initialize Peripherals ***** . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . / #if -DEBUG- == O /* Debugger uses & Initializes ICU Master*/ /* Initialize Interrupt Control Unit */

InitlCU(ICU-TRIGGER-EDGE, /* Signal interzpt on rising edge, Master */ "

0x20, /* Vector base number of Master */ MCAS-IR2, /*Which IRQ is for cascade to Slave, Internal Slave connects-to

ICU-TRIGGER-EDGE, /* Signal interrupt on rising edge, Slave */ 0x30, /* Vector base number of Slave */

IR2 */

0,O); /* Pins to connect externally, None for master or slave */ #else

#endif /* Place Timer interrupt service routine into interrupt vector table */

InitlCUSlave(lCU-TRIGGER-EDGE, 0x30, O);

SetlRQVector( TimerlSR, /* Address of Interrupt service routine */ TMRI-IRQ, /* IRQ for the Interrupt service routine, Not the vector

number */

flag is cleared, Real-mode parameter ignored */ /* lntialize Timer */

INTERRUPT-ISR); /* Type of Interrupt, INTERRUPT-TYPE Means IF

- SetEXRegWord(CLKPRS, Oxlf3); /* Initialize Clock prescale */ InitTimer(TIMER, /* Which Timer */

TMR-RATEGEN I TMR-CLK-BIN, /* Mode, Rate Generator (continuous),

TMR-CLK-INTRN, /* Clocking Source - Internal */ TMR-OUT-ENABLE, /* Disable Clock output to pins *I OxFFFF, /* Initial Clock Counter

TMR-ENABLE); /* Enable Timer */

Binary clocking mode */

value */

Disable82591nferrupt(lRl +IR5+IR6+lR7, IRO~IRl+lR3+IR4+IR5+IR6+IR7); Enable8259lnterrupt(IR2,IR2); /* Enable slave interrupt to master(lR2), Enable

- enable(); /* Enable Interrupts */ slave IR2 */

/* lntialize Serial Port */ lnitSIO(SI0-PORT, /* Which Serial Port */

S10-8N1, /* Mode, 8-data, no parity, 1-stop */ SIO-MCR-RTS+SIO-MCR-DTR, I* Modem line controls */ 9600, /* Baud Rate */ BAUD-CLKIN); /* Baud Clocking Rate */

DelayFlag = O; /* Don't delay first string */ while( 1 )

Octubre 200 1 Página 76

FV386FX lnte1386TM FX "1yw

{ while(DelayF1ag); I* Wait until DelayFlag is cleared *I

SerialWriteStr(SI0-PORT,HelloString); DelayFlag = 1; /* Reinit for delay *I

1 1 void interrupt far -m TimerlSR(void) {

'V

DelayFlag = O; NonSpecificEOl();

I

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iCUmC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . I I* Copyright (C) Intel Corporation 1994

All Rights Reserved.

The Software is provided "AS IS."

LIMITATION OF LIABILITY: NEITHER INTEL NOR ITS VENDORS OR AGENTS SHALL BE LIABLE FOR ANY LOSS OF PROFITS, LOSS OF USE, LOSS OF DATA, INTERRUPTION OF BUSINESS, NOR FOR INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OF ANY KIND WHETHER UNDER THIS AGREEMENT OR OTHERWISE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

*I

#include <conio.h> #include "80386ex.h" #include "EV386EX.h"

I* Globals For information about the ICU *I BYTE -IRQ-SIaveBase-= 0x30; BYTE -1RQ"strBase- = 0x20; BYTE -CascadeBits- = 0x4;

I* InitlCU Description:

Initialization for both the master and slave Interrupt Control Units (ICU). This routine only initializes the internal interrupt controllers, external lCUs must be initialized separatly. These should be initialized before interrupts are enabled (¡.e. enable()).

Parameters:

Octubre 2001 Página 77

A FV386FX lnte1386TM FX frrMlUru

MstrMode Mode of operation for Master ICU MstrBase Specifies the base interrupt vector number for the Master

interrupts.

MstrBase = Ox20 For example, if IR1 of the master goes active and the

the processor will use interrupt vector table entry 0x21. MstrCascade Which Master IRQs are used for Slave ICUs. - SlaveMode .- Mode of o eration for Slave ICU SlaveBase Specifies t a e base interrupt vector number for the Slave

interrupts.

SlaveBase = 0x40 For example, if IR1 of the slave goes active and the

the processor will use interrupt vector table entry 0x41. MstrPins Defines what EX pins are avaliable externally to the chip for the

SlavePins Defines what EX pins are avaliable externally to the chip for the Slave. Master.

Returns: Error Code E-OK -- Initialized OK, No error.

Assumptions: REMAPCFG register has Expanded 110 space access enabled (ESE bit set).

ReaVProtected Mode No changes required.

*/ int InitlCU(BYTE MstrMode, BYTE MstrBase, BYTE MstrCascade, BYTE SlaveMode, BYTE SlaveBase,BYTE MstrPins, BYTE Slavepins)

/* Set slave triggering */ /* Set slave base interrupt type, least 3-

/* Set slave ID */ /* Set bit O to guarantee

BYTEicw, cfg-pins;

- IRQ-SlaveBase- = SlaveBase & Oxf8; - SetEXRegByte(lCWlS, 0x1 1 I SlaveMode);

SetEXRegByte(lCW2S, -1RQ-SlaveBaseJ;

SetEXRegByte(lCW3S, 0x2); SetEXRegByte(lCW4S, 0x1);

/* Program Slave ICU */

bit must be O */ .. -

operation*/ /* Program Master ICU */

- IRQ-MstrBase- = MstrBase & Oxf8;

icw = (MstrMode & ICU-TRIGGER-LEVEL) ? Ox19 : 0x1 1; - SetEXRegByte(lCW1 M, icw); /* Set master triggering *I

- CascadeBits- = MstrCascade I 0x4;

SetEXRegByte(lCW2M, -1RQ"strBaseJ; /* Set master base interrupt type, least 3-

SetEXRegByte(lCW3M, -CascadeBits-); /* Set master cascade pins, Make sure

icw = (MstrMode & -ICU-TRIGGER-LEVEL) I 1; /* Set bit O and remove Trigger-level bit (part of

bit must be O */

IR2 set for Cascade */

ICW 1) */

Octubre 2001 Página 78

FV386FX lnte1386TM EX "4-

- SetEXRegByte(ICW4M, icw); /* Set slave IDS in master */

/* Program chip configuration registers */ cfg-pins = -GetEXRegByte(lNTCFG); if( (MstrCascade & Oxfb) != O ) /* bit 2 (IR2) is internal, external signals

not required for just IR2 */

Cascade signals */ cfg-pins I= 0x80; /* Using external slaves, therefore enable

cfg-pins I= SlaGePins; - SetEXRegByte(lNTCFG, SlavePins); /* Set Slave external interrupt pins */ cfg-pins = GetEXRegByte(P3CFG); /* Preserve other set bits */ - SetEXRefByte(P3CFG, cfg-pins I MstrPins); /* Set Master external interrupt pins */

return E-OK; 1

/* InitlCUSlave Description:

Initialization only the internal slave Interrupt Control Units (ICU). This routine only initializes the internal interrupt controller, external lCUs must be initialized separatly.

Parameters: SlaveMode Mode of operation for Slave ICU SlaveBase Specifies the base interrupt vector number for the Slave

interrupts.

SlaveBase = 0x40 For example, if IR1 of the slave goes active and the

the processor will use interrupt vector table entry 0x41. SlavePins Defines what EX pins are avaliable externally to the chip for the Slave.

Returns: Error Code E-OK -- Initialized OK, No error.

Assumptions: REMAPCFG register has Expafided I/O space access enabled (ESE bit set).

ReaVProtected Mode No changes required.

*/ int InitlCUSlave(BYTE SlaveMode, BYTE SlaveBase, BYTE StavePins) {

BYTEcfg-pins; /* Program Slave ICU */

- IRQ-SlaveBase- = SlaveBase & Oxf8; - SetEXRegByte(lCWlS, 0x1 1 I SlaveMode); /* Set slave triggering */

SetEXRegByte(lCW2S, -IRQ-SlaveBase-); /* Set slave base interrupt type, least 3- bit must be O */ - SetEXRegByte(lCW3S, 0x2); /* Set slave ID */

Octubre 2001 Página 79

+V386FX lnte1386TM FX WWWqlu

SetEXRegByte(lCW4S, 0x1); operation*/

- SetEXRegByte(lNTCFG, SlavePins);

cfg-pins = -GetEXRegByte(lNTCFG); cfg-pins I= SlavePins;

return E-OK; 1 -

/* Set bit O to guarantee

/* Set Slave external interrupt pins */

‘c- c

I* Disable8259lnterrupt Description:

Disables 8259a interrupts for the master and the slave.

Parameters: MstrMask Mask value for mster ICU SlaveMask Mask value for slave ICU

Each bit location that is set will disable the corresponding interrupt (by setting the bit in the interrupt control register). For example, to disable master IR3 and IR5 set MstrMask = 0x28 (bits 3 and 5 are set).

Returns: None

Assumptions: REMAPCFG register has Expanded 110 space access enabled (ESE bit set).

ReaVProtected Mode No changes required.

*I void Disable8259Interrupt(BME MstrMask, BYTE SlaveMask) {

BYTE Mask; if(MstrMask != O) {

Mask = -GetEXRegByte(OCWíM); - SetEXRegByte(0CW 1 M, Mask I MstrMask);

1

{ if(S1aveMask != O)

Mask = -GetEXRegByte(OCWl S); - SetEXRegByte(0CW 1 S, Mask I SlaveMask);

1 1

I* Enable8259lnterrupt Description:

Enables 8259a interrupts for the master and the slave.

Octubre 2001 Página 80

A FV386EX lnte1386TM FX "lawr,

Parameters: MstrMask Enable mask value for mster ICU SlaveMask Enable mask value for slave ICU

Each bit location that is set will enable the corresponding interrupt (by clearing the bit in the interrupt control register). For example, to enable master IR3 and IR5 set MstrMask = 0x28 (bits 3 and 5 are set). "

Returns: ~ None . % .

Assumptions: REMAPCFG register has Expanded I10 space access enabled (ESE bit set).

ReaVProtected Mode No changes required.

*I void Enable8259lnterrupt(BYTE MstrMask, BYTE SlaveMask)

1 /*

table.

BYTE Mask; if(MstrMask != O) {

Mask = -GetEXRegByte(OCW 1 M); - SetEXRegByte(OCW1 M, Mask & (-MstrMask));

1 if(S1aveMask != O) {

Mask = -GetEXRegByte(OCWlS); - SetEXRegByte(OCW1 S, Mask & (-SlaveMask));

1

Enable8259lnterrupt Description:

Loads the interrupt vector table with the address of the interrupt routine. The vector table entry number is determined by the vector number.

Parameters: InterProc Address of interrupt function, will be loaded into the interrupt

IRQ Hardware Interrupt request number (0-15). I S R-T y pe Specifies if the interrupt function should be treated as a

TRAP-ISR

INTERRUPT-ISR

both.

Returns: Error Code

or an INTERRUPT-SR. Real Mode only supports

(parameter is ignored). Protected mode supports

Octubre 200 1 Página 81

FV386EX lnte1386TM EX %prwrarlru

E-INVALID-VECTOR - An IRQ of greater than 15 was passed E-BADVECTOR - IRQ is used for cascading to a slave interrupt controller E-OK -- Initialized OK, No error.

Compiler supports far and interrupt keywords Assumptions:

ICU must be configured before this function is call for it to operate properly - - - IRQ-SlaveBase-,-lRQ-MstrB$e-,-CascadeBits- are set before function is called. These are initialized in the InitlCU functions supplied in this source.

ReaVProtected Mode No changes required. Uses SetlnterruptVector which is mode dependant(separate

source) *I int SetlRQVector( void (far interrupt *IntrProc)(void), int IRQ, int IntrType) {

int Vector;

if(lRQ > 15) return E-INVALID-VECTOR;

if(lRQ > 7) I* Get Vector from Slave */

else I* From Master *I {

Vector = -1RQ-SlaveBase- + IRQ - 8;

if((1 cc IRQ) && -CascadeBitsJ return E-BADVECTOR; Vector = -1RQ-MstrBase- + IRQ;

1

SetlnterruptVector(lntrProc, Vector, IntrType); return E-OK;

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . rsentintr.c**************************~****************** I /* Copyright (C) Intel Corporation 1994

All Rights Reserved.

Octubre 200 1 Página 82

FV386FX lnte1386TM FX Wrmltaw

The Software is provided "AS IS."

LIMITATION OF LIABILITY: NEITHER INTEL NOR ITS VENDORS OR AGENTS SHALL BE LIABLE FOR ANY LOSS OF PROFITS, LOSS OF USE, LOSS OF DATA, INTERRUPTION OF BUSINESS, NOR FOR INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OF ANY KIND WHETHER UNDER THIS AGREEMENT OR OTHERWISE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

*/

#include "80386ex.h" #include "ev386ex.h"

' * .

I* SetlnterruptVector Description:

Loads the interrupt vector table with the address of the interrupt routine. The vector table entry

Parameters: InterProc

ISRType table.

number is

prameter is kept to maintain

function.

Returns: None

Assumptions:

determined by the vector number

Address of interrupt function, will be loaded into the interrupt

Specifies if the interrupt function. Real Mode only supports INTERRUPT-ISR (the parameter is ignored). The

compatibilty with the protected mode version of this

Compiler supports far and interrupt keywords Compiler may issue a warning about IntrType not used. IntrType is kept for

compatibilty. protected mode

ReaVProtected Mode - Real Mode only, see pSet1ntr.c for protected mode version

*/ void SetInterruptVector( void (far interrupt 'IntrProc)(void), int Vector, int IntrType) {

((unsigned long far *)(O))[vector] = (unsigned 1ong)lntrProc; IntrType = O; I* Reference to avoid compiler warning *I

1

...................................... serial.c ********e************************************ I /* Copyright (C) Intel Corporation 1994

All Rights Reserved.

Octubre 2001 Página 83

FV386FX lnte1386TM FX frrvwlerw

The Software is provided "AS IS."

LIMITATION OF LIABILITY: NEITHER INTEL NOR ITS VENDORS OR AGENTS SHALL BE LIABLE FOR ANY LOSS OF PROFITS, LOSS OF USE, LOSS OF DATA, INTERRUPTION OF BUSINESS, NOR FOR INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OF ANY KIND WHETHER UNDER THIS AGREEMENT OR OTHERWISE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

*I

#include <conio.h> #include <stdio.h> #include "80386ex.h" #include "ev386ex.h"

"

I* InitSIO

Description:

Parameters: . Unit Unit number of the serial port. O for SI0 port O, 1 for SI0 port l.

Mode Defines Parity, number of data bits, number of stop bits ... Reference Serial Line

Control register for various options ModemCntrl Defines the operation of the modem control lines BaudRate Specifies baud rate. The baud divisor value is calculated based on

clocking source

the InitializeLibrary and clock frequency. The clocking frequency is set by calling

function. ClockRate Specifies the serial port clocking rate, for internal clocking = CLK2 for

external = COMCLK Returns: Error Codes

E-INVAILD-DEVICE -- Unit number specifies a non-existing device E-OK -- Initialized OK, No error.

Assumptions: SIOCFG Has already been configured for Clocking source and Modem control source

REMAPCFG register has Expanded I10 space access enabled (ESE bit set). The processor Port pin are initialized separately.

RealIProtected Mode No changes required.

*I

int InitSlO(int Unit, BYTE Mode, BYTE ModemCntrl, DWORD BaudRate, DWORD BaudClkln) {

WORD SIOPortBase;

Octubre 200 1 Página 84

FV386FX lnte1386TM FX WamdaWr,

WORD BaudDivisor;

/* Check for valid unit */

return E-INVALID-DEVICE; if(Unit > 1)

/* Set Port base based on serial port used */ SIOPortBgse = (Unit? SlOl-BASE : SUO-BASE); -

/* Initialized Serial Port registers */

BaudDivisor = (WORD)(BaudClkln / (16*BaudRate)); /* Calculate the baud divisor value, based on baud clocking */

/* Turn on access to baud divisor register */ - SetEXRegByte(SI0PortBase + LCR, 0x80);

- SetEXRegByte(SI0PortBase + DLH, HIBYTE(BaudDivisor) ); - SetEXRegByte(SI0PortBase + DLL, LOBYTE(BaudDivisor) );

/* Set the baud rate divisor register, High byte first */

/*** Set Serial Line control register ***/ SetEXRegByte(Sl0PortBase + LCR, Mode);

Divisorlatch */ /* Sets Mode and reset the

/* Set modem control bits */ - SetEXRegByte(Sl0PortBase + MCR, ModemCntrl);

return E-OK; 1

/* SetSlOlnterrupt

Description: Initializes the Interrupt Enable Register (IER) and initializes the interrupt vector table

address of the interrupt function, if provided. If not provided this function only with the

modifies the IER.

*

Parameters: Unit Unit number of the serial port. O for SI0 port O, 1 for SI0 port

IntrSources Which serial port features can cause the interrupt. InterruptFnc Address of interrupt function, will be loaded into the interrupt table. If

NULL no function is loaded. Use SetlnterruptVector to

1.

set interrupt routine.

TRAP-ISR or an ISR-Type Specifies if the interrupt function should be treated as a

Octubre 200 1 Página 85

FV386FX lnte1386TM FX

INTERRUPT-ISR. Real Mode only supports

Protected mode supports both. If InterruptFnc is NULL INTERRUPT-ISR (parameter is ignored).

parameter is ignored.

Returns: Error Codes E-INVAILD-DEVICE -- Unit number specifies a non-existing device E-OK -- .ldtialized OK, No error. -

Assumptions: REMAPCFG register has Expanded 110 space access enabled (ESE bit set). The processor Port pin are initialized separately. ICU is initialized before this is called. Compiler supports far and interrupt keywords

RealIProtected Mode No changes required. Uses SetlnterruptVector which is mode dependant

*I int SetSlOlnterrupt(int Unit,BYTE IntrSources, void (far interrupt *InterruptFnc)(void), int ISR-Type) {

WORD SIOPortBase; int ICUInterruptVector;

I*** Check for valid unit ***I

return E-INVALID-DEVICE; if(Unit > 1)

if(1nterruptFnc != NULL) {

/*** Calculate which interrupt vector to initialized ***/ /* Get the base vector number of the Master ICU, SI0 O & 1 are on the

Master *I ICUlnterruptVector = -GetEXRegByte(lCW2M) & Oxf8; /* Clear bits O - 2 */ ICUInterruptVector += (Unit == O) ? 4 : 3; /* Set to IRQ level. SlO-O = IRQ4, SIO-1

= IRQ3 *I /,** Load interrupt function into the interrupt vector table ***I

SetlnterruptVector(lnterruptFnc, ICUlnterruptVector, ISR-Type); 1

/* Set Port base, based on serial port used *I SlOPortBase = (Unit? SIOI-BASE : SIOO-BASE); - SetEXRegByte(SI0PortBase + IER, IntrSources);

return E-OK; 1

Octubre 2001 Página 86

FV386FX lnte1386TM FX m I* SerialReadStr

Description: IS a Polled serial port read function that will wait forever or Until Count characters are read from the serial port.

Parameters: unit

1. str count

Unit number of the serial port. O for SI0 port O, 1 for SI0 port ' % .

Address of where to place the input data Number of characters to read before returning.

Returns: Error Code E-OK or Error code status (value of Line Status Register (LSR)

Assumptions: REMAPCFG register has Expanded I/O space access enabled (ESE bit set). The processor Port pin are initialized separately.

ReaVProtected Mode No changes required.

*/ int SerialReadStr(int Unit, char far *str, int count) {

WORD ReceivePortAddr; WORD StatusPortAddr; BYTE Status; int i;

/* Set Port base, based on serial port used */ ReceivePortAddr = (Unit ? RBRI : RBRO); StatusPortAddr = (Unit ? LSRl : LSRO);

for(i=O; i'< count-1; i++)

/* Status register is cleared after read, so we must save it's value when read *I

while(!((Status=-GetEXRegByte(StatusPortAddr)) & SIO-RX-BUF-FULL)) if( Status & SIO-ERROR-BITS ) I* Error Bit set then return NULL */ {

str[i+l] = 10'; return Status & SIO-ERROR-BITS;

1 str[i] = -GetEXRegByte(ReceivePortAddr);

1 str[i] = '\O'; return E-OK;

Octubre 2001 Página 87

FV386FX lnte1386TM FX fwswudnrw

I* SerialReadChar

Description: IS a Polled serial port read function that will wait forever or until a character has been recieved from the serial port.

. T . Parameters:

Unit Unit number of the serial port. O for SI0 port O, 1 for SI0 PPI? 1.

Returns: BYTE Read from serial port, if zero an error occured.

Assumptions: REMAPCFG register has Expanded I10 space access enabled (ESE bit set). The processor Port pin are initialized separately.

Reallprotected Mode No changes required.

*I BYTE SerialReadChar(int Unit) {

WORD ReceivePortAddr; WORD StatusPortAddr; WORD Status;

I* Set Port base, based on serial port used *I ReceivePortAddr = (Unit ? RBRl : RBRO); StatusPortAddr = (Unit ? LSRl : LSRO);

I* Status register is cleared after read, so we must save it's value when read *I while(!((Status=-GetEXRegByte(StatusPortAddr)) & SIO-Rx-BUF-FULL))

if( Status & SIO-ERROR-BITS ) I* Error Bit set then return NULL */ { %

1

- return O;

return -GetEXRegByte(ReceivePortAddr); 1

I* SerialWriteChar

Description: Is a Polled serial port write function that will wait forever or until a character has been written to the serial port.

Octubre 200 1 Página 88

FV386FX lnte1386TM FX frssrvwrlpuy, I

1

Parameters: Unit

l. Unit number of the serial port. O for SI0 port O, 1 for SI0 port

1

Returns: Nothing

Assumptions: REMAPCFG register has Expanded I/O space access enabled (ESE bit set). The processor Port pin are initiarzed separately.

RealIProtected Mode No changes required.

*I void SerialWriteChar(int Unit, BYTE ch) {

WORD TransmitPortAddr, WORD StatusPortAddr;

/* Set Port base, based on serial port used */ TransmitPortAddr = (Unit ? TBRl : TBRO); StatusPortAddr = (Unit ? LSRl : LSRO);

I* Wait until buffer is empty */ while(!(-GetEXRegByte(StatusP0rtAddr) & SIO-TX-BUF-EMPTY)) ;

- SetEXRegByte(TransmitPortAddr,ch); 1 I* SerialWriteChar

Description: Is a Polled serial port write function that will wai

been

1.

it forever or until all characters have

written to the serial port. The NUL character ('\O') is used to indicate end of string. 1.

Parameters: Unit

str

Unit number of the serial port. O for SI0 port O, 1 for SI0 port

Address of a zero terminated string to be transmitted

Returns: Nothing

Assumptions: REMAPCFG register has Expanded I/O space access enabled (ESE bit set). The processor Port pin are initialized separately.

ReaVProtected Mode No changes required.

Octubre 2001 Página 89

EV386EX lnte1386TM EX wrwrrrwrw

*I void SeriaIWriteStr(int Unit, const char far *str) {

WORD TransmitPortAddr; WORD StatusPortAddr;

/* Set Port base, based on serial port used *I TransmiteortAddr = (Unit ? TBRI : TBqP); StatusPoitAddr = (Unit ? LSRI : LSRO);

for( ; *str != 70'; str++) {

/* Wait until buffer is empty *I

I* Write Character */ while(!CGetEXRegByte(StatusPortAddr) & 30-TX-BUF-EMPTY)) ;

SetEXRegByte(TransmitPortAddr,*str); 1

-

I* SerialWriteMem

Description: Is a Polled serial port write function that will wait forever or until count characters

written to the serial port. have been

Parameters: Unit

mem count

1 . Unit number of the serial port. O for SI0 port O, 1 for SI0 port

Address of a buffer to be transmitted Number of characters in buffer to be transmitted

Returns: Nothing

Assumptions: REMAPCFG register has Expanded I10 space access enabled (ESE bit set). The processor Port pin are initialized separately.

ReaVProtected Mode No changes required.

*I void SerialWriteMem(int Unit, const char far 'mem, int count) {

WORD TransmitPortAddr; WORD StatusPortAddr; int i;

/* Set Port base, based on serial port used */

Octubre 200 1 Página 90

FV386FX lnte1386TM FX kwr*wtb*lw

TransmitPortAddr = (Unit ? TBRl : TBRO); StatusPortAddr = (Unit ? LSRl : LSRO);

for(i=O ; i count; i++) {

/* Wait until buffer is empty *I while(!CGetEXRegByte(StatusPortAddr) & SIO-TX-BUF-EMPTY)) ;

- SetEXRegByte(TransmitPortAddr,mem[i]); " /* Write Character *I . 'r

1 1

............................................ tirner.= . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . / /* Copyright (C) Intel Corporation 1994

All Rights Reserved.

The Software is provided "AS IS."

LIMITATION OF LIABILITY: NEITHER INTEL NOR ITS VENDORS OR AGENTS SHALL BE LIABLE FOR ANY LOSS OF PROFITS, LOSS OF USE, LOSS OF DATA, INTERRUPTION OF BUSINESS, NOR FOR INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OF ANY KIND WHETHER UNDER THIS AGREEMENT OR OTHERWISE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

*/

#include <conio.h> #include "80386ex.h" #include "ev386ex.h"

I* InitTimer: Description:

- Parameters:

Unit Unit number of the timer. EX supports O, 1 or 2 Mode Defines Counter Mode and Count value type

Inputs Specifies Input sources

InitCount Value to be loaded into count register Enable Enable (1) or disable (O) Timer

E-INVAILD-DEVICE -- Unit number specifies a non-existing device E-OK -- Initialized OK, No error.

REMAPCFG register has Expanded I10 space access enabled (ESE bit set).

output Specifies Which Output to drive

Returns: Error Codes

Assumptions:

Octubre 200 1 Página 91

FV386FX lnte1386TM FX

ReaVProtected Mode No changes required.

*I int InitTimer(int Unit, WORD Mode, BYTE Inputs, BYI-E Output,WORD InitCount, int Enable) {

BYTE TmpByte; WORDTmrCntPort;

if(Unit > 2) ” % .

return E-INVALID-DEVICE;

TmrCntPort = OxfO40 + Unit; I* Set depending on which timer *I

/* Set Pin configuration */ if(Unit < 2) {

TrnpByte = GetEXRegByte(P3CFG) I (Output << Unit); /* Bit O or 1 *I - SetEXReg&te(P3CFG,TmpByte);

1 else {

TmpByte = -GetEXRegByte(PINCFG) I (Output << 5); I* Bit 5 *I SetEXRegByte(PINCFG,TmpByte);

} -

I* Set Timer Config *I TrnpByte = -GetEXRegByte(TMRCFG); I* All Timers share this register, Keep previous

if(!Enable) TmpByte I= 0x80; /* Set Timer Disable Bit *I

TmpByte )= (Inputs << (Unit*2)); /* Set CK?CON and GT?CON bits *I - SetEXRegByte(TMRCFG,TmpByte);

settings */

/* Set Timer Control Register */ TmpByte = Unit << 6; /* Set cointer select */ TmpByte I= (0x30 I Mode); /* Set RNV low then high byte and Mode bits *I

- SetEXRegByte(TMRCON,TmpByte);

I* Set Initial Counter Value *I TmpByte = HIBYTE(1nitCount); - SetEXRegByte(TmrCntPort, LOBYTE(1nitCount)); - SetEXRegByte(TmrCntPort, TmpByte);

return E-OK; } ....................................... g03g6ex.h ............................................. I /* Copyright (C) Intel Corporation 1994

All Rights Reserved.

Octubre 2001 Página 92

EV386FX lnte1386TM FX tnrrrwwrrvrw

The Software is provided "AS IS."

LIMITATION OF LIABILITY: NEITHER INTEL NOR ITS VENDORS OR AGENTS SHALL BE LIABLE FOR ANY LOSS OF PROFITS, LOSS OF USE, LOSS OF DATA, INTERRUPTION OF BUSINESS, NOR FOR INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OF ANY KIND WHETHER UNDER THIS AGREEMENT OR OTHERWISE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

*/ ~ "

#include <conio.h> #include "80386ex. h" #include "ev386ex. h"

/* InitTimer: Description:

Parameters: Unit Unit number of the timer. EX supports O, 1 or 2 Mode Defines Counter Mode and Count value type

Inputs Specifies Input sources

Initcount Value to be loaded into count register Enable Enable (1) or disable (O) Timer

E-INVAILD-DEVICE -- Unit number specifies a non-existing device E-OK -- Initialized OK, No error.

output Specifies Which Output to drive

Returns: Error Codes

Assumptions: REMAPCFG register has Expanded I10 space access enabled (ESE bit set).

ReaVProtected Mode No changes required.

*/ int InitTimer(int Unit, WORD Mode, BYTE Inputs, BYTE Output,WORD InitCount, int Enable) {

BYTE TmpByte; WORDTmrCntPort;

if(Unit > 2) return E-INVALID-DEVICE;

TmrCntPort = OxfO40 + Unit; /* Set depending on which timer */

/* Set Pin configuration */ if(Unit < 2) {

TmpByte = -GetEXRegByte(P3CFG) I (Output << Unit); /* Bit O or 1 */

Octubre 200 1 Página 93

FV386FX lnte1386TM F~X Uurrlkw,

SetEXRegByte(P3CFG,TmpByte); 1

{

-

else

TmpByte = -GetEXRegByte(PINCFG) I (Output << 5); I* Bit 5 *I - SetEXRegByte(PINCFG,TmpByte);

1 z . * .

I* Set Timer Config *I TmpByte = -GetEXRegByte(TMRCFG); I* All Timers share this register, Keep previous

if(!Enable) TmpByte I= 0x80; I* Set Timer Disable Bit *I

TmpByte I= (Inputs << (Unit*2)); I* Set CK?CON and GT?CON bits *I - SetEXRegByte(TMRCFG,TmpByte);

settings *I

I* Set Timer Control Register *I TmpByte = Unit << 6; I* Set counter select *I TmpByte I = (0x30 I Mode); /* Set RMI low then high byte and Mode bits */

- SetEXRegByte(TMRCON,TmpByte);

I* Set Initial Counter Value *I TmpByte = HIBYTE(1nitCount); - SetEXRegByte(TmrCntPort, LOBYTE(1nitCount)); - SetEXRegByte(TmrCntPort, TmpByte);

return E-OK; 1

...

I************************************ ev386ex.., . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . I I* Copyright (C) Intel Corporation 1994

All Rights Reserved.

Octubre 200 1 Página 94

EV386FX lnte1386TM EX twrrwyIlpwI

The Software is provided "AS IS."

LIMITATION OF LIABILITY: NEITHER INTEL NOR ITS VENDORS OR AGENTS SHALL BE LIABLE FOR ANY LOSS OF PROFITS, LOSS OF USE, LOSS OF DATA, INTERRUPTION OF BUSINESS, NOR FOR INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OF ANY KIND WHETHER UNDER THIS AGREEMENT OR OTHERWISE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

*/ " -e.

I********************** Global typedef ....................... I typedef unsigned char BYTE; I* 8-bit value *I typedef unsigned short WORD; I* 16-bit value */ typedef unsigned long DWORD; I* 32-bit value *I

I********************** Global Used defines ****************** /

/* Error Flags */ #define E-OK O #define E-INVALID-DEVICE 1 #define E-INVALID-VECTOR 2 #define E-BADVECTOR 3

#define INTERRUPT-ISR 1 #define TRAP-ISR 2 #define IDT-ALIAS 2 I* Only valid for protected mode *I #define TRAP-TYPE Ox8fOO I* Only valid for protected mode */ #define INTR-TYPE Ox8e00 I* Only valid for protected mode */

#define LOBYTE(w) ((BYTE)(w)) #define HIBYTE(w) ((BYTE)(((WORD)(w) >> 8) & OxFF))

#define LOWORD(1) ((WORD)(DWORD)(I)) #define HlWOR'D(1) ((WORD)((((DWORD)(I)) >> 16) & OxFFFF))

....................... Global Function .. . . . . . . . . . . . . . . . . . . . . / extern void -EnableExtlOMem(void);

I****************

#define ICU-SFNM 0x1 o #define ICU-AUTOEOI 0x2 #define ICU-TRIGGER-LEVEL 0x8 #define ICU-TRIGGER-EDGE Ox0

#define MPIN-INTO 0x4 #define MPIN-INT1 0x8 #define MPIN-INT2 Ox10

Interrupt Control Unit configuration defines ....................... / /* ICU Modes */

/* ICU Master Pins */

Octubre 2001 Página 95

A FV386FX lnte1386TM FX frrsrvyllwI

v

#define MPIN-INT3 0x20

#define MCAS-IR1 Ox2 #define MCAS-IR2 0x4 #define MCAS-IR5 Ox20 #define MCAS-IR6 0x40 #define MCAS-IR7 0x80

/* ICU Slave Pins */ #define SPIN-INT4 0x1 #define SPIN-INT5 0x2 #define SPIN-INT6 0x4 #define SPIN-INT7 0x8

/* ICU IRQ Mask Values*/ #define IR0 0x1 #define IR1 0x2 #define IR2 0x4 #define IR3 0x8 #define IR4 0x1 o #define IR5 0x20 #define IR6 0x40 #define IR7 0x80

/* ICU EO1 Types */ #define NONSPECIFIC-EO1 0x20 #define SPECIFIC-EO1 0x60 #define NonSpecificEOl() SetEXRegByte(OCW2S,NONSPEClFlC_EOI); - SetEXRegByte(OCW2M,NONSPEClFlC-EOI) #define MstrSpecificEOl(irq) -SetEXRegByte(OCW2M, 0x60 I ((BYTE)((irq) & 0x7)) ) #define SlaveSpecificEOl(irq) - SetEXRegByte(OCW2S, 0x60 I ((BYTE)((irq) & 0x7)) )

/* ICU Master External Cascade IRs */

extern int InitlCU(BYTE MstrMode, BYTE MstrBase, BYTE MstrCascade, BYTE SlaveMode, BYTE SlaveBase,BYTE MstrPins, BYTE Slavepins); extern int InitlCUSlave(BYTE SlaveMode, BYTE SlaveBase, BYTE Slavepins);

extern int SetlRQVector( void (far interrupt *IntrProc)(void), int IRQ, int IntrType); extern void Enable8259lnterrupt(BYTE MstrMask, BYTE SlaveMask); extern void Disable82591nterrupt(BYTE MstrMask, BYTE SlaveMask);

\ extern void SetlnterruptVector( void (far interrupt *IntrProc)(void), int Vector, int IntrType);

I****************

#define Sto-O 0 #define SIO-1 1

Asynchronous Serial 110 Port defines ....................... /

#define S100-IRQ #define SIOI-IRQ

4 /* IRQ # Master IRQ4 */ 3 /* IRQ # Master IRQ3 *I

#define SIO-5DATA oxo #define SIO-6DATA ox 1 #define S10-7DATA 0x2 #define S10-8DATA 0x3

Octubre 2001 Página 96

FV386EX lnte1386TM EX frrruwhalw

#define SIO-1 STOPBIT #define S102STOPBIT

#define SIO-NOPARITY #define SIO-ODDPARITY #define SIO-EVNPARITY #define SIO-FRCOPARITY #define SIO-FRC1 PARITY

#define SIO-SETBREAK

#define SIO-INTERNAL-SRC #define SIO-EXTERNAL-SRC #define SIO-CLKSRC-CLK2 #define SIO-CLKSRC-COMCLK

#define SIO-INTR-NONE #define SIO-INTR-RBF #define SlO-INTR-TBE #define SIO-INTR-RLS #define 90-INTR-MS 0x8

#define SIO-MCR-LOOP-BACK #define SIO-MCR-OUT2 #define SIO-MCR-OUT1 #define SIO-MCR-RTS #define SIO-MCR-DTR

#define S10-8N1 #define SIO-7NI

/* Status Bits */ #define SIO-ERROR-BITS #define SIO-M-BUF-FULL #define SIO-OVERRUN #define SIO-PARITY-ERR #define SIO-FRAMING-ERR #define SIO-BREAK-INTR #define SIO-TX-BUF-EMPTY #define SIO-TX-EMPTY

oxo 0x4

oxo 0x8 0x1 8 0x28 0x38

0x40

0x1 oxo

oxo

O 0x1 0x2 0x4

0x1 o 0x8 0x4

0x1 e 0x1

0x4

0x1 o 0x20 0x40

v

0x1

0x2 0x1

(S10-8DATA (SIO-7DATA

- 0x2

0x8

I SIO-1 STOPBIT I SIO-1 STOPBIT

/* Offsets from beginning of SI0 port addresses */ #define RBR O #define TBR O #define DLL O #define IER 1

I SIO-NOPARITY) I SIO-NOPARITY)

Octubre 200 1 Página 97

FV386FX lnte1386TM EX fwr"

#define DLH 1 #define IIR 2 #define LCR 3 #define MCR 4 #define LSR 5 #define MSR 6 #define SCR 7 #define SIOO-BASE OxF4F8 #define SlOl-BASE OxF8F8

z

/* Define Function Macros */ #define GetSIOOStatus() GetEXRegByte(LSR0) #define GetSIO1 Status() GetEXRegByte(LSR1) #define GetSlOOlnterruptlD()-GetEXRegB$e(lIRO) #define GetSlOl InterruptlD()-GetEXRegByte(llR1) #define GetSIOOModemStatus() -GetEXRegByte(MSRO) #define GetSlOl Modemstatus() -GetEXRegByte(MSRl) #define GetSIOOChar() GetEXRegByte(RBR0) #define GetSIOlChar() GetEXRegByte(RBR1) #define ChangeSlOOlntrSrc(src) -SetEXRegByte(lERO,src) #define Changes101 IntrSrc(src) -SetEXRegByte(lERl ,src) #define ChangeSIOOMode(Mode) -SetEXRegByte(LCRO,Mode) #define Changes101 Mode(Mode) -SetEXRegByte(LCRl ,Mode) #define DisableSlOOlnterrupt(src) -SetEXRegByte(lERO,-GetEXRegByte(lER0) & !(src)) #define DisableSlOl Interrupt(src) -SetEXRegByte(lERl ,-GetEXRegByte(lER1) & !(src))

-

-

/* SI0 Function Definitions */ extern int InitSlO(int Unit, BYTE Mode, BYTE ModemCntrl, DWORD BaudRate, DWORD BaudClkln); extern int SetSlOlnterrupt(int Unit,BYTE IntrSources, void (far interrupt *InterruptFnc)(void), int ISR-Type); extern BYTE SerialReadChar(int Unit); extern int SerialReadStr(int Unit, char far *str, int count); extern void SerialWriteChar(int Unit, BYTE ch); extern void SerialWriteStr(int Unit, const char far *str); extern void SerialWriteMem(int Unit, const char far *mem, int count);

/****************

#define DCDO 0x1 #define RTSO 0x2 #define DTRO 0x4 #define DSRO 0x8 #define RIO ox1 o #define LOCK 0x20 #define HOLD OX40 #define HOLDACK OX80

Port I/O configuration defines ....................... / /* Port 1 configuration defines */

Octubre 2001 Página 98

FV386FX lnte1386TM FX frwwurr

/* Port 2 configuration defines */ #define CSO 0x1 #define CS1 0x2 #define CS2 0x4 #define CS3 0x8 #define CS4 OX10 #define RXDO 0x20 #define TXDO . OX40 #define CTSO OX80

#define TMROUTO 0x1 #define TMROUTI Ox2 #define INTO 0x4 #define lNTl 0x8 #define INT2 Ox10 #define INT3 Ox20 #define PWRDWN 0x40 #define COMCLK 0x80

#define PO-INOxl #define PI-INOx2 #define P2-IN 0x4 #define P3-I N 0x8 #define P4-IN 0x1 O #define P5-INOx20 #define P6-1NOx40 #define P7-INOx80 #define Px-OUT O

' Y

/* Port 3 configuration defines */

/* Port Direction defines *I

/* Pin configuration defines */ #define RTSl 0x1 #define SSIOTX 0 #define DTRl Ox2 #define SRXCLK O #define TXDl 0x4 #define DACKI 0 #define CTSI 0x8 #define EOP 0 #define CS5 0x1 o #define DACKO 0 #define TIMER2 0x20 #define COPROC O #define REFRESH 0x40 #define CS6 0

/****************

#define TMR-O 0 #define TMR-1 1

Timer configuration defines ....................... I

Octubre 200 1 Página 99

FV386FX lnte1386TM EX

#define TMR-2 2 #define TMRO-IRQ O /* IRQ # Master IRQO */ #define TMR1-IRQ 1 O /* IRQ # Slave IRQ2 */ #define TMR2-1RQ 11 /* IRQ # Slave IRQ3 */

#define TMR-TERMCNT O #define TMR-1 SHOT (1-1) #define TMR-WTEGEN (2<<1) ’ * #define TMR-SQWAVE ( 3 4 ) #define TMRSW-TRIGGER (4<<1) #define TMR-HW-TRIGGER ( 5 ~ ~ 1 )

/* Count Type */ #define TMR-CLK-BCD 1 #define TMR-CLK-BIN O

/* Timer Pin Configuration */ #define TMR-CLK-INTRN O #define TMR-CLK-EXTRN 0x1 #define TMR-GATE-VCC O #define TMR-GATE-EXTRN Ox2 #define TMR-OUT-ENABLE 0x1 #define TMR-OUT-DISABLE O

/* Timer Modes */

#define TMR-ENABLE #define TMR-DISABLE

1 O

/* Timer Function Definitions */ extern int InitTimer(int Unit, WORD Mode, BYTE Inputs, BYTE Output,WORD Initcount, int Enable);

;; Copyright (C) Intel Corporation 1994 .. * I All Rights Reserved. .. ,, ;; The Software Is provided “AS IS.”

;; LIMITATION OF LIABILITY: NEITHER INTEL NOR ITS VENDORS OR AGENTS ;; SHALL BE LIABLE FOR ANY LOSS OF PROFITS, LOSS OF USE, LOSS OF DATA, ;; INTERRUPTION OF BUSINESS, NOR FOR INDIRECT, SPECIAL, INCIDENTAL OR ;; CONSEQUENTIAL DAMAGES OF ANY KIND WHETHER UNDER THIS AGREEMENT OR ;; OTHERWISE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

._ ”

.. I ,

, ; 80386EX Register definitions I

; Define Macro for accessing the 80386EX registers. Using these macros ; allows a user to move between high and low I/O space easily. ;%*DEFINE(SetEXRegWord (reg,val))(

Octubre 200 1 Página 100

A FV386FX lnte1386TM EX "dm

; mov dx,%reg ; mov ax,%val ; out dx,ax ;) ;%*DEFINE(SetEXRegByte (reg,val))( ; mov dx,%reg ; mov al,%val ; out dx,al .

;> . v

;;; Caution some Assemblers DO NOT support the IFlDNl directive - SetEXRegByte MACRO reg, val IFlDNl <al>,<&val> ;; If value is the al don't reload it IF reg GT 255 ;; Check if DX needs to be loaded

mov dx, reg out dx, al

out reg, al ELSE

ENDIF

IF reg GT 255 ;; Check if DX needs to be loaded ELSElFlDNl <ax>,<&val> ;; If value is the ax don't reload it

mov dx, reg out dx, al

out reg, al ELSE

ENDIF ELSE ;; Value is NOT the AX or AL, therefore load it

mov al, val

mov dx, reg out dx, al

out reg, al

IF reg GT 255 ;; Check if DX needs to be loaded

ELSE

ENDIF - ENDIF ENDM

- SetEXRegWord MACRO reg, val IFlDNl <ax>,<&val> ;; If value is the AX don't reload it IF reg GT 255 ;; Check if DX needs to be loaded

mov dx, reg out dx, ax

out reg, ax ELSE

ENDIF ELSE ;; Value is NOT the AX, therefore load it

mov ax, val IF reg GT 255 ;; Check if DX needs to be loaded

Octubre 2001 Página 101

EV386FX lnte1386JJyI FX A wmarw

mov dx, reg out dx, ax

out reg, ax ELSE

ENDIF ENDIF ENDM

; REMAP ADDRIESSING REGISTERS ' Y

REMAPCFGH EQU 0023H REMAPCFGL EQU 0022H

REMAPCFG EQU 0022H

; INTERRUPT CONTROL REGISTERS -- SLOT 15 ADDRESSES ICW1 M EQU OF020H ICW 1 S EQU OFOAOH ICW2M EQU OF021H ICW2S EQU OFOAlH

ICW3S EQU OFOAlH ICW4M EQU OF021 H ICW4S EQU OFOAl H OCWl M EQU OF021 H OCWl S EQU OFOAl H OCW2M EQU OF020H OCW2S EQU OFOAOH OCW3M EQU OF020H OCW3S EQU OFOAOH

ICW3M EQU OF021 H

; INTERRUPT CONTROL REGISTERS -- SLOT O ADDRESSES lCWl MDOS EQU 0020H

lCWl SDOS EQU OOAOH ICW2MDOS EQU 0021H ICW2SDOS EQU OOAlH ICW3MDOS EQU 0021H ICW3SDOS . EQU OOAl H ICW4MDOS EQU 0021 H ICW4SDOS EQU OOAlH OCWl MDOS EQU 0021 H OCW 1 SDOS EQU OOAl H OCW2MDOS EQU 0020H OCW2SDOS EQU OOAOH OCW3MDOS EQU 0020H OCW3SDOS EQU OOAOH

; CONFIGURATION REGISTERS DMACFG EQU OF830H INTCFG EQU OF832H

Octubre 2001 Página 102

FV386EX lnte1386TM FX

TMRCFG EQU OF834H SIOCFG EQU OF836H PICFG EQU OF820H P2CFG EQU OF822H P3CFG EQU OF824H

PINCFG EQU OF826H

; WATCHDOGTJMER REGISTERS WDTRLDH EQU OF4COH WDTRLDL EQU OF4C2H WDTCNTH EQU OF4C4H WDTCNTL EQU OF4C6H WDTCLR EQU OF4C8H WDTSTATUS EQU OF4CAH

v -

; TIMER CONTROL REGISTERS -- SLOT 15 ADDRESSES TMRO EQU OF040H TMRl EQU OF041H TMR2 EQU OF042H TMRCON EQU OF043H

TMRODOS EQU 0040H TMRl DOS EQU 0041 H TMR2DOS EQU 0042H TMRCONDOS EQU 0043H

; TIMER CONTROL REGISTERS - SLOT O ADDRESSES

; lNPUT/OUTPUT PORT UNIT REGISTERS P I PIN EQU OF860H P I LTC EQU OF862H P1 DIR EQU OF864H P2PIN EQU OF868H P2LTC EQU OF86AH P2DIR EQU OF86CH P3PIN EQU OF870H P3LTC EQU OF872H P3DIR EQU OF874H

- ..

; ASYNCHRONOUS SERIAL CHANNEL O -- SLOT 15 ADDERSSES RBRO EQU OF4F8H THRO EQU OF4F8H TBRO EQU OF4F8H DLLO EQU OF4F8H IERO EQU OF4F9H DLHO EQU OF4F9H IlRO EQU OF4FAH LCRO EQU OF4FBH MCRO EQU OF4FCH LSRO EQU OF4FDH

Octubre 200 1 Página 103

FV386FX lnte1386TM FX fruwlm

MSRO EQU OF4FEH SCRO EQU OF4FFH

RBRODOS EQU 03F8H THRODOS EQU 03F8H TBRODOS EQU 03F8H DLLODOS EQU 03F8H IERODOS -.EQU 03F9H DLHODOS EQU 03F9H IIRODOS EQU 03FAH LCRODOS EQU 03FBH MCRODOS EQU 03FCH LSRODOS EQU 03FDH MSRODOS EQU 03FEH SCRODOS EQU 03FFH

; ASYNCHRONOUS SERIAL CHANNEL O - SLOT O ADDERSSES

; ASYNCHRONOUS SERIAL CHANNEL 1 - SLOT 15 ADDRESSES RBRI EQU OF8F8H THRl EQU OF8F8H

DLLl EQU OF8F8H lERl EQU OF8F9H DLHI EQU OF8F9H IlRl EQU OF8FAH LCRl EQU OF8FBH MCRl EQU OF8FCH LSRl EQU OF8FDH MSRl EQU OF8FEH SCRI EQU OF8FFH

; ASYNCHRONOUS SERIAL RBRl DOS EQU 02F8H THRl DOS EQU 02F8H TBRl DOS EQU 02F8H DLLl DOS EQU 02F8H lERl DOS EQU 02F9H DLHl DOS EQU 02F9H l lRl DOS EQU 02FAH LCRl DOS EQU 02FBH

TBRl . EQU OF8F8H

CHANNEL 1 - SLOT O ADDRESSES

MCRl DOS EQU 02FCH LSRl DOS EQU 02FDH MSRl DOS EQU 02FEH SCRl DOS EQU 02FFH

; SYNCHRONOUS SERIAL CHANNEL SSIOTBUF EQU OF480H SSIORBUF EQU OF482H SSIOBAUD EQU OF484H SSlOCONl EQU OF486H

Octubre 200 1 Página 104

FV386FX lnte1386TM FX cm"

SSIOCON2 EQU OF488H SSIOCTR EQU OF48AH

C ; CHIP SELECT UNIT REGISTERS CSOADL EQU OF400H CSOADH EQU OF402H CSOMSKL EQU OF404H CSOMSKH EQU OF406H CSIADL EQU OF408H CSlADH EQU OF40AH CS1 MSKL EQU OF40CH CSIMSKH EQU OF40EH CS2ADL EQU OF410H CS2ADH EQU OF412H CS2MSKL EQU OF414H CS2MSKH EQU OF416H CS3ADL EQU OF418H CS3ADH EQU OF41AH CS3MSKL EQU OF41CH CS3MSKH EQU OF41EH CS4ADL EQU OF420H CS4ADH EQU OF422H CS4MSKL EQU OF424H CS4MSKH EQU OF426H CSSADL EQU OF428H CSSADH EQU OF42AH CSSMSKL EQU OF42CH CSSMSKH EQU OF42EH CSGADL EQU OF430H

' Y

CSGADH EQU OF432H CS6MSKL EQU OF434H CSGMSKH EQU OF436H

UCSADL EQU OF438H UCSADH EQU OF43AH

UCSMSKL ' EQU OF43CH UCSMSKH EQU OF43EH

c k

; REFRESH CONTROL UNIT REGISTERS RFSBAD EQU OF4AOH RFSCIR EQU OF4A2H RFSCON EQU OF4A4H RFSADD EQU OF4A6H

; POWER MANAGEMENT CONTROL REGISTERS PWRCON EQU OF800H CLKPRS EQU OF804H

; DMA UNIT REGISTERS -- SLOT 15 ADDRESSES

Octubre 2001 Página 105

FV386FX lnte1386TM FX "IIYW

; A20GATE AND FAST CPU RESET - SLOT 15 ADDRESS PORT92 EQU OF092H

PORT92DOS EQU 0092H ; MOGATE AND FAST CPU RESET -- SLOT O ADDRESS

Octubre 2001 Página 107

' Y

APÉNDICE c

Diagramas de la Tarjeta EV386EX

Octubre 200 1 Página 108

r t

t . '1

1 J

I '

.. . m..

" " ' I

J

I

4

L

k -

J r : .:

5 I..” ....-m.... “I..* .“.S. . . . . . ..... “***..

1

I I I

a=

"

I

il

T

1

L L

p

I

c

i 6 , 5 3 < :.

I I -

I :

J

.... . üü "

. .

rp

.................. ............ .................... ................... ............... s . I *.:,,.: 7?r?k?%Kxk7k; ,!2 irl. 7!"r?kE~C:+

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

r P

1 a

i > ? t

. . . . e

I -

I .: :Y

'E

I -

r -

I

a

d

EV386EX lnte1386TM EX t u r n d m

Conclusiones:

Como se especificó desde un principio la Tarjeta de Evaluación EV386EX es un hardware que puede ser utilizado en varios campos, incluyendo la investigación. Es una herra-fienta poderosa que pemiteTiesanollar software de aplitación, como por ejemplo al intentar programar puertos. Además de proporcionar un software de evaluación que permite convivir o trabajar directamente con tarjetas que contienen procesadores EX, BIOS y DOS, con poco requerimiento de hardware.

Algunas características importantes o sobresalientes que encontramos, fueron por ejemplo, el uso de bloques normales de memoria para bajar programas denominados memoria flash, que mediante un archivo ejecutable, nos permite trabajar con la tarjeta EV386EX, a través de la interfaz de la PC, como si se trabajara con una memoria virtual, (se incluye una breve descripción del usos de la memoria flashldr), otro echo importante es el uso del software ApBUILDER, herramienta útil para evaluar y comparar microprocesadores.

Aunque durante el desarrollo de este trabajo, el lector pudiera pensar que toda la teoría presentada se refiere en general a los microprocesadores de la familia 80386, queremos hacer hincapié en que los programas presentados en el Apendice correspondiente son únicamente ejecutables en la tarjeta EV368EX.

También es importante mencionar que toda la información contenida en este trabajo es producto de la investigación realizada a cerca de la tarjeta EV386EX, información obtenida del material proporcionado por el profesor, artículos encontrados en Internet y de la poca o mucha experiencia obtenida durante el tiempo que se intentó trabajar con la tarjeta EV386EX.

En algunos programas presentados se encuentran citadas algunas páginas de manuales ,(con sus nombres corresRondientes), que el lector podre encontrar fecilmente en la dirección correspondiente de Intel (proporcionado en la bibliografía), que le hará más comprensible los requerimientos de hardware requeridos por la tarjeta de evaluación EV386EX.

NOTA: Proporcionamos en diskette la versión 2.1 del software de evaluación para EV386EX.

Octubre 200 1 Página 127

EV386EX lnte1386TM EX r u r a c m d r m w

Bibliografia: -~ ' y -

0 Programación para computadoras IBM y compatibles. Peter Abel Editorial Limusa

0 Manual de Microprocesadores Intel 8086,8088,80186,80188,80286,80386,80486 Brey Editorial Prentice Hall

Dirección de Internet . www.intel.com

Octubre 200 1 Págm 128