Various Changes
[tpg/acess2.git] / Kernel / drv / bochsvbe.c
index bbf0bbc..2014cb8 100644 (file)
@@ -30,34 +30,10 @@ typedef struct {
        Uint32  fbSize;\r
 } t_bga_mode;\r
 \r
-\r
-// === PROTOTYPES ===\r
-// Driver\r
- int   BGA_Install(char **Arguments);\r
-void   BGA_Uninstall();\r
-// Internal\r
-void   BGA_int_WriteRegister(Uint16 reg, Uint16 value);\r
-Uint16 BGA_int_ReadRegister(Uint16 reg);\r
-void   BGA_int_SetBank(Uint16 bank);\r
-void   BGA_int_SetMode(Uint16 width, Uint16 height, Uint16 bpp);\r
- int   BGA_int_UpdateMode(int id);\r
- int   BGA_int_FindMode(tVideo_IOCtl_Mode *info);\r
- int   BGA_int_ModeInfo(tVideo_IOCtl_Mode *info);\r
- int   BGA_int_MapFB(void *Dest);\r
-// Filesystem\r
-Uint64 BGA_Read(tVFS_Node *node, Uint64 off, Uint64 len, void *buffer);\r
-Uint64 BGA_Write(tVFS_Node *node, Uint64 off, Uint64 len, void *buffer);\r
- int   BGA_Ioctl(tVFS_Node *node, int id, void *data);\r
-\r
 // === CONSTANTS ===\r
-const t_bga_mode       BGA_MODES[] = {\r
-       {},\r
-       {640,480,8, 0, 640*480},\r
-       {640,480,32, 0, 640*480*4},\r
-       {800,600,8, 0, 800*600},\r
-       {800,600,32, 0, 800*600*4},\r
+enum eMode_Flags {\r
+       MODEFLAG_TEXT = 1\r
 };\r
-#define        BGA_MODE_COUNT  (sizeof(BGA_MODES)/sizeof(BGA_MODES[0]))\r
 #define        BGA_LFB_MAXSIZE (1024*768*4)\r
 #define        VBE_DISPI_BANK_ADDRESS  0xA0000\r
 #define VBE_DISPI_LFB_PHYSICAL_ADDRESS 0xE0000000\r
@@ -80,7 +56,26 @@ enum {
        VBE_DISPI_INDEX_Y_OFFSET\r
 };\r
 \r
-// GLOBALS\r
+\r
+// === PROTOTYPES ===\r
+// Driver\r
+ int   BGA_Install(char **Arguments);\r
+void   BGA_Uninstall();\r
+// Internal\r
+void   BGA_int_WriteRegister(Uint16 reg, Uint16 value);\r
+Uint16 BGA_int_ReadRegister(Uint16 reg);\r
+void   BGA_int_SetBank(Uint16 bank);\r
+void   BGA_int_SetMode(Uint16 width, Uint16 height);\r
+ int   BGA_int_UpdateMode(int id);\r
+ int   BGA_int_FindMode(tVideo_IOCtl_Mode *info);\r
+ int   BGA_int_ModeInfo(tVideo_IOCtl_Mode *info);\r
+ int   BGA_int_MapFB(void *Dest);\r
+// Filesystem\r
+Uint64 BGA_Read(tVFS_Node *node, Uint64 off, Uint64 len, void *buffer);\r
+Uint64 BGA_Write(tVFS_Node *node, Uint64 off, Uint64 len, void *buffer);\r
+ int   BGA_Ioctl(tVFS_Node *node, int id, void *data);\r
+\r
+// === GLOBALS ===\r
 MODULE_DEFINE(0, 0x0032, BochsVBE, BGA_Install, NULL, NULL);\r
 tDevFS_Driver  gBGA_DriverStruct = {\r
        NULL, "BochsGA",\r
@@ -93,6 +88,16 @@ tDevFS_Driver        gBGA_DriverStruct = {
  int   giBGA_CurrentMode = -1;\r
  int   giBGA_DriverId = -1;\r
 Uint   *gBGA_Framebuffer;\r
+t_bga_mode     gBGA_Modes[] = {\r
+       {},\r
+       { 80,25, 32, MODEFLAG_TEXT, 80*25*8},   // 640 x 480\r
+       {100,37, 32, MODEFLAG_TEXT, 100*37*8},  // 800 x 600\r
+       {640,480,8, 0, 640*480},\r
+       {640,480,32, 0, 640*480*4},\r
+       {800,600,8, 0, 800*600},\r
+       {800,600,32, 0, 800*600*4},\r
+};\r
+#define        BGA_MODE_COUNT  (sizeof(gBGA_Modes)/sizeof(gBGA_Modes[0]))\r
 \r
 // === CODE ===\r
 /**\r
@@ -142,7 +147,7 @@ Uint64 BGA_Read(tVFS_Node *node, Uint64 off, Uint64 len, void *buffer)
        if(giBGA_CurrentMode == -1)     return -1;\r
        \r
        // Check Offset and Length against Framebuffer Size\r
-       if(off+len > BGA_MODES[giBGA_CurrentMode].fbSize)\r
+       if(off+len > gBGA_Modes[giBGA_CurrentMode].fbSize)\r
                return -1;\r
        \r
        // Copy from Framebuffer\r
@@ -155,30 +160,58 @@ Uint64 BGA_Read(tVFS_Node *node, Uint64 off, Uint64 len, void *buffer)
  * \brief Write to the framebuffer\r
  */\r
 Uint64 BGA_Write(tVFS_Node *node, Uint64 off, Uint64 len, void *buffer)\r
-{\r
-       Uint8   *destBuf;\r
-       \r
-       DEBUGS("BGA_Write: (off=%i, len=0x%x)\n", off, len);\r
+{      \r
+       ENTER("xoff xlen", off, len);\r
        \r
        // Check Mode\r
-       if(giBGA_CurrentMode == -1)\r
+       if(giBGA_CurrentMode == -1) {\r
+               LEAVE('i', -1);\r
                return -1;\r
+       }\r
+       \r
        // Check Input against Frambuffer Size\r
-       if(off+len > BGA_MODES[giBGA_CurrentMode].fbSize)\r
+       if(off+len > gBGA_Modes[giBGA_CurrentMode].fbSize) {\r
+               LEAVE('i', -1);\r
                return -1;\r
+       }\r
        \r
-       destBuf = (Uint8*) ((Uint)gBGA_Framebuffer + (Uint)off);\r
-       \r
-       DEBUGS(" BGA_Write: *buffer = 0x%x\n", *(Uint*)buffer);\r
-       DEBUGS(" BGA_Write: Updating Framebuffer (0x%x - 0x%x bytes)\n", \r
-               destBuf, destBuf + (Uint)len);\r
-       \r
-       \r
-       // Copy to Frambuffer\r
-       memcpy(destBuf, buffer, len);\r
-       \r
-       DEBUGS("BGA_Write: BGA Framebuffer updated\n");\r
+       // Text Mode\r
+       if( gBGA_Modes[giBGA_CurrentMode].flags & MODEFLAG_TEXT )\r
+       {\r
+               tVT_Char        *chars = buffer;\r
+                int    pitch = gBGA_Modes[giBGA_CurrentMode].width * giVT_CharWidth;\r
+               Uint32  *dest;\r
+               dest = (void*)gBGA_Framebuffer;\r
+               dest += off * giVT_CharWidth;\r
+               len /= sizeof(tVT_Char);\r
+               while(len--)\r
+               {\r
+                       VT_Font_Render(\r
+                               chars->Ch,\r
+                               dest, pitch,\r
+                               VT_Colour12to24(chars->BGCol),\r
+                               VT_Colour12to24(chars->FGCol)\r
+                               );\r
+                       dest += giVT_CharWidth;\r
+                       chars++;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               Uint8   *destBuf = (Uint8*) ((Uint)gBGA_Framebuffer + (Uint)off);\r
+               \r
+               LOG("buffer = %p\n", buffer);\r
+               LOG("Updating Framebuffer (%p to %p)\n", \r
+                       destBuf, destBuf + (Uint)len);\r
+               \r
+               \r
+               // Copy to Frambuffer\r
+               memcpy(destBuf, buffer, len);\r
+               \r
+               LOG("BGA Framebuffer updated\n");\r
+       }\r
        \r
+       LEAVE('i', len);\r
        return len;\r
 }\r
 \r
@@ -265,13 +298,13 @@ INT void BGA_int_SetBank(Uint16 bank)
  * \fn void BGA_int_SetMode(Uint16 width, Uint16 height, Uint16 bpp)\r
  * \brief Sets the video mode from the dimensions and bpp given\r
  */\r
-void BGA_int_SetMode(Uint16 width, Uint16 height, Uint16 bpp)\r
+void BGA_int_SetMode(Uint16 width, Uint16 height)\r
 {\r
        DEBUGS("BGA_int_SetMode: (width=%i, height=%i, bpp=%i)\n", width, height, bpp);\r
        BGA_int_WriteRegister(VBE_DISPI_INDEX_ENABLE, VBE_DISPI_DISABLED);\r
     BGA_int_WriteRegister(VBE_DISPI_INDEX_XRES,        width);\r
     BGA_int_WriteRegister(VBE_DISPI_INDEX_YRES,        height);\r
-    BGA_int_WriteRegister(VBE_DISPI_INDEX_BPP, bpp);\r
+    BGA_int_WriteRegister(VBE_DISPI_INDEX_BPP, 32);\r
     BGA_int_WriteRegister(VBE_DISPI_INDEX_ENABLE, VBE_DISPI_ENABLED | VBE_DISPI_NOCLEARMEM | VBE_DISPI_LFB_ENABLED);\r
     //BGA_int_WriteRegister(VBE_DISPI_INDEX_ENABLE, VBE_DISPI_ENABLED | VBE_DISPI_NOCLEARMEM);\r
 }\r
@@ -282,8 +315,19 @@ void BGA_int_SetMode(Uint16 width, Uint16 height, Uint16 bpp)
  */\r
 int BGA_int_UpdateMode(int id)\r
 {\r
+       // Sanity Check\r
        if(id < 0 || id >= BGA_MODE_COUNT)      return -1;\r
-       BGA_int_SetMode(BGA_MODES[id].width, BGA_MODES[id].height, BGA_MODES[id].bpp);\r
+       \r
+       // Check if it is a text mode\r
+       if( gBGA_Modes[id].flags & MODEFLAG_TEXT )\r
+               BGA_int_SetMode(\r
+                       gBGA_Modes[id].width*giVT_CharWidth,\r
+                       gBGA_Modes[id].height*giVT_CharHeight);\r
+       else    // Graphics?\r
+               BGA_int_SetMode(\r
+                       gBGA_Modes[id].width,\r
+                       gBGA_Modes[id].height);\r
+       \r
        giBGA_CurrentMode = id;\r
        return id;\r
 }\r
@@ -304,12 +348,12 @@ int BGA_int_FindMode(tVideo_IOCtl_Mode *info)
        for(i = 0; i < BGA_MODE_COUNT; i++)\r
        {\r
                #if DEBUG >= 2\r
-               LogF("Mode %i (%ix%ix%i), ", i, BGA_MODES[i].width, BGA_MODES[i].height, BGA_MODES[i].bpp);\r
+               LogF("Mode %i (%ix%ix%i), ", i, gBGA_Modes[i].width, gBGA_Modes[i].height, gBGA_Modes[i].bpp);\r
                #endif\r
        \r
-               if(BGA_MODES[i].width == info->width\r
-               && BGA_MODES[i].height == info->height\r
-               && BGA_MODES[i].bpp == info->bpp)\r
+               if(gBGA_Modes[i].width == info->width\r
+               && gBGA_Modes[i].height == info->height\r
+               && gBGA_Modes[i].bpp == info->bpp)\r
                {\r
                        #if DEBUG >= 2\r
                        LogF("Perfect!\n");\r
@@ -318,7 +362,7 @@ int BGA_int_FindMode(tVideo_IOCtl_Mode *info)
                        break;\r
                }\r
                \r
-               tmp = BGA_MODES[i].width * BGA_MODES[i].height * BGA_MODES[i].bpp;\r
+               tmp = gBGA_Modes[i].width * gBGA_Modes[i].height * gBGA_Modes[i].bpp;\r
                tmp -= rqdProduct;\r
                tmp = tmp < 0 ? -tmp : tmp;\r
                factor = tmp * 100 / rqdProduct;\r
@@ -334,9 +378,9 @@ int BGA_int_FindMode(tVideo_IOCtl_Mode *info)
                }\r
        }\r
        info->id = best;\r
-       info->width = BGA_MODES[best].width;\r
-       info->height = BGA_MODES[best].height;\r
-       info->bpp = BGA_MODES[best].bpp;\r
+       info->width = gBGA_Modes[best].width;\r
+       info->height = gBGA_Modes[best].height;\r
+       info->bpp = gBGA_Modes[best].bpp;\r
        return best;\r
 }\r
 \r
@@ -352,9 +396,9 @@ int BGA_int_ModeInfo(tVideo_IOCtl_Mode *info)
        \r
        if(info->id < 0 || info->id >= BGA_MODE_COUNT)  return -1;\r
        \r
-       info->width = BGA_MODES[info->id].width;\r
-       info->height = BGA_MODES[info->id].height;\r
-       info->bpp = BGA_MODES[info->id].bpp;\r
+       info->width = gBGA_Modes[info->id].width;\r
+       info->height = gBGA_Modes[info->id].height;\r
+       info->bpp = gBGA_Modes[info->id].bpp;\r
        \r
        return 1;\r
 }\r
@@ -371,10 +415,10 @@ int BGA_int_MapFB(void *Dest)
        \r
        // Sanity Check\r
        if((Uint)Dest > 0xC0000000)     return 0;\r
-       if(BGA_MODES[giBGA_CurrentMode].bpp < 15)       return 0;       // Only non-pallete modes are supported\r
+       if(gBGA_Modes[giBGA_CurrentMode].bpp < 15)      return 0;       // Only non-pallete modes are supported\r
        \r
        // Count required pages\r
-       pages = (BGA_MODES[giBGA_CurrentMode].fbSize + 0xFFF) >> 12;\r
+       pages = (gBGA_Modes[giBGA_CurrentMode].fbSize + 0xFFF) >> 12;\r
        \r
        // Check if there is space\r
        for( i = 0; i < pages; i++ )\r

UCC git Repository :: git.ucc.asn.au