Subversion Repositories Kolibri OS

Rev

Rev 413 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
381 serge 1
 
2
3
 
4
5
 
6
 
7
include 'imports.inc'
413 serge 8
381 serge 9
 
10
11
 
12
13
 
14
;               FEDCBA9876543210
15
VALID_IRQ   equ 1100111011111000b
16
ATTCH_IRQ   equ 0000111010101000b
17
18
 
19
20
 
21
22
 
23
BIT1  EQU 0x00000002
24
BIT2  EQU 0x00000004
25
BIT3  EQU 0x00000008
26
BIT4  EQU 0x00000010
27
BIT5  EQU 0x00000020
28
BIT6  EQU 0x00000040
29
BIT7  EQU 0x00000080
30
BIT8  EQU 0x00000100
31
BIT9  EQU 0x00000200
32
BIT10 EQU 0x00000400
33
BIT11 EQU 0x00000800
34
BIT12 EQU 0x00001000
35
BIT13 EQU 0x00002000
36
BIT14 EQU 0x00004000
37
BIT15 EQU 0x00008000
38
BIT16 EQU 0x00010000
39
BIT17 EQU 0x00020000
40
BIT18 EQU 0x00040000
41
BIT19 EQU 0x00080000
42
BIT20 EQU 0x00100000
43
BIT21 EQU 0x00200000
44
BIT22 EQU 0x00400000
45
BIT23 EQU 0x00800000
46
BIT24 EQU 0x00100000
47
BIT25 EQU 0x02000000
48
BIT26 EQU 0x04000000
49
BIT27 EQU 0x08000000
50
BIT28 EQU 0x10000000
51
BIT29 EQU 0x20000000
52
BIT30 EQU 0x40000000
53
BIT31 EQU 0x80000000
54
55
 
56
 
57
PCM_OUT_CR_REG	  equ  0x1b	 ; PCM out Control Register
58
PCM_OUT_LVI_REG   equ  0x15	 ; PCM last valid index
59
PCM_OUT_SR_REG	  equ  0x16	 ; PCM out Status register
60
PCM_OUT_PIV_REG   equ  0x1a
61
PCM_OUT_CIV_REG   equ  0x14	 ; PCM out current index
62
63
 
64
MC_IN_CR_REG	  equ  0x2b	 ; MIC in Control Register
65
RR		  equ  BIT1	 ; reset registers.  Nukes all regs
66
67
 
68
CODEC_AUX_VOL			equ	0x04	;
69
CODEC_PCM_OUT_REG		equ	18h	; PCM output volume
70
CODEC_EXT_AUDIO_REG		equ	28h	; extended audio
71
CODEC_EXT_AUDIO_CTRL_REG	equ	2ah	; extended audio control
72
CODEC_PCM_FRONT_DACRATE_REG	equ	2ch	; PCM out sample rate
73
CODEC_PCM_SURND_DACRATE_REG	equ	2eh	; surround sound sample rate
74
CODEC_PCM_LFE_DACRATE_REG	equ	30h	; LFE sample rate
75
76
 
77
CTRL_STAT	equ  0x30	 ;   Global Status
78
CTRL_CAS	equ  0x34	 ;   Codec Access Semiphore
79
80
 
81
82
 
83
84
 
85
86
 
87
CTRL_CNT_AC_OFF equ  0x00000008  ;   ACLINK Off
88
CTRL_CNT_WARM	equ  0x00000004  ;   AC97 Warm Reset
89
CTRL_CNT_COLD	equ  0x00000002  ;   AC97 Cold Reset
90
CTRL_CNT_GIE	equ  0x00000001  ;   GPI Interrupt Enable
91
92
 
93
CODEC_REG_ST	      equ 0x26
94
95
 
96
DEV_STOP	      equ  2
97
DEV_CALLBACK	      equ  3
98
DEV_SET_BUFF	      equ  4
99
DEV_NOTIFY	      equ  5
100
DEV_SET_MASTERVOL     equ  6
101
DEV_GET_MASTERVOL     equ  7
102
DEV_GET_INFO	      equ  8
103
104
 
105
{ .bus                dd ?
106
  .devfn              dd ?
107
108
 
109
  .dev_id             dd ?
110
  .pci_cmd            dd ?
111
  .pci_stat           dd ?
112
113
 
114
  .codec_mem_base     dd ?
115
116
 
117
  .ctrl_mem_base      dd ?
118
  .cfg_reg            dd ?
119
  .int_line           dd ?
120
121
 
122
  .ctrl_ids           dd ?    ;hub id string
123
124
 
125
126
 
127
  .notify_task        dd ?
128
129
 
130
  .ctrl_setup         dd ?
131
  .user_callback      dd ?
132
  .codec_read16       dd ?
133
  .codec_write16      dd ?
134
135
 
136
  .ctrl_read16        dd ?
137
  .ctrl_read32        dd ?
138
139
 
140
  .ctrl_write16       dd ?
141
  .ctrl_write32       dd ?
142
}
143
144
 
145
{
146
  .chip_id            dd ?
147
  .flags              dd ?
148
  .status             dd ?
149
150
 
151
  .chip_ids           dd ?    ;chip model string
152
153
 
154
                      dd ?
155
156
 
157
  .reg_master_vol     dw ?     ;0x02
158
  .reg_aux_out_vol    dw ?     ;0x04
159
  .reg_mone_vol       dw ?     ;0x06
160
  .reg_master_tone    dw ?     ;0x08
161
  .reg_beep_vol       dw ?     ;0x0A
162
  .reg_phone_vol      dw ?     ;0x0C
163
  .reg_mic_vol        dw ?     ;0x0E
164
  .reg_line_in_vol    dw ?     ;0x10
165
  .reg_cd_vol         dw ?     ;0x12
166
  .reg_video_vol      dw ?     ;0x14
167
  .reg_aux_in_vol     dw ?     ;0x16
168
  .reg_pcm_out_vol    dw ?     ;0x18
169
  .reg_rec_select     dw ?     ;0x1A
170
  .reg_rec_gain       dw ?     ;0x1C
171
  .reg_rec_gain_mic   dw ?     ;0x1E
172
  .reg_gen            dw ?     ;0x20
173
  .reg_3d_ctrl        dw ?     ;0X22
174
  .reg_page           dw ?     ;0X24
175
  .reg_powerdown      dw ?     ;0x26
176
  .reg_ext_audio      dw ?     ;0x28
177
  .reg_ext_st         dw ?     ;0x2a
178
  .reg_pcm_front_rate dw ?     ;0x2c
179
  .reg_pcm_surr_rate  dw ?     ;0x2e
180
  .reg_lfe_rate       dw ?     ;0x30
181
  .reg_pcm_in_rate    dw ?     ;0x32
182
                      dw ?     ;0x34
183
  .reg_cent_lfe_vol   dw ?     ;0x36
184
  .reg_surr_vol       dw ?     ;0x38
185
  .reg_spdif_ctrl     dw ?     ;0x3A
186
                      dw ?     ;0x3C
187
                      dw ?     ;0x3E
188
                      dw ?     ;0x40
189
                      dw ?     ;0x42
190
                      dw ?     ;0x44
191
                      dw ?     ;0x46
192
                      dw ?     ;0x48
193
                      dw ?     ;0x4A
194
                      dw ?     ;0x4C
195
                      dw ?     ;0x4E
196
                      dw ?     ;0x50
197
                      dw ?     ;0x52
198
                      dw ?     ;0x54
199
                      dw ?     ;0x56
200
                      dw ?     ;0x58
201
                      dw ?     ;0x5A
202
                      dw ?     ;0x5C
203
                      dw ?     ;0x5E
204
  .reg_page_0         dw ?     ;0x60
205
  .reg_page_1         dw ?     ;0x62
206
  .reg_page_2         dw ?     ;0x64
207
  .reg_page_3         dw ?     ;0x66
208
  .reg_page_4         dw ?     ;0x68
209
  .reg_page_5         dw ?     ;0x6A
210
  .reg_page_6         dw ?     ;0x6C
211
  .reg_page_7         dw ?     ;0x6E
212
                      dw ?     ;0x70
213
                      dw ?     ;0x72
214
                      dw ?     ;0x74
215
                      dw ?     ;0x76
216
                      dw ?     ;0x78
217
                      dw ?     ;0x7A
218
  .reg_vendor_id_1    dw ?     ;0x7C
219
  .reg_vendor_id_2    dw ?     ;0x7E
220
221
 
222
 
223
  .set_master_vol     dd ?
224
}
225
226
 
227
{   .pci_cmd	    dd	?
228
    .irq	    dd	?
229
    .glob_cntrl     dd	?
230
    .glob_sta	    dd	?
231
    .codec_io_base  dd	?
232
    .ctrl_io_base   dd	?
233
    .codec_mem_base dd	?
234
    .ctrl_mem_base  dd	?
235
    .codec_id       dd  ?
236
}
237
238
 
239
{  .handle           dd ?
240
   .io_code          dd ?
241
   .input            dd ?
242
   .inp_size         dd ?
243
   .output           dd ?
244
   .out_size         dd ?
245
}
246
247
 
248
  IOCTL IOCTL
249
end virtual
250
251
 
252
253
 
419 serge 254
SLOT_BASE       equ OS_BASE+0x0080000
413 serge 255
new_app_base    equ 0
419 serge 256
381 serge 257
 
258
public service_proc
259
public version
413 serge 260
381 serge 261
 
262
263
 
413 serge 264
265
 
266
           jne .stop
267
268
 
381 serge 269
           mov esi, msgDetect
413 serge 270
           call SysMsgBoardStr
381 serge 271
     end if
272
273
 
413 serge 274
           test eax, eax
275
           jz .fail
381 serge 276
277
 
278
           mov esi,[ctrl.vendor_ids]
413 serge 279
           call SysMsgBoardStr
381 serge 280
           mov   esi, [ctrl.ctrl_ids]
413 serge 281
           call SysMsgBoardStr
381 serge 282
283
 
284
           call init_controller
285
           test eax, eax
286
           jz .fail
287
288
 
413 serge 289
290
 
381 serge 291
           mov esi, msgInitCodec
292
           call SysMsgBoardStr
293
     end if
294
295
 
296
           test eax, eax
297
           jz .fail
298
299
 
300
           mov esi, [codec.ac_vendor_ids]
413 serge 301
           call SysMsgBoardStr
381 serge 302
303
 
413 serge 304
           call SysMsgBoardStr
381 serge 305
     end if
306
307
 
308
           call setup_codec
309
310
 
311
           call SysMsgBoardStr
312
313
 
314
315
 
316
           mov ebx, [ctrl.int_line]
317
           mov esi, msgInvIRQ
318
           bt eax, ebx
319
           jnc .fail
320
           mov eax, ATTCH_IRQ
321
           mov esi, msgAttchIRQ
322
           bt eax, ebx
323
           jnc .fail
324
325
 
326
           stdcall RegService, sz_sound_srv, service_proc
327
	   ret
328
.fail:
329
     if DEBUG
330
           mov esi, msgFail
413 serge 331
           call SysMsgBoardStr
381 serge 332
     end if
333
           xor eax, eax
413 serge 334
           ret
381 serge 335
.stop:
413 serge 336
           call stop
337
           xor eax, eax
338
           ret
339
endp
340
381 serge 341
 
342
io_code    equ  IOCTL.io_code
343
input      equ  IOCTL.input
344
inp_size   equ  IOCTL.inp_size
345
output     equ  IOCTL.output
346
out_size   equ  IOCTL.out_size
347
348
 
349
proc service_proc stdcall, ioctl:dword
350
351
 
352
           mov eax, [edi+io_code]
353
           cmp eax, DEV_PLAY
413 serge 354
           jne @F
355
     if DEBUG
381 serge 356
           mov esi, msgPlay
413 serge 357
           call SysMsgBoardStr
381 serge 358
     end if
359
           call play
413 serge 360
           ret
361
@@:
381 serge 362
           cmp eax, DEV_STOP
413 serge 363
           jne @F
364
     if DEBUG
381 serge 365
           mov esi, msgStop
413 serge 366
           call SysMsgBoardStr
381 serge 367
     end if
368
           call stop
413 serge 369
           ret
370
@@:
381 serge 371
           cmp eax, DEV_CALLBACK
413 serge 372
           jne @F
373
           mov ebx, [edi+input]
381 serge 374
           stdcall set_callback, [ebx]
375
           ret
413 serge 376
@@:
381 serge 377
           cmp eax, DEV_SET_MASTERVOL
413 serge 378
           jne @F
379
           mov eax, [edi+input]
380
           mov eax, [eax]
381
           call set_master_vol      ;eax= vol
382
           ret
383
@@:
381 serge 384
           cmp eax, DEV_GET_MASTERVOL
413 serge 385
           jne @F
386
           mov ebx, [edi+output]
381 serge 387
           stdcall get_master_vol, ebx
388
           ret
413 serge 389
;@@:
390
;           cmp eax, DEV_GET_INFO
391
;           jne @F
392
;           mov ebx, [edi+output]
393
;           stdcall get_dev_info, ebx
394
;           ret
395
@@:
381 serge 396
.fail:
397
           or eax, -1
413 serge 398
           ret
399
endp
381 serge 400
401
 
402
restore   io_code
403
restore   input
404
restore   inp_size
405
restore   output
406
restore   out_size
407
408
 
409
 
410
proc ac97_irq
411
412
 
413
;           mov esi, msgIRQ
414
;           call SysMsgBoardStr
415
;     end if
416
417
 
418
 
413 serge 419
           je @f
420
381 serge 421
 
413 serge 422
@@:
381 serge 423
           ret
413 serge 424
381 serge 425
 
426
           mov edx, PCM_OUT_CR_REG
413 serge 427
           mov ax, 0x11               ;0x1D
428
           call [ctrl.ctrl_write8]
429
           ret
430
endp
381 serge 431
432
 
433
proc create_primary_buff
434
435
 
436
           mov [ctrl.buffer], eax
413 serge 437
381 serge 438
 
413 serge 439
           mov ecx, 0x10000/4
440
           xor eax, eax
441
           cld
381 serge 442
           rep stosd
413 serge 443
381 serge 444
 
413 serge 445
           call GetPgAddr
446
381 serge 447
 
413 serge 448
           mov ecx, 4
449
           mov edi, pcmout_bdl
450
@@:
381 serge 451
           mov [edi], eax
413 serge 452
           mov [edi+4], ebx
453
381 serge 454
 
413 serge 455
           mov [edi+4+32], ebx
456
381 serge 457
 
413 serge 458
           mov [edi+4+64], ebx
459
381 serge 460
 
413 serge 461
           mov [edi+4+96], ebx
462
381 serge 463
 
413 serge 464
           mov [edi+4+128], ebx
465
381 serge 466
 
413 serge 467
           mov [edi+4+160], ebx
468
381 serge 469
 
413 serge 470
           mov [edi+4+192], ebx
471
381 serge 472
 
413 serge 473
           mov [edi+4+224], ebx
474
381 serge 475
 
413 serge 476
           add edi, 8
477
           loop @B
478
381 serge 479
 
413 serge 480
           mov eax, [ctrl.buffer]
481
           mov ecx, 4
482
@@:
381 serge 483
           mov [edi], eax
413 serge 484
           mov [edi+16], eax
485
           mov [edi+32], eax
486
           mov [edi+48], eax
487
           mov [edi+64], eax
488
           mov [edi+80], eax
489
           mov [edi+96], eax
490
           mov [edi+112], eax
491
381 serge 492
 
413 serge 493
           add edi, 4
494
           loop @B
495
381 serge 496
 
413 serge 497
           mov ebx, eax
498
           call GetPgAddr     ;eax
499
           and ebx, 0xFFF
500
           add eax, ebx
501
381 serge 502
 
413 serge 503
           call [ctrl.ctrl_write32]
504
381 serge 505
 
413 serge 506
           mov [ctrl.lvi_reg], eax
507
           mov edx, PCM_OUT_LVI_REG
508
           call [ctrl.ctrl_write8]
509
           ret
510
endp
381 serge 511
512
 
513
proc detect_controller
514
         locals
413 serge 515
           last_bus dd ?
516
           bus      dd ?
517
           devfn    dd ?
518
         endl
519
381 serge 520
 
413 serge 521
           mov [bus], eax
522
           inc eax
523
           call PciApi
381 serge 524
           cmp eax, -1
413 serge 525
           je .err
526
381 serge 527
 
413 serge 528
381 serge 529
 
530
           and [devfn], 0
413 serge 531
.next_dev:
381 serge 532
           stdcall PciRead32, [bus], [devfn], dword 0
533
           test eax, eax
413 serge 534
           jz .next
535
           cmp eax, -1
536
           je .next
537
381 serge 538
 
413 serge 539
@@:
381 serge 540
           mov ebx, [edi]
413 serge 541
           test ebx, ebx
542
           jz .next
543
381 serge 544
 
413 serge 545
           je .found
546
           add edi, 12
547
           jmp @B
548
381 serge 549
 
413 serge 550
           inc [devfn]
551
           cmp [devfn], 256
552
           jb  .next_dev
553
           mov eax, [bus]
554
           inc eax
555
           mov [bus], eax
556
           cmp eax, [last_bus]
557
           jna .next_bus
558
           xor eax, eax
559
           ret
560
.found:
381 serge 561
           mov ebx, [bus]
413 serge 562
           mov [ctrl.bus], ebx
563
381 serge 564
 
413 serge 565
           mov [ctrl.devfn], ecx
566
381 serge 567
 
413 serge 568
           and edx, 0xFFFF
569
           mov [ctrl.vendor], edx
570
           shr eax, 16
571
           mov [ctrl.dev_id], eax
572
381 serge 573
 
413 serge 574
           mov [ctrl.ctrl_ids], ebx
575
           mov esi, [edi+8]
576
           mov [ctrl.ctrl_setup], esi
577
381 serge 578
 
579
           jne @F
580
           mov [ctrl.vendor_ids], msgEnsoniq
581
           ret
582
@@:
583
           mov [ctrl.vendor_ids], 0     ;something  wrong ?
584
           ret
413 serge 585
.err:
381 serge 586
           xor eax, eax
413 serge 587
           ret
588
endp
381 serge 589
590
 
591
proc init_controller
413 serge 592
381 serge 593
 
413 serge 594
           call SysMsgBoardStr
595
381 serge 596
 
413 serge 597
           mov ebx, eax
598
           and eax, 0xFFFF
599
           mov [ctrl.pci_cmd], eax
600
           shr ebx, 16
601
           mov [ctrl.pci_stat], ebx
602
381 serge 603
 
413 serge 604
           call SysMsgBoardStr
605
381 serge 606
 
413 serge 607
           call SysMsgBoardStr
608
381 serge 609
 
610
;           and eax, -16
413 serge 611
           mov [ctrl.ctrl_io_base], eax
612
381 serge 613
 
413 serge 614
           call SysMsgBoardStr
615
381 serge 616
 
413 serge 617
           call SysMsgBoardStr
618
381 serge 619
 
620
           and eax, 0xFF
413 serge 621
           mov [ctrl.int_line], eax
622
381 serge 623
 
413 serge 624
           call SysMsgBoardStr
625
381 serge 626
 
413 serge 627
           xor eax, eax
628
           inc eax
629
           ret
630
endp
381 serge 631
632
 
633
proc set_ICH
634
           mov [ctrl.codec_read16],  codec_io_r16    ;virtual
413 serge 635
           mov [ctrl.codec_write16], codec_io_w16    ;virtual
636
381 serge 637
 
413 serge 638
           mov [ctrl.ctrl_read16],  ctrl_io_r16      ;virtual
639
           mov [ctrl.ctrl_read32],  ctrl_io_r32      ;virtual
640
381 serge 641
 
413 serge 642
           mov [ctrl.ctrl_write16], ctrl_io_w16      ;virtual
643
           mov [ctrl.ctrl_write32], ctrl_io_w32      ;virtual
644
           ret
645
endp
381 serge 646
647
 
648
proc reset_controller
413 serge 649
381 serge 650
 
413 serge 651
           mov edx, PCM_IN_CR_REG
652
           call [ctrl.ctrl_write8]
653
381 serge 654
 
413 serge 655
           call [ctrl.ctrl_write8]
656
381 serge 657
 
413 serge 658
           call [ctrl.ctrl_write8]
659
660
 
661
           mov edx, PCM_IN_CR_REG
662
           call [ctrl.ctrl_write8]
663
664
 
665
           call [ctrl.ctrl_write8]
666
667
 
668
           call [ctrl.ctrl_write8]
669
           ret
670
endp
381 serge 671
672
 
673
proc init_codec
413 serge 674
         locals
675
           counter dd ?
676
         endl
677
381 serge 678
 
413 serge 679
           call SysMsgBoardStr
680
381 serge 681
 
413 serge 682
           call [ctrl.ctrl_read32]
683
           call dword2str
684
           call SysMsgBoardStr
685
381 serge 686
 
413 serge 687
           call SysMsgBoardStr
688
381 serge 689
 
413 serge 690
           call [ctrl.ctrl_read32]
691
381 serge 692
 
413 serge 693
           call SysMsgBoardStr
694
381 serge 695
 
413 serge 696
           jnz .ready
697
381 serge 698
 
413 serge 699
           and eax, eax
700
           jz .err
701
381 serge 702
 
413 serge 703
           call [ctrl.codec_write16]
704
381 serge 705
 
413 serge 706
           mov edx, CODEC_REG_POWERDOWN
707
           call [ctrl.codec_write16]
708
381 serge 709
 
413 serge 710
.wait:
381 serge 711
           mov edx, CODEC_REG_POWERDOWN
413 serge 712
           call [ctrl.codec_read16]
713
           and eax, 0x0F
714
           cmp eax, 0x0F
715
           jz .ready
716
381 serge 717
 
413 serge 718
           call StallExec
719
           sub [counter] , 1
720
           jnz .wait
721
.err:
381 serge 722
           xor eax, eax        ; timeout error
413 serge 723
           ret
724
.ready:
381 serge 725
           call detect_codec
413 serge 726
381 serge 727
 
413 serge 728
           inc eax
729
           ret
730
endp
381 serge 731
732
 
733
proc reset_codec
734
           mov edx, GLOB_CTRL
413 serge 735
           call [ctrl.ctrl_read32]
736
381 serge 737
 
738
           jz .cold
739
740
 
741
           jnc .ok
742
.cold:
743
           call cold_reset
413 serge 744
           jnc .ok
745
381 serge 746
 
747
           mov esi, msgCFail
413 serge 748
           call SysMsgBoardStr
381 serge 749
     end if
750
           xor eax, eax     ; timeout error
413 serge 751
           ret
752
.ok:
381 serge 753
     if DEBUG
754
           mov esi, msgResetOk
755
           call SysMsgBoardStr
756
     end if
757
758
 
759
           inc eax
413 serge 760
           ret
761
endp
381 serge 762
763
 
764
proc warm_reset
765
	   locals
766
	     counter dd ?
767
	   endl
768
769
 
770
	   mov edx, GLOB_CTRL
771
	   call [ctrl.ctrl_write32]
772
773
 
774
	   mov esi, msgWarm
775
           call SysMsgBoardStr
776
     end if
777
778
 
779
.wait:
780
	   mov eax, 100000	   ; wait 100 ms
781
	   call StallExec
782
783
 
784
	   call [ctrl.ctrl_read32]
785
	   test eax, 4
786
	   jz .ok
787
	   sub [counter], 1
788
	   jnz .wait
789
790
 
791
	   mov esi, msgWRFail
792
           call SysMsgBoardStr
793
     end if
794
795
 
796
	   ret
797
.ok:
798
	   mov edx, CTRL_STAT
799
	   call [ctrl.ctrl_read32]
800
	   and eax, CTRL_ST_CREADY
801
           jz .fail
802
           clc
803
	   ret
804
.fail:
805
           stc
806
	   ret
807
endp
808
809
 
810
proc cold_reset
811
	   locals
812
	     counter dd ?
813
	   endl
814
815
 
816
	   mov edx, GLOB_CTRL
817
	   call [ctrl.ctrl_write32]
818
819
 
820
	   mov esi, msgCold
821
           call SysMsgBoardStr
822
     end if
823
824
 
825
	   call StallExec
826
827
 
828
	   mov edx, GLOB_CTRL
829
	   call [ctrl.ctrl_write32]
830
831
 
832
.wait:
833
	   mov eax, 100000	   ; wait 100 ms
834
	   call StallExec
835
836
 
837
	   call [ctrl.ctrl_read32]
838
	   test eax, 4
839
	   jz .ok
840
	   sub [counter], 1
841
	   jnz .wait
842
843
 
844
	   mov esi, msgCRFail
845
           call SysMsgBoardStr
846
     end if
847
	   stc
848
	   ret
849
.ok:
850
	   mov edx, CTRL_STAT
851
	   call [ctrl.ctrl_read32]
852
	   and eax, CTRL_ST_CREADY
853
           jz .fail
854
           clc
855
	   ret
856
.fail:
857
           stc
858
	   ret
859
endp
860
861
 
862
play:
413 serge 863
           mov eax, 16
864
           mov [ctrl.lvi_reg], eax
865
           mov edx, PCM_OUT_LVI_REG
866
           call [ctrl.ctrl_write8]
867
381 serge 868
 
413 serge 869
           mov ax, 0x1D
870
           call [ctrl.ctrl_write8]
871
           xor eax, eax
872
           ret
873
381 serge 874
 
875
stop:
413 serge 876
           mov edx, PCM_OUT_CR_REG
877
           mov ax, 0x0
878
           call [ctrl.ctrl_write8]
879
381 serge 880
 
413 serge 881
           mov edx, PCM_OUT_SR_REG
882
           call [ctrl.ctrl_write16]
883
           xor eax, eax
884
	   ret
381 serge 885
886
 
887
proc get_dev_info stdcall, p_info:dword
888
	   virtual at esi
889
	     CTRL_INFO CTRL_INFO
890
	   end virtual
891
892
 
893
	   mov eax, [ctrl.int_line]
894
	   mov ebx, [ctrl.codec_io_base]
895
	   mov ecx, [ctrl.ctrl_io_base]
896
	   mov edx, [ctrl.codec_mem_base]
897
	   mov edi, [ctrl.ctrl_mem_base]
898
899
 
900
	   mov [CTRL_INFO.codec_io_base], ebx
901
	   mov [CTRL_INFO.ctrl_io_base], ecx
902
	   mov [CTRL_INFO.codec_mem_base], edx
903
	   mov [CTRL_INFO.ctrl_mem_base], edi
904
905
 
906
           mov [CTRL_INFO.codec_id], eax
907
908
 
909
           call [ctrl.ctrl_read32]
910
	   mov [CTRL_INFO.glob_cntrl], eax
911
912
 
913
           call [ctrl.ctrl_read32]
914
	   mov [CTRL_INFO.glob_sta], eax
915
916
 
917
	   mov [CTRL_INFO.pci_cmd], ebx
918
	   ret
919
endp
920
921
 
922
proc set_callback stdcall, handler:dword
923
	   mov eax, [handler]
924
	   mov [ctrl.user_callback], eax
925
	   ret
926
endp
927
928
 
929
proc codec_read stdcall, ac_reg:dword	   ; reg = edx, reval = eax
930
931
 
932
933
 
934
	   shr ebx, 1
935
	   bt [codec.shadow_flag], ebx
936
	   jc .use_shadow
937
938
 
939
	   mov ecx, eax
940
941
 
942
	   call [ctrl.ctrl_read32]
943
	   test eax, CTRL_ST_RCS
944
	   jz .read_ok
945
946
 
947
	   call [ctrl.ctrl_write32]
948
	   xor eax,eax
949
	   not eax		;timeout
950
	   ret
951
.read_ok:
952
	   mov edx, [ac_reg]
953
	   mov [codec.regs+edx], cx
954
	   bts [codec.shadow_flag], ebx
955
	   mov eax, ecx
956
	   ret
957
.use_shadow:
958
	   movzx eax, word [codec.regs+edx]
959
	   ret
960
endp
961
962
 
963
proc codec_write stdcall, ac_reg:dword
964
	   push eax
965
	   call check_semafore
966
	   and eax, eax
967
	   jz .err
968
	   pop eax
969
970
 
971
	   mov edx, esi
972
	   call [ctrl.codec_write16]
973
	   mov [codec.regs+esi], ax
974
	   shr esi, 1
975
	   bts [codec.shadow_flag], esi
976
	   ret
977
.err:
978
	   pop eax
979
	   ret
980
endp
981
982
 
983
proc codec_check_ready
984
985
 
413 serge 986
           call [ctrl.ctrl_read32]
987
           and eax, CTRL_ST_CREADY
988
           jz .not_ready
989
381 serge 990
 
413 serge 991
           inc eax
992
           ret
993
.not_ready:
381 serge 994
           xor eax, eax
413 serge 995
           ret
996
endp
381 serge 997
998
 
999
proc check_semafore
1000
	   local counter:DWORD
1001
1002
 
1003
.l1:
1004
	   mov edx, CTRL_CAS
1005
	   call [ctrl.ctrl_read8]
1006
	   and eax, CAS_FLAG
1007
	   jz .ok
1008
1009
 
1010
	   call StallExec
1011
	   sub [counter], 1
1012
	   jnz .l1
1013
	   xor eax, eax
1014
	   ret
1015
align 4
1016
.ok:
1017
	   xor eax,eax
1018
	   inc eax
1019
	   ret
1020
endp
1021
1022
 
1023
proc StallExec
1024
	   push ecx
1025
	   push edx
1026
	   push ebx
1027
	   push eax
1028
1029
 
1030
	   mul ecx
1031
	   mov ebx, eax       ;low
1032
	   mov ecx, edx       ;high
1033
	   rdtsc
1034
	   add ebx, eax
1035
	   adc ecx,edx
1036
@@:
1037
	   rdtsc
1038
	   sub eax, ebx
1039
	   sbb edx, ecx
1040
           js @B
413 serge 1041
381 serge 1042
 
1043
	   pop ebx
1044
	   pop edx
1045
	   pop ecx
1046
	   ret
1047
endp
1048
1049
 
1050
;          CONTROLLER IO functions
1051
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1052
1053
 
1054
codec_io_r16:
413 serge 1055
           add edx, [ctrl.codec_io_base]
1056
           in  ax, dx
1057
           ret
1058
381 serge 1059
 
1060
codec_io_w16:
413 serge 1061
           add edx, [ctrl.codec_io_base]
1062
           out dx, ax
1063
           ret
1064
381 serge 1065
 
1066
ctrl_io_r8:
413 serge 1067
           add edx, [ctrl.ctrl_io_base]
1068
           in  al, dx
1069
           ret
1070
381 serge 1071
 
1072
ctrl_io_r16:
413 serge 1073
          add edx, [ctrl.ctrl_io_base]
1074
          in  ax, dx
1075
          ret
1076
381 serge 1077
 
1078
ctrl_io_r32:
413 serge 1079
          add edx, [ctrl.ctrl_io_base]
1080
          in  eax, dx
1081
          ret
1082
381 serge 1083
 
1084
ctrl_io_w8:
413 serge 1085
          add edx, [ctrl.ctrl_io_base]
1086
          out dx, al
1087
          ret
1088
381 serge 1089
 
1090
ctrl_io_w16:
413 serge 1091
          add edx, [ctrl.ctrl_io_base]
1092
          out dx, ax
1093
          ret
1094
381 serge 1095
 
1096
ctrl_io_w32:
413 serge 1097
          add edx, [ctrl.ctrl_io_base]
1098
          out dx, eax
1099
          ret
1100
381 serge 1101
 
1102
 
1103
dword2str:
413 serge 1104
          mov  esi, hex_buff
1105
          mov ecx, -8
1106
@@:
1107
          rol eax, 4
1108
          mov ebx, eax
1109
          and ebx, 0x0F
1110
          mov bl, [ebx+hexletters]
1111
          mov [8+esi+ecx], bl
1112
          inc ecx
1113
          jnz @B
1114
          ret
1115
381 serge 1116
 
413 serge 1117
hex_buff     db 8 dup(0),13,10,0
1118
381 serge 1119
 
1120
 
1121
1122
 
1123
devices dd (0x5000 shl 16)+0x1274,msgEnsoniq,set_ICH
413 serge 1124
        dd (0x5880 shl 16)+0x1274,msgVibra128,set_ICH
1125
        dd 0    ;terminator
381 serge 1126
1127
 
413 serge 1128
381 serge 1129
 
413 serge 1130
msgVibra128  db 'Sound Blaster AudioPCI Vibra 128',13,10,0
1131
381 serge 1132
 
413 serge 1133
381 serge 1134
 
413 serge 1135
msgFail      db 'device not found',13,10,0
381 serge 1136
msgAttchIRQ  db 'IRQ line not supported', 13,10, 0
1137
msgInvIRQ    db 'IRQ line not assigned or invalid', 13,10, 0
1138
msgPlay      db 'start play', 13,10,0
1139
msgStop      db 'stop play',  13,10,0
1140
msgNotify    db 'call notify',13,10,0
1141
msgIRQ       db 'AC97 IRQ', 13,10,0
413 serge 1142
msgInitCtrl  db 'init controller',13,10,0
381 serge 1143
msgInitCodec db 'init codec',13,10,0
1144
msgPrimBuff  db 'create primary buffer',13,10,0
1145
msgReg       db 'set service handler',13,10,0
413 serge 1146
msgOk        db 'service installed',13,10,0
1147
msgCold      db 'cold reset',13,10,0
381 serge 1148
msgWarm      db 'warm reset',13,10,0
1149
msgWRFail    db 'warm reset failed',13,10,0
1150
msgCRFail    db 'cold reset failed',13,10,0
1151
msgCFail     db 'codec not ready',13,10,0
1152
msgResetOk   db 'reset complete',13,10,0
1153
msgStatus    db 'global status   ',0
413 serge 1154
msgControl   db 'global control  ',0
1155
msgPCIcmd    db 'PCI command     ',0
1156
msgIObase    db 'IO base         ',0
1157
msgIRQline   db 'IRQ line        ',0
1158
381 serge 1159
 
1160
1161
 
1162
buff_list        rd 32
1163
1164
 
1165
ctrl AC_CNTRL
1166
1167
 
1168
civ_val  rd 1
1169