User Tag List

Página 3 de 4 PrimerPrimer 1234 ÚltimoÚltimo
Resultados 31 al 45 de 52

Tema: Programando en MSDOS con VGA

  1. #31

    Fecha de ingreso
    Oct 2012
    Mensajes
    166
    Mencionado
    1 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    1
    Agradecer Thanks Received 
    62
    Thanked in
    Agradecido 24 veces en [ARG:2 UNDEFINED] posts
    Cita Iniciado por swapd0 Ver mensaje
    Es un fichero en ensamblador no en C, un programa en C siempre tiene que tener una función main y por eso te da el error. ¿Has probado en ensamblarlo con algun ensamblador?
    Si claro, el turbo c tiene, tasm, o directamente detecta que es ensamblador y lo compila, pero tal vez necesite otro tipo de software para generar bien el exe.
    O puede que simplemente sean las funciones, como una libreria, pero que le falte algún comando que sea el equivalente a la funcion main en c (es probable). bueno seguire con ello .

    Editado:
    Código:
    tasm L23-1.asm 
    tlink L23-1.obj
    Eso me pasa por no leer.

    He tenido que bajar dosbox a 130 ciclos para que se ralentize un poco con 4 sprites.
    Última edición por mills332; 11/09/2018 a las 16:56

  2. #32

    Fecha de ingreso
    Oct 2012
    Mensajes
    166
    Mencionado
    1 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    1
    Agradecer Thanks Received 
    62
    Thanked in
    Agradecido 24 veces en [ARG:2 UNDEFINED] posts
    Buenas.

    Recogiendo cosas de aquí y allá, conseguí bastantes avances, estoy creando un "motor" para ms-dos pero de momento hay problemas con los malloc, creo que no funcionan como yo esperaba en dos, y hay interferencias en cuanto cargas varias cosas.

    El código es un desastre, no soy programador, aprendi a base de buscar por la red y además utiliza C y ensamblador mezclados. Cuando consiga que cargar sprites no destruya el mapa (parece que sobreescribe partes), lo subire a github.

    De momento lo que hace el motor es:

    - Cargar bmp y dibujarlos. (para intros o lo que sea).
    - Cargar sprites de 8x8, 16x16 y 32x32, con transparencia y con animaciones.
    - Cargar mapas TMX, creados con el programa tiled: https://www.mapeditor.org/
    - Scroll de los mapas a 70 fps.
    - Animaciones de paleta, puedes cambiar 8 primeros colores de la paleta para hacer animaciones.
    - Cargar y reproducir música en formato IMF para el chip ym3812, OPL2, o Adlib, o cualquier Sound Blaster conpatible.

    Para probarlo en un hardware "real" solo tengo un portátil con Pentium 200 MMX y windows 98. Desactivando varias cosas en la bios, llega a funcionar como un 386 a 19 Mhz, aunque la tarjeta de video SVGA es mucho más rápida que una VGA claro.

    En emuladores como PCem, un 8088 a 4.77 Mhz con VGA, carga los mapas y hace el scroll perfectamente a 70fps, aunque un sprite de 32x32 ya le cuesta, y la música también le cuesta un poco.
    Si nos vamos al 8086 a 8 Mhz con VGA y Adlib, va de lujo si no usamos muchos sprites, aunque si nos da igual que haya parpadeos extraños, estilo NES, pues yo creo que unos cuantos sprites van bien .
    Y bueno, un 286 a 6 Mhz ya va sobradísimo si hacemos caso al emulador.

    Pude enviar un demo para que lo probaran en un IBM model 30 286, y parecia cargar bien y todo, excepto que no funciona en un monitor original de esos de IBM, ya que para ocultar los bordes la resolucion es de 304x176, y aún no se como tocar los registros de la VGA para no volver locos a los monitores.

    Supongo que tal y como funciona en la pantalla del portatil con win98, no tendrá problemas si conectas el 8086 o 286 a un monitor moderno VGA.

    Una imagen de prueba, aquí ha cargado y mueve un mapa de ejemplo que venia en el programa tiled, y encima mueve una nave que hice yo de 32x32 pixeles con transparecia, además el agua está animada cambiando la paleta en cada frame:

    Nombre:  game_003.png
Visitas: 556
Tamaño: 16.9 KB

    Para que funcione rápido:
    - Utilicé el modo 13 de vga, que seguramente funcione en MCGA (si alguien tiene uno de esos IBM con MCGA para probarlo...). En el modo 13 se pueden copiar cosas es muy rápido usando una instrucción llamada movsw (sin tener que hacer cosas raras del modo x, que se complica muchísimo...).
    - Scroll por hardware, las tarjetas VGA y MCGA tienen scroll por hardware, así que solamente tenemos que usar la cpu para actualizar los bordes de la imagen cuando mueves el mapa, en lugar de copiar la pantalla entera como hacen la mayoría de juegos.

    Lo malo que tiene, es que dibuja los sprites directamente sobre la pantalla visible y si están en la parte superior, y el pc es lento, como un 8088, se ve que no le da tiempo a dibujarlos, o los dibuja a medias.
    Última edición por mills332; 10/10/2018 a las 01:36

  3. Los siguientes 7 usuarios agradecen a mills332 este post:

    fbustamante (10/10/2018), jduranmaster (10/10/2018), Karkayu (10/10/2018), rage (11/10/2018), romeroca (10/10/2018), selecter25 (10/10/2018), swapd0 (10/10/2018)

  4. #33

    Fecha de ingreso
    Sep 2006
    Mensajes
    4,487
    Mencionado
    21 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    566
    Agradecer Thanks Received 
    497
    Thanked in
    Agradecido 366 veces en [ARG:2 UNDEFINED] posts
    ¿Puedes usar scroll por hardware y no tienen doble buffer? WTF!?!?
    No es lo mismo tener diez años de experiencia, que tener un año de experiencia diez veces.

  5. #34

    Fecha de ingreso
    Oct 2012
    Mensajes
    166
    Mencionado
    1 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    1
    Agradecer Thanks Received 
    62
    Thanked in
    Agradecido 24 veces en [ARG:2 UNDEFINED] posts
    Cita Iniciado por swapd0 Ver mensaje
    ¿Puedes usar scroll por hardware y no tienen doble buffer? WTF!?!?
    Ahora mismo no se en qué web lo encontré, creo que en varias y terminé recopilando todo en la función, no es como una consola que cambias la X y la Y y ya, la VGA es una cosa super rara, no parece que pensaran en juegos ni por asomo cuando la hicieron jaja.

    Código:
    typedef unsigned char  byte;
    typedef unsigned short word;
    
    //Hardware scrolling
    void MCGA_Scroll(word x, word y){
    	byte pix = x & 7; 	//calcula un valor entre 0 y 8 para el registro "pixel panning"
    	x=x/4;			
    	y=y*80;	
    
    	//Registro de scroll "pixel panning"
    	inp(0x3da);
    	outp(0x3c0, 0x33);		
    	outp(0x3c0, pix*2);
    
    	//Registro de scroll, solo mueve de 4 en 4 pixels
    	outport(0x03d4, 0x0C | (x+y & 0xff00)); //HIGH_ADDRESS 0x0C;
    	outport(0x03d4, 0x0D | (x+y << 8));  //LOW_ADDRESS 0x0D
    
    	//espera a que dibuje la pantalla
    	while ((inp(0x03da) & 0x08));
    	while (!(inp(0x03da) & 0x08));
    }
    Resulta que unos registros van de 4 en 4, otros no, la posición del scroll hay que calcularla... en fin que lo copie de sitios por ahí hasta que funcionó.

    Pero bueno sigue siendo "hardware", esos cálculos de multiplicar y dividir los pones con "<<" o ">>" y no gasta a penas cpu.
    Última edición por mills332; 10/10/2018 a las 16:41

  6. #35

    Fecha de ingreso
    Sep 2006
    Mensajes
    4,487
    Mencionado
    21 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    566
    Agradecer Thanks Received 
    497
    Thanked in
    Agradecido 366 veces en [ARG:2 UNDEFINED] posts
    Ok, lo que escribe en el puerto 0x3d4 es el offset dentro de la memoria de video en palabras de 32 bits, como una linea son 320 pixels -> 320bytes dividido entre 4 bytes -> 80, y en el registro 0x3c0 va el desplazamiento a pixel, lo que no se es porque lo tienes que multiplicar por 2.

    Lo que no se es si pones un desplazamiento de y de 100 lineas por ejemplo, que aparece a partir de la mitad de la pantalla, si es la parte correspondiente al offset 0 o sigue pasados los 64kb. Visto de otra forma, si pones un offset de 32Kb, en la pantalla ves desde 32kb hasta 32kb + 64kb, o ves primero 32kb + 32kb y después 0kb hasta 32kb (como si fuera cíclica la memoria de video).

    PD: la espera del final yo la quitaría y la pondría en una función separada, ya que MCGA_Scroll se supone que tiene que "scrollar" y no "scrollar" y esperar.
    No es lo mismo tener diez años de experiencia, que tener un año de experiencia diez veces.

  7. #36

    Fecha de ingreso
    Oct 2012
    Mensajes
    166
    Mencionado
    1 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    1
    Agradecer Thanks Received 
    62
    Thanked in
    Agradecido 24 veces en [ARG:2 UNDEFINED] posts
    Pues lo de la memoria es raro, a ver... con un código se ve mejor. En el modo 13, si la memoria tuviese 8x2 pixeles se vería así:

    Código:
    01234567
    89ABCDEF
    y si mueves el scroll a (4,0) se ve esto:

    Código:
    456789AB
    CDEF0123
    Y hacia abajo o hacia arriba parecido, lo único que hace el scroll es decir cual es la posicion en la memoria que tiene que leer la tarjeta cuando empieza a dibujar en 0,0. Pero no termino de entenderlo... ni por qué al dibujar una columna de tiles a la derecha, no se ven una línea movida hacia arriba, pero si la pones en y = -16, si que se mueven, no se, cosas mías de no procesar bien las matemáticas jaja (ahh.. al poner ese ejemplo ya lo entendí).

    A ver si consigo que se vea un mapa grande esta semana y pongo todo el código fuente, porque hay cosas que no entiendo, como lo del pixel*2, si no lo multiplico por 2, va la mitad de lento, y el mapa se mueve a 35 fps.
    Última edición por mills332; 10/10/2018 a las 17:57

  8. #37

    Fecha de ingreso
    Sep 2006
    Mensajes
    4,487
    Mencionado
    21 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    566
    Agradecer Thanks Received 
    497
    Thanked in
    Agradecido 366 veces en [ARG:2 UNDEFINED] posts
    Lo del scroll horizontal es normal que pase eso, en otros cacharros (STE y Amiga) puedes definir el ancho de la linea aunque solo veas 320 pixels y al hacer scroll horizontal no pasa eso, pero solo lo puedes usar en juegos donde te muevas poco hacia los lados por el consumo de memoria.
    No es lo mismo tener diez años de experiencia, que tener un año de experiencia diez veces.

  9. #38

    Fecha de ingreso
    Mar 2004
    Ubicación
    Lleida
    Mensajes
    2,645
    Mencionado
    27 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    87
    Agradecer Thanks Received 
    812
    Thanked in
    Agradecido 344 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    1
    A ver si ya que estáis con el tema, sabéis por qué pasa lo de los colores de este vídeo. Están como cambiados en los Commander Keen.


  10. #39

    Fecha de ingreso
    Oct 2003
    Mensajes
    1,628
    Mencionado
    21 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    903
    Agradecer Thanks Received 
    154
    Thanked in
    Agradecido 88 veces en [ARG:2 UNDEFINED] posts
    Me imagino que las tarjetas graficas actuales no han sido diseñadas pensando en ser compatibles 100% con las antiguas CGA/EGA/VGA, mas como un modo legacy para salir del paso

    Por eso tambien los parpadeos y bloqueos en el Duke Nukem 3D cuando no se usa VESA

  11. El siguiente usuario agradece a rage este mensaje:

    JoJo_ReloadeD (13/10/2018)

  12. #40

    Fecha de ingreso
    Oct 2012
    Mensajes
    166
    Mencionado
    1 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    1
    Agradecer Thanks Received 
    62
    Thanked in
    Agradecido 24 veces en [ARG:2 UNDEFINED] posts
    Cita Iniciado por davken Ver mensaje
    A ver si ya que estáis con el tema, sabéis por qué pasa lo de los colores de este vídeo. Están como cambiados en los Commander Keen.
    Recuerdo cuando vi ese vídeo que él mismo lo decía, es lo que dijo rage, en las tarjetas actuales han dejado un modo compatible con cga/ega/vga, pero puede funcionar o no, o hacer cosas raras.

  13. #41

    Fecha de ingreso
    Oct 2012
    Mensajes
    166
    Mencionado
    1 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    1
    Agradecer Thanks Received 
    62
    Thanked in
    Agradecido 24 veces en [ARG:2 UNDEFINED] posts
    Cita Iniciado por rage Ver mensaje
    Me imagino que las tarjetas graficas actuales no han sido diseñadas pensando en ser compatibles 100% con las antiguas CGA/EGA/VGA, mas como un modo legacy para salir del paso

    Por eso tambien los parpadeos y bloqueos en el Duke Nukem 3D cuando no se usa VESA
    Justo ayer metí un usb con msdos en un PC nuevo con tarjeta de NVidia, y el color blanco de EGA se ve VERDE . Lo increíble es que aun funcione y el juego se piense que el PC es un 286

    Cambiando de tema, es interesante eso de cargar fuentes modificadas para usarlar en VGA que viene como último ejemplo de esta web que puso JoJo_ReloadeD
    http://www.nachocabanes.com/videojuegos/cpv/index.html Intentaré probarlo.

    También He trasteado con la VGA, el Scroll los registros etc, Ya he conseguido que la función de scroll por hardware no tenga fallos:

    Código:
    void MCGA_Scroll(word x, word y){
    	byte p[8] = {0,2,4,6};
    	byte pix = x & 3; 	//pixel panning
    	x=x>>2;				//x/4
    	y=(y<<6)+(y<<4);	//(y*64)+(y*16) = y*80;
    
    	while ((inp(0x03da) & 0x08)); //WaitVBL 
    	inp(0x3da);
    	outp(0x3c0, 0x33);
    	outp(0x3c0, p[pix]); //pixel panning solamente puede ser 0,2,4 o 6, para mover de 0 a 4 pixels.
    	//Registros de VRAM, definen el primer pixel que leerá la tarjeta cuando empiece a dibujar en pantalla
    	outport(0x03d4, 0x0C | (x+y & 0xff00)); //HIGH_ADDRESS 0x0C; 
    	outport(0x03d4, 0x0D | (x+y << 8)); //LOW_ADDRESS 0x0D
    	while (!(inp(0x03da) & 0x08)); //WaitVBL
    }
    Con el mismo PC moderno he probado el scroll y el motor que estoy haciendo, y es increíble como funciona de bien.

    Como estoy utilizando el modo 13 (MCGA) y solo tiene 64Kb, he tenido que reducir la resolución a 304x176 para tener bordes donde actualizar el mapa, lo malo es que eso hace que el algunos monitores no funcionen bien:

    Código:
    void set_mode(byte mode){
    	union REGS regs;
    	regs.h.ah = 0x00;
    	regs.h.al = mode;
    	int86(0x10, &regs, &regs);
    	
    	//Desactiva proteccion de registros
        word_out(0x03d4, V_RETRACE_END, 0x2c);
    	
    	//Esto funciona pero deja bordes solamente en la parte derecha y en la parte inferior en algunos monitores
    	word_out(0x03d4,H_DISPLAY_END, (304>>2)-1);		//HORIZONTAL RESOLUTION = 304 
    	word_out(0x03d4,V_DISPLAY_END, 176<<1);  		//VERTICAL RESOLUTION = 176
    	
    	//Se supone que con esto se puede centrar, pero no tengo ni idea
    	//word_out(0x03d5,H_TOTAL,0); 
    	
    	//word_out(0x03d4,H_BLANK_START, 0);        
    	//word_out(0x03d4,H_BLANK_END,0);
    	//word_out(0x03d4,H_RETRACE_START,0);
    	//word_out(0x03d4,H_RETRACE_END,0);  
    	
    	//word_out(0x03d4,V_BLANK_START, 0);   
    	//word_out(0x03d4,V_BLANK_END, 0);   
    	//word_out(0x03d4,V_RETRACE_START, 0); 
    	//word_out(0x03d4,V_RETRACE_END, 0);  
    	
        //Activa la proteccion de registros
        word_out(0x03d4, V_RETRACE_END, 0x8e);
    }
    Nombre:  image.png
Visitas: 254
Tamaño: 20.3 KB
    (Lo ideal sería conseguir que en el mismo dosbox se viese algo como lo de la derecha).

    Si alguien quiere trastear aquí dejo el código fuente de prueba que carga una imagen y cambia la resolución.
    En dosbox simplemente cambia el tamaño de la ventana o rellena toda la pantalla.
    En msdos con un pc con tarjeta gráfica de intel, rellena toda la pantalla, y con la NVidia deja un borde a la derecha y abajo.
    Un usuario de otro foro lo probó en un 286 con VGA auténtica, y se comportaba exactamente igual que la NVidia .
    Archivos adjuntados Archivos adjuntados
    Última edición por mills332; 09/11/2018 a las 15:31

  14. #42

    Fecha de ingreso
    Apr 2006
    Mensajes
    10,442
    Mencionado
    140 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    1,860
    Agradecer Thanks Received 
    2,756
    Thanked in
    Agradecido 1,301 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    15
    Jeje esos modos tweaked... mola


  15. #43

    Fecha de ingreso
    Oct 2012
    Mensajes
    166
    Mencionado
    1 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    1
    Agradecer Thanks Received 
    62
    Thanked in
    Agradecido 24 veces en [ARG:2 UNDEFINED] posts

    Cool

    Pues bueno, no quedó mal, a pesar de los sprites corruptos y los bugs, debería funcionar perfectamente en un 8086 a 8 MHz, y un poco lento en un 8088 a 4.77.

    El vídeo está capturado con dosbox daum a 600 ciclos (tras muchas pruebas, es la velocidad más parecida el 8086-8 MHz).

    Necesita la tarjeta Gravis Ultrasound (para reproducir MOD).

    He intentado no ser un desastre con el código, pero la verdad es que tiene funciones demasiado específicas para el tipo de juegos que quería hacer.



    No he conseguido que funcione a 320x200 con bordes, así que se quedó a 304x176, lo que hace que algunos monitores no funcionen.

    En el video puse el link a github:

    https://github.com/mills32/Little-Ga...e-for-VGA-MCGA

    Última edición por mills332; 23/11/2018 a las 02:04

  16. Los siguientes 4 usuarios agradecen a mills332 este post:

    fbustamante (23/11/2018), josepzin (23/11/2018), platipus (23/11/2018), swapd0 (23/11/2018)

  17. #44

    Fecha de ingreso
    Nov 2005
    Ubicación
    Excartagenero
    Mensajes
    17,772
    Mencionado
    185 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    2,711
    Agradecer Thanks Received 
    2,292
    Thanked in
    Agradecido 1,543 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    1
    Tiene muy buena pinta!!!

    ¿A qué se debe el parpadeo de los sprites cuando están en la parte de arriba en el juego tipo Zelda?

  18. #45

    Fecha de ingreso
    Oct 2012
    Mensajes
    166
    Mencionado
    1 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    1
    Agradecer Thanks Received 
    62
    Thanked in
    Agradecido 24 veces en [ARG:2 UNDEFINED] posts
    Cita Iniciado por josepzin Ver mensaje
    Tiene muy buena pinta!!!

    ¿A qué se debe el parpadeo de los sprites cuando están en la parte de arriba en el juego tipo Zelda?
    Está dibujando directamente en la parte visible de la memoria, en cada frame regenera el cuadradito de fondo que ocupa el sprite y debe ser que no le da tiempo, a leer de la memoria o algo así. en un 386 que tengo no se distorsiona nada.

Página 3 de 4 PrimerPrimer 1234 ÚltimoÚltimo

Permisos de publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •