Subversion Repositories Kolibri OS

Rev

Rev 198 | Rev 206 | Go to most recent revision | Details | Compare with Previous | 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 ?
188 serge 294
           endl
164 serge 295
 
188 serge 296
           mov eax, [sz_name]
297
           test eax, eax
298
           jnz @F
299
           ret
164 serge 300
@@:
188 serge 301
           mov [srv_ptr], srv_tab
302
           mov [counter], 16
303
@@:
304
           stdcall strncmp, [srv_ptr], [sz_name], 16
305
           test eax, eax
306
           je .ok
164 serge 307
 
188 serge 308
           add [srv_ptr], SRV_SIZE
309
           dec [counter]
310
           jnz @B
164 serge 311
.not_load:
312
           stdcall find_service, [sz_name]
313
           test eax, eax
188 serge 314
           jnz @F
315
           ret
164 serge 316
@@:
188 serge 317
           stdcall load_driver, eax
318
           ret
164 serge 319
.ok:
188 serge 320
           mov eax, [srv_ptr]
321
           ret
164 serge 322
endp
323
 
324
align 4
325
proc find_service stdcall ,sz_name:dword
326
 
327
	   mov eax, [sz_name]
328
	   test eax, eax
329
	   jz .fail
330
 
331
           mov esi, services
332
@@:
333
           mov eax, [esi]
334
           test eax, eax
335
           jz .fail
336
           push esi
337
           stdcall strncmp, eax, [sz_name], 16
338
           pop esi
339
           test eax, eax
340
           je .ok
341
 
342
           add esi, 8
343
           jmp @B
344
.ok:
345
           mov eax, [esi+4]
346
           ret
347
.fail:
348
           xor eax, eax
349
           ret
350
endp
351
 
352
align 4
353
proc reg_service stdcall, sz_name:dword, handler:dword
354
	   locals
355
	     srv dd ?
356
	   endl
357
 
358
	   mov eax, [sz_name]
359
	   test eax, eax
360
	   jz .fail
361
 
362
	   mov ebx, [handler]
363
	   test ebx, ebx
364
	   jz .fail
365
 
366
	   call alloc_service
367
	   test eax, eax
368
	   jz .fail
369
 
370
	   mov [srv], eax
371
	   mov edi, eax
372
	   mov esi, [sz_name]
373
	   mov ecx, 16
374
	   rep movsb
375
 
376
	   mov edi, eax
377
	   mov [edi+SRV.magic], ' SRV'
378
	   mov [edi+SRV.size], SRV_SIZE
379
	   mov ebx, [handler]
380
	   mov [edi+SRV.srv_proc], ebx
381
           mov eax, [srv]
382
	   ret
383
.fail:
384
	   xor eax, eax
385
	   ret
386
endp
387
 
388
align 4
389
proc get_proc stdcall, exp:dword, sz_name:dword
390
 
391
           mov edx, [exp]
392
.next:
393
           mov eax, [edx]
394
           test eax, eax
395
           jz .end
396
 
397
           push edx
398
           stdcall strncmp, eax, [sz_name], 16
399
           pop edx
400
           test eax, eax
401
           jz .ok
402
 
403
           add edx,8
404
           jmp .next
405
.ok:
406
           mov eax, [edx+4]
407
.end:
408
           ret
409
endp
410
 
411
align 4
412
proc get_coff_sym stdcall, pSym:dword,count:dword, sz_sym:dword
413
 
414
@@:
415
	   stdcall strncmp, [pSym], [sz_sym], 8
416
	   test eax,eax
417
	   jz .ok
418
	   add [pSym], 18
419
	   dec [count]
420
	   jnz @b
421
	   xor eax, eax
422
	   ret
423
.ok:
424
	   mov ebx, [pSym]
425
	   mov eax, [ebx+8]
426
	   ret
427
endp
428
 
429
align 4
188 serge 430
proc get_curr_task
431
           mov eax,[CURRENT_TASK]
432
           shl eax, 8
433
           ret
434
endp
164 serge 435
 
188 serge 436
align 4
437
proc get_fileinfo stdcall, file_name:dword, info:dword
438
           locals
439
             cmd     dd ?
440
             offset  dd ?
441
                     dd ?
442
             count   dd ?
443
             buff    dd ?
444
                     db ?
445
             name    dd ?
446
           endl
164 serge 447
 
188 serge 448
           xor eax, eax
449
           mov ebx, [file_name]
450
           sub ebx, new_app_base
451
           mov ecx, [info]
452
           sub ecx, new_app_base
164 serge 453
 
188 serge 454
           mov [cmd], 5
455
           mov [offset], eax
456
           mov [offset+4], eax
457
           mov [count], eax
458
           mov [buff], ecx
459
           mov byte [buff+4], al
460
           mov [name], ebx
164 serge 461
 
188 serge 462
           mov eax, 70
463
           lea ebx, [cmd]
464
           sub ebx, new_app_base
465
           int 0x40
466
           ret
467
endp
164 serge 468
 
188 serge 469
align 4
470
proc read_file stdcall,file_name:dword, buffer:dword, off:dword,\
471
                                     bytes:dword
472
           locals
473
             cmd     dd ?
474
             offset  dd ?
475
                     dd ?
476
             count   dd ?
477
             buff    dd ?
478
                     db ?
479
             name    dd ?
480
           endl
164 serge 481
 
188 serge 482
           xor eax, eax
483
           mov ebx, [file_name]
484
           mov ecx, [off]
485
           mov edx, [bytes]
486
           mov esi, [buffer]
487
           sub ebx, new_app_base
488
           sub esi, new_app_base
164 serge 489
 
188 serge 490
           mov [cmd], eax
491
           mov [offset], ecx
492
           mov [offset+4], eax
493
           mov [count], edx
494
           mov [buff], esi
495
           mov byte [buff+4], al
496
           mov [name], ebx
497
 
498
           mov eax, 70
499
           lea ebx, [cmd]
500
           sub ebx, new_app_base
501
           int 0x40
502
           ret
503
endp
504
 
505
align 4
506
proc load_file stdcall, file_name:dword
507
           locals
508
             attr       dd ?
509
             flags      dd ?
510
             cr_time    dd ?
511
             cr_date    dd ?
512
             acc_time   dd ?
513
             acc_date   dd ?
514
             mod_time   dd ?
515
             mod_date   dd ?
516
             file_size  dd ?
517
 
518
             file       dd ?
519
           endl
520
 
521
           lea eax, [attr]
522
           stdcall get_fileinfo, [file_name], eax
164 serge 523
           test eax, eax
188 serge 524
           jnz .fail
164 serge 525
 
188 serge 526
           stdcall kernel_alloc, [file_size]
527
           mov [file], eax
164 serge 528
 
188 serge 529
           stdcall read_file, [file_name], eax, dword 0, [file_size]
530
           cmp ebx, [file_size]
531
           jne .cleanup
532
           mov eax, [file]
533
           ret
534
.cleanup:
535
           stdcall kernel_free, [file]
536
.fail:
537
           xor eax, eax
538
           ret
539
endp
164 serge 540
 
188 serge 541
align 4
542
proc get_proc_ex stdcall, proc_name:dword, imports:dword
543
 
544
.look_up:
545
           mov edx, [imports]
198 serge 546
           test edx, edx
547
           jz .end
188 serge 548
           mov edx, [edx]
549
           test edx, edx
550
           jz .end
551
.next:
552
           mov eax, [edx]
164 serge 553
           test eax, eax
188 serge 554
           jz .next_table
164 serge 555
 
188 serge 556
           push edx
557
           stdcall strncmp, eax, [proc_name], 16
558
           pop edx
559
           test eax, eax
560
           jz .ok
164 serge 561
 
188 serge 562
           add edx,8
563
           jmp .next
564
.next_table:
565
           add [imports], 4
566
           jmp .look_up
567
.ok:
568
           mov eax, [edx+4]
569
           ret
570
.end:
571
           xor eax, eax
572
           ret
573
endp
164 serge 574
 
188 serge 575
align 4
576
proc fix_coff_symbols stdcall, sec:dword, symbols:dword,\
577
                      sym_count:dword, strings:dword, imports:dword
578
           locals
579
             retval dd ?
580
           endl
164 serge 581
 
188 serge 582
           mov edi, [symbols]
583
           mov [retval], 1
584
.fix:
585
           movzx ebx, [edi+CSYM.SectionNumber]
586
           test ebx, ebx
587
           jnz .internal
588
           mov eax, dword [edi+CSYM.Name]
589
           test eax, eax
590
           jnz @F
164 serge 591
 
188 serge 592
           mov edi, [edi+4]
593
           add edi, [strings]
594
@@:
595
           push edi
596
           stdcall get_proc_ex, edi,[imports]
597
           pop edi
164 serge 598
 
188 serge 599
           xor ebx, ebx
600
           test eax, eax
601
           jnz @F
164 serge 602
 
188 serge 603
           mov esi, msg_unresolved
604
           call sys_msg_board_str
605
           mov esi, edi
606
           call sys_msg_board_str
607
           mov esi, msg_CR
608
           call sys_msg_board_str
164 serge 609
 
188 serge 610
           mov [retval],0
611
@@:
612
           mov edi, [symbols]
613
           mov [edi+CSYM.Value], eax
614
           jmp .next
615
.internal:
616
           dec ebx
617
           shl ebx, 3
618
           lea ebx, [ebx+ebx*4]
619
           add ebx, [sec]
620
 
621
           mov eax, [ebx+CFS.VirtualAddress]
622
           add [edi+CSYM.Value], eax
623
.next:
624
           add edi, CSYM_SIZE
625
           mov [symbols], edi
626
           dec [sym_count]
627
           jnz .fix
628
           mov eax, [retval]
629
           ret
164 serge 630
endp
631
 
632
align 4
188 serge 633
proc fix_coff_relocs stdcall, coff:dword, sec:dword, sym:dword
164 serge 634
	   locals
188 serge 635
             n_sec     dd ?
164 serge 636
	   endl
637
 
188 serge 638
           mov eax, [coff]
639
           movzx ebx, [eax+CFH.nSections]
640
           mov [n_sec], ebx
641
.fix_sec:
642
           mov esi, [sec]
164 serge 643
	   mov edi, [esi+CFS.PtrReloc]
188 serge 644
           add edi, [coff]
164 serge 645
 
188 serge 646
           movzx ecx, [esi+CFS.NumReloc]
647
           test ecx, ecx
648
           jz .next
649
.next_reloc:
164 serge 650
	   mov ebx, [edi+CRELOC.SymIndex]
651
	   add ebx,ebx
652
	   lea ebx,[ebx+ebx*8]
188 serge 653
           add ebx, [sym]
164 serge 654
 
188 serge 655
           mov edx, [ebx+CSYM.Value]
164 serge 656
 
188 serge 657
           cmp [edi+CRELOC.Type], 6
658
           je .dir_32
164 serge 659
 
188 serge 660
           cmp [edi+CRELOC.Type], 20
661
           jne .next_reloc
662
.rel_32:
164 serge 663
	   mov eax, [edi+CRELOC.VirtualAddress]
188 serge 664
           add eax, [esi+CFS.VirtualAddress]
665
           sub edx, eax
666
           sub edx, 4
667
           jmp .fix
668
.dir_32:
669
	   mov eax, [edi+CRELOC.VirtualAddress]
670
           add eax, [esi+CFS.VirtualAddress]
671
.fix:
672
           add [eax], edx
673
           add edi, 10
674
           dec ecx
675
           jnz .next_reloc
676
.next:
677
           add [sec], 40
678
           dec [n_sec]
679
           jnz .fix_sec
164 serge 680
.exit:
681
	   ret
682
endp
683
 
188 serge 684
align 4
685
proc load_driver stdcall, file_name:dword
686
           locals
687
             coff      dd ?
688
             sym       dd ?
689
             strings   dd ?
690
             img_size  dd ?
691
             img_base  dd ?
692
             start     dd ?
693
 
694
             exports   dd ?   ;fake exports table
695
                       dd ?
696
           endl
697
 
698
           stdcall load_file, [file_name]
699
           test eax, eax
700
           jz .fail
701
 
702
           mov [coff], eax
703
 
704
           movzx ecx, [eax+CFH.nSections]
705
           xor ebx, ebx
706
 
707
           lea edx, [eax+20]
708
@@:
709
           add ebx, [edx+CFS.SizeOfRawData]
710
           add ebx, 15
711
           and ebx, not 15
712
           add edx, 18
713
           dec ecx
714
           jnz @B
715
           mov [img_size], ebx
716
 
717
           stdcall kernel_alloc, ebx
718
           test eax, eax
719
           jz .fail
720
           mov [img_base], eax
721
 
722
           mov edi, eax
723
           xor eax, eax
724
           mov ecx, [img_size]
725
           add ecx, 4095
726
           and ecx, not 4095
727
           shr ecx, 2
728
           cld
729
           rep stosd
730
 
731
           mov edx, [coff]
732
           movzx ebx, [edx+CFH.nSections]
733
           mov edi, [img_base]
734
           lea eax, [edx+20]
735
@@:
736
           mov [eax+CFS.VirtualAddress], edi
737
           mov esi, [eax+CFS.PtrRawData]
738
           test esi, esi
739
           jnz .copy
740
           add edi, [eax+CFS.SizeOfRawData]
741
           jmp .next
742
.copy:
743
           add esi, edx
744
           mov ecx, [eax+CFS.SizeOfRawData]
745
           cld
746
           rep movsb
747
.next:
748
           add edi, 15
749
           and edi, not 15
750
           add eax, 40
751
           dec ebx
752
           jnz @B
753
 
754
           mov ebx, [edx+CFH.pSymTable]
755
           add ebx, edx
756
           mov [sym], ebx
757
           mov ecx, [edx+CFH.nSymbols]
758
           add ecx,ecx
759
           lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
760
           add ecx, [sym]
761
           mov [strings], ecx
762
 
763
           lea ebx, [exports]
764
           mov dword [ebx], kernel_export
765
           mov dword [ebx+4], 0
766
           lea eax, [edx+20]
767
 
768
           stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
769
                                     [strings], ebx
770
           test eax, eax
771
           jnz @F
772
 
773
           mov esi, msg_module
774
           call sys_msg_board_str
775
           mov esi, [file_name]
776
           call sys_msg_board_str
777
           mov esi, msg_CR
778
           call sys_msg_board_str
779
 
780
           stdcall kernel_free,[coff]
781
           xor eax, eax
164 serge 782
           ret
188 serge 783
@@:
784
           mov ebx, [coff]
785
           add ebx, 20
786
           stdcall fix_coff_relocs, [coff], ebx, [sym]
787
 
788
           mov ebx, [coff]
789
           stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szSTART
790
           mov [start], eax
791
 
792
           stdcall kernel_free, [coff]
793
 
794
           mov ebx, [start]
795
           call ebx
796
           test eax, eax
797
           jnz .ok
798
 
799
           stdcall kernel_free, [img_base]
800
           xor eax, eax
801
           ret
802
.ok:
803
           mov ebx, [img_base]
804
           mov [eax+SRV.base], ebx
805
           ret
806
.fail:
807
           xor eax, eax
808
           ret
164 serge 809
endp
810
 
198 serge 811
align 4
812
proc load_library stdcall, file_name:dword
813
           locals
814
             coff      dd ?
815
             sym       dd ?
816
             strings   dd ?
817
             img_size  dd ?
818
             img_base  dd ?
819
             exports   dd ?
820
           endl
821
 
822
           cli
823
 
824
           stdcall load_file, [file_name]
825
 
826
           test eax, eax
827
           jz .fail
828
 
829
           mov [coff], eax
830
           movzx ecx, [eax+CFH.nSections]
831
           xor ebx, ebx
832
 
833
           lea edx, [eax+20]
834
@@:
835
           add ebx, [edx+CFS.SizeOfRawData]
836
           add ebx, 15
837
           and ebx, not 15
838
           add edx, 18
839
           dec ecx
840
           jnz @B
841
           mov [img_size], ebx
842
 
843
           call init_heap
844
           stdcall user_alloc, [img_size]
845
 
846
           test eax, eax
847
           jz .fail
848
           mov [img_base], eax
849
 
850
           mov edx, [coff]
851
           movzx ebx, [edx+CFH.nSections]
852
           mov edi, [img_base]
853
           lea eax, [edx+20]
854
@@:
855
           mov [eax+CFS.VirtualAddress], edi
856
           mov esi, [eax+CFS.PtrRawData]
857
           test esi, esi
858
           jnz .copy
859
           add edi, [eax+CFS.SizeOfRawData]
860
           jmp .next
861
.copy:
862
           add esi, edx
863
           add edi, new_app_base
864
           mov ecx, [eax+CFS.SizeOfRawData]
865
           cld
866
           rep movsb
867
.next:
868
           add edi, 15-new_app_base
869
           and edi, not 15
870
           add eax, 40
871
           dec ebx
872
           jnz @B
873
 
874
           mov ebx, [edx+CFH.pSymTable]
875
           add ebx, edx
876
           mov [sym], ebx
877
           mov ecx, [edx+CFH.nSymbols]
878
           add ecx,ecx
879
           lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
880
           add ecx, [sym]
881
           mov [strings], ecx
882
 
883
           lea eax, [edx+20]
884
 
885
           stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
886
                                     [strings], dword 0
887
           test eax, eax
888
           jnz @F
889
 
890
@@:
891
           mov edx, [coff]
892
           movzx ebx, [edx+CFH.nSections]
893
           mov edi, new_app_base
894
           lea eax, [edx+20]
895
@@:
896
           add [eax+CFS.VirtualAddress], edi  ;patch user space offset
897
           add eax, 40
898
           dec ebx
899
           jnz @B
900
 
901
           add edx, 20
902
           stdcall fix_coff_relocs, [coff], edx, [sym]
903
 
904
           mov ebx, [coff]
905
           stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szEXPORTS
906
           mov [exports], eax
907
 
908
           stdcall kernel_free, [coff]
909
           mov eax, [exports]
910
           ret
911
.fail:
912
           xor eax, eax
913
           ret
914
endp
915
 
916
 
202 diamond 917
drv_sound      db '/rd/1/drivers/unisound.obj', 0
918
drv_infinity   db '/rd/1/drivers/infinity.obj', 0
164 serge 919
 
920
szSound        db 'SOUND',0
921
szInfinity     db 'INFINITY',0
922
 
923
szSTART        db 'START',0
924
szEXPORTS      db 'EXPORTS',0
925
szIMPORTS      db 'IMPORTS',0
926
 
188 serge 927
msg_unresolved db 'unresolved ',0
928
msg_module     db 'in module ',0
929
msg_CR         db  13,10,0
930
 
164 serge 931
align 16
932
services:
933
           dd szSound,    drv_sound
934
           dd szInfinity, drv_infinity
935
           dd 0