Fixed VESA scrolling bug
[tpg/acess2.git] / Kernel / drv / vterm.c
index fe2ccd9..aa2b8f3 100644 (file)
@@ -19,9 +19,9 @@
 #define MAX_INPUT_CHARS32      64
 #define MAX_INPUT_CHARS8       (MAX_INPUT_CHARS32*4)
 #define VT_SCROLLBACK  2       // 2 Screens of text
-#define DEFAULT_OUTPUT "VGA"
+//#define DEFAULT_OUTPUT       "VGA"
 //#define DEFAULT_OUTPUT       "BochsGA"
-//#define DEFAULT_OUTPUT       "Vesa"
+#define DEFAULT_OUTPUT "Vesa"
 #define DEFAULT_INPUT  "PS2Keyboard"
 #define        DEFAULT_WIDTH   80
 #define        DEFAULT_HEIGHT  25
@@ -63,12 +63,15 @@ extern void Debug_SetKTerminal(char *File);
 
 // === PROTOTYPES ===
  int   VT_Install(char **Arguments);
+void   VT_InitOutput(void);
+void   VT_InitInput(void);
 char   *VT_ReadDir(tVFS_Node *Node, int Pos);
 tVFS_Node      *VT_FindDir(tVFS_Node *Node, char *Name);
  int   VT_Root_IOCtl(tVFS_Node *Node, int Id, void *Data);
 Uint64 VT_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer);
 Uint64 VT_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer);
  int   VT_Terminal_IOCtl(tVFS_Node *Node, int Id, void *Data);
+void   VT_SetResolution(int IsTextMode, int Width, int Height);
 void   VT_SetTerminal(int ID);
 void   VT_KBCallBack(Uint32 Codepoint);
 void   VT_int_PutString(tVTerm *Term, Uint8 *Buffer, Uint Count);
@@ -189,6 +192,9 @@ int VT_Install(char **Arguments)
        // Add to DevFS
        DevFS_AddDevice( &gVT_DrvInfo );
        
+       VT_InitOutput();
+       VT_InitInput();
+       
        // Set kernel output to VT0
        Debug_SetKTerminal("/Devices/VTerm/0");
        
@@ -203,7 +209,12 @@ int VT_Install(char **Arguments)
 void VT_InitOutput()
 {
        giVT_OutputDevHandle = VFS_Open(gsVT_OutputDevice, VFS_OPENFLAG_WRITE);
+       if(giVT_InputDevHandle == -1) {
+               Log_Warning("VTerm", "Oh F**k, I can't open the video device '%s'", gsVT_OutputDevice);
+               return ;
+       }
        VT_SetTerminal( 0 );
+       VT_SetResolution(1, 640, 400);
 }
 
 /**
@@ -461,12 +472,7 @@ void VT_SetResolution(int IsTextMode, int Width, int Height)
        giVT_RealHeight = mode.height;
        VFS_IOCtl( giVT_OutputDevHandle, VIDEO_IOCTL_GETSETMODE, &tmp );
        
-       
-       
-       if(IsTextMode)
-               tmp = VIDEO_BUFFMT_TEXT;
-       else
-               tmp = VIDEO_BUFFMT_FRAMEBUFFER;
+       tmp = IsTextMode ? VIDEO_BUFFMT_TEXT : VIDEO_BUFFMT_FRAMEBUFFER;
        VFS_IOCtl( giVT_OutputDevHandle, VIDEO_IOCTL_SETBUFFORMAT, &tmp );
 }
 
@@ -490,6 +496,11 @@ void VT_SetTerminal(int ID)
                VFS_IOCtl(giVT_OutputDevHandle, VIDEO_IOCTL_SETCURSOR, &pos);
        }
        
+       if( gpVT_CurTerm->Mode == TERM_MODE_TEXT )
+               VT_SetResolution( 1, gpVT_CurTerm->Width*giVT_CharWidth, gpVT_CurTerm->Height*giVT_CharHeight );
+       else
+               VT_SetResolution( 0, gpVT_CurTerm->Width, gpVT_CurTerm->Height );
+       
        // Update the screen
        VT_int_UpdateScreen( &gVT_Terminals[ ID ], 1 );
 }
@@ -1009,7 +1020,7 @@ void VT_int_ChangeMode(tVTerm *Term, int NewMode)
 Uint8  *VT_Font_GetChar(Uint32 Codepoint);
 
 // === GLOBALS ===
-int    giVT_CharWidth = FONT_WIDTH+1;
+int    giVT_CharWidth = FONT_WIDTH;
 int    giVT_CharHeight = FONT_HEIGHT;
 
 // === CODE ===

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