Está en la página 1de 12

INTERRUPCIONES

Las interrupciones son un metodo del que disponen los dispositivos e incluso los procesos
para hacer notar a la CPU la aparicin de alguna circunstancia que requiera su
intervencin. De este modo, los dispositivos pueden provocar que la CPU deje por el
momento la tarea que estaba realizando y atienda la interrupcin. Una vez atendida,
seguira con su labor anterior.

Cuando no existan interrupciones, era el procesador el que tena que estar


continuamente comprobando el estado del dispositivo cuando lo necesitaba.

Todo ese tiempo que el procesador estaba sondeando el estado de los dispositivos era
tiempo que no se poda dedicar a otros procesos, con lo que significa esto en cuanto a
rendimiento. Por todo ello se. pens que lo mejor era que existiera una lnea especial
entre el procesador y los dispositivos, por la que los dispositivos indicaban al procesador
que ya estaban listos. Cuando al procesador le llega una interrupcin, la atiende
inmediatamente dejando de hacer lo que estuviera haciendo. Para poder atenderla de la
forma correcta, debe saber con anterioridad cmo tratarla. Por ello, las computadoras
tienen en un sitio. conocido de memoria las distintas rutinas de tratamiento para las
diferentes interrupciones. El procesador reconoce la interrupcin de la que se trata y
busca en memoria la rutina correspondiente.

Una vez terminado el tratamiento de la interrupcin, es muy importante que el


procesador siga con lo que estaba haciendo. Por eso es muy importante que antes de
tratar la interrupcin se guarde de alguna forma el estado del computador, y al terminar
la rutina de tratamiento se restaure el estado.

Se pueden distinguir dos tipos de interrupciones: interrupciones software e interrupciones


hardware.

Interrupciones software

Las interrupciones software son provocadas por los programas usando una funcin
especial del lenguaje. Tienen como objetivo el que la CPU ejecute algn tipo de funcin. Al
terminar de ejecutarse esta funcin, se seguir ejecutando el programa que provoc la
interrupcin.

Este tipo de interrupciones es la forma mas importante que tendrn los programas de
ejecutar funciones especiales del DOS (Disk OperatingSystem) o del BIOS (Basic Input
Output System). Estas funciones tienen un nmero de interrupcin software asociada.
Cuando un programa lanza una interrupcin de este tipo, la CPU ejecuta su funcin de
tratamiento asociada. Por debemos saber que es lo que hace cada interrupcin para
conseguir el efecto deseado. Metodologa de Programacin, Programacin en C,
Aplicaciones electrnicas 2 / 10

Tcnicas de Programacin 3 Parte: Programacin de interrupciones y del Ratn

Las funciones que se ejecutan con cada interrupcin software son un estndar en el
mundo PC.

En nuestro caso, algunas de las interrupciones que nos van a ser mas tilessern:

Interrupcin 14h: Acceso al puerto serie por la BIOS.

Interrupcin 21h: Funciones del DOS.

Interrupcin 17h: Servicios de acceso a la impresora de la

BIOS.

Cada interrupcin tiene asociadas varias funciones. Para usar cada una de las funciones de
la interrupcin que nos interese se debe:

- Escribir en un registro el nmero de interrupcin.

- Escribir en otro registro en nmero de funcin deseada.

- Escribir en otro/s registro/s los parmetros asociados con la funcin.

- Lanzar la interrupcin.

El lenguaje C nos proporciona una serie de estructuras en la librera dos. h que nos
permiten escribir en los registros de la CPU. Estas son:

struct WORDREGS {

unsignedint ax;

unsignedintbx;

unsignedint cx;

unsignedint dx;

unsignedintsi;

unsignedint di;
unsignedintcflag;

unsignedint flags;

struct BYTEREGS {

unsigned char al;

unsigned char ah;

unsigned char bl;

unsigned char bh;

unsigned char cl;

unsigned char ch;

unsignedcha.r d1;

unsignedcha.rdh; Metodologa de Programacin, Programacin en C, Aplicaciones


electrnicas 3 / 10

Tcnicas de Programacin 3 Parte: Programacin de interrupciones y del Ratn

union REGS {

struct WORDREGS x;

struct BYTEREGS h;

Los registros WORDREGS son registros de 16 bits. Los registros

BYTEREGS son registros de 8 bits, que adems coinciden con la parte alta y baja de los
WORDREGS. Por ejemplo, escribir OxFF11 en el registro ax es 10 mismo que escribir en el
registro ah OxFF y en el al Ox11.

Una unin es un tipo de dato definible por el programador, como las estructuras, en la
que se pueden almacenar datos de diferentes tipos en cada ocasin, es decir, en cada
instante solo podra hacerse referencia a uno de los datos componentes de la unin. La
palabra clave para definir y para declarar variables de tipo unin es union y, tanto las
variables de tipo unin como sus miembros, o elementos, son tratados de igual forma que
en el caso de las estructuras.

Cuando se declara una variable de tipo unin, se asigna una porcin de memoria que es
compartida por variables diferentes en distintos momentos.

UninNombre Unin {

tipo1 elemento1;

tipo2 elemento2;

tipo3 elemento3;

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

} variables; donde Nombre_Union es el identificador del nuevo tipo de unin. La cantidad


de memoria ocupada por una unin ser la necesaria para almacenar el miembro de la
unin que mas memoria necesite (en definitiva , el tipo de dato que ms ocupe)

Ejemplo:

union talla{

int numero; // 42,46,50

char letra; // p, m, g

char siglas[4]; // L, XL, XXL

}camisetas;

En la variable camisetas se puede almacenar la talla en cualquiera de los formatos


mostrados en el ejemplo y, segn el que se haya elegido, as habr de ser considerado
tanto en las lecturas de la variable como en las escrituras, debiendo ser el programador
quien se encargue de conocer, en todo momento, el modo en el que ha almacenado la
talla. Metodologa de Programacin, Programacin en C, Aplicaciones electrnicas 4 / 10

Tcnicas de Programacin 3 Parte: Programacin de interrupciones y del Ratn

Ese ejemplo se completara si la variable camisetas perteneciese a un tipo de estructura


de una base de datos de control de stocks de un almacn o tienda de confeccin. Las
uniones son, en todo, similares a las estructuras, con la salvedad de que en cada instante
solo uno de los elementos puede estar presente, debe ser el propio programa el que
decida el tipo de dato que hay en cada momento. Igual que en las estructuras, el acceso a
los elementos de una unin se realiza tambin con el operador punto ., Por ejemplo,
con la unin declarada anteriormente, cualquiera de las siguientes lneasser valida para
almacenar un valor en las posiciones de memoria asignadas a la variable camisetas:

scanf("%d", &camisetas.numero);

camisetas.letra = getchar() ;

gets(camisetas.siglas);

Retomando la composicin e implementacin de los diferentes registros del procesador,


para escribir un dato en la unin de los registros (REGS) :

Ejemplo:

Escribir en el registro ax el valor OxFF11. Solucin:

Definimos una variable de tipo unin REGS

unin REGS registros;

Y escribimos en ella:

registros.x.ax=0xFF11;

Para lanzar la interrupcin, usaremos la funcin de la librera dos.h int86, que se define
en Turbo C como:

int int86 (intnumero_interrupcion, unin REGS *registros_entrada, unin REGS


*registros_salida);Metodologa de Programacin, Programacin en C, Aplicaciones
electrnicas 5 / 10

Tcnicas de Programacin 3 Parte: Programacin de interrupciones y del Ratn

MANEJO DEL RATON

Uno de los dispositivos mstiles y populares del PC es el ratn. Los ratones llevan
existiendo mucho tiempo, pero su popularidad masiva surgi a partir del uso de entornos
grficos tipo Windows, cuyo manejo requiere el uso de un ratn.

La posicin que ocupa el ratn en la pantalla se define siempre en coordenadas graficas,


aunque se est trabajando en modo texto, considerando tantos puntos en la pantalla
como permita la tarjeta grafica (actualmente, en VGA la resolucin de la pantalla suele ser
de 640 x 480 pixels).
La interrupcin 33 h

Como ocurre casi siempre que se quiere acceder directamente al hardware, la forma mas
cmoda de hacerlo es usar las funciones que nos proporcionan las interrupciones
software. En este caso, la interrupcin que se encarga de controlar, el ratn es la numero
33h. Esta interrupcin nos proporciona nada menos que 53 funciones distintas, que
seleccionaremos poniendo su numero en el registro ax.

Si la funcin requiriera parmetros extra, usaramos otros registros del procesador. De


entre todas las funciones que se nos ofrecen, usaremos las siguientes:

Funcin Tarea Llamada Retorno

00h Reset del ratn ax=0 ax>0 si hay raton

ax=0 si no hay

01h Mostrar el cursor del ax=1 ......

ratn

02h Apagar el cursor del ax=2 ......

ratn

03h Leer el estado de los ax=3 bx=0 si no pulso botn

botones y la posicin bx=1 botonIzqdodel cursor bx=2 botonDcho

bx=4 boton Centro

cx=posicin columna (H)

dx=posicin fila (V)

04h Establecer la posicin ax=4

del cursor cx= columna

dx= fila

07h Rango desplazHoriz. ax=7

cx=H minima

dx=H mxima
08h Rango desplazVert. ax=8

cx=V minima

dx=V mximaMetodologa de Programacin, Programacin en C, Aplicaciones electrnicas


6 / 10

Tcnicas de Programacin 3 Parte: Programacin de interrupciones y del Ratn

Antes de pasar a mostrar cmo trabajar con estas funciones, es importante destacar que
la zona sobre la que trabaja el ratn no coincide con la pantalla real.

EI ratn se mueve sobre una pantalla virtual, que depende del modo de vdeo en el que
se est trabajando, es decir, de la resolucin. En las funciones bsicas de manejo de1
ratn, referidas a pantalla de texto se hace necesario traducir estas coordenadas virtuales
a coordenadas de texto. Esto se consigue dividiendo entre ocho las coordenadas graficas,
pues cada caracterocupa ocho pixels de pantalla, labor que realizaremos antes de llamar
a las funciones.

Reset del ratn: funcin 00h

Lo primero que debe hacer cualquier programa antes de usar el ratn es prepararlo
reinicializarlo o resetearlo. Con esto conseguimos dejar al ratn en el centro de la pantalla
con el cursor apagado. Para seleccionar esa funcin, ponemos su numero en el registro ax
y lanzamos la interrupcin 33h. Como resultado de la operacin, la funcin nos devuelve
el estado del ratn, es decir, si hay o no ratn instalado. Ese resu1tado lo deja de nuevo
en el registro ax.

Un -1 en dicho registro nos indica que no hay ratn instalado.

Ejemplo:

/* Reinicializar el ratn. Devuelve -1 si no hay ratn instalado * /

intResetRaton (void)

{ union REGS registros;

registros.x.ax = 0; /* elegimos la funcin correspondiente * /

int86 (0x33, &registros, &registros);

if ((int) registros.x.ax = = -1)

{printf ( " No hay un ratn instalado );


return -1 ;

return 1;

Metodologa de Programacin, Programacin en C, Aplicaciones electrnicas 7 / 10

Tcnicas de Programacin 3 Parte: Programacin de interrupciones y del Ratn

Mostrar y ocultar el ratn: funciones 01h y 02h

Como ya hemos dicho, al reinicializar el ratn, su cursor queda en el centro de la pantalla


y apagado, es decir, aunque esta ah, no podemos verlo. La forma de hacerlo visible es
usar la funcin 01h. Esta funcin no tiene valores de retorno.

Ejemplo:

/* Mostrar el cursor del ratn */

voidMostrarCursor (void)

{ union REGS registros;

registros.x.ax = 1;

int86 (0x33, &registros, &registros);

/* Apagar el cursor del ratn * /

voidApagarCursor (void)

{ union REGS registros;

registros.x.ax = 2;

int86 (0x33, &registros, &registros);

Leer el estado de los botones y la posicin del cursor, funcin 03h


La funcin 03h nos permite conocer el estado de los botones del ratn, informacin que
almacena en el registro bx de la siguiente forma:

Bit 1: Botn derecho ( 1 = presionado ).

Bit 0: Botn izquierdo ( 1 = presionado ).

Adems, esta funcin deja en el registro cx la coordenada X y en el registro dx la


coordenada Y.Metodologa de Programacin, Programacin en C, Aplicaciones
electrnicas 8 / 10

Tcnicas de Programacin 3 Parte: Programacin de interrupciones y del Ratn

Ejemplo:

/* Botn derecho del ratn presionado * /

intBotonDerecho (void)

{ union REGS registros;

registros.x.ax = 3;

int86 (0x33, &registros, &registros);

return (registros.x.bx& 2); /* Devuelve 1 si esta presionado */

/* Botn izquierdo del ratn presionado * /

intBotonIzquierdo (void)

{ union REGS registros;

registros.x.ax = 3;

int86 (0x33, &registros, &registros);

return (registros.x.bx& 1);

/* Devolver la posicin del ratn * /

intPosicionRraton (int *x, int *y)

{ union REGS registros;

registros.x.ax = 3;
int86 (0x33, &registros, &registros);

*x = registros.x.cx;

*y = registros.x.dx;

Establecer la posicin del ratn: funcin 04h

Para colocar el cursor del ratn en una posicin determinada, contamos con la funcin
04h. A esta funcin se le debe pasar la coordenada horizontal en el registro cx, y la
vertical en el dx.

Cuando se trabaja en modo texto hay que tener en cuenta, que las coordenadas hay que
multiplicarlas por 8 antes de pasarlas a la funcin.Metodologa de Programacin,
Programacin en C, Aplicaciones electrnicas 9 / 10

Tcnicas de Programacin 3 Parte: Programacin de interrupciones y del Ratn

Ejemplo:

/* Colocar el ratn en la posicin deseada * /

voidColocarRaton (int x, int y)

{ union REGS registros;

registros.x.ax = 4;

registros.x.cx = x;

registros.x.dx = y;

int86 (0x33, &registros, &registros);

Ratn en Modo Grfico

Recordemos que la posicin que ocupa el ratn en la pantalla se define siempre en


coordenadas graficas, aunque se est trabajando en modo texto, considerando tantos
puntos en la pantalla como permita la tarjeta grafica

(Actualmente, en VGA la resolucin de la pantalla suele ser de 640x480 pixels).


El desplazamiento del cursor se realiza mediante una unidad de movimiento del ratn que
recibe el nombre de mickey y equivale a 1/200 pulgadas.

Cuando se mueve el ratn, el controlador del ratn ( el programa driver) mueve el cursor
horizontal y verticalmente un numero de pixels que depende de la sensibilidad del ratn.
Por defecto, cuando se instala el controlador del ratn, para conseguir un desplazamiento
de 8 pixels se precisan 8 mickeys en horizontal y 16 en vertical. EI control del ratn se
realizaba mediante la interrupcin int 0x33.

A continuacin se muestra, como ejemplo, un programa que activa el ratn y muestra las
coordenadas del cursor:

#include <stdio.h>

#include <conio.h>

#include <dos.h>

#include <stdlib.h>

#include <graphics.h>

void main()

{ union REGS estado ;

int driver = DETECT, mode; /* para seleccionar el modo grafico */

clrscr() ;Metodologa de Programacin, Programacin en C, Aplicaciones electrnicas 10


/ 10

Tcnicas de Programacin 3 Parte: Programacin de interrupciones y del Ratn

//Inicializa el modo grafico en la pantalla.

initgraph(&driver, &mode, "C:\\TC\\BGI") ; // Ruta de los drivers graficos

// Mira si hay ratninstalado

estado.x.ax = 0;

int86 (0x33, &estado, &estado) ;

if ( !estado.x.ax) //si ax=0

no hay raton

printf ("\n ERROR: no hay ratn.") ;

exit (1) ;

estado.x.ax = 1; /* Muestra el ratn */

int86 (0x33, &estado, &estado) ;

printf("Coordenadas del ratn: ");

printf("\npulsa tecla para terminar ") ;

while (!kbhit())

{ gotoxy(24,1) ;

estado.x.ax = 3; /* Obtiene las coordenadas del ratn */

int86 (0x33, &estado, &estado) ;

printf ("%3d,%3d\n" , estado.x.cx, estado.x.dx) ;

closegraph() ; /* cierra el modo grafico */

estado.x.ax = 2; /* Quita el cursor del ratn */

int86 (0x33, &estado, &estado);

También podría gustarte