/* $XConsortium: ct_Blitter.h /main/2 1996/10/25 10:28:37 kaleb $ */ /* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/chips/ct_Blitter.h,v 1.4 2002/01/25 21:55:58 tsi Exp $ */ /* Definitions for the Chips and Technology BitBLT engine communication. */ /* registers */ /* Do not read 87D0 while BitBLT is active */ /* 83D0: 11-0 source offset, width of 'screen' */ /* 15-12 reserved (0) */ /* 27-16 destination offset, width of screen */ /* 31-28 reserved (0) */ /* 87D0: 20-0 pattern (alinged 8 pixel x 8 line) pointer */ /* 31-21 reserved (0) */ /* 8BD0: 15-0 backgroud colour */ /* 31-6 duplicate of 15-0 */ /* 8FD0: 15-0 foregroud/solid colour */ /* 31-6 duplicate of 15-0 */ /* 93D0: 7-0 ROP, same as MS-Windows */ /* 8 BitBLT Y direction, if 0 bottom to top, 1 top to bottom */ /* 9 BitBLT X direction, if 0 right to left, 1 left to right */ /* 10 source data, if 0 source is selected bit 14, 1 foregourd colour */ /* 11 source depth, if 0 source is colour, */ /* 1 source is monochrome(Font expansion) */ /* 12 pattern depth, if 0 colour, else monochrome */ /* 13 background, if 0 opaque (8BD0), else transparent */ /* 14 BitBLT source, if 0 screen, else system memory */ /* 15 reserved (0, destination?) */ /* 18-16 starting row of 8x8 pattern */ /* 19 if 1 solid pattern (Brush), else bitmap */ /* 20(R) BitBLT status, if 1 active */ /* 23-21 reserved (0) */ /* 27-24 vacancy in buffer */ /* 31-25 reserved (0) */ /* 97D0: 20-0 source address (byte aligned) */ /* 31-21 reserved (0) */ /* 9BD0: 20-0 destination address (byte aligned) */ /* 31-21 reserved (0) */ /* 9FD0: 11-0 number of bytes to be transferred per line */ /* 15-12 reserved (0) */ /* 27-16 height in lines of the block to be transferred */ /* 31-28 reserved (0) */ /* BitBLT modes for register 93D0. */ #define ctPATCOPY 0xF0 #define ctTOP2BOTTOM 0x100 #define ctBOTTOM2TOP 0x000 #define ctLEFT2RIGHT 0x200 #define ctRIGHT2LEFT 0x000 #define ctSRCFG 0x400 #define ctSRCMONO 0x800 #define ctPATMONO 0x1000 #define ctBGTRANSPARENT 0x2000 #define ctSRCSYSTEM 0x4000 #define ctPATSOLID 0x80000L #define ctPATSTART0 0x00000L #define ctPATSTART1 0x10000L #define ctPATSTART2 0x20000L #define ctPATSTART3 0x30000L #define ctPATSTART4 0x40000L #define ctPATSTART5 0x50000L #define ctPATSTART6 0x60000L #define ctPATSTART7 0x70000L /* Macros to do useful things with the C&T BitBLT engine */ #define ctBLTWAIT \ {HW_DEBUG(0x4+2); while(inw(cPtr->PIOBase+DR(0x4)+2)&0x10){};} #define ctSETROP(op) \ {HW_DEBUG(0x4); outl(cPtr->PIOBase+DR(0x4),(op));} #define ctSETSRCADDR(srcAddr) \ {HW_DEBUG(0x5); outl(cPtr->PIOBase+DR(0x5),((srcAddr)&0x1FFFFFL));} #define ctSETDSTADDR(dstAddr) \ {HW_DEBUG(0x6); outl(cPtr->PIOBase+DR(0x6),((dstAddr)&0x1FFFFFL));} #define ctSETPITCH(srcPitch,dstPitch) \ {HW_DEBUG(0x0); outl(cPtr->PIOBase+DR(0x0),(((dstPitch)<<16)|(srcPitch)));} /* Note that this command signal a blit to commence */ #define ctSETHEIGHTWIDTHGO(Height,Width)\ {HW_DEBUG(0x7); outl(cPtr->PIOBase+DR(0x7),(((Height)<<16)|(Width)));} #define ctSETPATSRCADDR(srcAddr)\ {HW_DEBUG(0x1); outl(cPtr->PIOBase+DR(0x1),((srcAddr)&0x1FFFFFL));} /* I can't help pointing out at this point that I'm not complaining * about the american spelling of Colour!! [DGB] */ #define ctSETBGCOLOR8(c) {\ HW_DEBUG(0x2); \ if ((cAcl->bgColor != (c)) || (cAcl->bgColor == -1)) { \ cAcl->bgColor = (c); \ outl(cPtr->PIOBase+DR(0x2),((((((c)&0xFF)<<8)|((c)&0xFF))<<16) | \ ((((c)&0xFF)<<8)|((c)&0xFF)))); \ } \ } #define ctSETBGCOLOR16(c) {\ HW_DEBUG(0x2); \ if ((cAcl->bgColor != (c)) || (cAcl->bgColor == -1)) { \ cAcl->bgColor = (c); \ outl(cPtr->PIOBase+DR(0x2),((((c)&0xFFFF)<<16)|((c)&0xFFFF))); \ } \ } /* As the 6554x doesn't support 24bpp colour expansion this doesn't work */ #define ctSETBGCOLOR24(c) {\ HW_DEBUG(0x2); \ if ((cAcl->bgColor != (c)) || (cAcl->bgColor == -1)) { \ cAcl->bgColor = (c); \ outl(cPtr->PIOBase+DR(0x2),(c)&0xFFFFFF); \ } \ } #define ctSETFGCOLOR8(c) {\ HW_DEBUG(0x3); \ if ((cAcl->fgColor != (c)) || (cAcl->fgColor == -1)) { \ cAcl->fgColor = (c); \ outl(cPtr->PIOBase+DR(0x3),((((((c)&0xFF)<<8)|((c)&0xFF))<<16) | \ ((((c)&0xFF)<<8)|((c)&0xFF)))); \ } \ } #define ctSETFGCOLOR16(c) {\ HW_DEBUG(0x3); \ if ((cAcl->fgColor != (c)) || (cAcl->fgColor == -1)) { \ cAcl->fgColor = (c); \ outl(cPtr->PIOBase+DR(0x3),((((c)&0xFFFF)<<16)|((c)&0xFFFF))); \ } \ } /* As the 6554x doesn't support 24bpp colour expansion this doesn't work */ #define ctSETFGCOLOR24(c) {\ HW_DEBUG(0x3); \ if ((cAcl->fgColor != (c)) || (cAcl->fgColor == -1)) { \ cAcl->fgColor = (c); \ outl(cPtr->PIOBase+DR(0x3),(c)&0xFFFFFF); \ } \ } /* Define a Macro to replicate a planemask 64 times and write to address * allocated for planemask pattern */ #define ctWRITEPLANEMASK8(mask,addr) { \ if (cAcl->planemask != (mask&0xFF)) { \ cAcl->planemask = (mask&0xFF); \ memset((unsigned char *)cPtr->FbBase + addr, (mask&0xFF), 64); \ } \ } #define ctWRITEPLANEMASK16(mask,addr) { \ if (cAcl->planemask != (mask&0xFFFF)) { \ cAcl->planemask = (mask&0xFFFF); \ { int i; \ for (i = 0; i < 64; i++) { \ memcpy((unsigned char *)cPtr->FbBase + addr \ + i * 2, &mask, 2); \ } \ } \ } \ }