| @@ -0,0 +1,199 @@ | |||
| /* | |||
| * 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 5.0 | |||
| * | |||
| * Copyright (C) 2002 - Borca Daniel | |||
| * Email : dborca@yahoo.com | |||
| * Web : http://www.geocities.com/dborca | |||
| */ | |||
| .file "blit.S" | |||
| /* | |||
| * extern unsigned int vesa_gran_mask, vesa_gran_shift; | |||
| * extern int vl_video_selector; | |||
| * extern void *vl_current_draw_buffer; | |||
| * extern int vl_current_stride, vl_current_height; | |||
| * extern int vl_current_offset, vl_current_delta; | |||
| */ | |||
| .text | |||
| /* Desc: VESA bank switching routine (BIOS) | |||
| * | |||
| * In : EBX=0, EDX = bank number | |||
| * Out : - | |||
| * | |||
| * Note: thrashes EAX | |||
| */ | |||
| .p2align 5,,31 | |||
| _vesa_swbankBIOS: | |||
| movw $0x4f05, %ax | |||
| int $0x10 | |||
| ret | |||
| .p2align 2,,3 | |||
| .global _vesa_swbank | |||
| _vesa_swbank: .long _vesa_swbankBIOS | |||
| /* Desc: void vesa_b_dump_virtual (void); | |||
| * | |||
| * In : - | |||
| * Out : - | |||
| * | |||
| * Note: uses current draw buffer | |||
| */ | |||
| .p2align 5,,31 | |||
| .global _vesa_b_dump_virtual | |||
| _vesa_b_dump_virtual: | |||
| cld | |||
| pushl %es | |||
| pushl %ebx | |||
| pushl %esi | |||
| pushl %edi | |||
| pushl %ebp | |||
| movl _vl_video_selector, %es | |||
| 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 | |||
| shrl $2, %ecx | |||
| .balign 4 | |||
| 0: | |||
| pushl %ecx | |||
| .balign 4 | |||
| 1: | |||
| cmpl %ebp, %edi | |||
| jb 2f | |||
| pushl %eax | |||
| pushl %ebx | |||
| incl %edx | |||
| xorl %ebx, %ebx | |||
| call *_vesa_swbank | |||
| popl %ebx | |||
| popl %eax | |||
| subl %ebp, %edi | |||
| .balign 4 | |||
| 2: | |||
| movsl | |||
| decl %ecx | |||
| jnz 1b | |||
| popl %ecx | |||
| addl %ebx, %edi | |||
| decl %eax | |||
| jnz 0b | |||
| popl %ebp | |||
| popl %edi | |||
| popl %esi | |||
| popl %ebx | |||
| popl %es | |||
| ret | |||
| /* Desc: void vesa_l_dump_virtual (void); | |||
| * | |||
| * In : - | |||
| * Out : - | |||
| * | |||
| * Note: uses current draw buffer | |||
| */ | |||
| .p2align 5,,31 | |||
| .global _vesa_l_dump_virtual | |||
| _vesa_l_dump_virtual: | |||
| cld | |||
| pushl %es | |||
| pushl %esi | |||
| pushl %edi | |||
| movl _vl_video_selector, %es | |||
| 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, %eax | |||
| shrl $2, %ecx | |||
| .balign 4 | |||
| 0: | |||
| pushl %ecx | |||
| rep; movsl | |||
| popl %ecx | |||
| addl %eax, %edi | |||
| decl %edx | |||
| jnz 0b | |||
| popl %edi | |||
| popl %esi | |||
| popl %es | |||
| ret | |||
| /* Desc: void vesa_l_dump_virtual_mmx (void); | |||
| * | |||
| * In : - | |||
| * Out : - | |||
| * | |||
| * Note: uses current draw buffer | |||
| */ | |||
| .p2align 5,,31 | |||
| .global _vesa_l_dump_virtual_mmx | |||
| _vesa_l_dump_virtual_mmx: | |||
| #ifdef USE_MMX_ASM | |||
| 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, %eax | |||
| shrl $3, %ecx | |||
| .balign 4 | |||
| 0: | |||
| pushl %ecx | |||
| .balign 4 | |||
| 1: | |||
| movq (%esi), %mm0 | |||
| addl $8, %esi | |||
| movq %mm0, %fs:(%edi) | |||
| addl $8, %edi | |||
| decl %ecx | |||
| jnz 1b | |||
| popl %ecx | |||
| addl %eax, %edi | |||
| decl %edx | |||
| jnz 0b | |||
| popl %edi | |||
| popl %esi | |||
| emms | |||
| #endif | |||
| ret | |||
| @@ -0,0 +1,226 @@ | |||
| /* | |||
| * Mesa 3-D graphics library | |||
| * Version: 4.1 | |||
| * | |||
| * 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 5.0 | |||
| * | |||
| * Copyright (C) 2002 - Borca Daniel | |||
| * Email : dborca@yahoo.com | |||
| * Web : http://www.geocities.com/dborca | |||
| */ | |||
| #include <stdlib.h> | |||
| #include "vga.h" | |||
| static vl_mode modes[4] = { | |||
| {0x13 | 0x4000, 320, 200, 320, 8, -1, 320*200}, | |||
| {0xffff, -1, -1, -1, -1, -1, -1} | |||
| }; | |||
| static word16 vga_ver; | |||
| static int linear_selector; | |||
| static int oldmode = -1; | |||
| #define vga_color_precision 6 | |||
| /* Desc: Attempts to detect VGA, check video modes and create selectors. | |||
| * | |||
| * In : - | |||
| * Out : mode array | |||
| * | |||
| * Note: - | |||
| */ | |||
| static vl_mode *vga_init (void) | |||
| { | |||
| int rv = 0; | |||
| if (vga_ver) { | |||
| return modes; | |||
| } | |||
| __asm("\n\ | |||
| movw $0x1a00, %%ax \n\ | |||
| int $0x10 \n\ | |||
| cmpb $0x1a, %%al \n\ | |||
| jne 0f \n\ | |||
| cmpb $0x07, %%bl \n\ | |||
| jb 0f \n\ | |||
| andl $0xff, %%ebx \n\ | |||
| movl %%ebx, %0 \n\ | |||
| 0:":"=g"(rv)::"%eax", "%ebx"); | |||
| if (rv == 0) { | |||
| return NULL; | |||
| } | |||
| if (_create_selector(&linear_selector, 0xa0000, 0x10000)) { | |||
| return NULL; | |||
| } | |||
| modes[0].sel = linear_selector; | |||
| vga_ver = rv; | |||
| return modes; | |||
| } | |||
| /* Desc: Frees all resources allocated by VGA init code. | |||
| * | |||
| * In : - | |||
| * Out : - | |||
| * | |||
| * Note: - | |||
| */ | |||
| static void vga_finit (void) | |||
| { | |||
| if (vga_ver) { | |||
| _remove_selector(&linear_selector); | |||
| } | |||
| } | |||
| /* Desc: Attempts to enter specified video mode. | |||
| * | |||
| * In : ptr to mode structure, refresh rate | |||
| * Out : 0 if success | |||
| * | |||
| * Note: - | |||
| */ | |||
| static int vga_entermode (vl_mode *p, int refresh) | |||
| { | |||
| if (!(p->mode & 0x4000)) { | |||
| return -1; | |||
| } | |||
| VGA.blit = vl_can_mmx() ? vesa_l_dump_virtual_mmx : vesa_l_dump_virtual; | |||
| if (oldmode == -1) { | |||
| __asm("\n\ | |||
| movb $0x0f, %%ah \n\ | |||
| int $0x10 \n\ | |||
| andl $0xff, %%eax \n\ | |||
| movl %%eax, %0 \n\ | |||
| ":"=g"(oldmode)::"%eax", "%ebx"); | |||
| } | |||
| __asm("int $0x10"::"a"(p->mode&0xff)); | |||
| return 0; | |||
| } | |||
| /* Desc: Restores to the mode prior to first call to vga_entermode. | |||
| * | |||
| * In : - | |||
| * Out : - | |||
| * | |||
| * Note: - | |||
| */ | |||
| static void vga_restore (void) | |||
| { | |||
| if (oldmode != -1) { | |||
| __asm("int $0x10"::"a"(oldmode)); | |||
| } | |||
| } | |||
| /* Desc: set one palette entry | |||
| * | |||
| * In : color index, R, G, B | |||
| * Out : - | |||
| * | |||
| * Note: uses normalized values | |||
| */ | |||
| static void vga_setCI_f (int index, float red, float green, float blue) | |||
| { | |||
| float max = (1 << vga_color_precision) - 1; | |||
| int _red = red * max; | |||
| int _green = green * max; | |||
| int _blue = blue * max; | |||
| __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"); | |||
| } | |||
| /* Desc: set one palette entry | |||
| * | |||
| * In : color index, R, G, B | |||
| * Out : - | |||
| * | |||
| * Note: uses integer values | |||
| */ | |||
| static void vga_setCI_i (int index, int red, int green, int blue) | |||
| { | |||
| __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"); | |||
| } | |||
| /* Desc: retrieve CI precision | |||
| * | |||
| * In : - | |||
| * Out : precision in bits | |||
| * | |||
| * Note: - | |||
| */ | |||
| static int vga_getCIprec (void) | |||
| { | |||
| return vga_color_precision; | |||
| } | |||
| /* | |||
| * the driver | |||
| */ | |||
| vl_driver VGA = { | |||
| vga_init, | |||
| vga_entermode, | |||
| NULL, | |||
| vga_setCI_f, | |||
| vga_setCI_i, | |||
| vga_getCIprec, | |||
| vga_restore, | |||
| vga_finit | |||
| }; | |||
| @@ -0,0 +1,42 @@ | |||
| /* | |||
| * 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 5.0 | |||
| * | |||
| * Copyright (C) 2002 - Borca Daniel | |||
| * Email : dborca@yahoo.com | |||
| * Web : http://www.geocities.com/dborca | |||
| */ | |||
| #ifndef VGA_H_included | |||
| #define VGA_H_included | |||
| #include "../internal.h" | |||
| #include "../vesa/vesa.h" | |||
| extern vl_driver VGA; | |||
| #endif | |||