Normas del foro

Curso Hacker
Bienvenido(a), Visitante. Favor de ingresar o registrarse.
¿Perdiste tu email de activación? - Diciembre 03, 2008, 11:19:15
Inicio Ayuda Ingresar Registrarse
Visita: Articulos - Juegos Gratis - Da Foros

Comunidad Underground Hispana  |  Programacion  |  Programación  |  Carbide C/C#/C++ (Moderador: Fashion)  |  Tema: La Interrupcion 10h 0 Usuarios y 1 Visitante están viendo este tema. « anterior próximo »
Páginas: [1] Ir Abajo Imprimir
Autor Tema: La Interrupcion 10h  (Leído 2533 veces)
digital_boy
Recien Llegado
*
Desconectado Desconectado

Mensajes: 11


lacssoft@hotmail.com
Ver Perfil Email
« en: Junio 21, 2006, 09:04:23 »

juegos gratis
Hola!

Quiero compartir con ustedes las siguientes funciones que he implementado, sacando provecho las funciones que proporciona la BIOS (Int 10h).

/*
Programador: Digital Love (LACS).
Fecha: 24-Mayo-2006.
Archivo: xbios.h
Funcion: Proporcionar funciones basica proporcionadas por el BIOS, para la
   gestion del video.
*/
#include<dos.h>

/*********************Definicion de Constantes***************************/
#define AZUL       1
#define VERDE      2
#define ROJO      4
#define INTENSO    8
#define F_AZUL     16
#define F_VERDE     32
#define F_ROJO     64
#define PARPADEO 128

#define TEX   0x3  //Modo Texto
#define GRA     0x13 //Modo Grafico

/*******************Prototipos de Fuciones*******************************/
void ModoGrafico(unsigned int modo);
void Cursor(unsigned int ini, unsigned int fin);
void PonCursor(unsigned int x, unsigned int y);
void PosCursor(unsigned int *x, unsigned int *y);
void PonCar(unsigned char car, char atrib);
int LeeCar(void);
void PonPixel(unsigned int x, unsigned int y, unsigned char color);
unsigned char LeePixel(unsigned int x, unsigned int y);

/*Establecer el modo grafico con el que se desea trabajar*/
void ModoGrafico(unsigned int modo) {
union REGS r;
r.h.ah = 0; //Funcion #0: Seleccionar modo grafico.
r.h.al = modo; //Modo a utilizar.
int86(0x10,&r,&r);
}

/*Establecer tipo de cursor*/
void Cursor(unsigned int ini, unsigned int fin) {
union REGS r;
r.h.ah = 1; //Funcion #1: Seleccionar el tipo del cursor.
r.h.ch = ini; //Inicio del cursor.
r.h.cl = fin; //Fin del cursor.
int86(0x10,&r,&r);
}

/*Posicionar el cursor en las coordenadas XY*/
void PonCursor(unsigned int x, unsigned int y) {
union REGS r;
r.h.ah = 2; //Funcion #2: Pone cursor.
r.h.dl = x; //Columna.
r.h.dh = y; //Fila.
r.h.bh = 0; //Pag. video.
int86(0x10,&r,&r);
}

/*Obtener las cooredenadas del cursor en pantalla*/
void PosCursor(unsigned int *x, unsigned int *y) {
union REGS r;
r.h.ah = 3; //Funcion #3: Poscicion del cursor.
int86(0x10,&r,&r);
*x = r.h.dl; //Columna.
*y = r.h.dh; //Fila
}

/*Lee atributo y caracter en la posicion del cursor*/
int LeeCar(void) {
union REGS r;
r.h.ah = 8; //Funcion #8: Lee caracter y atributo.
r.h.bh = 0; //Pag. video.
int86(0x10,&r,&r);
return r.x.ax; //Caracter.
}

/*Escribe atributo y caracter en la posicion del cursor*/
void PonCar(unsigned char car, char atrib) {
union REGS r;
r.h.ah = 9; //Funcion #9: Escribe caracter y atributo.
r.x.cx = 1; //Numero de veces que escribe el caracter.
r.h.al = car; //Caracter.
r.h.bl = atrib; //Atributo;
int86(0x10,&r,&r);
}

/*Poner pixel en pantalla*/
void PonPixel(unsigned int x, unsigned int y, unsigned char color) {
union REGS r;
r.h.ah = 12; //Funcion #12: Escribir Punto.
r.x.cx = x; //Columna.
r.x.dx = y; //Fila.
r.h.al = color; //Color-Intensidad.
int86(0x10,&r,&r);
}

/*Lee el color especificado en las coordenadas XY*/
unsigned char LeePixel(unsigned int x, unsigned int y) {
union REGS r;
r.h.ah = 13; //Funcion #13: Lee Pixel.
r.x.cx = x; //Columna.
r.x.dx = y; //Fila.
int86(0x10,&r,&r);
return r.h.al; //Color pixel.
}


Espero que les sean de utilidad a todos los interesados. Estas son algunas de las muchas funciones que tengo en mente por desarrollar.

Sus comentarios, criticas o mejoras a estas funciones seran bienvenidas.

Por ahora me despido hasta pronto!
En línea
arvin
Visitante
« Respuesta #1 en: Julio 10, 2006, 05:10:39 »

esta te puede servir tambien:

modo 13h (640*480*256) de Video

Necesitas ser usuario para ver los enlaces Crear Usuario  Hacer Sesion


saludos


En línea
sowher
Habitual
*****
Desconectado Desconectado

Mensajes: 183


[ NuKE ]


Ver Perfil
« Respuesta #2 en: Julio 10, 2006, 10:14:37 »

En línea
arvin
Visitante
« Respuesta #3 en: Julio 10, 2006, 03:46:56 »

me gusta mas el estilo de sowher
En línea
digital_boy
Recien Llegado
*
Desconectado Desconectado

Mensajes: 11


lacssoft@hotmail.com
Ver Perfil Email
« Respuesta #4 en: ſeptiembre 18, 2006, 09:36:19 »

*ACCESO A LA PANTALLA A TRAVEZ DE LA BIOS

Como es bien sabido, las llamadas a la ROM-BIOS pueden ser
bastante lentas.

De cualquier forma, garantizan (mas o menos) poder trabajar con
cual quier computadora que posea una BIOS compatible con IBM,
incluso si el hardware de la pantalla es difirente. Si se desea
incrementar la rapidez de ejecucion se debe acceder directamente
a la memoria RAM de video. No obstante, la desventaja de este
procedimiento es la reduccion de la portabilidad de las rutinas,
ya que es necesario tener un hardware 100% compatible.

Por lo tanto las rutinas de la ROM-BIOS deberian ser utilizadas
en aplizaciones en donde la portabilidad sea de gran prioridad.

*LLAMADAS A LA ROM BIOS (USO INT86)

Las llamadas a la ROM-BIOS son echas utilizando interrupciones
de software.La BIOS cuenta con diferentes tipos de
interrupciones como por ejemplo; de video, de teclado, del
temporizador, etc. Y cada interrupcion cuenta con diferentes
opciones.

Para acceder a las diferentes interrupciones se hace uso de la
funcion int86(). Algunos compiladores puden llamar a esta
funcion de alguna otra forma diferente, pero tanto el compilador
de C de Microsoft al igual que el Turbo C de Borland la llaman
de esta forma.

La funcion int86() presenta esta forma:

   int86(num,reg_entrada, reg_salida)
   int num; //Numero de interrupcion.
   union REGS *reg_entrada; //Valor del registro de entrada.
   union REGS *reg_salida; //Valor del registro de salida.

El valor devuelto por la int86() es el valor del registro AX.
La int86() se encuentra en la libreria DOS.H

REGS es la union de dos estructuras:

   struct Palabra {
      unsigned int ax, bx, cx, dx, si, di, cflag; }
   struct Byte    {
      unsignade char al, ah, bl, bh, cl, ch, dl, dh; }
   union REGS     {
      struct Palabra x;
      struct Byte h; }

Donde Palabra permite acceder a los registros de la CPU como
registros de 16 bits y Byte a los registros de 8 bits.
En línea
digital_boy
Recien Llegado
*
Desconectado Desconectado

Mensajes: 11


lacssoft@hotmail.com
Ver Perfil Email
« Respuesta #5 en: ſeptiembre 18, 2006, 09:45:37 »

Acontinuacion publico el codigo de dos funciones, basadas en las funciones basica que desarrolle haciendo uso de las llamadas al BIOS.

Estas funciones guerdan y restauran una porcion de la pantalla (muy utiles para la implementacion de menus instantaneos).

Código:
/*Salvar una porcion de la pantalla*/
void SalvaPantalla(unsigned int ini_x, unsigned int fin_x,
unsigned int ini_y, unsigned int fin_y, unsigned char *buffer) {
register int x, y;
for(y = ini_y; y <= fin_y; y++)
for(x = ini_x; x <= fin_x; x++) {
PonCursor(x,y);
*buffer++ = LeeCar();
putchar(' '); //Poner blancos.
}
}

/*Restaurar una porcion de la pantalla previamente almacenada*/
void RestauraPantalla(unsigned int ini_x, unsigned int fin_x,
unsigned int ini_y, unsigned int fin_y, unsigned char *buffer,
char atributo) {
register int x, y;
for(y = ini_y; y <= fin_y; y++)
for(x = ini_x; x <= fin_x; x++) {
PonCursor(x,y);
PonCar(*buffer++, atributo);
}
}

Espero que les sean de utilidad.

Y a continuacion tienen un ejemplo de dichas funciones en plena accion:

Código:
#include<conio.h>
#include<xbios.h>
#include"c:\digital\menu.h"

int main(void) {
int x, y;
unsigned char mem[300];

for(y = 10; y <= 20; y++)
for(x = 25; x <= 50; x++) {
PonCursor(x,y);
PonCar(x+10,AZUL|RED);
}

getch();
SalvaPantalla(25,50,10,20,mem);
getch();
RestauraPantalla(0,25,0,9,mem,RED|VERDE|PARPADEO|F_AZUL);

getch();
return 0;
}

En este caso Menu.h, es donde se encuentra el codigo de las funciones de:
SalvaPantalla y Restaura Pantalla.
En línea
Páginas: [1] Ir Arriba Imprimir 
Comunidad Underground Hispana  |  Programacion  |  Programación  |  Carbide C/C#/C++ (Moderador: Fashion)  |  Tema: La Interrupcion 10h « anterior próximo »
Ir a:  


Ranking-Hits
Powered by SMF 1.1.7 | SMF © 2006-2007, Simple Machines LLC