Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
31 halyavin 1
 
2
        add     dx, [NAMBAR]
3
        in      al, dx
4
ret
5
6
 
7
 
8
        add     dx, [NAMBAR]
9
        in      ax, dx
10
ret
11
12
 
13
 
14
        add     dx, [NAMBAR]
15
        in      eax, dx
16
ret
17
18
 
19
        add     dx, [NAMBAR]
20
        out     dx, al
21
ret
22
23
 
24
        add     dx, [NAMBAR]
25
        out     dx, ax
26
ret
27
28
 
29
        add     dx, [NAMBAR]
30
        out     dx, eax
31
ret
32
33
 
34
 
35
 
36
        add     dx, [NABMBAR]
37
        in      al, dx
38
ret
39
40
 
41
        add     dx, [NABMBAR]
42
        in      ax, dx
43
ret
44
45
 
46
        add     dx, [NABMBAR]
47
        in      eax, dx
48
ret
49
50
 
51
        add     dx, [NABMBAR]
52
        out     dx, al
53
ret
54
55
 
56
        add     dx, [NABMBAR]
57
        out     dx, ax
58
ret
59
60
 
61
        add     dx, [NABMBAR]
62
        out     dx, eax
63
ret
64
65
 
66
 
67
 
68
        push    ecx edx
69
70
 
71
        call    NABMBAR_read_dword
72
        and     eax, PRI_CODEC_RDY              ; 100h primary codec ready
73
        jz      .success                        ; exit if codec not ready !!!
74
75
 
76
        mov     ecx, 0ffffh                     ; try 65535 times
77
  .wait:
78
        mov     edx, ACC_SEMA_REG               ; 0x34 codec write semaphore
79
        call    NABMBAR_read_byte
80
        and     al, CODEC_BUSY                  ; 01h codec access semaphore
81
        jz      .success                        ; exit if codec not busy !!!
82
83
 
84
        jnz     .wait
85
86
 
87
        mov     eax, 0
88
        jmp     .exit
89
90
 
91
        pop     edx ecx
92
        mov     eax, 1
93
  .exit:
94
ret
95
96
 
97
 
98
 
99
 
100
 
101
        push    eax ebx edx
102
103
 
104
        mov     al, 0                   ; stop all PCM out data
105
        call    NABMBAR_write_byte
106
107
 
108
109
 
110
        mov     al, RR                  ; reset PCM out regs
111
        call    NABMBAR_write_byte
112
113
 
114
115
 
116
ret
117
118
 
119
 
120
 
121
 
122
; in ax = volume level
123
setVolume:
124
        push     eax edx
125
126
 
127
        call     semaphore
128
        mov      edx, CODEC_RESET_REG           ; 0
129
        xor      eax, eax                       ; register reset the codec
130
        call     NAMBAR_write_word
131
132
 
133
        pop      eax
134
        imul     ax, 0101h                      ; set volume for both chn
135
        mov      edx, CODEC_MASTER_VOL_REG      ; 2
136
        call     NAMBAR_write_word
137
        push     eax
138
139
 
140
        pop      eax                            ; set volume for both chn
141
        mov      edx, CODEC_HP_VOL_REG          ; 4
142
        call     NAMBAR_write_word
143
        push     eax
144
145
 
146
        mov      edx, CODEC_CD_VOL_REG          ; 12h
147
        pop      eax                            ; set volume for both chn
148
        shr      eax, 2                         ; adjust CD VOL
149
        call     NAMBAR_write_word
150
151
 
152
        mov      edx, CODEC_PCM_OUT_REG         ; 18h
153
        mov      ax, 0808h                      ; standard PCM out volume
154
        call     NAMBAR_write_word
155
156
 
157
ret
158
159
 
160
 
161
 
162
 
163
164
 
165
 
166
 
167
; in : ax = desired sample rate
168
; out: ax = true or false
169
;
170
codecConfig:
171
        pushad
172
        mov [samplerate], ax                    ; save sample rate
173
174
 
175
 
176
;        call    NABMBAR_read_dword
177
;        and     eax, PRI_CODEC_RDY              ; 0100h primary codec ready
178
;        jnz     skip_init                       ; skip init if codec ready !!!
179
180
 
181
;;;        call    codecStop
182
183
 
184
;        call    NABMBAR_read_dword
185
;        dps     "GLOB_STA = "
186
;        dph     eax
187
;        newline
188
189
 
190
;        call    NABMBAR_read_dword
191
;        dps     "GLOB_CNT = "
192
;        dph     eax
193
;        newline
194
195
 
196
197
 
198
;;        jnz     .skip_cold_reset
199
200
 
201
        ; do a cold reset
202
        mov     edx, GLOB_CNT_REG               ; 2ch global control register
203
        xor     eax, eax
204
        call    NABMBAR_write_dword             ; enable (AC Link off clear)
205
206
 
207
        mcall   5, 5
208
;        print   "alive!"
209
210
 
211
212
 
213
        mov     eax, ACCOLD_RESET + PRI_RES_EN  ; cold reset + primary resume
214
        call    NABMBAR_write_dword             ; 2 channels & 16 bit samples
215
216
 
217
        call    NABMBAR_read_dword
218
        and     eax, ACCOLD_RESET               ; cold reset
219
        jz      init_error                      ; INIT FAILED !!!
220
221
 
222
223
 
224
        mov     ecx, 128
225
codec_ready_loop:
226
        mov     edx, GLOB_STS_REG               ; 30h global status register
227
        call    NABMBAR_read_dword
228
        and     eax, PRI_CODEC_RDY              ; 0100h primary codec ready
229
        jnz     codec_ready_exit                ; move on if codec ready !!!
230
        mcall   5, 1
231
        dec     ecx
232
        jnz     codec_ready_loop
233
        ;dps "~"
234
codec_ready_exit:
235
236
 
237
        mcall  5, 60
238
239
 
240
        mov     edx, GLOB_STS_REG               ; 30h global status register
241
        call    NABMBAR_read_dword
242
        and     eax, PRI_CODEC_RDY              ; 0100h primary codec ready
243
        jnz     codec_ready_bit_set             ; move on if codec ready !!!
244
        cmp     [AC97ICH4], 1
245
        jne     init_error
246
;       je      codec_ready_bit_set             ; ignore codec ready for ICH4
247
;       jmp     init_error                      ; codec ready bit not set !!!
248
codec_ready_bit_set:
249
250
 
251
        mov     edx, CODEC_RESET_REG            ; 0h codec reset register
252
        call    NAMBAR_read_word
253
254
 
255
 
256
        call    semaphore
257
        test    eax, eax
258
        jz      init_error
259
        mov     edx, CODEC_POWER_CTRL_REG       ; 26h codec powerdown ctrl
260
        call    NAMBAR_read_word
261
        and     eax, 01111b
262
        cmp     eax, 01111b
263
        jne     init_error                      ; codec sections not ready
264
265
 
266
 
267
 
268
        mov     al, 0
269
270
 
271
        call    NABMBAR_write_byte
272
273
 
274
        call    NABMBAR_write_byte
275
276
 
277
        call    NABMBAR_write_byte
278
279
 
280
        mov     al, RR                          ; 02h reset Bus master regs
281
282
 
283
        call    NABMBAR_write_byte
284
285
 
286
        call    NABMBAR_write_byte
287
288
 
289
        call    NABMBAR_write_byte
290
291
 
292
        mov     eax, 15                         ; set average volume level
293
        call    setVolume
294
295
 
296
        call    semaphore
297
        test    eax, eax
298
        jz      init_error
299
        mov     edx, CODEC_EXT_AUDIO_CTRL_REG   ; register 2ah
300
        call    NAMBAR_read_word                ; get ext audio ctl
301
302
 
303
        call    semaphore
304
        test    eax, eax
305
        jz      init_error
306
        mov     eax, ebx
307
        and     eax, 0FFFFh - BIT1              ; clear DRA (BIT1)
308
        or      eax, BIT0                       ; set VRA (BIT0)
309
        mov     edx, CODEC_EXT_AUDIO_CTRL_REG   ; register 2ah
310
        call    NAMBAR_write_word               ; write ext audio ctl
311
312
 
313
skip_init:
314
        call    semaphore
315
        test    eax, eax
316
        jz      init_error
317
318
 
319
       ; call    NAMBAR_read_word
320
       ; and     eax, 0xFFFF
321
       ; newline
322
       ; dps     "old PCM OUT RATE: "
323
       ; dpd     eax
324
       ; newline
325
326
 
327
;        mov     edx, CODEC_PCM_FRONT_DACRATE_REG ; register 2ch
328
;        call    NAMBAR_write_word
329
        call    set_sample_rate
330
331
 
332
        mov    eax, 1                           ; exit with success
333
        jmp    exit_config
334
init_error:
335
        popad
336
        xor    eax, eax                           ; exit with error
337
exit_config:
338
        ret
339
340
 
341
        mov    edx, CODEC_PCM_FRONT_DACRATE_REG ; 0x2C reg
342
        call   NAMBAR_write_word
343
ret
344