#ifdef HAVE_XORG_CONFIG_H
#include <xorg-config.h>
#endif
#include "xf4bpp.h"
#include "OScompiler.h"
#include "wm3.h"
#include "vgaVideo.h"
#include "xf86.h"
#define COPY (0 << 3)
#define AND (1 << 3)
#define OR (2 << 3)
#define XOR (3 << 3)
int
wm3_set_regs(pGC)
GC *pGC;
{
#ifndef PC98_EGC
IOADDRESS REGBASE = xf86Screens[pGC->pScreen->myNum]->domainIOBase + 0x300;
int post_invert = 0;
int ALU;
switch(pGC->alu) {
case GXclear:
pGC->fgPixel = 0;
pGC->bgPixel = 0;
ALU = COPY;
break;
case GXand:
ALU = AND;
break;
case GXandReverse:
pGC->fgPixel = ~pGC->fgPixel;
pGC->bgPixel = ~pGC->bgPixel;
ALU = OR;
post_invert = 1;
break;
case GXcopy:
ALU = COPY;
break;
case GXandInverted:
pGC->fgPixel = ~pGC->fgPixel;
pGC->bgPixel = ~pGC->bgPixel;
ALU = AND;
break;
default:
case GXnoop:
return 0;
case GXxor:
ALU = XOR;
break;
case GXor:
ALU = OR;
break;
case GXnor:
ALU = OR;
post_invert = 1;
break;
case GXequiv:
pGC->fgPixel = ~pGC->fgPixel;
pGC->bgPixel = ~pGC->bgPixel;
ALU = XOR;
break;
case GXinvert:
pGC->fgPixel = 0x0F;
pGC->bgPixel = 0x0F;
ALU = XOR;
break;
case GXorReverse:
pGC->fgPixel = ~pGC->fgPixel;
pGC->bgPixel = ~pGC->bgPixel;
ALU = AND;
post_invert = 1;
break;
case GXcopyInverted:
pGC->fgPixel = ~pGC->fgPixel;
pGC->bgPixel = ~pGC->bgPixel;
ALU = COPY;
break;
case GXorInverted:
pGC->fgPixel = ~pGC->fgPixel;
pGC->bgPixel = ~pGC->bgPixel;
ALU = OR;
break;
case GXnand:
ALU = AND;
post_invert = 1;
break;
case GXset:
pGC->fgPixel = 0x0F;
pGC->bgPixel = 0x0F;
ALU = COPY;
break;
}
SetVideoSequencer(Mask_MapIndex, (pGC->planemask & VGA_ALLPLANES));
SetVideoGraphics(Enb_Set_ResetIndex, VGA_ALLPLANES);
SetVideoGraphics(Set_ResetIndex, pGC->fgPixel);
SetVideoGraphics(Bit_MaskIndex, 0xFF);
SetVideoGraphics(Graphics_ModeIndex, 3);
SetVideoGraphics(Data_RotateIndex, ALU);
return post_invert;
#else
int ALU;
switch(pGC->alu) {
case GXclear:
pGC->fgPixel = 0;
pGC->bgPixel = 0;
ALU = EGC_COPY_MODE;
break;
case GXand:
ALU = EGC_AND_MODE;
break;
case GXandReverse:
pGC->fgPixel = ~pGC->fgPixel;
pGC->bgPixel = ~pGC->bgPixel;
ALU = EGC_OR_INV_MODE;
break;
case GXcopy:
ALU = EGC_COPY_MODE;
break;
case GXandInverted:
pGC->fgPixel = ~pGC->fgPixel;
pGC->bgPixel = ~pGC->bgPixel;
ALU = EGC_AND_MODE;
break;
case GXnoop:
return 0;
case GXxor:
ALU = EGC_XOR_MODE;
break;
case GXor:
ALU = EGC_OR_MODE;
break;
case GXnor:
ALU = EGC_OR_INV_MODE;
break;
case GXequiv:
pGC->fgPixel = ~pGC->fgPixel;
pGC->bgPixel = ~pGC->bgPixel;
ALU = EGC_XOR_MODE;
break;
case GXinvert:
pGC->fgPixel = 0x0F;
pGC->bgPixel = 0x0F;
ALU = EGC_XOR_MODE;
break;
case GXorReverse:
pGC->fgPixel = ~pGC->fgPixel;
pGC->bgPixel = ~pGC->bgPixel;
ALU = EGC_AND_INV_MODE;
break;
case GXcopyInverted:
pGC->fgPixel = ~pGC->fgPixel;
pGC->bgPixel = ~pGC->bgPixel;
ALU = EGC_COPY_MODE;
break;
case GXorInverted:
pGC->fgPixel = ~pGC->fgPixel;
pGC->bgPixel = ~pGC->bgPixel;
ALU = EGC_OR_MODE;
break;
case GXnand:
ALU = EGC_OR_INV_MODE;
break;
case GXset:
pGC->fgPixel = 0x0F;
pGC->bgPixel = 0x0F;
ALU = EGC_COPY_MODE;
break;
}
outw(EGC_PLANE, ~(pGC->planemask & VGA_ALLPLANES));
outw(EGC_MODE, ALU);
outw(EGC_FGC, pGC->fgPixel & VGA_ALLPLANES);
return 0;
#endif
}