Download as doc, pdf, or txt
Download as doc, pdf, or txt
You are on page 1of 44

FACULTAD DE INGENIERÍA DE PRODUCCIÓN Y

SERVICIOS

ESCUELA PROFESIONAL DE
INGENIERÍA

ELECTRÓNICA

ARQUITECTURA DE COMPUTADORAS

LABORATORIO 01

TEMA:

COMPUTADORA PERSONAL PC XT 8088-8086

DOCENTE:

Ing. ERASMO SULLA

PRESENTADO POR:

CHAUCA UMAÑA, LEONEL CUI: 20032902

MAMANI HUANCA, SANDRO CUI: 1999

MARTINEZ CONDORI JESUS CUI: 20001786

AREQUIPA - 2010

1
INDICE

1.- Sistemas que componen la computadora XT 3

2.- Características del procesador 8088/8086 4

3.- Funcionamiento en general 5

4.- Sistema descrito por bloques y por circuitos 6

5.- Esquemático del sistema completo Sistema de Aplicación. 8

6.- Muestra de una Mainboard XT 8

7.- Registros del 8088 9

8.- Modos de direccionamiento 12

9.- Set de instrucciones del 8088 15

10.- Lenguaje maquina, macroensamblador del 8088 19

11.- Debuger, y simuladores del 8088 21

2
Computadora Personal PC XT 8088-8086

1. Sistemas que componen la computadora XT

La PC XT fue una máquina mejorada diseñada para uso en los negocios. Tenía 8 ranuras
de expansión y un disco duro de 10 megabytes (ST-412). Podía tomar 256 K de
memoria en la tarjeta principal. Fue vendido con un MDA (Adaptador de Pantalla
Monocromática-]. El procesador aún era un Intel 8088 de 4.77 MHz y el bus de
expansión de 8-bit ISA con arquitectura bus XT.

3
2. Características del procesador 8088/8086

Los microprocesadores Intel 8086 y 8088 se desarrollan a partir de un procesador


anterior, el 8080 de 8 bits.
Poseen una arquitectura interna de 16 bits y pueden trabajar con operandos de 8 y 16
bits; una capacidad de direccionamiento de 20 bits (hasta 1 Mb) y comparten el mismo
juego de instrucciones.
La filosofía de diseño de la familia del 8086 se basa en la compatibilidad y la creación
de sistemas informáticos integrados, por lo que disponen de diversos coprocesadores
como el 8089 de E/S y el 8087, coprocesador matemático de punto flotante. De
acuerdo a esta filosofía y para permitir la compatibilidad con los anteriores sistemas de
8 bits, el 8088 se diseñó con un bus de datos de 8 bits, lo cual le hace más lento que el
8086, pues éste es capaz de cargar una palabra ubicada en una dirección par en un solo
ciclo de memoria mientras el 8088 debe realizar dos ciclos leyendo cada vez un byte.
Disponen de 92 tipos de instrucciones, que pueden ejecutar con hasta 7 modos de
direccionamiento. Tienen una capacidad de direccionamiento en puertos de entrada y
salida de hasta 64K (65536 puertos), por lo que las máquinas construidas entorno a
estos microprocesadores no suelen emplear la entrada/salida por mapa de memoria.
Entre esas instrucciones, las más rápidas se ejecutan en 2 ciclos teóricos de reloj y unos
9 reales (se trata del movimiento de datos entre registros internos) y las más lentas en
206 (división entera con signo del acumulador por una palabra extraída de la

4
memoria). Las frecuencias internas de reloj típicas son 4.77 MHz en la versión 8086; 8
MHz en la versión 8086-2 y 10 MHz en la 8086-1. Por lo que un PC estándar a 4,77 MHz
puede ejecutar de 20.000 a unos 0,5 millones de instrucciones por segundo, según la
complejidad de las mismas (un 486 a 50 MHz, incluso sin memoria caché externa es
capaz de ejecutar entre 1,8 y 30 millones de estas instrucciones por segundo).

3. Funcionamiento en general

1. Revisar que la tarjeta de expansión este conectada en la PC-XT y que el cable de


interfaz este conectado a la lectora óptica.

2. Encender la PC-XT y la lectora óptica.

3. Colocar en el alimentador de hojas de la lectora óptica las hojas que se leerán.

4. DESDE LA PC-XT : Estando en C:\>, cambiarse al subdirectorio LECT_OPT y teclear


LECTURA. Cabe mencionar que este archivo es ejecutable y al momento de
correrlo aparace una pantalla de presentación con la siguiente información. -
UNIVERSIDAD NACIONAL AUTONOMA DE MEXICO - DIRECCION DE SERVICIOS DE
COMPUTO PARA LA ADMINISTRACION ACADEMICA - 8 APLICACIONES
DIFERENTES DE LECTURA OPTICA

5. Elegir la aplicación correspondiente.

6. De acuerdo a lo anterior, si se teclea un número de uno a ocho, diferente de


cinco o seis, el programa envía un mensaje de aplicación no disponible y termina
regresando a DOS.

7. Si se selecciona cualquier otra tecla, el programa envía un mensaje de selección


inadecuada y permite teclear nuevamente otra opción.

8. Al seleccionar la aplicación cinco o seis, el programa solicita el nombre de un


archivo donde almacenara la información de las hojas calificadas. El nombre del
archivo no deberá de exceder de ocho caracteres alfanuméricos y si desea
colocar una extensión al nombre, esta no deberá exceder de tres caracteres.

9. Después de haber tecleado el nombre del archivo y "ENTER", automáticamente la


PC-XT gobierna a la lectora óptica y se inicia la lectura de las hojas.

5
10. Una vez culminada la lectura de las hojas, el archivo automáticamente se cierra y
envía a pantalla el nombre del archivo donde se almacenó la información y el
número de hojas leídas, e inmediatamente regresa a DOS.

11. En caso de presentarse algún error en el transcurso de la lectura, el programa es


capaz de detectarlo y enviar a pantalla un mensaje con el tipo de error ocurrido y
la lectora detiene su motor. De acuerdo al tipo de error, este se corregirá
manualmente en la lectora óptica, se encenderá el motor de esta y
automáticamente la lectora continuara trabajando.

Proceso de arranque
Cuando el PC se pone en funcionamiento, el proceso de carga del sistema2 se inicia por
medio de la ROM y después se carga el sistema operativo (en nuestro caso el DOS), ya
sea desde un disco flexible o desde el disco duro. En la memoria también se cargan
varias rutinas del BIOS. Una vez realizado todo el proceso de carga, se instala en la
memoria el procesador de comandos COMMAND.COM.

Los archivos de arranque son el IO.SYS y el MSDOS.SYS, y, junto con el


COMMAND.COM, constituyen la parte principal de la arquitectura del sistema
operativo MSDOS. Las rutinas contenidas en los dos primeros archivos son las
encargadas de manejar todos los dispositivos y controlar las tareas de I/O asociadas
con los periféricos. Además, el segundo de ellos contiene todas las rutinas de servicio
del DOS. A todas estas rutinas se accede por medio de interrupciones software y
hardware (vistas en el apartado anterior).

La importancia de estas rutinas es tal que son utilizadas por el 99.99% de los programas
desarrollados para MS-DOS. A una gran parte de esas rutinas se accede por medio de
una llamada a la interrupción 21h, conocida como interrupción del sistema (en el
apéndice D se encuentra una lista de todas las interrupciones y de todos los servicios
que ofrece esta interrupción 21h).

Es poco probable que el usuario desee modificar las rutinas de servicio ya que ellas
proporcionan un marco de referencia para llevar a cabo tareas de programación muy
tediosas.

Este apartado pretende clarificar, sin entrar en demasiados detalles técnicos, la forma
en que se ejecutan las instrucciones y cómo funciona la CPU.

a) Lo primero que ocurre es que el oscilador (reloj) envía un pulso a la circuitería.


b) Entonces la CPU envía por el bus de direcciones la posición (dirección de
memoria) de la instrucción siguiente a la última ejecutada. Este paso se
denomina también fase de búsqueda, y en ella la CPU ordena la transferencia
del contenido del contador de programa al registro de selección de memoria y
envía a la memoria la orden de lectura.

6
c) Una vez enviada la petición, el sistema lee el contenido de los bytes de la
posición que contiene la instrucción y sus parámetros, si es que posee, para
enviarlos a la CPU a través del bus de datos.
d) Cuando llega la instrucción a la CPU, ésta la decodifica, tras lo cual se inicia la
fase de búsqueda de operandos, en la que la CPU transfiere la dirección del
operando, en el caso de que éste se encuentre en memoria. Posteriormente se
realiza el mismo proceso con el otro operando.
e) Una vez obtenidos los operandos, la instrucción es ejecutada. Para ejecutarse,
cada instrucción necesita un número diferente de ciclos o señales de oscilador.

4. Sistema descrito por bloques y por circuitos

Periféricos de almacenamiento

Los periféricos de almacenamiento, llamados también periféricos de memoria auxiliar,


son unos dispositivos en los que se almacenan, temporales o permanentes, los datos
que va a manejar la CPU durante el proceso en curso, y que no es posible mantener en
la memoria principal. Suponen un apoyo fundamental ala computadora para realizar su
trabajo habitual.
Los periféricos de almacenamiento se pueden clasificar de acuerdo al modo de acceso
a los datos que contienen:

 Acceso secuencial.

7
En el acceso secuencial, el elemento de lectura del dispositivo debe pasar por el
espacio ocupado por la totalidad de los datos almacenados previamente al
espacio ocupado físicamente por los datos almacenados que componen el
conjunto de información a la que se desea acceder.

 Acceso aleatorio.
En el modo de acceso aleatorio, el elemento de lectura accede directamente a
la dirección donde se encuentra almacenada físicamente la información que se
desea localizar sin tener que pasar previamente por la almacenada entre el
principio de la superficie de grabación y el punto donde se almacena la
información buscada.
Es evidente la reducción de tiempo que presenta el acceso aleatorio frente al
secuencial, pero la utilización de la tecnología de acceso secuencial se debió a
que la implementación de las cintas magnéticas fue muy anterior a la puesta en
marcha operativa del primer periférico de acceso aleatorio.
En la actualidad, las cintas magnéticas tradicionales se están relegando poco a
poco a simples soportes de almacenamiento de datos históricos del sistema
informático o de procesos periódicos de copias de seguridad.

La pila (stack)

La pila es una característica interna del 8086/8088. Proporciona a los programas un


lugar donde almacenar y seguir la pista del trabajo que se está llevando a cabo. La
función más importante de la pila es la de mantener el registro de los lugares donde se
llamó a una subrutina y de los parámetros que se le pasaron. La pila también puede
utilizarse para el almacenamiento temporal de datos de trabajo, aunque esto es menos
fundamental y no tan común.

La pila obtiene su nombre por analogía con los montones de platos apilados (pilas de
platos). Cuando un dato nuevo es introducido (push) en la cima de la pila, éste será el
primer en ser extraído (pop). Por eso se dice que la pila siempre opera en el orden
“último en entrar, primero en salir” (LIFO, Last In First Out). Esto significa que cuando la
pila se utiliza para seguir la pista de los retornos de las subrutinas, la primera llamada a
subrutina que se hizo es la última que vuelve. De esta manera, la pila mantiene
ordenado el funcionamiento del programa, las subrutinas y las rutinas de tratamiento
de interrupción, sin importar lo complejo de la operación.

La pila se utiliza desde la parte de abajo (dirección más alta) a la parte de arriba
(dirección más baja), de forma que cuando un dato es introducido (push) a la cima de
la pila, se almacena en la posición de memoria justo por debajo de la cima actual. Así,
la pila crece hacia abajo de forma que, a medida que se añaden datos, la posición de la
cima se mueve más y más hacia direcciones más bajas, decrementando cada vez el
valor de SP.

8
Las interrupciones

Las interrupciones1 son mecanismos utilizados en los ordenadores por medio de los
cuales es posible interrumpir la ejecución de un programa para atender la llegada de
un acontecimiento externo. Así, pues, son señales que se le envían a la CPU para que
suspenda la ejecución de la instrucción en curso y atienda una petición determinada.
Hay cuatro tipos de interrupciones:

 Interrupciones hardware: Son las generadas por la circutería del ordenador en


respuesta a algún evento como pulsar una tecla del teclado. Este tipo de
interrupciones la maneja el controlador de interrupciones, que establece la
prioridad antes de enviar la señal a la CPU.
 Interrupciones internas: Son las generadas por la propia CPU cuando se
produce una situación anormal, como por ejemplo, una división por cero.
 Interrupciones software: Son las generadas por el propio programa para
invocar a ciertas rutinas almacenadas en memoria (ROM o RAM). Es posible
cambiar estas rutinas. Las interrupciones se aprovechan también en la
actualidad como funciones software: no son activadas por dispositivos externos
al procesador, sino que lo son por los propios programas. Las interrupciones
software pueden ser activadas internamente por la propia CPU cuando se
producen situaciones especiales, como, por ejemplo, cuando se intenta
 Interrupciones no enmascarables: Se usan para pedir la atención inmediata de
la CPU en situaciones de emergencia, como caída de voltaje o error de paridad
de memoria. Cada interrupción lleva asociado un número que identifica el tipo
de servicio que debe realizar. A partir del número de interrupción, calcula la
dirección de la rutina que realiza el servicio requerido, la ejecuta y retorna a la
instrucción siguiente a la última que ejecutó antes de que se produjera la
interrupción.
El mecanismo de la interrupción es simple: en un momento determinado se
activa la entrada de la interrupción al procesador. El procesador suspende
entonces la ejecución del programa en curso, pasando el control al programa
de interrupción. Este programa tratará la causa de la interrupción, desactivará el
dispositivo que la ha producido y devolverá el control al programa principal. El
programa principal es transparente a este proceso y no tiene ninguna indicación
de que se ha producido, salvo, por supuesto, por el tiempo de proceso
transcurrido.

5. Esquemático del sistema completo Sistema de Aplicación.

Anexo 1

6. Muestra de una Mainboard XT con identificación de dispositivos. Etiquetado y


accesorios (Primera semana clases).

9
Anexo 2

7. Registros del 8088

Los registros del procesador se emplean para controlar instrucciones en ejecución,


manejar direccionamiento de memoria y proporcionar capacidad aritmética. Los
registros son direccionables por medio de un nombre.

7.1.- Registros de Propósito General

Los registros de propósito general AX, BX, CX y DX son los caballos de batalla del
sistema. Son únicos en el sentido de que se les puede direccionar como una
palabra o como un byte.

 Registro AX: El registro AX es el registro acumulador, es utilizado para


operaciones que implican entrada/salida y la mayor parte de la
aritmética.
 Registro BX: El registro BX es el registro base, y es el único registro de
propósito general que puede ser un índice para direccionamiento
indexado. También es común emplear el BX para cálculos.

 Registro CX: El registro CX es conocido como el registro contador. Puede


contener un valor para controlar el número de veces que un ciclo se
repite o un valor para corrimiento de bits. El CX también es usado para
cálculos.

 Registro DX: El registro DX es el registro de datos. Algunas operaciones


de entrada/salida requieren su uso, y las operaciones de multiplicación y
división con cifras grandes suponen al DX y AX trabajando juntos.

7.2.- Registros Índice

Los registros SI y DI están disponibles para direccionamiento indexado y para


sumas y restas.

 Registro SI: El registro índice fuente de 16 bits es requerido por algunas


operaciones con cadenas de caracteres. El SI está asociado con el
registro DS.
 Registro DI: El registro índice destino también es requerido por algunas
operaciones con cadenas de caracteres. El DI está asociado con el
registro ES.

10
7.3.- Registros Apuntadores

Los registros SP (apuntador de pila) y BP (apuntador base) están asociados con


el registro SS y permiten al sistema accesar datos en el segmento de la pila.

 Registro SP: El apuntador de pila de 16 bits está asociado con el registro


SS y proporciona un valor de desplazamiento que se refiere a la palabra
actual que está siendo procesada en la pila. El sistema maneja de
manera automática este registro.
 Registro BP: El apuntador base de 16 bits facilita la referencia de
parámetros, los cuales son datos y direcciones transmitidos vía la pila.

7.4.- Registro de Banderas

Es un registro de 16 bits, de los cuales nueve sirven para indicar el estado actual
de la máquina y el resultado del procesamiento. Muchas instrucciones
aritméticas y de comparación cambian el estado de las banderas y apoyándose
de ellas determinan la acción subsecuente.

Los bits de las banderas son las siguientes:

 OF (overflow, desbordamiento): Indica desbordamiento del bit de


mayor orden después de una operación aritmética de números signados
(1=existe overflow; 0=no existe overflow). Para operaciones sin signo, no
se toma en cuenta esta bandera.
 DF (dirección): Controla la selección de incremento o decremento de los
registros SI o DI en las operaciones con cadenas de caracteres
(1=decremento automático; 0=incremento). La bandera DF se controla
con las instrucciones STD y CLD.

 IF (interrupción): Indica que una interrupción externa sea procesada o


ignorada (1=habilita la interrupción; 0=deshabilita la interrupción). El
estado de la bandera IF se controla con las instrucciones STI y CLI.

 TF (trampa): Permite la operación del procesador en modo de


depuración (paso a paso)

 SF (signo): Contiene el signo resultante de una operación aritmética


(0=positivo; 1=negativo).

 ZF (cero): Indica el resultado de una operación aritmética o de


comparación (0=resultado diferente de cero; 1=resultado igual a cero).

 AF (acarreo auxiliar): Contiene un acarreo externo del bit 3 en un dato


de 8 bits, para aritmética especializada. Esta bandera se prueba con las
instrucciones DAA y DAS para ajustar el valor de AL después de una
suma o resta BCD.

11
 PF (paridad): Indica paridad par o impar en una operación de datos de
ocho bits (0=paridad impar; 1=paridad par).

 CF (acarreo): Contiene el acarreo de los bits de mayor orden después de


una operación aritmética; también almacena el contenido del último bit
en una operación de corrimiento o de rotación.

7.5.- Registros de Segmento

Un registro de segmento tiene 16 bits de longitud y facilita un área de


memoria para direccionamiento conocida como el segmento actual.

 Registro CS: El DOS almacena la dirección inicial del segmento de código de


un programa en el registro CS. Esta dirección de segmento, más un valor de
desplazamiento en el registro apuntador de instrucción (IP), indica la
dirección de una instrucción que es buscada para su ejecución. Para
propósitos de programación normal, no se necesita referenciar el registro
CS.
 Registro DS: La dirección inicial de un segmento de datos de programa es
almacenada en el registro DS. Esta dirección, más un valor de
desplazamiento en una instrucción, genera una referencia a la localidad de
un byte específico en el segmento de datos.

 Registro SS: El registro SS permite la colocación en memoria de una pila,


para almacenamiento temporal de direcciones y datos. El DOS almacena la
dirección de inicio del segmento de pila de un programa en el registro SS.
Esta dirección de segmento, más un valor de desplazamiento en el registro
del apuntador de la pila (SP), indica la palabra actual en la pila que está
siendo direccionada. Para propósitos de programación normal, no se
necesita referenciar el registro SS.

 Registro ES: Algunas operaciones con cadenas de caracteres utilizan el


registro extra de segmento para manejar el direccionamiento de memoria.
El registro ES está asociado con el registro DI (Índice). Un programa que
requiere el uso del registro ES puede inicializarlo con una dirección de
segmento apropiada.

7.6.- Registro Apuntador de Instrucciones

El registro IP de 16 bits contiene el desplazamiento de dirección de la siguiente


instrucción que se ejecuta. El IP está asociado con el registro CS en el sentido de
que el IP indica la instrucción actual dentro del segmento de código que se está
ejecutando actualmente.

12
7.7.- Unidad aritmética y lógica
Es la encargada de realizar las operaciones aritméticas (suma, suma con
"arrastre", resta, resta con "préstamo" y comparaciones) y lógicas (AND, OR,
XOR y TEST). Las operaciones pueden ser de 16 bits o de 8 bits.

7.8.- 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 según una tabla que tiene
almacenada en ROM llamada CROM (Control Read Only Memory).

7.9.- Cola de instrucciones


Almacena las instrucciones para ser ejecutadas. La cola se carga cuando el bus
está desocupado, de esta manera se logra una mayor eficiencia del mismo. La
cola del 8086 tiene 6 bytes y se carga de a dos bytes por vez (debido al tamaño
del bus de datos), mientras que el del 8088 tiene cuatro bytes. Esta estructura
tiene rendimiento óptimo cuando no se realizan saltos, ya que en este caso
habría que vaciar la cola (porque no se van a ejecutar las instrucciones que van
después del salto) y volverla a cargar con instrucciones que se encuentran a
partir de la dirección a donde se salta. Debido a esto las instrucciones de salto
son (después de multiplicaciones y divisiones) las más lentas de este
microprocesador.

7.10.- Lógica de control del bus:


El cometido de este bloque es poder unir los bloques anteriormente
mencionados con el mundo exterior, es decir, la memoria y los periféricos. El
8088 tiene un bus de datos externo reducido de 8 bits. La razón para ello era
prever la continuidad entre el 8086 y los antiguos procesadores de 8 bits, como
el 8080 y el 8085. Teniendo el mismo tamaño del bus (así como similares
requerimientos de control y tiempo), el 8088, que es internamente un
procesador de 16 bits, puede reemplazar a los microprocesadores ya
nombrados en un sistema ya existente. El 8088 tiene muchas señales en común
con el 8085, particularmente las asociadas con la forma en que los datos y las
direcciones están multiplexadas, aunque el 8088 no produce sus propias
señales de reloj como lo hace el 8085 (necesita un chip de soporte llamado
8284, que es diferente del 8224 que necesitaba el microprocesador 8080). El
8088 y el 8085 siguen el mismo esquema de compartir los terminales
correspondientes a los 8 bits más bajos del bus de direcciones con los 8 bits del
bus de datos, de manera que se ahorran 8 terminales para otras funciones del
microprocesador. El 8086 comparte los 16 bits del bus de datos con los 16 más
bajos del bus de direcciones. El 8085 y el 8088 pueden, de hecho, dirigir
directamente los mismos chips controladores de periféricos. Las investigaciones

13
de hardware para sistemas basados en el 8080 o el 8085 son, en su mayoría,
aplicables al 8088.

En todo lo recién explicado se basó el éxito del 8088.

8. Modos de direccionamiento

Estos procesadores tienen 27 modos de direccionamiento (una cantidad bastante más


grande que los microprocesadores anteriores) o reglas para localizar un operando de
una instrucción. Tres de ellos son comunes a microprocesadores anteriores:

Direccionamiento inmediato.- del operando es un número que se encuentra en la


misma instrucción.
Direccionamiento a registro.-el operando es un registro del microprocesador.
Direccionamiento inherente.- el operando está implícito en la instrucción, por
ejemplo, en la multiplicación uno de los operandos siempre es el acumulador.

El resto de los modos sirve para localizar un operando en memoria. Para facilitar la
explicación de estos modos, se pueden resumir de la siguiente manera:

Deben sumarse cuatro cantidades:

1) Dirección de segmento

2) Dirección base

3) Una cantidad índice

4) Un desplazamiento.

La dirección de segmento se almacena en el registro de segmento (DS, ES, SS o CS). El


contenido del registro de segmento se multiplica por 16 antes de utilizarse para
obtener la dirección real. El registro de segmentación siempre se usa para referenciar a
memoria. La direccion de base se almacena en el registro base (BX o BP). El índice se
almacena en el registro índice (SI o DI). Cualquiera de estas dos cantidades, la suma de
las dos o ninguna, pueden utilizarse para calcular la dirección real, pero no pueden
sumarse dos bases o dos índices. Los registros restantes (AX, CX, DX y SP) no pueden
utilizarse para direccionamiento indirecto. El programador puede utilizar tanto la base
como el índice para gestionar ciertas cosas, tales como matrices de dos dimensiones, o
estructuras internas a otras estructuras, esquemas que se utilizan en las prácticas
comunes de programación. La base y el índice son variables o dinámicas, ya que están
almacenadas en registros de la CPU. Es decir, pueden modificarse fácilmente mientras
se ejecuta un programa.

Además del segmento, base e índice, se usa un desplazamiento de 16 bits, 8 bits o 0


bits (sin desplazamiento). Ésta es una cantidad estática que se fija al tiempo de
ensamblado (paso de código fuente a código de máquina) y no puede cambiarse

14
durante la ejecución del programa (a menos que el programa se escriba sobre sí
mismo, lo que constituye una práctica no aconsejada).

Todo esto genera los 24 modos de direccionamiento a memoria que se ven a


continuación:

 Registro indirecto: 1) [BX], 2) [DI]. 3) [SI].


 Basado: 4) desp8[BX], 5) desp8[BP], 6) desp16[BX], 7) desp16[BP].

 Indexado: 8) desp8[SI], 9) desp8[DI], 10) desp16[SI], 11) desp16[DI].

 Basado-indexado: 12) [BX+SI], 13) [BX+DI], 14) [BP+SI], 15) [BX+DI].

 Basado-indexado con desplazamiento: 16) desp8[BX+SI], 17) desp8[BX+DI], 18)


desp8[BP+SI], 19) desp8[BX+DI], 20) desp16[BX+SI], 21) desp16[BX+DI], 22)
desp16[BP+SI], 23) desp16[BX+DI].

 Directo: 24) [desp16].

Aquí desp8 indica desplazamiento de 8 bits y desp16 indica desplazamiento de 16 bits.


Otras combinaciones no están implementadas en la CPU y generarán error al querer
ensamblar, por ejemplo, ADD CL,[DX+SI].

El ensamblador genera el tipo de desplazamiento más apropiado (0, 8 ó 16 bits)


dependiendo del valor que tenga la constante: si vale cero se utiliza el primer caso, si
vale entre -128 y 127 se utiliza el segundo, y en otro caso se utiliza el tercero. Nótese
que [BP] sin desplazamiento no existe. Al ensamblar una instrucción como, por
ejemplo, MOV AL,[BP], se generará un desplazamiento de 8 bits con valor cero. Esta
instrucción ocupa tres bytes, mientras que MOV AL,[SI] ocupa dos, porque no necesita
el desplazamiento.

Estos modos de direccionamiento producen algunos inconvenientes en el 8086/8088.


La CPU gasta tiempo calculando una dirección compuesta de varias cantidades.
Principalmente esto se debe al hecho de que el cálculo de direcciones está programado
en microcódigo (dentro de la CROM del sistema de control de la unidad de ejecución).
En las siguientes versiones (a partir del 80186/80188) estos cálculos están cableados en
la máquina y, por lo tanto, cuesta mucho menos tiempo el realizarlos.

Veamos un ejemplo: MOV AL, ES:[BX+SI+6]. En este caso el operando de la izquierda


tiene direccionamiento a registro mientras que el de la derecha indica una posición de
memoria. Poniendo valores numéricos, supongamos que los valores actuales de los
registros sean: ES = 3200h, BX = 200h, SI = 38h. Como se apuntó más arriba la dirección
real de memoria será:

ES * 10h + BX + SI + 6 = 3200h * 10h + 200h + 38h + 6 = 3223Eh

15
9. Set de instrucciones del 8088

16
17
18
19
20
10. Lenguaje maquina, macroensamblador del 8088

Todo procesador, grande o pequeño, desde el de una calculadora hasta el de un


supercomputador, ya sea de propósito general o específico, posee un lenguaje único
que es capaz de reconocer y ejecutar. Por razones que resultan obvias, este lenguaje ha
sido denominado Lenguaje de Máquina y más que ser propio de un computador
pertenece a su microprocesador. El lenguaje de máquina está compuesto por una serie
de instrucciones, que son las únicas que pueden ser reconocidas y ejecutadas por el
microprocesador. Este lenguaje es un conjunto de números que representan las
operaciones que realiza el microprocesador a través de su circuitería interna. Estas
instrucciones, por decirlo así, están grabadas o "alambradas" en el hardware y no
pueden ser cambiadas. El nivel más bajo al que podemos aspirar a llegar en el control
de un microprocesador es precisamente el del lenguaje de máquina.

Ahora bien, siendo el lenguaje de máquina un conjunto de números, ¿cómo es capaz el


microprocesador de saber cuándo un número representa una instrucción y cuándo un
dato? El secreto de esto reside en la dirección de inicio de un programa y en el estado
del microprocesador. La dirección de inicio nos indica en qué localidad de memoria
comienza un programa, y en consecuencia que datos deberemos considerar como
instrucciones. El estado del microprocesador nos permite saber cuándo éste espera
una instrucción y cuándo éste espera un dato.

Obviamente, el lenguaje de máquina de un microprocesador no puede ser ejecutado


por otro microprocesador de arquitectura distinta, a menos que haya cierto tipo de
compatibilidad prevista. Por ejemplo, un 80486 es capaz de ejecutar lenguaje de
máquina propio y soporta el código generado para microprocesadores anteriores de la
misma serie (desde un 8086 hasta un 80386). Por otra parte, un PowerPC es capaz de
ejecutar instrucciones de los microprocesadores Motorola 68xxx y de los Intel
80xx/80x86. En ambos casos, el diseño de los microprocesadores se hizo tratando de
mantener cierto nivel de compatibilidad con los desarrollados anteriormente. En el
segundo caso, este nivel de compatibilidad se extendió a los de otra marca. Sin
embargo, un 8088 no puede ejecutar código de un 80186 o superiores, ya que los

21
procesadores más avanzados poseen juegos de instrucciones y registros nuevos no
contenidos por un 8088. Un caso similar es la serie 68xxx, pero de ninguna manera
podemos esperar que un Intel ejecute código de un Motorola y viceversa. Y esto no
tiene nada que ver con la compañía, ya que Intel desarrolla otros tipos de
microprocesadores como el 80860 y el iWARP, los cuales no pueden compartir código
ni entre ellos ni entre los 80xx/80xxx.

Ahora bien, mientras que con el lenguaje de máquina, nosotros obtenemos un control
total del microprocesador, la programación en este lenguaje resulta muy difícil y fácil
para cometer errores. No tanto por el hecho de que las instrucciones son sólo
números, sino porque se debe calcular y trabajar con las direcciones de memoria de los
datos, los saltos y las direcciones de llamadas a subrutinas, además de que para poder
hacer ejecutable un programa, se deben enlazar las rutinas de run-time y servicios del
sistema operativo. Este proceso es al que se le denomina ensamblado de código. Para
facilitar la elaboración de programas a este nivel, se desarrollaron los Ensambladores y
el Lenguaje Ensamblador.

Existe una correspondencia 1 a 1 entre las instrucciones del lenguaje de máquina y las
del lenguaje ensamblador. Cada uno de los valores numéricos del lenguaje de máquina
tiene una representación simbólica de 3 a 5 letras como instrucción del lenguaje
ensamblador. Adicionalmente, este lenguaje proporciona un conjunto de pseudo-
operaciones (tambien conocidas como directivas del ensamblador) que sirven para
definir datos, rutinas y todo tipo de información para que el programa ejecutable sea
creado de determinada forma y en determinado lugar.

Aun cuando el lenguaje ensamblador fue diseñado para hacer más fácil la
programación de bajo nivel, esta resulta todavía complicada y muy laboriosa. Por tal
motivo se desarrollaron los lenguajes de alto nivel, para facilitar la programación de los
computadores, minimizando la cantidad de instrucciones a especificar. Sin embargo,
esto no quiere decir que el microprocesador ejecute dichos lenguajes. Cada una de las
instrucciones de un lenguaje de alto nivel o de un nivel intermedio, equivalen a varias
de lenguaje máquina o lenguaje ensamblador.

La traducción de las instrucciones de nivel superior a las de bajo nivel la realizan


determinados programas. Por una parte tenemos los interpretes, como DBase, BASIC,
APL, y Lisp. En estos, cada vez que se encuentra una instrucción, se llama una
determinada rutina de lenguaje de máquina que se encarga de realizar las operaciones
asociadas, pero en ningún momento se genera un código objeto y mucho menos un
código ejecutable.

Por otra parte, tenemos los compiladores, como los desarrollados para Fortran, Clipper,
COBOL, Pascal o C, que en vez de llamar y ejecutar una rutina en lenguaje de máquina,
éstos juntan esas rutinas para formar el código objeto que, después de enlazar las
rutinas de run-time y llamadas a otros programas y servicios del sistema operativo, se
transformará en el programa ejecutable.

22
Finalmente, tenemos los ensambladores— como los descritos en este trabajo —que
son como una versión reducida y elemental de un compilador (pero que de ninguna
manera deben considerarse como tales), ya que lo único que tienen que hacer es
cambiar toda referencia simbólica por la dirección correspondiente, calcular los saltos,
resolver referencias y llamadas a otros programas, y realizar el proceso de enlace. Los
ensambladores son programas destinados a realizar el ensamblado de un determinado
código.

11. Debugger, y simuladores del 8088

C:\> Debug [Enter]


En la siguiente línea aparecerá un guión, éste es el indicador del Debug, en este
momento se pueden introducir las instrucciones del Debug. Utilizando el comando:

- r [Enter]
Se desplegaran todos los contenidos de los registros internos de la UCP; una forma
alternativa de mostrarlos es usar el comando "r" utilizando como parámetro el nombre
del registro cuyo valor se quiera visualizar. Por ejemplo:

- rbx
Esta instrucción desplegará únicamente el contenido del registro BX y cambia el
indicador del Debug de " - " a " : "
Estando así el prompt es posible cambiar el valor del registro que se visualizó tecleando
el nuevo valor y a continuación [Enter], o se puede dejar el valor anterior presionando
[Enter] sin teclear ningún valor.
Es posible cambiar el valor del registro de banderas, así como utilizarlo como
estructura de control en nuestros programas como se verá más adelante. Cada bit del
registro tiene un nombre y significado especial, la lista dada a continuación describe el
valor de cada bit, tanto apagado como prendido y su relación con las operaciones del
procesador:

Overflow
NV = no hay desbordamiento;
OV = sí lo hay
Direction
UP = hacia adelante;
DN = hacia atras;
Interrupts
DI = desactivadas;
EI = activadas
Sign
PL = positivo;
NG = negativo
Zero
NZ = no es cero;

23
ZR = sí lo es
Auxiliary Carry
NA = no hay acarreo auxiliar;
AC = hay acarreo auxiliar
Parity
PO = paridad non;
PE = paridad par;
Carry
NC = no hay acarreo;
CY = Sí lo hay

Las funciones de la BIOS se invocan, desde los programas de usuario, ejecutando una
interrupción software con un cierto valor inicial en los registros. La BIOS emplea un cierto
rango de interrupciones, cada una encargada de una tarea específica:

INT 10h: Servicios de Vídeo (texto y gráficos).

INT_10: STI ; Video bios services

CLD ; ...strings auto-increment

PUSH BP

PUSH ES

PUSH DS

PUSH SI

PUSH DI

PUSH DX

PUSH CX

PUSH BX

PUSH AX

MOV BX,40h

MOV DS,BX

MOV BL,DS:10h ; Get equipment

AND BL,30h

CMP BL,30h ; Check for monochrome card

24
MOV BX,0B800h

JNZ C_01 ; ...not there, BX --> CGA

MOV BX,0B000h ; Else BX --> MONO

INT 11h: Informe sobre la configuración del equipo.

INT_11: STI ; Equipment present

PUSH DS

MOV AX,40h

MOV DS,AX

MOV AX,DS:10h ; AX = equipment byte contents

POP DS

IRET

ENTRY 0F859h ; IBM entry for cassette int.

INT 12h: Informe sobre el tamaño de la memoria convencional.

INT_12: STI ; Kbytes of memory present

PUSH DS

MOV AX,40h

MOV DS,AX

MOV AX,DS:13h ; AX = memory size byte

POP DS

IRET

ENTRY 0F84Dh ; IBM entry for equipment check

25

INT 13h: Servicios de disco (muy elementales: pistas, sectores, etc.).

INT_13: STI ; Floppy disk services

PUSH BP

PUSH SI

PUSH DI

PUSH DS

PUSH ES

PUSH BX

MOV DI,AX ; Request type in DI, for index

XOR AX,AX

MOV DS,AX

LES SI,DWord ptr DS:78h ; Get disk parameter table

MOV AX,40h

MOV DS,AX

MOV BX,5

MOV AX,ES:[BX+SI] ; Get (Gap Length, DTL) in AX

PUSH AX ; ...save it

DEC BX

DEC BX

MOV AX,ES:[BX+SI] ; Get (Bytes/sector,EOT) in AX

PUSH AX ; ...save it

XCHG CL,DH

XCHG DL,CL

PUSH DX ; Push (Head,Drive) swapped

PUSH CX

26
PUSH DI

MOV BP,SP ; Mark bottom of stack frame

ifdef SLOW_FLOPPY

CALL FD_SPD ; ...execute request lo speed

else

CALL FD_XQT ; ...execute at current speed

endif

MOV AH,ES:[SI+2] ; Get new motor count

MOV DS:40h,AH ; ...and save it

MOV AH,DS:41h ; Get completion status

CMP AH,1 ; ...check for write protect

CMC ; ...was write protect error

POP BX

POP CX

POP DX

XCHG DL,CL

XCHG CL,DH

POP BX ; Clean

POP BX ; ...up

POP BX ; ...stack

POP ES

POP DS

POP DI

POP SI

POP BP

RETF 2

27
INT 14h: Comunicaciones en serie.

INT_14: STI ; Serial com. bios services

PUSH DS

PUSH DX

PUSH SI

PUSH DI

PUSH CX

PUSH BX

MOV BX,40h

MOV DS,BX

MOV DI,DX

MOV BX,DX

SHL BX,1

MOV DX,[BX] ; Get com i/o port number

OR DX,DX ; ...if it exists

JZ COM_ND ; ...none, exit

OR AH,AH ; Init on AH=0

JZ COMINI

DEC AH

JZ COMSND ; Send on AH=1

DEC AH

JZ COMGET ; Rcvd on AH=2

DEC AH

JZ COMSTS ; Stat on AH=3

INT 15h: Funciones casette (PC) y servicios especiales del sistema (AT).

28
INT_15: STC ; Cassette service (error ret)

MOV AH,86h

RETF 2

ENTRY 0F85Fh ; IBM non-maskable int. entry

INT 16h: Servicios de teclado.

INT_16: STI ; Keyboard bios services

PUSH DS

PUSH BX

MOV BX,40h

MOV DS,BX ; Load work segment

OR AH,AH

JZ KPD_RD ; Read keyboard buffer, AH=0

DEC AH

JZ KPD_WT ; Set Z if char ready, AH=1

DEC AH

JZ KPD_SH ; Return shift in AL , AH=2

INT 17h: Servicios de impresora.

INT_17: STI ; Parallel printer services

PUSH DS

PUSH BX

PUSH CX

PUSH DX

MOV BX,40h

29
MOV DS,BX

MOV BX,DX ; DX is printer index (0 - 3)

SHL BX,1 ; ...word index

MOV DX,[BX+8] ; Load printer port

OR DX,DX

JZ LP_01 ; Goes to black hole

OR AH,AH

JZ LP_02 ; Function is print, AH=0

DEC AH

JZ LP_INI ; Function is init , AH=1

DEC AH

JZ LP_04 ; Get the status , AH=2

INT 18h: Llamar a la ROM del BASIC (sólo máquinas IBM).

INT 19h: Reinicialización del sistema.

INT_19: JMP IPL ; Warm boot

ENTRY 0E729h ; IBM entry point for INT 14h

BAUD DW 0417h ; 110 baud clock divisor

DW 0300h ; 150 baud clock divisor

DW 0180h ; 300 baud clock divisor

DW 00C0h ; 600 baud clock divisor

DW 0060h ; 1200 baud clock divisor

DW 0030h ; 2400 baud clock divisor

30
DW 0018h ; 4800 baud clock divisor

DW 000Ch ; 9600 baud clock divisor

INT 1Ah: Servicios horarios.

INT_1A: STI ; User time_of_day bios service

PUSH DS

PUSH AX

MOV AX,40h

MOV DS,AX

POP AX ; Get request type

CLI ; ...freeze clock

OR AH,AH

JZ TD_01 ; Read time, AH=0

DEC AH

JNZ TD_02 ; ...invalid request

MOV DS:6Ch,DX ; Set time, AH=1

MOV DS:6Eh,CX ; ...set time hi

MOV Byte ptr DS:70h,0 ; ...not a new day

JMP SHORT TD_02

INT 1Fh: Apunta a la tabla de los caracteres ASCII 128-255 (8x8 puntos).

La mayoría de las interrupciones se invocan solicitando una función determinada (que se indica
en el registro AH al llamar) y se limitan a devolver un resultado en ciertos registros, realizando
la tarea solicitada. En general, sólo resultan modificados los registros que devuelven algo,
aunque BP es corrompido en los servicios de vídeo de las máquinas más obsoletas.

31
LA BIOS Y LOS DISQUETES.

Resulta interesante conocer el comportamiento de la BIOS en relación a los disquetes, ya que


las aplicaciones desarrolladas bajo DOS de una u otra manera habrán de cooperar con la BIOS
por razones de compatibilidad (o al menos respetar ciertas especificaciones). El
funcionamiento del disquete se controla a través de funciones de la INT 13h, aunque esta
interrupción por lo general acaba llamando a la INT 40h que es quien realmente gestiona el
disco en las BIOS modernas de AT. Las funciones soportadas por esta interrupción son: reset del
sistema de disco (reset del controlador de disquetes, envío del comando specify y
recalibramiento del cabezal), consulta del estado del disco (obtener resultado de la última
operación), lectura, escritura y verificación de sectores, formateo de pistas, obtención de
información del disco y las disqueteras, detección del cambio de disco, establecimiento del tipo
de soporte para formateo... algunas de estas últimas funciones no están disponibles en las
máquinas PC/XT. La BIOS se apoya en varias variables ubicadas en el segmento 40h de la
memoria. Estas variables son las siguientes (para más información, consultar el apéndice al
final del libro):

Byte 40h:3Eh Estado de recalibramiento del disquete. Esta variable indica varias cosas: si se
ha producido una interrupción de disquete, o si es preciso recalibrar alguna disquetera debido
a un reset anterior.

Byte 40h:3Fh Estado de los motores. En esta variable se indica, además del estado de los
motores de las 4 posibles disqueteras (si están encendidos o no), la última unidad que fue
seleccionada y la operación en curso sobre la misma.

Byte 40h:40h Cuenta para la detención del motor. Este byte es decrementado por la
interrupción periódica del temporizador; cuando llega a 0 todos los motores de las disqueteras
(realmente, el único que estaba girando) son detenidos. Dejar el motor girando unos segundos
tras la última operación evita tener que esperar a que el motor acelere antes de la siguiente (si
esta llega poco después).

Byte 40h:41h Estado de la última operación: se actualiza tras cada acceso al disco, indicando
los errores producidos (0 = ninguno).

Bytes 40h:42h A partir de esta dirección, 7 bytes almacenan el resultado de la última


operación de disquete o disco duro. Se trata de los 7 bytes que devuelve el NEC765 tras los
principales comandos.

Byte 40h:8Bh Control del soporte (AT). Esta variable almacena, entre otros, la última
velocidad de transferencia seleccionada.

Byte 40h:8Fh Información del controlador de disquete (AT). Se indica si la unidad soporta 80
cilindros (pues sí, la verdad) y si soporta varias velocidades de transferencia.

Byte 40h:90h Estado del soporte en la unidad A. Se indica la velocidad de transferencia a


emplear en el disquete introducido en esta unidad, si precisa o no saltos dobles del cabezal
(caso de los disquetes de 40 cilindros en unidades de 80), y el resultado de los intentos de la

32
BIOS (la velocidad puede ser correcta o no, según se haya logrado determinar el tipo de
soporte).

Byte 40h:91h Lo mismo que el byte anterior, pero para la unidad B.

Byte 40h:92h Estado del soporte en la unidad A al inicio de la operación.

Byte 40h:93h Estado del soporte en la unidad B al inicio de la operación.

Byte 40h:94h Número de cilindro en curso en la unidad A.

Byte 40h:95h Número de cilindro en curso en la unidad B.

Además de estas variables, la BIOS utiliza también una tabla de parámetros apuntada por la INT
1Eh. Los valores para programar ciertas características del FDC según el tipo de disco pueden
variar, aunque algunos son comunes. Esta tabla determina las principales características de
operación del disco. Dicha tabla está inicialmente en la ROM, en la posición 0F000h:0EFC7h de
todas las BIOS compatibles (prácticamente el 100%), aunque el DOS suele desviarla a la RAM
para poder actualizarla. El formato de la misma es:

byte 0: Se corresponde con el byte 1 del comando 'Specify' del 765, que indica el step rate (el
tiempo de acceso cilindro-cilindro, a menudo es 0Dh = 3 ó6 ms) y el head unload time
(normalmente, 0Fh = 240 ó480 ms).

byte 1: Es el byte 2 del comando 'Specify': los bits 7..1 indican el head load time (normalmente
01h = 2 ó4 ms) y el bit 0 suele estar a 0 para indicar modo DMA.

byte 2: Tics de reloj (pulsos de la interrupción 8) que transcurren tras el acceso hasta que se
para el motor.

byte 3: Bytes por sector (0=128, 1=256, 2=512, 3=1024).

byte 4: Sectores por pista.

byte 5: Longitud del GAP entre sectores (normalmente 2Ah en unidades de 5¼ y 1Bh en las de
3½).

byte 6: Longitud de sector (ignorado si el byte 3 no es 0).

byte 7: Longitud del GAP 3 al formatear (80 en 5¼ y 3½-DD, 84 en 5¼-HD y 108 en 3½-HD).

byte 8: Byte de relleno al formatear (normalmente 0F6h).

byte 9: Tiempo de estabilización del cabezal en ms.

byte 10: Tiempo de aceleración del motor (en unidades de 1/8 de segundo).

33
El tiempo de estabilización del cabezal es el tiempo que hay que esperar tras mover el cabezal
al cilindro adecuado, hasta que éste se asiente, con objeto de garantizar el éxito de las
operaciones futuras; esta breve pausa es establecida en 25 milisegundos en la BIOS del PC
original, aunque otras BIOS y el propio DOS suelen bajarlo a 15. Del mismo modo, el tiempo de
aceleración del motor (byte 10) es el tiempo que se espera a que el motor adquiera la
velocidad de rotación correcta, nada más ponerlo en marcha. En cualquier caso, es norma
general intentar tres veces el acceso a disco (con resets de por medio) hasta considerar que un
error es real. En general, pese a estos valores usuales, la flexibilidad del sistema de disco es
extraordinaria y suele responder favorablemente con unos altísimos niveles de tolerancia en
las temporizaciones. Una excepción quizá la constituye el valor de GAP empleado al formatear,
al ser un parámetro demasiado importante.

TABLA DE VARIABLES DE LA BIOS

La siguiente información procede del fichero MEMORY.LST de Robin Walker, incluido en el


mismo paquete del INTERRUP.LST. La información está actualizada mayoritariamente al
24/8/92. Se han eliminado aspectos demasiado técnicos sobre las tarjetas EGA/VGA y alguna
información sobre hardware no estándar.

Las variables de la BIOS comienzan en el segmento de memoria 40h, justo después de la


tabla de vectores de interrupción. Son empleadas por los programas de control ubicados en las
memorias ROM del ordenador. En general, siempre es preferible utilizar una función de la BIOS
que modificar directamente sus variables, aunque a veces ello no es posible o puede no
resultar conveniente. Los campos colocados entre llaves ('{' y '}') no están documentados por
IBM y podrían cambiar en el futuro. Los códigos entre corchetes indican a qué máquinas o
configuraciones, en exclusiva, se aplica la información.

Offset Tamaño Descripción

00h WORD Dirección E/S base del primer puerto serie (0 si no instalado)

02h WORD Dirección E/S base del segundo puerto serie (0 si no instalado)

04h WORD Dirección E/S base del tercer puerto serie (0 si no instalado)

06h WORD Dirección E/S base del cuarto puerto serie (0 si no instalado)

Nota: Los campos de arriba son rellenados en estricto orden por

el programa POST de la BIOS que inicializa el sistema, sin

dejar huecos. Los puertos serie del DOS y de la BIOS pueden

redefinirse modificando estos campos.

34
08h WORD Dirección E/S base del primer puerto paralelo (0 si no instalado)

0Ah WORD Dirección E/S base del segundo puerto paralelo (0 si no instalado)

0Ch WORD Dirección E/S base del tercer puerto paralelo (0 si no instalado)

0Eh WORD [Máquinas no PS]:

Dirección E/S base del cuarto puerto paralelo (0 si no instalado)

[Máquinas PS]:

Segmento del área de datos extendida de la BIOS

Nota: Los campos de arriba son rellenados en estricto orden por

el programa POST de la BIOS que inicializa el sistema, sin

dejar huecos. Los puertos paralelo del DOS y de la BIOS

pueden redefinirse modificando estos campos.

10h WORD Hardware instalado:

bits 15-14: número de puertos paralelos

bit 13: [PC Convertible] = 1 si hay modem interno

bit 12: reservado

bits 11- 9: número de puertos serie

bit 8: reservado

bits 7- 6: número de disqueteras - 1

bits 5- 4: modo de vídeo inicial

00b = EGA,VGA,PGA

01b = 40 x 25 color

10b = 80 x 25 color

11b = 80 x 25 mono

bit 3: reservado

bit 2: [máquinas PS] = 1 si hay dispositivo apuntador

[máquinas no PS] reservado

bit 1: = 1 si hay coprocesador

35
bit 0: = 1 si hay disquete disponible para arrancar

12h BYTE [PC Convertible] estado del POST

[AT] {Banderines de inicialización de los test de fabricación}

13h WORD Tamaño de memoria convencional en kbytes (0-640)

15h BYTE [AT] {Usado en los test de fabricación}

16h BYTE [AT] {Usado en los test de fabricación}

[PS/2 Mod 30] Banderines de control de la BIOS

17h BYTE Banderines de estado del teclado 1:

bit 7 =1 INSert activo

bit 6 =1 Caps Lock activo

bit 5 =1 Num Lock activo

bit 4 =1 Scroll Lock activo

bit 3 =1 cualquier Alt pulsado

bit 2 =1 cualquier Ctrl pulsado

bit 1 =1 Shift izquierdo pulsado

bit 0 =1 Shift derecho pulsado

18h BYTE Banderines de estado del teclado 2:

bit 7 = 1 INSert pulsado

bit 6 = 1 Caps Lock pulsado

bit 5 = 1 Num Lock pulsado

bit 4 = 1 Scroll Lock pulsado

bit 3 = 1 Estado de pausa activo

bit 2 = 1 Sys Req pulsada

bit 1 = 1 Alt izquierdo pulsado

bit 0 = 1 Ctrl izquierdo pulsado

19h BYTE Teclado: Area de trabajo para Alt-nnn (nnn=teclado numérico)

1Ah WORD Teclado: puntero al próximo carácter en el buffer

36
1Ch WORD Teclado: puntero a la primera entrada vacía en el buffer

1Eh 16 WORDs Buffer del teclado (cola circular, ver offsets 80h y 82h para moverlo)

3Eh BYTE Estado de recalibración del disquete:

bit 7 = 1 Se ha producido interrupción hardware del disquete

bits 6-4 reservados

bit 3 = 1 Recalibrada disquetera 3

bit 2 = 1 Recalibrada disquetera 2

bit 1 = 1 Recalibrada disquetera 1

bit 0 = 1 Recalibrada disquetera 0

3Fh BYTE Estado del motor del disquete:

bit 7 = 1 la operación en curso es escritura o formateo

= 0 la operación en curso es lectura o verificación

bit 6 reservado

bits 5-4 número de disquetera seleccionada (0-3)

bit 3 = 1 motor de la disquetera 3 en marcha

bit 2 = 1 motor de la disquetera 2 en marcha

bit 1 = 1 motor de la disquetera 1 en marcha

bit 0 = 1 motor de la disquetera 0 en marcha

40h BYTE Contador de tics de reloj que faltan para parar motor de la disquetera

41h BYTE Estado de la última operación de disco (0 = correcta)

bit 7 = 1 unidad no preparada

bit 6 = 1 error de posicionamiento del cabezal

bit 5 = 1 fallo general del controlador

bits 4-0:

00h no hay error

01h solicitud incorrecta

02h no encontrada la marca de direcciones

37
03h error de protección contra escritura

04h sector no encontrado

06h línea de disco cambiado activa

08h el DMA se ha desbordado

09h el DMA ha cruzado una frontera de 64k

0Ch medio físico desconocido

10h fallo de CRC al leer

42h 7 BYTEs Bytes de estado/comandos de la Disquetera/Disco fijo

49h BYTE Modo de vídeo activo

4Ah WORD Número de columnas en pantalla

4Ch WORD Tamaño del buffer de vídeo de la página activa en bytes

4Eh WORD Desplazamiento sobre la memoria de pantalla de la página activa

50h 16 BYTEs Posición del cursor (columna, fila) para las 8 páginas

60h WORD Tipo de cursor, compatible 6845, byte alto=línea inicial, bajo=final

62h BYTE Página activa

63h WORD Dirección E/S base del controlador de vídeo: color=03D4h, mono=03B4h

65h BYTE Valor actual del registro de selección de modo 03D8h/03B8h

66h BYTE Valor actual almacenado en el registro de paleta de la CGA 03D9h

67h DWORD Punto de retorno al modo real tras ciertos resets del POST

6Bh BYTE Ultima interrupción no esperada por el POST

6Ch DWORD Tics de reloj (1/18,2 segundos) ocurridos desde medianoche

70h BYTE Flag de medianoche, <> 0 si el contador pasa de las 23:59:59.99

71h BYTE Banderín de Ctrl-Break: bit 7=1

72h WORD Banderín de reset del POST:

= 1234h si no realizar chequeo de memoria (arranque caliente)

= 4321h [solo PS/2 MCA] si preservar la memoria al arrancar

= 5678h [PC Convertible] sistema detenido

38
= 9ABCh [PC Convertible] test de fabricación

= ABCDh [PC Convertible] bucle del POST

= 64h modo «Burn-in»

74h BYTE Estado de la última operación del disco fijo: {salvo unidades ESDI}

00h no hubo error

01h función solicitada incorrecta

02h no encontrada marca de direcciones

03h error de protección contra escritura

04h sector no encontrado

05h fallo en el reset

07h fallo en la actividad de los parámetros del disco

08h el DMA se ha desbordado

09h alineamiento de datos incorrecto para el DMA

0Ah detectado banderín de sector erróneo

0Bh detectada pista errónea

0Dh número incorrecto de sectores para el formateo

0Eh detectada marca de direcciones de control

0Fh nivel de arbitrio del DMA fuera de rango

10h error ECC o CRC incorregible

11h error de datos ECC corregido

20h fallo general del controlador

40h fallo en el posicionamiento del cabezal

80h fuera de tiempo, no responde

AAh disco no preparado

BBh error indefinido

CCh fallo de escritura en el disco seleccionado

E0h el registro de errores es cero

39
FFh fallo de sentido

75h BYTE Disco fijo: número de discos fijos

76h BYTE Disco fijo: byte de control {IBM lo documenta sólo en el XT}

77h BYTE Disco fijo: offset del puerto E/S {IBM lo documenta sólo en el XT}

78h 3 BYTEs Contadores de «time-out» para los puertos paralelos 1-3

7Bh BYTE Contador «time-out» para puerto paralelo 4 [máquinas no PS]

bit 5 = 1 si especificación de DMA virtual soportada [PS] (ver INT 4B)

7Ch 4 BYTEs Contadores de «time-out» para los puertos serie 1-4

80h WORD Offset de inicio del buffer del teclado respecto al segmento 40h

(normalmente 1Eh)

82h WORD Offset del fin del buffer del teclado+1 respecto al segmento 40h

(normalmente 3Eh)

[La BIOS del XT con fecha 8/11/82 acaba aquí]

84h BYTE Vídeo: líneas en pantalla menos 1 en EGA/MCGA/VGA

85h WORD Video: altura del carácter, en pixels, en EGA/MCGA/VGA

87h BYTE Vídeo: control de EGA/VGA.

bit 7: = 1 si no limpiar RAM (ver INT 10h, AH=0)

88h BYTE Vídeo: switches EGA/VGA [MCGA: reservado]

89h BYTE Vídeo: MCGA/VGA opción de control del modo

8Ah BYTE Vídeo [MCGA/VGA]: índice en tabla Códigos de Combinaciones de Pantalla

8Bh BYTE Control del medio físico del disco [no XT]:

bits 7-6: Ultima tasa de transferencia fijada por el controlador:

00=500kbps, 01=300kbps, 10=250kbps, 11=1Mbps

bits 5-4: Ultimo «step rate» seleccionado en el disquete:

00-0Ch, 01=0Dh, 10=0Eh, 11=0Ah

40
bits 3-2: {Tasa de transferencia al inicio de la operación}

bits 1-0: reservado

8Ch BYTE Estado del controlador del disco fijo [no XT]

8Dh BYTE Estado de error del controlador de disco fijo [no XT]

8Eh BYTE Control de interrupciones del disco fijo [no XT]

8Fh BYTE Información del controlador de disquete [no XT]:

bit 7: reservado

bit 6: = 1 si disco 1 determinado

bit 5: = 1 si disco 1 es multi-ratio, válido si disco determinado

bit 4: = 1 si disco 1 soporta 80 pistas, siempre válido

bit 3: reservado

bit 2: = 1 si disco 0 determinado

bit 1: = 1 si disco 0 es multi-ratio, válido si disco determinado

bit 0: = 1 si disco 0 soporta 80 pistas, siempre válido

90h BYTE Estado físico de la disquetera 0

91h BYTE Estado físico de la disquetera 1

bits 7-6: tasa de transferencia a disquete: 00=500kbps, 01=300kbps,

10=250kbps, 11=1Mbps

bit 5: = 1 si doble salto de pista requerido (e.g. 360Kb en 1.2Mb)

bit 4: = 1 si superficie ya determinada

bit 3: reservado

bits 2-0: a la salida de la BIOS, contiene:

000 intentando 360Kb en 360Kb

001 intentado 360Kb en 1.2Mb

010 intentando 1.2MB en 1.2Mb

011 determinado 360Kb en 360Kb

100 determinado 360Kb en 1.2Mb

41
101 determinado 1.2Mb en 1.2Mb (continúa en pág siguiente)

110 reservado

111 todos los demás formatos

92h BYTE Estado físico de la disquetera 0 al inicio de la operación

93h BYTE Estado físico de la disquetera 1 al inicio de la operación

94h BYTE Número de pista en curso de la disquetera 0

95h BYTE Número de pista en curso de la disquetera 1

96h BYTE Estado del teclado, byte 1

bit 7 = 1 proceso de lectura de ID en marcha

bit 6 = 1 el último código leído fue el primero de dos códigos ID

bit 5 = 1 forzar Num Lock si se lee el ID y es un teclado expandido

bit 4 = 1 teclado expandido instalado

bit 3 = 1 Alt derecho pulsado

bit 2 = 1 Ctrl derecho pulsado

bit 1 = 1 último código leído fue E0h

bit 0 = 1 último código leído fue E1h

97h BYTE Estado del teclado, byte 2

bit 7 = 1 error de transmisión del teclado

bit 6 = 1 actualización de LEDs en curso

bit 5 = 1 código RESEND recibido del teclado

bit 4 = 1 código ACK recibido del teclado

bit 3 reservado, debe ser cero

bit 2 LED de Caps Lock

bit 1 LED de Num Lock

bit 0 LED de Scroll Lock

98h DWORD Timer2: [AT, PS excepto Mod 30] puntero al banderín de espera de

usuario completada (ver INT 15, AX=8300h)

42
9Ch DWORD Timer2: [AT, PS exc Mod 30] contador de espera del usuario (microseg.)

A0h BYTE Timer2: [AT, PS exc Mod 30] banderín de espera activa:

bit 7 = 1 tiempo de espera transcurrido

bits 6-1 reservados

bit 0 = 1 INT 15h, AH=86h ha sucedido

A1h 7 BYTEs Reservado para adaptadores de red local (¿será verdad?)

A4h DWORD [PS/2 Mod 30] Vector de la interrupción del disco duro preservada

A8h DWORD Video: En EGA/MCGA/VGA, puntero al «Video Save Pointer Table»

ACh-AFh Reservados

B0h BYTE (Phoenix 386 BIOS 1.10 10a) contador para retardo LOOP cuando se pita

ante un buffer de teclado lleno

B0h DWORD Puntero al controlador de disco óptico 3363.

B4h WORD Reservado

B6h 3 BYTEs ¿Reservado para el POST?

B9h 7 BYTEs ???

C0h 14 BYTEs Reservado

CEh WORD ¿¿¿Cuenta de días desde el último arranque???

D0h-EFh Reservado

D0h-DCh Usado por Digiboard MV/4

F0h-FFh Reservado para el usuario

100h BYTE Byte de estado de Print Screen

10Eh BYTE Estado de BREAK al inicio de la ejecución de BASICA.COM

10Fh BYTE Banderín: 02h si BASICA v2.10 está ejecutándose

116h DWORD INT 1Bh al inicio de la ejecución de BASICA.COM

11Ah DWORD INT 24h al inicio de la ejecución de BASICA.COM

43
44

You might also like