X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fdrv%2Fvterm.c;h=143396466ab7017a947b6a14e049dd4fa7469449;hb=6202eb0852c564c92b1ce6e61ce4d60e7023ace1;hp=92fb6f98789cfa65a7f91106be49e31f67b6f88e;hpb=e68f6b1d00dd0f4659dc961afaa02e0fce182813;p=tpg%2Facess2.git diff --git a/Kernel/drv/vterm.c b/Kernel/drv/vterm.c index 92fb6f98..14339646 100644 --- a/Kernel/drv/vterm.c +++ b/Kernel/drv/vterm.c @@ -1,7 +1,7 @@ /* * Acess2 Virtual Terminal Driver */ -#define DEBUG 1 +#define DEBUG 0 #include #include #include @@ -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); @@ -104,7 +107,6 @@ tVTerm *gpVT_CurTerm = &gVT_Terminals[0]; // --- Video State --- short giVT_RealWidth; //!< Real Width short giVT_RealHeight; //!< Real Height - int gbVT_TextMode = 1; // --- Driver Handles --- char *gsVT_OutputDevice = NULL; char *gsVT_InputDevice = NULL; @@ -152,7 +154,6 @@ int VT_Install(char **Arguments) strcpy(gsVT_InputDevice, args[1]); args ++; break; - } } } @@ -191,9 +192,13 @@ 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"); + Log_Log("VTerm", "Returning %i", MODULE_ERR_OK); return MODULE_ERR_OK; } @@ -204,7 +209,11 @@ 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); + } VT_SetTerminal( 0 ); + VT_SetResolution(1, 640, 480); } /** @@ -237,7 +246,7 @@ tVFS_Node *VT_FindDir(tVFS_Node *Node, char *Name) { int num; - //ENTER("pNode sName", Node, Name); + ENTER("pNode sName", Node, Name); // Open the input and output files if needed if(giVT_OutputDevHandle == -2) VT_InitOutput(); @@ -255,7 +264,7 @@ tVFS_Node *VT_FindDir(tVFS_Node *Node, char *Name) return NULL; } // Return node - //LEAVE('p', &gVT_Terminals[num].Node); + LEAVE('p', &gVT_Terminals[num].Node); return &gVT_Terminals[num].Node; } @@ -321,8 +330,8 @@ Uint64 VT_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) } break; - case TERM_MODE_FB: - //case TERM_MODE_: + //case TERM_MODE_FB: + default: while(pos < Length) { while(term->InputRead == term->InputWrite) Threads_Yield(); @@ -344,8 +353,6 @@ Uint64 VT_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) { tVTerm *term = &gVT_Terminals[ Node->Inode ]; - //ENTER("pNode XOffset XLength pBuffer", Node, Offset, Length, Buffer); - // Write switch( term->Mode ) { @@ -376,7 +383,6 @@ Uint64 VT_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) } } - //LEAVE('i', 0); return 0; } @@ -465,12 +471,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 ); } @@ -494,6 +495,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 ); } @@ -905,7 +911,7 @@ void VT_int_PutChar(tVTerm *Term, Uint32 Ch) memcpy( Term->Text, &Term->Text[Term->Width], - Term->Width*(Term->Height-1)*VT_SCROLLBACK*sizeof(tVT_Char) + (Term->Width*Term->Height*VT_SCROLLBACK-Term->Width)*sizeof(tVT_Char) ); // Clear last row @@ -915,11 +921,13 @@ void VT_int_PutChar(tVTerm *Term, Uint32 Ch) Term->Text[ base + i ].Colour = Term->CurColour; } + //LOG("Scrolled buffer"); VT_int_UpdateScreen( Term, 1 ); } else if(Term->WritePos > Term->Width*Term->Height+Term->ViewPos) { Term->ViewPos += Term->Width; + //LOG("Scrolled screen"); VT_int_UpdateScreen( Term, 1 ); } else @@ -939,41 +947,27 @@ void VT_int_UpdateScreen( tVTerm *Term, int UpdateAll ) if( Term->Mode == TERM_MODE_TEXT ) { - if(gbVT_TextMode) - { - if(UpdateAll) { - VFS_WriteAt( - giVT_OutputDevHandle, - 0, - Term->Width*Term->Height*sizeof(tVT_Char), - &Term->Text[Term->ViewPos] - ); - } else { - int pos = Term->WritePos - Term->WritePos % Term->Width; - VFS_WriteAt( - giVT_OutputDevHandle, - (pos - Term->ViewPos)*sizeof(tVT_Char), - Term->Width*sizeof(tVT_Char), - &Term->Text[pos] - ); - } - } - else - { - //TODO: Do VT Rendered Text - #if 0 - if( UpdateAll ) { - VT_RenderText(0, Term->Width*Term->Height, &Term->Text[Term->ViewPos]); - } - else { - int pos = Term->WritePos - Term->WritePos % Term->Width; - VT_RenderText( - pos - Term->ViewPos, - Term->Width, - &Term->Text[pos] - ); - } - #endif + if(UpdateAll) { + //LOG("UpdateAll = 1"); + //LOG("VFS_WriteAt(0x%x, 0, %i*sizeof(tVT_Char), &Term->Text[%i])", + // giVT_OutputDevHandle, Term->Width*Term->Height, Term->ViewPos); + VFS_WriteAt( + giVT_OutputDevHandle, + 0, + Term->Width*Term->Height*sizeof(tVT_Char), + &Term->Text[Term->ViewPos] + ); + } else { + int pos = Term->WritePos - Term->WritePos % Term->Width; + //LOG("UpdateAll = 0"); + //LOG("VFS_WriteAt(0x%x, %i*sizeof(tVT_Char), %i*sizeof(tVT_Char), &Term->Text[%i])", + // giVT_OutputDevHandle, (pos - Term->ViewPos), Term->Width, pos); + VFS_WriteAt( + giVT_OutputDevHandle, + (pos - Term->ViewPos)*sizeof(tVT_Char), + Term->Width*sizeof(tVT_Char), + &Term->Text[pos] + ); } } else @@ -1025,7 +1019,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 ===