247 lines
9.0 KiB
ArmAsm
247 lines
9.0 KiB
ArmAsm
//========================================================================
|
|
// GLFW - An OpenGL framework
|
|
// File: dos_irq.s
|
|
// Platform: DOS
|
|
// API version: 2.4
|
|
// WWW: http://glfw.sourceforge.net
|
|
//------------------------------------------------------------------------
|
|
// Copyright (c) 2002-2004 Camilla Berglund
|
|
//
|
|
// This software is provided 'as-is', without any express or implied
|
|
// warranty. In no event will the authors be held liable for any damages
|
|
// arising from the use of this software.
|
|
//
|
|
// Permission is granted to anyone to use this software for any purpose,
|
|
// including commercial applications, and to alter it and redistribute it
|
|
// freely, subject to the following restrictions:
|
|
//
|
|
// 1. The origin of this software must not be misrepresented; you must not
|
|
// claim that you wrote the original software. If you use this software
|
|
// in a product, an acknowledgment in the product documentation would
|
|
// be appreciated but is not required.
|
|
//
|
|
// 2. Altered source versions must be plainly marked as such, and must not
|
|
// be misrepresented as being the original software.
|
|
//
|
|
// 3. This notice may not be removed or altered from any source
|
|
// distribution.
|
|
//
|
|
//========================================================================
|
|
|
|
.file "dos_irq.S"
|
|
|
|
.text
|
|
|
|
|
|
#define IRQ_STACK_SIZE 16384
|
|
|
|
#define IRQ_WRAPPER_LEN (__irq_wrapper_1-__irq_wrapper_0)
|
|
#define IRQ_OLD (__irq_old_0-__irq_wrapper_0)
|
|
#define IRQ_HOOK (__irq_hook_0-__irq_wrapper_0)
|
|
#define IRQ_STACK (__irq_stack_0-__irq_wrapper_0)
|
|
|
|
|
|
//========================================================================
|
|
// common
|
|
//========================================================================
|
|
|
|
.balign 4
|
|
common:
|
|
movw $0x0400, %ax
|
|
int $0x31
|
|
|
|
movl %ss:8(%ebp), %ebx
|
|
cmpl $15, %ebx
|
|
jbe 0f
|
|
fail:
|
|
orl $-1, %eax
|
|
popl %edi
|
|
popl %ebx
|
|
leave
|
|
ret
|
|
|
|
0:
|
|
movl %ebx, %edi
|
|
imull $IRQ_WRAPPER_LEN, %edi
|
|
addl $__irq_wrapper_0, %edi
|
|
|
|
cmpb $7, %bl
|
|
jbe 1f
|
|
movb %dl, %dh
|
|
subb $8, %dh
|
|
1:
|
|
addb %dh, %bl
|
|
ret
|
|
|
|
|
|
//========================================================================
|
|
// _glfwInstallDOSIrq()
|
|
//========================================================================
|
|
|
|
.balign 4
|
|
.global __glfwInstallDOSIrq
|
|
__glfwInstallDOSIrq:
|
|
pushl %ebp
|
|
movl %esp, %ebp
|
|
pushl %ebx
|
|
pushl %edi
|
|
|
|
call common
|
|
|
|
cmpl $0, IRQ_HOOK(%edi)
|
|
jne fail
|
|
|
|
pushl $IRQ_WRAPPER_LEN
|
|
pushl %edi
|
|
call __go32_dpmi_lock_code
|
|
addl $8, %esp
|
|
testl %eax, %eax
|
|
jnz fail
|
|
|
|
/* OLD >>
|
|
pushl $IRQ_STACK_SIZE
|
|
call _pc_malloc
|
|
popl %edx
|
|
testl %eax, %eax
|
|
jz fail
|
|
addl %edx, %eax
|
|
movl %eax, IRQ_STACK(%edi)
|
|
<< OLD */
|
|
|
|
/* MG: NEW >> */
|
|
pushl $IRQ_STACK_SIZE
|
|
call _malloc
|
|
popl %edx
|
|
testl %eax, %eax
|
|
jz fail
|
|
|
|
pushl %edx
|
|
pushl %eax
|
|
call __go32_dpmi_lock_data
|
|
addl $8, %esp
|
|
testl %eax, %eax
|
|
jnz fail
|
|
subl $8, %esp
|
|
popl %eax
|
|
popl %edx
|
|
|
|
addl %edx, %eax
|
|
movl %eax, IRQ_STACK(%edi)
|
|
/* << NEW */
|
|
|
|
movl ___djgpp_ds_alias, %eax
|
|
movl %eax, IRQ_STACK+4(%edi)
|
|
|
|
movl %ss:12(%ebp), %eax
|
|
movl %eax, IRQ_HOOK(%edi)
|
|
|
|
movw $0x0204, %ax
|
|
int $0x31
|
|
movl %edx, IRQ_OLD(%edi)
|
|
movw %cx, IRQ_OLD+4(%edi)
|
|
movw $0x0205, %ax
|
|
movl %edi, %edx
|
|
movl %cs, %ecx
|
|
int $0x31
|
|
|
|
done:
|
|
xorl %eax, %eax
|
|
popl %edi
|
|
popl %ebx
|
|
leave
|
|
ret
|
|
|
|
|
|
//========================================================================
|
|
// _glfwRemoveDOSIrq()
|
|
//========================================================================
|
|
.balign 4
|
|
.global __glfwRemoveDOSIrq
|
|
__glfwRemoveDOSIrq:
|
|
pushl %ebp
|
|
movl %esp, %ebp
|
|
pushl %ebx
|
|
pushl %edi
|
|
|
|
call common
|
|
|
|
cmpl $0, IRQ_HOOK(%edi)
|
|
je fail
|
|
|
|
movl $0, IRQ_HOOK(%edi)
|
|
|
|
movw $0x0205, %ax
|
|
movl IRQ_OLD(%edi), %edx
|
|
movl IRQ_OLD+4(%edi), %ecx
|
|
int $0x31
|
|
|
|
movl IRQ_STACK(%edi), %eax
|
|
subl $IRQ_STACK_SIZE, %eax
|
|
pushl %eax
|
|
call _free
|
|
popl %eax
|
|
|
|
jmp done
|
|
|
|
|
|
//========================================================================
|
|
// IRQ wrapper code for all 16 different IRQs
|
|
//========================================================================
|
|
|
|
#define WRAPPER(x) ; \
|
|
.balign 4 ; \
|
|
__irq_wrapper_##x: ; \
|
|
pushal ; \
|
|
pushl %ds ; \
|
|
pushl %es ; \
|
|
pushl %fs ; \
|
|
pushl %gs ; \
|
|
movl %ss, %ebx ; \
|
|
movl %esp, %esi ; \
|
|
lss %cs:__irq_stack_##x, %esp ; \
|
|
pushl %ss ; \
|
|
pushl %ss ; \
|
|
popl %es ; \
|
|
popl %ds ; \
|
|
movl ___djgpp_dos_sel, %fs ; \
|
|
pushl %fs ; \
|
|
popl %gs ; \
|
|
call *__irq_hook_##x ; \
|
|
movl %ebx, %ss ; \
|
|
movl %esi, %esp ; \
|
|
testl %eax, %eax ; \
|
|
popl %gs ; \
|
|
popl %fs ; \
|
|
popl %es ; \
|
|
popl %ds ; \
|
|
popal ; \
|
|
jz __irq_ignore_##x ; \
|
|
__irq_bypass_##x: ; \
|
|
ljmp *%cs:__irq_old_##x ; \
|
|
__irq_ignore_##x: ; \
|
|
iret ; \
|
|
.balign 4 ; \
|
|
__irq_old_##x: ; \
|
|
.long 0, 0 ; \
|
|
__irq_hook_##x: ; \
|
|
.long 0 ; \
|
|
__irq_stack_##x: ; \
|
|
.long 0, 0
|
|
|
|
WRAPPER(0);
|
|
WRAPPER(1);
|
|
WRAPPER(2);
|
|
WRAPPER(3);
|
|
WRAPPER(4);
|
|
WRAPPER(5);
|
|
WRAPPER(6);
|
|
WRAPPER(7);
|
|
WRAPPER(8);
|
|
WRAPPER(9);
|
|
WRAPPER(10);
|
|
WRAPPER(11);
|
|
WRAPPER(12);
|
|
WRAPPER(13);
|
|
WRAPPER(14);
|
|
WRAPPER(15);
|