コード例 #1
0
Bool 
MGAHWCursorInit(ScreenPtr pScreen)
{
    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
    MGAPtr pMga = MGAPTR(pScrn);
    MGARamdacPtr MGAdac = &pMga->Dac;
    xf86CursorInfoPtr infoPtr;

    if (!MGAdac->isHwCursor) 
        return FALSE;

    infoPtr = xf86CreateCursorInfoRec();
    if(!infoPtr) return FALSE;
    
    pMga->CursorInfoRec = infoPtr;

    infoPtr->MaxWidth = MGAdac->CursorMaxWidth;
    infoPtr->MaxHeight = MGAdac->CursorMaxHeight;
    infoPtr->Flags = MGAdac->CursorFlags;
    infoPtr->SetCursorColors = MGAdac->SetCursorColors;
    infoPtr->SetCursorPosition = MGAdac->SetCursorPosition;
    infoPtr->LoadCursorImage = MGAdac->LoadCursorImage;
    infoPtr->HideCursor = MGAdac->HideCursor;
    infoPtr->ShowCursor = MGAdac->ShowCursor;
    infoPtr->UseHWCursor = MGAdac->UseHWCursor;

    return(xf86InitCursor(pScreen, infoPtr));
}
コード例 #2
0
ファイル: mga_video.c プロジェクト: shanelle794/theqvd
static int
MGASetPortAttributeOverlay(
    ScrnInfoPtr pScrn,
    Atom attribute,
    INT32 value,
    pointer data
) {
    MGAPtr pMga = MGAPTR(pScrn);
    MGAPortPrivPtr pPriv = pMga->portPrivate;

    CHECK_DMA_QUIESCENT(pMga, pScrn);

    if(attribute == xvBrightness) {
        if((value < -128) || (value > 127))
            return BadValue;
        pPriv->brightness = value;
        OUTREG(MGAREG_BESLUMACTL, ((pPriv->brightness & 0xff) << 16) |
               (pPriv->contrast & 0xff));
    } else if(attribute == xvContrast) {
        if((value < 0) || (value > 255))
            return BadValue;
        pPriv->contrast = value;
        OUTREG(MGAREG_BESLUMACTL, ((pPriv->brightness & 0xff) << 16) |
               (pPriv->contrast & 0xff));
    } else if(attribute == xvColorKey) {
        pPriv->colorKey = value;
        outMGAdac(0x55, (pPriv->colorKey & pScrn->mask.red) >>
                  pScrn->offset.red);
        outMGAdac(0x56, (pPriv->colorKey & pScrn->mask.green) >>
                  pScrn->offset.green);
        outMGAdac(0x57, (pPriv->colorKey & pScrn->mask.blue) >>
                  pScrn->offset.blue);
        REGION_EMPTY(pScrn->pScreen, &pPriv->clip);
    } else if(attribute == xvDoubleBuffer) {
コード例 #3
0
ファイル: mga_video.c プロジェクト: shanelle794/theqvd
static void
MGAStopVideo(ScrnInfoPtr pScrn, pointer data, Bool shutdown)
{
    MGAPtr pMga = MGAPTR(pScrn);
    MGAPortPrivPtr pPriv = pMga->portPrivate;

    if(pMga->TexturedVideo) return;

    REGION_EMPTY(pScrn->pScreen, &pPriv->clip);

    if(shutdown) {
        if(pPriv->videoStatus & CLIENT_VIDEO_ON)
            OUTREG(MGAREG_BESCTL, 0);
        if(pPriv->linear) {
            xf86FreeOffscreenLinear(pPriv->linear);
            pPriv->linear = NULL;
        }
        pPriv->videoStatus = 0;
    } else {
        if(pPriv->videoStatus & CLIENT_VIDEO_ON) {
            pPriv->videoStatus |= OFF_TIMER;
            pPriv->offTime = currentTime.milliseconds + OFF_DELAY;
        }
    }
}
コード例 #4
0
ファイル: mga_video.c プロジェクト: shanelle794/theqvd
void MGAInitVideo(ScreenPtr pScreen)
{
    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
    XF86VideoAdaptorPtr *adaptors, *newAdaptors = NULL;
    XF86VideoAdaptorPtr newAdaptor = NULL;
    MGAPtr pMga = MGAPTR(pScrn);
    int num_adaptors;

    if((pScrn->bitsPerPixel != 8) && !pMga->NoAccel &&
            (pMga->SecondCrtc == FALSE) &&
            ((pMga->Chipset == PCI_CHIP_MGAG200) ||
             (pMga->Chipset == PCI_CHIP_MGAG200_PCI) ||
             (pMga->Chipset == PCI_CHIP_MGAG400) ||
             (pMga->Chipset == PCI_CHIP_MGAG550)))
    {
        if((pMga->Overlay8Plus24 || pMga->TexturedVideo) &&
                (pScrn->bitsPerPixel != 24))
        {
            xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using texture video\n");
            newAdaptor = MGASetupImageVideoTexture(pScreen);
            pMga->TexturedVideo = TRUE;
        } else {
            xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using overlay video\n");
            newAdaptor = MGASetupImageVideoOverlay(pScreen);
            pMga->TexturedVideo = FALSE;
        }
        if(!pMga->Overlay8Plus24)
            MGAInitOffscreenImages(pScreen);
    }

    num_adaptors = xf86XVListGenericAdaptors(pScrn, &adaptors);

    if(newAdaptor) {
        if(!num_adaptors) {
            num_adaptors = 1;
            adaptors = &newAdaptor;
        } else {
            newAdaptors =  /* need to free this someplace */
                xalloc((num_adaptors + 1) * sizeof(XF86VideoAdaptorPtr*));
            if(newAdaptors) {
                memcpy(newAdaptors, adaptors, num_adaptors *
                       sizeof(XF86VideoAdaptorPtr));
                newAdaptors[num_adaptors] = newAdaptor;
                adaptors = newAdaptors;
                num_adaptors++;
            }
        }
    }

    if(num_adaptors)
        xf86XVScreenInit(pScreen, adaptors, num_adaptors);

    if(newAdaptors)
        xfree(newAdaptors);
}
void
MGAG200SERestoreMode(ScrnInfoPtr scrninfp, vgaRegPtr restore)
{
    vgaHWPtr hwp = VGAHWPTR(scrninfp);
    MGAPtr pMga = MGAPTR(scrninfp);
    int i;
    unsigned char scrn;

    if (restore->MiscOutReg & 0x01)
    hwp->IOBase = VGA_IOBASE_COLOR;
    else
    hwp->IOBase = VGA_IOBASE_MONO;

    hwp->writeMiscOut(hwp, restore->MiscOutReg);


    for (i = 1; i < restore->numSequencer; i++)
    {
    MGAWAITVSYNC();
    MGAWAITBUSY();
	hwp->writeSeq(hwp, i, restore->Sequencer[i]);
	usleep(20000);
    }

    scrn = hwp->readSeq(hwp, 0x01);
    scrn |= 0x20;/* blank screen */
    vgaHWSeqReset(hwp, TRUE);
    MGAWAITVSYNC();
    MGAWAITBUSY();
    hwp->writeSeq(hwp, 0x01, scrn);/* change mode */
    usleep(20000);

    /* Ensure CRTC registers 0-7 are unlocked by clearing bit 7 of CRTC[17] */
    hwp->writeCrtc(hwp, 17, restore->CRTC[17] & ~0x80);

    for (i = 0; i < restore->numCRTC; i++)
	hwp->writeCrtc(hwp, i, restore->CRTC[i]);

    for (i = 0; i < restore->numGraphics; i++)
    hwp->writeGr(hwp, i, restore->Graphics[i]);

    hwp->enablePalette(hwp);
    for (i = 0; i < restore->numAttribute; i++)
    hwp->writeAttr(hwp, i, restore->Attribute[i]);
    hwp->disablePalette(hwp);

    MGAWAITVSYNC();
    MGAWAITBUSY();
	hwp->writeSeq(hwp, 1, restore->Sequencer[1]);
    usleep(20000);
}
コード例 #6
0
ファイル: mga_video.c プロジェクト: shanelle794/theqvd
static XF86VideoAdaptorPtr
MGASetupImageVideoOverlay(ScreenPtr pScreen)
{
    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
    MGAPtr pMga = MGAPTR(pScrn);
    XF86VideoAdaptorPtr adapt;

    adapt = MGAAllocAdaptor(pScrn, TRUE);

    adapt->type = XvWindowMask | XvInputMask | XvImageMask;
    adapt->flags = VIDEO_OVERLAID_IMAGES | VIDEO_CLIP_TO_VIEWPORT;
    adapt->name = "Matrox G-Series Backend Scaler";
    adapt->nEncodings = 1;
    adapt->pEncodings = &DummyEncoding[0];
    adapt->nFormats = NUM_FORMATS;
    adapt->pFormats = Formats;
    adapt->nPorts = 1;
    adapt->pAttributes = Attributes;
    if (pMga->Chipset == PCI_CHIP_MGAG400 ||
            pMga->Chipset == PCI_CHIP_MGAG550) {
        adapt->nImages = 4;
        adapt->nAttributes = 4;
    } else {
        adapt->nImages = 3;
        adapt->nAttributes = 1;
    }
    adapt->pImages = Images;
    adapt->PutVideo = NULL;
    adapt->PutStill = NULL;
    adapt->GetVideo = NULL;
    adapt->GetStill = NULL;
    adapt->StopVideo = MGAStopVideo;
    adapt->SetPortAttribute = MGASetPortAttributeOverlay;
    adapt->GetPortAttribute = MGAGetPortAttributeOverlay;
    adapt->QueryBestSize = MGAQueryBestSize;
    adapt->PutImage = MGAPutImage;
    adapt->QueryImageAttributes = MGAQueryImageAttributes;

    /* gotta uninit this someplace */
    REGION_INIT(pScreen, &(pMga->portPrivate->clip), NullBox, 0);

    MGAResetVideoOverlay(pScrn);

    return adapt;
}
コード例 #7
0
ファイル: mga_video.c プロジェクト: shanelle794/theqvd
static XF86VideoAdaptorPtr
MGAAllocAdaptor(ScrnInfoPtr pScrn, Bool doublebuffer)
{
    XF86VideoAdaptorPtr adapt;
    MGAPtr pMga = MGAPTR(pScrn);
    MGAPortPrivPtr pPriv;
    int i;

    if(!(adapt = xf86XVAllocateVideoAdaptorRec(pScrn)))
        return NULL;

    if(!(pPriv = xcalloc(1, sizeof(MGAPortPrivRec) +
                         (sizeof(DevUnion) * MGA_MAX_PORTS))))
    {
        xfree(adapt);
        return NULL;
    }

    adapt->pPortPrivates = (DevUnion*)(&pPriv[1]);

    for(i = 0; i < MGA_MAX_PORTS; i++)
        adapt->pPortPrivates[i].val = i;

    xvBrightness = MAKE_ATOM("XV_BRIGHTNESS");
    xvContrast   = MAKE_ATOM("XV_CONTRAST");
    xvColorKey   = MAKE_ATOM("XV_COLORKEY");
    xvDoubleBuffer = MAKE_ATOM("XV_DOUBLE_BUFFER");

    pPriv->colorKey = pMga->videoKey;
    pPriv->videoStatus = 0;
    pPriv->brightness = 0;
    pPriv->contrast = 128;
    pPriv->lastPort = -1;
    pPriv->doubleBuffer = doublebuffer;
    pPriv->currentBuffer = 0;

    pMga->adaptor = adapt;
    pMga->portPrivate = pPriv;

    return adapt;
}
void
MGAG200SEHWProtect(ScrnInfoPtr pScrn, Bool on)
{
  vgaHWPtr hwp = VGAHWPTR(pScrn);
  MGAPtr pMga = MGAPTR(pScrn);
  
  unsigned char tmp;
  
  if (pScrn->vtSema) {
    if (on) {
      /*
       * Turn off screen and disable sequencer.
       */
      tmp = hwp->readSeq(hwp, 0x01);

      vgaHWSeqReset(hwp, TRUE);         /* start synchronous reset */
      MGAWAITVSYNC();
      MGAWAITBUSY();
      hwp->writeSeq(hwp, 0x01, tmp | 0x20); /* disable the display */
      usleep(20000);
      hwp->enablePalette(hwp);
    } else {
      /*
       * Reenable sequencer, then turn on screen.
       */
  
      tmp = hwp->readSeq(hwp, 0x01);

      MGAWAITVSYNC();
      MGAWAITBUSY();
      hwp->writeSeq(hwp, 0x01, tmp & ~0x20);    /* reenable display */
      usleep(20000);
      vgaHWSeqReset(hwp, FALSE);        /* clear synchronousreset */

      hwp->disablePalette(hwp);
    }
  }
}
コード例 #9
0
ファイル: mga_video.c プロジェクト: shanelle794/theqvd
static XF86VideoAdaptorPtr
MGASetupImageVideoTexture(ScreenPtr pScreen)
{
    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
    XF86VideoAdaptorPtr adapt;
    MGAPtr pMga = MGAPTR(pScrn);

    adapt = MGAAllocAdaptor(pScrn, FALSE);

    adapt->type = XvWindowMask | XvInputMask | XvImageMask;
    adapt->flags = 0;
    adapt->name = "Matrox G-Series Texture Engine";
    adapt->nEncodings = 1;
    adapt->pEncodings = &DummyEncoding[1];
    adapt->nFormats = NUM_FORMATS;
    adapt->pFormats = Formats;
    adapt->nPorts = MGA_MAX_PORTS;
    adapt->pAttributes = NULL;
    adapt->nAttributes = 0;
    adapt->pImages = Images;
    if (pMga->Chipset == PCI_CHIP_MGAG400 ||
            pMga->Chipset == PCI_CHIP_MGAG550)
        adapt->nImages = 4;
    else
        adapt->nImages = 3;
    adapt->PutVideo = NULL;
    adapt->PutStill = NULL;
    adapt->GetVideo = NULL;
    adapt->GetStill = NULL;
    adapt->StopVideo = MGAStopVideo;
    adapt->SetPortAttribute = MGASetPortAttributeTexture;
    adapt->GetPortAttribute = MGAGetPortAttributeTexture;
    adapt->QueryBestSize = MGAQueryBestSize;
    adapt->PutImage = MGAPutImage;
    adapt->QueryImageAttributes = MGAQueryImageAttributes;

    return adapt;
}
コード例 #10
0
ファイル: mga_video.c プロジェクト: shanelle794/theqvd
static void
MGAResetVideoOverlay(ScrnInfoPtr pScrn)
{
    MGAPtr pMga = MGAPTR(pScrn);
    MGAPortPrivPtr pPriv = pMga->portPrivate;

    CHECK_DMA_QUIESCENT(pMga, pScrn);

    outMGAdac(0x51, 0x01); /* keying on */
    outMGAdac(0x52, 0xff); /* full mask */
    outMGAdac(0x53, 0xff);
    outMGAdac(0x54, 0xff);

    outMGAdac(0x55, (pPriv->colorKey & pScrn->mask.red) >>
              pScrn->offset.red);
    outMGAdac(0x56, (pPriv->colorKey & pScrn->mask.green) >>
              pScrn->offset.green);
    outMGAdac(0x57, (pPriv->colorKey & pScrn->mask.blue) >>
              pScrn->offset.blue);

    OUTREG(MGAREG_BESLUMACTL, ((pPriv->brightness & 0xff) << 16) |
           (pPriv->contrast & 0xff));
}
void
MGAG200SERestoreFonts(ScrnInfoPtr scrninfp, vgaRegPtr restore)
{
    vgaHWPtr hwp = VGAHWPTR(scrninfp);
    MGAPtr pMga = MGAPTR(scrninfp);
    int savedIOBase;
    unsigned char miscOut, attr10, gr1, gr3, gr4, gr5, gr6, gr8, seq2, seq4;
    Bool doMap = FALSE;
    unsigned char scrn;

    /* If nothing to do, return now */
    if (!hwp->FontInfo1 && !hwp->FontInfo2 && !hwp->TextInfo)
	return;

    if (hwp->Base == NULL) {
	doMap = TRUE;
	if (!vgaHWMapMem(scrninfp)) {
	    xf86DrvMsg(scrninfp->scrnIndex, X_ERROR,
		    "vgaHWRestoreFonts: vgaHWMapMem() failed\n");
	    return;
	}
    }

    /* save the registers that are needed here */
    miscOut = hwp->readMiscOut(hwp);
    attr10 = hwp->readAttr(hwp, 0x10);
    gr1 = hwp->readGr(hwp, 0x01);
    gr3 = hwp->readGr(hwp, 0x03);
    gr4 = hwp->readGr(hwp, 0x04);
    gr5 = hwp->readGr(hwp, 0x05);
    gr6 = hwp->readGr(hwp, 0x06);
    gr8 = hwp->readGr(hwp, 0x08);
    seq2 = hwp->readSeq(hwp, 0x02);
    seq4 = hwp->readSeq(hwp, 0x04);

    /* save hwp->IOBase and temporarily set it for colour mode */
    savedIOBase = hwp->IOBase;
    hwp->IOBase = VGA_IOBASE_COLOR;

    /* Force into colour mode */
    hwp->writeMiscOut(hwp, miscOut | 0x01);

    scrn = hwp->readSeq(hwp, 0x01);
    scrn |= 0x20;/* blank screen */
    vgaHWSeqReset(hwp, TRUE);
    MGAWAITVSYNC();
    MGAWAITBUSY();
    hwp->writeSeq(hwp, 0x01, scrn);/* change mode */
    usleep(20000);
    vgaHWSeqReset(hwp, FALSE);

    /*
     * here we temporarily switch to 16 colour planar mode, to simply
     * copy the font-info and saved text.
     *
     * BUG ALERT: The (S)VGA's segment-select register MUST be set correctly!
     */
#if 0
    hwp->writeAttr(hwp, 0x10, 0x01);   /* graphics mode */
#endif
    if (scrninfp->depth == 4) {
	/* GJA */
	hwp->writeGr(hwp, 0x03, 0x00);  /* don't rotate, write unmodified */
	hwp->writeGr(hwp, 0x08, 0xFF);  /* write all bits in a byte */
	hwp->writeGr(hwp, 0x01, 0x00);  /* all planes come from CPU */
    }

    hwp->writeSeq(hwp, 0x04, 0x06); /* enable plane graphics */
    hwp->writeGr(hwp, 0x05, 0x00);  /* write mode 0, read mode 0 */
    hwp->writeGr(hwp, 0x06, 0x05);  /* set graphics */

    if (hwp->FontInfo1) {
	hwp->writeSeq(hwp, 0x02, 0x04); /* write to plane 2 */
	hwp->writeGr(hwp, 0x04, 0x02);  /* read plane 2 */
	slowbcopy_tobus(hwp->FontInfo1, hwp->Base, FONT_AMOUNT);
    }

    if (hwp->FontInfo2) {
	hwp->writeSeq(hwp, 0x02, 0x08); /* write to plane 3 */
	hwp->writeGr(hwp, 0x04, 0x03);  /* read plane 3 */
	slowbcopy_tobus(hwp->FontInfo2, hwp->Base, FONT_AMOUNT);
    }

    if (hwp->TextInfo) {
	hwp->writeSeq(hwp, 0x02, 0x01); /* write to plane 0 */
	hwp->writeGr(hwp, 0x04, 0x00);  /* read plane 0 */
	slowbcopy_tobus(hwp->TextInfo, hwp->Base, TEXT_AMOUNT);
	hwp->writeSeq(hwp, 0x02, 0x02); /* write to plane 1 */
	hwp->writeGr(hwp, 0x04, 0x01);  /* read plane 1 */
	slowbcopy_tobus((unsigned char *)hwp->TextInfo + TEXT_AMOUNT,
		hwp->Base, TEXT_AMOUNT);
    }

    /* restore the registers that were changed */
    hwp->writeMiscOut(hwp, miscOut);
    hwp->writeAttr(hwp, 0x10, attr10);
    hwp->writeGr(hwp, 0x01, gr1);
    hwp->writeGr(hwp, 0x03, gr3);
    hwp->writeGr(hwp, 0x04, gr4);
    hwp->writeGr(hwp, 0x05, gr5);
    hwp->writeGr(hwp, 0x06, gr6);
    hwp->writeGr(hwp, 0x08, gr8);
    hwp->writeSeq(hwp, 0x02, seq2);
    hwp->writeSeq(hwp, 0x04, seq4);
    hwp->IOBase = savedIOBase;

    scrn = hwp->readSeq(hwp, 0x01);
    scrn &= ~0x20;/* enable screen */
    vgaHWSeqReset(hwp, TRUE);
    MGAWAITVSYNC();
    MGAWAITBUSY();
    hwp->writeSeq(hwp, 0x01, scrn);/* change mode */
    usleep(20000);
    vgaHWSeqReset(hwp, FALSE);

    if (doMap)
	vgaHWUnmapMem(scrninfp);
}
void
MGAG200SESaveFonts(ScrnInfoPtr scrninfp, vgaRegPtr save)
{
    vgaHWPtr hwp = VGAHWPTR(scrninfp);
    MGAPtr pMga = MGAPTR(scrninfp);
    int savedIOBase;
    unsigned char miscOut, attr10, gr4, gr5, gr6, seq2, seq4;
    Bool doMap = FALSE;
    unsigned char scrn;

    if (hwp->Base == NULL) {
	doMap = TRUE;
	if (!vgaHWMapMem(scrninfp)) {
	    xf86DrvMsg(scrninfp->scrnIndex, X_ERROR,
		    "vgaHWSaveFonts: vgaHWMapMem() failed\n");
	    return;
	}
    }

    /* If in graphics mode, don't save anything */
    attr10 = hwp->readAttr(hwp, 0x10);
    if (attr10 & 0x01)
	return;

    /* save the registers that are needed here */
    miscOut = hwp->readMiscOut(hwp);
    gr4 = hwp->readGr(hwp, 0x04);
    gr5 = hwp->readGr(hwp, 0x05);
    gr6 = hwp->readGr(hwp, 0x06);
    seq2 = hwp->readSeq(hwp, 0x02);
    seq4 = hwp->readSeq(hwp, 0x04);

    /* save hwp->IOBase and temporarily set it for colour mode */
    savedIOBase = hwp->IOBase;
    hwp->IOBase = VGA_IOBASE_COLOR;

    /* Force into colour mode */
    hwp->writeMiscOut(hwp, miscOut | 0x01);

    scrn = hwp->readSeq(hwp, 0x01);
    scrn |= 0x20;/* blank screen */
    vgaHWSeqReset(hwp, TRUE);
    MGAWAITVSYNC();
    MGAWAITBUSY();
    hwp->writeSeq(hwp, 0x01, scrn);/* change mode */
    usleep(20000);
    vgaHWSeqReset(hwp, FALSE);

    /*
     * get the character sets, and text screen if required
     */
    /*
     * Here we temporarily switch to 16 colour planar mode, to simply
     * copy the font-info
     *
     * BUG ALERT: The (S)VGA's segment-select register MUST be set correctly!
     */
#if 0
    hwp->writeAttr(hwp, 0x10, 0x01);   /* graphics mode */
#endif
    hwp->writeSeq(hwp, 0x04, 0x06); /* enable plane graphics */
    hwp->writeGr(hwp, 0x05, 0x00);  /* write mode 0, read mode 0 */
    hwp->writeGr(hwp, 0x06, 0x05);  /* set graphics */
    if (hwp->FontInfo1 || (hwp->FontInfo1 = malloc(FONT_AMOUNT))) {
	hwp->writeSeq(hwp, 0x02, 0x04); /* write to plane 2 */
	hwp->writeGr(hwp, 0x04, 0x02);  /* read plane 2 */
	slowbcopy_frombus(hwp->Base, hwp->FontInfo1, FONT_AMOUNT);
    }
    if (hwp->FontInfo2 || (hwp->FontInfo2 = malloc(FONT_AMOUNT))) {
	hwp->writeSeq(hwp, 0x02, 0x08); /* write to plane 3 */
	hwp->writeGr(hwp, 0x04, 0x03);  /* read plane 3 */
	slowbcopy_frombus(hwp->Base, hwp->FontInfo2, FONT_AMOUNT);
    }
    if (hwp->TextInfo || (hwp->TextInfo = malloc(2 * TEXT_AMOUNT))) {
	hwp->writeSeq(hwp, 0x02, 0x01); /* write to plane 0 */
	hwp->writeGr(hwp, 0x04, 0x00);  /* read plane 0 */
	slowbcopy_frombus(hwp->Base, hwp->TextInfo, TEXT_AMOUNT);
	hwp->writeSeq(hwp, 0x02, 0x02); /* write to plane 1 */
	hwp->writeGr(hwp, 0x04, 0x01);  /* read plane 1 */
	slowbcopy_frombus(hwp->Base,
		(unsigned char *)hwp->TextInfo + TEXT_AMOUNT, TEXT_AMOUNT);
    }

    /* Restore clobbered registers */
    hwp->writeAttr(hwp, 0x10, attr10);
    hwp->writeGr(hwp, 0x04, gr4);
    hwp->writeGr(hwp, 0x05, gr5);
    hwp->writeGr(hwp, 0x06, gr6);
    hwp->writeSeq(hwp, 0x02, seq2);
    hwp->writeSeq(hwp, 0x04, seq4);
    hwp->writeMiscOut(hwp, miscOut);
    hwp->IOBase = savedIOBase;

    scrn = hwp->readSeq(hwp, 0x01);
    scrn &= ~0x20;/* enable screen */
    vgaHWSeqReset(hwp, TRUE);
    MGAWAITVSYNC();
    MGAWAITBUSY();
    hwp->writeSeq(hwp, 0x01, scrn);/* change mode */
    usleep(20000);
    vgaHWSeqReset(hwp, FALSE);

    if (doMap)
	vgaHWUnmapMem(scrninfp);
}