Iniciado por
rage
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, ®s, ®s);
//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);
}
(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 .
Marcadores