Thread View: rec.games.programmer
2 messages
2 total messages
Started by Scott Mayo
Wed, 08 Apr 1992 18:16
Help, VGA weirdness
Author: Scott Mayo
Date: Wed, 08 Apr 1992 18:16
Date: Wed, 08 Apr 1992 18:16
83 lines
4180 bytes
4180 bytes
I am trying to make my VGA display emulate an EGA, so an application I am writing will look more or less identical on both. It should be easy. It isn't. For the most part, writing to the registers on an EGA and VGA causes identical behaviour - they were designed that way. But when it comes to setting colors, they differ, and it is causing me to tear out my hair. If you understand VGA register programming, please help! Here is the problem. An EGA gives you 64 possible colors, 16 at a time. As it turns out, that's all I need. I am trying to make the VGA give me those same 64 colors; I still need just 16 at a time (though the VGA could give me more than that.) I don't want to use the BIOS to set this up; it does it right, but it is so slow I can't use it (there are a few places where I want to twiddle the colors, as a group, several times a second. The BIOS can't keep up.) The first problem, figuring out which 18 bit values to load to the DAC to get each of the 64 colors on the EGA, is solved. I think. The current problem is that some of the colors get set properly, and the rest don't. And I don't know why. It doesn't seem to be a timing problem - I've tried large donothing loops between each port write to be sure. Here is what I try: I wait for vert. retrace, and then outbyte(0x03c8, 0); /* select index 0 (color 0) for writing */ outbyte(0x03c9, red_for_color_0); outbyte(0x03c9, green_for_color_0); outbyte(0x03c9, blue_for_color_0); outbyte(0x03c9, red_for_color_1); outbyte(0x03c9, green_for_color_1); outbyte(0x03c9, blue_for_color_1); ...up to color 15. The documentation I have swears that each group of 3 writes will cause port 0x03c8 to increment to the next color, and it seems to work. But a number of colors come out completely wrong. It isn't just a case of not quite getting the RGB values right, either: I set color 13 to black (Red=0 green=0 blue=0) and when I draw color 13 it comes out light purple. The first few colors I set seem to be fine, though. I can apparently set colors 0-5, and 7. I can't set 6 (it stays an ugly brown), or 8 and higher (various ugly colors stay set). I am doing this during vertical retrace. My first thought was that I had a strangely cooked VGA card, but I tried it on another card and monitor, and saw the same behaviour. It also doesn't seem to be my software: it is too stupid and simple to be failing in such an interesting way. I've also tried just loop until vert. retrace...; outbyte(0x03c8, 6); /* set color 6 */ outbyte(0x03c9, 0); /* .. to black: no red, no green, no blue */ outbyte(0x03c9, 0); outbyte(0x03c9, 0); and color 6 still stays brown. It's like it is glued down. Setting colors 5 and 7 works just fine. Does anyone know of VGA problems in this area, certain maunfacturers or makes that might have this problem? (I don't want to mention my manufacturer's name until I'm sure I haven't made some stupid mistake.) Is there some weird mode I'm in that could cause this? I am using BIOS to set mode 0x10, then doing subsequent work with register writes and direct memory writes. I'm using write mode 2 (graphics) if that matters. It all works perfectly on the EGA. The BIOS has already set the controller mode (port 0x03c0 index 0x10) to 1, and port 0x03c0 index 0x14 to 0, so the problem doesn't seem to be the 4 bit magic substutition that goes on by default. Although, as a side note, I did try setting 0x03c0,0x10 to 0, to defeat the override of palatte select bits 4 & 5, and the screen went blank and stayed that way. That's a separate problem, though. I think. I'm not using those bits anyway, and they should be filled in with 0's from 0x03c0,0x14. I will mail the C code to anyone who wants to look at it and laugh. Help! -- These are only my opinions. You should hear my convictions. smayo@wang.com
Re: Help, VGA weirdness
Author: Aaron Auseth
Date: Wed, 08 Apr 1992 23:59
Date: Wed, 08 Apr 1992 23:59
93 lines
4806 bytes
4806 bytes
In article <bmeire.beu@wang.com> smayo@wang.com (Scott Mayo) writes: >I am trying to make my VGA display emulate an EGA, so an application I am >writing will look more or less identical on both. It should be easy. It isn't. > >For the most part, writing to the registers on an EGA and VGA >causes identical behaviour - they were designed that way. But when >it comes to setting colors, they differ, and it is causing me >to tear out my hair. If you understand VGA register programming, please >help! > >Here is the problem. An EGA gives you 64 possible colors, 16 at a time. >As it turns out, that's all I need. I am trying to make the VGA give >me those same 64 colors; I still need just 16 at a time (though the >VGA could give me more than that.) I don't want to use the BIOS to set this >up; it does it right, but it is so slow I can't use it (there are a few >places where I want to twiddle the colors, as a group, several times a >second. The BIOS can't keep up.) > >The first problem, figuring out which 18 bit values to load to the DAC to >get each of the 64 colors on the EGA, is solved. I think. > >The current problem is that some of the colors get set properly, and the >rest don't. And I don't know why. It doesn't seem to be a timing problem - >I've tried large donothing loops between each port write to be sure. > >Here is what I try: I wait for vert. retrace, and then >outbyte(0x03c8, 0); /* select index 0 (color 0) for writing */ > >outbyte(0x03c9, red_for_color_0); >outbyte(0x03c9, green_for_color_0); >outbyte(0x03c9, blue_for_color_0); > >outbyte(0x03c9, red_for_color_1); >outbyte(0x03c9, green_for_color_1); >outbyte(0x03c9, blue_for_color_1); >...up to color 15. > >The documentation I have swears that each group of 3 writes will cause >port 0x03c8 to increment to the next color, and it seems to work. But >a number of colors come out completely wrong. It isn't just a case of >not quite getting the RGB values right, either: I set color 13 to >black (Red=0 green=0 blue=0) and when I draw color 13 it comes out >light purple. The first few colors I set seem to be fine, though. >I can apparently set colors 0-5, and 7. I can't set 6 (it stays an >ugly brown), or 8 and higher (various ugly colors stay set). > >I am doing this during vertical retrace. > >My first thought was that I had a strangely cooked VGA card, but I tried >it on another card and monitor, and saw the same behaviour. It also doesn't >seem to be my software: it is too stupid and simple to be failing in such an >interesting way. I've also tried just > >loop until vert. retrace...; >outbyte(0x03c8, 6); /* set color 6 */ >outbyte(0x03c9, 0); /* .. to black: no red, no green, no blue */ >outbyte(0x03c9, 0); >outbyte(0x03c9, 0); > >and color 6 still stays brown. It's like it is glued down. Setting colors >5 and 7 works just fine. > >Does anyone know of VGA problems in this area, certain maunfacturers >or makes that might have this problem? (I don't want to mention my >manufacturer's name until I'm sure I haven't made some stupid mistake.) >Is there some weird mode I'm in that could cause this? I am using BIOS to >set mode 0x10, then doing subsequent work with register >writes and direct memory writes. I'm using write mode 2 (graphics) if >that matters. It all works perfectly on the EGA. > >The BIOS has already set the controller mode (port 0x03c0 index 0x10) to >1, and port 0x03c0 index 0x14 to 0, so the problem doesn't seem to be >the 4 bit magic substutition that goes on by default. Although, as a >side note, I did try setting 0x03c0,0x10 to 0, to defeat the override >of palatte select bits 4 & 5, and the screen went blank and stayed that >way. That's a separate problem, though. I think. I'm not using those >bits anyway, and they should be filled in with 0's from 0x03c0,0x14. > >I will mail the C code to anyone who wants to look at it and laugh. > >Help! >-- >These are only my opinions. You should hear my convictions. >smayo@wang.com I'm not a VGA/EGA expert, but when I used Turbo C and made assembly calls to set colors in VGA mode, I noticed that the first 16 colors in the 256 color pallet were NOT successive. You might try changing where in the 64 color pallet of the EGA you change the color? You might need to reset the pointers that point to the 16 out of the 64 colors? Hope this helps Aaron Auseth
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads