Subversion Repositories Kolibri OS

Rev

Rev 188 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
164 serge 1
;
2
;   This file is part of the Infinity sound AC97 driver.
3
;   (C) copyright Serge 2006
4
;   email: infinity_sound@mail.ru
5
;
6
;   This program is free software; you can redistribute it and/or modify
7
;   it under the terms of the GNU General Public License as published by
8
;   the Free Software Foundation; either version 2 of the License, or
9
;   (at your option) any later version.
10
;
11
;   This program is distributed in the hope that it will be useful,
12
;   but WITHOUT ANY WARRANTY; without even the implied warranty of
13
;   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
;   GNU General Public License for more details.
15
 
16
align 4
17
proc attach_int_handler stdcall, irq:dword, handler:dword
18
 
19
	 mov ebx, [irq]        ;irq num
20
	 test ebx, ebx
21
	 jz .err
22
	 mov eax, [handler]
23
	 test eax, eax
24
	 jz .err
25
	 mov [irq_tab+ebx*4], eax
26
         stdcall enable_irq, [irq]
27
	 ret
28
.err:
29
	 xor eax, eax
30
	 ret
31
endp
32
 
33
align 4
34
proc  detach_int_handler
35
 
36
	   ret
37
endp
38
 
39
align 4
40
proc enable_irq stdcall, irq_line:dword
41
           mov ebx, [irq_line]
42
           mov edx, 0x21
43
           cmp ebx, 8
44
           jb @F
45
           mov edx, 0xA1
46
           sub ebx,8
47
@@:
48
           in al,dx
49
           btr eax, ebx
50
           out dx, al
51
           ret
52
endp
53
 
54
align 16
55
;; proc irq_serv
56
 
57
irq_serv:
58
 
59
.irq_1:
60
	   push eax
61
	   mov eax, 1
62
	   jmp .main
63
align 4
64
.irq_2:
65
	   push eax
66
	   mov eax, 2
67
	   jmp .main
68
align 4
69
.irq_3:
70
	   push eax
71
	   mov eax, 3
72
	   jmp .main
73
align 4
74
.irq_4:
75
	   push eax
76
	   mov eax, 4
77
	   jmp .main
78
align 4
79
.irq_5:
80
	   push eax
81
	   mov eax, 5
82
	   jmp .main
83
align 4
84
.irq_6:
85
	   push eax
86
	   mov eax, 6
87
	   jmp .main
88
align 4
89
.irq_7:
90
	   push eax
91
	   mov eax, 7
92
	   jmp .main
93
align 4
94
.irq_8:
95
	   push eax
96
	   mov eax, 8
97
	   jmp .main
98
align 4
99
.irq_9:
100
	   push eax
101
	   mov eax, 9
102
	   jmp .main
103
align 4
104
.irq_10:
105
	   push eax
106
	   mov eax, 10
107
	   jmp .main
108
align 4
109
.irq_11:
110
	   push eax
111
	   mov eax, 11
112
	   jmp .main
113
align 4
114
.irq_12:
115
	   push eax
116
	   mov eax, 12
117
	   jmp .main
118
align 4
119
.irq_13:
120
	   push eax
121
	   mov eax, 13
122
	   jmp .main
123
align 4
124
.irq_14:
125
	   push eax
126
	   mov eax, 14
127
	   jmp .main
128
align 4
129
.irq_15:
130
	   push eax
131
	   mov eax, 15
132
	   jmp .main
133
 
134
align 16
135
.main:
136
	   save_ring3_context
137
	   mov	 bx, os_data
138
	   mov	 ds, bx
139
	   mov	 es, bx
140
 
141
	   mov ebx, [irq_tab+eax*4]
142
	   test ebx, ebx
143
	   jz .exit
144
 
145
           call ebx
146
 
147
.exit:
148
	   restore_ring3_context
149
 
150
           cmp eax, 8
151
	   mov al, 0x20
152
           jb @f
153
	   out 0xa0, al
154
@@:
155
           out 0x20, al
156
 
157
           pop eax
158
	   iret
159
 
160
align 4
161
proc get_notify stdcall, p_ev:dword
162
 
163
.wait:
164
           mov ebx,[CURRENT_TASK]
165
           shl ebx,8
166
           test dword [ebx+PROC_BASE+0xA8],EVENT_NOTIFY
167
	   jz @f
168
           and dword [ebx+PROC_BASE+0xA8], not EVENT_NOTIFY
169
	   mov edi, [p_ev]
170
	   mov dword [edi], EV_INTR
171
           mov eax, [ebx+PROC_BASE+APPDATA.event]
172
	   mov dword [edi+4], eax
173
	   ret
174
@@:
175
	   call change_task
176
	   jmp .wait
177
endp
178
 
179
align 4
180
proc pci_read32 stdcall, bus:dword, devfn:dword, reg:dword
181
	   xor eax, eax
182
	   xor ebx, ebx
183
	   mov ah, byte [bus]
184
           mov al, 6
185
	   mov bh, byte [devfn]
186
	   mov bl, byte [reg]
187
	   call pci_read_reg
188
	   ret
189
endp
190
 
191
align 4
192
proc pci_read8 stdcall, bus:dword, devfn:dword, reg:dword
193
	   xor eax, eax
194
	   xor ebx, ebx
195
	   mov ah, byte [bus]
196
           mov al, 4
197
	   mov bh, byte [devfn]
198
	   mov bl, byte [reg]
199
	   call pci_read_reg
200
	   ret
201
endp
202
 
203
align 4
204
proc pci_write8 stdcall, bus:dword, devfn:dword, reg:dword, val:dword
205
	   xor eax, eax
206
	   xor ebx, ebx
207
	   mov ah, byte [bus]
208
           mov al, 8
209
	   mov bh, byte [devfn]
210
	   mov bl, byte [reg]
211
           mov ecx, [val]
212
           call pci_write_reg
213
	   ret
214
endp
215
 
216
handle     equ  IOCTL.handle
217
io_code    equ  IOCTL.io_code
218
input      equ  IOCTL.input
219
inp_size   equ  IOCTL.inp_size
220
output     equ  IOCTL.output
221
out_size   equ  IOCTL.out_size
222
 
223
 
224
align 4
225
proc srv_handler stdcall, ioctl:dword
226
           mov esi, [ioctl]
227
           test esi, esi
228
           jz .err
229
 
230
           mov edi, [esi+handle]
231
           cmp [edi+SRV.magic], ' SRV'
232
	   jne .fail
233
 
234
           cmp [edi+SRV.size], SRV_SIZE
235
	   jne .fail
236
 
237
           stdcall [edi+SRV.srv_proc], esi
238
           ret
239
.fail:
240
           xor eax, eax
241
           not eax
242
           mov [esi+output], eax
243
           mov [esi+out_size], 4
244
           ret
245
.err:
246
           xor eax, eax
247
           not eax
248
           ret
249
endp
250
 
251
align 4
252
proc srv_handlerEx stdcall, ioctl:dword
253
           mov esi, [ioctl]
254
           test esi, esi
255
           jz .err
256
           add esi, new_app_base
257
 
258
           mov edi, [esi+handle]
259
           cmp [edi+SRV.magic], ' SRV'
260
	   jne .fail
261
 
262
           cmp [edi+SRV.size], SRV_SIZE
263
	   jne .fail
264
 
265
           add [esi+input], new_app_base
266
           add [esi+output], new_app_base
267
 
268
           stdcall [edi+SRV.srv_proc], esi
269
           ret
270
.fail:
271
           xor eax, eax
272
           not eax
273
           mov [esi+output], eax
274
           mov [esi+out_size], 4
275
           ret
276
.err:
277
           xor eax, eax
278
           not eax
279
           ret
280
endp
281
 
282
restore  handle
283
restore  io_code
284
restore  input
285
restore  inp_size
286
restore  output
287
restore  out_size
288
 
289
align 4
290
proc get_service stdcall, sz_name:dword
291
	   locals
292
	     srv_ptr  dd ?
293
	     counter  dd ?
294
	    endl
295
 
296
	    mov eax, [sz_name]
297
	    test eax, eax
298
	    jz .fail
299
 
300
	    mov [srv_ptr], srv_tab
301
	    mov [counter], 16
302
@@:
303
	    stdcall strncmp, [srv_ptr], [sz_name], 16
304
	    test eax, eax
305
	    je .ok
306
 
307
	    add [srv_ptr], SRV_SIZE
308
	    dec [counter]
309
	    jnz @B
310
.not_load:
311
 
312
           stdcall find_service, [sz_name]
313
           test eax, eax
314
           jz .fail
315
 
316
           stdcall load_lib, eax
317
           test eax, eax
318
           jz .fail
319
 
320
            mov [srv_ptr], srv_tab
321
	    mov [counter], 16
322
@@:
323
	    stdcall strncmp, [srv_ptr], [sz_name], 16
324
	    test eax, eax
325
	    je .ok
326
 
327
	    add [srv_ptr], SRV_SIZE
328
	    dec [counter]
329
	    jnz @B
330
.fail:
331
	    xor eax, eax
332
	    ret
333
.ok:
334
	    mov eax, [srv_ptr]
335
	    ret
336
endp
337
 
338
align 4
339
proc find_service stdcall ,sz_name:dword
340
 
341
	   mov eax, [sz_name]
342
	   test eax, eax
343
	   jz .fail
344
 
345
           mov esi, services
346
@@:
347
           mov eax, [esi]
348
           test eax, eax
349
           jz .fail
350
           push esi
351
           stdcall strncmp, eax, [sz_name], 16
352
           pop esi
353
           test eax, eax
354
           je .ok
355
 
356
           add esi, 8
357
           jmp @B
358
.ok:
359
           mov eax, [esi+4]
360
           ret
361
.fail:
362
           xor eax, eax
363
           ret
364
endp
365
 
366
align 4
367
proc reg_service stdcall, sz_name:dword, handler:dword
368
	   locals
369
	     srv dd ?
370
	   endl
371
 
372
	   mov eax, [sz_name]
373
	   test eax, eax
374
	   jz .fail
375
 
376
	   mov ebx, [handler]
377
	   test ebx, ebx
378
	   jz .fail
379
 
380
	   call alloc_service
381
	   test eax, eax
382
	   jz .fail
383
 
384
	   mov [srv], eax
385
	   mov edi, eax
386
	   mov esi, [sz_name]
387
	   mov ecx, 16
388
	   rep movsb
389
 
390
	   mov edi, eax
391
	   mov [edi+SRV.magic], ' SRV'
392
	   mov [edi+SRV.size], SRV_SIZE
393
	   mov ebx, [handler]
394
	   mov [edi+SRV.srv_proc], ebx
395
           mov eax, [srv]
396
	   ret
397
.fail:
398
	   xor eax, eax
399
	   ret
400
endp
401
 
402
align 4
403
proc get_proc stdcall, exp:dword, sz_name:dword
404
 
405
           mov edx, [exp]
406
.next:
407
           mov eax, [edx]
408
           test eax, eax
409
           jz .end
410
 
411
           push edx
412
           stdcall strncmp, eax, [sz_name], 16
413
           pop edx
414
           test eax, eax
415
           jz .ok
416
 
417
           add edx,8
418
           jmp .next
419
.ok:
420
           mov eax, [edx+4]
421
.end:
422
           ret
423
endp
424
 
425
align 4
426
proc link_dll stdcall, exp:dword, imp:dword
427
           mov esi, [imp]
428
.next:
429
           mov eax, [esi]
430
           test eax, eax
431
           jz .end
432
 
433
           push esi
434
           stdcall get_proc, [exp], eax
435
           pop esi
436
 
437
           test eax, eax
438
           jz @F
439
 
440
           mov [esi], eax
441
@@:
442
           add esi, 4
443
           jmp .next
444
.end:
445
           ret
446
endp
447
 
448
align 4
449
proc get_coff_sym stdcall, pSym:dword,count:dword, sz_sym:dword
450
 
451
@@:
452
	   stdcall strncmp, [pSym], [sz_sym], 8
453
	   test eax,eax
454
	   jz .ok
455
	   add [pSym], 18
456
	   dec [count]
457
	   jnz @b
458
	   xor eax, eax
459
	   ret
460
.ok:
461
	   mov ebx, [pSym]
462
	   mov eax, [ebx+8]
463
	   ret
464
endp
465
 
466
align 4
467
proc load_lib stdcall, name:dword
468
	   locals
469
	     lib   dd ?
470
	     base  dd ?
471
	     pSym  dd ?
472
	   endl
473
 
474
	   mov eax, [name]
475
	   mov	  ebx, 1		 ;index of first block
476
           mov    ecx, 32                ;number of blocks
477
	   mov	  edx, TMP_BUFF 	 ;temp area
478
	   mov	  esi, 12		 ;file name length
479
 
480
	   call   fileread		;read file from RD
481
 
482
	   cmp	  eax,0
483
	   jne	  .err
484
 
485
;           mov eax, [TMP_BUFF+CFH.pSymTable]
486
;           add eax, TMP_BUFF
487
;           mov [pSym], eax
488
 
489
;           mov [TMP_BUFF+20+CFS.VirtualAddress], eax
490
 
491
	   stdcall kernel_alloc, [TMP_BUFF+20+CFS.SizeOfRawData]
492
	   mov [base], eax
493
 
494
           test eax, eax
495
           jnz @f
496
@@:
497
	   mov [TMP_BUFF+20+CFS.VirtualAddress], eax
498
	   mov ebx, [TMP_BUFF+CFH.pSymTable]
499
	   add ebx, TMP_BUFF
500
	   mov [pSym], ebx
501
 
502
	   stdcall LinkSection, TMP_BUFF, TMP_BUFF+20, ebx
503
 
504
	   mov edi, [base]
505
           test edi, edi
506
           jnz @f
507
@@:
508
	   mov esi, [TMP_BUFF+20+CFS.PtrRawData]
509
	   add esi, TMP_BUFF
510
	   mov ecx, [TMP_BUFF+20+CFS.SizeOfRawData]
511
	   rep movsb
512
 
513
	   call alloc_dll
514
           test eax, eax
515
           jnz @f
516
@@:
517
	   mov [lib], eax
518
 
519
	   mov edi, eax
520
	   mov esi, [name]
521
	   mov ecx, 16
522
	   rep movsb
523
 
524
	   stdcall get_coff_sym,[pSym],[TMP_BUFF+CFH.nSymbols],szSTART
525
	   mov edi, [lib]
526
	   add eax, [base]
527
	   mov [edi+LIB.lib_start], eax
528
	   mov ebx, [base]
529
	   mov [edi+LIB.lib_base], ebx
530
 
531
	   stdcall get_coff_sym,[pSym],[TMP_BUFF+CFH.nSymbols], szEXPORTS
532
	   mov edi, [lib]
533
	   add eax, [base]
534
	   mov [edi+LIB.export], eax
535
 
536
	   stdcall get_coff_sym,[pSym],[TMP_BUFF+CFH.nSymbols], szIMPORTS
537
	   mov edi, [lib]
538
	   add eax, [base]
539
	   mov [edi+LIB.import], eax
540
 
541
	   stdcall link_dll, kernel_export, eax
542
 
543
	   mov edi, [lib]
544
           call [edi+LIB.lib_start]
545
 
546
	   mov eax, [lib]
547
	   ret
548
.err:
549
	   xor eax, eax
550
	   ret
551
 
552
endp
553
 
554
align 4
555
proc LinkSection stdcall, pCoff:dword, pSec:dword, pSym:dword
556
	   locals
557
	     pCode     dd ?
558
	   endl
559
 
560
	   mov esi, [pSec]
561
	   mov eax, [esi+CFS.PtrRawData]
562
	   add eax, [pCoff]
563
	   mov [pCode], eax
564
 
565
	   mov edi, [esi+CFS.PtrReloc]
566
	   add edi, [pCoff]
567
 
568
	   movzx edx, [esi+CFS.NumReloc]
569
	   mov eax, edx
570
	   lea edx, [edx+edx*8]
571
	   add edx, eax
572
	   add edx, edi
573
.l_0:
574
	   cmp edi, edx
575
	   jae .exit
576
 
577
	   mov ebx, [edi+CRELOC.SymIndex]
578
	   add ebx,ebx
579
	   lea ebx,[ebx+ebx*8]
580
 
581
	   add ebx, [pSym]
582
 
583
	   mov ecx, [ebx+CSYM.Value]
584
	   add ecx, [esi+CFS.VirtualAddress]
585
 
586
	   mov eax, [edi+CRELOC.VirtualAddress]
587
	   add eax, [pCode]
588
	   add [eax], ecx
589
	   add edi, 10
590
	   jmp .l_0
591
 
592
.exit:
593
	   ret
594
endp
595
 
596
proc get_curr_task
597
           mov eax,[CURRENT_TASK]
598
           shl eax, 8
599
           ret
600
endp
601
 
602
drv_sound      db 'UNISOUNDOBJ', 0
603
drv_infinity   db 'INFINITYOBJ', 0
604
 
605
szSound        db 'SOUND',0
606
szInfinity     db 'INFINITY',0
607
 
608
szSTART        db 'START',0
609
szEXPORTS      db 'EXPORTS',0
610
szIMPORTS      db 'IMPORTS',0
611
 
612
align 16
613
services:
614
           dd szSound,    drv_sound
615
           dd szInfinity, drv_infinity
616
           dd 0