* AcessOS 1\r
* Video BIOS Extensions (Vesa) Driver\r
*/\r
-#define DEBUG 0\r
+#define DEBUG 1\r
#define VERSION 0x100\r
\r
#include <acess.h>\r
// === GLOBALS ===\r
MODULE_DEFINE(0, VERSION, Vesa, Vesa_Install, NULL, "PCI", "VM8086", NULL);\r
tDevFS_Driver gVesa_DriverStruct = {\r
- NULL, "VESA",\r
+ NULL, "Vesa",\r
{\r
.Read = Vesa_Read,\r
.Write = Vesa_Write,\r
// Insert Text Mode\r
gVesa_Modes[0].width = 80;\r
gVesa_Modes[0].height = 25;\r
- gVesa_Modes[0].bpp = 4;\r
+ gVesa_Modes[0].bpp = 12;\r
gVesa_Modes[0].code = 0x3;\r
+ gVesa_Modes[0].flags = VIDEO_FLAG_TEXT;\r
+ gVesa_Modes[0].fbSize = 80*25*2;\r
+ gVesa_Modes[0].framebuffer = 0xB8000;\r
\r
for( i = 1; i < giVesaModeCount; i++ )\r
{\r
gpVesa_BiosState->DI = modeinfoPtr.ofs;\r
VM8086_Int(gpVesa_BiosState, 0x10);\r
\r
+ Log_Debug("Vesa", "gpVesa_BiosState->AX = 0x%04x", gpVesa_BiosState->AX);\r
+ \r
// Parse Info\r
gVesa_Modes[i].flags = 0;\r
if ( (modeinfo->attributes & 0x90) == 0x90 )\r
gVesa_Modes[i].bpp = modeinfo->bpp;\r
\r
#if DEBUG\r
- LogF(" Vesa_Install: 0x%x - %ix%ix%i\n",\r
+ Log_Log("Vesa", "0x%x - %ix%ix%i",\r
gVesa_Modes[i].code, gVesa_Modes[i].width, gVesa_Modes[i].height, gVesa_Modes[i].bpp);\r
#endif\r
}\r
*/\r
Uint64 Vesa_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)\r
{\r
- ENTER("pNode XOffset XLength pBuffer", Node, Offset, Length, Bufffer);\r
+ ENTER("pNode XOffset XLength pBuffer", Node, Offset, Length, Buffer);\r
\r
if(Buffer == NULL) {\r
LEAVE('i', 0);\r
return 0;\r
}\r
\r
+ // Default Text mode\r
+ if( giVesaCurrentMode == 0 )\r
+ {\r
+ Uint8 *fb = (Uint8 *)(KERNEL_BASE|0xB8000);\r
+ Uint32 *buf = Buffer;\r
+ if( Offset + Length > 25*80*8 ) {\r
+ Log_Warning("VESA", "Vesa_Write - Framebuffer Overflow");\r
+ LEAVE('i', 0);\r
+ return 0;\r
+ }\r
+ \r
+ fb += 2*Offset;\r
+ for(; Length > 0; Length -= 8, fb += 2)\r
+ {\r
+ if( *buf < 0x80 )\r
+ *fb = *buf & 0x7F;\r
+ else\r
+ *fb = 0x00;\r
+ buf ++;\r
+ \r
+ fb[1] = 0;\r
+ fb[1] |= (*buf & 0x888) == 0x888 ? 0x8 : 0;\r
+ fb[1] |= (*buf & 0x700) > 0x300 ? 0x4 : 0;\r
+ fb[1] |= (*buf & 0x070) > 0x030 ? 0x2 : 0;\r
+ fb[1] |= (*buf & 0x007) > 0x003 ? 0x1 : 0;\r
+ fb[1] |= (*buf & 0x888000) == 0x888000 ? 0x80 : 0;\r
+ fb[1] |= (*buf & 0x700000) > 0x300000 ? 0x40 : 0;\r
+ fb[1] |= (*buf & 0x070000) > 0x030000 ? 0x20 : 0;\r
+ fb[1] |= (*buf & 0x007000) > 0x003000 ? 0x10 : 0;\r
+ buf ++;\r
+ }\r
+ }\r
+\r
if( gVesa_Modes[giVesaCurrentMode].framebuffer == 0 ) {\r
Log_Warning("VESA", "Vesa_Write - Non-LFB Modes not yet supported.");\r
LEAVE('i', 0);\r
gpVesa_BiosState->AX = 0x4F02;\r
gpVesa_BiosState->BX = gVesa_Modes[mode].code;\r
if(gVesa_Modes[mode].flags & FLAG_LFB) {\r
- LogF(" Vesa_Int_SetMode: Using LFB\n");\r
+ Log_Log("VESA", "Using LFB");\r
gpVesa_BiosState->BX |= 0x4000; // Bit 14 - Use LFB\r
}\r
\r
giVesaPageCount = (gVesa_Modes[mode].fbSize + 0xFFF) >> 12;\r
gVesaFramebuffer = (void*)MM_MapHWPages(gVesa_Modes[mode].framebuffer, giVesaPageCount);\r
\r
- LogF(" Vesa_Int_SetMode: Fb (Phys) = 0x%x\n", gVesa_Modes[mode].framebuffer);\r
- LogF(" Vesa_Int_SetMode: Fb (Virt) = 0x%x\n", gVesaFramebuffer);\r
+ LogF("Vesa", "Framebuffer (Phys) = 0x%x", gVesa_Modes[mode].framebuffer);\r
+ LogF("Vesa", "Framebuffer (Virt) = 0x%x", gVesaFramebuffer);\r
\r
// Record Mode Set\r
giVesaCurrentMode = mode;\r
int i;\r
int best = -1, bestFactor = 1000;\r
int factor, tmp;\r
- #if DEBUG\r
- LogF("Vesa_Int_FindMode: (data={width:%i,height:%i,bpp:%i})\n", data->width, data->height, data->bpp);\r
- #endif\r
+ \r
+ ENTER("idata->width idata->height idata->bpp", data->width, data->height, data->bpp);\r
+ \r
+ if(data->flags & VIDEO_FLAG_TEXT) {\r
+ LEAVE('i', 0);\r
+ return 0;\r
+ }\r
+ \r
for(i=0;i<giVesaModeCount;i++)\r
{\r
- #if DEBUG >= 2\r
- LogF("Mode %i (%ix%ix%i), ", i, gVesa_Modes[i].width, gVesa_Modes[i].height, gVesa_Modes[i].bpp);\r
- #endif\r
+ LOG("Mode %i (%ix%ix%i)", i, gVesa_Modes[i].width, gVesa_Modes[i].height, gVesa_Modes[i].bpp);\r
\r
if(gVesa_Modes[i].width == data->width\r
&& gVesa_Modes[i].height == data->height\r
&& gVesa_Modes[i].bpp == data->bpp)\r
{\r
- #if DEBUG >= 2\r
- LogF("Perfect!\n");\r
- #endif\r
+ LOG("Perfect!");\r
best = i;\r
break;\r
}\r
tmp = tmp < 0 ? -tmp : tmp;\r
factor = tmp * 100 / (data->width * data->height * data->bpp);\r
\r
- #if DEBUG >= 2\r
- LogF("factor = %i\n", factor);\r
- #endif\r
+ LOG("factor = %i", factor);\r
\r
if(factor < bestFactor)\r
{\r
data->width = gVesa_Modes[best].width;\r
data->height = gVesa_Modes[best].height;\r
data->bpp = gVesa_Modes[best].bpp;\r
+ LEAVE('i', best);\r
return best;\r
}\r
\r