// vesafb.c // Author: Josh Holtrop // Date: 03/19/05 // Modified: 03/19/05 #include "display/display.h" #include "display/vesafb.h" #include "lang/lang.h" #include "hos_defines.h" // BIOS_CHAR_MAP u16_t *vmem16 = (u16_t *) VESAFB_VID_ADDR; u32_t *vmem32 = (u32_t *) VESAFB_VID_ADDR; int vesafb_bpp; int vesafb_multiplier; int vesafb_width; // pixels int vesafb_height; int vesafb_xres; // characters int vesafb_yres; int vesafb_cursor; // -1 to hide, 0+ for cursor position int vesafb_init(int width, int height, int bpp) { switch(vesafb_bpp = bpp) { case 15: case 16: vesafb_multiplier = 2; break; case 24: vesafb_multiplier = 3; break; case 32: vesafb_multiplier = 4; break; } vesafb_width = width; vesafb_height = height; vesafb_xres = (width >> 3) & 0xFFF8; // columns divisible by 8 vesafb_yres = height >> 3; return vesafb_cursor = 0; } void vesafb_clear() { memset(vmem32, 0, vesafb_width * vesafb_height * vesafb_multiplier); vesafb_update_cursor(0); } void vesafb_update_cursor(int position) { vesafb_draw_cursor(vesafb_cursor, 0); vesafb_draw_cursor(vesafb_cursor = position, 1); } void vesafb_draw_cursor(int position, int onoff) { int x = (position % vesafb_xres) << 3; int y = ( (position / vesafb_xres) << 3 ) + 7; int i; for (i = 0; i < 7; i++) vesafb_pset(x + i, y, onoff); } void vesafb_pset(int x, int y, int onoff) { switch (vesafb_bpp) { case 15: case 16: *(vmem16 + vesafb_width*y + x) = (onoff ? 0xFFFF : 0); break; case 24: *((u32_t *)(((u32_t)vmem32) + 3*vesafb_width*y + 3*x)) = (onoff ? 0x00FFFFFF : 0); break; case 32: *(vmem32 + vesafb_width*y + x) = (onoff ? 0x00FFFFFF : 0); break; } } int vesafb_getWidth() { return vesafb_xres; } int vesafb_getHeight() { return vesafb_yres; } void vesafb_draw_char(int position, u16_t chr) { int x = (position % vesafb_xres) << 3; int y = (position / vesafb_xres) << 3; int xi, yi; u8_t *charMap = (u8_t *) ( BIOS_CHAR_MAP + ((chr & 0xFF) << 3) ); for (yi = 0; yi < 7; yi++) { for (xi = 0; xi < 7; xi++) vesafb_pset(x + xi, y + yi, (*charMap & (0x80 >> xi))); charMap++; } } int vesafb_draw(u16_t *buffer, int buff_len, int cursor_position) { int i; for (i = 0; i < buff_len; i++) vesafb_draw_char(i, *buffer++); vesafb_update_cursor(cursor_position); return 0; }