Está en la página 1de 10

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

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 Operating System) 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.

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


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

Las funciones que se ejecutan con cada interrupcin software son un


estandar en el mundo PC.

En nuestro caso, algunas de las interrupciones que nos van a ser mas
utiles seran:
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 numero de interrupcin.


- Escribir en otro registro en numero de funcin deseada.
- Escribir en otro/s registro/s los parametros 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 {
unsigned int ax;
unsigned int bx;
unsigned int cx;
unsigned int dx;
unsigned int si;
unsigned int di;
unsigned int cflag;
unsigned int flags;
}

struct BYTEREGS {
unsigned char al;
unsigned char ah;
unsigned char bl;
unsigned char bh;
unsigned char cl;
unsigned char ch;
unsigned cha.r d1;
unsigned cha.r dh;

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


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

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.

Union Nombre_Union {
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 sera la ncccsaria para almacenar el miembro de
la unin que mas memoria neccsite (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, segun 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.

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


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

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 almacen 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 tambien con el operador punto ., Por ejemplo, con la unin
declarada anteriormente, cualquiera de las siguientes lineas sera 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 implementacion de los diferentes registros del


procesador, para escribir un dato en la union de los registros (REGS) :

Ejemplo:

Escribir en el registro ax el valor OxFF11. Solucin:

Definimos una variable de tipo union REGS

union 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 (int numero_interrupcion, union REGS *registros_entrada,


union REGS *registros_salida);

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


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

MANEJO DEL RATON

Uno de los dispositivos mas utiles y populares del PC es el ratn. Los ratones
Ilevan 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 este 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 parametros 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 boton
botones y la posicin bx=1 boton Izqdo
del cursor bx=2 boton Dcho
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 desplaz Horiz. ax=7
cx=H minima
dx=H mxima
08h Rango desplaz Vert. ax=8
cx=V minima
dx=V mxima

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


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

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 este trabajando, es decir, de la resolucin. En las funciones basicas 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 caracter ocupa 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 * /

int ResetRaton (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;
}

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


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

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 */

void MostrarCursor (void)


{ union REGS registros;
registros.x.ax = 1;
int86 (0x33, &registros, &registros);
}

/* Apagar el cursor del ratn * /

void ApagarCursor (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 ).

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


registro dx la coordenada Y.

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


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

Ejemplo:

/* Botn derecho del ratn presionado * /

int BotonDerecho (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 * /

int BotonIzquierdo (void)


{ union REGS registros;
registros.x.ax = 3;
int86 (0x33, &registros, &registros);
return (registros.x.bx & 1);

/* Devolver la posicin del ratn * /

int PosicionRraton (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.

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


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

Ejemplo:

/* Colocar el ratn en la posicin deseada * /

void ColocarRaton (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 este 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() ;

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


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

//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) ;
}

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

También podría gustarte