Fixed compile errors, added Semaphore code
[tpg/acess2.git] / Modules / Display / VESA / main.c
index e30d640..479be30 100644 (file)
@@ -2,7 +2,7 @@
  * 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
 // === CONSTANTS ===\r
 #define        FLAG_LFB        0x1\r
 #define VESA_DEFAULT_FRAMEBUFFER       (KERNEL_BASE|0xA0000)\r
-#define VESA_CURSOR_PERIOD     1000\r
+#define BLINKING_CURSOR        1\r
+#if BLINKING_CURSOR\r
+# define VESA_CURSOR_PERIOD    1000\r
+#endif\r
 \r
 // === PROTOTYPES ===\r
  int   Vesa_Install(char **Arguments);\r
@@ -41,7 +44,7 @@ tDevFS_Driver gVesa_DriverStruct = {
        .IOCtl = Vesa_Ioctl\r
        }\r
 };\r
-tSpinlock      glVesa_Lock;\r
+tMutex glVesa_Lock;\r
 tVM8086        *gpVesa_BiosState;\r
  int   giVesaDriverId = -1;\r
 // --- Video Modes ---\r
@@ -90,13 +93,15 @@ int Vesa_Install(char **Arguments)
                return MODULE_ERR_NOTNEEDED;\r
        }\r
        \r
-       Log_Debug("VESA", "info->VideoModes = %04x:%04x", info->VideoModes.seg, info->VideoModes.ofs);\r
+       //Log_Debug("VESA", "info->VideoModes = %04x:%04x", info->VideoModes.seg, info->VideoModes.ofs);\r
        modes = (Uint16 *) VM8086_GetPointer(gpVesa_BiosState, info->VideoModes.seg, info->VideoModes.ofs);\r
        \r
        // Read Modes\r
        for( giVesaModeCount = 0; modes[giVesaModeCount] != 0xFFFF; giVesaModeCount++ );\r
        gVesa_Modes = (tVesa_Mode *)malloc( giVesaModeCount * sizeof(tVesa_Mode) );\r
        \r
+       Log_Debug("VESA", "%i Modes", giVesaModeCount);\r
+       \r
        // Insert Text Mode\r
        gVesa_Modes[0].width = 80;\r
        gVesa_Modes[0].height = 25;\r
@@ -250,12 +255,17 @@ Uint64 Vesa_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
                        );\r
                \r
                // Sanity Check\r
+               if( Offset > (Uint64)(heightInChars*widthInChars) ) {\r
+                       LEAVE('i', 0);\r
+                       return 0;\r
+               }\r
                if(y >= heightInChars) {\r
                        LEAVE('i', 0);\r
                        return 0;\r
                }\r
                \r
-               if( Offset + Length > heightInChars*widthInChars ) {\r
+               \r
+               if( (int)Offset + (int)Length > heightInChars*widthInChars ) {\r
                        Log_Debug("VESA", "%i + %i > %i*%i (%i)",\r
                                (int)Offset, (int)Length, heightInChars, widthInChars, heightInChars*widthInChars);\r
                        Length = heightInChars*widthInChars - Offset;\r
@@ -267,7 +277,7 @@ Uint64 Vesa_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
                \r
                LOG("dest = %p", dest);\r
                \r
-               for( i = 0; i < Length; i++ )\r
+               for( i = 0; i < (int)Length; i++ )\r
                {\r
                        VT_Font_Render(\r
                                chars->Ch,\r
@@ -358,6 +368,10 @@ int Vesa_Ioctl(tVFS_Node *Node, int ID, void *Data)
                return ret;\r
        \r
        case VIDEO_IOCTL_SETCURSOR:     // Set cursor position\r
+               #if !BLINKING_CURSOR\r
+               if(giVesaCursorX > 0)\r
+                       Vesa_FlipCursor(Node);\r
+               #endif\r
                giVesaCursorX = ((tVideo_IOCtl_Pos*)Data)->x;\r
                giVesaCursorY = ((tVideo_IOCtl_Pos*)Data)->y;\r
                //Log_Debug("VESA", "Cursor position (%i,%i)", giVesaCursorX, giVesaCursorY);\r
@@ -366,17 +380,23 @@ int Vesa_Ioctl(tVFS_Node *Node, int ID, void *Data)
                ||      giVesaCursorX >= gpVesaCurMode->width/giVT_CharWidth\r
                ||      giVesaCursorY >= gpVesaCurMode->height/giVT_CharHeight)\r
                {\r
+                       #if BLINKING_CURSOR\r
                        if(giVesaCursorTimer != -1) {\r
                                Time_RemoveTimer(giVesaCursorTimer);\r
                                giVesaCursorTimer = -1;\r
                        }\r
+                       #endif\r
                        giVesaCursorX = -1;\r
                        giVesaCursorY = -1;\r
                }\r
                else {\r
+                       #if BLINKING_CURSOR\r
                //      Log_Debug("VESA", "Updating timer %i?", giVesaCursorTimer);\r
                        if(giVesaCursorTimer == -1)\r
                                giVesaCursorTimer = Time_CreateTimer(VESA_CURSOR_PERIOD, Vesa_FlipCursor, Node);\r
+                       #else\r
+                       Vesa_FlipCursor(Node);\r
+                       #endif\r
                }\r
                //Log_Debug("VESA", "Cursor position (%i,%i) Timer %i", giVesaCursorX, giVesaCursorY, giVesaCursorTimer);\r
                return 0;\r
@@ -403,7 +423,7 @@ int Vesa_Int_SetMode(int mode)
        Time_RemoveTimer(giVesaCursorTimer);\r
        giVesaCursorTimer = -1;\r
        \r
-       LOCK( &glVesa_Lock );\r
+       Mutex_Acquire( &glVesa_Lock );\r
        \r
        gpVesa_BiosState->AX = 0x4F02;\r
        gpVesa_BiosState->BX = gVesa_Modes[mode].code;\r
@@ -428,7 +448,7 @@ int Vesa_Int_SetMode(int mode)
        giVesaCurrentMode = mode;\r
        gpVesaCurMode = &gVesa_Modes[giVesaCurrentMode];\r
        \r
-       RELEASE( &glVesa_Lock );\r
+       Mutex_Release( &glVesa_Lock );\r
        \r
        return 1;\r
 }\r
@@ -498,10 +518,10 @@ void Vesa_FlipCursor(void *Arg)
        \r
        //Debug("Cursor flip");\r
        \r
-       // Sanity 1\r
+       // Sanity check\r
        if(giVesaCursorX < 0 || giVesaCursorY < 0\r
-       || y*pitch + x + giVT_CharHeight*pitch > gpVesaCurMode->fbSize/4) {\r
-               Debug("Cursor OOB (%i,%i)", x, y);\r
+       || y*pitch + x + (giVT_CharHeight-1)*pitch > (int)gpVesaCurMode->fbSize/4) {\r
+               Log_Notice("VESA", "Cursor OOB (%i,%i)", x, y);\r
                giVesaCursorTimer = -1;\r
                return;\r
        }\r
@@ -511,7 +531,9 @@ void Vesa_FlipCursor(void *Arg)
        for( i = 1; i < giVT_CharHeight-1; i++, fb += pitch )\r
                *fb = ~*fb;\r
        \r
+       #if BLINKING_CURSOR\r
        giVesaCursorTimer = Time_CreateTimer(VESA_CURSOR_PERIOD, Vesa_FlipCursor, Arg);\r
+       #endif\r
 }\r
 \r
 // ------------------------\r

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