diff options
author | Brian Paul <brian.paul@tungstengraphics.com> | 2003-03-08 18:28:14 +0000 |
---|---|---|
committer | José Fonseca <jfonseca@vmware.com> | 2011-07-11 20:03:30 +0100 |
commit | 4ed158f3b5fa235713ecaef1e64e943ad6a140d4 (patch) | |
tree | d3646d9a1c83d8da731214b921b1be2666366622 /src/glut/dos | |
parent | de7b55bd4b50ac1ffba5f92ffc96e9e977f4bcc6 (diff) | |
download | glut-4ed158f3b5fa235713ecaef1e64e943ad6a140d4.tar.gz |
DOS update (Daniel Borca)
Diffstat (limited to 'src/glut/dos')
-rw-r--r-- | src/glut/dos/Makefile.DJ | 2 | ||||
-rw-r--r-- | src/glut/dos/PC_HW/pc_hw.h | 5 | ||||
-rw-r--r-- | src/glut/dos/PC_HW/pc_irq.S | 10 | ||||
-rw-r--r-- | src/glut/dos/PC_HW/pc_keyb.c | 25 | ||||
-rw-r--r-- | src/glut/dos/PC_HW/pc_mouse.c | 144 | ||||
-rw-r--r-- | src/glut/dos/callback.c | 2 | ||||
-rw-r--r-- | src/glut/dos/color.c | 2 | ||||
-rw-r--r-- | src/glut/dos/extens.c | 2 | ||||
-rw-r--r-- | src/glut/dos/glutint.h | 2 | ||||
-rw-r--r-- | src/glut/dos/init.c | 5 | ||||
-rw-r--r-- | src/glut/dos/menu.c | 2 | ||||
-rw-r--r-- | src/glut/dos/mouse.c | 16 | ||||
-rw-r--r-- | src/glut/dos/overlay.c | 2 | ||||
-rw-r--r-- | src/glut/dos/state.c | 2 | ||||
-rw-r--r-- | src/glut/dos/window.c | 2 |
15 files changed, 135 insertions, 88 deletions
diff --git a/src/glut/dos/Makefile.DJ b/src/glut/dos/Makefile.DJ index 93f7719..9013bfb 100644 --- a/src/glut/dos/Makefile.DJ +++ b/src/glut/dos/Makefile.DJ @@ -20,7 +20,7 @@ # 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 glut makefile v1.3 for Mesa 5.0 +# DOS/DJGPP glut makefile v1.3 for Mesa # # Copyright (C) 2002 - Borca Daniel # Email : dborca@yahoo.com diff --git a/src/glut/dos/PC_HW/pc_hw.h b/src/glut/dos/PC_HW/pc_hw.h index ae8855e..26bb8ba 100644 --- a/src/glut/dos/PC_HW/pc_hw.h +++ b/src/glut/dos/PC_HW/pc_hw.h @@ -25,7 +25,7 @@ typedef void (*VFUNC) (void); typedef void (*PFUNC) (void *); -typedef void (*MFUNC) (int x, int y, int b); +typedef void (*MFUNC) (int x, int y, int z, int b); /* * atexit @@ -211,7 +211,8 @@ void pc_remove_mouse (void); MFUNC pc_install_mouse_handler (MFUNC handler); void pc_mouse_area (int x1, int y1, int x2, int y2); void pc_mouse_speed (int xspeed, int yspeed); -int pc_query_mouse (int *x, int *y); +int pc_query_mouse (int *x, int *y, int *z); +void pc_warp_mouse (int x, int y); /* * standard redirection diff --git a/src/glut/dos/PC_HW/pc_irq.S b/src/glut/dos/PC_HW/pc_irq.S index cb1627f..6d99bd8 100644 --- a/src/glut/dos/PC_HW/pc_irq.S +++ b/src/glut/dos/PC_HW/pc_irq.S @@ -1,5 +1,5 @@ /* - * PC/HW routine collection v1.0 for DOS/DJGPP + * PC/HW routine collection v1.3 for DOS/DJGPP * * Copyright (C) 2002 - Borca Daniel * Email : dborca@yahoo.com @@ -74,6 +74,9 @@ _pc_install_irq: addl %edx, %eax movl %eax, IRQ_STACK(%edi) + movl ___djgpp_ds_alias, %eax + movl %eax, IRQ_STACK+4(%edi) + movl %ss:12(%ebp), %eax movl %eax, IRQ_HOOK(%edi) @@ -131,8 +134,7 @@ __irq_wrapper_##x: ; \ pushl %gs ; \ movl %ss, %ebx ; \ movl %esp, %esi ; \ - movl %cs:___djgpp_ds_alias, %ss ; \ - movl %cs:__irq_stack_##x, %esp ; \ + lss %cs:__irq_stack_##x, %esp ; \ pushl %ss ; \ pushl %ss ; \ popl %es ; \ @@ -160,7 +162,7 @@ __irq_old_##x: ; \ __irq_hook_##x: ; \ .long 0 ; \ __irq_stack_##x: ; \ - .long 0 + .long 0, 0 WRAPPER(0); WRAPPER(1); diff --git a/src/glut/dos/PC_HW/pc_keyb.c b/src/glut/dos/PC_HW/pc_keyb.c index 0bc657a..53a5216 100644 --- a/src/glut/dos/PC_HW/pc_keyb.c +++ b/src/glut/dos/PC_HW/pc_keyb.c @@ -357,20 +357,6 @@ static void handle_code (int scancode, int keycode) in_a_terrupt--; } ENDOFUNC(handle_code) -static __inline void satisfy (void) -{ - __asm("\n\ - inb $0x61, %%al \n\ - movb %%al, %%ah \n\ - orb $0x80, %%al \n\ - outb %%al, $0x61 \n\ - xchgb %%al, %%ah \n\ - outb %%al, $0x61 \n\ - movb $0x20, %%al \n\ - outb %%al, $0x20 \n\ - ":::"%eax"); -} - static int keyboard () { unsigned char temp, scancode; @@ -410,7 +396,16 @@ static int keyboard () ":::"%eax", "%ebx", "%ecx", "%edx", "%esi", "%edi", "memory"); } - satisfy(); + __asm("\n\ + inb $0x61, %%al \n\ + movb %%al, %%ah \n\ + orb $0x80, %%al \n\ + outb %%al, $0x61 \n\ + xchgb %%al, %%ah \n\ + outb %%al, $0x61 \n\ + movb $0x20, %%al \n\ + outb %%al, $0x20 \n\ + ":::"%eax"); return 0; } ENDOFUNC(keyboard) diff --git a/src/glut/dos/PC_HW/pc_mouse.c b/src/glut/dos/PC_HW/pc_mouse.c index 0ea6d57..e09f2f4 100644 --- a/src/glut/dos/PC_HW/pc_mouse.c +++ b/src/glut/dos/PC_HW/pc_mouse.c @@ -8,11 +8,15 @@ #include <dpmi.h> +#include <sys/exceptn.h> +#include <sys/segments.h> #include "pc_hw.h" +#define PC_CUTE_WHEEL 1 /* CuteMouse WheelAPI */ + #define MOUSE_STACK_SIZE 16384 #define CLEAR_MICKEYS() \ @@ -21,20 +25,23 @@ ox = oy = 0; \ } while (0) -extern void mouse_wrapper (void); -extern void mouse_wrapper_end (void); +extern void mouse_wrap (void); +extern int mouse_wrap_end[]; static MFUNC mouse_func; -static void *mouse_stack; static long mouse_callback; static __dpmi_regs mouse_regs; -static volatile int pc_mouse_x, pc_mouse_y, pc_mouse_b; +static volatile struct { + volatile int x, y, z, b; +} pc_mouse; static int minx = 0; static int maxx = 319; static int miny = 0; static int maxy = 199; +static int minz = 0; +static int maxz = 255; static int sx = 2; static int sy = 2; @@ -43,27 +50,34 @@ static int emulat3 = FALSE; static int ox, oy; + static void mouse (__dpmi_regs *r) { int nx = (signed short)r->x.si / sx; int ny = (signed short)r->x.di / sy; int dx = nx - ox; int dy = ny - oy; +#if PC_CUTE_WHEEL + int dz = (signed char)r->h.bh; +#endif ox = nx; oy = ny; - pc_mouse_b = r->x.bx; - pc_mouse_x = MID(minx, pc_mouse_x + dx, maxx); - pc_mouse_y = MID(miny, pc_mouse_y + dy, maxy); + pc_mouse.b = r->h.bl; + pc_mouse.x = MID(minx, pc_mouse.x + dx, maxx); + pc_mouse.y = MID(miny, pc_mouse.y + dy, maxy); +#if PC_CUTE_WHEEL + pc_mouse.z = MID(minz, pc_mouse.z + dz, maxz); +#endif if (emulat3) { - if ((pc_mouse_b&3)==3) { - pc_mouse_b = 4; + if ((pc_mouse.b&3)==3) { + pc_mouse.b = 4; } } if (mouse_func) { - mouse_func(pc_mouse_x, pc_mouse_y, pc_mouse_b); + mouse_func(pc_mouse.x, pc_mouse.y, pc_mouse.z, pc_mouse.b); } } ENDOFUNC(mouse) @@ -83,7 +97,7 @@ void pc_remove_mouse (void) mouse_callback = 0; - free((void *)((unsigned long)mouse_stack-MOUSE_STACK_SIZE)); + free((void *)(mouse_wrap_end[0] - MOUSE_STACK_SIZE)); } } @@ -109,26 +123,26 @@ int pc_install_mouse (void) /* lock wrapper */ LOCKDATA(mouse_func); - LOCKDATA(mouse_stack); LOCKDATA(mouse_callback); LOCKDATA(mouse_regs); - LOCKDATA(pc_mouse_x); - LOCKDATA(pc_mouse_y); - LOCKDATA(pc_mouse_b); + LOCKDATA(pc_mouse); LOCKDATA(minx); LOCKDATA(maxx); LOCKDATA(miny); LOCKDATA(maxy); + LOCKDATA(minz); + LOCKDATA(maxz); LOCKDATA(sx); LOCKDATA(sy); LOCKDATA(emulat3); LOCKDATA(ox); LOCKDATA(oy); LOCKFUNC(mouse); - LOCKFUNC(mouse_wrapper); + LOCKFUNC(mouse_wrap); + mouse_wrap_end[1] = __djgpp_ds_alias; /* grab a locked stack */ - if ((mouse_stack=pc_malloc(MOUSE_STACK_SIZE))==NULL) { + if ((mouse_wrap_end[0] = (int)pc_malloc(MOUSE_STACK_SIZE)) == NULL) { return 0; } @@ -150,19 +164,23 @@ int pc_install_mouse (void) movl %%ecx, %0 \n\ 0: \n\ ":"=g"(mouse_callback) - :"S" (mouse_wrapper), "D"(&mouse_regs) + :"S" (mouse_wrap), "D"(&mouse_regs) :"%eax", "%ecx", "%edx"); if (!mouse_callback) { - free(mouse_stack); + free((void *)mouse_wrap_end[0]); return 0; } /* adjust stack */ - mouse_stack = (void *)((unsigned long)mouse_stack + MOUSE_STACK_SIZE); + mouse_wrap_end[0] += MOUSE_STACK_SIZE; /* install the handler */ mouse_regs.x.ax = 0x000c; - mouse_regs.x.cx = 0x007f; +#if PC_CUTE_WHEEL + mouse_regs.x.cx = 0x7f | 0x80; +#else + mouse_regs.x.cx = 0x7f; +#endif mouse_regs.x.dx = mouse_callback&0xffff; mouse_regs.x.es = mouse_callback>>16; __dpmi_int(0x33, &mouse_regs); @@ -205,41 +223,57 @@ void pc_mouse_speed (int xspeed, int yspeed) ENABLE(); } -int pc_query_mouse (int *x, int *y) +int pc_query_mouse (int *x, int *y, int *z) { - *x = pc_mouse_x; - *y = pc_mouse_y; - return pc_mouse_b; + *x = pc_mouse.x; + *y = pc_mouse.y; + *z = pc_mouse.z; + return pc_mouse.b; } +void pc_warp_mouse (int x, int y) +{ + CLEAR_MICKEYS(); + + pc_mouse.x = MID(minx, x, maxx); + pc_mouse.y = MID(miny, y, maxy); + + if (mouse_func) { + mouse_func(pc_mouse.x, pc_mouse.y, pc_mouse.z, pc_mouse.b); + } +} + +/* Hack alert: + * `mouse_wrap_end' actually holds the + * address of stack in a safe data selector. + */ __asm("\n\ - .text \n\ - .p2align 5,,31 \n\ - .global _mouse_wrapper \n\ -_mouse_wrapper: \n\ - cld \n\ - lodsl \n\ - movl %eax, %es:42(%edi) \n\ - addw $4, %es:46(%edi) \n\ - pushl %es \n\ - movl %ss, %ebx \n\ - movl %esp, %esi \n\ - movl %cs:___djgpp_ds_alias, %ss \n\ - movl %cs:_mouse_stack, %esp \n\ - pushl %ss \n\ - pushl %ss \n\ - popl %es \n\ - popl %ds \n\ - movl ___djgpp_dos_sel, %fs \n\ - pushl %fs \n\ - popl %gs \n\ - pushl %edi \n\ - call _mouse \n\ - popl %edi \n\ - movl %ebx, %ss \n\ - movl %esi, %esp \n\ - popl %es \n\ - iret \n\ - .balign 4 \n\ - .global _mouse_wrapper_end \n\ -_mouse_wrapper_end:"); + .text \n\ + .p2align 5,,31 \n\ + .global _mouse_wrap \n\ +_mouse_wrap: \n\ + cld \n\ + lodsl \n\ + movl %eax, %es:42(%edi) \n\ + addw $4, %es:46(%edi) \n\ + pushl %es \n\ + movl %ss, %ebx \n\ + movl %esp, %esi \n\ + lss %cs:_mouse_wrap_end, %esp\n\ + pushl %ss \n\ + pushl %ss \n\ + popl %es \n\ + popl %ds \n\ + movl ___djgpp_dos_sel, %fs \n\ + pushl %fs \n\ + popl %gs \n\ + pushl %edi \n\ + call _mouse \n\ + popl %edi \n\ + movl %ebx, %ss \n\ + movl %esi, %esp \n\ + popl %es \n\ + iret \n\ + .balign 4 \n\ + .global _mouse_wrap_end \n\ +_mouse_wrap_end:.long 0, 0"); diff --git a/src/glut/dos/callback.c b/src/glut/dos/callback.c index 64275cc..8ab75e7 100644 --- a/src/glut/dos/callback.c +++ b/src/glut/dos/callback.c @@ -19,7 +19,7 @@ */ /* - * DOS/DJGPP glut driver v1.3 for Mesa 5.0 + * DOS/DJGPP glut driver v1.3 for Mesa * * Copyright (C) 2002 - Borca Daniel * Email : dborca@yahoo.com diff --git a/src/glut/dos/color.c b/src/glut/dos/color.c index 14b3168..cfb2ff9 100644 --- a/src/glut/dos/color.c +++ b/src/glut/dos/color.c @@ -19,7 +19,7 @@ */ /* - * DOS/DJGPP glut driver v1.3 for Mesa 5.0 + * DOS/DJGPP glut driver v1.3 for Mesa * * Copyright (C) 2002 - Borca Daniel * Email : dborca@yahoo.com diff --git a/src/glut/dos/extens.c b/src/glut/dos/extens.c index c5abcbf..bc6cfe0 100644 --- a/src/glut/dos/extens.c +++ b/src/glut/dos/extens.c @@ -19,7 +19,7 @@ */ /* - * DOS/DJGPP glut driver v1.3 for Mesa 5.0 + * DOS/DJGPP glut driver v1.3 for Mesa * * Copyright (C) 2002 - Borca Daniel * Email : dborca@yahoo.com diff --git a/src/glut/dos/glutint.h b/src/glut/dos/glutint.h index 611b050..e8dffb5 100644 --- a/src/glut/dos/glutint.h +++ b/src/glut/dos/glutint.h @@ -19,7 +19,7 @@ */ /* - * DOS/DJGPP glut driver v1.3 for Mesa 5.0 + * DOS/DJGPP glut driver v1.3 for Mesa * * Copyright (C) 2002 - Borca Daniel * Email : dborca@yahoo.com diff --git a/src/glut/dos/init.c b/src/glut/dos/init.c index 076fd25..5d09561 100644 --- a/src/glut/dos/init.c +++ b/src/glut/dos/init.c @@ -19,7 +19,7 @@ */ /* - * DOS/DJGPP glut driver v1.3 for Mesa 5.0 + * DOS/DJGPP glut driver v1.3 for Mesa * * Copyright (C) 2002 - Borca Daniel * Email : dborca@yahoo.com @@ -152,10 +152,11 @@ void APIENTRY glutMainLoop (void) if (g_mouse) { int mouse_x; int mouse_y; + int mouse_z; int mouse_b; /* query mouse */ - mouse_b = pc_query_mouse(&mouse_x, &mouse_y); + mouse_b = pc_query_mouse(&mouse_x, &mouse_y, &mouse_z); /* relative to window coordinates */ g_mouse_x = mouse_x - g_curwin->xpos; diff --git a/src/glut/dos/menu.c b/src/glut/dos/menu.c index d04300d..31e05f0 100644 --- a/src/glut/dos/menu.c +++ b/src/glut/dos/menu.c @@ -19,7 +19,7 @@ */ /* - * DOS/DJGPP glut driver v1.3 for Mesa 5.0 + * DOS/DJGPP glut driver v1.3 for Mesa * * Copyright (C) 2002 - Borca Daniel * Email : dborca@yahoo.com diff --git a/src/glut/dos/mouse.c b/src/glut/dos/mouse.c index 0642d64..373ac49 100644 --- a/src/glut/dos/mouse.c +++ b/src/glut/dos/mouse.c @@ -19,7 +19,7 @@ */ /* - * DOS/DJGPP glut driver v1.3 for Mesa 5.0 + * DOS/DJGPP glut driver v1.3 for Mesa * * Copyright (C) 2002 - Borca Daniel * Email : dborca@yahoo.com @@ -44,3 +44,17 @@ void __glutInitMouse (void) g_curwin->show_mouse = (g_curwin->mouse || g_curwin->motion || g_curwin->passive); } } + + + +void APIENTRY glutSetCursor (int cursor) +{ + /* XXX completely futile until full mouse support (maybe never) */ +} + + + +void APIENTRY glutWarpPointer (int x, int y) +{ + pc_warp_mouse(x, y); +} diff --git a/src/glut/dos/overlay.c b/src/glut/dos/overlay.c index 44dcf3d..b36f94c 100644 --- a/src/glut/dos/overlay.c +++ b/src/glut/dos/overlay.c @@ -19,7 +19,7 @@ */ /* - * DOS/DJGPP glut driver v1.3 for Mesa 5.0 + * DOS/DJGPP glut driver v1.3 for Mesa * * Copyright (C) 2002 - Borca Daniel * Email : dborca@yahoo.com diff --git a/src/glut/dos/state.c b/src/glut/dos/state.c index f61e28b..245d2ef 100644 --- a/src/glut/dos/state.c +++ b/src/glut/dos/state.c @@ -19,7 +19,7 @@ */ /* - * DOS/DJGPP glut driver v1.3 for Mesa 5.0 + * DOS/DJGPP glut driver v1.3 for Mesa * * Copyright (C) 2002 - Borca Daniel * Email : dborca@yahoo.com diff --git a/src/glut/dos/window.c b/src/glut/dos/window.c index f5c2fd9..cfc2f96 100644 --- a/src/glut/dos/window.c +++ b/src/glut/dos/window.c @@ -19,7 +19,7 @@ */ /* - * DOS/DJGPP glut driver v1.3 for Mesa 5.0 + * DOS/DJGPP glut driver v1.3 for Mesa * * Copyright (C) 2002 - Borca Daniel * Email : dborca@yahoo.com |