Subversion Repositories Kolibri OS

Rev

Rev 579 | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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