From 47d8adde43c71f32d3677bb8ad965f262b6f3150 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Sat, 8 Mar 2003 18:28:14 +0000 Subject: DOS update (Daniel Borca) --- src/glut/dos/Makefile.DJ | 2 +- src/glut/dos/PC_HW/pc_hw.h | 5 +- src/glut/dos/PC_HW/pc_irq.S | 10 +-- src/glut/dos/PC_HW/pc_keyb.c | 25 +++----- src/glut/dos/PC_HW/pc_mouse.c | 144 ++++++++++++++++++++++++++---------------- src/glut/dos/callback.c | 2 +- src/glut/dos/color.c | 2 +- src/glut/dos/extens.c | 2 +- src/glut/dos/glutint.h | 2 +- src/glut/dos/init.c | 5 +- src/glut/dos/menu.c | 2 +- src/glut/dos/mouse.c | 16 ++++- src/glut/dos/overlay.c | 2 +- src/glut/dos/state.c | 2 +- src/glut/dos/window.c | 2 +- 15 files changed, 135 insertions(+), 88 deletions(-) (limited to 'src/glut/dos') diff --git a/src/glut/dos/Makefile.DJ b/src/glut/dos/Makefile.DJ index 2fb1bee27d..2ae88520dc 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 c38c8959b6..c029005b53 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 196546072c..7f0b747d34 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 333ca757f5..6475be3508 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 3ed7650906..1740bfbac4 100644 --- a/src/glut/dos/PC_HW/pc_mouse.c +++ b/src/glut/dos/PC_HW/pc_mouse.c @@ -8,11 +8,15 @@ #include +#include +#include #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 6e3f5a77c7..67e52ee59f 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 2e8ed3f95b..490839968e 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 ae8e44f408..ca4da058cd 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 bbabf0fdb2..dfc42754df 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 6c034ff5e2..9553cf2532 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 9a3841b12b..e8f7b0a75b 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 d82f5e8a8c..7ba6358bc2 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 f1f72cf1f8..d0e2a859c7 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 e9735a06a2..38b03a72ab 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 cad4726936..839241a9b0 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 -- cgit v1.2.3