Jump to content
  • Advertisement
Sign in to follow this  
  • entries
    51
  • comments
    129
  • views
    82783

VBE fun

Sign in to follow this  
Muhammad Haggag

563 views

I was too tired tonight to work on anything serious (e.g. message passing), so I decided to spend some time on VBE (VGA Bios Extensions). I had already downloaded, built and installed VBE GRUB to the disk image, so all that's left was to write the actual graphics code.

VBE exposes 3 functional interfaces, one through BIOS calls (via INT 10), and 2 protected mode interfaces (VBE 2 and 3 interfaces). Unfortunately, the protected mode interfaces are:
1. Lame (e.g. no return values or status codes from VBE calls)
2. Not well-supported on graphics cards
3. Not supported by bochs

So, to properly write a VBE driver one would need to:
1. Keep switching from protected-mode to real-mode and back.
or
2. Run a v8086 task to handle all this.

#1 is obviously not a real option. #2 is possible, except that doing v8086 support isn't really a priority right now. So I just settled down on accepting whatever mode we're booted into, using the information provided by the boot-loader.

The most important info passed by the boot-loader is the linear frame buffer pointer (essentially a pointer to memory-mapped display video memory) and mode information; width, height and bpp among others. With this, I set to create a simple graphics library for bidirectional text rendering (remember: Arabic support is a top priority). And of course, I started with English, since it's much easier.

For now, we're using very basic bitmap fonts. The glyphs are stored statically in the source, until we get the file system and floppy disk drivers complete and stable enough (Don't blame me! I'm not the one working on these). This amounts to the following uber-ugliness:
	uint8 en_glyphs[127 - 32][8][10] =
{
// 32 - ' '
{
".........",
".........",
".........",
".........",
".........",
".........",
".........",
".........",
},

[snip]

// 48 - '0'
{
".........",
"...###...",
"..#...#..",
".#.....#.",
".#.....#.",
".#.....#.",
"..#...#..",
"...###...",
},
// 49 - '1'
{
".........",
"...##....",
"..#.#....",
"....#....",
"....#....",
"....#....",
"....#....",
"....#....",
},
// 50 - '2'
{
".........",
"..####...",
".#....#..",
"......#..",
".....#...",
"...#.....",
"..#......",
"..#####..",
},
// 51 - '3'
{
".........",
"..###....",
".#...#...",
"......#..",
"....##...",
"......#..",
".#...#...",
"..###....",
},
// 52 - '4'
{
".........",
"....#....",
"...##....",
"..#.#....",
".#..#....",
".######..",
"....#....",
"....#....",
},
// 53 - '5'
{
".........",
"..######.",
"..#......",
"..#####..",
".......#.",
".......#.",
".#....#..",
"..####...",
},
// 54 - '6'
{
".........",
"...####..",
"..#......",
"..#......",
"..#.###..",
"..##...#.",
"..#....#.",
"...####..",
},
// 55 - '7'
{
".........",
".#######.",
"......#..",
".....#...",
"....#....",
"...#.....",
"..#......",
".#.......",
},
// 56 - '8'
{
".........",
"..#####..",
".#.....#.",
".#.....#.",
"..#####..",
".#.....#.",
".#.....#.",
"..#####..",
},
// 57 - '9'
{
".........",
".........",
".........",
".........",
".........",
".........",
".........",
".........",
},

[snip]

// 65 - 'A'
{
".........",
"...##....",
"..#..#...",
"..#..#...",
".#....#..",
".######..",
"#......#.",
"#......#.",
},
// 66 - 'B'
{
".........",
".#####...",
".#....#..",
".#....#..",
".#####...",
".#....#..",
".#....#..",
".#####...",
},
// 67 - 'C'
{
".........",
".######..",
"#......#.",
"#........",
"#........",
"#........",
"#......#.",
".######..",
},
// 68 - 'D'
{
".........",
"###......",
"#..##....",
"#....#...",
"#.....#..",
"#....#...",
"#..##....",
"###......",
},
// 69 - 'E'
{
".........",
"########.",
"#........",
"#........",
"########.",
"#........",
"#........",
"########.",
},
// 70 - 'F'
{
".........",
"########.",
"#........",
"#........",
"########.",
"#........",
"#........",
"#........",
},

[snip]

// 90 - 'Z'
{
".........",
".#######.",
"......#..",
".....#...",
"....#....",
"...#.....",
"..#......",
".#######.",
},

[snip]

// 126 - '~'
{
".........",
".........",
".........",
".........",
".........",
".........",
".........",
".........",
},
};




The 'templates' are auto-generated; the comment with the ASCII code and display symbol, and the dot matrix. The generator is a small C++ program. I then fill the parts to be displayed with any non-dot non-zero symbol. As you can see, it's not complete yet - I've just worked on it until I was bored out of my skull, and then ran a simple test:



So yeah, it works, although the font looks so freaking ugly. Ideally, FreeType should be used for the fonts, but that's a bit too much into the future.
Sign in to follow this  


0 Comments


Recommended Comments

There are no comments to display.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!