removed MGA driver from DMesa

This commit is contained in:
Daniel Borca
2004-02-07 10:56:13 +00:00
parent d039b43e30
commit 54447772d5
8 changed files with 0 additions and 3036 deletions
-395
View File
@@ -1,395 +0,0 @@
/*
* Mesa 3-D graphics library
* Version: 5.0
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
/*
* DOS/DJGPP device driver v1.4 for Mesa -- MGA2064W triangle template
*
* Copyright (c) 2003 - Borca Daniel
* Email : dborca@yahoo.com
* Web : http://www.geocities.com/dborca
*/
/*
* Triangle Rasterizer Template
*
* This file is #include'd to generate custom triangle rasterizers.
*
* The following macros may be defined to indicate what auxillary information
* must be interplated across the triangle:
* INTERP_Z - if defined, interpolate Z values
* INTERP_RGB - if defined, interpolate RGB values
*
* TAG - function name
* CULL - enable culling for: 0=no, 1=back, -1=front
*
* SETUP_CODE - to be executed once per triangle (usually HW init)
*
* For flatshaded primitives, the provoking vertex is the final one.
* This code was designed for the origin to be in the upper-left corner.
*
* Inspired by triangle rasterizer code written by Brian Paul.
*/
#define TRI_SWAP(a, b) \
do { \
const MGAvertex *tmp = a; \
a = b; \
b = tmp; \
} while (0)
void TAG (int cull, const MGAvertex *v1, const MGAvertex *v2, const MGAvertex *v3)
{
int area;
int x1, y1, x2, y2, x3, y3;
int eMaj_dx, eMaj_dy, eBot_dx, eBot_dy, eTop_dx, eTop_dy;
#ifdef INTERP_RGB
#define FIFO_CNT_RGB 3
int eMaj_dr, eBot_dr, eMaj_dg, eBot_dg, eMaj_db, eBot_db;
int drdx, drdy, dgdx, dgdy, dbdx, dbdy;
#else
#define FIFO_CNT_RGB 0
#endif
#ifdef INTERP_Z
#define FIFO_CNT_Z 1
int dzdx, dzdy;
int eMaj_dz, eBot_dz;
int z1, z2, z3;
#else
#define FIFO_CNT_Z 0
#endif
#if defined(INTERP_Z) || defined(INTERP_RGB)
#if !LONG_LONG
double one_area;
#endif
#ifndef INTERP_RGB
int red = v3->color[0];
int green = v3->color[1];
int blue = v3->color[2];
#endif
#else
unsigned long color = mga_mixrgb_full(v3->color);
#endif
int sgn = 0;
/* sort along the vertical axis */
if (v2->win[1] < v1->win[1]) {
TRI_SWAP(v1, v2);
#ifdef CULL
cull = -cull;
#endif
}
if (v3->win[1] < v1->win[1]) {
TRI_SWAP(v1, v3);
TRI_SWAP(v2, v3);
} else if (v3->win[1] < v2->win[1]) {
TRI_SWAP(v2, v3);
#ifdef CULL
cull = -cull;
#endif
}
x1 = v1->win[0];
y1 = v1->win[1];
x2 = v2->win[0];
y2 = v2->win[1];
x3 = v3->win[0];
y3 = v3->win[1];
/* compute deltas for each edge */
eMaj_dx = x3 - x1;
eMaj_dy = y3 - y1;
eBot_dx = x2 - x1;
eBot_dy = y2 - y1;
eTop_dx = x3 - x2;
eTop_dy = y3 - y2;
/* compute area */
if ((area = eMaj_dx * eBot_dy - eBot_dx * eMaj_dy) == 0) {
return;
}
#ifdef CULL
if ((area * cull) > 0) {
return;
}
#endif
mga_select();
/* set engine state */
#ifdef SETUP_CODE
SETUP_CODE
#endif
/* draw lower triangle */
#if defined(INTERP_Z) || defined(INTERP_RGB)
#if !LONG_LONG
one_area = (double)(1<<15) / (double)area;
#endif
mga_fifo(1);
#else
mga_fifo(2);
mga_outl(M_FCOL, color);
#endif
mga_outl(M_YDST, y1);
#ifdef INTERP_Z
z1 = v1->win[2];
z2 = v2->win[2];
z3 = v3->win[2];
/* compute d?/dx and d?/dy derivatives */
eMaj_dz = z3 - z1;
eBot_dz = z2 - z1;
#if !LONG_LONG
dzdx = (eMaj_dz * eBot_dy - eMaj_dy * eBot_dz) * one_area;
dzdy = (eMaj_dx * eBot_dz - eMaj_dz * eBot_dx) * one_area;
#else
dzdx = ((long long)(eMaj_dz * eBot_dy - eMaj_dy * eBot_dz)<<15) / area;
dzdy = ((long long)(eMaj_dx * eBot_dz - eMaj_dz * eBot_dx)<<15) / area;
#endif
#ifndef INTERP_RGB
mga_fifo(11);
mga_outl(M_DR2, dzdx);
mga_outl(M_DR3, dzdy);
mga_outl(M_DR4, red<<15);
mga_outl(M_DR6, 0);
mga_outl(M_DR7, 0);
mga_outl(M_DR8, green<<15);
mga_outl(M_DR10, 0);
mga_outl(M_DR11, 0);
mga_outl(M_DR12, blue<<15);
mga_outl(M_DR14, 0);
mga_outl(M_DR15, 0);
#else
mga_fifo(2);
mga_outl(M_DR2, dzdx);
mga_outl(M_DR3, dzdy);
#endif
#endif
#ifdef INTERP_RGB
/* compute color deltas */
eMaj_dr = v3->color[0] - v1->color[0];
eBot_dr = v2->color[0] - v1->color[0];
eMaj_dg = v3->color[1] - v1->color[1];
eBot_dg = v2->color[1] - v1->color[1];
eMaj_db = v3->color[2] - v1->color[2];
eBot_db = v2->color[2] - v1->color[2];
/* compute color increments */
#if !LONG_LONG
drdx = (eMaj_dr * eBot_dy - eMaj_dy * eBot_dr) * one_area;
drdy = (eMaj_dx * eBot_dr - eMaj_dr * eBot_dx) * one_area;
dgdx = (eMaj_dg * eBot_dy - eMaj_dy * eBot_dg) * one_area;
dgdy = (eMaj_dx * eBot_dg - eMaj_dg * eBot_dx) * one_area;
dbdx = (eMaj_db * eBot_dy - eMaj_dy * eBot_db) * one_area;
dbdy = (eMaj_dx * eBot_db - eMaj_db * eBot_dx) * one_area;
#else
drdx = ((long long)(eMaj_dr * eBot_dy - eMaj_dy * eBot_dr)<<15) / area;
drdy = ((long long)(eMaj_dx * eBot_dr - eMaj_dr * eBot_dx)<<15) / area;
dgdx = ((long long)(eMaj_dg * eBot_dy - eMaj_dy * eBot_dg)<<15) / area;
dgdy = ((long long)(eMaj_dx * eBot_dg - eMaj_dg * eBot_dx)<<15) / area;
dbdx = ((long long)(eMaj_db * eBot_dy - eMaj_dy * eBot_db)<<15) / area;
dbdy = ((long long)(eMaj_dx * eBot_db - eMaj_db * eBot_dx)<<15) / area;
#endif
mga_fifo(6);
mga_outl(M_DR6, drdx);
mga_outl(M_DR7, drdy);
mga_outl(M_DR10, dgdx);
mga_outl(M_DR11, dgdy);
mga_outl(M_DR14, dbdx);
mga_outl(M_DR15, dbdy);
#endif
if (area > 0) { /* major edge on the right */
if (eBot_dy) { /* have lower triangle */
mga_fifo(9 + FIFO_CNT_Z + FIFO_CNT_RGB);
mga_outl(M_AR0, eBot_dy);
if (x2 < x1) {
mga_outl(M_AR1, eBot_dx + eBot_dy - 1);
mga_outl(M_AR2, eBot_dx);
sgn |= M_SDXL;
} else {
mga_outl(M_AR1, -eBot_dx);
mga_outl(M_AR2, -eBot_dx);
}
mga_outl(M_AR6, eMaj_dy);
if (x3 < x1) {
mga_outl(M_AR4, eMaj_dx + eMaj_dy - 1);
mga_outl(M_AR5, eMaj_dx);
sgn |= M_SDXR;
} else {
mga_outl(M_AR4, -eMaj_dx);
mga_outl(M_AR5, -eMaj_dx);
}
mga_outl(M_FXBNDRY, (x1<<16) | x1);
#ifdef INTERP_Z
mga_outl(M_DR0, z1<<15);
#endif
#ifdef INTERP_RGB
mga_outl(M_DR4, v1->color[0]<<15);
mga_outl(M_DR8, v1->color[1]<<15);
mga_outl(M_DR12, v1->color[2]<<15);
#endif
mga_outl(M_SGN, sgn);
mga_outl(M_LEN | M_EXEC, eBot_dy);
} else { /* no lower triangle */
mga_fifo(4 + FIFO_CNT_Z + FIFO_CNT_RGB);
mga_outl(M_AR6, eMaj_dy);
if (x3 < x1) {
mga_outl(M_AR4, eMaj_dx + eMaj_dy - 1);
mga_outl(M_AR5, eMaj_dx);
sgn |= M_SDXR;
} else {
mga_outl(M_AR4, -eMaj_dx);
mga_outl(M_AR5, -eMaj_dx);
}
mga_outl(M_FXBNDRY, (x1<<16) | x2);
#ifdef INTERP_Z
mga_outl(M_DR0, z2<<15);
#endif
#ifdef INTERP_RGB
mga_outl(M_DR4, v2->color[0]<<15);
mga_outl(M_DR8, v2->color[1]<<15);
mga_outl(M_DR12, v2->color[2]<<15);
#endif
}
/* draw upper triangle */
if (eTop_dy) {
mga_fifo(5);
mga_outl(M_AR0, eTop_dy);
if (x3 < x2) {
mga_outl(M_AR1, eTop_dx + eTop_dy - 1);
mga_outl(M_AR2, eTop_dx);
sgn |= M_SDXL;
} else {
mga_outl(M_AR1, -eTop_dx);
mga_outl(M_AR2, -eTop_dx);
sgn &= ~M_SDXL;
}
mga_outl(M_SGN, sgn);
mga_outl(M_LEN | M_EXEC, eTop_dy);
}
} else { /* major edge on the left */
if (eBot_dy) { /* have lower triangle */
mga_fifo(9 + FIFO_CNT_Z + FIFO_CNT_RGB);
mga_outl(M_AR0, eMaj_dy);
if (x3 < x1) {
mga_outl(M_AR1, eMaj_dx + eMaj_dy - 1);
mga_outl(M_AR2, eMaj_dx);
sgn |= M_SDXL;
} else {
mga_outl(M_AR1, -eMaj_dx);
mga_outl(M_AR2, -eMaj_dx);
}
mga_outl(M_AR6, eBot_dy);
if (x2 < x1) {
mga_outl(M_AR4, eBot_dx + eBot_dy - 1);
mga_outl(M_AR5, eBot_dx);
sgn |= M_SDXR;
} else {
mga_outl(M_AR4, -eBot_dx);
mga_outl(M_AR5, -eBot_dx);
}
mga_outl(M_FXBNDRY, (x1<<16) | x1);
#ifdef INTERP_Z
mga_outl(M_DR0, z1<<15);
#endif
#ifdef INTERP_RGB
mga_outl(M_DR4, v1->color[0]<<15);
mga_outl(M_DR8, v1->color[1]<<15);
mga_outl(M_DR12, v1->color[2]<<15);
#endif
mga_outl(M_SGN, sgn);
mga_outl(M_LEN | M_EXEC, eBot_dy);
} else { /* no lower triangle */
mga_fifo(4 + FIFO_CNT_Z + FIFO_CNT_RGB);
mga_outl(M_AR0, eMaj_dy);
if (x3 < x1) {
mga_outl(M_AR1, eMaj_dx + eMaj_dy - 1);
mga_outl(M_AR2, eMaj_dx);
sgn |= M_SDXL;
} else {
mga_outl(M_AR1, -eMaj_dx);
mga_outl(M_AR2, -eMaj_dx);
}
mga_outl(M_FXBNDRY, (x2<<16) | x1);
#ifdef INTERP_Z
mga_outl(M_DR0, z1<<15);
#endif
#ifdef INTERP_RGB
mga_outl(M_DR4, v1->color[0]<<15);
mga_outl(M_DR8, v1->color[1]<<15);
mga_outl(M_DR12, v1->color[2]<<15);
#endif
}
/* draw upper triangle */
if (eTop_dy) {
mga_fifo(5);
mga_outl(M_AR6, eTop_dy);
if (x3 < x2) {
mga_outl(M_AR4, eTop_dx + eTop_dy - 1);
mga_outl(M_AR5, eTop_dx);
sgn |= M_SDXR;
} else {
mga_outl(M_AR4, -eTop_dx);
mga_outl(M_AR5, -eTop_dx);
sgn &= ~M_SDXR;
}
mga_outl(M_SGN, sgn);
mga_outl(M_LEN | M_EXEC, eTop_dy);
}
}
}
#undef FIFO_CNT_RGB
#undef FIFO_CNT_Z
#undef TRI_SWAP
#undef SETUP_CODE
#undef INTERP_RGB
#undef INTERP_Z
#undef CULL
#undef TAG
File diff suppressed because it is too large Load Diff
-91
View File
@@ -1,91 +0,0 @@
/*
* Mesa 3-D graphics library
* Version: 5.0
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
/*
* DOS/DJGPP device driver v1.3 for Mesa -- MGA2064W
*
* Copyright (c) 2003 - Borca Daniel
* Email : dborca@yahoo.com
* Web : http://www.geocities.com/dborca
*/
#ifndef MGA_H_included
#define MGA_H_included
#define MGA_GET_CARD_NAME 0x0100
#define MGA_GET_VRAM 0x0101
#define MGA_GET_CI_PREC 0x0200
#define MGA_GET_HPIXELS 0x0201
#define MGA_GET_SCREEN_SIZE 0x0202
int mga_open (int width, int height, int bpp, int buffers, int zbuffer, int refresh);
void mga_clear (int front, int back, int zed, int left, int top, int width, int height, int color, unsigned short z);
int mga_get (int pname, int *params);
void mga_close (int restore, int unmap);
extern void (*mga_putpixel) (unsigned int offset, int color);
extern int (*mga_getpixel) (unsigned int offset);
extern void (*mga_getrgba) (unsigned int offset, unsigned char rgba[4]);
extern int (*mga_mixrgb) (const unsigned char rgb[]);
#define MGA_BACKBUFFER !0
#define MGA_FRONTBUFFER 0
void mga_set_readbuffer (int buffer);
void mga_set_writebuffer (int buffer);
void mga_swapbuffers (int swapinterval);
unsigned short mga_getz (int offset);
void mga_setz (int offset, unsigned short z);
void mga_wait_idle (void);
/*
* vertex structure, used for primitive rendering
*/
typedef struct {
int win[4]; /* X, Y, Z, ? */
unsigned char color[4]; /* R, G, B, A */
} MGAvertex;
void mga_draw_line_rgb_flat (const MGAvertex *v1, const MGAvertex *v2);
void mga_draw_line_rgb_flat_zless (const MGAvertex *v1, const MGAvertex *v2);
void mga_draw_line_rgb_iter (const MGAvertex *v1, const MGAvertex *v2);
void mga_draw_line_rgb_iter_zless (const MGAvertex *v1, const MGAvertex *v2);
void mga_draw_tri_rgb_flat (int cull, const MGAvertex *v1, const MGAvertex *v2, const MGAvertex *v3);
void mga_draw_tri_rgb_flat_zless (int cull, const MGAvertex *v1, const MGAvertex *v2, const MGAvertex *v3);
void mga_draw_tri_rgb_iter (int cull, const MGAvertex *v1, const MGAvertex *v2, const MGAvertex *v3);
void mga_draw_tri_rgb_iter_zless (int cull, const MGAvertex *v1, const MGAvertex *v2, const MGAvertex *v3);
void mga_draw_rect_rgb_flat (int left, int top, int width, int height, int color);
void mga_draw_rect_rgb_tx32 (int left, int top, int width, int height, const unsigned long *bitmap);
void mga_draw_rect_rgb_tx24 (int left, int top, int width, int height, const unsigned long *bitmap);
void mga_draw_span_rgb_tx32 (int left, int top, int width, const unsigned long *bitmap);
void mga_draw_span_rgb_tx24 (int left, int top, int width, const unsigned long *bitmap);
void mga_iload_32RGB (int left, int top, int width, int height, const unsigned long *bitmap);
void mga_iload_24RGB (int left, int top, int width, int height, const unsigned long *bitmap);
#endif
-416
View File
@@ -1,416 +0,0 @@
/*
* Mesa 3-D graphics library
* Version: 5.0
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
/*
* DOS/DJGPP device driver v1.4 for Mesa -- MGA2064W HW mapping
*
* Copyright (c) 2003 - Borca Daniel
* Email : dborca@yahoo.com
* Web : http://www.geocities.com/dborca
*/
#include <crt0.h>
#include <dpmi.h>
#include <pc.h>
#include <string.h>
#include <sys/nearptr.h>
#include <sys/segments.h>
#include "../internal.h"
#include "mga_reg.h"
#include "mga_hw.h"
/* Hack alert:
* these should really be externs
*/
/* PCI access routines */
static int pci_find_device (int deviceID, int vendorID, int deviceIndex, int *handle);
static unsigned long pci_read_long (int handle, int index);
static void pci_write_long (int handle, int index, unsigned long value);
/* PCI device identifiers */
#define MATROX_VENDOR_ID 0x102B
typedef enum {
MATROX_MILL_ID = 0x0519
} MATROX_ID;
static MATROX_ID matrox_id_list[] = {
MATROX_MILL_ID,
0
};
/* internal hardware data structures */
#if !MGA_FARPTR
static int dirty;
#endif
static int bus_id;
static unsigned long reg40;
static unsigned long io_mem_base[4], linear_base;
static unsigned long io_mem_size[4], linear_size;
static MATROX_ID matrox_id;
/* interface structures containing hardware pointer data */
MGA_HWPTR mgaptr;
/* Desc: create MMAP
*
* In :
* Out :
*
* Note:
*/
static int _create_mmap (__dpmi_paddr *m, unsigned long base, unsigned long size)
{
#if MGA_FARPTR
int sel;
if (_create_selector(&sel, base, size)) {
return -1;
}
m->selector = sel;
m->offset32 = 0;
#else
m->selector = _my_ds();
if (_create_linear_mapping(&m->offset32, base, size)) {
return -1;
}
m->offset32 -= __djgpp_base_address;
#endif
return 0;
}
/* Desc: destroy MMAP
*
* In :
* Out :
*
* Note:
*/
static void _destroy_mmap (__dpmi_paddr *m)
{
#if MGA_FARPTR
int sel = m->selector;
_remove_selector(&sel);
#else
m->offset32 += __djgpp_base_address;
_remove_linear_mapping(&m->offset32);
#endif
m->selector = 0;
m->offset32 = 0;
}
/* Desc: Counts amount of installed RAM
*
* In :
* Out :
*
* Note:
*/
static int _mga_get_vram (MATROX_ID chip, unsigned long base)
{
int ProbeSize = 8;
int SizeFound = 2;
unsigned char tmp;
int i;
__dpmi_paddr fb;
switch (chip) {
case MATROX_MILL_ID:
ProbeSize = 8;
break;
}
if (_create_mmap(&fb, base, ProbeSize*1024*1024)) {
return 0;
}
/* turn MGA mode on - enable linear frame buffer (CRTCEXT3) */
mga_select();
mga_outb(M_CRTC_EXT_INDEX, 3);
tmp = mga_inb(M_CRTC_EXT_DATA);
mga_outb(M_CRTC_EXT_DATA, tmp | M_MGAMODE);
/* write, read and compare method */
for (i=ProbeSize; i>2; i-= 2) {
hwptr_pokeb(fb, i*1024*1024 - 1, 0xAA);
mga_select();
mga_outb(M_CRTC_INDEX, 0); /* flush the cache */
mga_inl(M_STATUS); /* delay */
mga_inl(M_STATUS); /* delay */
mga_inl(M_STATUS); /* delay */
if (hwptr_peekb(fb, i*1024*1024 - 1) == 0xAA) {
SizeFound = i;
break;
}
}
/* restore CRTCEXT3 state */
mga_select();
mga_outb(M_CRTC_EXT_INDEX, 3);
mga_outb(M_CRTC_EXT_DATA, tmp);
_destroy_mmap(&fb);
return SizeFound*1024*1024;
}
/* Desc: Frees all resources allocated by MGA init code.
*
* In :
* Out :
*
* Note:
*/
void mga_hw_fini (void)
{
int i;
pci_write_long(bus_id, 0x40, reg40);
for (i=0; i<4; i++) {
_destroy_mmap(&mgaptr.io_mem_map[i]);
}
_destroy_mmap(&mgaptr.linear_map);
#if !MGA_FARPTR
if (dirty) {
__djgpp_nearptr_disable();
dirty = FALSE;
}
#endif
matrox_id = 0;
}
/* Desc: Attempts to detect MGA.
*
* In :
* Out :
*
* Note: The first thing ever to be called. This is in charge of filling in
* the driver header with all the required information and function
* pointers. We do not yet have access to the video memory, so we can't
* talk directly to the card.
*/
int mga_hw_init (unsigned long *vram, int *interleave, char *name)
{
int i;
unsigned long pci_base[2];
if (matrox_id) {
return matrox_id;
}
#if !MGA_FARPTR
/* enable nearptr access */
if (_crt0_startup_flags & _CRT0_FLAG_NEARPTR) {
dirty = FALSE;
} else {
if (__djgpp_nearptr_enable() == 0)
return 0;
dirty = TRUE;
}
#endif
/* find PCI device */
matrox_id = 0;
for (bus_id=0, i=0; matrox_id_list[i]; i++) {
if (pci_find_device(matrox_id_list[i], MATROX_VENDOR_ID, 0, &bus_id)) {
matrox_id = matrox_id_list[i];
break;
}
}
/* set up the card name */
switch (matrox_id) {
case MATROX_MILL_ID:
if (name) strcpy(name, "Millennium");
break;
default:
matrox_id = 0;
return -1;
}
reg40 = pci_read_long(bus_id, 0x40);
#if 0 /* overclock a little :) */
{
int rfhcnt = (reg40 >> 16) & 0xF;
if ((reg40 & 0x200000) && (rfhcnt < 0xC)) {
pci_write_long(bus_id, 0x40, (reg40 & 0xFFF0FFFF) | 0x000C0000);
}
}
#endif
/* read hardware configuration data */
for (i=0; i<2; i++)
pci_base[i] = pci_read_long(bus_id, 16+i*4);
/* work out the linear framebuffer and MMIO addresses */
if (matrox_id == MATROX_MILL_ID) {
if (pci_base[0])
io_mem_base[0] = pci_base[0] & 0xFFFFC000;
if (pci_base[1])
linear_base = pci_base[1] & 0xFF800000;
}
if (!linear_base || !io_mem_base[0])
return 0;
/* deal with the memory mapping crap */
io_mem_size[0] = 0x4000;
for (i=0; i<4; i++) {
if (io_mem_base[i]) {
if (_create_mmap(&mgaptr.io_mem_map[i], io_mem_base[i], io_mem_size[i])) {
mga_hw_fini();
return 0;
}
}
}
*vram = linear_size = _mga_get_vram(matrox_id, linear_base);
if (_create_mmap(&mgaptr.linear_map, linear_base, linear_size)) {
mga_hw_fini();
return 0;
}
/* fill in user data */
*interleave = linear_size > 2*1024*1024;
return matrox_id;
}
/* PCI routines added by SET */
#define PCIAddr 0xCF8
#define PCIData 0xCFC
#define PCIEnable 0x80000000
/* FindPCIDevice:
* Replacement for the INT 1A - PCI BIOS v2.0c+ - FIND PCI DEVICE, AX = B102h
*
* Note: deviceIndex is because a card can hold more than one PCI chip.
*
* Searches the board of the vendor supplied in vendorID with
* identification number deviceID and index deviceIndex (normally 0).
* The value returned in handle can be used to access the PCI registers
* of this board.
*
* Return: 1 if found 0 if not found.
*/
static int pci_find_device (int deviceID, int vendorID, int deviceIndex, int *handle)
{
int model, vendor, card, device;
unsigned value, full_id, bus, busMax;
deviceIndex <<= 8;
/* for each PCI bus */
for (bus=0, busMax=0x10000; bus<busMax; bus+=0x10000) {
/* for each hardware device */
for (device=0, card=0; card<32; card++, device+=0x800) {
value = PCIEnable | bus | deviceIndex | device;
outportl(PCIAddr, value);
full_id = inportl(PCIData);
/* get the vendor and model ID */
vendor = full_id & 0xFFFF;
model = full_id >> 16;
if (vendor != 0xFFFF) {
/* is this the one we want? */
if ((deviceID == model) && (vendorID == vendor)) {
*handle = value;
return 1;
}
/* is it a bridge to a secondary bus? */
outportl(PCIAddr, value | 8);
if (((inportl(PCIData) >> 16) == 0x0600) || (full_id==0x00011011))
busMax += 0x10000;
}
}
}
return 0;
}
/* Desc:
*
* In :
* Out :
*
* Note:
*/
static unsigned long pci_read_long (int handle, int index)
{
outportl(PCIAddr, PCIEnable | handle | index);
return inportl(PCIData);
}
/* Desc:
*
* In :
* Out :
*
* Note:
*/
static void pci_write_long (int handle, int index, unsigned long value)
{
outportl(PCIAddr, PCIEnable | handle | index);
outportl(PCIData, value);
}
-113
View File
@@ -1,113 +0,0 @@
/*
* Mesa 3-D graphics library
* Version: 5.0
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
/*
* DOS/DJGPP device driver v1.3 for Mesa -- MGA2064W HW mapping
*
* Copyright (c) 2003 - Borca Daniel
* Email : dborca@yahoo.com
* Web : http://www.geocities.com/dborca
*/
#ifndef MGA_HW_included
#define MGA_HW_included
/* set this to zero to use near pointers */
#define MGA_FARPTR 1
/* access macros */
#if MGA_FARPTR
#include <sys/farptr.h>
#define hwptr_pokeb(ptr, off, val) _farpokeb((ptr).selector, (ptr).offset32+(off), (val))
#define hwptr_pokew(ptr, off, val) _farpokew((ptr).selector, (ptr).offset32+(off), (val))
#define hwptr_pokel(ptr, off, val) _farpokel((ptr).selector, (ptr).offset32+(off), (val))
#define hwptr_peekb(ptr, off) _farpeekb((ptr).selector, (ptr).offset32+(off))
#define hwptr_peekw(ptr, off) _farpeekw((ptr).selector, (ptr).offset32+(off))
#define hwptr_peekl(ptr, off) _farpeekl((ptr).selector, (ptr).offset32+(off))
#define hwptr_select(ptr) _farsetsel((ptr).selector)
#define hwptr_unselect(ptr) (ptr).selector = _fargetsel()
#define hwptr_nspokeb(ptr, off, val) _farnspokeb((ptr).offset32+(off), (val))
#define hwptr_nspokew(ptr, off, val) _farnspokew((ptr).offset32+(off), (val))
#define hwptr_nspokel(ptr, off, val) _farnspokel((ptr).offset32+(off), (val))
#define hwptr_nspeekb(ptr, off) _farnspeekb((ptr).offset32+(off))
#define hwptr_nspeekw(ptr, off) _farnspeekw((ptr).offset32+(off))
#define hwptr_nspeekl(ptr, off) _farnspeekl((ptr).offset32+(off))
#else
#define hwptr_pokeb(ptr, off, val) *((volatile unsigned char *)((ptr).offset32+(off))) = (val)
#define hwptr_pokew(ptr, off, val) *((volatile unsigned short *)((ptr).offset32+(off))) = (val)
#define hwptr_pokel(ptr, off, val) *((volatile unsigned long *)((ptr).offset32+(off))) = (val)
#define hwptr_peekb(ptr, off) (*((volatile unsigned char *)((ptr).offset32+(off))))
#define hwptr_peekw(ptr, off) (*((volatile unsigned short *)((ptr).offset32+(off))))
#define hwptr_peekl(ptr, off) (*((volatile unsigned long *)((ptr).offset32+(off))))
#define hwptr_select(ptr)
#define hwptr_unselect(ptr)
#define hwptr_nspokeb(ptr, off, val) *((volatile unsigned char *)((ptr).offset32+(off))) = (val)
#define hwptr_nspokew(ptr, off, val) *((volatile unsigned short *)((ptr).offset32+(off))) = (val)
#define hwptr_nspokel(ptr, off, val) *((volatile unsigned long *)((ptr).offset32+(off))) = (val)
#define hwptr_nspeekb(ptr, off) (*((volatile unsigned char *)((ptr).offset32+(off))))
#define hwptr_nspeekw(ptr, off) (*((volatile unsigned short *)((ptr).offset32+(off))))
#define hwptr_nspeekl(ptr, off) (*((volatile unsigned long *)((ptr).offset32+(off))))
#endif
/* helpers for accessing the Matrox registers */
#define mga_select() hwptr_select(mgaptr.io_mem_map[0])
#define mga_inb(addr) hwptr_nspeekb(mgaptr.io_mem_map[0], addr)
#define mga_inw(addr) hwptr_nspeekw(mgaptr.io_mem_map[0], addr)
#define mga_inl(addr) hwptr_nspeekl(mgaptr.io_mem_map[0], addr)
#define mga_outb(addr, val) hwptr_nspokeb(mgaptr.io_mem_map[0], addr, val)
#define mga_outw(addr, val) hwptr_nspokew(mgaptr.io_mem_map[0], addr, val)
#define mga_outl(addr, val) hwptr_nspokel(mgaptr.io_mem_map[0], addr, val)
typedef struct MGA_HWPTR {
__dpmi_paddr io_mem_map[4], linear_map;
} MGA_HWPTR;
extern MGA_HWPTR mgaptr;
void mga_hw_fini (void);
int mga_hw_init (unsigned long *vram, int *interleave, char *name);
#endif
-231
View File
@@ -1,231 +0,0 @@
/*
* Mesa 3-D graphics library
* Version: 5.0
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
/*
* DOS/DJGPP device driver v1.3 for Mesa -- MGA2064W mode switching
*
* Copyright (c) 2003 - Borca Daniel
* Email : dborca@yahoo.com
* Web : http://www.geocities.com/dborca
*/
#include <dpmi.h>
#include <string.h>
#include <stubinfo.h>
#include <sys/exceptn.h>
#include <sys/farptr.h>
#include <sys/movedata.h>
#include <sys/segments.h>
#include "../internal.h"
#include "mga_mode.h"
static MGA_MODE oldmode;
static MGA_MODE modes[64];
/*
* VESA info
*/
#define V_SIGN 0
#define V_MINOR 4
#define V_MAJOR 5
#define V_OEM_OFS 6
#define V_OEM_SEG 8
#define V_MODE_OFS 14
#define V_MODE_SEG 16
#define V_MEMORY 18
/*
* mode info
*/
#define M_ATTR 0
#define M_GRAN 4
#define M_SCANLEN 16
#define M_XRES 18
#define M_YRES 20
#define M_BPP 25
#define M_RED 31
#define M_GREEN 33
#define M_BLUE 35
#define M_PHYS_PTR 40
/* Desc: get available modes
*
* In : -
* Out : linear modes list ptr
*
* Note: shouldn't use VESA...
*/
static MGA_MODE *_mga_mode_check (void)
{
__dpmi_regs r;
word16 *p;
MGA_MODE *q;
char vesa_info[512], tmp[512];
_farpokel(_stubinfo->ds_selector, 0, 0x32454256);
r.x.ax = 0x4f00;
r.x.di = 0;
r.x.es = _stubinfo->ds_segment;
__dpmi_int(0x10, &r);
movedata(_stubinfo->ds_selector, 0, _my_ds(), (unsigned)vesa_info, 512);
if ((r.x.ax!=0x004f) || ((_32_ vesa_info[V_SIGN])!=0x41534556)) {
return NULL;
}
p = (word16 *)(((_16_ vesa_info[V_MODE_SEG])<<4) + (_16_ vesa_info[V_MODE_OFS]));
q = modes;
do {
if ((q->mode=_farpeekw(__djgpp_dos_sel, (unsigned long)(p++)))==0xffff) {
break;
}
r.x.ax = 0x4f01;
r.x.cx = q->mode;
r.x.di = 512;
r.x.es = _stubinfo->ds_segment;
__dpmi_int(0x10, &r);
movedata(_stubinfo->ds_selector, 512, _my_ds(), (unsigned)tmp, 256);
switch (tmp[M_BPP]) {
case 16:
q->bpp = tmp[M_RED] + tmp[M_GREEN] + tmp[M_BLUE];
break;
case 8:
case 15:
case 24:
case 32:
q->bpp = tmp[M_BPP];
break;
default:
q->bpp = 0;
}
if ((r.x.ax==0x004f) && ((tmp[M_ATTR]&0x11)==0x11) && q->bpp && (tmp[M_ATTR]&0x80)) {
q->xres = _16_ tmp[M_XRES];
q->yres = _16_ tmp[M_YRES];
q->mode |= 0x4000;
q++;
}
} while (TRUE);
return modes;
}
/* Desc: save current mode
*
* In : ptr to mode structure
* Out : 0 if success
*
* Note: shouldn't use VESA...
*/
static int _mga_mode_save (MGA_MODE *p)
{
__asm("\n\
movw $0x4f03, %%ax \n\
int $0x10 \n\
movl %%ebx, %0 \n\
":"=g"(p->mode)::"%eax", "%ebx");
return 0;
}
/* Desc: switch to specified mode
*
* In : ptr to mode structure, refresh rate
* Out : 0 if success
*
* Note: shouldn't use VESA...
*/
int mga_mode_switch (MGA_MODE *p, int refresh)
{
if (oldmode.mode == 0) {
_mga_mode_save(&oldmode);
}
__asm("movw $0x4f02, %%ax; int $0x10"::"b"(p->mode):"%eax");
return 0;
(void)refresh; /* silence compiler warning */
}
/* Desc: restore to the mode prior to first call to `mga_switch'
*
* In : -
* Out : 0 if success
*
* Note: shouldn't use VESA...
*/
int mga_mode_restore (void)
{
if (oldmode.mode != 0) {
__asm("movw $0x4f02, %%ax; int $0x10"::"b"(oldmode.mode):"%eax");
oldmode.mode = 0;
}
return 0;
}
/* Desc: return suitable mode
*
* In : width, height, bpp
* Out : ptr to mode structure
*
* Note: -
*/
MGA_MODE *mga_mode_find (int width, int height, int bpp)
{
static MGA_MODE *q = NULL;
MGA_MODE *p;
unsigned int min;
if (q == NULL) {
if ((q = _mga_mode_check()) == NULL) {
return NULL;
}
}
/* search for a mode that fits our request */
for (min=-1, p=NULL; q->mode!=0xffff; q++) {
if ((q->xres>=width) && (q->yres>=height) && (q->bpp==bpp)) {
if (min>=(unsigned)(q->xres*q->yres)) {
min = q->xres*q->yres;
p = q;
}
}
}
return p;
}
-47
View File
@@ -1,47 +0,0 @@
/*
* Mesa 3-D graphics library
* Version: 5.0
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
/*
* DOS/DJGPP device driver v1.3 for Mesa -- MGA2064W mode switching
*
* Copyright (c) 2003 - Borca Daniel
* Email : dborca@yahoo.com
* Web : http://www.geocities.com/dborca
*/
#ifndef MGA_MODE_included
#define MGA_MODE_included
typedef struct MGA_MODE {
int mode;
int xres, yres;
int bpp;
} MGA_MODE;
int mga_mode_switch (MGA_MODE *p, int refresh);
int mga_mode_restore (void);
MGA_MODE *mga_mode_find (int width, int height, int bpp);
#endif
-207
View File
@@ -1,207 +0,0 @@
/*
* Mesa 3-D graphics library
* Version: 5.0
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
/*
* DOS/DJGPP device driver v1.3 for Mesa -- MGA2064W register mnemonics
*
* Copyright (c) 2003 - Borca Daniel
* Email : dborca@yahoo.com
* Web : http://www.geocities.com/dborca
*/
#ifndef MGA_REG_H_included
#define MGA_REG_H_included
/* Matrox hardware registers: */
#define M_AR0 0x1C60
#define M_AR1 0x1C64
#define M_AR2 0x1C68
#define M_AR3 0x1C6C
#define M_AR4 0x1C70
#define M_AR5 0x1C74
#define M_AR6 0x1C78
#define M_BCOL 0x1C20
#define M_CXBNDRY 0x1C80
#define M_CXLEFT 0x1CA0
#define M_CXRIGHT 0x1CA4
#define M_DR0 0x1CC0
#define M_DR2 0x1CC8
#define M_DR3 0x1CCC
#define M_DR4 0x1CD0
#define M_DR6 0x1CD8
#define M_DR7 0x1CDC
#define M_DR8 0x1CE0
#define M_DR10 0x1CE8
#define M_DR11 0x1CEC
#define M_DR12 0x1CF0
#define M_DR14 0x1CF8
#define M_DR15 0x1CFC
#define M_DWGCTL 0x1C00
#define M_FCOL 0x1C24
#define M_FIFOSTATUS 0x1E10
#define M_FXBNDRY 0x1C84
#define M_FXLEFT 0x1CA8
#define M_FXRIGHT 0x1CAC
#define M_ICLEAR 0x1E18
#define M_IEN 0x1E1C
#define M_LEN 0x1C5C
#define M_MACCESS 0x1C04
#define M_OPMODE 0x1E54
#define M_PAT0 0x1C10
#define M_PAT1 0x1C14
#define M_PITCH 0x1C8C
#define M_PLNWT 0x1C1C
#define M_RESET 0x1E40
#define M_SGN 0x1C58
#define M_SHIFT 0x1C50
#define M_SRC0 0x1C30
#define M_SRC1 0x1C34
#define M_SRC2 0x1C38
#define M_SRC3 0x1C3C
#define M_STATUS 0x1E14
#define M_VCOUNT 0x1E20
#define M_XDST 0x1CB0
#define M_XYEND 0x1C44
#define M_XYSTRT 0x1C40
#define M_YBOT 0x1C9C
#define M_YDST 0x1C90
#define M_YDSTLEN 0x1C88
#define M_YDSTORG 0x1C94
#define M_YTOP 0x1C98
#define M_ZORG 0x1C0C
#define M_EXEC 0x0100
/* DWGCTL: opcod */
#define M_DWG_LINE_OPEN 0x0
#define M_DWG_AUTOLINE_OPEN 0x1
#define M_DWG_LINE_CLOSE 0x2
#define M_DWG_AUTOLINE_CLOSE 0x3
#define M_DWG_TRAP 0x4
#define M_DWG_TEXTURE_TRAP 0x5
#define M_DWG_BITBLT 0x8
#define M_DWG_FBITBLT 0xC
#define M_DWG_ILOAD 0x9
#define M_DWG_ILOAD_SCALE 0xD
#define M_DWG_ILOAD_FILTER 0xF
#define M_DWG_IDUMP 0xA
/* DWGCTL: atype */
#define M_DWG_RPL (0x0 << 4)
#define M_DWG_RSTR (0x1 << 4)
#define M_DWG_ZI (0x3 << 4)
#define M_DWG_BLK (0x4 << 4)
#define M_DWG_I (0x7 << 4)
/* DWGCTL: linear */
#define M_DWG_LINEAR (0x1 << 7)
/* DWGCTL: zmode */
#define M_DWG_NOZCMP (0x0 << 8)
#define M_DWG_ZE (0x2 << 8)
#define M_DWG_ZNE (0x3 << 8)
#define M_DWG_ZLT (0x4 << 8)
#define M_DWG_ZLTE (0x5 << 8)
#define M_DWG_ZGT (0x6 << 8)
#define M_DWG_ZGTE (0x7 << 8)
/* DWGCTL: solid */
#define M_DWG_SOLID (0x1 << 11)
/* DWGCTL: arzero */
#define M_DWG_ARZERO (0x1 << 12)
/* DWGCTL: sgnzero */
#define M_DWG_SGNZERO (0x1 << 13)
/* DWGCTL: shiftzero */
#define M_DWG_SHFTZERO (0x1 << 14)
/* DWGCTL: bop */
#define M_DWG_BOP_XOR (0x6 << 16)
#define M_DWG_BOP_AND (0x8 << 16)
#define M_DWG_BOP_SRC (0xC << 16)
#define M_DWG_BOP_OR (0xE << 16)
/* DWGCTL: trans */
#define M_DWG_TRANS_0 (0x0 << 20)
#define M_DWG_TRANS_1 (0x1 << 20)
#define M_DWG_TRANS_2 (0x2 << 20)
#define M_DWG_TRANS_3 (0x3 << 20)
#define M_DWG_TRANS_4 (0x4 << 20)
#define M_DWG_TRANS_5 (0x5 << 20)
#define M_DWG_TRANS_6 (0x6 << 20)
#define M_DWG_TRANS_7 (0x7 << 20)
#define M_DWG_TRANS_8 (0x8 << 20)
#define M_DWG_TRANS_9 (0x9 << 20)
#define M_DWG_TRANS_A (0xA << 20)
#define M_DWG_TRANS_B (0xB << 20)
#define M_DWG_TRANS_C (0xC << 20)
#define M_DWG_TRANS_D (0xD << 20)
#define M_DWG_TRANS_E (0xE << 20)
#define M_DWG_TRANS_F (0xF << 20)
/* DWGCTL: bltmod */
#define M_DWG_BMONOLEF (0x0 << 25)
#define M_DWG_BMONOWF (0x4 << 25)
#define M_DWG_BPLAN (0x1 << 25)
#define M_DWG_BFCOL (0x2 << 25)
#define M_DWG_BUYUV (0xE << 25)
#define M_DWG_BU32BGR (0x3 << 25)
#define M_DWG_BU32RGB (0x7 << 25)
#define M_DWG_BU24BGR (0xB << 25)
#define M_DWG_BU24RGB (0xF << 25)
/* DWGCTL: pattern */
#define M_DWG_PATTERN (0x1 << 29)
/* DWGCTL: transc */
#define M_DWG_TRANSC (0x1 << 30)
/* OPMODE: */
#define M_DMA_GENERAL (0x0 << 2)
#define M_DMA_BLIT (0x1 << 2)
#define M_DMA_VECTOR (0x2 << 2)
/* SGN: */
#define M_SDXL (0x1 << 1)
#define M_SDXR (0x1 << 5)
/* VGAREG */
#define M_CRTC_INDEX 0x1FD4
#define M_CRTC_DATA 0x1FD5
#define M_CRTC_EXT_INDEX 0x1FDE
#define M_CRTC_EXT_DATA 0x1FDF
#define M_MISC_R 0x1FCC
#define M_MISC_W 0x1FC2
/* CRTCEXT3: */
#define M_MGAMODE (0x1 << 7)
#endif