#ifdef HAVE_XORG_CONFIG_H
#include <xorg-config.h>
#endif
#include "xf4bpp.h"
#include "OScompiler.h"
#include "vgaReg.h"
#include "vgaVideo.h"
#include "xf86str.h"
extern ScrnInfoPtr *xf86Screens;
#undef TRUE
#undef FALSE
#define TRUE 1
#define FALSE 0
#ifndef PC98_EGC
#ifdef USE_ASM
extern void fastFill();
extern void fastFillRMW();
#else
static void fastFill
(
register volatile unsigned char *destination,
register const unsigned int bytes_per_line,
register const unsigned int bytewidth,
register unsigned int height
)
{
int stop_count = bytewidth ;
register int row_jump = bytes_per_line - bytewidth ;
#if !defined(OLDHC) && defined(BSDrt) && !defined(i386)
register const unsigned int notZero = ((unsigned char)(~0x0));
#else
#define notZero ((unsigned char)(~0))
#endif
#define SINGLE_STORE \
( *( (VgaMemoryPtr) destination ) = notZero ); \
destination++; stop_count--;
BranchPoint:
switch ( bytewidth & 0xF ) {
LoopTop :
case 0x0 : SINGLE_STORE ;
case 0xF : SINGLE_STORE ;
case 0xE : SINGLE_STORE ;
case 0xD : SINGLE_STORE ;
case 0xC : SINGLE_STORE ;
case 0xB : SINGLE_STORE ;
case 0xA : SINGLE_STORE ;
case 0x9 : SINGLE_STORE ;
case 0x8 : SINGLE_STORE ;
case 0x7 : SINGLE_STORE ;
case 0x6 : SINGLE_STORE ;
case 0x5 : SINGLE_STORE ;
case 0x4 : SINGLE_STORE ;
case 0x3 : SINGLE_STORE ;
case 0x2 : SINGLE_STORE ;
case 0x1 : SINGLE_STORE ;
if ( stop_count )
goto LoopTop ;
if ( --height ) {
destination += row_jump ;
stop_count = bytewidth ;
goto BranchPoint ;
}
else
return ;
#undef SINGLE_STORE
}
}
static void fastFillRMW
(
register volatile unsigned char *destination,
register const unsigned int bytes_per_line,
register const unsigned int bytewidth,
register unsigned int height
)
{
int stop_count = bytewidth ;
register int row_jump = bytes_per_line - bytewidth ;
#if !defined(OLDHC) && defined(BSDrt) && !defined(i386)
register const unsigned int notZero = ((unsigned char)(~0x0));
#endif
register int tmp ;
#define SINGLE_STORE \
tmp = *( (VgaMemoryPtr) destination ) ; (void)tmp; \
( *( (VgaMemoryPtr) destination ) = notZero ) ; \
destination++; stop_count-- ;
BranchPoint:
switch ( bytewidth & 0xF ) {
LoopTop :
case 0x0 : SINGLE_STORE ;
case 0xF : SINGLE_STORE ;
case 0xE : SINGLE_STORE ;
case 0xD : SINGLE_STORE ;
case 0xC : SINGLE_STORE ;
case 0xB : SINGLE_STORE ;
case 0xA : SINGLE_STORE ;
case 0x9 : SINGLE_STORE ;
case 0x8 : SINGLE_STORE ;
case 0x7 : SINGLE_STORE ;
case 0x6 : SINGLE_STORE ;
case 0x5 : SINGLE_STORE ;
case 0x4 : SINGLE_STORE ;
case 0x3 : SINGLE_STORE ;
case 0x2 : SINGLE_STORE ;
case 0x1 : SINGLE_STORE ;
if ( stop_count )
goto LoopTop ;
if ( --height ) {
destination += row_jump ;
stop_count = bytewidth ;
goto BranchPoint ;
}
else
return ;
}
#undef SINGLE_STORE
}
#endif
void xf4bppFillSolid( pWin, color, alu, planes, x0, y0, lx, ly )
WindowPtr pWin;
unsigned long int color ;
const int alu ;
unsigned long int planes ;
register int x0 ;
register const int y0 ;
register int lx ;
register const int ly ;
{
IOADDRESS REGBASE;
register volatile unsigned char *dst ;
register int tmp ;
register int tmp2 ;
register int tmp3 ;
unsigned int data_rotate_value = VGA_COPY_MODE ;
unsigned int read_write_modify = FALSE ;
unsigned int invert_existing_data = FALSE ;
{
if ( !xf86Screens[((DrawablePtr)pWin)->pScreen->myNum]->vtSema ) {
xf4bppOffFillSolid( pWin, color, alu, planes, x0, y0, lx, ly );
return;
}
}
if ( ( lx == 0 ) || ( ly == 0 ) )
return;
switch ( alu ) {
case GXclear:
color = 0 ;
break ;
case GXnor:
invert_existing_data = TRUE ;
case GXandInverted:
color = ~color ;
case GXand:
data_rotate_value = VGA_AND_MODE ;
read_write_modify = TRUE ;
case GXcopy:
break ;
case GXnoop:
return ;
case GXequiv:
color = ~color ;
case GXxor:
data_rotate_value = VGA_XOR_MODE ;
read_write_modify = TRUE ;
planes &= color ;
break ;
case GXandReverse:
invert_existing_data = TRUE ;
data_rotate_value = VGA_AND_MODE ;
read_write_modify = TRUE ;
break ;
case GXorReverse:
invert_existing_data = TRUE ;
data_rotate_value = VGA_OR_MODE ;
read_write_modify = TRUE ;
break ;
case GXnand:
invert_existing_data = TRUE ;
case GXorInverted:
color = ~color ;
case GXor:
data_rotate_value = VGA_OR_MODE ;
read_write_modify = TRUE ;
break ;
case GXcopyInverted:
color = ~color ;
break ;
case GXinvert:
data_rotate_value = VGA_XOR_MODE ;
read_write_modify = TRUE ;
case GXset:
color = VGA_ALLPLANES ;
default:
break ;
}
if ( !( planes &= VGA_ALLPLANES ) )
return ;
REGBASE =
xf86Screens[((DrawablePtr)pWin)->pScreen->myNum]->domainIOBase + 0x300;
SetVideoSequencer( Mask_MapIndex, planes ) ;
SetVideoGraphics( Enb_Set_ResetIndex, planes ) ;
SetVideoGraphics( Graphics_ModeIndex, VGA_WRITE_MODE_3 ) ;
SetVideoGraphics( Set_ResetIndex, color & VGA_ALLPLANES ) ;
SetVideoGraphics( Data_RotateIndex, data_rotate_value ) ;
if ((tmp = x0 & 07)) {
tmp2 = SCRRIGHT8( ( (unsigned) 0xFF ), tmp ) ;
if ( ( lx -= 8 - tmp ) < 0 ) {
tmp2 &= SCRLEFT8( 0xFF, -lx ) ;
lx = 0 ;
}
SetVideoGraphics(Bit_MaskIndex, tmp2 ) ;
if ( invert_existing_data == TRUE ) {
SetVideoGraphics( Set_ResetIndex, VGA_ALLPLANES ) ;
SetVideoGraphics( Data_RotateIndex, VGA_XOR_MODE ) ;
dst = SCREENADDRESS( pWin, x0, y0 );
for ( tmp = ly;
tmp-- ; ) {
tmp3 = *( (VgaMemoryPtr) dst ) ;
(void)tmp3;
*( (VgaMemoryPtr) dst ) = tmp2 ;
dst += BYTES_PER_LINE(pWin);
}
SetVideoGraphics( Set_ResetIndex, color & VGA_ALLPLANES ) ;
SetVideoGraphics( Data_RotateIndex, data_rotate_value ) ;
}
dst = SCREENADDRESS( pWin, x0, y0 );
for ( tmp = ly;
tmp-- ; ) {
tmp3 = *( (VgaMemoryPtr) dst ) ;
(void)tmp3;
*( (VgaMemoryPtr) dst ) = tmp2 ;
dst += BYTES_PER_LINE(pWin);
}
if ( !lx ) {
return ;
}
x0 = ( x0 + 8 ) & ~07 ;
}
if ( ROW_OFFSET( lx ) ) {
SetVideoGraphics(Bit_MaskIndex, 0xFF ) ;
if ( invert_existing_data == TRUE ) {
SetVideoGraphics( Set_ResetIndex, VGA_ALLPLANES ) ;
SetVideoGraphics( Data_RotateIndex, VGA_XOR_MODE ) ;
fastFillRMW( SCREENADDRESS( pWin, x0, y0 ),
BYTES_PER_LINE(pWin),
ROW_OFFSET( lx ), ly ) ;
SetVideoGraphics( Set_ResetIndex, color & VGA_ALLPLANES ) ;
SetVideoGraphics( Data_RotateIndex, data_rotate_value ) ;
}
(* ( ( read_write_modify == FALSE ) ? fastFill : fastFillRMW ) )
( SCREENADDRESS( pWin, x0, y0 ), BYTES_PER_LINE(pWin),
ROW_OFFSET( lx ), ly ) ;
}
if ((tmp = BIT_OFFSET(lx))) {
SetVideoGraphics( Bit_MaskIndex,
(tmp2 = SCRLEFT8( 0xFF, ( 8 - tmp ) ) ) ) ;
if ( invert_existing_data == TRUE ) {
SetVideoGraphics( Set_ResetIndex, VGA_ALLPLANES ) ;
SetVideoGraphics( Data_RotateIndex, VGA_XOR_MODE ) ;
dst = SCREENADDRESS( pWin, ( x0 + lx ), y0 );
for ( tmp = ly;
tmp-- ; ) {
tmp3 = *( (VgaMemoryPtr) dst ) ;
(void)tmp3;
*( (VgaMemoryPtr) dst ) = tmp2 ;
dst += BYTES_PER_LINE(pWin);
}
SetVideoGraphics( Set_ResetIndex, color & VGA_ALLPLANES ) ;
SetVideoGraphics( Data_RotateIndex, data_rotate_value ) ;
}
dst = SCREENADDRESS( pWin, ( x0 + lx ), y0 );
for ( tmp = ly;
tmp-- ; ) {
tmp3 = *( (VgaMemoryPtr) dst ) ;
(void)tmp3;
*( (VgaMemoryPtr) dst ) = tmp2 ;
dst += BYTES_PER_LINE(pWin) ;
}
}
SetVideoGraphics( Enb_Set_ResetIndex, 0 ) ;
return ;
}
#else
static void WordfastFill( destination, bytes_per_line, wordwidth, height )
register volatile unsigned char *destination ;
register const unsigned int bytes_per_line ;
register const unsigned int wordwidth ;
register unsigned int height ;
{
int stop_count = wordwidth ;
register int row_jump = bytes_per_line - wordwidth*2 ;
#if !defined(OLDHC) && defined(BSDrt) && !defined(i386) && 0
register const int notZero = ~0x0 ;
#else
#define notZero ( ~0 )
#endif
#define SINGLE_STORE \
( *( (unsigned short *) destination++ ) = notZero ); \
destination++; stop_count--;
BranchPoint:
switch ( wordwidth & 0xF ) {
LoopTop :
case 0x0 : SINGLE_STORE ;
case 0xF : SINGLE_STORE ;
case 0xE : SINGLE_STORE ;
case 0xD : SINGLE_STORE ;
case 0xC : SINGLE_STORE ;
case 0xB : SINGLE_STORE ;
case 0xA : SINGLE_STORE ;
case 0x9 : SINGLE_STORE ;
case 0x8 : SINGLE_STORE ;
case 0x7 : SINGLE_STORE ;
case 0x6 : SINGLE_STORE ;
case 0x5 : SINGLE_STORE ;
case 0x4 : SINGLE_STORE ;
case 0x3 : SINGLE_STORE ;
case 0x2 : SINGLE_STORE ;
case 0x1 : SINGLE_STORE ;
if ( stop_count )
goto LoopTop ;
if ( --height ) {
destination += row_jump ;
stop_count = wordwidth ;
goto BranchPoint ;
}
else
return ;
#undef SINGLE_STORE
}
}
void xf4bppFillSolid( pWin, color, alu, planes, x0, y0, lx, ly )
WindowPtr pWin;
unsigned long int color ;
const int alu ;
unsigned long int planes ;
register int x0 ;
register const int y0 ;
register int lx ;
register const int ly ;
{
register volatile unsigned char *dst ;
register tmp ;
register tmp2 ;
register unsigned short tmp3 ;
unsigned short ROP_value;
unsigned int data_rotate_value = VGA_COPY_MODE ;
unsigned int read_write_modify = FALSE ;
unsigned int invert_existing_data = FALSE ;
{
if ( !xf86Screens[((DrawablePtr)pWin)->pScreen->myNum]->vtSema ) {
xf4bppOffFillSolid( pWin, color, alu, planes, x0, y0, lx, ly );
return;
}
}
if ( ( lx == 0 ) || ( ly == 0 ) )
return;
switch ( alu ) {
case GXclear:
color = 0 ;
break ;
case GXnor:
invert_existing_data = TRUE ;
case GXandInverted:
color = ~color ;
case GXand:
data_rotate_value = VGA_AND_MODE ;
read_write_modify = TRUE ;
case GXcopy:
break ;
case GXnoop:
return ;
case GXequiv:
color = ~color ;
case GXxor:
data_rotate_value = VGA_XOR_MODE ;
read_write_modify = TRUE ;
planes &= color ;
break ;
case GXandReverse:
invert_existing_data = TRUE ;
data_rotate_value = VGA_AND_MODE ;
read_write_modify = TRUE ;
break ;
case GXorReverse:
invert_existing_data = TRUE ;
data_rotate_value = VGA_OR_MODE ;
read_write_modify = TRUE ;
break ;
case GXnand:
invert_existing_data = TRUE ;
case GXorInverted:
color = ~color ;
case GXor:
data_rotate_value = VGA_OR_MODE ;
read_write_modify = TRUE ;
break ;
case GXcopyInverted:
color = ~color ;
break ;
case GXinvert:
data_rotate_value = VGA_XOR_MODE ;
read_write_modify = TRUE ;
case GXset:
color = VGA_ALLPLANES ;
default:
break ;
}
if ( !( planes &= VGA_ALLPLANES ) )
return ;
outw(EGC_PLANE, ~planes);
switch(data_rotate_value) {
case VGA_AND_MODE:
if (invert_existing_data)
ROP_value = EGC_AND_INV_MODE;
else
ROP_value = EGC_AND_MODE;
break;
case VGA_OR_MODE:
if (invert_existing_data)
ROP_value = EGC_OR_INV_MODE;
else
ROP_value = EGC_OR_MODE;
break;
case VGA_XOR_MODE:
if (invert_existing_data)
ROP_value = EGC_XOR_INV_MODE;
else
ROP_value = EGC_XOR_MODE;
break;
case VGA_COPY_MODE:
default:
ROP_value = EGC_COPY_MODE;
break;
}
outw(EGC_MODE, ROP_value);
outw(EGC_FGC, color & VGA_ALLPLANES);
if ( tmp = x0 & 0x0f ) {
dst = (unsigned char *)((int)(SCREENADDRESS(pWin,x0,y0)) & ~0x01);
tmp3 = (unsigned)0xffff >>tmp;
if ( ( lx -= 16 - tmp ) < 0 ) {
tmp3 &= (unsigned)0xffff << -lx;
lx = 0 ;
}
tmp3 = (unsigned short)(tmp3 >> 8 | tmp3 << 8);
for ( tmp = ly;
tmp-- ; ) {
*((unsigned short *) dst ) = tmp3 ;
dst += BYTES_PER_LINE(pWin);
}
if ( !lx ) {
return ;
}
x0 = ( x0 + 0x0f ) & ~0x0f ;
}
if (lx >> 4) {
WordfastFill( SCREENADDRESS( pWin, x0, y0 ), BYTES_PER_LINE(pWin),
(lx >> 4), ly ) ;
}
if ( tmp = lx & 0x0f ) {
tmp3 = (unsigned)0xffff << ( 16 - tmp );
dst = (unsigned char*)((int)SCREENADDRESS(pWin,(x0+lx),y0) & ~0x01);
tmp3 = (unsigned short)(tmp3 >> 8 | tmp3 << 8);
for ( tmp = ly;
tmp-- ; ) {
*( (unsigned short *) dst ) = tmp3 ;
dst += BYTES_PER_LINE(pWin);
}
}
return ;
}
#endif