• Sábado 15 de Junio de 2024, 19:12

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - TSW

Páginas: [1]
1
C/C++ / Cómo doble Buffer?,aquí tengo mi codigo para cargar un BMP
« en: Sábado 25 de Junio de 2011, 14:50 »
Hola señores , que tal ? les cuento:

Estoy haciendo un programa , ya lo tengo hecho , pero me falta la ultima parte, la mas importante.
El programa lo estoy haciendo un TURBO C++ 3.0 con una máquina antigua, Pentium 166 MMX y usando MSDOS 7.1 . Tengo ese PC para aprendizaje de ciertas cositas que los Sistemas Operativos de hoy en dia no te dejan aprender. Bueno , al grano:  

He hecho un cargador de BitMap,( carga imagánes bmp ) pero el problema es que voy leyendo y mostrando directamente en la video memoria, por lo tanto, voy viendo como carga la imagen. Es un proceso lento.

Segun he leido, lo que debo hacer es un doble buffer, o pantalla virtual, lo que haces es cargar los datos ahi ,y luego volcarlos a la video memoria. Eso se hace con malloc(), farmalloc(), o incluso llamando a la INT 21 Función 48 ( Asignar parrafos de memoria ). Lo que pasa es que hago esto y siempre se me cuelga el PC
Incluso usando INT 21 me dice que tengo poca memoria. Cosa que no es verdad.

Vamos , que no se como usar farmalloc, ni calloc, malloc ...y esa es mi duda.



Código: C++
  1.  
  2.  
  3. #include <graphics.h>
  4. #include <iostream.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>   //LIBRERIAS
  7. #include <conio.h>
  8. #include <string.h>
  9. #include <dos.h>
  10. #include <math.h>
  11. #include <alloc.h>
  12. #include <malloc.h>
  13. #include <mem.h>
  14.  
  15. main()
  16. {
  17.     clrscr();
  18.     int far *array;
  19.     array = (int far *) farmalloc(64000);
  20. do
  21.       {
  22.            array[contador] = 1;
  23.            contador = contador + 1;
  24.       }
  25. while(contador<=64000);
  26.  
  27. }
  28.  
  29.  

Cuando lo ejecuto se me cuelga el ordenador, ¿Por qué? Supuestamente no esta creado un espacio de memoria de 64000 bytes??¿?¿
¿Qué estoy haciendo mal? Porque la verdad que estoy desesperado.


Si alguien quiere usar el codigo para probarlo. Puede hacerlo creando un bmp con el paint y guardandolo como 256 colores ( guardar como ... 24 bits... 8 bits ... ) aunque probablemente lo vea mal , de hecho yo hice el bmp en Corel Draw 4.0 ( 1994 ) , me carga los bmp correctamente, ahora en un Paint normal , falla.


Tambien funciona en WINDOWS XP

Código: C++
  1.  
  2. //BITMAP LOADER BY TSW 2011.
  3. //PROGRAMADOR : Gabriel González González
  4. //E-MAIL : gabrielgg85@gmail.com
  5. //AGRADECIMIENTOS A MIGUEL Y A BOB (Canadá ) POR SU AYUDA
  6. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  7. #include <graphics.h>
  8. #include <iostream.h>
  9. #include <stdio.h>
  10. #include <stdlib.h>   //LIBRERIAS
  11. #include <conio.h>
  12. #include <string.h>
  13. #include <dos.h>
  14. #include <math.h>
  15.  
  16. informacion(); //subprograma cabecera
  17.  
  18. main()
  19. {
  20. //SUBPROGRAMA INFORMACION
  21.  
  22.     clrscr();
  23.     cout << "BITMAP LOADER 1.0 BY TSWn";
  24.  
  25.     char *fil = "c:\nuevo1.bmp"; //aquí la ruta de tu archivo, no olvides poner DOBLE BARRA \ ,te recomiendo ponerlo en c: raiz el archivo.
  26.     FILE *archivo;
  27.     archivo = fopen(fil,"rb"); //binario
  28.  
  29.     if(archivo == NULL )
  30.     printf("ERROR GRAVE !!! NO SE HA PODIDO ABRIR EL ARCHIVO!!!n");
  31.     if (archivo)
  32.         printf("ARCHIVO ABIERTO CON XITO !!!n");
  33.  
  34. cout << "Ruta de Archivo " << fil ;
  35. cout << "n---------------------------------------n";
  36. cout << "INFORMACIàN DE CABECERA ARCHIVO BMP n";
  37. cout << "---------------------------------------n";
  38.  
  39. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  40.  
  41. long tamano;
  42. long offset;
  43. long ancho;       //nombro variables
  44. long alto;
  45. int planos;
  46. int bpp;
  47. long compresion;
  48. long tamanoBmpPixel;
  49. long NumColores;
  50. char tipo[1]; //Tipo BMP ( Microsoft,OS/2...)
  51.  
  52. tamano = 0;
  53. offset = 0;
  54. ancho = 0;       //inicializo variables para que no tomen valores extra¤os
  55. alto= 0;
  56. planos= 0;
  57. bpp= 0;
  58. compresion= 0;
  59. tamanoBmpPixel= 0;
  60. NumColores= 0;
  61.  
  62.  
  63. fseek(archivo,0L,SEEK_SET); //Tipo de bmp
  64.    fread(tipo,1,2,archivo);
  65.    printf("þ     Tipo de BMP   = %s n",tipo);
  66. //   rewind(archivo);
  67.  
  68. fseek(archivo,2L,SEEK_SET); //---tama¤o archivo bmp
  69.      fread(&tamano,1,4,archivo);
  70.      printf("þ     Tama¤o de BMP = %lu Bytesn",tamano);
  71.  
  72. fseek(archivo,10L,SEEK_SET); //----offset archivo
  73.      fread(&offset,1,4,archivo);
  74.      printf("þ     Offset BMP    = %d (Datos im gen empiezan en este byte)n",offset);
  75.  
  76.  
  77. fseek(archivo,18L,SEEK_SET); //----ancho archivo
  78.     fread(&ancho,1,4,archivo); //guardo en &ancho, 1 registro de 4 bytes.
  79.     printf("þ     Ancho de BMP  = %dn",ancho);
  80.  
  81. fseek(archivo,22L,SEEK_SET); //----alto bmp
  82.     fread(&alto,1,4,archivo);
  83.     printf("þ     Alto de BMP   = %dn",alto);
  84.  
  85. fseek(archivo,26L,SEEK_SET); //----numero de planos
  86.     fread(&planos,1,2,archivo);
  87.     printf("þ     Numero de planos BMP = %dn",planos);
  88.  
  89. fseek(archivo,28L,SEEK_SET); //----bit por pixel ( 256 colores 8 bit)
  90.     fread(&bpp,1,2,archivo);
  91.     printf("þ     Bit por pixel (BPP) = %dn",bpp);
  92.  
  93. fseek(archivo,30L,SEEK_SET); //----compresion archivo bmp
  94.     fread(&compresion,1,2,archivo);
  95.     printf("þ     ¨Existe compresi¢n? (0->NO) = %dn",compresion);
  96.  
  97. fseek(archivo,34L,SEEK_SET); //---cantidad en pixel
  98.     fread(&tamanoBmpPixel,1,4,archivo);
  99.     printf("þ     Tama¤o im gen %lu pixelesn",tamanoBmpPixel);
  100.  
  101. fseek(archivo,46L,SEEK_SET); //--- numero colores bmp
  102.     fread(&NumColores,1,4,archivo);
  103.     printf("þ     N£mero de colores de im gen %dn",NumColores);
  104.  
  105. cout << "n";
  106. cout << "PULSE UNA TECLA PARA MOSTRAR EL BMP EN PANTALLA";
  107. getch();
  108.  
  109. long  rojo,verde,azul,contador;
  110. long  dato,cuenta_colores;
  111. long  valorLetra;
  112. int   valor;    //con INT SALE MAS COLOR original CHAR
  113. int r,v,a,c;
  114. r = 0; v= 0; a= 0; c= 0;
  115. valor = 0;
  116. valorLetra = 0;
  117. cuenta_colores = 0;
  118. contador  =  0;
  119. dato      =  0;
  120.  
  121.     asm{
  122.       mov ah,0
  123.       mov al,13h
  124.       int 10h
  125.     }
  126.  
  127.  
  128.     fseek(archivo,54L,SEEK_SET); //--- numero colores bmp ( Cargo Paleta Colores )
  129.     do
  130.        {
  131.  
  132.         outportb(0x3c8,cuenta_colores);
  133.         fread(&valor,1,1,archivo);
  134.            valorLetra = valor;
  135.            azul = abs(valorLetra /4);   //falta poner valor ascii
  136.            valorLetra = 0;
  137.            a = azul;
  138.  
  139.         fread(&valor,1,1,archivo);
  140.           valorLetra = valor;
  141.           verde = abs(valorLetra/4 );
  142.           valorLetra = 0;
  143.           v = verde;
  144.  
  145.         fread(&valor,1,1,archivo);
  146.            valorLetra = valor;
  147.            rojo = abs(valorLetra/4 );
  148.            valorLetra = 0;
  149.            r = rojo;
  150.  
  151.         fread(&valor,1,1,archivo);
  152.         valorLetra = 0;
  153.         cuenta_colores = cuenta_colores + 1;
  154.  
  155.          outportb(0x3c9,r);
  156.          outportb(0x3c9,v);
  157.          outportb(0x3c9,a);
  158.         }
  159.  
  160.     while(cuenta_colores <= 255);
  161.     getch();
  162.  
  163.     do
  164.         {
  165.         fseek(archivo,1078L+contador,SEEK_SET);   //Aquí vuelvo a video memoria. Lo que quiero hacer es guardar esos datos en un array de 63779
  166.         fread(&dato,1,1,archivo);        //elementos y luego volcarlo a la video memoria, pero no se como hacerlo.
  167.         pokeb(0xa000,contador,dato); // Muestra en video memoria.
  168.         contador = contador + 1 ;
  169.         }
  170.     while (contador <=63779);
  171.  
  172.     getch();
  173.  
  174.      asm{
  175.     mov ah,0
  176.     mov al,02h          //vuelvo a pantalla modo texto
  177.     int 10h
  178.     }
  179.  
  180. return(0);
  181. }
  182.  
  183.  
  184.  

2
Hola a todos , que tal ? soy nuevo en este foro, bueno , aqui va mi pregunta , espero no enrrollarles mucho  gracias:) Antes que nada se que este foro es de ASM, pero lo mas relacionado con la duda que tengo es aqui, lo que estoy haciendo es en Quick Basic 7.1 , un poco antiguo , pero es por investigacion personal. Espero la ayuda y disculpen las molestias.

Tengo un manual de programacion en DOS , y quiero usar una funcion de la INT 21, la 47 h exactamente, lo que hace esta es mostrar el directorio actual, para acceder a esta el manual lo dice lo siguiente "La funcion 47h permite a los programas determinar el directorio actual de la unidad especificada. para obtener el directorio actual mediante la funcion 47h el programa debe asignar el segmento y el desplazamiento de la direccion en un buffer de 64 bytes a la combinacion de registros DS:SI. Seguidamente debe asignar el numero correspondiente a la unidad en el registro DL. El dos emplea el 0 para la unidad actual, 1 para A, 2 para B y asi sucesivamente.

Contenido de entrada :
AH = 47H Servicio para obtener directorio DOS
DS = Direccion del segmento de la memoria intermedia que almacena el nombre del directorio
SI = Direccion del desplazamiento de la memoria intermedia que almacena el nombre del directorio
DL = Nº de unidad que contiene el directorio

Contenido de Salida:
AX = Codigo de error si el indicador de acarreo esta activado 0FH Unidad no valida.

Vale , ahora mi codigo :

Aqui va el codigo :

Código: Visual Basic
  1.  
Type RegtypeX
ax as integer
bx as integer
cx as integer
dx as integer
bp as integer
si as integer
di as integer
flags as integer
ds as integer
es as integer
End Type

Dim inregs as regtypeX
Dim outregs as regtypeX

inregs.ax = &h4700
inregs.dx = &h0

call interrupt ( &h21,inregs,outregs)

DS : SI ?¿?¿?¿?¿

La pregunta : ¿Como hago para asignar el segmento y el desplazamiento de la direccion en un buffer de 64 bytes a la combinacion de registros DS:SI ? Esta parte no la entiendo.

Gracias a todos, es que quiero empezar por aqui para entenderlo bien y luego meterme en ASM. Gracias !

3
ASM (Ensamblador) / Duda con Registros DS , SI , para usar funcion INT21h(MSDOS)
« en: Miércoles 9 de Marzo de 2011, 21:39 »
Hola a todos , que tal ?  soy nuevo en este foro, bueno , aqui va mi pregunta , espero no enrrollarles mucho ;) gracias:) Antes que nada se que este foro es de ASM, pero lo mas relacionado con la duda que tengo es aqui, lo que estoy haciendo es en Quick Basic 7.1 , un poco antiguo , pero es por investigacion personal. Espero la ayuda y disculpen las molestias.

Tengo un manual de programacion en DOS , y quiero usar una funcion de la INT 21, la 47 h exactamente, lo que hace esta es mostrar el directorio actual, para acceder a esta el manual lo dice lo siguiente "La funcion 47h permite a los programas determinar el directorio actual de la unidad especificada. para obtener el directorio actual mediante la funcion 47h el programa debe asignar el segmento y el desplazamiento de la direccion en un buffer de 64 bytes a la combinacion de registros DS:SI. Seguidamente debe asignar el numero correspondiente a la unidad en el registro DL. El dos emplea el 0 para la unidad actual, 1 para A, 2 para B y asi sucesivamente.

Contenido de entrada :
AH = 47H Servicio para obtener directorio DOS
DS = Direccion del segmento de la memoria intermedia que almacena el nombre del directorio
SI = Direccion del desplazamiento de la memoria intermedia que almacena el nombre del directorio
DL = Nº de unidad que contiene el directorio

Contenido de Salida:
AX = Codigo de error si el indicador de acarreo esta activado 0FH Unidad no valida.

Vale , ahora mi codigo :

Aqui va el codigo :

Código: Visual Basic
  1.  
Type RegtypeX
     ax as integer
     bx as integer
     cx as integer
     dx as integer
     bp as integer
     si as integer
     di as integer
     flags as integer
     ds as integer
     es as integer
End Type

Dim inregs as regtypeX
Dim outregs as regtypeX

inregs.ax = &h4700
inregs.dx = &h0

call interrupt ( &h21,inregs,outregs)

DS : SI ?¿?¿?¿?¿

La pregunta :  ¿Como hago para asignar el segmento y el desplazamiento de la direccion en un buffer de 64 bytes a la combinacion de registros DS:SI ? Esta parte no la entiendo.

Gracias a todos, es que quiero empezar por aqui para entenderlo bien y luego meterme en ASM. Gracias !

Páginas: [1]