Fix a few conversion bugs. For example, GLshort->GLfloat conversion
[mesa.git] / src / glut / dos / PC_HW / pc_irq.S
1 /*
2 * PC/HW routine collection v1.3 for DOS/DJGPP
3 *
4 * Copyright (C) 2002 - Daniel Borca
5 * Email : dborca@yahoo.com
6 * Web : http://www.geocities.com/dborca
7 */
8
9
10 .file "pc_irq.S"
11
12 .text
13
14 #define IRQ_STACK_SIZE 16384
15
16 #define IRQ_WRAPPER_LEN (__irq_wrapper_1-__irq_wrapper_0)
17 #define IRQ_OLD (__irq_old_0-__irq_wrapper_0)
18 #define IRQ_HOOK (__irq_hook_0-__irq_wrapper_0)
19 #define IRQ_STACK (__irq_stack_0-__irq_wrapper_0)
20
21 .balign 4
22 common:
23 movw $0x0400, %ax
24 int $0x31
25
26 movl %ss:8(%ebp), %ebx
27 cmpl $15, %ebx
28 jbe 0f
29 fail:
30 orl $-1, %eax
31 popl %edi
32 popl %ebx
33 leave
34 ret
35
36 0:
37 movl %ebx, %edi
38 imull $IRQ_WRAPPER_LEN, %edi
39 addl $__irq_wrapper_0, %edi
40
41 cmpb $7, %bl
42 jbe 1f
43 movb %dl, %dh
44 subb $8, %dh
45 1:
46 addb %dh, %bl
47 ret
48
49 .balign 4
50 .global _pc_install_irq
51 _pc_install_irq:
52 pushl %ebp
53 movl %esp, %ebp
54 pushl %ebx
55 pushl %edi
56
57 call common
58
59 cmpl $0, IRQ_HOOK(%edi)
60 jne fail
61
62 pushl $IRQ_WRAPPER_LEN
63 pushl %edi
64 call __go32_dpmi_lock_code
65 addl $8, %esp
66 testl %eax, %eax
67 jnz fail
68
69 pushl $IRQ_STACK_SIZE
70 call _pc_malloc
71 popl %edx
72 testl %eax, %eax
73 jz fail
74 addl %edx, %eax
75 movl %eax, IRQ_STACK(%edi)
76
77 movl ___djgpp_ds_alias, %eax
78 movl %eax, IRQ_STACK+4(%edi)
79
80 movl %ss:12(%ebp), %eax
81 movl %eax, IRQ_HOOK(%edi)
82
83 movw $0x0204, %ax
84 int $0x31
85 movl %edx, IRQ_OLD(%edi)
86 movw %cx, IRQ_OLD+4(%edi)
87 movw $0x0205, %ax
88 movl %edi, %edx
89 movl %cs, %ecx
90 int $0x31
91
92 done:
93 xorl %eax, %eax
94 popl %edi
95 popl %ebx
96 leave
97 ret
98
99 .balign 4
100 .global _pc_remove_irq
101 _pc_remove_irq:
102 pushl %ebp
103 movl %esp, %ebp
104 pushl %ebx
105 pushl %edi
106
107 call common
108
109 cmpl $0, IRQ_HOOK(%edi)
110 je fail
111
112 movl $0, IRQ_HOOK(%edi)
113
114 movw $0x0205, %ax
115 movl IRQ_OLD(%edi), %edx
116 movl IRQ_OLD+4(%edi), %ecx
117 int $0x31
118
119 movl IRQ_STACK(%edi), %eax
120 subl $IRQ_STACK_SIZE, %eax
121 pushl %eax
122 call _free
123 popl %eax
124
125 jmp done
126
127 #define WRAPPER(x) ; \
128 .balign 4 ; \
129 __irq_wrapper_##x: ; \
130 pushal ; \
131 pushl %ds ; \
132 pushl %es ; \
133 pushl %fs ; \
134 pushl %gs ; \
135 movl %ss, %ebx ; \
136 movl %esp, %esi ; \
137 lss %cs:__irq_stack_##x, %esp ; \
138 pushl %ss ; \
139 pushl %ss ; \
140 popl %es ; \
141 popl %ds ; \
142 movl ___djgpp_dos_sel, %fs ; \
143 pushl %fs ; \
144 popl %gs ; \
145 call *__irq_hook_##x ; \
146 movl %ebx, %ss ; \
147 movl %esi, %esp ; \
148 testl %eax, %eax ; \
149 popl %gs ; \
150 popl %fs ; \
151 popl %es ; \
152 popl %ds ; \
153 popal ; \
154 jz __irq_ignore_##x ; \
155 __irq_bypass_##x: ; \
156 ljmp *%cs:__irq_old_##x ; \
157 __irq_ignore_##x: ; \
158 iret ; \
159 .balign 4 ; \
160 __irq_old_##x: ; \
161 .long 0, 0 ; \
162 __irq_hook_##x: ; \
163 .long 0 ; \
164 __irq_stack_##x: ; \
165 .long 0, 0
166
167 WRAPPER(0);
168 WRAPPER(1);
169 WRAPPER(2);
170 WRAPPER(3);
171 WRAPPER(4);
172 WRAPPER(5);
173 WRAPPER(6);
174 WRAPPER(7);
175 WRAPPER(8);
176 WRAPPER(9);
177 WRAPPER(10);
178 WRAPPER(11);
179 WRAPPER(12);
180 WRAPPER(13);
181 WRAPPER(14);
182 WRAPPER(15);