diff options
author | Kaleb Keithley <kaleb@freedesktop.org> | 2003-11-14 16:48:57 +0000 |
---|---|---|
committer | Kaleb Keithley <kaleb@freedesktop.org> | 2003-11-14 16:48:57 +0000 |
commit | 9508a382f8a9f241dab097d921b6d290c1c3a776 (patch) | |
tree | fa456480bae7040c3f971a70b390f2d091c680b5 /hw/xfree86/xf4bpp/wm3.c | |
parent | ded6147bfb5d75ff1e67c858040a628b61bc17d1 (diff) |
Initial revision
Diffstat (limited to 'hw/xfree86/xf4bpp/wm3.c')
-rw-r--r-- | hw/xfree86/xf4bpp/wm3.c | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/hw/xfree86/xf4bpp/wm3.c b/hw/xfree86/xf4bpp/wm3.c new file mode 100644 index 000000000..3509ce77f --- /dev/null +++ b/hw/xfree86/xf4bpp/wm3.c @@ -0,0 +1,207 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/xf4bpp/wm3.c,v 1.4 2002/01/25 21:56:23 tsi Exp $ */ + + + + + +/* $XConsortium: wm3.c /main/5 1996/02/21 17:59:21 kaleb $ */ + +#include "xf4bpp.h" +#include "OScompiler.h" +#include "wm3.h" +#include "vgaVideo.h" +#include "xf86.h" + +/* Ferraro is wrong. GJA */ +#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: /* rop0 = RROP_BLACK; rop1 = RROP_BLACK; */ + pGC->fgPixel = 0; + pGC->bgPixel = 0; + ALU = COPY; + break; + case GXand: /* rop0 = RROP_BLACK; rop1 = RROP_NOP; */ + ALU = AND; + break; + case GXandReverse: /* rop0 = RROP_BLACK; rop1 = RROP_INVERT; -- TRICKY */ + pGC->fgPixel = ~pGC->fgPixel; + pGC->bgPixel = ~pGC->bgPixel; + ALU = OR; + post_invert = 1; + break; + case GXcopy: /* rop0 = RROP_BLACK; rop1 = RROP_WHITE; */ + ALU = COPY; + break; + case GXandInverted: /* rop0 = RROP_NOP; rop1 = RROP_BLACK; */ + pGC->fgPixel = ~pGC->fgPixel; + pGC->bgPixel = ~pGC->bgPixel; + ALU = AND; + break; + default: + case GXnoop: /* rop0 = RROP_NOP; rop1 = RROP_NOP; */ + return 0; + case GXxor: /* rop0 = RROP_NOP; rop1 = RROP_INVERT; */ + ALU = XOR; + break; + case GXor: /* rop0 = RROP_NOP; rop1 = RROP_WHITE; */ + ALU = OR; + break; + case GXnor: /* rop0 = RROP_INVERT; rop1 = RROP_BLACK; -- TRICKY*/ + ALU = OR; + post_invert = 1; + break; + case GXequiv: /* rop0 = RROP_INVERT; rop1 = RROP_NOP; */ + pGC->fgPixel = ~pGC->fgPixel; + pGC->bgPixel = ~pGC->bgPixel; + ALU = XOR; + break; + case GXinvert: /* rop0 = RROP_INVERT; rop1 = RROP_INVERT; */ + pGC->fgPixel = 0x0F; + pGC->bgPixel = 0x0F; + ALU = XOR; + break; + case GXorReverse: /* rop0 = RROP_INVERT; rop1 = RROP_WHITE; -- TRICKY */ + pGC->fgPixel = ~pGC->fgPixel; + pGC->bgPixel = ~pGC->bgPixel; + ALU = AND; + post_invert = 1; + break; + case GXcopyInverted: /* rop0 = RROP_WHITE; rop1 = RROP_BLACK; */ + pGC->fgPixel = ~pGC->fgPixel; + pGC->bgPixel = ~pGC->bgPixel; + ALU = COPY; + break; + case GXorInverted: /* rop0 = RROP_WHITE; rop1 = RROP_NOP; */ + pGC->fgPixel = ~pGC->fgPixel; + pGC->bgPixel = ~pGC->bgPixel; + ALU = OR; + break; + case GXnand: /* rop0 = RROP_WHITE; rop1 = RROP_INVERT; -- TRICKY */ + ALU = AND; + post_invert = 1; + break; + case GXset: /* rop0 = RROP_WHITE; rop1 = RROP_WHITE; */ + 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); /* Write Mode 3 */ + SetVideoGraphics(Data_RotateIndex, ALU); + + return post_invert; +#else + int ALU; + + switch(pGC->alu) { + case GXclear: /* rop0 = RROP_BLACK; rop1 = RROP_BLACK; */ + pGC->fgPixel = 0; + pGC->bgPixel = 0; + ALU = EGC_COPY_MODE; + break; + case GXand: /* rop0 = RROP_BLACK; rop1 = RROP_NOP; */ + ALU = EGC_AND_MODE; + break; + case GXandReverse: /* rop0 = RROP_BLACK; rop1 = RROP_INVERT; -- TRICKY */ + pGC->fgPixel = ~pGC->fgPixel; + pGC->bgPixel = ~pGC->bgPixel; + ALU = EGC_OR_INV_MODE; + break; + case GXcopy: /* rop0 = RROP_BLACK; rop1 = RROP_WHITE; */ + ALU = EGC_COPY_MODE; + break; + case GXandInverted: /* rop0 = RROP_NOP; rop1 = RROP_BLACK; */ + pGC->fgPixel = ~pGC->fgPixel; + pGC->bgPixel = ~pGC->bgPixel; + ALU = EGC_AND_MODE; + break; + case GXnoop: /* rop0 = RROP_NOP; rop1 = RROP_NOP; */ + return 0; + case GXxor: /* rop0 = RROP_NOP; rop1 = RROP_INVERT; */ + ALU = EGC_XOR_MODE; + break; + case GXor: /* rop0 = RROP_NOP; rop1 = RROP_WHITE; */ + ALU = EGC_OR_MODE; + break; + case GXnor: /* rop0 = RROP_INVERT; rop1 = RROP_BLACK; -- TRICKY*/ + ALU = EGC_OR_INV_MODE; + break; + case GXequiv: /* rop0 = RROP_INVERT; rop1 = RROP_NOP; */ + pGC->fgPixel = ~pGC->fgPixel; + pGC->bgPixel = ~pGC->bgPixel; + ALU = EGC_XOR_MODE; + break; + case GXinvert: /* rop0 = RROP_INVERT; rop1 = RROP_INVERT; */ + pGC->fgPixel = 0x0F; + pGC->bgPixel = 0x0F; + ALU = EGC_XOR_MODE; + break; + case GXorReverse: /* rop0 = RROP_INVERT; rop1 = RROP_WHITE; -- TRICKY */ + pGC->fgPixel = ~pGC->fgPixel; + pGC->bgPixel = ~pGC->bgPixel; + ALU = EGC_AND_INV_MODE; + break; + case GXcopyInverted: /* rop0 = RROP_WHITE; rop1 = RROP_BLACK; */ + pGC->fgPixel = ~pGC->fgPixel; + pGC->bgPixel = ~pGC->bgPixel; + ALU = EGC_COPY_MODE; + break; + case GXorInverted: /* rop0 = RROP_WHITE; rop1 = RROP_NOP; */ + pGC->fgPixel = ~pGC->fgPixel; + pGC->bgPixel = ~pGC->bgPixel; + ALU = EGC_OR_MODE; + break; + case GXnand: /* rop0 = RROP_WHITE; rop1 = RROP_INVERT; -- TRICKY */ + ALU = EGC_OR_INV_MODE; + break; + case GXset: /* rop0 = RROP_WHITE; rop1 = RROP_WHITE; */ + 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); /* set FGC */ + + return 0; +#endif +} + +/* + Now we will have to set the alu. + Problematic is: How do we handle IsDoubleDash, which draws with both fg + and bg colour? + The answer is: We take care to store the ink colour in one register only. + Then we need set only this register to change the ink. + */ + +/* -- MORE NOTES: + We might try to 'wrap' the mfb functions in a 16-colour wrapper that does + all operations once. However, this does not work: + Some operations (esp) CopyArea may for example cause expositions. + Such expositions will cause data to be copied in from backing store, + and this copying in may damage the contents of the VGA registers. + So we must take care to set the VGA registers at each place where they could + be modified. + */ |