Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

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