Sync from drm.
[mesa.git] / src / mesa / drivers / dos / virtual.S
index 0df584150f3f321c8046d7cf2134d173e8962668..c5cc1fe86f87ee285639351bcbbe48c3b8ce816f 100644 (file)
-/*\r
- * Mesa 3-D graphics library\r
- * Version:  4.0\r
- * \r
- * Copyright (C) 1999  Brian Paul   All Rights Reserved.\r
- * \r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- * \r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- * \r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN\r
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-/*\r
- * DOS/DJGPP device driver v1.3 for Mesa\r
- *\r
- *  Copyright (C) 2002 - Borca Daniel\r
- *  Email : dborca@yahoo.com\r
- *  Web   : http://www.geocities.com/dborca\r
- */\r
-\r
-\r
-               .file   "virtual.S"\r
-\r
-/*\r
- * extern void *vl_current_draw_buffer;\r
- * extern int vl_current_width, vl_current_bytes;\r
- */\r
-\r
-               .text\r
-\r
-/* Desc: void v_clear8 (int color);\r
- *\r
- * In  : color\r
- * Out : -\r
- *\r
- * Note: uses current draw buffer\r
- */\r
-               .p2align 5,,31\r
-               .global _v_clear8\r
-_v_clear8:\r
-               movl    4(%esp), %eax\r
-               movb    %al, %ah\r
-               pushw   %ax\r
-               pushw   %ax\r
-               popl    %eax\r
-               jmp     _v_clear_common\r
-\r
-/* Desc: void v_clear16 (int color);\r
- *\r
- * In  : color\r
- * Out : -\r
- *\r
- * Note: uses current draw buffer\r
- */\r
-               .p2align 5,,31\r
-               .global _v_clear16\r
-_v_clear16:\r
-               movl    4(%esp), %eax\r
-               pushw   %ax\r
-               pushw   %ax\r
-               popl    %eax\r
-               jmp     _v_clear_common\r
-\r
-/* Desc: void v_clear32 (int color);\r
- *\r
- * In  : color\r
- * Out : -\r
- *\r
- * Note: uses current draw buffer\r
- */\r
-               .p2align 5,,31\r
-               .global _v_clear32\r
-_v_clear32:\r
-               movl    4(%esp), %eax\r
-               .balign 4\r
-_v_clear_common:\r
-               movl    _vl_current_bytes, %ecx\r
-               movl    _vl_current_draw_buffer, %edx\r
-               shrl    $2, %ecx\r
-               .balign 4\r
-       0:\r
-               movl    %eax, (%edx)\r
-               addl    $4, %edx\r
-               decl    %ecx\r
-               jnz     0b\r
-               ret\r
-\r
-/* Desc: void v_clear8_mmx (int color);\r
- *\r
- * In  : color\r
- * Out : -\r
- *\r
- * Note: uses current draw buffer\r
- */\r
-               .p2align 5,,31\r
-               .global _v_clear8_mmx\r
-_v_clear8_mmx:\r
-#ifdef USE_MMX_ASM\r
-               movd    4(%esp), %mm0\r
-               punpcklbw %mm0, %mm0\r
-               punpcklwd %mm0, %mm0\r
-               jmp     _v_clear_common_mmx\r
-#endif\r
-\r
-/* Desc: void v_clear16_mmx (int color);\r
- *\r
- * In  : color\r
- * Out : -\r
- *\r
- * Note: uses current draw buffer\r
- */\r
-               .p2align 5,,31\r
-               .global _v_clear16_mmx\r
-_v_clear16_mmx:\r
-#ifdef USE_MMX_ASM\r
-               movd    4(%esp), %mm0\r
-               punpcklwd %mm0, %mm0\r
-               jmp     _v_clear_common_mmx\r
-#endif\r
-\r
-/* Desc: void v_clear32_mmx (int color);\r
- *\r
- * In  : color\r
- * Out : -\r
- *\r
- * Note: uses current draw buffer\r
- */\r
-               .p2align 5,,31\r
-               .global _v_clear32_mmx\r
-_v_clear32_mmx:\r
-#ifdef USE_MMX_ASM\r
-               movd    4(%esp), %mm0\r
-               .balign 4\r
-_v_clear_common_mmx:\r
-               punpckldq %mm0, %mm0\r
-               movl    _vl_current_bytes, %ecx\r
-               movl    _vl_current_draw_buffer, %edx\r
-               shrl    $3, %ecx\r
-               .balign 4\r
-       0:\r
-               movq    %mm0, (%edx)\r
-               addl    $8, %edx\r
-               decl    %ecx\r
-               jnz     0b\r
-               emms\r
-#endif\r
-               ret\r
-\r
-/* Desc: void v_clear24 (int color);\r
- *\r
- * In  : color\r
- * Out : -\r
- *\r
- * Note: uses current draw buffer\r
- */\r
-               .p2align 5,,31\r
-               .global _v_clear24\r
-_v_clear24:\r
-               movl    $0xaaaaaaab, %eax\r
-               mull    _vl_current_bytes\r
-               movl    4(%esp), %eax\r
-               movl    %edx, %ecx\r
-               pushl   %ebx\r
-               movl    _vl_current_draw_buffer, %edx\r
-               shrl    %ecx\r
-               movb    10(%esp), %bl\r
-               .balign 4\r
-       0:\r
-               movw    %ax, (%edx)\r
-               movb    %bl, 2(%edx)\r
-               addl    $3, %edx\r
-               decl    %ecx\r
-               jnz     0b\r
-               popl    %ebx\r
-               ret\r
-\r
-/* Desc: void v_clear24_mmx (int color);\r
- *\r
- * In  : color\r
- * Out : -\r
- *\r
- * Note: uses current draw buffer\r
- */\r
-               .p2align 5,,31\r
-               .global _v_clear24_mmx\r
-_v_clear24_mmx:\r
-#ifdef USE_MMX_ASM\r
-               movl    4(%esp), %eax\r
-               movl    %eax, %edx\r
-               movl    %eax, %ecx\r
-               shll    $16, %edx\r
-               rorl    $8, %ecx\r
-               movw    %cx, %dx\r
-               rorl    $16, %ecx\r
-               movb    %dh, %cl\r
-               shll    $8, %eax\r
-               movb    %ch, %al\r
-               rorl    $8, %eax\r
-\r
-               pushl   %edx\r
-               pushl   %eax\r
-               movq    (%esp), %mm0\r
-               pushl   %ecx\r
-               movq    (%esp), %mm1\r
-               pushl   %edx\r
-               movq    (%esp), %mm2\r
-\r
-               movl    $0xaaaaaaab, %eax\r
-               mull    _vl_current_bytes\r
-               movl    %edx, %ecx\r
-               movl    _vl_current_draw_buffer, %edx\r
-               shrl    $4, %ecx\r
-               .balign 4\r
-       0:\r
-               movq    %mm0, (%edx)\r
-               movq    %mm1, 8(%edx)\r
-               movq    %mm2, 16(%edx)\r
-               addl    $24, %edx\r
-               decl    %ecx\r
-               jnz     0b\r
-               emms\r
-               addl    $16, %esp\r
-#endif\r
-               ret\r
-\r
-/* Desc: void v_rect8 (int color);\r
- *\r
- * In  : color\r
- * Out : -\r
- *\r
- * Note: uses current draw buffer\r
- */\r
-               .p2align 5,,31\r
-               .global _v_rect8\r
-_v_rect8:\r
-               cld\r
-               pushl   %esi\r
-               pushl   %edi\r
-               movl    28(%esp), %eax\r
-               movl    _vl_current_width, %esi\r
-               movl    16(%esp), %edi\r
-               movb    %al, %ah\r
-               movl    20(%esp), %ecx\r
-               imull   %esi, %edi\r
-               movl    24(%esp), %edx\r
-               subl    %ecx, %esi\r
-               addl    12(%esp), %edi\r
-               pushw   %ax\r
-               pushw   %ax\r
-               pushl   %ds\r
-               popl    %es\r
-               addl    _vl_current_draw_buffer, %edi\r
-               popl    %eax\r
-               pushl   %ebx\r
-               movl    %ecx, %ebx\r
-               andl    $3, %ebx\r
-               .balign 4\r
-       0:\r
-               pushl   %ecx\r
-               .balign 4\r
-       1:\r
-               shrl    $2, %ecx\r
-               rep;    stosl\r
-               testl   %ebx, %ebx\r
-               jz      2f\r
-               movl    %ebx, %ecx\r
-               rep;    stosb\r
-               .balign 4\r
-       2:\r
-               popl    %ecx\r
-               addl    %esi, %edi\r
-               decl    %edx\r
-               jnz     0b\r
-               popl    %ebx\r
-               popl    %edi\r
-               popl    %esi\r
-               ret\r
-\r
-/* Desc: void v_rect16 (int color);\r
- *\r
- * In  : color\r
- * Out : -\r
- *\r
- * Note: uses current draw buffer\r
- */\r
-               .p2align 5,,31\r
-               .global _v_rect16\r
-_v_rect16:\r
-               cld\r
-               pushl   %esi\r
-               pushl   %edi\r
-               movl    28(%esp), %eax\r
-               movl    _vl_current_width, %esi\r
-               movl    16(%esp), %edi\r
-               movl    20(%esp), %ecx\r
-               imull   %esi, %edi\r
-               movl    24(%esp), %edx\r
-               subl    %ecx, %esi\r
-               addl    12(%esp), %edi\r
-               pushw   %ax\r
-               shll    %esi\r
-               pushw   %ax\r
-               shll    %edi\r
-               pushl   %ds\r
-               popl    %es\r
-               addl    _vl_current_draw_buffer, %edi\r
-               popl    %eax\r
-               .balign 4\r
-       0:\r
-               pushl   %ecx\r
-               .balign 4\r
-       1:\r
-               shrl    %ecx\r
-               rep;    stosl\r
-               jnc     2f\r
-               stosw\r
-               .balign 4\r
-       2:\r
-               popl    %ecx\r
-               addl    %esi, %edi\r
-               decl    %edx\r
-               jnz     0b\r
-               popl    %edi\r
-               popl    %esi\r
-               ret\r
-\r
-/* Desc: void v_rect24 (int color);\r
- *\r
- * In  : color\r
- * Out : -\r
- *\r
- * Note: uses current draw buffer\r
- */\r
-               .p2align 5,,31\r
-               .global _v_rect24\r
-_v_rect24:\r
-               pushl   %esi\r
-               pushl   %edi\r
-               movl    28(%esp), %eax\r
-               movl    _vl_current_width, %esi\r
-               movl    16(%esp), %edi\r
-               movl    20(%esp), %ecx\r
-               imull   %esi, %edi\r
-               movl    24(%esp), %edx\r
-               subl    %ecx, %esi\r
-               addl    12(%esp), %edi\r
-               leal    (%esi, %esi, 2), %esi\r
-               pushl   %ebx\r
-               leal    (%edi, %edi, 2), %edi\r
-               movl    %eax, %ebx\r
-               addl    _vl_current_draw_buffer, %edi\r
-               shrl    $16, %ebx\r
-               .balign 4\r
-       0:\r
-               pushl   %ecx\r
-               .balign 4\r
-       1:\r
-               movw    %ax, (%edi)\r
-               movb    %bl, 2(%edi)\r
-               addl    $3, %edi\r
-               decl    %ecx\r
-               jnz     1b\r
-               popl    %ecx\r
-               addl    %esi, %edi\r
-               decl    %edx\r
-               jnz     0b\r
-               popl    %ebx\r
-               popl    %edi\r
-               popl    %esi\r
-               ret\r
-\r
-/* Desc: void v_rect32 (int color);\r
- *\r
- * In  : color\r
- * Out : -\r
- *\r
- * Note: uses current draw buffer\r
- */\r
-               .p2align 5,,31\r
-               .global _v_rect32\r
-_v_rect32:\r
-               pushl   %esi\r
-               pushl   %edi\r
-               movl    _vl_current_width, %esi\r
-               movl    16(%esp), %edi\r
-               movl    20(%esp), %ecx\r
-               imull   %esi, %edi\r
-               movl    24(%esp), %edx\r
-               subl    %ecx, %esi\r
-               addl    12(%esp), %edi\r
-               shll    $2, %esi\r
-               shll    $2, %edi\r
-               movl    28(%esp), %eax\r
-               addl    _vl_current_draw_buffer, %edi\r
-               .balign 4\r
-       0:\r
-               pushl   %ecx\r
-               .balign 4\r
-       1:\r
-               movl    %eax, (%edi)\r
-               addl    $4, %edi\r
-               decl    %ecx\r
-               jnz     1b\r
-               popl    %ecx\r
-               addl    %esi, %edi\r
-               decl    %edx\r
-               jnz     0b\r
-               popl    %edi\r
-               popl    %esi\r
-               ret\r
-\r
-/* Desc: void v_putpixel8 (unsigned int offset, int color);\r
- *\r
- * In  : offset within buffer, color\r
- * Out : -\r
- *\r
- * Note: uses current draw buffer\r
- */\r
-               .p2align 5,,31\r
-               .global _v_putpixel8\r
-_v_putpixel8:\r
-               movl    8(%esp), %ecx\r
-               movl    4(%esp), %edx\r
-               movl    _vl_current_draw_buffer, %eax\r
-               movb    %cl, (%eax,%edx)\r
-               ret\r
-\r
-/* Desc: void v_putpixel16 (unsigned int offset, int color);\r
- *\r
- * In  : offset within buffer, color\r
- * Out : -\r
- *\r
- * Note: uses current draw buffer\r
- */\r
-               .p2align 5,,31\r
-               .global _v_putpixel16\r
-_v_putpixel16:\r
-               movl    8(%esp), %ecx\r
-               movl    4(%esp), %edx\r
-               movl    _vl_current_draw_buffer, %eax\r
-               movw    %cx, (%eax,%edx,2)\r
-               ret\r
-\r
-/* Desc: void v_putpixel24 (unsigned int offset, int color);\r
- *\r
- * In  : offset within buffer, color\r
- * Out : -\r
- *\r
- * Note: uses current draw buffer\r
- */\r
-               .p2align 5,,31\r
-               .global _v_putpixel24\r
-_v_putpixel24:\r
-               movl    4(%esp), %eax\r
-               movl    8(%esp), %edx\r
-               movl    _vl_current_draw_buffer, %ecx\r
-               leal    (%eax,%eax,2), %eax\r
-               movw    %dx, (%ecx,%eax)\r
-               shrl    $16, %edx\r
-               movb    %dl, 2(%ecx,%eax)\r
-               ret\r
-\r
-/* Desc: void v_putpixel32 (unsigned int offset, int color);\r
- *\r
- * In  : offset within buffer, color\r
- * Out : -\r
- *\r
- * Note: uses current draw buffer\r
- */\r
-               .p2align 5,,31\r
-               .global _v_putpixel32\r
-_v_putpixel32:\r
-               movl    8(%esp), %ecx\r
-               movl    4(%esp), %edx\r
-               movl    _vl_current_draw_buffer, %eax\r
-               movl    %ecx, (%eax,%edx,4)\r
-               ret\r
+/*
+ * 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