~gma500/+junk/gma500-natty

« back to all changes in this revision

Viewing changes to xpsb-glx/mesa/src/glut/dos/PC_HW/pc_irq.S

  • Committer: Luca Forina
  • Date: 2011-02-14 10:01:54 UTC
  • Revision ID: luca.forina@gmail.com-20110214100154-ai9gynuqb1dna2ea
new commit

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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);