PVGA on X386-1.1a

Serge Vakulenko vak at relcom.kiae.su
Fri Mar 22 23:58:27 AEST 1991


In <1991Mar13.173923.18698 at colorado.edu> jennings at cs.Colorado.EDU (Jeff Jennings) writes:

>My friend is trying to run the X386 server on his Interactive machine with
>a Paradise OEM card.  In Roell's announcement he says PVGA support is one of
>the new features of this release.  My friend gets the same behavior as before,
>that is, a series of images (4 or 5) running from the lower left to upper 
>right on his screen.  So he gets several images of the same xterm, several
>mouse cursors that all move together, etc.  Has anyone been able to make this
>work with a PVGA card?  From what he described, I think he installed it 
>correctly, although I haven't checked his machine personally to make sure.
>Thanks for any help or info.

Here is corecct driver for PVGA1A.  It works well on Western Digital and
Paradise chip sets.  Place it in directory mit/server/ddx/at386/vga/pvga1a,
then rebuild server.

Please, send all questions to Serge Vakulenko, <vak at kiae.su>.

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of shell archive."
# Contents:  Imakefile driver.c bank.s
# Wrapped by vak at jee on Fri Mar 22 21:39:16 1991
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f Imakefile -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"Imakefile\"
else
echo shar: Extracting \"Imakefile\" \(470 characters\)
sed "s/^X//" >Imakefile <<'END_OF_Imakefile'
X#include <Server.tmpl>
X
XSRCS = driver.c bank.s
X
XOBJS = driver.o bank.o
X
XINCLUDES = -I. -I.. -I../.. -I../../../mfb -I../../../mi \
X	   -I../../../../include -I$(INCLUDESRC)
X
X#if DebugServer && ProfileServer
XDebuggedAndProfiledLibraryObjectRule()
X#else
X# if DebugServer
XDebuggedLibraryObjectRule()
X# else
X#  if ProfileServer
XProfiledLibraryObjectRule()
X#  else
XNormalLibraryObjectRule()
X#  endif
X# endif
X#endif
X
X
XNormalRelocatableTarget(Driver, $(OBJS))
X
XDependTarget()
X
END_OF_Imakefile
if test 470 -ne `wc -c <Imakefile`; then
    echo shar: \"Imakefile\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f driver.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"driver.c\"
else
echo shar: Extracting \"driver.c\" \(6835 characters\)
sed "s/^X//" >driver.c <<'END_OF_driver.c'
X/*
X * Copyright 1990 by Thomas Roell, Dinkelscherben, Germany.
X *
X * Permission to use, copy, modify, distribute, and sell this software and its
X * documentation for any purpose is hereby granted without fee, provided that
X * the above copyright notice appear in all copies and that both that
X * copyright notice and this permission notice appear in supporting
X * documentation, and that the name of Thomas Roell not be used in
X * advertising or publicity pertaining to distribution of the software without
X * specific, written prior permission.  Thomas Roell makes no representations
X * about the suitability of this software for any purpose.  It is provided
X * "as is" without express or implied warranty.
X *
X * THOMAS ROELL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
X * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
X * EVENT SHALL THOMAS ROELL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
X * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
X * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
X * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
X * PERFORMANCE OF THIS SOFTWARE.
X *
X * Author:  Thomas Roell, roell at lan.informatik.tu-muenchen.de
X *
X * $Header: /proj/X11/mit/server/ddx/at386/vga/pvga1a/RCS/driver.c,v 1.4 90/12/16 19:07:18 root Exp $
X */
X
X
X#include "X386.h"
X#include "vga.h"
X
Xtypedef struct {
X  vgaHWRec std;          /* std IBM VGA register */
X  unchar PR0A;           /* paradise special */
X  unchar PR0B;
X  unchar PR1;
X  unchar PR2;
X  unchar PR3;
X  unchar PR4;
X  unchar PR5;
X  unchar Clock1;
X  unchar Clock2;
X  } vgaPVGA1ARec, *vgaPVGA1APtr;
X
Xstatic void     PVGA1AInit();
Xstatic void *   PVGA1ASave();
Xstatic void     PVGA1ARestore();
Xstatic void     PVGA1AAdjust();
Xextern void     PVGA1ASetRead();
Xextern void     PVGA1ASetWrite();
Xextern void     PVGA1ASetReadWrite();
X
X
XvgaVideoChipRec PVGA1A = {
X  PVGA1AInit,
X  PVGA1ASave,
X  PVGA1ARestore,
X  PVGA1AAdjust,
X  PVGA1ASetRead,
X  PVGA1ASetWrite,
X  PVGA1ASetReadWrite,
X  0x10000,
X  0x08000,
X  15,
X  0x7FFF,
X  0x00000, 0x08000,
X  0x08000, 0x10000,
X};
X
X
X/*
X *-----------------------------------------------------------------------
X * PVGA1ARestore --
X *      restore a video mode
X *
X * Results:
X *      nope.
X *
X * Side Effects: 
X *      the display enters a new graphics mode. 
X *
X *-----------------------------------------------------------------------
X */
Xvoid
XPVGA1ARestore(restore)
X     vgaPVGA1APtr restore;
X{
X  TRACE( ("PVGA1ARestore(restore=0x%x)\n",restore) );
X
X  outb(0x3CE, 0x0F); outb(0x3CF, 0x05);   /* unlock paradises special */
X  outb(0x3CE, 0x0D); outb(0x3CF, 0x00);
X  outb(0x3CE, 0x09); outb(0x3CF, 0x00);   /* segment select */
X  outb(0x3CE, 0x0A); outb(0x3CF, 0x00);   /* segment select */
X
X  vgaHWRestore(restore);
X
X  outb(0x3CE, 0x0F); outb(0x3CF, 0x05);   /* unlock paradises special */
X  outb(0x3CE, 0x09); outb(0x3CF, restore->PR0A);
X  outb(0x3CE, 0x0a); outb(0x3CF, restore->PR0B);
X  outb(0x3CE, 0x0b); outb(0x3CF, restore->PR1);
X  outb(0x3CE, 0x0c); outb(0x3CF, restore->PR2);
X  outb(0x3CE, 0x0d); outb(0x3CF, restore->PR3);
X  outb(0x3CE, 0x0e); outb(0x3CF, restore->PR4);
X  outb(0x3CE, 0x0f); outb(0x3CF, restore->PR5);
X
X  outb(0x3d4, 0x2d); outb(0x3d5, restore->Clock1);
X  outb(0x3d4, 0x2e); outb(0x3d5, restore->Clock2);
X  outb(0x3d4, 0x2f); outb(0x3d5, 0);      /* unlock some important register */
X
X  outb(0x3C4, 0x00); outb(0x3C5, 0x03); /* now reenable the timing sequencer */
X}
X
X/*
X *-----------------------------------------------------------------------
X * PVGA1ASave --
X *      save the current video mode
X *
X * Results:
X *      pointer to the current mode record.
X *
X * Side Effects: 
X *      None.
X *-----------------------------------------------------------------------
X */
Xvoid *
XPVGA1ASave(save)
X     vgaPVGA1APtr save;
X{
X  unchar areg, breg;
X
X  TRACE( ("PVGA1ASave(save=0x%x)\n",save) );
X
X  outb(0x3CE, 0x0F); outb(0x3CF, 0x05);   /* unlock paradises special */
X  outb(0x3CE, 0x0D); outb(0x3CF, 0x00);
X  outb(0x3CE, 0x09); areg = inb(0x3CF);
X  outb(0x3CE, 0x0A); breg = inb(0x3CF);
X  outb(0x3CE, 0x09); outb(0x3CF, 0x00);   /* segment select */
X  outb(0x3CE, 0x0A); outb(0x3CF, 0x00);   /* segment select */
X
X  save = (vgaPVGA1APtr)vgaHWSave(save, sizeof(vgaPVGA1ARec));
X
X  save->PR0A = areg;
X  save->PR0B = breg;
X  outb(0x3CE, 0x0F); outb(0x3CF, 0x05);   /* unlock paradises special */
X  outb(0x3CE, 0x0B); save->PR1 = inb(0x3CF);
X  outb(0x3CE, 0x0C); save->PR2 = inb(0x3CF);
X  outb(0x3CE, 0x0E); save->PR4 = inb(0x3CF);
X  save->PR3 = 0x00;
X  save->PR5 = 0x05;
X
X  outb(0x3d4, 0x2d); save->Clock1 = inb(0x3d5);
X  outb(0x3d4, 0x2e); save->Clock2 = inb(0x3d5);
X  
X  return ((void *) save);
X}
X
X
X/*
X *-----------------------------------------------------------------------
X * PVGA1AInit --
X *      Handle the initialization, etc. of a screen.
X *
X * Results:
X *      pointer to the new mode record.
X *
X * Side Effects: 
X *
X *-----------------------------------------------------------------------
X */
Xvoid
XPVGA1AInit(mode)
X     vgaModePtr mode;
X{
X  TRACE( ("PVGA1AInit(mode=0x%x)\n",mode) );
X
X#define new ((vgaPVGA1APtr)vgaNewVideoState)
X  
X  vgaHWInit(mode,sizeof(vgaPVGA1ARec));
X
X  new->std.CRTC[19] = X386Screen.VirtualX >> 3; /* we are in byte-mode ... */
X  new->std.CRTC[20] = 0x40;
X  new->std.CRTC[23] = 0xE3; /* thats what the man says */
X  new->std.Graphics[6] = 5;
X  new->PR0A = 0x00;
X  new->PR0B = 0x00;
X  new->PR1 = 0x8e;
X  new->PR2 = 0x00;
X  new->PR3 = 0x00;
X  new->PR4 = 0x01;
X  new->PR5 = 0x05;
X
X  new->Clock1 = (new->std.NoClock & 4) ? 0x20 : 0;
X  new->Clock2 = (new->std.NoClock & 8) ? 0x10 : 0;
X
X#ifdef notdef
X  {
X    int i;
X    
X    ErrorF("Misc(%2x)\n",new->std.MiscOutReg);
X    ErrorF("CRTC\n");
X    for (i=0; i<25; i++) ErrorF("%2x, ",new->std.CRTC[i]);
X    ErrorF("\n\nSequencer\n");
X    for (i=0; i<5; i++) ErrorF("%2x, ",new->std.Sequencer[i]);
X    ErrorF("\n\nGraphics\n");
X    for (i=0; i<9; i++) ErrorF("%2x, ",new->std.Graphics[i]);
X    ErrorF("\n\nAttribute\n");
X    for (i=0; i<21; i++) ErrorF("%2x, ",new->std.Attribute[i]);
X    ErrorF("\n\n\n");
X  }
X#endif
X
X}
X	
X
X/*
X *-----------------------------------------------------------------------
X * PVGA1AAdjust --
X *      adjust the current video frame to display the mousecursor
X *
X * Results:
X *      nope.
X *
X * Side Effects: 
X *      the display scrolls
X *-----------------------------------------------------------------------
X */
Xvoid 
XPVGA1AAdjust()
X{
X  int Base;
X  unchar temp;
X
X  TRACE( ("PVGA1AAdjust()\n") );
X  
X  Base = (X386Screen.FrameY0 * X386Screen.VirtualX +X386Screen.FrameX0) >>2;
X  
X  outb(vgaIOBase + 0x04, 0x0C); outb(vgaIOBase + 0x05, (Base & 0x00FF00) >>8);
X  outb(vgaIOBase + 0x04, 0x0D); outb(vgaIOBase + 0x05, Base & 0x00FF);
X  outb(0x3CE, 0x0D); temp=inb(0x3CF); 
X  outb(0x3CF, ((Base & 0x030000) >> 13) | (temp & 0xE7));
X}
END_OF_driver.c
if test 6835 -ne `wc -c <driver.c`; then
    echo shar: \"driver.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f bank.s -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"bank.s\"
else
echo shar: Extracting \"bank.s\" \(3163 characters\)
sed "s/^X//" >bank.s <<'END_OF_bank.s'
X/*
X * Copyright 1990 by Thomas Roell, Dinkelscherben, Germany.
X *
X * Permission to use, copy, modify, distribute, and sell this software and its
X * documentation for any purpose is hereby granted without fee, provided that
X * the above copyright notice appear in all copies and that both that
X * copyright notice and this permission notice appear in supporting
X * documentation, and that the name of Thomas Roell not be used in
X * advertising or publicity pertaining to distribution of the software without
X * specific, written prior permission.  Thomas Roell makes no representations
X * about the suitability of this software for any purpose.  It is provided
X * "as is" without express or implied warranty.
X *
X * THOMAS ROELL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
X * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
X * EVENT SHALL THOMAS ROELL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
X * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
X * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
X * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
X * PERFORMANCE OF THIS SOFTWARE.
X *
X * Author:  Thomas Roell, roell at lan.informatik.tu-muenchen.de
X *
X * $Header: /proj/X11/mit/server/ddx/at386/vga/pvga1a/RCS/bank.s,v 1.4 90/12/16 19:07:15 root Exp $
X */
X
X
X/*
X * These are here the very lowlevel VGA bankswitching routines.
X * The segment to switch to is passed via %eax. Only %eax and %edx my be used
X * without saving the original contents.
X *
X * WHY ASSEMBLY LANGUAGE ???
X *
X * These routines must be callable by other assembly routines. But I don't
X * want to have the overhead of pushing and poping the normal stack-frame.
X */
X
X/*
X * what happens really here ?
X *
X * PRA and PRB are segmentpointers to out two segments. They have a granularity
X * of 4096. That means we have to multiply the segmentnumber with 16, if we are
X * working with 64k segment. But since PRA and PRB are 'indexed' registers, the
X * index must be emitted first. This is accomplished by loading %al with the 
X * index and %ah with the value. Therefor we must shift the logical segment-
X * number by 12.
X * Another quirk is PRB. It's physical VGA mapping starts at 0xA0000, but it is
X * only visible starting form 0xB0000 to 0xBFFFF. That means PRB has to be
X * loaded with a value that points to the previous logical segment.
X */
X
X	.text
X
X/* 
X * for ReadWrite operations, we are using only PR0A as pointer to a 32k
X * window.
X */
X	.align 4
X	.globl PVGA1ASetReadWrite
XPVGA1ASetReadWrite:
X	decl	%eax
X	shll    $11,%eax
X	movb	$9,%al
X	movl	$0x3ce,%edx
X	outb	(%dx)
X	movb	%ah,%al
X	incl	%edx
X	outb	(%dx)
X	ret
X
X/* 
X * for Write operations, we are using PR0A as write pointer to a 32k
X * window.
X */
X	.align 4
X	.globl PVGA1ASetWrite
XPVGA1ASetWrite:
X	decl	%eax
X	shll    $11,%eax
X	movb	$9,%al
X	movl	$0x3ce,%edx
X	outb	(%dx)
X	movb	%ah,%al
X	incl	%edx
X	outb	(%dx)
X	ret
X
X/* 
X * for Read operations, we are using PR0B as read pointer to a 32k
X * window.
X */
X	.align 4
X	.globl PVGA1ASetRead
XPVGA1ASetRead:
X	shll    $11,%eax
X	movb	$10,%al
X	movl	$0x3ce,%edx
X	outb	(%dx)
X	movb	%ah,%al
X	incl	%edx
X	outb	(%dx)
X	ret
END_OF_bank.s
if test 3163 -ne `wc -c <bank.s`; then
    echo shar: \"bank.s\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of shell archive.
exit 0



More information about the Comp.unix.sysv386 mailing list