diff --git a/Makefile.DJ b/Makefile.DJ
index 78ebf43..deaac09 100644
--- a/Makefile.DJ
+++ b/Makefile.DJ
@@ -20,9 +20,9 @@
 # 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 makefile v1.6 for Mesa
+# DOS/DJGPP makefile for Mesa
 #
-#  Copyright (C) 2002 - Daniel Borca
+#  Author: Daniel Borca
 #  Email : dborca@users.sourceforge.net
 #  Web   : http://www.geocities.com/dborca
 
@@ -31,9 +31,6 @@
 #  Available options:
 #
 #    Environment variables:
-#	GLU=[mesa|sgi]	specify GLU directory; can be `sgi' (requires GNU/C++)
-#			or `mesa'.
-#			default = mesa
 #	GLIDE		path to Glide3 SDK; used with FX.
 #			default = $(TOP)/glide3
 #	FX=1		build for 3dfx Glide3. Note that this disables
@@ -57,8 +54,6 @@
 
 .PHONY : all libgl libglu libglut clean realclean
 
-GLU ?= mesa
-
 CFLAGS = -Wall -W -pedantic
 CFLAGS += -O2 -ffast-math
 
@@ -75,7 +70,7 @@
 libgl: lib
 	$(MAKE) -f Makefile.DJ -C src/mesa
 libglu: lib
-	$(MAKE) -f Makefile.DJ -C src/glu/$(GLU)
+	$(MAKE) -f Makefile.DJ -C src/glu/sgi
 libglut: lib
 	$(MAKE) -f Makefile.DJ -C src/glut/dos
 
diff --git a/docs/README.DJ b/docs/README.DJ
index 7180223..8038c28 100644
--- a/docs/README.DJ
+++ b/docs/README.DJ
@@ -1,4 +1,4 @@
-			Mesa 6.3 DOS/DJGPP Port v1.7
+			Mesa 6.5 DOS/DJGPP Port v1.8
 			~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 
@@ -7,8 +7,7 @@
 ~~~~~~~~~~~~
 
 Well, guess what... this is the DOS port of Mesa 6.3, for DJGPP fans... Whoa!
-The driver has its origins in ddsample.c, written by Brian Paul and found by me
-in Mesa 3.4.2.
+The driver uses OSMesa to draw off screen, and then blits the buffer.
 
 
 
@@ -32,9 +31,6 @@
      Environment variables:
 	CPU		optimize for the given processor.
 			default = pentium
-	GLU=[mesa|sgi]	specify GLU directory; can be `sgi' (requires GNU/C++)
-			or `mesa'.
-			default = mesa
 	GLIDE		path to Glide3 SDK; used with FX.
 			default = $(TOP)/glide3
 	FX=1		build for 3dfx Glide3. Note that this disables
@@ -56,11 +52,9 @@
 
 
 Tested on:
-	CPU:		AMD Athlon XP 1800+
-	Mainboard:	GA-7VTXE w/ 512 MB DDRAM
-	Video card:	Voodoo5 6000 AGP w/ 128 MB SDRAM
-	DJGPP:		djdev 2.04 + gcc v3.4.3 + make v3.80
-	OS:		DOS and Win98SE
+	Video card:	Radeon 9500
+	DJGPP:		djdev 2.04 + gcc v4.1.0 + make v3.80
+	OS:		DOS, Win98SE, WinXP (using Videoport driver)
 
 
 
@@ -98,7 +92,7 @@
    Q) DMesa is so SLOOOW! The Win32 OpenGL performs so much better...
    A) Is that a question? If you have a 3dfx Voodoo (any model), you're
       lucky (check http://sourceforge.net/projects/glide for the DJGPP port).
-      If you haven't, sorry; everything is done in software. Suggestions?
+      If you haven't, sorry; everything is done in software.
 
    Q) I tried to set refresh rate w/ DMesa, but without success.
    A) Refresh rate control works only for VESA 3.0 and the 3dfx driver (in
@@ -107,7 +101,8 @@
 
    Q) I made a simple application and it does nothing. It exits right away. Not
       even a blank screen.
-   A) Pure software drivers (VESA/VGA/NUL) support only double-buffered modes.
+   A) Software drivers (VESA/VGA/NUL) must to be constructed as single-buffered
+      visuals.  However, DMesaSwapBuffers must be called to get any output.
    A) Another weird "feature" is that buffer width must be multiple of 8 (I'm a
       lazy programmer and I found that the easiest way to keep buffer handling
       at peak performance ;-).
@@ -265,6 +260,11 @@
 	* no more GLX sources in DOS GLUT
 	* made GLUT timer callbacks less accurate but safer
 
+v1.8 (apr-2006)
+	* killed lots of code, the driver is now a front-end to OSMesa
+	* fixed problem with WinNT (http://www.volny.cz/martin.sulak/)
+	- removed 3dfx Glide3 support (temporarily?)
+
 
 
 Contact:
diff --git a/include/GL/dmesa.h b/include/GL/dmesa.h
index e67b342..358082e 100644
--- a/include/GL/dmesa.h
+++ b/include/GL/dmesa.h
@@ -23,9 +23,9 @@
  */
 
 /*
- * DOS/DJGPP device driver v1.7 for Mesa
+ * DOS/DJGPP device driver for Mesa
  *
- *  Copyright (C) 2002 - Daniel Borca
+ *  Author: Daniel Borca
  *  Email : dborca@users.sourceforge.net
  *  Web   : http://www.geocities.com/dborca
  */
@@ -35,7 +35,7 @@
 #define DMESA_H_included
 
 #define DMESA_MAJOR_VERSION 6
-#define DMESA_MINOR_VERSION 3
+#define DMESA_MINOR_VERSION 5
 
 /* Sample Usage:
  *
@@ -138,7 +138,7 @@
 /*
  * DMesa functions
  */
-typedef void (*DMesaProc) (void);
+typedef void (*DMesaProc) ();
 DMesaProc DMesaGetProcAddress (const char *name);
 
 /*
@@ -149,8 +149,8 @@
 #define DMESA_GET_VIDEO_MODES 0x0300
 #define DMESA_GET_BUFFER_ADDR 0x0400
 
-#define DMESA_DRIVER_SWDB_BIT 0x1 /* software double-buffered */
-#define DMESA_DRIVER_LLWO_BIT 0x2 /* lower-left window origin */
+#define DMESA_DRIVER_DBL_BIT 0x1 /* double-buffered */
+#define DMESA_DRIVER_YUP_BIT 0x2 /* lower-left window origin */
 int DMesaGetIntegerv (GLenum pname, GLint *params);
 
 #ifdef __cplusplus
diff --git a/src/glut/dos/window.c b/src/glut/dos/window.c
index b922746..610cf36 100644
--- a/src/glut/dos/window.c
+++ b/src/glut/dos/window.c
@@ -66,6 +66,10 @@
    int i;
    int m8width = (_glut_default.width + 7) & ~7;
 
+   if (!(_glut_default.mode & GLUT_DOUBLE)) {
+      return 0;
+   }
+    
    /* We set the Visual once. This will be our desktop (graphic mode).
     * We should do this in the `glutInit' code, but we don't have any idea
     * about its geometry. Supposedly, when we are about to create one
@@ -73,7 +77,7 @@
     */
    if (!visual) {
       if ((visual=DMesaCreateVisual(_glut_default.x + m8width, _glut_default.y + _glut_default.height, _glut_visual.bpp, _glut_visual.refresh,
-                                    _glut_default.mode & GLUT_DOUBLE,
+                                    GLUT_SINGLE,
                                     !(_glut_default.mode & GLUT_INDEX),
                                     (_glut_default.mode & GLUT_ALPHA  ) ? _glut_visual.alpha   : 0,
                                     (_glut_default.mode & GLUT_DEPTH  ) ? _glut_visual.depth   : 0,
diff --git a/src/mesa/Makefile.DJ b/src/mesa/Makefile.DJ
index 53c4370..06a13fb 100644
--- a/src/mesa/Makefile.DJ
+++ b/src/mesa/Makefile.DJ
@@ -103,8 +103,8 @@
 	$(GLIDE_DRIVER_SOURCES)
 else
 DRIVER_SOURCES += \
+	$(OSMESA_DRIVER_SOURCES) \
 	drivers/dos/video.c \
-	drivers/dos/virtual.S \
 	drivers/dos/vesa.c \
 	drivers/dos/blit.S \
 	drivers/dos/vga.c \
@@ -112,8 +112,6 @@
 	drivers/dos/dpmi.c
 endif
 
-#DRIVER_SOURCES += $(OSMESA_DRIVER_SOURCES)
-
 SOURCES = $(CORE_SOURCES) $(X86_SOURCES) $(COMMON_DRIVER_SOURCES) $(DRIVER_SOURCES)
 
 OBJECTS = $(addsuffix .o,$(basename $(SOURCES)))
diff --git a/src/mesa/drivers/dos/blit.S b/src/mesa/drivers/dos/blit.S
index f5888c7..02dc840 100644
--- a/src/mesa/drivers/dos/blit.S
+++ b/src/mesa/drivers/dos/blit.S
@@ -23,9 +23,9 @@
  */
 
 /*
- * DOS/DJGPP device driver v1.3 for Mesa
+ * DOS/DJGPP device driver for Mesa
  *
- *  Copyright (C) 2002 - Borca Daniel
+ *  Author: Daniel Borca
  *  Email : dborca@yahoo.com
  *  Web   : http://www.geocities.com/dborca
  */
@@ -197,3 +197,844 @@
 		emms
 #endif
 		ret
+
+
+
+#define CVT_32_TO_16(s, tmp)			\
+    /* SRC = bbbbbbbbggggggggrrrrrrrr******** */\
+		movl	%e##s##x, %tmp		;\
+    /* TMP = bbbbbbbbggggggggrrrrrrrr******** */\
+		shrb	$2, %s##h		;\
+    /* SRC = bbbbbbbbgggggg00rrrrrrrr******** */\
+		andl	$0xF80000, %tmp		;\
+    /* TMP = 0000000000000000000rrrrr00000000 */\
+		shrw	$3, %s##x		;\
+    /* SRC = bbbbbgggggg00000rrrrrrrr******** */\
+		shrl	$8, %tmp		;\
+    /* TMP = 00000000000rrrrr0000000000000000 */\
+		orl	%tmp, %e##s##x		;\
+    /* SRC = bbbbbggggggrrrrrrrrrrrrr******** */
+
+#define CVT_32_TO_15(s, tmp)			\
+    /* SRC = bbbbbbbbggggggggrrrrrrrr******** */\
+		movl	%e##s##x, %tmp		;\
+    /* TMP = bbbbbbbbggggggggrrrrrrrr******** */\
+		shrb	$3, %s##h		;\
+    /* SRC = bbbbbbbbgggggg00rrrrrrrr******** */\
+		andl	$0xF80000, %tmp		;\
+    /* TMP = 0000000000000000000rrrrr00000000 */\
+		shrw	$3, %s##x		;\
+    /* SRC = bbbbbgggggg00000rrrrrrrr******** */\
+		shrl	$9, %tmp		;\
+    /* TMP = 00000000000rrrrr0000000000000000 */\
+		orl	%tmp, %e##s##x		;\
+    /* SRC = bbbbbggggggrrrrrrrrrrrrr******** */
+
+#define CVT_16_TO_15(src, tmp)			\
+    /* SRC = bbbbbggggggrrrrrBBBBBGGGGGGRRRRR */\
+		movl	%src, %tmp		;\
+    /* TMP = bbbbbggggggrrrrrBBBBBGGGGGGRRRRR */\
+		andl	$0x1F001F, %src		;\
+    /* SRC = bbbbb00000000000BBBBB00000000000 */\
+		andl	$0xFFC0FFC0, %tmp	;\
+    /* TMP = 000000gggggrrrrr000000GGGGGRRRRR */\
+		shrl	%tmp			;\
+    /* TMP = 00000gggggrrrrr000000GGGGGRRRRR0 */\
+		orl	%tmp, %src		;\
+    /* SRC = bbbbbgggggrrrrr0BBBBBGGGGGRRRRR0 */\
+
+
+
+/* transform BGRA to BGR */
+		.p2align 5,,31
+		.global	_vesa_l_dump_32_to_24
+_vesa_l_dump_32_to_24:
+		pushl	%ebx
+		pushl	%esi
+		pushl	%edi
+		movl	_vl_video_selector, %fs
+		movl	_vl_current_draw_buffer, %esi
+		movl	_vl_current_offset, %edi
+		movl	_vl_current_stride, %ecx
+		movl	_vl_current_height, %edx
+		movl	_vl_current_delta, %ebx
+		.balign	4
+	0:
+		pushl	%ecx
+	1:
+		movl	(%esi), %eax
+		addl	$4, %esi
+		movw	%ax, %fs:(%edi)
+		shrl	$16, %eax
+		movb	%al, %fs:2(%edi)
+		addl	$3, %edi
+		subl	$3, %ecx
+		jnz	1b
+		popl	%ecx
+		addl	%ebx, %edi
+		decl	%edx
+		jnz	0b
+		popl	%edi
+		popl	%esi
+		popl	%ebx
+		ret
+
+/* transform BGRA to B5G6R5 */
+		.p2align 5,,31
+		.global	_vesa_l_dump_32_to_16
+_vesa_l_dump_32_to_16:
+		pushl	%ebp
+		pushl	%ebx
+		pushl	%esi
+		pushl	%edi
+		movl	_vl_video_selector, %fs
+		movl	_vl_current_draw_buffer, %esi
+		movl	_vl_current_offset, %edi
+		movl	_vl_current_stride, %ecx
+		movl	_vl_current_height, %edx
+		movl	_vl_current_delta, %ebx
+		.balign	4
+	0:
+		pushl	%ecx
+	1:
+		movl	(%esi), %eax
+		addl	$4, %esi
+		CVT_32_TO_16(a, ebp)
+		movw	%ax, %fs:(%edi)
+		addl	$2, %edi
+		subl	$2, %ecx
+		jnz	1b
+		popl	%ecx
+		addl	%ebx, %edi
+		decl	%edx
+		jnz	0b
+		popl	%edi
+		popl	%esi
+		popl	%ebx
+		popl	%ebp
+		ret
+
+/* transform BGRA to B5G5R5 */
+		.p2align 5,,31
+		.global	_vesa_l_dump_32_to_15
+_vesa_l_dump_32_to_15:
+		pushl	%ebp
+		pushl	%ebx
+		pushl	%esi
+		pushl	%edi
+		movl	_vl_video_selector, %fs
+		movl	_vl_current_draw_buffer, %esi
+		movl	_vl_current_offset, %edi
+		movl	_vl_current_stride, %ecx
+		movl	_vl_current_height, %edx
+		movl	_vl_current_delta, %ebx
+		.balign	4
+	0:
+		pushl	%ecx
+	1:
+		movl	(%esi), %eax
+		addl	$4, %esi
+		CVT_32_TO_15(a, ebp)
+		movw	%ax, %fs:(%edi)
+		addl	$2, %edi
+		subl	$2, %ecx
+		jnz	1b
+		popl	%ecx
+		addl	%ebx, %edi
+		decl	%edx
+		jnz	0b
+		popl	%edi
+		popl	%esi
+		popl	%ebx
+		popl	%ebp
+		ret
+
+/* transform BGRA to fake8 */
+		.p2align 5,,31
+		.global	_vesa_l_dump_32_to_8
+_vesa_l_dump_32_to_8:
+		pushl	%ebp
+		pushl	%ebx
+		pushl	%esi
+		pushl	%edi
+		movl	_vl_video_selector, %fs
+		movl	_vl_current_draw_buffer, %esi
+		movl	_vl_current_offset, %edi
+		movl	_vl_current_stride, %ecx
+		movl	_vl_current_height, %edx
+		movl	_vl_current_delta, %ebx
+		.balign	4
+	0:
+		pushl	%edx
+		pushl	%ecx
+		pushl	%ebx
+	1:
+		movl	(%esi), %eax
+		addl	$4, %esi
+#if 1
+		xorl	%ebx, %ebx
+		movl	%eax, %edx
+		movb	%ah, %bl
+		shrl	$16, %edx
+		andl	$0xFF, %edx
+		andl	$0xFF, %eax
+
+		movb	_array_b(%eax), %al
+		movb	_array_r(%edx), %dl
+		movb	_array_g(%ebx), %bl
+
+		imull	$36, %eax
+		imull	$6, %ebx
+		addl	%edx, %eax
+		addl	%ebx, %eax
+#endif
+		movb	%al, %fs:(%edi)
+		incl	%edi
+		decl	%ecx
+		jnz	1b
+		popl	%ebx
+		popl	%ecx
+		popl	%edx
+		addl	%ebx, %edi
+		decl	%edx
+		jnz	0b
+		popl	%edi
+		popl	%esi
+		popl	%ebx
+		popl	%ebp
+		ret
+
+/* transform BGR to BGRx */
+		.p2align 5,,31
+		.global	_vesa_l_dump_24_to_32
+_vesa_l_dump_24_to_32:
+		pushl	%ebx
+		pushl	%esi
+		pushl	%edi
+		movl	_vl_video_selector, %fs
+		movl	_vl_current_draw_buffer, %esi
+		movl	_vl_current_offset, %edi
+		movl	_vl_current_stride, %ecx
+		movl	_vl_current_height, %edx
+		movl	_vl_current_delta, %ebx
+		.balign	4
+	0:
+		pushl	%ecx
+	1:
+		movl	(%esi), %eax
+		addl	$3, %esi
+		movl	%eax, %fs:(%edi)
+		addl	$4, %edi
+		subl	$4, %ecx
+		jnz	1b
+		popl	%ecx
+		addl	%ebx, %edi
+		decl	%edx
+		jnz	0b
+		popl	%edi
+		popl	%esi
+		popl	%ebx
+		ret
+
+/* transform BGR to fake8 */
+		.p2align 5,,31
+		.global	_vesa_l_dump_24_to_8
+_vesa_l_dump_24_to_8:
+		pushl	%ebp
+		pushl	%ebx
+		pushl	%esi
+		pushl	%edi
+		movl	_vl_video_selector, %fs
+		movl	_vl_current_draw_buffer, %esi
+		movl	_vl_current_offset, %edi
+		movl	_vl_current_stride, %ecx
+		movl	_vl_current_height, %edx
+		movl	_vl_current_delta, %ebx
+		.balign	4
+	0:
+		pushl	%edx
+		pushl	%ecx
+		pushl	%ebx
+	1:
+		movl	(%esi), %eax
+		addl	$3, %esi
+#if 1
+		xorl	%ebx, %ebx
+		movl	%eax, %edx
+		movb	%ah, %bl
+		shrl	$16, %edx
+		andl	$0xFF, %edx
+		andl	$0xFF, %eax
+
+		movb	_array_b(%eax), %al
+		movb	_array_r(%edx), %dl
+		movb	_array_g(%ebx), %bl
+
+		imull	$36, %eax
+		imull	$6, %ebx
+		addl	%edx, %eax
+		addl	%ebx, %eax
+#endif
+		movb	%al, %fs:(%edi)
+		incl	%edi
+		decl	%ecx
+		jnz	1b
+		popl	%ebx
+		popl	%ecx
+		popl	%edx
+		addl	%ebx, %edi
+		decl	%edx
+		jnz	0b
+		popl	%edi
+		popl	%esi
+		popl	%ebx
+		popl	%ebp
+		ret
+
+/* transform B5G6R5 to B5G5R5 */
+		.p2align 5,,31
+		.global	_vesa_l_dump_16_to_15
+_vesa_l_dump_16_to_15:
+		pushl	%ebp
+		pushl	%ebx
+		pushl	%esi
+		pushl	%edi
+		movl	_vl_video_selector, %fs
+		movl	_vl_current_draw_buffer, %esi
+		movl	_vl_current_offset, %edi
+		movl	_vl_current_stride, %ecx
+		movl	_vl_current_height, %edx
+		movl	_vl_current_delta, %ebx
+		.balign	4
+	0:
+		pushl	%ecx
+	1:
+		movl	(%esi), %eax
+		addl	$4, %esi
+		CVT_16_TO_15(eax, ebp)
+		movl	%eax, %fs:(%edi)
+		addl	$4, %edi
+		subl	$4, %ecx
+		jnz	1b
+		popl	%ecx
+		addl	%ebx, %edi
+		decl	%edx
+		jnz	0b
+		popl	%edi
+		popl	%esi
+		popl	%ebx
+		popl	%ebp
+		ret
+
+/* transform B5G6R5 to fake8 */
+		.p2align 5,,31
+		.global	_vesa_l_dump_16_to_8
+_vesa_l_dump_16_to_8:
+		pushl	%ebp
+		pushl	%ebx
+		pushl	%esi
+		pushl	%edi
+		movl	_vl_video_selector, %fs
+		movl	_vl_current_draw_buffer, %esi
+		movl	_vl_current_offset, %edi
+		movl	_vl_current_stride, %ecx
+		movl	_vl_current_height, %edx
+		movl	_vl_current_delta, %ebx
+		.balign	4
+	0:
+		pushl	%ecx
+		pushl	%ebx
+	1:
+		movl	(%esi), %eax
+		addl	$4, %esi
+#if 1
+		movl	%eax, %ebx
+		andl	$0xFFFF, %eax
+		shrl	$16, %ebx
+		movb	_tab_16_8(%eax), %al
+		movb	_tab_16_8(%ebx), %ah
+#endif
+		movw	%ax, %fs:(%edi)
+		addl	$2, %edi
+		subl	$2, %ecx
+		jnz	1b
+		popl	%ebx
+		popl	%ecx
+		addl	%ebx, %edi
+		decl	%edx
+		jnz	0b
+		popl	%edi
+		popl	%esi
+		popl	%ebx
+		popl	%ebp
+		ret
+
+
+
+		.p2align 5,,31
+		.global	_vesa_b_dump_32_to_24
+_vesa_b_dump_32_to_24:
+		pushl	%ebx
+		pushl	%esi
+		pushl	%edi
+		pushl	%ebp
+		movl	_vl_video_selector, %fs
+		movl	_vl_current_draw_buffer, %esi
+		movl	_vl_current_offset, %edi
+		movl	_vesa_gran_shift, %ecx
+		movl	_vesa_gran_mask, %ebp
+		movl	%edi, %edx
+		xorl	%ebx, %ebx
+		andl	%ebp, %edi
+		shrl	%cl, %edx
+		incl	%ebp
+		call	*_vesa_swbank
+		movl	_vl_current_stride, %ecx
+		movl	_vl_current_height, %eax
+		movl	$0x00FFFFFF, %ebx
+		.balign	4
+	0:
+		pushl	%eax
+		pushl	%ecx
+		.balign	4
+	1:
+		cmpl	%ebp, %edi
+		jb	2f
+		pushl	%ebx
+		incl	%edx
+		xorl	%ebx, %ebx
+		call	*_vesa_swbank
+		popl	%ebx
+		subl	%ebp, %edi
+		.balign	4
+	2:
+		movb	(%esi), %al	/* XXX too many accesses */
+		incl	%esi
+		rorl	$8, %ebx
+		jnc	2b
+		movb	%al, %fs:(%edi)
+		incl	%edi
+		decl	%ecx
+		jnz	1b
+		popl	%ecx
+		popl	%eax
+		addl	_vl_current_delta, %edi
+		decl	%eax
+		jnz	0b
+		popl	%ebp
+		popl	%edi
+		popl	%esi
+		popl	%ebx
+		ret
+
+		.p2align 5,,31
+		.global	_vesa_b_dump_32_to_16
+_vesa_b_dump_32_to_16:
+		pushl	%ebx
+		pushl	%esi
+		pushl	%edi
+		pushl	%ebp
+		movl	_vl_video_selector, %fs
+		movl	_vl_current_draw_buffer, %esi
+		movl	_vl_current_offset, %edi
+		movl	_vesa_gran_shift, %ecx
+		movl	_vesa_gran_mask, %ebp
+		movl	%edi, %edx
+		xorl	%ebx, %ebx
+		andl	%ebp, %edi
+		shrl	%cl, %edx
+		incl	%ebp
+		call	*_vesa_swbank
+		movl	_vl_current_stride, %ecx
+		movl	_vl_current_height, %eax
+		.balign	4
+	0:
+		pushl	%eax
+		pushl	%ecx
+		.balign	4
+	1:
+		cmpl	%ebp, %edi
+		jb	2f
+		incl	%edx
+		xorl	%ebx, %ebx
+		call	*_vesa_swbank
+		subl	%ebp, %edi
+		.balign	4
+	2:
+		movl	(%esi), %eax
+		addl	$4, %esi
+		CVT_32_TO_16(a, ebx)
+		movw	%ax, %fs:(%edi)
+		addl	$2, %edi
+		subl	$2, %ecx
+		jnz	1b
+		popl	%ecx
+		popl	%eax
+		addl	_vl_current_delta, %edi
+		decl	%eax
+		jnz	0b
+		popl	%ebp
+		popl	%edi
+		popl	%esi
+		popl	%ebx
+		ret
+
+		.p2align 5,,31
+		.global	_vesa_b_dump_32_to_15
+_vesa_b_dump_32_to_15:
+		pushl	%ebx
+		pushl	%esi
+		pushl	%edi
+		pushl	%ebp
+		movl	_vl_video_selector, %fs
+		movl	_vl_current_draw_buffer, %esi
+		movl	_vl_current_offset, %edi
+		movl	_vesa_gran_shift, %ecx
+		movl	_vesa_gran_mask, %ebp
+		movl	%edi, %edx
+		xorl	%ebx, %ebx
+		andl	%ebp, %edi
+		shrl	%cl, %edx
+		incl	%ebp
+		call	*_vesa_swbank
+		movl	_vl_current_stride, %ecx
+		movl	_vl_current_height, %eax
+		.balign	4
+	0:
+		pushl	%eax
+		pushl	%ecx
+		.balign	4
+	1:
+		cmpl	%ebp, %edi
+		jb	2f
+		incl	%edx
+		xorl	%ebx, %ebx
+		call	*_vesa_swbank
+		subl	%ebp, %edi
+		.balign	4
+	2:
+		movl	(%esi), %eax
+		addl	$4, %esi
+		CVT_32_TO_15(a, ebx)
+		movw	%ax, %fs:(%edi)
+		addl	$2, %edi
+		subl	$2, %ecx
+		jnz	1b
+		popl	%ecx
+		popl	%eax
+		addl	_vl_current_delta, %edi
+		decl	%eax
+		jnz	0b
+		popl	%ebp
+		popl	%edi
+		popl	%esi
+		popl	%ebx
+		ret
+
+		.p2align 5,,31
+		.global	_vesa_b_dump_32_to_8
+_vesa_b_dump_32_to_8:
+		pushl	%ebx
+		pushl	%esi
+		pushl	%edi
+		pushl	%ebp
+		movl	_vl_video_selector, %fs
+		movl	_vl_current_draw_buffer, %esi
+		movl	_vl_current_offset, %edi
+		movl	_vesa_gran_shift, %ecx
+		movl	_vesa_gran_mask, %ebp
+		movl	%edi, %edx
+		xorl	%ebx, %ebx
+		andl	%ebp, %edi
+		shrl	%cl, %edx
+		incl	%ebp
+		call	*_vesa_swbank
+		movl	_vl_current_stride, %ecx
+		movl	_vl_current_height, %eax
+		.balign	4
+	0:
+		pushl	%eax
+		pushl	%ecx
+		pushl	%edx
+		.balign	4
+	1:
+		cmpl	%ebp, %edi
+		jb	2f
+		popl	%edx
+		incl	%edx
+		pushl	%edx
+		xorl	%ebx, %ebx
+		call	*_vesa_swbank
+		subl	%ebp, %edi
+		.balign	4
+	2:
+		movl	(%esi), %eax
+		addl	$4, %esi
+#if 1
+		xorl	%ebx, %ebx
+		movl	%eax, %edx
+		movb	%ah, %bl
+		shrl	$16, %edx
+		andl	$0xFF, %edx
+		andl	$0xFF, %eax
+
+		movb	_array_b(%eax), %al
+		movb	_array_r(%edx), %dl
+		movb	_array_g(%ebx), %bl
+
+		imull	$36, %eax
+		imull	$6, %ebx
+		addl	%edx, %eax
+		addl	%ebx, %eax
+#endif
+		movb	%al, %fs:(%edi)
+		incl	%edi
+		decl	%ecx
+		jnz	1b
+		popl	%edx
+		popl	%ecx
+		popl	%eax
+		addl	_vl_current_delta, %edi
+		decl	%eax
+		jnz	0b
+		popl	%ebp
+		popl	%edi
+		popl	%esi
+		popl	%ebx
+		ret
+
+		.p2align 5,,31
+		.global	_vesa_b_dump_24_to_32
+_vesa_b_dump_24_to_32:
+		pushl	%ebx
+		pushl	%esi
+		pushl	%edi
+		pushl	%ebp
+		movl	_vl_video_selector, %fs
+		movl	_vl_current_draw_buffer, %esi
+		movl	_vl_current_offset, %edi
+		movl	_vesa_gran_shift, %ecx
+		movl	_vesa_gran_mask, %ebp
+		movl	%edi, %edx
+		xorl	%ebx, %ebx
+		andl	%ebp, %edi
+		shrl	%cl, %edx
+		incl	%ebp
+		call	*_vesa_swbank
+		movl	_vl_current_stride, %ecx
+		movl	_vl_current_height, %eax
+		movl	_vl_current_delta, %ebx
+		.balign	4
+	0:
+		pushl	%eax
+		pushl	%ecx
+		.balign	4
+	1:
+		cmpl	%ebp, %edi
+		jb	2f
+		pushl	%ebx
+		incl	%edx
+		xorl	%ebx, %ebx
+		call	*_vesa_swbank
+		popl	%ebx
+		subl	%ebp, %edi
+		.balign	4
+	2:
+		movl	(%esi), %eax
+		addl	$3, %esi
+		movl	%eax, %fs:(%edi)
+		addl	$4, %edi
+		subl	$4, %ecx
+		jnz	1b
+		popl	%ecx
+		popl	%eax
+		addl	%ebx, %edi
+		decl	%eax
+		jnz	0b
+		popl	%ebp
+		popl	%edi
+		popl	%esi
+		popl	%ebx
+		ret
+
+		.p2align 5,,31
+		.global	_vesa_b_dump_24_to_8
+_vesa_b_dump_24_to_8:
+		pushl	%ebx
+		pushl	%esi
+		pushl	%edi
+		pushl	%ebp
+		movl	_vl_video_selector, %fs
+		movl	_vl_current_draw_buffer, %esi
+		movl	_vl_current_offset, %edi
+		movl	_vesa_gran_shift, %ecx
+		movl	_vesa_gran_mask, %ebp
+		movl	%edi, %edx
+		xorl	%ebx, %ebx
+		andl	%ebp, %edi
+		shrl	%cl, %edx
+		incl	%ebp
+		call	*_vesa_swbank
+		movl	_vl_current_stride, %ecx
+		movl	_vl_current_height, %eax
+		.balign	4
+	0:
+		pushl	%eax
+		pushl	%ecx
+		pushl	%edx
+		.balign	4
+	1:
+		cmpl	%ebp, %edi
+		jb	2f
+		popl	%edx
+		incl	%edx
+		pushl	%edx
+		xorl	%ebx, %ebx
+		call	*_vesa_swbank
+		subl	%ebp, %edi
+		.balign	4
+	2:
+		movl	(%esi), %eax
+		addl	$3, %esi
+#if 1
+		xorl	%ebx, %ebx
+		movl	%eax, %edx
+		movb	%ah, %bl
+		shrl	$16, %edx
+		andl	$0xFF, %edx
+		andl	$0xFF, %eax
+
+		movb	_array_b(%eax), %al
+		movb	_array_r(%edx), %dl
+		movb	_array_g(%ebx), %bl
+
+		imull	$36, %eax
+		imull	$6, %ebx
+		addl	%edx, %eax
+		addl	%ebx, %eax
+#endif
+		movb	%al, %fs:(%edi)
+		incl	%edi
+		decl	%ecx
+		jnz	1b
+		popl	%edx
+		popl	%ecx
+		popl	%eax
+		addl	_vl_current_delta, %edi
+		decl	%eax
+		jnz	0b
+		popl	%ebp
+		popl	%edi
+		popl	%esi
+		popl	%ebx
+		ret
+
+		.p2align 5,,31
+		.global	_vesa_b_dump_16_to_15
+_vesa_b_dump_16_to_15:
+		pushl	%ebx
+		pushl	%esi
+		pushl	%edi
+		pushl	%ebp
+		movl	_vl_video_selector, %fs
+		movl	_vl_current_draw_buffer, %esi
+		movl	_vl_current_offset, %edi
+		movl	_vesa_gran_shift, %ecx
+		movl	_vesa_gran_mask, %ebp
+		movl	%edi, %edx
+		xorl	%ebx, %ebx
+		andl	%ebp, %edi
+		shrl	%cl, %edx
+		incl	%ebp
+		call	*_vesa_swbank
+		movl	_vl_current_stride, %ecx
+		movl	_vl_current_height, %eax
+		.balign	4
+	0:
+		pushl	%eax
+		pushl	%ecx
+		.balign	4
+	1:
+		cmpl	%ebp, %edi
+		jb	2f
+		incl	%edx
+		xorl	%ebx, %ebx
+		call	*_vesa_swbank
+		subl	%ebp, %edi
+		.balign	4
+	2:
+		movw	(%esi), %ax
+		addl	$2, %esi
+		CVT_16_TO_15(eax, ebx)
+		movw	%ax, %fs:(%edi)
+		addl	$2, %edi
+		subl	$2, %ecx
+		jnz	1b
+		popl	%ecx
+		popl	%eax
+		addl	_vl_current_delta, %edi
+		decl	%eax
+		jnz	0b
+		popl	%ebp
+		popl	%edi
+		popl	%esi
+		popl	%ebx
+		ret
+
+		.p2align 5,,31
+		.global	_vesa_b_dump_16_to_8
+_vesa_b_dump_16_to_8:
+		pushl	%ebx
+		pushl	%esi
+		pushl	%edi
+		pushl	%ebp
+		movl	_vl_video_selector, %fs
+		movl	_vl_current_draw_buffer, %esi
+		movl	_vl_current_offset, %edi
+		movl	_vesa_gran_shift, %ecx
+		movl	_vesa_gran_mask, %ebp
+		movl	%edi, %edx
+		xorl	%ebx, %ebx
+		andl	%ebp, %edi
+		shrl	%cl, %edx
+		incl	%ebp
+		call	*_vesa_swbank
+		movl	_vl_current_stride, %ecx
+		movl	_vl_current_height, %eax
+		movl	_vl_current_delta, %ebx
+		.balign	4
+	0:
+		pushl	%eax
+		pushl	%ecx
+		.balign	4
+	1:
+		cmpl	%ebp, %edi
+		jb	2f
+		pushl	%ebx
+		incl	%edx
+		xorl	%ebx, %ebx
+		call	*_vesa_swbank
+		popl	%ebx
+		subl	%ebp, %edi
+		.balign	4
+	2:
+		movw	(%esi), %ax
+		addl	$2, %esi
+#if 1
+		andl	$0xFFFF, %eax
+		movb	_tab_16_8(%eax), %al
+#endif
+		movb	%al, %fs:(%edi)
+		addl	$1, %edi
+		subl	$1, %ecx
+		jnz	1b
+		popl	%ecx
+		popl	%eax
+		addl	%ebx, %edi
+		decl	%eax
+		jnz	0b
+		popl	%ebp
+		popl	%edi
+		popl	%esi
+		popl	%ebx
+		ret
diff --git a/src/mesa/drivers/dos/dmesa.c b/src/mesa/drivers/dos/dmesa.c
index 719f4ec..ee87e63 100644
--- a/src/mesa/drivers/dos/dmesa.c
+++ b/src/mesa/drivers/dos/dmesa.c
@@ -23,922 +23,60 @@
  */
 
 /*
- * DOS/DJGPP device driver v1.7 for Mesa
+ * DOS/DJGPP device driver for Mesa
  *
- *  Copyright (c) 2003 - Daniel Borca
+ *  Author: Daniel Borca
  *  Email : dborca@users.sourceforge.net
  *  Web   : http://www.geocities.com/dborca
  */
 
 
-#include "glheader.h"
 #include "context.h"
 #include "imports.h"
-#ifndef FX
-#include "bufferobj.h"
-#include "buffers.h"
-#include "extensions.h"
-#include "macros.h"
-#include "matrix.h"
 #include "mtypes.h"
-#include "texformat.h"
-#include "teximage.h"
-#include "texstore.h"
-#include "array_cache/acache.h"
-#include "swrast/s_context.h"
-#include "swrast/s_depth.h"
-#include "swrast/s_lines.h"
-#include "swrast/s_triangle.h"
-#include "swrast/swrast.h"
-#include "swrast_setup/swrast_setup.h"
-#include "tnl/tnl.h"
-#include "tnl/t_context.h"
-#include "tnl/t_pipeline.h"
-#include "drivers/common/driverfuncs.h"
-#include "video.h"
-#else  /* FX */
-#include "GL/fxmesa.h"
-#endif /* FX */
 
+#include "video.h"
+
+#include "GL/osmesa.h"
 #include "GL/dmesa.h"
 
 
-#define SWTC 0 /* SW texture compression */
-
-
 /*
- * In C++ terms, this class derives from the GLvisual class.
- * Add system-specific fields to it.
+ * This has nothing to do with Mesa Visual structure.
+ * We keep this one around for backwards compatibility,
+ * and to store video mode data for DMesaCreateContext.
  */
 struct dmesa_visual {
-   GLvisual gl_visual;
-   GLboolean sw_alpha;          /* use Mesa's alpha buffer? */
-   int z_buffer;                /* Z=buffer: 0=no, 1=SW, -1=HW */
+    GLenum format;		/* OSMesa framebuffer format */
+    GLint depthBits;
+    GLint stencilBits;
+    GLint accumBits;
 };
 
 /*
- * In C++ terms, this class derives from the GLframebuffer class.
- * Add system-specific fields to it.
+ * This has nothing to do with Mesa Buffer structure.
+ * We keep this one around for backwards compatibility,
+ * and to store various data.
  */
 struct dmesa_buffer {
-   GLframebuffer gl_buffer;     /* The depth, stencil, accum, etc buffers */
-   void *the_window;            /* your window handle, etc */
-
-   int xpos, ypos;              /* position */
-   int width, height;           /* size in pixels */
+    int xpos, ypos;              /* position */
+    int width, height;           /* size in pixels */
+    GLenum type;
+    void *the_window;            /* your window handle, etc */
 };
 
 /*
- * In C++ terms, this class derives from the GLcontext class.
- * Add system-specific fields to it.
+ * This has nothing to do with Mesa Context structure.
+ * We keep this one around for backwards compatibility,
+ * and to store real off-screen context.
  */
 struct dmesa_context {
-   GLcontext gl_ctx;            /* the core library context */
-   DMesaVisual visual;
-   DMesaBuffer buffer;
-   GLuint ClearColor;
-   GLuint ClearIndex;
-   /* etc... */
+    OSMesaContext osmesa;
+    DMesaBuffer buffer;
 };
 
 
-/*
- * SPAN FUNCTIONS
- * XXX: These need to be updated to take the new gl_renderbuffer parameter
- * introduced in Mesa 6.3.  That parameter will indicate whether the front
- * or back color buffer is to be read/written.
- */
-
-#ifndef FX
-/****************************************************************************
- * Read/Write pixels
- ***************************************************************************/
-#define FLIP(y)  (dmesa->buffer->height - (y) - 1)
-#define FLIP2(y) (_b_ - (y))
-
-#define DSTRIDE dmesa->buffer->width
-
-/****************************************************************************
- * RGB[A]
- ***************************************************************************/
-static void
-write_rgba_span (const GLcontext *ctx, GLuint n, GLint x, GLint y,
-                 const GLubyte rgba[][4], const GLubyte mask[])
-{
-   const DMesaContext dmesa = (DMesaContext)ctx;
-   GLuint i, offset;
-
-   offset = DSTRIDE * FLIP(y) + x;
-   if (mask) {
-      /* draw some pixels */
-      for (i = 0; i < n; i++, offset++) {
-         if (mask[i]) {
-            vl_putpixel(offset, vl_mixrgba(rgba[i]));
-         }
-      }
-   } else {
-      /* draw all pixels */
-      for (i = 0; i < n; i++, offset++) {
-         vl_putpixel(offset, vl_mixrgba(rgba[i]));
-      }
-   }
-}
-
-
-static void
-write_rgb_span (const GLcontext *ctx, GLuint n, GLint x, GLint y,
-                const GLubyte rgb[][3], const GLubyte mask[])
-{
-   const DMesaContext dmesa = (DMesaContext)ctx;
-   GLuint i, offset;
-
-   offset = DSTRIDE * FLIP(y) + x;
-   if (mask) {
-      /* draw some pixels */
-      for (i = 0; i < n; i++, offset++) {
-         if (mask[i]) {
-            vl_putpixel(offset, vl_mixrgb(rgb[i]));
-         }
-      }
-   } else {
-      /* draw all pixels */
-      for (i = 0; i < n; i++, offset++) {
-         vl_putpixel(offset, vl_mixrgb(rgb[i]));
-      }
-   }
-}
-
-
-static void
-write_mono_rgba_span (const GLcontext *ctx,
-                      GLuint n, GLint x, GLint y,
-                      const GLchan color[4], const GLubyte mask[])
-{
-   const DMesaContext dmesa = (DMesaContext)ctx;
-   GLuint i, offset, rgba = vl_mixrgba(color);
-
-   offset = DSTRIDE * FLIP(y) + x;
-   if (mask) {
-      /* draw some pixels */
-      for (i = 0; i < n; i++, offset++) {
-         if (mask[i]) {
-            vl_putpixel(offset, rgba);
-         }
-      }
-   } else {
-      /* draw all pixels */
-      for (i = 0; i < n; i++, offset++) {
-         vl_putpixel(offset, rgba);
-      }
-   }
-}
-
-
-static void
-read_rgba_span (const GLcontext *ctx, GLuint n, GLint x, GLint y,
-                GLubyte rgba[][4])
-{
-   const DMesaContext dmesa = (DMesaContext)ctx;
-   GLuint i, offset;
-
-   offset = DSTRIDE * FLIP(y) + x;
-   /* read all pixels */
-   for (i = 0; i < n; i++, offset++) {
-      vl_getrgba(offset, rgba[i]);
-   }
-}
-
-
-static void
-write_rgba_pixels (const GLcontext *ctx,
-                   GLuint n, const GLint x[], const GLint y[],
-                   const GLubyte rgba[][4], const GLubyte mask[])
-{
-   const DMesaContext dmesa = (DMesaContext)ctx;
-   GLuint i, _w_ = DSTRIDE, _b_ = dmesa->buffer->height - 1;
-
-   if (mask) {
-      /* draw some pixels */
-      for (i = 0; i < n; i++) {
-         if (mask[i]) {
-            vl_putpixel(FLIP2(y[i])*_w_ + x[i], vl_mixrgba(rgba[i]));
-         }
-      }
-   } else {
-      /* draw all pixels */
-      for (i = 0; i < n; i++) {
-         vl_putpixel(FLIP2(y[i])*_w_ + x[i], vl_mixrgba(rgba[i]));
-      }
-   }
-}
-
-
-static void
-write_mono_rgba_pixels (const GLcontext *ctx,
-                        GLuint n, const GLint x[], const GLint y[],
-                                    const GLchan color[4], const GLubyte mask[])
-{
-   const DMesaContext dmesa = (DMesaContext)ctx;
-   GLuint i, _w_ = DSTRIDE, _b_ = dmesa->buffer->height - 1, rgba = vl_mixrgba(color);
-
-   if (mask) {
-      /* draw some pixels */
-      for (i = 0; i < n; i++) {
-         if (mask[i]) {
-            vl_putpixel(FLIP2(y[i])*_w_ + x[i], rgba);
-         }
-      }
-   } else {
-      /* draw all pixels */
-      for (i = 0; i < n; i++) {
-         vl_putpixel(FLIP2(y[i])*_w_ + x[i], rgba);
-      }
-   }
-}
-
-
-static void
-read_rgba_pixels (const GLcontext *ctx,
-                  GLuint n, const GLint x[], const GLint y[],
-                  GLubyte rgba[][4], const GLubyte mask[])
-{
-   const DMesaContext dmesa = (DMesaContext)ctx;
-   GLuint i, _w_ = DSTRIDE, _b_ = dmesa->buffer->height - 1;
-
-   if (mask) {
-      /* read some pixels */
-      for (i = 0; i < n; i++) {
-         if (mask[i]) {
-            vl_getrgba(FLIP2(y[i])*_w_ + x[i], rgba[i]);
-         }
-      }
-   } else {
-      /* read all pixels */
-      for (i = 0; i < n; i++) {
-         vl_getrgba(FLIP2(y[i])*_w_ + x[i], rgba[i]);
-      }
-   }
-}
-
-
-/****************************************************************************
- * Index
- ***************************************************************************/
-static void
-write_index_span (const GLcontext *ctx, struct gl_renderbuffer *rb,
-                  GLuint n, GLint x, GLint y,
-                  const GLuint index[], const GLubyte mask[])
-{
-   const DMesaContext dmesa = (DMesaContext)ctx;
-   GLuint i, offset;
-
-   offset = DSTRIDE * FLIP(y) + x;
-   if (mask) {
-      /* draw some pixels */
-      for (i = 0; i < n; i++, offset++) {
-         if (mask[i]) {
-            vl_putpixel(offset, index[i]);
-         }
-      }
-   } else {
-      /* draw all pixels */
-      for (i = 0; i < n; i++, offset++) {
-         vl_putpixel(offset, index[i]);
-      }
-   }
-}
-
-
-static void
-write_index8_span (const GLcontext *ctx, struct gl_renderbuffer *rb,
-                   GLuint n, GLint x, GLint y,
-                   const GLubyte index[], const GLubyte mask[])
-{
-   const DMesaContext dmesa = (DMesaContext)ctx;
-   GLuint i, offset;
-
-   offset = DSTRIDE * FLIP(y) + x;
-   if (mask) {
-      /* draw some pixels */
-      for (i = 0; i < n; i++, offset++) {
-         if (mask[i]) {
-            vl_putpixel(offset, index[i]);
-         }
-      }
-   } else {
-      /* draw all pixels */
-      for (i = 0; i < n; i++, offset++) {
-         vl_putpixel(offset, index[i]);
-      }
-   }
-}
-
-
-static void
-write_mono_index_span (const GLcontext *ctx, struct gl_renderbuffer *rb,
-                       GLuint n, GLint x, GLint y,
-                       GLuint colorIndex, const GLubyte mask[])
-{
-   const DMesaContext dmesa = (DMesaContext)ctx;
-   GLuint i, offset;
-
-   offset = DSTRIDE * FLIP(y) + x;
-   if (mask) {
-      /* draw some pixels */
-      for (i = 0; i < n; i++, offset++) {
-         if (mask[i]) {
-            vl_putpixel(offset, colorIndex);
-         }
-      }
-   } else {
-      /* draw all pixels */
-      for (i = 0; i < n; i++, offset++) {
-         vl_putpixel(offset, colorIndex);
-      }
-   }
-}
-
-
-static void
-read_index_span (const GLcontext *ctx, struct gl_renderbuffer *rb,
-                 GLuint n, GLint x, GLint y, GLuint index[])
-{
-   const DMesaContext dmesa = (DMesaContext)ctx;
-   GLuint i, offset;
-
-   offset = DSTRIDE * FLIP(y) + x;
-   /* read all pixels */
-   for (i = 0; i < n; i++, offset++) {
-      index[i] = vl_getpixel(offset);
-   }
-}
-
-
-static void
-write_index_pixels (const GLcontext *ctx, struct gl_renderbuffer *rb,
-                    GLuint n, const GLint x[], const GLint y[],
-                    const GLuint index[], const GLubyte mask[])
-{
-   const DMesaContext dmesa = (DMesaContext)ctx;
-   GLuint i, _w_ = DSTRIDE, _b_ = dmesa->buffer->height - 1;
-
-   if (mask) {
-      /* draw some pixels */
-      for (i = 0; i < n; i++) {
-         if (mask[i]) {
-            vl_putpixel(FLIP2(y[i])*_w_ + x[i], index[i]);
-         }
-      }
-   } else {
-      /* draw all pixels */
-      for (i = 0; i < n; i++) {
-         vl_putpixel(FLIP2(y[i])*_w_ + x[i], index[i]);
-      }
-   }
-}
-
-
-static void
-write_mono_index_pixels (const GLcontext *ctx, struct gl_renderbuffer *rb,
-                         GLuint n, const GLint x[], const GLint y[],
-                         GLuint colorIndex, const GLubyte mask[])
-{
-   const DMesaContext dmesa = (DMesaContext)ctx;
-   GLuint i, _w_ = DSTRIDE, _b_ = dmesa->buffer->height - 1;
-
-   if (mask) {
-      /* draw some pixels */
-      for (i = 0; i < n; i++) {
-         if (mask[i]) {
-            vl_putpixel(FLIP2(y[i])*_w_ + x[i], colorIndex);
-         }
-      }
-   } else {
-      /* draw all pixels */
-      for (i = 0; i < n; i++) {
-         vl_putpixel(FLIP2(y[i])*_w_ + x[i], colorIndex);
-      }
-   }
-}
-
-
-static void
-read_index_pixels (const GLcontext *ctx, struct gl_renderbuffer *rb,
-                   GLuint n, const GLint x[], const GLint y[],
-                   GLuint index[], const GLubyte mask[])
-{
-   const DMesaContext dmesa = (DMesaContext)ctx;
-   GLuint i, _w_ = DSTRIDE, _b_ = dmesa->buffer->height - 1;
-
-   if (mask) {
-      /* read some pixels */
-      for (i = 0; i < n; i++) {
-         if (mask[i]) {
-            index[i] = vl_getpixel(FLIP2(y[i])*_w_ + x[i]);
-         }
-      }
-   } else {
-      /* read all pixels */
-      for (i = 0; i < n; i++) {
-         index[i] = vl_getpixel(FLIP2(y[i])*_w_ + x[i]);
-      }
-   }
-}
-
-
-/****************************************************************************
- * Z-buffer
- ***************************************************************************/
-
-
-/****************************************************************************
- * Optimized triangle rendering
- ***************************************************************************/
-
-/*
- * NON-depth-buffered flat triangle.
- */
-#define NAME tri_rgb_flat
-
-#define SETUP_CODE \
-   const DMesaContext dmesa = (DMesaContext)ctx;\
-   GLuint _b_ = dmesa->buffer->height - 1;	\
-   GLuint _w_ = dmesa->buffer->width;		\
-   GLuint rgb = vl_mixrgb(v2->color);
-
-#define RENDER_SPAN(span) \
-   GLuint i, offset = FLIP2(span.y)*_w_ + span.x;\
-   for (i = 0; i < span.end; i++, offset++) {	\
-      vl_putpixel(offset, rgb);			\
-   }
-
-#include "swrast/s_tritemp.h"
-
-
-/*
- * Z-less flat triangle.
- */
-#define NAME tri_rgb_flat_zless
-
-#define INTERP_Z 1
-#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
-
-#define SETUP_CODE \
-   const DMesaContext dmesa = (DMesaContext)ctx; \
-   GLuint _b_ = dmesa->buffer->height - 1;	\
-   GLuint _w_ = dmesa->buffer->width;		\
-   GLuint rgb = vl_mixrgb(v2->color);
-
-#define RENDER_SPAN(span) \
-   GLuint i, offset = FLIP2(span.y)*_w_ + span.x;\
-   for (i = 0; i < span.end; i++, offset++) {	\
-      const DEPTH_TYPE z = FixedToDepth(span.z);\
-      if (z < zRow[i]) {			\
-         vl_putpixel(offset, rgb);		\
-         zRow[i] = z;				\
-      }						\
-      span.z += span.zStep;			\
-   }
-
-#include "swrast/s_tritemp.h"
-
-
-/*
- * NON-depth-buffered iterated triangle.
- */
-#define NAME tri_rgb_iter
-
-#define INTERP_RGB 1
-
-#define SETUP_CODE \
-   const DMesaContext dmesa = (DMesaContext)ctx;\
-   GLuint _b_ = dmesa->buffer->height - 1;	\
-   GLuint _w_ = dmesa->buffer->width;
-
-#define RENDER_SPAN(span) \
-   GLuint i, offset = FLIP2(span.y)*_w_ + span.x;			\
-   for (i = 0; i < span.end; i++, offset++) {				\
-      vl_putpixel(offset, vl_mixfix(span.red, span.green, span.blue));	\
-      span.red += span.redStep;						\
-      span.green += span.greenStep;					\
-      span.blue += span.blueStep;					\
-   }
-
-#include "swrast/s_tritemp.h"
-
-
-/*
- * Z-less iterated triangle.
- */
-#define NAME tri_rgb_iter_zless
-
-#define INTERP_Z 1
-#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
-#define INTERP_RGB 1
-
-#define SETUP_CODE \
-   const DMesaContext dmesa = (DMesaContext)ctx;\
-   GLuint _b_ = dmesa->buffer->height - 1;	\
-   GLuint _w_ = dmesa->buffer->width;
-
-#define RENDER_SPAN(span) \
-   GLuint i, offset = FLIP2(span.y)*_w_ + span.x;			\
-   for (i = 0; i < span.end; i++, offset++) {				\
-      const DEPTH_TYPE z = FixedToDepth(span.z);			\
-      if (z < zRow[i]) {						\
-         vl_putpixel(offset, vl_mixfix(span.red, span.green, span.blue));\
-         zRow[i] = z;							\
-      }									\
-      span.red += span.redStep;						\
-      span.green += span.greenStep;					\
-      span.blue += span.blueStep;					\
-      span.z += span.zStep;						\
-   }
-
-#include "swrast/s_tritemp.h"
-
-
-/*
- * Analyze context state to see if we can provide a fast triangle function
- * Otherwise, return NULL.
- */
-static swrast_tri_func
-dmesa_choose_tri_function (GLcontext *ctx)
-{
-   const SWcontext *swrast = SWRAST_CONTEXT(ctx);
-
-   if ((ctx->RenderMode != GL_RENDER)
-       || (ctx->Polygon.SmoothFlag)
-       || (ctx->Polygon.StippleFlag)
-       || (ctx->Texture._EnabledUnits)
-       || (swrast->_RasterMask & MULTI_DRAW_BIT)
-       || (ctx->Polygon.CullFlag && ctx->Polygon.CullFaceMode == GL_FRONT_AND_BACK)) {
-      return (swrast_tri_func)NULL;
-   }
-
-   if (swrast->_RasterMask==DEPTH_BIT
-       && ctx->Depth.Func==GL_LESS
-       && ctx->Depth.Mask==GL_TRUE
-       && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) {
-      return (ctx->Light.ShadeModel==GL_SMOOTH) ? tri_rgb_iter_zless : tri_rgb_flat_zless;
-   }
-
-   if (swrast->_RasterMask==0) { /* no depth test */
-      return (ctx->Light.ShadeModel==GL_SMOOTH) ? tri_rgb_iter : tri_rgb_flat;
-   }
-
-   return (swrast_tri_func)NULL;
-}
-
-
-/* Override for the swrast triangle-selection function.  Try to use one
- * of our internal triangle functions, otherwise fall back to the
- * standard swrast functions.
- */
-static void
-dmesa_choose_tri (GLcontext *ctx)
-{
-   SWcontext *swrast = SWRAST_CONTEXT(ctx);
-
-   if (!(swrast->Triangle=dmesa_choose_tri_function(ctx))) {
-      _swrast_choose_triangle(ctx);
-   }
-}
-
-
-/****************************************************************************
- * Optimized line rendering
- ***************************************************************************/
-
-/*
- * NON-depth-buffered flat line.
- */
-#define NAME line_rgb_flat
-
-#define INTERP_XY 1
-#define CLIP_HACK 1
-
-#define SETUP_CODE \
-   const DMesaContext dmesa = (DMesaContext)ctx;\
-   GLuint _b_ = dmesa->buffer->height - 1;	\
-   GLuint _w_ = dmesa->buffer->width;		\
-   GLuint rgb = vl_mixrgb(vert1->color);
-
-#define PLOT(X,Y) vl_putpixel(FLIP2(Y) * _w_ + X, rgb);
-
-#include "swrast/s_linetemp.h"
-
-
-/*
- * Z-less flat line.
- */
-#define NAME line_rgb_flat_zless
-
-#define INTERP_XY 1
-#define INTERP_Z 1
-#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
-#define CLIP_HACK 1
-
-#define SETUP_CODE \
-   const DMesaContext dmesa = (DMesaContext)ctx;\
-   GLuint _b_ = dmesa->buffer->height - 1;	\
-   GLuint _w_ = dmesa->buffer->width;		\
-   GLuint rgb = vl_mixrgb(vert1->color);
-
-#define PLOT(X,Y) \
-   if (Z < *zPtr) {				\
-      *zPtr = Z;				\
-      vl_putpixel(FLIP2(Y) * _w_ + X, rgb);	\
-   }
-
-#include "swrast/s_linetemp.h"
-
-
-/*
- * NON-depth-buffered iterated line.
- */
-#define line_rgb_iter NULL
-
-
-/*
- * Z-less iterated line.
- */
-#define line_rgb_iter_zless NULL
-
-
-/*
- * Analyze context state to see if we can provide a fast line function
- * Otherwise, return NULL.
- */
-static swrast_line_func
-dmesa_choose_line_function (GLcontext *ctx)
-{
-   const SWcontext *swrast = SWRAST_CONTEXT(ctx);
-
-   if ((ctx->RenderMode != GL_RENDER)
-       || (ctx->Line.SmoothFlag)
-       || (ctx->Texture._EnabledUnits)
-       || (ctx->Line.StippleFlag)
-       || (swrast->_RasterMask & MULTI_DRAW_BIT)
-       || (ctx->Line.Width!=1.0F)) {
-      return (swrast_line_func)NULL;
-   }
-
-   if (swrast->_RasterMask==DEPTH_BIT
-       && ctx->Depth.Func==GL_LESS
-       && ctx->Depth.Mask==GL_TRUE
-       && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) {
-      return (ctx->Light.ShadeModel==GL_SMOOTH) ? line_rgb_iter_zless : line_rgb_flat_zless;
-   }
-
-   if (swrast->_RasterMask==0) { /* no depth test */
-      return (ctx->Light.ShadeModel==GL_SMOOTH) ? line_rgb_iter : line_rgb_flat;
-   }
-
-   return (swrast_line_func)NULL;
-}
-
-
-/* Override for the swrast line-selection function.  Try to use one
- * of our internal line functions, otherwise fall back to the
- * standard swrast functions.
- */
-static void
-dmesa_choose_line (GLcontext *ctx)
-{
-   SWcontext *swrast = SWRAST_CONTEXT(ctx);
-
-   if (!(swrast->Line=dmesa_choose_line_function(ctx))) {
-      _swrast_choose_line(ctx);
-   }
-}
-
-
-/****************************************************************************
- * Miscellaneous device driver funcs
- ***************************************************************************/
-static const struct gl_texture_format *
-choose_tex_format (GLcontext *ctx, GLint internalFormat,
-                   GLenum format, GLenum type)
-{
-   switch (internalFormat) {
-      case GL_COMPRESSED_RGB_ARB:
-         return &_mesa_texformat_rgb;
-      case GL_COMPRESSED_RGBA_ARB:
-         return &_mesa_texformat_rgba;
-      default:
-         return _mesa_choose_tex_format(ctx, internalFormat, format, type);
-   }
-}
-
-
-static void
-clear_index (GLcontext *ctx, GLuint index)
-{
-   ((DMesaContext)ctx)->ClearIndex = index;
-}
-
-
-static void
-clear_color (GLcontext *ctx, const GLfloat color[4])
-{
-   GLubyte col[4];
-   CLAMPED_FLOAT_TO_UBYTE(col[0], color[0]);
-   CLAMPED_FLOAT_TO_UBYTE(col[1], color[1]);
-   CLAMPED_FLOAT_TO_UBYTE(col[2], color[2]);
-   CLAMPED_FLOAT_TO_UBYTE(col[3], color[3]);
-   ((DMesaContext)ctx)->ClearColor = vl_mixrgba(col);
-}
-
-
-static void
-clear (GLcontext *ctx, GLbitfield mask, GLboolean all,
-       GLint x, GLint y, GLint width, GLint height)
-{
-   const DMesaContext c = (DMesaContext)ctx;
-   const GLuint *colorMask = (GLuint *)&ctx->Color.ColorMask;
-
-   /*
-    * Clear the specified region of the buffers indicated by 'mask'
-    * using the clear color or index as specified by one of the two
-    * functions above.
-    * If all==GL_TRUE, clear whole buffer, else just clear region defined
-    * by x,y,width,height
-    */
-
-   /* we can't handle color or index masking */
-   if ((*colorMask == 0xffffffff) && (ctx->Color.IndexMask == 0xffffffff)) {
-      if (mask & DD_BACK_LEFT_BIT) {
-         int color = ((GLvisual *)(c->visual))->rgbMode ? c->ClearColor : c->ClearIndex;
-
-         if (all) {
-            vl_clear(color);
-         } else {
-            vl_rect(x, c->buffer->height - y - height, width, height, color);
-         }
-
-         mask &= ~DD_BACK_LEFT_BIT;
-      }
-   }
-
-   if (mask) {
-      _swrast_Clear(ctx, mask, all, x, y, width, height);
-   }
-}
-
-
-/*
- * Return the width and height of the current buffer.
- * If anything special has to been done when the buffer/window is
- * resized, do it now.
- */
-static void
-get_buffer_size (GLframebuffer *buffer, GLuint *width, GLuint *height)
-{
-   DMesaBuffer b = (DMesaBuffer)buffer;
-
-   *width  = b->width;
-   *height = b->height;
-}
-
-
-static void
-viewport(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h)
-{
-   /* poll for window size change and realloc software Z/stencil/etc if needed */
-   _mesa_ResizeBuffersMESA();
-}
-
-
-static const GLubyte *
-get_string (GLcontext *ctx, GLenum name)
-{
-   switch (name) {
-      case GL_RENDERER:
-         return (const GLubyte *)"Mesa DJGPP";
-      default:
-         return NULL;
-   }
-}
-
-
-static void
-finish (GLcontext *ctx)
-{
-   /*
-    * XXX todo - OPTIONAL FUNCTION: implements glFinish if possible
-    */
-}
-
-
-static void
-flush (GLcontext *ctx)
-{
-   /*
-    * XXX todo - OPTIONAL FUNCTION: implements glFlush if possible
-    */
-}
-
-
-/****************************************************************************
- * State
- ***************************************************************************/
-#define DMESA_NEW_LINE (_NEW_LINE | \
-                        _NEW_TEXTURE | \
-                        _NEW_LIGHT | \
-                        _NEW_DEPTH | \
-                        _NEW_RENDERMODE | \
-                        _SWRAST_NEW_RASTERMASK)
-
-#define DMESA_NEW_TRIANGLE (_NEW_POLYGON | \
-                            _NEW_TEXTURE | \
-                            _NEW_LIGHT | \
-                            _NEW_DEPTH | \
-                            _NEW_RENDERMODE | \
-                            _SWRAST_NEW_RASTERMASK)
-
-/* Extend the software rasterizer with our line and triangle
- * functions.
- */
-static void
-dmesa_register_swrast_functions (GLcontext *ctx)
-{
-   SWcontext *swrast = SWRAST_CONTEXT(ctx);
-
-   swrast->choose_line = dmesa_choose_line;
-   swrast->choose_triangle = dmesa_choose_tri;
-
-   swrast->InvalidateLineMask |= DMESA_NEW_LINE;
-   swrast->InvalidateTriangleMask |= DMESA_NEW_TRIANGLE;
-}
-
-
-static void
-dmesa_update_state (GLcontext *ctx, GLuint new_state)
-{
-   /* Propagate statechange information to swrast and swrast_setup
-    * modules. The DMesa driver has no internal GL-dependent state.
-    */
-   _swrast_InvalidateState( ctx, new_state );
-   _ac_InvalidateState( ctx, new_state );
-   _tnl_InvalidateState( ctx, new_state );
-   _swsetup_InvalidateState( ctx, new_state );
-}
-
-
-/* Initialize the device driver function table with the functions
- * we implement in this driver.
- */
-static void
-dmesa_init_driver_functions (DMesaVisual visual,
-                             struct dd_function_table *driver)
-{
-   driver->UpdateState = dmesa_update_state;
-   driver->GetString = get_string;
-   driver->GetBufferSize = get_buffer_size;
-   driver->Viewport = viewport;
-   driver->Flush = flush;
-   driver->Finish = finish;
-   driver->Clear = clear;
-   driver->ClearColor = clear_color;
-   driver->ClearIndex = clear_index;
-#if SWTC
-   driver->ChooseTextureFormat = choose_tex_format;
-#endif
-}
-
-
-/* Setup pointers and other driver state that is constant for the life
- * of a context.
- */
-static void
-dmesa_init_pointers (GLcontext *ctx)
-{
-   struct swrast_device_driver *dd = _swrast_GetDeviceDriverReference(ctx);
-
-   /* The span functions should be in `dmesa_update_state', but I'm
-    * pretty sure they will never change during the life of the Visual
-    */
-
-   /* Index span/pixel functions */
-   dd->WriteCI32Span = write_index_span;
-   dd->WriteCI8Span = write_index8_span;
-   dd->WriteMonoCISpan = write_mono_index_span;
-   dd->WriteCI32Pixels = write_index_pixels;
-   dd->WriteMonoCIPixels = write_mono_index_pixels;
-   dd->ReadCI32Span = read_index_span;
-   dd->ReadCI32Pixels = read_index_pixels;
-
-   /* RGB(A) span/pixel functions */
-   dd->WriteRGBASpan = write_rgba_span;
-   dd->WriteRGBSpan = write_rgb_span;
-   dd->WriteMonoRGBASpan = write_mono_rgba_span;
-   dd->WriteRGBAPixels = write_rgba_pixels;
-   dd->WriteMonoRGBAPixels = write_mono_rgba_pixels;
-   dd->ReadRGBASpan = read_rgba_span;
-   dd->ReadRGBAPixels = read_rgba_pixels;
-}
-#endif /* FX */
+static DMesaContext ctx;
 
 
 /****************************************************************************
@@ -960,131 +98,50 @@
                    GLint stencilSize,
                    GLint accumSize)
 {
-   DMesaVisual v;
-   GLint redBits, greenBits, blueBits, alphaBits, indexBits;
-   GLboolean sw_alpha;
+    DMesaVisual visual;
+    GLenum format;
+    int fbbits;
 
-   alphaBits = 0;
+    if (dbFlag) {
+	return NULL;
+    }
 
-   if (!rgbFlag) {
-      indexBits = 8;
-      redBits = 0;
-      greenBits = 0;
-      blueBits = 0;
-   } else {
-      indexBits = 0;
-      switch (colDepth) {
-         case 8:
-            redBits = 8;
-            greenBits = 8;
-            blueBits = 8;
-            break;
-         case 15:
-            alphaBits = 1;
-            redBits = 5;
-            greenBits = 5;
-            blueBits = 5;
-            break;
-         case 16:
-            redBits = 5;
-            greenBits = 6;
-            blueBits = 5;
-            break;
-         case 32:
-            alphaBits = 8;
-         case 24:
-            redBits = 8;
-            greenBits = 8;
-            blueBits = 8;
-            break;
-         default:
-            return NULL;
-      }
-   }
+    if (!rgbFlag) {
+	format = OSMESA_COLOR_INDEX;
+	fbbits = 8;
+    } else if (alphaSize) {
+	format = OSMESA_BGRA;
+	fbbits = 32;
+    } else if (colDepth == 15 || colDepth == 16) {
+	format = OSMESA_RGB_565;
+	fbbits = 16;
+    } else {
+	format = OSMESA_BGR;
+	fbbits = 24;
+    }
 
-   /* Okay,
-    * `alphaBits' is what we can provide
-    * `alphaSize' is what app requests
-    *
-    * Note that alpha buffering is required only if destination alpha is used
-    * in alpha blending; alpha blending modes that do not use destination alpha
-    * can be used w/o alpha buffer.
-    *
-    * We will use whatever ALPHA app requests. Later, in `CreateBuffer' we'll
-    * instruct Mesa to use its own ALPHA buffer, by passing a non-FALSE value
-    * for ALPHA to `_mesa_initialize_framebuffer'.
-    *
-    * Basically, 32bit modes provide ALPHA storage, but can we rely on this?
-    */
-   alphaBits = alphaSize;
-   sw_alpha = (alphaBits > 0);
+    if ((visual = (DMesaVisual)CALLOC_STRUCT(dmesa_visual)) == NULL) {
+	return NULL;
+    }
 
-#ifndef FX
-   if (!dbFlag) {
-      return NULL;
-   }
-   if ((colDepth=vl_video_init(width, height, colDepth, rgbFlag, refresh)) <= 0) {
-      return NULL;
-   }
-#else  /* FX */
-   if (!rgbFlag) {
-      return NULL;
-   } else {
-      char *env;
+    if (vl_video_init(width, height, colDepth, rgbFlag, refresh, fbbits) <= 0) {
+	FREE(visual);
+	return NULL;
+    }
 
-      if ((env = getenv("MESA_FX_INFO")) && (env[0] == 'r')) {
-         freopen("MESA.LOG", "w", stderr);
-      }
-
-      if (refresh && (((env = getenv("FX_GLIDE_REFRESH")) == NULL) || !atoi(env))) {
-         /* if we are passed non-zero value for refresh, we need to override
-          * default refresh rate. However, if FX_GLIDE_REFRESH is already set
-          * to 0, we won't override it, because it has a special meaning for
-          * DJGPP Glide3x (switch via VESA, using BIOS default refresh).
-          */
-         char tmp[32];
-         sprintf(tmp, "FX_GLIDE_REFRESH=%u", refresh);
-         putenv(tmp);
-      }
-   }
-#endif /* FX */
-
-   if ((v=(DMesaVisual)CALLOC_STRUCT(dmesa_visual)) != NULL) {
-      /* Create core visual */
-      _mesa_initialize_visual((GLvisual *)v,
-                              rgbFlag,		/* rgb */
-                              dbFlag,
-                              GL_FALSE,		/* stereo */
-                              redBits,
-                              greenBits,
-                              blueBits,
-                              alphaBits,
-                              indexBits,		/* indexBits */
-                              depthSize,
-                              stencilSize,
-                              accumSize,		/* accumRed */
-                              accumSize,		/* accumGreen */
-                              accumSize,		/* accumBlue */
-                              alphaBits?accumSize:0,	/* accumAlpha */
-                              1);			/* numSamples */
-
-#ifndef FX
-      v->sw_alpha = sw_alpha;
-      v->z_buffer = (depthSize > 0) ? 1 : 0;
-#endif
-   }
-
-   return v;
+    visual->format = format;
+    visual->depthBits = depthSize;
+    visual->stencilBits = stencilSize;
+    visual->accumBits = accumSize;
+    return visual;
 }
 
 
 void
-DMesaDestroyVisual (DMesaVisual v)
+DMesaDestroyVisual (DMesaVisual visual)
 {
-#ifndef FX
    vl_video_exit();
-#endif
-   _mesa_destroy_visual((GLvisual *)v);
+   FREE(visual);
 }
 
 
@@ -1093,248 +150,168 @@
                    GLint xpos, GLint ypos,
                    GLint width, GLint height)
 {
-#ifndef FX
-   DMesaBuffer b;
+    DMesaBuffer buffer;
+    GLenum type;
+    int bytesPerPixel;
 
-   if ((b=(DMesaBuffer)CALLOC_STRUCT(dmesa_buffer)) != NULL) {
-      _mesa_initialize_framebuffer((GLframebuffer *)b,
-                                   (GLvisual *)visual,
-                                   visual->z_buffer == 1,
-                                   ((GLvisual *)visual)->stencilBits > 0,
-                                   ((GLvisual *)visual)->accumRedBits > 0,
-                                   visual->sw_alpha);
-      b->xpos = xpos;
-      b->ypos = ypos;
-      b->width = width;
-      b->height = height;
-   }
+    switch (visual->format) {
+	case OSMESA_COLOR_INDEX:
+	    bytesPerPixel = 1;
+	    type = CHAN_TYPE;
+	    break;
+	case OSMESA_RGB_565:
+	    bytesPerPixel = 2;
+	    type = GL_UNSIGNED_SHORT_5_6_5;
+	    break;
+	case OSMESA_BGR:
+	    bytesPerPixel = 3;
+	    type = CHAN_TYPE;
+	    break;
+	default:
+	    bytesPerPixel = 4;
+	    type = CHAN_TYPE;
+    }
 
-   return b;
-#else  /* FX */
+    if ((buffer = (DMesaBuffer)CALLOC_STRUCT(dmesa_buffer)) != NULL) {
+	buffer->xpos = xpos;
+	buffer->ypos = ypos;
+	buffer->width = width;
+	buffer->height = height;
+	buffer->type = type;
+	buffer->the_window = MALLOC(width * height * bytesPerPixel + 1);
+	if (buffer->the_window == NULL) {
+	    FREE(buffer);
+	    buffer = NULL;
+	}
+    }
 
-   GLvisual *v = (GLvisual *)visual;
-   int i = 0, fx_attrib[32];
-
-   if (v->doubleBufferMode) fx_attrib[i++] = FXMESA_DOUBLEBUFFER;
-   if (v->depthBits > 0) { fx_attrib[i++] = FXMESA_DEPTH_SIZE; fx_attrib[i++] = v->depthBits; }
-   if (v->stencilBits > 0) { fx_attrib[i++] = FXMESA_STENCIL_SIZE; fx_attrib[i++] = v->stencilBits; }
-   if (v->accumRedBits > 0) { fx_attrib[i++] = FXMESA_ACCUM_SIZE; fx_attrib[i++] = v->accumRedBits; }
-   if (v->alphaBits) { fx_attrib[i++] = FXMESA_ALPHA_SIZE; fx_attrib[i++] = v->alphaBits; }
-   fx_attrib[i++] = FXMESA_COLORDEPTH;
-   fx_attrib[i++] = v->redBits + v->greenBits + v->blueBits;
-   fx_attrib[i] = FXMESA_NONE;
-
-   return (DMesaBuffer)fxMesaCreateBestContext(-1, width, height, fx_attrib);
-#endif /* FX */
+    return buffer;
 }
 
 
 void
-DMesaDestroyBuffer (DMesaBuffer b)
+DMesaDestroyBuffer (DMesaBuffer buffer)
 {
-#ifndef FX
-   if (b->the_window != NULL) {
-      free(b->the_window);
-   }
-   _mesa_destroy_framebuffer((GLframebuffer *)b);
-#else
-   fxMesaDestroyContext((fxMesaContext)b);
-#endif
+    FREE(buffer->the_window);
+    FREE(buffer);
 }
 
 
 DMesaContext
 DMesaCreateContext (DMesaVisual visual, DMesaContext share)
 {
-   GLcontext *c;
-#ifndef FX
-   TNLcontext *tnl;
-   struct dd_function_table functions;
-
-   if ((c=(GLcontext *)CALLOC_STRUCT(dmesa_context)) != NULL) {
-      /* Initialize device driver function table */
-      _mesa_init_driver_functions(&functions);
-      /* override with our functions */
-      dmesa_init_driver_functions(visual, &functions);
-
-      _mesa_initialize_context(c,
-                               (GLvisual *)visual,
-                               (GLcontext *)share,
-                               &functions,
-                               (void *)c);
- 
-      _mesa_enable_sw_extensions(c);
-      _mesa_enable_1_3_extensions(c);
-      _mesa_enable_1_4_extensions(c);
-      _mesa_enable_1_5_extensions(c);
-      _mesa_enable_2_0_extensions(c);
-#if SWTC
-      if (c->Mesa_DXTn) {
-         _mesa_enable_extension(c, "GL_EXT_texture_compression_s3tc");
-         _mesa_enable_extension(c, "GL_S3_s3tc");
-      }
-      _mesa_enable_extension(c, "GL_3DFX_texture_compression_FXT1");
-#endif
-
-      /* you probably have to do a bunch of other initializations here. */
-      ((DMesaContext)c)->visual = visual;
-
-      /* Initialize the software rasterizer and helper modules.
-       */
-      _swrast_CreateContext(c);
-      _ac_CreateContext(c);
-      _tnl_CreateContext(c);
-      _swsetup_CreateContext(c);
-      /* tnl setup */
-      tnl = TNL_CONTEXT(c);
-      tnl->Driver.RunPipeline = _tnl_run_pipeline;
-      /* swrast setup */
-      if (((GLvisual *)visual)->rgbMode) dmesa_register_swrast_functions(c);
-      dmesa_init_pointers(c);
-      _swsetup_Wakeup(c);
-   }
-
-#else  /* FX */
-   c = (GLcontext *)0xdeadbeef;
-#endif /* FX */
-
-   return (DMesaContext)c;
+    DMesaContext dmesa;
+    if ((dmesa = (DMesaContext)CALLOC_STRUCT(dmesa_context)) != NULL) {
+	dmesa->osmesa = OSMesaCreateContextExt(
+				visual->format,
+				visual->depthBits,
+				visual->stencilBits,
+				visual->accumBits,
+				(share != NULL) ? share->osmesa : NULL);
+	if (dmesa->osmesa == NULL) {
+	    FREE(dmesa);
+	    dmesa = NULL;
+	}
+    }
+    return dmesa;
 }
 
 
 void
-DMesaDestroyContext (DMesaContext c)
+DMesaDestroyContext (DMesaContext dmesa)
 {
-#ifndef FX
-   if (c) {
-      _swsetup_DestroyContext((GLcontext *)c);
-      _swrast_DestroyContext((GLcontext *)c);
-      _tnl_DestroyContext((GLcontext *)c);
-      _ac_DestroyContext((GLcontext *)c);
-      _mesa_destroy_context((GLcontext *)c);
-   }
-#endif
+    OSMesaDestroyContext(dmesa->osmesa);
+    FREE(dmesa);
 }
 
 
 GLboolean
 DMesaMoveBuffer (GLint xpos, GLint ypos)
 {
-#ifndef FX
-   GET_CURRENT_CONTEXT(ctx);
-   DMesaBuffer b = ((DMesaContext)ctx)->buffer;
+    const DMesaContext dmesa = DMesaGetCurrentContext();
+    DMesaBuffer b = dmesa->buffer;
 
-   if (vl_sync_buffer(&b->the_window, xpos, ypos, b->width, b->height) == 0) {
-      b->xpos = xpos;
-      b->ypos = ypos;
-      return GL_TRUE;
-   }
-#endif
+    if (vl_sync_buffer(&b->the_window, xpos, ypos, b->width, b->height) == 0) {
+	b->xpos = xpos;
+	b->ypos = ypos;
+	return GL_TRUE;
+    }
 
-   return GL_FALSE;
+    return GL_FALSE;
 }
 
 
 GLboolean
 DMesaResizeBuffer (GLint width, GLint height)
 {
-#ifndef FX
-   GET_CURRENT_CONTEXT(ctx);
-   DMesaBuffer b = ((DMesaContext)ctx)->buffer;
+    const DMesaContext dmesa = DMesaGetCurrentContext();
+    DMesaBuffer b = dmesa->buffer;
 
-   if (vl_sync_buffer(&b->the_window, b->xpos, b->ypos, width, height) == 0) {
-      b->width = width;
-      b->height = height;
-      return GL_TRUE;
-   }
-#endif
+    if (vl_sync_buffer(&b->the_window, b->xpos, b->ypos, width, height) == 0) {
+	b->width = width;
+	b->height = height;
+	return GL_TRUE;
+    }
 
-   return GL_FALSE;
+    return GL_FALSE;
 }
 
 
-/*
- * Make the specified context and buffer the current one.
- */
 GLboolean
-DMesaMakeCurrent (DMesaContext c, DMesaBuffer b)
+DMesaMakeCurrent (DMesaContext dmesa, DMesaBuffer buffer)
 {
-#ifndef FX
-   if ((c != NULL) && (b != NULL)) {
-      if (vl_sync_buffer(&b->the_window, b->xpos, b->ypos, b->width, b->height) != 0) {
-         return GL_FALSE;
-      }
-
-      c->buffer = b;
-
-      _mesa_make_current((GLcontext *)c, (GLframebuffer *)b);
-   }
-   else {
-      /* Detach */
-      _mesa_make_current(NULL, NULL);
-   }
-
-#else
-   fxMesaMakeCurrent((fxMesaContext)b);
-#endif
-
-   return GL_TRUE;
+    if (dmesa == NULL || buffer == NULL) {
+	ctx = NULL;
+	return GL_TRUE;
+    }
+    if (OSMesaMakeCurrent(dmesa->osmesa, buffer->the_window,
+			  buffer->type,
+			  buffer->width, buffer->height) &&
+	vl_sync_buffer(&buffer->the_window, buffer->xpos, buffer->ypos, buffer->width, buffer->height) == 0) {
+	OSMesaPixelStore(OSMESA_Y_UP, GL_FALSE);
+	dmesa->buffer = buffer;
+	ctx = dmesa;
+	return GL_TRUE;
+    }
+    return GL_FALSE;
 }
 
 
 void
-DMesaSwapBuffers (DMesaBuffer b)
+DMesaSwapBuffers (DMesaBuffer buffer)
 {
-   /* copy/swap back buffer to front if applicable */
-#ifndef FX
-   GET_CURRENT_CONTEXT(ctx);
-   _mesa_notifySwapBuffers(ctx);
-   vl_flip();
-#else
-   fxMesaSwapBuffers();
-#endif
+    /* copy/swap back buffer to front if applicable */
+    GET_CURRENT_CONTEXT(ctx);
+    _mesa_notifySwapBuffers(ctx);
+    vl_flip();
+    (void)buffer;
 }
 
 
 void
 DMesaSetCI (int ndx, GLfloat red, GLfloat green, GLfloat blue)
 {
-#ifndef FX
-   vl_setCI(ndx, red, green, blue);
-#endif
+    vl_setCI(ndx, red, green, blue);
 }
 
 
 DMesaContext
 DMesaGetCurrentContext (void)
 {
-   GET_CURRENT_CONTEXT(ctx);
-
-#ifndef FX
-#else
-   if (ctx != NULL) {
-      ctx = (GLcontext *)0xdeadbeef;
-   }
-#endif
-
-   return (DMesaContext)ctx;
+   return ctx;
 }
 
 
 DMesaBuffer
 DMesaGetCurrentBuffer (void)
 {
-   const DMesaContext dmesa = DMesaGetCurrentContext();
+    const DMesaContext dmesa = DMesaGetCurrentContext();
 
-   if (dmesa == NULL) {
-      return NULL;
-   }
+    if (dmesa != NULL) {
+	return dmesa->buffer;
+    }
 
-#ifndef FX
-   return dmesa->buffer;
-#else
-   return (DMesaBuffer)fxMesaGetCurrentContext();
-#endif
+    return NULL;
 }
 
 
@@ -1355,61 +332,28 @@
 int
 DMesaGetIntegerv (GLenum pname, GLint *params)
 {
-   switch (pname) {
-      case DMESA_GET_SCREEN_SIZE:
-         #ifndef FX
-         vl_get(VL_GET_SCREEN_SIZE, params);
-         #else
-         fxGetScreenGeometry(&params[0], &params[1]);
-         #endif
-         break;
-      case DMESA_GET_DRIVER_CAPS:
-         #ifndef FX
-         params[0] = DMESA_DRIVER_SWDB_BIT;
-         #else
-         params[0] = DMESA_DRIVER_LLWO_BIT;
-         #endif
-         break;
-      case DMESA_GET_VIDEO_MODES:
-         #ifndef FX
-         return vl_get(VL_GET_VIDEO_MODES, params);
-         #else
-         return -1; /* TODO */
-         #endif
-      case DMESA_GET_BUFFER_ADDR: {
-         #ifndef FX
-         DMesaContext c = (DMesaContext)DMesaGetCurrentContext();
-         if (c != NULL) {
-            DMesaBuffer b = c->buffer;
-            if (b != NULL) {
-               params[0] = (GLint)b->the_window;
-            }
-         }
-         break;
-         #else
-         return -1;
-         #endif
-      }
-      default:
-         return -1;
-   }
+    switch (pname) {
+	case DMESA_GET_SCREEN_SIZE:
+	    vl_get(VL_GET_SCREEN_SIZE, params);
+	    break;
+	case DMESA_GET_DRIVER_CAPS:
+	    params[0] = 0;
+	    break;
+	case DMESA_GET_VIDEO_MODES:
+	    return vl_get(VL_GET_VIDEO_MODES, params);
+	case DMESA_GET_BUFFER_ADDR: {
+	    const DMesaContext dmesa = DMesaGetCurrentContext();
+	    if (dmesa != NULL) {
+		DMesaBuffer b = dmesa->buffer;
+		if (b != NULL) {
+		    params[0] = (GLint)b->the_window;
+		}
+	    }
+	    break;
+	}
+	default:
+	    return -1;
+    }
 
-   return 0;
+    return 0;
 }
-
-
-#if SWTC && (((__DJGPP__ << 8) | __DJGPP_MINOR__) >= 0x204)
-#include <sys/dxe.h>
-
-extern_asm(___dj_assert);
-extern_asm(_free);
-extern_asm(_malloc);
-extern_asm(_memset);
-
-DXE_EXPORT_TABLE_AUTO (___dxe_eta___dxtn)
-   DXE_EXPORT_ASM (___dj_assert)
-   DXE_EXPORT_ASM (_free)
-   DXE_EXPORT_ASM (_malloc)
-   DXE_EXPORT_ASM (_memset)
-DXE_EXPORT_END
-#endif
diff --git a/src/mesa/drivers/dos/dpmi.c b/src/mesa/drivers/dos/dpmi.c
index b2cef04..bd33b88 100644
--- a/src/mesa/drivers/dos/dpmi.c
+++ b/src/mesa/drivers/dos/dpmi.c
@@ -23,9 +23,9 @@
  */
 
 /*
- * DOS/DJGPP device driver v1.5 for Mesa
+ * DOS/DJGPP device driver for Mesa
  *
- *  Copyright (C) 2002 - Borca Daniel
+ *  Author: Daniel Borca
  *  Email : dborca@yahoo.com
  *  Web   : http://www.geocities.com/dborca
  */
diff --git a/src/mesa/drivers/dos/internal.h b/src/mesa/drivers/dos/internal.h
index 85b94d3..0fa7c77 100644
--- a/src/mesa/drivers/dos/internal.h
+++ b/src/mesa/drivers/dos/internal.h
@@ -23,9 +23,9 @@
  */
 
 /*
- * DOS/DJGPP device driver v1.6 for Mesa
+ * DOS/DJGPP device driver for Mesa
  *
- *  Copyright (C) 2002 - Borca Daniel
+ *  Author: Daniel Borca
  *  Email : dborca@users.sourceforge.net
  *  Web   : http://www.geocities.com/dborca
  */
@@ -54,6 +54,8 @@
 #define _16_ *(word16 *)&
 #define _32_ *(word32 *)&
 
+typedef void (*BLTFUNC) (void);
+
 
 /*
  * video mode structure
@@ -75,7 +77,7 @@
  */
 typedef struct {
    vl_mode *(*init) (void);
-   int (*entermode) (vl_mode *p, int refresh);
+   int (*entermode) (vl_mode *p, int refresh, int fbbits);
    void (*blit) (void);
    void (*setCI_f) (int index, float red, float green, float blue);
    void (*setCI_i) (int index, int red, int green, int blue);
@@ -100,32 +102,4 @@
 int _can_mmx (void);
 
 
-/*
- * asm routines to deal with virtual buffering
- */
-extern void v_clear8 (int color);
-#define v_clear15 v_clear16
-extern void v_clear16 (int color);
-extern void v_clear24 (int color);
-extern void v_clear32 (int color);
-
-extern void v_clear8_mmx (int color);
-#define v_clear15_mmx v_clear16_mmx
-extern void v_clear16_mmx (int color);
-extern void v_clear24_mmx (int color);
-extern void v_clear32_mmx (int color);
-
-extern void v_rect8 (int x, int y, int width, int height, int color);
-#define v_rect15 v_rect16
-extern void v_rect16 (int x, int y, int width, int height, int color);
-extern void v_rect24 (int x, int y, int width, int height, int color);
-extern void v_rect32 (int x, int y, int width, int height, int color);
-
-extern void v_putpixel8 (unsigned int offset, int color);
-#define v_putpixel15 v_putpixel16
-extern void v_putpixel16 (unsigned int offset, int color);
-extern void v_putpixel24 (unsigned int offset, int color);
-extern void v_putpixel32 (unsigned int offset, int color);
-
-
 #endif
diff --git a/src/mesa/drivers/dos/null.c b/src/mesa/drivers/dos/null.c
index 369255a..5584629 100644
--- a/src/mesa/drivers/dos/null.c
+++ b/src/mesa/drivers/dos/null.c
@@ -23,9 +23,9 @@
  */
 
 /*
- * DOS/DJGPP device driver v1.7 for Mesa
+ * DOS/DJGPP device driver for Mesa
  *
- *  Copyright (C) 2002 - Borca Daniel
+ *  Author: Daniel Borca
  *  Email : dborca@users.sourceforge.net
  *  Web   : http://www.geocities.com/dborca
  */
@@ -137,13 +137,13 @@
  * Note: -
  */
 static int
-null_entermode (vl_mode *p, int refresh)
+null_entermode (vl_mode *p, int refresh, int fbbits)
 {
    NUL.blit = null_blit_nop;
 
    return 0;
 
-   (void)(p && refresh); /* silence compiler warning */
+   (void)(p && refresh && fbbits); /* silence compiler warning */
 }
 
 
diff --git a/src/mesa/drivers/dos/null.h b/src/mesa/drivers/dos/null.h
index a38accc..bbdc796 100644
--- a/src/mesa/drivers/dos/null.h
+++ b/src/mesa/drivers/dos/null.h
@@ -23,9 +23,9 @@
  */
 
 /*
- * DOS/DJGPP device driver v1.6 for Mesa
+ * DOS/DJGPP device driver for Mesa
  *
- *  Copyright (C) 2002 - Borca Daniel
+ *  Author: Daniel Borca
  *  Email : dborca@yahoo.com
  *  Web   : http://www.geocities.com/dborca
  */
diff --git a/src/mesa/drivers/dos/vesa.c b/src/mesa/drivers/dos/vesa.c
index cd48a24..3fdd3e2 100644
--- a/src/mesa/drivers/dos/vesa.c
+++ b/src/mesa/drivers/dos/vesa.c
@@ -23,9 +23,9 @@
  */
 
 /*
- * DOS/DJGPP device driver v1.6 for Mesa
+ * DOS/DJGPP device driver for Mesa
  *
- *  Copyright (C) 2002 - Borca Daniel
+ *  Author: Daniel Borca
  *  Email : dborca@users.sourceforge.net
  *  Web   : http://www.geocities.com/dborca
  */
@@ -86,16 +86,16 @@
  * VESA 3.0 CRTC timings structure
  */
 typedef struct CRTCInfoBlock {
-   unsigned short HorizontalTotal;
-   unsigned short HorizontalSyncStart;
-   unsigned short HorizontalSyncEnd;
-   unsigned short VerticalTotal;
-   unsigned short VerticalSyncStart;
-   unsigned short VerticalSyncEnd;
-   unsigned char  Flags;
-   unsigned long  PixelClock;         /* units of Hz */
-   unsigned short RefreshRate;        /* units of 0.01 Hz */
-   unsigned char  reserved[40];
+    unsigned short HorizontalTotal;
+    unsigned short HorizontalSyncStart;
+    unsigned short HorizontalSyncEnd;
+    unsigned short VerticalTotal;
+    unsigned short VerticalSyncStart;
+    unsigned short VerticalSyncEnd;
+    unsigned char  Flags;
+    unsigned long  PixelClock;	/* units of Hz */
+    unsigned short RefreshRate;	/* units of 0.01 Hz */
+    unsigned char  reserved[40];
 } __PACKED__ CRTCInfoBlock;
 
 #define HNEG         (1 << 2)
@@ -113,116 +113,122 @@
 static vl_mode *
 vesa_init (void)
 {
-   __dpmi_regs r;
-   word16 *p;
-   vl_mode *q;
-   char vesa_info[512], tmp[512];
-   int maxsize = 0;
-   word32 linearfb = 0;
+    __dpmi_regs r;
+    word16 *p;
+    vl_mode *q;
+    char vesa_info[512], tmp[512];
+    int maxsize = 0;
+    word32 linearfb = 0;
 
-   if (vesa_ver) {
-      return modes;
-   }
+    if (vesa_ver) {
+	return modes;
+    }
 
-   _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;
-   }
+    _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;
-      }
+    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) {
-         q->xres = _16_ tmp[M_XRES];
-         q->yres = _16_ tmp[M_YRES];
-         q->scanlen = _16_ tmp[M_SCANLEN];
-         q->gran = (_16_ tmp[M_GRAN])<<10;
-         if (tmp[M_ATTR] & 0x80) {
-            vl_mode *q1 = q + 1;
-            *q1 = *q++;
-            linearfb = _32_ tmp[M_PHYS_PTR];
-            q->mode |= 0x4000;
-         }
-         if (maxsize < (q->scanlen * q->yres)) {
-            maxsize = q->scanlen * q->yres;
-         }
-         q++;
-      }
-   } while (TRUE);
+	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) {
+	    q->xres = _16_ tmp[M_XRES];
+	    q->yres = _16_ tmp[M_YRES];
+	    q->scanlen = _16_ tmp[M_SCANLEN];
+	    q->gran = (_16_ tmp[M_GRAN]) << 10;
+	    if (tmp[M_ATTR] & 0x80) {
+		vl_mode *q1 = q + 1;
+		*q1 = *q++;
+		linearfb = _32_ tmp[M_PHYS_PTR];
+		q->mode |= 0x4000;
+	    }
+	    if (maxsize < (q->scanlen * q->yres)) {
+		maxsize = q->scanlen * q->yres;
+	    }
+	    q++;
+	}
+    } while (TRUE);
 
-   if (q == modes) {
-      return NULL;
-   }
-   if (linearfb) {
-      maxsize = (maxsize + 0xfffUL) & ~0xfffUL;
-      if (_create_selector(&linear_selector, linearfb, maxsize)) {
-         return NULL;
-      }
-   }
-   if (_create_selector(&banked_selector, 0xa0000, modes[0].gran)) {
-      _remove_selector(&linear_selector);
-      return NULL;
-   }
+    if (q == modes) {
+	return NULL;
+    }
+    if (_create_selector(&banked_selector, 0xa0000, modes[0].gran)) {
+	return NULL;
+    }
+    if (linearfb) {
+	maxsize = ((maxsize + 0xfffUL) & ~0xfffUL);
+	if (_create_selector(&linear_selector, linearfb, maxsize)) {
+	    linear_selector = banked_selector;
+	}
+    }
 
-   for (q = modes; q->mode != 0xffff; q++) {
-       q->sel = (q->mode & 0x4000) ? linear_selector : banked_selector;
-   }
+    for (q = modes; q->mode != 0xffff; q++) {
+	q->sel = banked_selector;
+	if (q->mode & 0x4000) {
+	    if (linear_selector != banked_selector) {
+		q->sel = linear_selector;
+	    } else {
+		q->mode &= ~0x4000;
+	    }
+	}
+    }
 
-   if (vesa_info[V_MAJOR] >= 2) {
-      r.x.ax = 0x4f0a;
-      r.x.bx = 0;
-      __dpmi_int(0x10, &r);
-      if (r.x.ax == 0x004f) {
-         vesa_pmcode = (word16 *)malloc(r.x.cx);
-         if (vesa_pmcode != NULL) {
-            movedata(__djgpp_dos_sel, (r.x.es << 4) + r.x.di, _my_ds(), (unsigned)vesa_pmcode, r.x.cx);
-            if (vesa_pmcode[3]) {
-               p = (word16 *)((long)vesa_pmcode + vesa_pmcode[3]);
-               while (*p++ != 0xffff) {
-               }
-            } else {
-               p = NULL;
-            }
-            if (p && (*p != 0xffff)) {
-               free(vesa_pmcode);
-               vesa_pmcode = NULL;
-            } else {
-               vesa_swbank = (void *)((long)vesa_pmcode + vesa_pmcode[0]);
-            }
-         }
-      }
-   }
+    if (vesa_info[V_MAJOR] >= 2) {
+	r.x.ax = 0x4f0a;
+	r.x.bx = 0;
+	__dpmi_int(0x10, &r);
+	if (r.x.ax == 0x004f) {
+	    vesa_pmcode = (word16 *)malloc(r.x.cx);
+	    if (vesa_pmcode != NULL) {
+		movedata(__djgpp_dos_sel, (r.x.es << 4) + r.x.di, _my_ds(), (unsigned)vesa_pmcode, r.x.cx);
+		if (vesa_pmcode[3]) {
+		    p = (word16 *)((long)vesa_pmcode + vesa_pmcode[3]);
+		    while (*p++ != 0xffff) {
+		    }
+		} else {
+		    p = NULL;
+		}
+		if (p && (*p != 0xffff)) {
+		    free(vesa_pmcode);
+		    vesa_pmcode = NULL;
+		} else {
+		    vesa_swbank = (void *)((long)vesa_pmcode + vesa_pmcode[0]);
+		}
+	    }
+	}
+    }
 
-   vesa_ver = _16_ vesa_info[V_MINOR];
-   return modes;
+    vesa_ver = _16_ vesa_info[V_MINOR];
+    return modes;
 }
 
 
@@ -236,14 +242,14 @@
 static void
 vesa_fini (void)
 {
-   if (vesa_ver) {
-      _remove_selector(&linear_selector);
-      _remove_selector(&banked_selector);
-      if (vesa_pmcode != NULL) {
-         free(vesa_pmcode);
-         vesa_pmcode = NULL;
-      }
-   }
+    if (vesa_ver) {
+	_remove_selector(&linear_selector);
+	_remove_selector(&banked_selector);
+	if (vesa_pmcode != NULL) {
+	    free(vesa_pmcode);
+	    vesa_pmcode = NULL;
+	}
+    }
 }
 
 
@@ -257,15 +263,15 @@
 static unsigned long
 _closest_pixclk (int mode_no, unsigned long vclk)
 {
-   __dpmi_regs r;
+    __dpmi_regs r;
 
-   r.x.ax = 0x4F0B;
-   r.h.bl = 0;
-   r.d.ecx = vclk;
-   r.x.dx = mode_no;
-   __dpmi_int(0x10, &r);
+    r.x.ax = 0x4F0B;
+    r.h.bl = 0;
+    r.d.ecx = vclk;
+    r.x.dx = mode_no;
+    __dpmi_int(0x10, &r);
 
-   return (r.x.ax == 0x004f) ? r.d.ecx : 0;
+    return (r.x.ax == 0x004f) ? r.d.ecx : 0;
 }
 
 
@@ -279,77 +285,253 @@
 static void
 _crtc_timing (CRTCInfoBlock *crtc, int xres, int yres, int xadjust, int yadjust)
 {
-   int HTotal, VTotal;
-   int HDisp, VDisp;
-   int HSS, VSS;
-   int HSE, VSE;
-   int HSWidth, VSWidth;
-   int SS, SE;
-   int doublescan = FALSE;
+    int HTotal, VTotal;
+    int HDisp, VDisp;
+    int HSS, VSS;
+    int HSE, VSE;
+    int HSWidth, VSWidth;
+    int SS, SE;
+    int doublescan = FALSE;
 
-   if (yres < 400) {
-      doublescan = TRUE;
-      yres *= 2;
-   }
+    if (yres < 400) {
+	doublescan = TRUE;
+	yres *= 2;
+    }
 
-   HDisp = xres;
-   HTotal = (int)(HDisp * 1.27) & ~0x7;
-   HSWidth = (int)((HTotal - HDisp) / 5) & ~0x7;
-   HSS = HDisp + 16;
-   HSE = HSS + HSWidth;
-   VDisp = yres;
-   VTotal = VDisp * 1.07;
-   VSWidth = (VTotal / 100) + 1;
-   VSS = VDisp + ((int)(VTotal - VDisp) / 5) + 1;
-   VSE = VSS + VSWidth;
+    HDisp = xres;
+    HTotal = (int)(HDisp * 1.27) & ~0x7;
+    HSWidth = (int)((HTotal - HDisp) / 5) & ~0x7;
+    HSS = HDisp + 16;
+    HSE = HSS + HSWidth;
+    VDisp = yres;
+    VTotal = VDisp * 1.07;
+    VSWidth = (VTotal / 100) + 1;
+    VSS = VDisp + ((int)(VTotal - VDisp) / 5) + 1;
+    VSE = VSS + VSWidth;
 
-   SS = HSS + xadjust;
-   SE = HSE + xadjust;
+    SS = HSS + xadjust;
+    SE = HSE + xadjust;
 
-   if (xadjust < 0) {
-      if (SS < (HDisp + 8)) {
-         SS = HDisp + 8;
-         SE = SS + HSWidth;
-      }
-   } else {
-      if ((HTotal - 24) < SE) {
-         SE = HTotal - 24;
-         SS = SE - HSWidth;
-      }
-   }
+    if (xadjust < 0) {
+	if (SS < (HDisp + 8)) {
+	    SS = HDisp + 8;
+	    SE = SS + HSWidth;
+	}
+    } else {
+	if ((HTotal - 24) < SE) {
+	    SE = HTotal - 24;
+	    SS = SE - HSWidth;
+	}
+    }
 
-   HSS = SS;
-   HSE = SE;
+    HSS = SS;
+    HSE = SE;
 
-   SS = VSS + yadjust;
-   SE = VSE + yadjust;
+    SS = VSS + yadjust;
+    SE = VSE + yadjust;
 
-   if (yadjust < 0) {
-      if (SS < (VDisp + 3)) {
-         SS = VDisp + 3;
-         SE = SS + VSWidth;
-      }
-   } else {
-      if ((VTotal - 4) < SE) {
-         SE = VTotal - 4;
-         SS = SE - VSWidth;
-      }
-   }
+    if (yadjust < 0) {
+	if (SS < (VDisp + 3)) {
+	    SS = VDisp + 3;
+	    SE = SS + VSWidth;
+	}
+    } else {
+	if ((VTotal - 4) < SE) {
+	    SE = VTotal - 4;
+	    SS = SE - VSWidth;
+	}
+    }
 
-   VSS = SS;
-   VSE = SE;
+    VSS = SS;
+    VSE = SE;
 
-   crtc->HorizontalTotal     = HTotal;
-   crtc->HorizontalSyncStart = HSS;
-   crtc->HorizontalSyncEnd   = HSE;
-   crtc->VerticalTotal       = VTotal;
-   crtc->VerticalSyncStart   = VSS;
-   crtc->VerticalSyncEnd     = VSE;
-   crtc->Flags               = HNEG | VNEG;
+    crtc->HorizontalTotal     = HTotal;
+    crtc->HorizontalSyncStart = HSS;
+    crtc->HorizontalSyncEnd   = HSE;
+    crtc->VerticalTotal       = VTotal;
+    crtc->VerticalSyncStart   = VSS;
+    crtc->VerticalSyncEnd     = VSE;
+    crtc->Flags               = HNEG | VNEG;
 
-   if (doublescan) {
-      crtc->Flags |= DOUBLESCAN;
-   }
+    if (doublescan) {
+	crtc->Flags |= DOUBLESCAN;
+    }
+}
+
+
+/* Desc: Attempts to choose a suitable blitter.
+ *
+ * In  : ptr to mode structure, software framebuffer bits
+ * Out : blitter funciton, or NULL
+ *
+ * Note: -
+ */
+static BLTFUNC
+_choose_blitter (vl_mode *p, int fbbits)
+{
+    BLTFUNC blitter;
+
+    if (p->mode & 0x4000) {
+	blitter = _can_mmx() ? vesa_l_dump_virtual_mmx : vesa_l_dump_virtual;
+	    switch (p->bpp) {
+		case 8:
+		    switch (fbbits) {
+			case 8:
+			    break;
+			case 16:
+			    blitter = vesa_l_dump_16_to_8;
+			    break;
+			case 24:
+			    blitter = vesa_l_dump_24_to_8;
+			    break;
+			case 32:
+			    blitter = vesa_l_dump_32_to_8;
+			    break;
+			case 15:
+			default:
+			    return NULL;
+		    }
+		    break;
+		case 15:
+		    switch (fbbits) {
+			case 16:
+			    blitter = vesa_l_dump_16_to_15;
+			    break;
+			case 32:
+			    blitter = vesa_l_dump_32_to_15;
+			    break;
+			case 8:
+			case 15:
+			case 24:
+			default:
+			    return NULL;
+		    }
+		    break;
+		case 16:
+		    switch (fbbits) {
+			case 16:
+			    break;
+			case 32:
+			    blitter = vesa_l_dump_32_to_16;
+			    break;
+			case 8:
+			case 15:
+			case 24:
+			default:
+			    return NULL;
+		    }
+		    break;
+		case 24:
+		    switch (fbbits) {
+			case 24:
+			    break;
+			case 32:
+			    blitter = vesa_l_dump_32_to_24;
+			    break;
+			case 8:
+			case 15:
+			case 16:
+			default:
+			    return NULL;
+		    }
+		    break;
+		case 32:
+		    switch (fbbits) {
+			case 24:
+			    blitter = vesa_l_dump_24_to_32;
+			    break;
+			case 32:
+			    break;
+			case 8:
+			case 15:
+			case 16:
+			default:
+			    return NULL;
+		    }
+		    break;
+	    }
+    } else {
+	blitter = vesa_b_dump_virtual;
+	    switch (p->bpp) {
+		case 8:
+		    switch (fbbits) {
+			case 8:
+			    break;
+			case 16:
+			    blitter = vesa_b_dump_16_to_8;
+			    break;
+			case 24:
+			    blitter = vesa_b_dump_24_to_8;
+			    break;
+			case 32:
+			    blitter = vesa_b_dump_32_to_8;
+			    break;
+			case 15:
+			default:
+			    return NULL;
+		    }
+		    break;
+		case 15:
+		    switch (fbbits) {
+			case 16:
+			    blitter = vesa_b_dump_16_to_15;
+			    break;
+			case 32:
+			    blitter = vesa_b_dump_32_to_15;
+			    break;
+			case 8:
+			case 15:
+			case 24:
+			default:
+			    return NULL;
+		    }
+		    break;
+		case 16:
+		    switch (fbbits) {
+			case 16:
+			    break;
+			case 32:
+			    blitter = vesa_b_dump_32_to_16;
+			    break;
+			case 8:
+			case 15:
+			case 24:
+			default:
+			    return NULL;
+		    }
+		    break;
+		case 24:
+		    switch (fbbits) {
+			case 24:
+			    break;
+			case 32:
+			    blitter = vesa_b_dump_32_to_24;
+			    break;
+			case 8:
+			case 15:
+			case 16:
+			default:
+			    return NULL;
+		    }
+		    break;
+		case 32:
+		    switch (fbbits) {
+			case 24:
+			    blitter = vesa_b_dump_24_to_32;
+			    break;
+			case 32:
+			    break;
+			case 8:
+			case 15:
+			case 16:
+			default:
+			    return NULL;
+		    }
+		    break;
+	    }
+    }
+
+    return blitter;
 }
 
 
@@ -361,74 +543,76 @@
  * Note: -
  */
 static int
-vesa_entermode (vl_mode *p, int refresh)
+vesa_entermode (vl_mode *p, int refresh, int fbbits)
 {
-   __dpmi_regs r;
+    __dpmi_regs r;
 
-   if (p->mode & 0x4000) {
-      VESA.blit = _can_mmx() ? vesa_l_dump_virtual_mmx : vesa_l_dump_virtual;
-   } else {
-      VESA.blit = vesa_b_dump_virtual;
-      { int n; for (vesa_gran_shift=0, n=p->gran; n; vesa_gran_shift++, n>>=1) ; }
-      vesa_gran_mask = (1 << (--vesa_gran_shift)) - 1;
-      if ((unsigned)p->gran != (vesa_gran_mask+1)) {
-         return !0;
-      }
-   }
+    if (!(p->mode & 0x4000)) {
+	{ int n; for (vesa_gran_shift = 0, n = p->gran; n; vesa_gran_shift++, n >>= 1); }
+	vesa_gran_mask = (1 << (--vesa_gran_shift)) - 1;
+	if ((unsigned)p->gran != (vesa_gran_mask + 1)) {
+	    return !0;
+	}
+    }
 
-   if (oldmode == -1) {
-      r.x.ax = 0x4f03;
-      __dpmi_int(0x10, &r);
-      oldmode = r.x.bx;
-   }
+    VESA.blit = _choose_blitter(p, fbbits);
+    if (VESA.blit == NULL) {
+	return !0;
+    }
 
-   r.x.ax = 0x4f02;
-   r.x.bx = p->mode;
+    if (oldmode == -1) {
+	r.x.ax = 0x4f03;
+	__dpmi_int(0x10, &r);
+	oldmode = r.x.bx;
+    }
 
-   if (refresh && ((vesa_ver>>8) >= 3)) {
-      /* VESA 3.0 stuff for controlling the refresh rate */
-      CRTCInfoBlock crtc;
-      unsigned long vclk;
-      double f0;
+    r.x.ax = 0x4f02;
+    r.x.bx = p->mode;
 
-      _crtc_timing(&crtc, p->xres, p->yres, 0, 0);
+    if (refresh && ((vesa_ver >> 8) >= 3)) {
+	/* VESA 3.0 stuff for controlling the refresh rate */
+	CRTCInfoBlock crtc;
+	unsigned long vclk;
+	double f0;
 
-      vclk = (double)crtc.HorizontalTotal * crtc.VerticalTotal * refresh;
-      vclk = _closest_pixclk(p->mode, vclk);
+	_crtc_timing(&crtc, p->xres, p->yres, 0, 0);
 
-      if (vclk != 0) {
-         f0 = (double)vclk / (crtc.HorizontalTotal * crtc.VerticalTotal);
-         /*_current_refresh_rate = (int)(f0 + 0.5);*/
+	vclk = (double)crtc.HorizontalTotal * crtc.VerticalTotal * refresh;
+	vclk = _closest_pixclk(p->mode, vclk);
 
-         crtc.PixelClock  = vclk;
-         crtc.RefreshRate = refresh * 100;
+	if (vclk != 0) {
+	    f0 = (double)vclk / (crtc.HorizontalTotal * crtc.VerticalTotal);
+	    /*_current_refresh_rate = (int)(f0 + 0.5);*/
 
-         movedata(_my_ds(), (unsigned)&crtc, _stubinfo->ds_selector, 0, sizeof(crtc));
+	    crtc.PixelClock  = vclk;
+	    crtc.RefreshRate = refresh * 100;
 
-         r.x.di = 0;
-         r.x.es = _stubinfo->ds_segment;
-         r.x.bx |= 0x0800;
-      }
-   }
+	    movedata(_my_ds(), (unsigned)&crtc, _stubinfo->ds_selector, 0, sizeof(crtc));
 
-   __dpmi_int(0x10, &r);
-   if (r.x.ax != 0x004f) {
-      return !0;
-   }
+	    r.x.di = 0;
+	    r.x.es = _stubinfo->ds_segment;
+	    r.x.bx |= 0x0800;
+	}
+    }
 
-   if (p->bpp == 8) {
-      r.x.ax = 0x4f08;
-      r.x.bx = 0x0800;
-      __dpmi_int(0x10, &r);
-      if (r.x.ax == 0x004f) {
-         r.x.ax = 0x4f08;
-         r.h.bl = 0x01;
-         __dpmi_int(0x10, &r);
-         vesa_color_precision = r.h.bh;
-      }
-   }
+    __dpmi_int(0x10, &r);
+    if (r.x.ax != 0x004f) {
+	return !0;
+    }
 
-   return 0;
+    if (p->bpp == 8) {
+	r.x.ax = 0x4f08;
+	r.x.bx = 0x0800;
+	__dpmi_int(0x10, &r);
+	if (r.x.ax == 0x004f) {
+	    r.x.ax = 0x4f08;
+	    r.h.bl = 0x01;
+	    __dpmi_int(0x10, &r);
+	    vesa_color_precision = r.h.bh;
+	}
+    }
+
+    return 0;
 }
 
 
@@ -442,14 +626,18 @@
 static void
 vesa_restore (void)
 {
-   __dpmi_regs r;
+    __dpmi_regs r;
 
-   if (oldmode != -1) {
-      r.x.ax = 0x4f02;
-      r.x.bx = oldmode;
-      __dpmi_int(0x10, &r);
-      oldmode = -1;
-   }
+    if (oldmode != -1) {
+	if (oldmode < 0x100) {
+	    __asm("int $0x10"::"a"(oldmode));
+	} else {
+	    r.x.ax = 0x4f02;
+	    r.x.bx = oldmode;
+	    __dpmi_int(0x10, &r);
+	}
+	oldmode = -1;
+    }
 }
 
 
@@ -464,17 +652,17 @@
 vesa_setCI_i (int index, int red, int green, int blue)
 {
 #if 0
-   __asm("\n\
+  __asm("\n\
 		movw	$0x1010, %%ax	\n\
 		movb	%1, %%dh	\n\
 		movb	%2, %%ch	\n\
 		int	$0x10		\n\
    "::"b"(index), "m"(red), "m"(green), "c"(blue):"%eax", "%edx");
 #else
-   outportb(0x03C8, index);
-   outportb(0x03C9, red);
-   outportb(0x03C9, green);
-   outportb(0x03C9, blue);
+    outportb(0x03C8, index);
+    outportb(0x03C9, red);
+    outportb(0x03C9, green);
+    outportb(0x03C9, blue);
 #endif
 }
 
@@ -489,9 +677,9 @@
 static void
 vesa_setCI_f (int index, float red, float green, float blue)
 {
- float max = (1 << vesa_color_precision) - 1;
+    float max = (1 << vesa_color_precision) - 1;
 
- vesa_setCI_i(index, (int)(red * max), (int)(green * max), (int)(blue * max));
+    vesa_setCI_i(index, (int)(red * max), (int)(green * max), (int)(blue * max));
 }
 
 
@@ -505,14 +693,14 @@
 static int
 vesa_get (int pname, int *params)
 {
-   switch (pname) {
-      case VL_GET_CI_PREC:
-         params[0] = vesa_color_precision;
-         break;
-      default:
-         return -1;
-   }
-   return 0;
+    switch (pname) {
+	case VL_GET_CI_PREC:
+	    params[0] = vesa_color_precision;
+	    break;
+	default:
+	    return -1;
+    }
+    return 0;
 }
 
 
@@ -520,12 +708,12 @@
  * the driver
  */
 vl_driver VESA = {
-   vesa_init,
-   vesa_entermode,
-   NULL,
-   vesa_setCI_f,
-   vesa_setCI_i,
-   vesa_get,
-   vesa_restore,
-   vesa_fini
+    vesa_init,
+    vesa_entermode,
+    NULL,
+    vesa_setCI_f,
+    vesa_setCI_i,
+    vesa_get,
+    vesa_restore,
+    vesa_fini
 };
diff --git a/src/mesa/drivers/dos/vesa.h b/src/mesa/drivers/dos/vesa.h
index 9287697..4b3c3ab 100644
--- a/src/mesa/drivers/dos/vesa.h
+++ b/src/mesa/drivers/dos/vesa.h
@@ -23,9 +23,9 @@
  */
 
 /*
- * DOS/DJGPP device driver v1.3 for Mesa
+ * DOS/DJGPP device driver for Mesa
  *
- *  Copyright (C) 2002 - Borca Daniel
+ *  Author: Daniel Borca
  *  Email : dborca@yahoo.com
  *  Web   : http://www.geocities.com/dborca
  */
@@ -42,6 +42,24 @@
 extern void vesa_l_dump_virtual (void);
 extern void vesa_l_dump_virtual_mmx (void);
 
+extern void vesa_l_dump_32_to_24 (void);
+extern void vesa_l_dump_32_to_16 (void);
+extern void vesa_l_dump_32_to_15 (void);
+extern void vesa_l_dump_32_to_8 (void);
+extern void vesa_l_dump_24_to_32 (void);
+extern void vesa_l_dump_24_to_8 (void);
+extern void vesa_l_dump_16_to_15 (void);
+extern void vesa_l_dump_16_to_8 (void);
+
+extern void vesa_b_dump_32_to_24 (void);
+extern void vesa_b_dump_32_to_16 (void);
+extern void vesa_b_dump_32_to_15 (void);
+extern void vesa_b_dump_32_to_8 (void);
+extern void vesa_b_dump_24_to_32 (void);
+extern void vesa_b_dump_24_to_8 (void);
+extern void vesa_b_dump_16_to_15 (void);
+extern void vesa_b_dump_16_to_8 (void);
+
 extern vl_driver VESA;
 
 #endif
diff --git a/src/mesa/drivers/dos/vga.c b/src/mesa/drivers/dos/vga.c
index 27758f1..5a6447d 100644
--- a/src/mesa/drivers/dos/vga.c
+++ b/src/mesa/drivers/dos/vga.c
@@ -23,9 +23,9 @@
  */
 
 /*
- * DOS/DJGPP device driver v1.7 for Mesa
+ * DOS/DJGPP device driver for Mesa
  *
- *  Copyright (C) 2002 - Borca Daniel
+ *  Author: Daniel Borca
  *  Email : dborca@users.sourceforge.net
  *  Web   : http://www.geocities.com/dborca
  */
@@ -123,6 +123,41 @@
 }
 
 
+/* Desc: Attempts to choose a suitable blitter.
+ *
+ * In  : ptr to mode structure, software framebuffer bits
+ * Out : blitter funciton, or NULL
+ *
+ * Note: -
+ */
+static BLTFUNC
+_choose_blitter (vl_mode *p, int fbbits)
+{
+    BLTFUNC blitter;
+
+    switch (fbbits) {
+	case 8:
+	    blitter = _can_mmx() ? vesa_l_dump_virtual_mmx : vesa_l_dump_virtual;
+	    break;
+	case 16:
+	    blitter = vesa_l_dump_16_to_8;
+	    break;
+	case 24:
+	    blitter = vesa_l_dump_24_to_8;
+	    break;
+	case 32:
+	    blitter = vesa_l_dump_32_to_8;
+	    break;
+	default:
+	    return NULL;
+    }
+
+    return blitter;
+
+    (void)p;
+}
+
+
 /* Desc: Attempts to enter specified video mode.
  *
  * In  : ptr to mode structure, refresh rate
@@ -131,27 +166,31 @@
  * Note: -
  */
 static int
-vga_entermode (vl_mode *p, int refresh)
+vga_entermode (vl_mode *p, int refresh, int fbbits)
 {
-   if (!(p->mode & 0x4000)) {
-      return -1;
-   }
-   VGA.blit = _can_mmx() ? vesa_l_dump_virtual_mmx : vesa_l_dump_virtual;
+    if (!(p->mode & 0x4000)) {
+	return -1;
+    }
 
-   if (oldmode == -1) {
-      __asm("\n\
+    VGA.blit = _choose_blitter(p, fbbits);
+    if (VGA.blit == NULL) {
+	return !0;
+    }
+
+    if (oldmode == -1) {
+	__asm("\n\
 		movb	$0x0f, %%ah	\n\
 		int	$0x10		\n\
 		andl	$0xff, %%eax	\n\
 		movl	%%eax, %0	\n\
-      ":"=g"(oldmode)::"%eax", "%ebx");
-   }
+	":"=g"(oldmode)::"%eax", "%ebx");
+    }
 
-   __asm("int $0x10"::"a"(p->mode&0xff));
+    __asm("int $0x10"::"a"(p->mode&0xff));
 
-   return 0;
+    return 0;
 
-   (void)refresh; /* silence compiler warning */
+    (void)refresh; /* silence compiler warning */
 }
 
 
diff --git a/src/mesa/drivers/dos/vga.h b/src/mesa/drivers/dos/vga.h
index aeb8fad..7c17625 100644
--- a/src/mesa/drivers/dos/vga.h
+++ b/src/mesa/drivers/dos/vga.h
@@ -23,9 +23,9 @@
  */
 
 /*
- * DOS/DJGPP device driver v1.3 for Mesa
+ * DOS/DJGPP device driver for Mesa
  *
- *  Copyright (C) 2002 - Borca Daniel
+ *  Author: Daniel Borca
  *  Email : dborca@yahoo.com
  *  Web   : http://www.geocities.com/dborca
  */
diff --git a/src/mesa/drivers/dos/video.c b/src/mesa/drivers/dos/video.c
index 60370af..468207f 100644
--- a/src/mesa/drivers/dos/video.c
+++ b/src/mesa/drivers/dos/video.c
@@ -23,9 +23,9 @@
  */
 
 /*
- * DOS/DJGPP device driver v1.6 for Mesa
+ * DOS/DJGPP device driver for Mesa
  *
- *  Copyright (C) 2002 - Borca Daniel
+ *  Author: Daniel Borca
  *  Email : dborca@users.sourceforge.net
  *  Web   : http://www.geocities.com/dborca
  *
@@ -53,17 +53,25 @@
 int vl_current_offset, vl_current_delta;
 
 
-#if HUGE_LOOKUP
-/* These lookup tables are used to extract RGB values in [0,255]
- * from 15/16-bit pixel values.
- */
-static unsigned char pix15r[0x8000];
-static unsigned char pix15g[0x8000];
-static unsigned char pix15b[0x8000];
-static unsigned char pix16r[0x10000];
-static unsigned char pix16g[0x10000];
-static unsigned char pix16b[0x10000];
-#else
+void (*vl_flip) (void);
+
+
+/* FakeColor data */
+#define R_CNT 6
+#define G_CNT 6
+#define B_CNT 6
+
+#define R_BIAS 7
+#define G_BIAS 7
+#define B_BIAS 7
+
+static word32 VGAPalette[256];
+word8 array_r[256];
+word8 array_g[256];
+word8 array_b[256];
+word8 tab_16_8[0x10000];
+
+
 /* lookup table for scaling 5 bit colors up to 8 bits */
 static int _rgb_scale_5[32] = {
    0,   8,   16,  25,  33,  41,  49,  58,
@@ -71,7 +79,6 @@
    132, 140, 148, 156, 165, 173, 181, 189,
    197, 206, 214, 222, 230, 239, 247, 255
 };
-#endif
 
 /* lookup table for scaling 6 bit colors up to 8 bits */
 static int _rgb_scale_6[64] = {
@@ -85,92 +92,6 @@
    227, 231, 235, 239, 243, 247, 251, 255
 };
 
-/* FakeColor data */
-#define R_CNT 6
-#define G_CNT 6
-#define B_CNT 6
-
-#define R_BIAS 7
-#define G_BIAS 7
-#define B_BIAS 7
-
-static word32 VGAPalette[256];
-static word8 array_r[256];
-static word8 array_g[256];
-static word8 array_b[256];
-
-
-int (*vl_mixfix) (fixed r, fixed g, fixed b);
-int (*vl_mixrgb) (const unsigned char rgb[]);
-int (*vl_mixrgba) (const unsigned char rgba[]);
-void (*vl_getrgba) (unsigned int offset, unsigned char rgba[4]);
-int (*vl_getpixel) (unsigned int offset);
-void (*vl_clear) (int color);
-void (*vl_rect) (int x, int y, int width, int height, int color);
-void (*vl_flip) (void);
-void (*vl_putpixel) (unsigned int offset, int color);
-
-
-/* Desc: color composition (w/o ALPHA)
- *
- * In  : R, G, B
- * Out : color
- *
- * Note: -
- */
-static int
-vl_mixfix8fake (fixed r, fixed g, fixed b)
-{
-   return array_b[b>>FIXED_SHIFT]*G_CNT*R_CNT
-        + array_g[g>>FIXED_SHIFT]*R_CNT
-        + array_r[r>>FIXED_SHIFT];
-}
-#define vl_mixfix8 vl_mixfix8fake
-static int
-vl_mixfix15 (fixed r, fixed g, fixed b)
-{
-   return ((r>>(3+FIXED_SHIFT))<<10)
-         |((g>>(3+FIXED_SHIFT))<<5)
-         | (b>>(3+FIXED_SHIFT));
-}
-static int
-vl_mixfix16 (fixed r, fixed g, fixed b)
-{
-   return ((r>>(3+FIXED_SHIFT))<<11)
-         |((g>>(2+FIXED_SHIFT))<<5)
-         | (b>>(3+FIXED_SHIFT));
-}
-#define vl_mixfix24 vl_mixfix32
-static int
-vl_mixfix32 (fixed r, fixed g, fixed b)
-{
-   return ((r>>FIXED_SHIFT)<<16)
-         |((g>>FIXED_SHIFT)<<8)
-         | (b>>FIXED_SHIFT);
-}
-
-
-/* Desc: color composition (w/ ALPHA)
- *
- * In  : array of integers (R, G, B, A)
- * Out : color
- *
- * Note: -
- */
-#define vl_mixrgba8 vl_mixrgb8fake
-#define vl_mixrgba15 vl_mixrgb15
-#define vl_mixrgba16 vl_mixrgb16
-#define vl_mixrgba24 vl_mixrgb24
-static int
-vl_mixrgba32 (const unsigned char rgba[])
-{
-   /* Hack alert:
-    * currently, DMesa uses Mesa's alpha buffer;
-    * so we don't really care about alpha value here...
-    */
-   return /*(rgba[3]<<24) | */(rgba[0]<<16) | (rgba[1]<<8) | (rgba[2]);
-}
-
 
 /* Desc: color composition (w/o ALPHA)
  *
@@ -180,29 +101,12 @@
  * Note: -
  */
 static int
-vl_mixrgb8fake (const unsigned char rgb[])
+v_mixrgb8fake (const unsigned char rgb[])
 {
    return array_b[rgb[2]]*G_CNT*R_CNT
         + array_g[rgb[1]]*R_CNT
         + array_r[rgb[0]];
 }
-#define vl_mixrgb8 vl_mixrgb8fake
-static int
-vl_mixrgb15 (const unsigned char rgb[])
-{
-   return ((rgb[0]>>3)<<10) | ((rgb[1]>>3)<<5) | (rgb[2]>>3);
-}
-static int
-vl_mixrgb16 (const unsigned char rgb[])
-{
-   return ((rgb[0]>>3)<<11) | ((rgb[1]>>2)<<5) | (rgb[2]>>3);
-}
-#define vl_mixrgb24 vl_mixrgb32
-static int
-vl_mixrgb32 (const unsigned char rgb[])
-{
-   return (rgb[0]<<16) | (rgb[1]<<8) | (rgb[2]);
-}
 
 
 /* Desc: color decomposition
@@ -213,102 +117,43 @@
  * Note: uses current read buffer
  */
 static void
-v_getrgba8fake6 (unsigned int offset, unsigned char rgba[4])
+v_getrgb8fake6 (unsigned int offset, unsigned char rgb[])
 {
    word32 c = VGAPalette[((word8 *)vl_current_read_buffer)[offset]];
-   rgba[0] = _rgb_scale_6[(c >> 16) & 0x3F];
-   rgba[1] = _rgb_scale_6[(c >> 8)  & 0x3F];
-   rgba[2] = _rgb_scale_6[ c        & 0x3F];
-   /*rgba[3] = c >> 24;*/ /* dummy alpha; we have separate SW alpha, so ignore */
+   rgb[0] = _rgb_scale_6[(c >> 16) & 0x3F];
+   rgb[1] = _rgb_scale_6[(c >> 8)  & 0x3F];
+   rgb[2] = _rgb_scale_6[ c        & 0x3F];
 }
 static void
-v_getrgba8fake8 (unsigned int offset, unsigned char rgba[4])
+v_getrgb8fake8 (unsigned int offset, unsigned char rgb[])
 {
    word32 c = VGAPalette[((word8 *)vl_current_read_buffer)[offset]];
-   rgba[0] = c >> 16;
-   rgba[1] = c >> 8;
-   rgba[2] = c;
-   /*rgba[3] = c >> 24;*/ /* dummy alpha; we have separate SW alpha, so ignore */
-}
-#define v_getrgba8 v_getrgba8fake6
-static void
-v_getrgba15 (unsigned int offset, unsigned char rgba[4])
-{
-   word32 c = ((word16 *)vl_current_read_buffer)[offset];
-#if HUGE_LOOKUP
-   c &= 0x7fff;
-   rgba[0] = pix15r[c];
-   rgba[1] = pix15g[c];
-   rgba[2] = pix15b[c];
-#else
-   rgba[0] = _rgb_scale_5[(c >> 10) & 0x1F];
-   rgba[1] = _rgb_scale_5[(c >> 5)  & 0x1F];
-   rgba[2] = _rgb_scale_5[ c        & 0x1F];
-#endif
-   /*rgba[3] = 255;*/ /* dummy alpha; we have separate SW alpha, so ignore */
-}
-static void
-v_getrgba16 (unsigned int offset, unsigned char rgba[4])
-{
-   word32 c = ((word16 *)vl_current_read_buffer)[offset];
-#if HUGE_LOOKUP
-   rgba[0] = pix16r[c];
-   rgba[1] = pix16g[c];
-   rgba[2] = pix16b[c];
-#else
-   rgba[0] = _rgb_scale_5[(c >> 11) & 0x1F];
-   rgba[1] = _rgb_scale_6[(c >> 5)  & 0x3F];
-   rgba[2] = _rgb_scale_5[ c        & 0x1F];
-#endif
-   /*rgba[3] = 255;*/ /* dummy alpha; we have separate SW alpha, so ignore */
-}
-static void
-v_getrgba24 (unsigned int offset, unsigned char rgba[4])
-{
-   word32 c = *(word32 *)((long)vl_current_read_buffer+offset*3);
-   rgba[0] = c >> 16;
-   rgba[1] = c >> 8;
-   rgba[2] = c;
-   /*rgba[3] = 255;*/ /* dummy alpha; we have separate SW alpha, so ignore */
-}
-static void
-v_getrgba32 (unsigned int offset, unsigned char rgba[4])
-{
-   word32 c = ((word32 *)vl_current_read_buffer)[offset];
-   rgba[0] = c >> 16;
-   rgba[1] = c >> 8;
-   rgba[2] = c;
-   /*rgba[3] = c >> 24;*/ /* dummy alpha; we have separate SW alpha, so ignore */
+   rgb[0] = c >> 16;
+   rgb[1] = c >> 8;
+   rgb[2] = c;
 }
 
 
-/* Desc: pixel retrieval
+/* Desc: create R5G6B5 to FakeColor table lookup
  *
- * In  : pixel offset
- * Out : pixel value
+ * In  : -
+ * Out : -
  *
- * Note: uses current read buffer
+ * Note: -
  */
-static int
-v_getpixel8 (unsigned int offset)
+static void
+init_tab_16_8 (void)
 {
-   return ((word8 *)vl_current_read_buffer)[offset];
-}
-#define v_getpixel15 v_getpixel16
-static int
-v_getpixel16 (unsigned int offset)
-{
-   return ((word16 *)vl_current_read_buffer)[offset];
-}
-static int
-v_getpixel24 (unsigned int offset)
-{
-   return *(word32 *)((long)vl_current_read_buffer+offset*3);
-}
-static int
-v_getpixel32 (unsigned int offset)
-{
-   return ((word32 *)vl_current_read_buffer)[offset];
+    int i;
+    for (i = 0; i < 0x10000; i++) {
+	unsigned char rgb[3];
+	rgb[0] = _rgb_scale_5[(i >> 11) & 0x1F];
+	rgb[1] = _rgb_scale_6[(i >>  5) & 0x3F];
+	rgb[2] = _rgb_scale_5[ i        & 0x1F];
+	tab_16_8[i] = v_mixrgb8fake(rgb);
+    }
+    (void)v_getrgb8fake6;
+    (void)v_getrgb8fake8;
 }
 
 
@@ -379,54 +224,6 @@
 }
 
 
-#if HUGE_LOOKUP
-/* Desc: initialize lookup arrays
- *
- * In  : -
- * Out : -
- *
- * Note: -
- */
-void
-v_init_pixeltables (void)
-{
-   unsigned int pixel;
-
-   for (pixel = 0; pixel <= 0xffff; pixel++) {
-      unsigned int r, g, b;
-
-      if (pixel <= 0x7fff) {
-         /* 15bit */
-         r = (pixel & 0x7c00) >> 8;
-         g = (pixel & 0x03E0) >> 3;
-         b = (pixel & 0x001F) << 2;
-
-         r = (unsigned int)(((double)r * 255. / 0x7c) + 0.5);
-         g = (unsigned int)(((double)g * 255. / 0x7c) + 0.5);
-         b = (unsigned int)(((double)b * 255. / 0x7c) + 0.5);
-
-         pix15r[pixel] = r;
-         pix15g[pixel] = g;
-         pix15b[pixel] = b;
-      }
-
-      /* 16bit */
-      r = (pixel & 0xF800) >> 8;
-      g = (pixel & 0x07E0) >> 3;
-      b = (pixel & 0x001F) << 3;
-
-      r = (unsigned int)(((double)r * 255. / 0xF8) + 0.5);
-      g = (unsigned int)(((double)g * 255. / 0xFC) + 0.5);
-      b = (unsigned int)(((double)b * 255. / 0xF8) + 0.5);
-
-      pix16r[pixel] = r;
-      pix16g[pixel] = g;
-      pix16b[pixel] = b;
-   }
-}
-#endif
-
-
 /* Desc: initialize hardware
  *
  * In  : -
@@ -471,7 +268,7 @@
 int
 vl_sync_buffer (void **buffer, int x, int y, int width, int height)
 {
-   if ((width & 7) || (x < 0) || (y < 0) || (x+width > video_mode->xres) || (y+height > video_mode->yres)) {
+   if ((/*XXX*/width & 7) || (x < 0) || (y < 0) || (x+width > video_mode->xres) || (y+height > video_mode->yres)) {
       return -1;
    } else {
       void *newbuf = *buffer;
@@ -553,38 +350,21 @@
       return -1;
    }
 
-#define INITPTR(bpp) \
-   vl_putpixel = v_putpixel##bpp; \
-   vl_getrgba = v_getrgba##bpp;   \
-   vl_getpixel = v_getpixel##bpp; \
-   vl_rect = v_rect##bpp;         \
-   vl_mixfix = vl_mixfix##bpp;    \
-   vl_mixrgb = vl_mixrgb##bpp;    \
-   vl_mixrgba = vl_mixrgba##bpp;  \
-   vl_clear = _can_mmx() ? v_clear##bpp##_mmx : v_clear##bpp
-        
    switch (p->bpp) {
       case 8:
-         INITPTR(8);
          break;
       case 15:
-         INITPTR(15);
          break;
       case 16:
-         INITPTR(16);
          break;
       case 24:
-         INITPTR(24);
          break;
       case 32:
-         INITPTR(32);
          break;
       default:
          return -1;
    }
 
-#undef INITPTR
-
    video_mode = p;
    video_bypp = (p->bpp+7)/8;
    video_scanlen = p->scanlen;
@@ -618,7 +398,7 @@
  * Note: -
  */
 int
-vl_video_init (int width, int height, int bpp, int rgb, int refresh)
+vl_video_init (int width, int height, int bpp, int rgb, int refresh, int fbbits)
 {
    int fake;
    vl_mode *p, *q;
@@ -630,11 +410,6 @@
    } else if (bpp == 8) {
       fake = 1;
    }
-#if HUGE_LOOKUP
-   else if (bpp < 24) {
-      v_init_pixeltables();
-   }
-#endif
 
    /* initialize hardware */
    if ((q = v_init_hw()) == NULL) {
@@ -651,18 +426,16 @@
       }
    }
 
-   /* setup and enter mode */
-   if ((vl_setup_mode(p) == 0) && (drv->entermode(p, refresh) == 0)) {
-      vl_flip = drv->blit;
-      if (fake) {
-         drv->get(VL_GET_CI_PREC, (int *)(&min));
-         fake_buildpalette(min);
-         if (min == 8) {
-            vl_getrgba = v_getrgba8fake8;
-         }
-      }
-      return bpp;
-   }
+    /* setup and enter mode */
+    if ((vl_setup_mode(p) == 0) && (drv->entermode(p, refresh, fbbits) == 0)) {
+	vl_flip = drv->blit;
+	if (fake) {
+	    drv->get(VL_GET_CI_PREC, (int *)(&min));
+	    fake_buildpalette(min);
+	    init_tab_16_8();
+	}
+	return bpp;
+    }
 
    /* abort */
    return 0;
diff --git a/src/mesa/drivers/dos/video.h b/src/mesa/drivers/dos/video.h
index e928f19..e084116 100644
--- a/src/mesa/drivers/dos/video.h
+++ b/src/mesa/drivers/dos/video.h
@@ -23,9 +23,9 @@
  */
 
 /*
- * DOS/DJGPP device driver v1.5 for Mesa
+ * DOS/DJGPP device driver for Mesa
  *
- *  Copyright (C) 2002 - Borca Daniel
+ *  Author: Daniel Borca
  *  Email : dborca@users.sourceforge.net
  *  Web   : http://www.geocities.com/dborca
  */
@@ -43,16 +43,7 @@
 #define VL_GET_SCREEN_SIZE 0x0202
 #define VL_GET_VIDEO_MODES 0x0300
 
-extern int (*vl_mixfix) (fixed r, fixed g, fixed b);
-extern int (*vl_mixrgb) (const unsigned char rgb[]);
-extern int (*vl_mixrgba) (const unsigned char rgba[]);
-extern void (*vl_getrgba) (unsigned int offset, unsigned char rgba[4]);
-
-extern void (*vl_clear) (int color);
-extern void (*vl_rect) (int x, int y, int width, int height, int color);
 extern void (*vl_flip) (void);
-extern void (*vl_putpixel) (unsigned int offset, int color);
-extern int (*vl_getpixel) (unsigned int offset);
 
 void vl_setCI (int index, float red, float green, float blue);
 
@@ -60,6 +51,6 @@
 int vl_get (int pname, int *params);
 
 void vl_video_exit (void);
-int vl_video_init (int width, int height, int bpp, int rgb, int refresh);
+int vl_video_init (int width, int height, int bpp, int rgb, int refresh, int fbbits);
 
 #endif
diff --git a/src/mesa/drivers/dos/virtual.S b/src/mesa/drivers/dos/virtual.S
deleted file mode 100644
index c5cc1fe..0000000
--- a/src/mesa/drivers/dos/virtual.S
+++ /dev/null
@@ -1,489 +0,0 @@
-/*
- * Mesa 3-D graphics library
- * Version:  4.0
- * 
- * Copyright (C) 1999  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
- *
- *  Copyright (C) 2002 - Borca Daniel
- *  Email : dborca@yahoo.com
- *  Web   : http://www.geocities.com/dborca
- */
-
-
-		.file	"virtual.S"
-
-/*
- * extern void *vl_current_draw_buffer;
- * extern int vl_current_width, vl_current_bytes;
- */
-
-		.text
-
-/* Desc: void v_clear8 (int color);
- *
- * In  : color
- * Out : -
- *
- * Note: uses current draw buffer
- */
-		.p2align 5,,31
-		.global	_v_clear8
-_v_clear8:
-		movl	4(%esp), %eax
-		movb	%al, %ah
-		pushw	%ax
-		pushw	%ax
-		popl	%eax
-		jmp	_v_clear_common
-
-/* Desc: void v_clear16 (int color);
- *
- * In  : color
- * Out : -
- *
- * Note: uses current draw buffer
- */
-		.p2align 5,,31
-		.global	_v_clear16
-_v_clear16:
-		movl	4(%esp), %eax
-		pushw	%ax
-		pushw	%ax
-		popl	%eax
-		jmp	_v_clear_common
-
-/* Desc: void v_clear32 (int color);
- *
- * In  : color
- * Out : -
- *
- * Note: uses current draw buffer
- */
-		.p2align 5,,31
-		.global	_v_clear32
-_v_clear32:
-		movl	4(%esp), %eax
-		.balign	4
-_v_clear_common:
-		movl	_vl_current_bytes, %ecx
-		movl	_vl_current_draw_buffer, %edx
-		shrl	$2, %ecx
-		.balign	4
-	0:
-		movl	%eax, (%edx)
-		addl	$4, %edx
-		decl	%ecx
-		jnz	0b
-		ret
-
-/* Desc: void v_clear8_mmx (int color);
- *
- * In  : color
- * Out : -
- *
- * Note: uses current draw buffer
- */
-		.p2align 5,,31
-		.global	_v_clear8_mmx
-_v_clear8_mmx:
-#ifdef USE_MMX_ASM
-		movd	4(%esp), %mm0
-		punpcklbw %mm0, %mm0
-		punpcklwd %mm0, %mm0
-		jmp	_v_clear_common_mmx
-#endif
-
-/* Desc: void v_clear16_mmx (int color);
- *
- * In  : color
- * Out : -
- *
- * Note: uses current draw buffer
- */
-		.p2align 5,,31
-		.global	_v_clear16_mmx
-_v_clear16_mmx:
-#ifdef USE_MMX_ASM
-		movd	4(%esp), %mm0
-		punpcklwd %mm0, %mm0
-		jmp	_v_clear_common_mmx
-#endif
-
-/* Desc: void v_clear32_mmx (int color);
- *
- * In  : color
- * Out : -
- *
- * Note: uses current draw buffer
- */
-		.p2align 5,,31
-		.global	_v_clear32_mmx
-_v_clear32_mmx:
-#ifdef USE_MMX_ASM
-		movd	4(%esp), %mm0
-		.balign	4
-_v_clear_common_mmx:
-		punpckldq %mm0, %mm0
-		movl	_vl_current_bytes, %ecx
-		movl	_vl_current_draw_buffer, %edx
-		shrl	$3, %ecx
-		.balign	4
-	0:
-		movq	%mm0, (%edx)
-		addl	$8, %edx
-		decl	%ecx
-		jnz	0b
-		emms
-#endif
-		ret
-
-/* Desc: void v_clear24 (int color);
- *
- * In  : color
- * Out : -
- *
- * Note: uses current draw buffer
- */
-		.p2align 5,,31
-		.global	_v_clear24
-_v_clear24:
-		movl	$0xaaaaaaab, %eax
-		mull	_vl_current_bytes
-		movl	4(%esp), %eax
-		movl	%edx, %ecx
-		pushl	%ebx
-		movl	_vl_current_draw_buffer, %edx
-		shrl	%ecx
-		movb	10(%esp), %bl
-		.balign	4
-	0:
-		movw	%ax, (%edx)
-		movb	%bl, 2(%edx)
-		addl	$3, %edx
-		decl	%ecx
-		jnz	0b
-		popl	%ebx
-		ret
-
-/* Desc: void v_clear24_mmx (int color);
- *
- * In  : color
- * Out : -
- *
- * Note: uses current draw buffer
- */
-		.p2align 5,,31
-		.global	_v_clear24_mmx
-_v_clear24_mmx:
-#ifdef USE_MMX_ASM
-		movl	4(%esp), %eax
-		movl	%eax, %edx
-		movl	%eax, %ecx
-		shll	$16, %edx
-		rorl	$8, %ecx
-		movw	%cx, %dx
-		rorl	$16, %ecx
-		movb	%dh, %cl
-		shll	$8, %eax
-		movb	%ch, %al
-		rorl	$8, %eax
-
-		pushl	%edx
-		pushl	%eax
-		movq	(%esp), %mm0
-		pushl	%ecx
-		movq	(%esp), %mm1
-		pushl	%edx
-		movq	(%esp), %mm2
-
-		movl	$0xaaaaaaab, %eax
-		mull	_vl_current_bytes
-		movl	%edx, %ecx
-		movl	_vl_current_draw_buffer, %edx
-		shrl	$4, %ecx
-		.balign	4
-	0:
-		movq	%mm0, (%edx)
-		movq	%mm1, 8(%edx)
-		movq	%mm2, 16(%edx)
-		addl	$24, %edx
-		decl	%ecx
-		jnz	0b
-		emms
-		addl	$16, %esp
-#endif
-		ret
-
-/* Desc: void v_rect8 (int color);
- *
- * In  : color
- * Out : -
- *
- * Note: uses current draw buffer
- */
-		.p2align 5,,31
-		.global	_v_rect8
-_v_rect8:
-		cld
-		pushl	%esi
-		pushl	%edi
-		movl	28(%esp), %eax
-		movl	_vl_current_width, %esi
-		movl	16(%esp), %edi
-		movb	%al, %ah
-		movl	20(%esp), %ecx
-		imull	%esi, %edi
-		movl	24(%esp), %edx
-		subl	%ecx, %esi
-		addl	12(%esp), %edi
-		pushw	%ax
-		pushw	%ax
-		pushl	%ds
-		popl	%es
-		addl	_vl_current_draw_buffer, %edi
-		popl	%eax
-		pushl	%ebx
-		movl	%ecx, %ebx
-		andl	$3, %ebx
-		.balign	4
-	0:
-		pushl	%ecx
-		.balign	4
-	1:
-		shrl	$2, %ecx
-		rep;	stosl
-		testl	%ebx, %ebx
-		jz	2f
-		movl	%ebx, %ecx
-		rep;	stosb
-		.balign	4
-	2:
-		popl	%ecx
-		addl	%esi, %edi
-		decl	%edx
-		jnz	0b
-		popl	%ebx
-		popl	%edi
-		popl	%esi
-		ret
-
-/* Desc: void v_rect16 (int color);
- *
- * In  : color
- * Out : -
- *
- * Note: uses current draw buffer
- */
-		.p2align 5,,31
-		.global	_v_rect16
-_v_rect16:
-		cld
-		pushl	%esi
-		pushl	%edi
-		movl	28(%esp), %eax
-		movl	_vl_current_width, %esi
-		movl	16(%esp), %edi
-		movl	20(%esp), %ecx
-		imull	%esi, %edi
-		movl	24(%esp), %edx
-		subl	%ecx, %esi
-		addl	12(%esp), %edi
-		pushw	%ax
-		shll	%esi
-		pushw	%ax
-		shll	%edi
-		pushl	%ds
-		popl	%es
-		addl	_vl_current_draw_buffer, %edi
-		popl	%eax
-		.balign	4
-	0:
-		pushl	%ecx
-		.balign	4
-	1:
-		shrl	%ecx
-		rep;	stosl
-		jnc	2f
-		stosw
-		.balign	4
-	2:
-		popl	%ecx
-		addl	%esi, %edi
-		decl	%edx
-		jnz	0b
-		popl	%edi
-		popl	%esi
-		ret
-
-/* Desc: void v_rect24 (int color);
- *
- * In  : color
- * Out : -
- *
- * Note: uses current draw buffer
- */
-		.p2align 5,,31
-		.global	_v_rect24
-_v_rect24:
-		pushl	%esi
-		pushl	%edi
-		movl	28(%esp), %eax
-		movl	_vl_current_width, %esi
-		movl	16(%esp), %edi
-		movl	20(%esp), %ecx
-		imull	%esi, %edi
-		movl	24(%esp), %edx
-		subl	%ecx, %esi
-		addl	12(%esp), %edi
-		leal	(%esi, %esi, 2), %esi
-		pushl	%ebx
-		leal	(%edi, %edi, 2), %edi
-		movl	%eax, %ebx
-		addl	_vl_current_draw_buffer, %edi
-		shrl	$16, %ebx
-		.balign	4
-	0:
-		pushl	%ecx
-		.balign	4
-	1:
-		movw	%ax, (%edi)
-		movb	%bl, 2(%edi)
-		addl	$3, %edi
-		decl	%ecx
-		jnz	1b
-		popl	%ecx
-		addl	%esi, %edi
-		decl	%edx
-		jnz	0b
-		popl	%ebx
-		popl	%edi
-		popl	%esi
-		ret
-
-/* Desc: void v_rect32 (int color);
- *
- * In  : color
- * Out : -
- *
- * Note: uses current draw buffer
- */
-		.p2align 5,,31
-		.global	_v_rect32
-_v_rect32:
-		pushl	%esi
-		pushl	%edi
-		movl	_vl_current_width, %esi
-		movl	16(%esp), %edi
-		movl	20(%esp), %ecx
-		imull	%esi, %edi
-		movl	24(%esp), %edx
-		subl	%ecx, %esi
-		addl	12(%esp), %edi
-		shll	$2, %esi
-		shll	$2, %edi
-		movl	28(%esp), %eax
-		addl	_vl_current_draw_buffer, %edi
-		.balign	4
-	0:
-		pushl	%ecx
-		.balign	4
-	1:
-		movl	%eax, (%edi)
-		addl	$4, %edi
-		decl	%ecx
-		jnz	1b
-		popl	%ecx
-		addl	%esi, %edi
-		decl	%edx
-		jnz	0b
-		popl	%edi
-		popl	%esi
-		ret
-
-/* Desc: void v_putpixel8 (unsigned int offset, int color);
- *
- * In  : offset within buffer, color
- * Out : -
- *
- * Note: uses current draw buffer
- */
-		.p2align 5,,31
-		.global	_v_putpixel8
-_v_putpixel8:
-		movl	8(%esp), %ecx
-		movl	4(%esp), %edx
-		movl	_vl_current_draw_buffer, %eax
-		movb	%cl, (%eax,%edx)
-		ret
-
-/* Desc: void v_putpixel16 (unsigned int offset, int color);
- *
- * In  : offset within buffer, color
- * Out : -
- *
- * Note: uses current draw buffer
- */
-		.p2align 5,,31
-		.global	_v_putpixel16
-_v_putpixel16:
-		movl	8(%esp), %ecx
-		movl	4(%esp), %edx
-		movl	_vl_current_draw_buffer, %eax
-		movw	%cx, (%eax,%edx,2)
-		ret
-
-/* Desc: void v_putpixel24 (unsigned int offset, int color);
- *
- * In  : offset within buffer, color
- * Out : -
- *
- * Note: uses current draw buffer
- */
-		.p2align 5,,31
-		.global	_v_putpixel24
-_v_putpixel24:
-		movl	4(%esp), %eax
-		movl	8(%esp), %edx
-		movl	_vl_current_draw_buffer, %ecx
-		leal	(%eax,%eax,2), %eax
-		movw	%dx, (%ecx,%eax)
-		shrl	$16, %edx
-		movb	%dl, 2(%ecx,%eax)
-		ret
-
-/* Desc: void v_putpixel32 (unsigned int offset, int color);
- *
- * In  : offset within buffer, color
- * Out : -
- *
- * Note: uses current draw buffer
- */
-		.p2align 5,,31
-		.global	_v_putpixel32
-_v_putpixel32:
-		movl	8(%esp), %ecx
-		movl	4(%esp), %edx
-		movl	_vl_current_draw_buffer, %eax
-		movl	%ecx, (%eax,%edx,4)
-		ret
