que lo hizo en 1999 en pascal y me quedé fascinado , llevaba tiempo con esa "espinilla" y al final lo hice y la verdad que es una gran satisfaccion ver que funciona, tambien decir que me ayudaron un poco sobre todo con la documentacion , ya que no entendia "ni papa", hasta que me fui metiendo y aqui esta. Ya el año pasado colgué la primera version por ahi , no me acuerdo donde ... pero cargaba solo 320x200 de tamaño de imagen, aqui juego con el modo VESA cambiando de bancos (todo esto está obsoleto ), hacia tiempo que tenia el fuente en el disco duro , pero cualquier dia formateo o lo que sea y lo pierdo ... Como a mi me costó entender las cosas ya que estaba a 0 total, aqui lo dejo mas o menos comentado por si alguien tiene alguna duda , se que esto no es el programa del año pero bueno, mientras buscaba por internet algun ejemplo , vi muy pocos , eso fue lo que me ha animado para colgarlo. Gracias !
Para usarlo necesitas el BORLAND C++ 5.0 y WINXP en modo nativo , para poder cambiar a pantalla completa real , en virtual a mi no me funcionaba bien.
Código:
//BITMAP LOADER BY TSW 2012. //PROGRAMADOR : Gabriel González González //VERSION : 2.0 //E-MAIL : [email protected] //NOVEDADES : Es posible cargar imagenes grandes, // cambiando bancos de memoria y mayor velocidad de carga. // //AGRADECIMIENTOS A MIGUEL Y A BOB (Canadá) POR SU AYUDA //NOTA: //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //Este programa carga archivos BMP a 8 bits ( 256 colores) //fue hecho para ver como cargar una imagen , compilado en BORLAND C++ 5.0 //bajo Windows XP, cualquier duda ya tienen mi e-mail ;). //para usarlo creen una imagen bmp con el MSPAINT y en guardar como, elijan //256 colores. Deberia funcionar. y en el path , pongan el nombre de su imagen. //se que esto no es para dar un premio , pero, tenia curiosidad y aprendi //un monton , que es lo interesante. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #include <iostream.h> #include <stdio.h> #include <stdlib.h> //LIBRERIAS #include <conio.h> #include <string.h> #include <dos.h> void carga_total(char *fichero); void lee_datos(long lugar); unsigned char *vga = (unsigned char *) MK_FP(0xA000,0); //defino puntero FAR ( con segmento y desplazamiento ) //que apunta a la MEMORIA DE VIDEO 0xA000 FILE *archivo; void main() { //La llamada la hago varias veces para comprobar la velocidad //de carga entre imagen e imagen. cout << "BITMAP LOADER 2.0 BY TSW\n"; cout << "Pulse una tecla para empezar la carga ...\n"; getch(); carga_total("c:\\ibiza.bmp"); getch(); carga_total("c:\\ibiza.bmp"); getch(); carga_total("c:\\ibiza.bmp"); getch(); carga_total("c:\\ibiza.bmp"); getch(); } void carga_total(char *fichero) { char *fil = fichero; archivo = fopen(fil,"rb"); //binario if(archivo == NULL ) printf("ERROR GRAVE !!! NO SE HA PODIDO ABRIR EL ARCHIVO!!!\n"); unsigned char valor; unsigned char r,v,a,c; unsigned int cuenta_colores; cuenta_colores = 0; //Elijo tipo de resolucion en modo VESA asm { mov ax,4f02h mov bx,107h int 10h } //Me situo justo donde empieza la paleta de colores fseek(archivo,54L,SEEK_SET); //--- numero colores bmp //Voy leyendo de 4 en 4 bytes, el nº 4 nulo, solo valen //los 3 primeros ( mira la documentacion del bmp ) do { fread(&valor,1,1,archivo); a = (valor/4); //divido entre 4 porque el valor maximo tiene que //ser 63 porque los colores usan 7 bits, no 8. //1111111 = 63. (de 0 a 63 ) 64 combinaciones de color fread(&valor,1,1,archivo); v = (valor/4); fread(&valor,1,1,archivo); r = (valor/4); fread(&valor,1,1,archivo); outportb(0x3c8,cuenta_colores); //envio cada color al puerto de la VGA outportb(0x3c9,r); //r outportb(0x3c9,v); //v outportb(0x3c9,a); //a cuenta_colores = cuenta_colores + 1; } while(cuenta_colores <= 255); int banco = 0; long lugar = 1078; //me situo justo donde empiezan los datos del dibujo //los colores. //En este caso la resolucion pide 20 bancos de memoria //creo que es 1300x1200 dividido entre 65535 = 20 //no me acuerdo que resolucion , busca resoluciones VESA, te apareceran //los valores disponibles for ( int i = 0; i < 20 ; i++) //pues de 0 a 20 bancos { asm //cambio de banco ...0,1,2,3... 20 { mov ax,4f05h xor bx,bx mov dx,[i] //elijo el banco y cambio int 10h } lee_datos(lugar); //funcion que llena de UN GOLPE 65535 bytes //por lo tanto gana velocidad y la carga es automatica lugar = lugar + 65535; //en el archivo me voy moviendo de 65535 en //65535 , para el siguiente banco } fclose(archivo); } void lee_datos(long lugar) { fseek(archivo,lugar,SEEK_SET); //me situo en el sitio indicado fread(vga,65535,1,archivo); //escribo en la memoria de video 65535 bytes //desde donde diga el puntero del archivo. //la funcion fread permite eso. }