#include "xf86.h"
#include "xf86PciInfo.h"
#include "xf86Pci.h"
#include "BT.h"
#include "tga.h"
#include "tga_regs.h"
#define CURSOR_SIZE 64
static void TGALoadCursorImage(ScrnInfoPtr pScrn, unsigned char *src);
static void TGAShowCursor(ScrnInfoPtr pScrn);
static void TGAHideCursor(ScrnInfoPtr pScrn);
static void TGASetCursorPosition(ScrnInfoPtr pScrn, int x, int y);
static void TGASetCursorColors(ScrnInfoPtr pScrn, int bg, int fg);
static void
TGALoadCursorImage(ScrnInfoPtr pScrn, unsigned char *src)
{
TGAPtr pTga = TGAPTR(pScrn);
int i;
pTga->RamDacRec->WriteDAC(pScrn, BT_COMMAND_REG_0, 0x7F, 0x80);
pTga->RamDacRec->WriteDAC(pScrn, BT_WRITE_ADDR, 0x00, 0x01);
pTga->RamDacRec->WriteDAC(pScrn, BT_STATUS_REG, 0xF8, 0x04);
pTga->RamDacRec->WriteDAC(pScrn, BT_WRITE_ADDR, 0xFC, 0x00);
for(i = 0; i < ((CURSOR_SIZE * CURSOR_SIZE) / 8); i++)
pTga->RamDacRec->WriteDAC(pScrn, BT_CURS_RAM_DATA, 0x00, *src++);
for(i = 0; i < ((CURSOR_SIZE * CURSOR_SIZE) / 8); i++)
pTga->RamDacRec->WriteDAC(pScrn, BT_CURS_RAM_DATA, 0x00, *src++);
return;
}
static void
TGAShowCursor(ScrnInfoPtr pScrn)
{
TGAPtr pTga = TGAPTR(pScrn);
pTga->RamDacRec->WriteDAC(pScrn, BT_COMMAND_REG_2, 0xFC, 0x03);
return;
}
static void
TGAHideCursor(ScrnInfoPtr pScrn)
{
TGAPtr pTga = TGAPTR(pScrn);
pTga->RamDacRec->WriteDAC(pScrn, BT_COMMAND_REG_2, 0xFC, 0x00);
return;
}
static void
TGASetCursorPosition(ScrnInfoPtr pScrn, int x, int y)
{
TGAPtr pTga = TGAPTR(pScrn);
unsigned int tmp_x, tmp_y;
tmp_x = x + CURSOR_SIZE;
tmp_x &= 0x0FFF;
tmp_y = y + CURSOR_SIZE;
tmp_y &= 0x0FFF;
pTga->RamDacRec->WriteDAC(pScrn, BT_CURS_X_LOW, 0x00, (tmp_x & 0xFF));
pTga->RamDacRec->WriteDAC(pScrn, BT_CURS_X_HIGH, 0xF0, (tmp_x >> 8));
pTga->RamDacRec->WriteDAC(pScrn, BT_CURS_Y_LOW, 0x00, (tmp_y & 0xFF));
pTga->RamDacRec->WriteDAC(pScrn, BT_CURS_Y_HIGH, 0xF0, (tmp_y >> 8));
return;
}
static void
TGASetCursorColors(ScrnInfoPtr pScrn, int bg, int fg)
{
TGAPtr pTga = TGAPTR(pScrn);
pTga->RamDacRec->WriteDAC(pScrn, BT_CURS_WR_ADDR, 0xFC, 0x01);
pTga->RamDacRec->WriteDAC(pScrn, BT_CURS_DATA, 0x00, (bg & 0x00FF0000) >> 16);
pTga->RamDacRec->WriteDAC(pScrn, BT_CURS_DATA, 0x00, (bg & 0x0000FF00) >> 8);
pTga->RamDacRec->WriteDAC(pScrn, BT_CURS_DATA, 0x00, (bg & 0x000000FF));
pTga->RamDacRec->WriteDAC(pScrn, BT_CURS_DATA, 0x00, (fg & 0x00FF0000) >> 16);
pTga->RamDacRec->WriteDAC(pScrn, BT_CURS_DATA, 0x00, (fg & 0x0000FF00) >> 8);
pTga->RamDacRec->WriteDAC(pScrn, BT_CURS_DATA, 0x00, (fg & 0x000000FF));
return;
}
Bool
TGAHWCursorInit(ScreenPtr pScreen)
{
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
TGAPtr pTga;
xf86CursorInfoPtr infoPtr;
pTga = TGAPTR(pScrn);
infoPtr = xf86CreateCursorInfoRec();
if(!infoPtr) return FALSE;
pTga->CursorInfoRec = infoPtr;
infoPtr->MaxWidth = CURSOR_SIZE;
infoPtr->MaxHeight = CURSOR_SIZE;
infoPtr->Flags = HARDWARE_CURSOR_AND_SOURCE_WITH_MASK |
HARDWARE_CURSOR_BIT_ORDER_MSBFIRST |
HARDWARE_CURSOR_TRUECOLOR_AT_8BPP;
infoPtr->SetCursorColors = TGASetCursorColors;
infoPtr->SetCursorPosition = TGASetCursorPosition;
infoPtr->LoadCursorImage = TGALoadCursorImage;
infoPtr->HideCursor = TGAHideCursor;
infoPtr->ShowCursor = TGAShowCursor;
infoPtr->UseHWCursor = NULL;
return(xf86InitCursor(pScreen, infoPtr));
}