summaryrefslogtreecommitdiff
path: root/src/drivers/video/vga.c
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2017-06-15 07:06:13 +0200
committerAndreas Baumann <mail@andreasbaumann.cc>2017-06-15 07:06:13 +0200
commitedad38a5a2dca96f5bea513d11eccf1134046d47 (patch)
tree654f0d62874c77804ab310cc9ba0082a9c053de4 /src/drivers/video/vga.c
parent397b8b28d59483388f37dcd1771bde8f867a10cd (diff)
downloadabaos-edad38a5a2dca96f5bea513d11eccf1134046d47.tar.gz
abaos-edad38a5a2dca96f5bea513d11eccf1134046d47.tar.bz2
made framebuffer segment a member of vga_mode_t, computing it once
when vga_set_mode is called (because it will not change after every pixel)
Diffstat (limited to 'src/drivers/video/vga.c')
-rw-r--r--src/drivers/video/vga.c65
1 files changed, 32 insertions, 33 deletions
diff --git a/src/drivers/video/vga.c b/src/drivers/video/vga.c
index 75a47f4..e3427b4 100644
--- a/src/drivers/video/vga.c
+++ b/src/drivers/video/vga.c
@@ -131,7 +131,8 @@ static vga_mode_t modes[] = {
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
0x41, 0x00, 0x0F, 0x00, 0x00
- }
+ },
+ NULL
}
};
@@ -161,34 +162,6 @@ static int get_matching_mode_idx( const vga_mode_t mode )
return -1;
}
-bool vga_set_mode( vga_t *vga, const vga_mode_t mode )
-{
- // do not allow unknown timings!
- if( !vga_supports_mode( mode ) ) {
- return false;
- }
-
- vga_mode_t matching_mode = modes[get_matching_mode_idx( mode )];
-
- write_registers( vga, matching_mode.regs );
-
- vga->mode = mode;
-
- return true;
-}
-
-
-vga_color_t vga_make_RGB( int R, int G, int B )
-{
- vga_color_t c;
-
- c.R = R;
- c.G = G;
- c.B = B;
-
- return c;
-}
-
static uint8_t *get_frame_buffer_segment( vga_t *vga )
{
port8_write( &vga->graphics_controller_index_port, 0x06 );
@@ -220,6 +193,35 @@ static uint8_t *get_frame_buffer_segment( vga_t *vga )
return segment;
}
+bool vga_set_mode( vga_t *vga, const vga_mode_t mode )
+{
+ // do not allow unknown timings!
+ if( !vga_supports_mode( mode ) ) {
+ return false;
+ }
+
+ vga_mode_t matching_mode = modes[get_matching_mode_idx( mode )];
+
+ write_registers( vga, matching_mode.regs );
+
+ vga->mode = mode;
+ vga->mode.segment = get_frame_buffer_segment( vga );
+
+ return true;
+}
+
+
+vga_color_t vga_make_RGB( int R, int G, int B )
+{
+ vga_color_t c;
+
+ c.R = R;
+ c.G = G;
+ c.B = B;
+
+ return c;
+}
+
static uint8_t get_color_index( const vga_color_t c )
{
// TODO: for now white and black, standard VGA palette entries?
@@ -248,11 +250,8 @@ void vga_set_pixel( vga_t *vga, const int x, const int y, const vga_color_t colo
uint8_t color_idx = get_color_index( color );
- uint8_t *segment = get_frame_buffer_segment( vga );
-
- uint8_t *addr = segment + vga->mode.x * y + x;
+ uint8_t *addr = vga->mode.segment + vga->mode.x * y + x;
-// printf( "%d %d 0x%X, 0x%X 0x%X\n", x, y, segment, addr, color_idx );
*addr = color_idx;
}