X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fdrv%2Fvga.c;h=015423de51ef66cd72d8c25605da7361f55b75fd;hb=d1f16adf5f2e94e836ea6658186a6ff6d94f54d8;hp=93f44f074636b528f3951eed5666ac3851788fc1;hpb=8bc40333b1401d7616b225945fee53d972c2f418;p=tpg%2Facess2.git diff --git a/Kernel/drv/vga.c b/Kernel/drv/vga.c index 93f44f07..015423de 100644 --- a/Kernel/drv/vga.c +++ b/Kernel/drv/vga.c @@ -6,11 +6,16 @@ #include #include +// === CONSTANTS === +#define VGA_WIDTH 80 +#define VGA_HEIGHT 25 + // === PROTOTYPES === int VGA_Install(char **Arguments); Uint64 VGA_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer); int VGA_IOCtl(tVFS_Node *Node, int Id, void *Data); Uint16 VGA_int_GetWord(tVT_Char *Char); +void VGA_int_SetCursor(Sint16 x, Sint16 y); // === GLOBALS === MODULE_DEFINE(0, 0x000A, VGA, VGA_Install, NULL, NULL); @@ -18,7 +23,7 @@ tDevFS_Driver gVGA_DevInfo = { NULL, "VGA", { .NumACLs = 0, - .Size = 80*25*sizeof(tVT_Char), + .Size = VGA_WIDTH*VGA_HEIGHT*sizeof(tVT_Char), //.Read = VGA_Read, .Write = VGA_Write, .IOCtl = VGA_IOCtl @@ -85,15 +90,18 @@ int VGA_IOCtl(tVFS_Node *Node, int Id, void *Data) case DRV_IOCTL_VERSION: *(int*)Data = 50; return 1; case DRV_IOCTL_LOOKUP: return 0; - case VIDEO_IOCTL_SETMODE: return 0; // Ignored (Text Only ATM) case VIDEO_IOCTL_GETMODE: return 0; // Mode 0 only + case VIDEO_IOCTL_SETMODE: return 0; // Ignored (Text Only ATM) case VIDEO_IOCTL_FINDMODE: return 0; // Text Only! case VIDEO_IOCTL_MODEINFO: if( ((tVideo_IOCtl_Mode*)Data)->id != 0) return 0; - ((tVideo_IOCtl_Mode*)Data)->width = 80; - ((tVideo_IOCtl_Mode*)Data)->height = 25; + ((tVideo_IOCtl_Mode*)Data)->width = VGA_WIDTH; + ((tVideo_IOCtl_Mode*)Data)->height = VGA_HEIGHT; ((tVideo_IOCtl_Mode*)Data)->bpp = 4; return 1; + case VIDEO_IOCTL_SETCURSOR: + VGA_int_SetCursor( ((tVideo_IOCtl_Pos*)Data)->x, ((tVideo_IOCtl_Pos*)Data)->y ); + return 1; } return 0; } @@ -172,3 +180,18 @@ Uint16 VGA_int_GetWord(tVT_Char *Char) return ret; } + +/** + * \fn void VGA_int_SetCursor(Sint16 x, Sint16 y) + * \brief Updates the cursor position + */ +void VGA_int_SetCursor(Sint16 x, Sint16 y) +{ + int pos = x+y*VGA_WIDTH; + if(x == -1 || y == -1) + pos = -1; + outb(0x3D4, 14); + outb(0x3D5, pos >> 8); + outb(0x3D4, 15); + outb(0x3D5, pos); +}