%
% GSE 1994.
% Arquitectura de Computadores.
% Practica 3. Lectura del Byte del equipo. 1994-1995.
%

\typeout{}
\typeout{Arquitectura de Computadores. Pract 3. Lectura del byte del equipo.}
\typeout{}

\documentstyle[twoside]{IEEEtran}

\begin{document}

\title{Pr\'actica 3. Lectura del byte del equipo.}
\author{}
\markboth{Pr\'actica 3. Lectura del byte del equipo.}{Pr\'actica 3. Lectura del byte del equipo.}
\maketitle

\section{Direcciones clave de baja memoria.}

Muchas de las operaciones de los PC y PS/2 se controlan por datos
almacenados en posiciones de baja memoria, particularmente en las
dos \'areas adyacentes de 256 bytes que comienzan en los segmentos
40H y 50H (direcciones 0040:0000H y 0050:0000H, ver ap\'endice A).
La ROM BIOS utiliza los bytes almacenados de 0040:0000H a 0040:00FFH como un
\'area de datos para sus rutinas de teclado, v\'{\i}deo, disco, impresora y
comunicaciones. Los 256 bytes que van de 0050:0000H a 0050:00FFH
los utiliza, principalmente, el BASIC, aunque ah\'{\i} tambi\'en se almacenan
unas pocas variables de estado de la ROM BIOS.
Los datos son cargados por el BIOS en estas \'areas durante el
proceso de inicializaci\'on. Aunque se supone que los datos de control
son de uso privado del BIOS, el DOS y el BASIC, los programas que
usted haga pueden inspeccionarlos o cambiarlos. Incluso si no
trata de utilizar la informaci\'on de estas \'areas de control, es muy
provechoso estudiarla, ya que revela una gran cantidad de detalles
sobre la manera en que funciona la familia PC.

\section{El \'area de datos de la ROM BIOS.}

La ROM BIOS es la parte de la ROM que est\'a activa en todo
momento que el ordenador est\'e trabajando. La regla de la ROM
BIOS es la de proporcionar los servicios fundamentales que sean
necesarios para la operatividad del ordenador. En su mayor parte, la
ROM BIOS controla los dispositivos perif\'ericos del ordenador, como
la pantalla, el teclado y las unidades de disco. Cuando utilizamos el
t\'ermino BIOS en su sentido m\'as estricto, nos estamos refiriendo a los
programas de control de dispositivos (los programas que traducen
un comando simple, como lee-algo-del-disco, a la serie de pasos
necesarios para la ejecuci\'on real del comando, incluida la detecci\'on y
correcci\'on de errores). En sentido amplio, el BIOS incluye no s\'olo las
rutinas necesarias para el control de los dispositivos del PC, sino
tambi\'en las rutinas que contienen informaci\'on o ejecutan tareas que
son fundamentales para otros aspectos de la operatividad del ordenador,
como seguir la pista a la hora del d\'{\i}a.

Conceptualmente, los programas de la ROM BIOS se clasifican
entre los programas que se ejecutan en la RAM (incluido el DOS) y el
hardware. En efecto, esto significa que el BIOS trabaja en dos direcciones,
en un proceso de dos caras. Una parte recibe las peticiones de los
programas para ejecutar los servicios est\'andar de entrada/salida de la
ROM BIOS. Un programa llama a estos servicios mediante la combinaci\'on
de un n\'umero de interrupci\'on (que indica el sujeto del servicio
pedido, como un servicio de impresora) y un n\'umero de servicio (que
indica el servicio espec\'{\i}fico que debe ejecutarse). La otra parte de la
ROM BIOS se comunica con los dispositivos del hardware del ordenador
(pantalla, unidades de disco, etc.), utilizando cualquier detallado
c\'odigo de comando que cada dispositivo requiera. Esta parte de la
ROM BIOS tambi\'en gestiona todas las interrupciones que genere un
dispositivo del hardware para conseguir atenci\'on. Por ejemplo, cada
vez que pulsa una tecla, el teclado genera una interrupci\'on que permite
a la ROM BIOS enterarse de este hecho.

Algunas de las posiciones de memoria del \'area de datos de la ROM
BIOS son particularmente interesantes. La mayor\'{\i}a de ellas contienen
datos que son vitales para los servicios de las rutinas de la ROM BIOS
y del DOS. En muchos casos, sus programas pueden obtener la
informaci\'on almacenada en estas posiciones provocando una interrupci\'on
de la ROM BIOS; en todos los casos, pueden acceder a la informaci\'on
directamente. Se pueden comprobar f\'acilmente los valores en estas
posiciones de su propio ordenador, utilizando DEBUG o el BASIC.
Para utilizar DEBUG, escriba un comando de esta forma:

\footnotesize
\begin{verbatim}

DEBUG
D XXXX: YYYY L 1

\end{verbatim}
\normalsize

XXXX representa la parte segmento de la direccion que desea
examinar. (Ser\'{\i}a 0040H o 0050H, dependiendo del \'area de datos que le
interese.) YYYY representa la parte desplazamiento de la direcci\'on.
L 1 le dice a DEBUG que visualice un byte. Para ver dos o m\'as bytes,
escriba el n\'umero de bytes (en hexadecimal) que desee ver despu\'es de
la instrucci\'on L. Por ejemplo, el BIOS mantiene el n\'umero del modo
actual de v\'{\i}deo en el byte en 0040:0049H. Para inspeccionar este byte
con DEBUG, debe escribir:

\footnotesize
\begin{verbatim}

DEBUG
D 0040:0049 L 1

\end{verbatim}
\normalsize

Para visualizar los datos con el BASIC, utilice un programa como
el que sigue, en el que es necesario sustituir segmento (0x0040 o
0x0050), numero.de.bytes, y desplazamiento (la parte desplazamiento
de la direcci\'on que quiere inspeccionar):

\footnotesize
\begin{verbatim}

10 DEF SEG = segmento
20 FOR I = O TO numero.de.bytes - 1
30 VALOR = PEEK(desplazamiento + I)
40 IF VALOR < 16 THEN PRINT "O" ' se necesita por el cero inicial
50 PRINT HEX$ (VALOR);" ";
60 NEXT I

\end{verbatim}
\normalsize

\section{Programa ejemplo.}

\footnotesize
\begin{verbatim}

; TITULO: BIOS.ASM y BIOS.EXE el ejecutable.
; Fecha:
; Autor:

; Descripcion del programa:
; Lee el llamado Byte del equipo, y presenta en pantalla mensajes, 
; usando servicios del BIOS.

; Nuevas operaciones que debe aprender:
; 1. Presentar mensajes usando el servicio 14 de la interrupcion 10H.
; 2. Leer bytes que estan en la zona de memoria reservada para datos del BIOS.
; 3. Interpretar datos contenidos en estos bytes, para operaciones condicionales.

.MODEL small
.8086
.STACK 100h
.DATA
COMENTARIOS DB 'ESTE PROGRAMA ANALIZA UNA PARTE DEL HARDWARE'
            DB ' DE SU ORDENADOR'
            DB 10,13 ; Nueva linea---> tambien se puede escribir 0AH,ODH
            DB 'Examina el llamado "BYTE DEL SISTEMA" que esta en la zona'
            DB 10,13
            DB 'de datos del BIOS -----> direccion fisica 00410H'
            DB OAH,0DH ; Nueva linea .....
            DB '           Despues de leer el mensaje : Pulse una tecla'
            DB   13,10,10,10,10
            DB 0 ; Byte de terminacion del mensaje

; Los mensajes que aparecen a continuacion, incluyen ordenes de 
; "line-feed" (Avance de linea) OAH=10 y "Carriage return" 
; (Retorno de carro) 0DH=13. Tambien se incluye el codigo de 
; terminacion del mensaje = 0H

SI TIENE COPRO DB 'Si tiene chip coprocesador instalado',l0,13,0H
NO TIENE COPRO DB 'No tiene chip COPROCESADOR instalado',l0,13,0H
MONITOR COLOR  DB 'Detectado: SISTEMA DE VIDEO EN COLOR',10,13,0H
MONTTOR MONO   DB 'El hardware detectado es video monocromo',l0,13,0H

.CODE
; ----------------------- inicializacion -----------------------
ENTRADA PRINCIPAL:
; Como siempre,empezamos indicando donde se encuentran los datos.
MOV AX,@DATA
MOV DS,AX

; ----------------- Muestra COMENTARIOS ------------------------
LEA SI, COMENTARIOS ; SI apunta al principio de "comentarios"
CALL PRESENTA_UN_MENSAJE_EN_PANTALLA ; Llamada al procedimiento local

; Leeremos el byte situados en la zona BIOS de direccion 0040:0010H
; que corresponde a una direccion fisica 00400+00010=00410H
; Durante el proceso de inicializacion, en esta direccion, se guarda 
; informacion sobre distintos elementos del sistema. Segun este formato:

; Bits      7 6 5 4 3 2 1 O
;           | | | | | | | |
;           +++ +++ | | | +-- Controlador de disquetes
;            |   |  | | +---- Coprocesador Matematico.
;            |   |  | +------ Raton en los PS/2
;            |   |  +-------- Reservada
;            |   +----------- 00 = Reservado
;            |                01 = 40x25 Color
;            |                10 = 80x25 Color
;            |                11 = Sistema de video Monocromo
;            +--------------- 00 = 1 controlador de disquete
;                             01 = 2 controladores de disquetes
;                             10 = 3 controladores de disquetes
;                             11 = 4 controladores de disquete

;----Primero, vamos a leer el byte que nos lnteresa.

MOV AX,0040H ;Cargamos el valor del segmento donde estan el byte.
MOV ES, AX   ;lo copiamos en el registro de segmento extra ES

; Ahora cargamos el valor del byte que buscamos, en AL.

MOV AL, ES:[OOlOH] ;Ver como indicamos el valor del OFFSET dentro de ES.
                   ;Expresion escrita de la forma Microsoft - MASM -

; Analizaremos el byte para a ver si esta instalado un coprocesador.
; En principio, suponemos que no, y preparamos el correspondiente 
; mensaje.

LEA SI, NO_TIENE_COPRO

Como AL contiene el llamado "Byte del equipo", miraremos el bit 1
; que es el que contiene informacion sobre la existencia del 
; copro-matematico.

TEST AL,00000010B  ;La instruccion TEST realiza una AND logica
                   ;sin alterar ni registro ni valor, solo afecta a
                   ;las banderas (indicadores).Puede ser de 8 o 16 bits.
                   ;La bandera Z se pone a UNO cuando todos los bits de
                   ;resutado de la AND sean O.En nuestro caso sucedera
                   ;cuando el bit 1 de AL sea CERO (no hay copro)

JZ MENSAJE_SOBRE_EL_COPRO ; JZ= Salta si la bandera de cero esta 
                          ; activada (1).
                          ; No hay COPRO

; En este punto, la existencia del COPRO ha sido detectada.

LEA SI,SI_TIENE_COPRO ; Si no ha saltado es porque tiene copro
                      ; preparamos el mensaje adecuado.

MENSAJE_SOBRE_EL_COPRO:

PUSH AX
CALL        PRESENTA_UN_MENSAJE_EN_PANTALLA
POP AX

; --- Vamos a ver si el sistema de video es monocromo o color ----
; Presuponemos que el sistema de video es COLOR, y preparamos el correspondiente mensaje.

LEA SI, MONITOR_COLOR
MOV AH, AL ;Copiamos el "Byte del equipo" en la parte alta de AX

;-Ahora analizaremos los bits que informan sobre el sistema de video

AND     AH,00110000B ;Nos interesa el valor de los bits 4 y 5
; Despues de esta operacion AND, los bits 4 y 5 mantienen su valor,
; y todos los restantes se ponen a cero.
CMP     AH,00110000B ;Comparamos con el patron de monocromo.

JNE MENSAJE_SOBRE_SISTEMA_DE_VIDEO ;Saltara si el sistema es COLOR
                                   ;Jump if Not Equal

; En este punto,sabemos que el sistema tiene un sistema de video 
; monocromo, ya que la comparacion con el patron de monocromo ha 
; resultado : iguales.
LEA SI, MONITOR_MONO

MENSAJE_SOBRE_SISTEMA_DE_VIDEO:
; Presenta un mensaje indicando el sistema de video del equipo.
; El puntero al mensaje ya esta establecido.
PUSH AX
CALL PRESENTA_UN_MENSAJE_EN_PANTALLA
POP AX

FIN_DE_PRESENTACION:
; Esperamos hasta que sea pulsada una tecla. Para hacer esta 
; operacion usaremos el servicio 0 de la interrupcion 16H. 
; (Este servicio no precisa de ninguna "entrada".....simplemente.....
; espera.
MOV AH, O
INT 16H

; Una vez pulsada una tecla,el programa finaliza y transfiere el 
; control al DOS.

SALIDA_AL_DOS:
MOV AX,4COOH
INT 21H

;----------------------- PROCEDIMIENTOS ---------------------------
PRESENTA_UN_MENSAJE_EN_PANTALLA         PROC         NEAR
; Este procedimiento,permite presentar un mensaje en pantalla, 
; usando el SERVICIO 14 de la INTERRUPCION 10H (BIOS)
; ENTRADAS DEL PROCEDIMIENTO:
;    En SI debe estar indicada la direccion inicial del mensaje a presentar.
; SALIDA: 
;    NADA.
; Requerimientos del BIOS:
;    AH = NQ del servicio solicitado.
;    AL = Contiene los caracteres que seran representados.
;    BH = Pagina a presentar (normalmente 0).
;    BL = Color de fondo en modo grafico (normalmente 0).

MOV BX,O  ;Todo a cero=Pagina a presentar 0 y MODO no GRAFICO
MOV AH,14 ;Numero del Servicio Solicitado.

LOCALIZA_CARACTER:

MOV AL,[SI]           ;El caracter del mensaje, lo llevamos a AL.
CMP AL,0              ;Miramos si es "Fin del mensaje"
JNE PRESENTA_CARACTER ;Presenta el caracter si no es "Fin de mensaje"

; En este punto, el final del mensaje ha sido localizado.
RET

; En este punto, AL contiene el caracter que debe ser presentado.

PRESENTA_CARACTER:
PUSH SI
INT 10H
POP SI
INC SI ;Incrementamos el valor de SI,para apuntar al siguiente caracter.

JMP LOCALIZA_CARACTER
PRESENTA_UN_MENSAJE_EN_PANTALLA ENDP

END ENTRADA_PRINCIPAL

\end{verbatim}
\normalsize

\section{Desarrollo de la pr\'actica.}
El alumno realizara un programa que presente en pantalla:
\begin{enumerate}
 \item El n\'umero de controladores de disqueteras de este equipo es: 
       (aqu\'{\i} debe aparecer el n\'umero dado por el byte del equipo).
 \item El sistema de video es:
 \item Si/No tiene coprocesador.
 \item AUTOR DEL PROGRAMA: Nombre y Apellidos del Alumno/a.
\end{enumerate}

\section*{Ap\'endice A: Contenido de la memoria baja del IBM PC.}

A continuaci\'on describen las direcciones de baja memoria m\'as \'utiles.
\cite{Guia}

\small

\begin{enumerate}
 \item {\bf 0040:0010H} (palabra de 2 bytes). Esta palabra mantiene los datos
de la lista de equipamiento de la que informa el servicio de lista de
equipamiento de la interrupci\'on 11H (decimal 17). El formato de esta
palabra, mostrado en la siguiente tabla, se estableci\'o para el PC y el XT
(ciertas partes pueden aparecer en formato diferente en modelos posteriores).
Esta son las direcciones de memoria que utilizaremos para desarrolar la
pr\'actica.

%\footnotesize
\begin{verbatim}

       B I T
FEDCBA98 76543210   Signifcado
------------------ ---------------------------------------------
XX...... .........  Numero de impresoras instaladas
..X..... .........  (Reservado)
...X.... .........  1 si esta instalado el adaptador de Juegos
....XXX. .........  Numero del puerto serie RS-232
.......X .........  (Reservado)
........ XX.......      1 = numero de unidades de diskette
                                   00=1 unidad
                                   01=2 unidades
                                   10=3 unidades
                                   11=4 unidades (vease bit 0)
........ ..XX.....      Modo de video inicial
                                   01=color con 40 columnas
                                   10=color con 80 columnas
                                   11=monocromo con 80 columnas
                                   00=ninguno de los anteriores
........ ....XX..       Para los PC con placa madre de 64 KB:
                                   Cantidad de RAM en la placa del sistema 
                                   (ll=64 KB, 10=48 KB,01=32 KB, 00=16 KB)
                        Para el PC/AT: no se utiliza
                        Para los PS/2: bit 3: no se utiliza;
                                   Bit 2: 1 = instalado un dispositivo apuntador
........ ......X.       1 si hay instalado un coprocesador matematico
........ .......X       1 si hay presentes unidades de diskette (si es asi, veanse bits 6 y 7)

\end{verbatim}
%\normalsize

 \item {\bf 0040:0013H} (palabra de 2 bytes). Esta palabra contiene el tama\~no
en KB de la memoria utilizable. El servicio de la interrupci\'on 12H
(decimal 18) del BIOS es el responsable de informar del valor en esta
palabra.

 \item {\bf 0040:0017H} (2 bytes de bits de estado del teclado). Estos bytes se
utilizan activamente para controlar las interpretaciones de las acciones
del teclado por las rutinas de la ROM BIOS. El cambio de estos bytes
realmente var\'{\i}a el significado de las pulsaciones de teclas. Se puede
cambiar libremente el primer byte, en la direcci\'on 0040:0017H, pero no
es una buena idea cambiar el segundo byte. V\'eanse p\'aginas 141 y 142
para el establecimiento de los bits de estos dos bytes \cite{Guia}.

 \item {\bf 0040:001AH} (palabra de 2 bytes). Esta palabra apunta a la cima
actual del buffer del teclado del BIOS en 0040:001EH, donde se
almacenan las pulsaciones de teclas hasta que son utilizadas.

 \item {\bf 0040:001CH} (palabra de 2 bytes). Esta palabra apunta a la cola
actual del buffer del teclado del BIOS.

 \item {\bf 0040:001EH} (32 bytes, utilizados como 16 entradas de 2 bytes).
Este buffer de teclado mantiene hasta 16 pulsaciones de teclas hasta
que son le\'{\i}das v\'{\i}a los servicios del BIOS a trav\'es de la interrupci\'on
16H (decimal 22). Como es un buffer de cola circular, dos punteros
indican la cabeza y la cola. No es aconsejable manipular estos datos.

 \item {\bf 0040:003EH} (1 byte). Este byte indica si una unidad de disco
necesita ser recalibrada antes de buscar una pista. Los bits del 0 al 3
corresponden a las unidades 0 a 3. Si un bit est\'a vac\'{\i}o, la recalibraci\'on
es necesaria. Generalmente, encontrar\'a que este bit est\'a desactivado si
hubo alg\'un problema durante la utilizaci\'on m\'as reciente de la unidad.
Por ejemplo, la recalibraci\'on estar\'a desactivada si trata de pedir el
directorio (DIR) de una unidad sin diskette, y despu\'es escribe C como
respuesta a la siguiente pantalla:

%\footnotesize
\begin{verbatim}

Unidad no preparada, leyendo la unidad
Cancelar, Reintentar. Seguir?

\end{verbatim}
%\normalsize

 \item {\bf 0040:003FH} (1 byte). Este byte devuelve el estado del motor del
disco. Los bits 0 al 3 corresponden a las unidades 0 a 3. Si el bit est\'a
activado, el motor est\'a funcionado.

 \item {\bf 0040:0040H} (1 byte). Este byte lo utiliza la ROM BIOS para
asegurarse de que el motor de la unidad de disco est\'a apagado. El
valor de este byte se decrementa con cada tic del reloj del sistema (esto
es, alrededor de 18,2 veces por segundo). Cuando el valor llega a 0, el
BIOS apaga el motor de la unidad.

 \item {\bf 0040:0041H} (1 byte). Este byte contiene el c\'odigo del estado
informado por la ROM BIOS despu\'es de la operaci\'on m\'as reciente de
disco.

%\footnotesize
\begin{verbatim}

Valor  Significado
-----  -------------------------------------------------------------------------
00H    No hay error
01H    Solicitado comando de diskette no valido
02H    Marcas de direccion del diskette no encontradas
03H    Error de proteccion contra escritura
04H    Sector no encontrado; diskette danhado o no formateado
06H    Linea de cambio de diskette activa
08H    Error de DMA al diskette
09H    Intento de DMA a traves del limite de 64 KB
0CH    Media no encontrada
10H    Error de chequeo de redundancia ciclica (CRC) en datos
20H    Fallo del controlador de diskette
40H    Fallo en la operacion de busqueda
80H    Exceso de tiempo en el intento de acceso al diskette (unidad no preparada)

\end{verbatim}
%\normalsize

 \item {\bf 0040:0042H} (7 bytes). Estos 7 bytes mantienen la informaci\'on del
estado del controlador del disco.

 \item Empezando en {\bf 0040:0049H} hay un \'area de 30 bytes utilizada para
control de v\'{\i}deo. Esta es la primera de dos \'areas en el segmento 40H
que la ROM BIOS utiliza para seguir la pista de informaci\'on cr\'{\i}tica de
video. Aunque los programas pueden inspeccionar sin riesgo estos datos,
debe modificarlos s\'olo cuando pase por debajo de los servicios de la
ROM BIOS y programe el hardware de v\'{\i}deo directamente. En este
caso, debe actualizar los datos de control de v\'{\i}deo para que reflejen el
estado real del hardware de v\'{\i}deo.

 \item {\bf 0040:0049H} (1 byte). El valor de este byte especifica el modo actual
de v\'{\i}deo. (V\'ease figura 3.4.) Es el mismo n\'umero de modo de v\'{\i}deo que
utilizan los servicios de la ROM BIOS. (V\'ease cap\'{\i}tulo 9 para m\'as
informaci\'on acerca de estos servicios y la p\'agina 74 para informaci\'on
general concerniente a modos de v\'{\i}deo.)

Hemos visto ya c\'omo utilizar DEBUG para determinar el modo
actual de v\'{\i}deo inspeccionando el byte en 0040:0049. Los programas
BASIC pueden utilizar las instrucciones siguientes para leer este byte y
determinar el modo de v\'{\i}deo:

%\footnotesize
\begin{verbatim}

DEF SEG = &H40               ' establece el segmento de datos del 
                             ' BASIC en 40H
MODO.VIDEO = PEEK(&H49)      ' mira la posicion 0040:0049H

\end{verbatim}
%\normalsize

 \item {\bf 0040:004AH} (palabra de 2 bytes). Esta palabra indica el n\'umero de
caracteres que pueden ser mostrados en cada fila de texto de la
pantalla.

%\footnotesize
\begin{verbatim}

Numero  Descripcion
------  -----------------------------------------------------------------------
00H    Texto de 40 x 25 con 16 colores (rafaga de color del CGA desactivado)
01H    Texto de 40 x 25 con 16 colores
02H    Texto de 80 x 25 con 16 colores (rafaga de color del CGA desacti vado)
03H    Texto de 80 x 25 con 16 colores
04H    Grafico de 320 x 200 con 4 colores
05H    Grafico de 320 x 200 con 4 colores (rafaga de color del CGA desactivado)
06H    Grafico de 640 x 200 con 2 colores
07H    Texto de 80 x 25 monocromo
0DH    Grafico de 320 x 200 con 16 colores
0EH    Grafico de 640 x 200 con 16 colores
0FH    Grafico de 640 x 350 monocromo
10H    Grafico de 640 x 350 con 16 colores
1IH    Grafico de 640 x 480 con 2 colores
12H    Grafico de 640 x 480 con 16 colores
13H    Grafico de 320 x 200 con 256 colores

\end{verbatim}
%\normalsize

 \item {\bf 0040:004CH} (palabra de 2 bytes). Esta palabra indica el n\'umero de
bytes que se necesitan para representar una pantalla completa de datos
de v\'{\i}deo.

 \item {\bf 0040:004EH} (palabra de 2 bytes). Esta palabra contiene el desplazamiento
del byte de comienzo de la memoria de pantalla de la p\'agina
actual visualizada. En efecto, esta direcci\'on indica la p\'agina que est\'a
en uso dando el desplazamiento a esa p\'agina.

 \item {\bf 0040:0050H} (ocho palabras de 2 bytes). Estas palabras proporcionan
la posici\'on del cursor para ocho p\'aginas de visualizaci\'on distintas,
comenzando en la p\'agina 0. El primer byte de cada palabra contiene la
columna, y el segundo, la fila.

 \item {\bf 0040:0060H} (palabra de 2 bytes). Estos dos bytes indican el tama\~no
del cursor, basado en el rango de las l\'{\i}neas de exploraci\'on del cursor.
El primer byte da la l\'{\i}nea de exploraci\'on final, y el segundo, la de
comienzo.

 \item {\bf 0040:0062H} (1 byte). Este byte mantiene el n\'umero de la p\'agina
visualizada actualmente.

 \item {\bf 0040:0063H} (palabra de 2 bytes). Esta palabra almacena la direcci\'on
del puerto del chip del hardware controlador del CRT.

 \item {\bf 0040:0065H} (l byte). Este byte contiene el registro del modo del
CRT establecido actualmente en el adaptador monocromo de pantalla,
MDA (siglas de Monochrome Display Adapter) y en el adaptador gr\'afico de
colores, CGA (Color Graphics Adapter).

 \item {\bf 0040:0066H} (1 byte). Este byte contiene el registro de color del
CRT del adaptador gr\'afico de colores. Este byte es el final del primer
bloque de datos de control de v\'{\i}deo de la ROM BIOS.

 \item {\bf 0040:0067H} (5 bytes). El BIOS del PC original utilizaba los 5 bytes
que comenzaban en 0040:0067H para control de la cinta de casete. En
los modelos 50, 60 y 80 del PS/2, que no soportan un interfaz de
casete, los 4 bytes en 0040:0067H pueden contener la direcci\'on de la
rutina de reset del sistema que pasa por encima del c\'odigo de arranque
usual del BIOS. (Cons\'ultese el manual t\'ecnico de referencia del BIOS
para los detalles.)

 \item {\bf 0040:006CH} (4 bytes almacenados como un n\'umero de 4 bytes).
Este \'area se utiliza como un contador de reloj maestro, el cual se
incrementa por cada tic del reloj. Se le trata como si contase de 0 a
medianoche. Cuando el contador alcanza el equivalente de 24 horas, la
ROM BIOS pone el contador a 0 y el byte 0040:0070H a 1. El DOS o
el BASIC calculan la hora actual gracias a este valor y la establecen
poniendo la cuenta apropiada en este campo.

 \item {\bf 0040:0070H} (1 byte). Este byte indica que el reloj ha dado una
vuelta completa. Cuando la cuenta del reloj pasa la medianoche (y es
puesta a 0), la ROM BIOS pone este byte a 1,lo que significa que la
fecha debe ser incrementada. NOTA: Este byte se pone a 1 a medianoche
y no es incrementado. No hay indicaci\'on si han pasado dos mediasnoches
antes de leer el reloj.

 \item {\bf 0040:0071H} (1 byte). La ROM BIOS establece el bit 7 de este byte
para indicar que la combinaci\'on de teclas Ctrl-Break ha sido pulsada.

 \item {\bf 0040:0072H} (palabra de 2 bytes). Esta palabra se pone a 1234H
despu\'es del chequeo de memoria inicial cuando se enciende el ordenador.
Cuando se realiza un reset en caliente a trav\'es del teclado
(mediante Ctrl-Alt-Del), no se realizar\'a de nuevo el chequeo de memoria
si este byte sigue teniendo el valor 1234H.

 \item {\bf 0040:0074H} (4 bytes). Estos 4 bytes los utilizan varios miembros de
la familia PC para el control de las unidades de disco duro y de
diskette. Cons\'ultese IBM BIOS Interface Technical Reference Manual
para detalles.

 \item {\bf 0040:0078H} (4 bytes). Estos bytes controlan el valor del tiempo de
espera de las impresoras paralelas. (En el PS/2, s\'olo se utilizan para
este prop\'osito los 3 primeros bytes.)

 \item {\bf 0040:007CH} (4 bytes). Estos bytes contienen los valores del tiempo
de espera de hasta 4 puertos serie RS-232.

 \item {\bf 0040:0080H} (palabra de 2 bytes). Esta palabra apunta al comienzo
del \'area del buffer del teclado.

 \item {\bf 0040:0082H} (palabra de 2 bytes). Este palabra apunta al final del
\'area del buffer del teclado.

 \item {\bf 0040:0084H} (1 byte). El valor de este byte es menor en una unidad
que el n\'umero de filas de caracteres visualizadas en la pantalla. El
BIOS puede referirse a este valor para determinar la cantidad de filas
de datos que hay que borrar cuando se limpia la pantalla o la cantidad
de filas que hay que imprimir cuando se pulsa Shift-PrtSc.

 \item {\bf 0040:0085H} (2 bytes). Esta palabra indica la altura, en l\'{\i}neas de
exploraci\'on, de los caracteres de la pantalla.

 \item {\bf 0040:0087H} (4 bytes). Estos 4 bytes los utilizan las rutinas de apoyo
de v\'{\i}deo del BIOS para indicar la cantidad de RAM de v\'{\i}deo disponible,
las posiciones iniciales de los interruptores de configuraci\'on de la
EGA, y otra informaci\'on variada del estado del v\'{\i}deo.

 \item {\bf 0040:008BH} (11 bytes). La ROM BIOS utiliza este \'area de datos
para control e informaci\'on del estado de la unidad de diskette y de
disco duro.

 \item {\bf 0040;0098H} (9 bytes). Este \'area de datos se utiliza en el BIOS del
PC/AT y PS/2 para controlar ciertas funciones del reloj de tiempo
real.

 \item {\bf 0040:00A8H} (4 bytes). En el BIOS de la EGA y del PS/2, estos
bytes contienen la direcci\'on segmentada de una tabla de par\'ametros
de v\'{\i}deo y anula los valores por defecto de la configuraci\'on de v\'{\i}deo
de la ROM BIOS. El contenido real de la tabla var\'{\i}a, dependiendo del
hardware de v\'{\i}deo que est\'e utilizando. En la obra IBM ROM BIOS
Interface Technical Reference Manual se describe con gran detalle esta
tabla.

 \item {\bf 0050:0000H} (1 byte). Este byte lo utiliza la ROM BIOS para
indicar el estado de una operaci\'on de imprimir pantalla. En esta
posici\'on se almacenan tres posibles valores:

%\footnotesize
\begin{verbatim}

00H     Indica estado correcto.
01H     Indica que una operacion de imprimir pantalla esta en proceso en este momento.
FFH     Indica que se ha producido un error durante una operacion de imprimir pantalla.

\end{verbatim}
%\normalsize

 \item {\bf 0050:0004H} (1 byte). Este byte lo utiliza el DOS cuando un sistema
de un solo diskette imita a un sistema de dos diskettes. El valor indica
si la \'unica unidad est\'a actuando como unidad A o unidad B. Los
valores que utiliza son:

%\footnotesize
\begin{verbatim}

00H      Actuando como unidad A.
01H      Actuando como unidad B.

\end{verbatim}
%\normalsize

 \item {\bf 0050:0010H} (palabra de 2 bytes). Este \'area la utiliza la ROM BIOS
para mantener el valor por defecto de su segmento de datos (DS).
El BASIC le permite establecer su propio valor del segmento de
datos con la sentencia DEF SEG = valor. (El desplazamiento dentro
del segmento se especifica con las funciones PEEK o POKE.) Tambi\'en
puede restablecer su valor por defecto utilizando la sentencia DEF
SEG sin ning\'un valor. Aunque el BASIC no proporciona una manera
sencilla para encontrar el valor por defecto almacenado en esta
posici\'on, puede conseguirlo utilizando esta peque\~na rutina:

%\footnotesize
\begin{verbatim}

DEF SEG = &H50
SEGMENTO.DE.DATOS = PEEK(&H11) * 256 + PEEK(&H10)

\end{verbatim}
%\normalsize

NOTA: El BASIC administra sus propios datos internos
has\'andose en el valor por defecto del segmento de datos.
Intentar cambiar este valor ser\'{\i}a como sabotear elfuncionamiento del BASIC.

 \item {\bf 0050:0012H} (4 bytes). En algunas versiones del BASIC de la ROM,
estos 4 bytes contienen el segmento y el desplazamiento de la direcci\'on
de la rutina de tratamiento de la interrupci\'on de tic-tac del BASIC.
NOTA: Para conseguir mayores prestaciones, el BASIC
hace funcionar el reloj del sistema cuatro veces m\'as r\'apido
que el ratio est\'andar, asi que debe reemplazar la rutina de
interrupci\'on del reloj de la ROM BIOS por la suya propia. El
BASIC invoca con el ratio normal a la rutina de la interrupci\'on
est\'andar del BIOS; esto es, una vez por cada cuatro tics
r\'apidos.

 \item {\bf 0050:0016H} (4 bytes). Este \'area contiene la direcci\'on de la rutina
de tratamiento de la tecla break del BASIC de la ROM.

 \item {\bf 0050:001AH} (4 bytes). Este \'area contiene la direcci\'on de la rutina
de tratamiento de errores de diskette del BASIC de la ROM.
\end{enumerate}

\normalsize

\begin{thebibliography}{1}
\bibitem{Guia}
  Peter Norton, Richard Wilton, \newline
  {\em Gu\'{\i}a del Programador para el IBM PC y PS/2}, \newline
  Microsoft Press - Anaya Multimedia, 1988, \newline
  ISBN: 84-7614-226-9.

\bibitem{Turbo}
 {\em Turbo Assembler User and Reference Guide}. \newline
 Borland International, inc.

\end{thebibliography}

\def\mes{\ifcase\number\month\or Enero\or Febrero\or Marzo\or Abril\or Mayo\or Junio\or Julio\or Agosto\or Septiembre\or Octubre\or Noviembre\or Diciembre\fi}

\section*{Autores.}
\noindent {\em Vicente Gonz\'alez Ruiz.}\newline
{\em Jose Antonio Mart\'{\i}nez Garc\'{\i}a.}\newline
{\em Jos\'e Fern\'andez Vadillos.}\newline
Departamento de Arquitectura de Computadores y Electr\'onica.\newline
Universidad de Almer\'{\i}a.\newline
04120 La Ca\~nada de San Urbano, s/n.\newline
Almer\'{\i}a.

\bigskip
\small
GSE. Este documento fu\'e interpretado con {\LaTeX} el d\'{\i}a {\number\day} de {\mes} de {\number\year}.

\end{document}
