16,6 → 16,7 |
DEBUG equ 1 |
|
REMAP_IRQ equ 0 |
IRQ_LINE equ 0 |
|
;irq 0,1,2,8,12,13 íåäîñòóïíû |
; FEDCBA9876543210 |
22,7 → 23,6 |
VALID_IRQ equ 1100111011111000b |
ATTCH_IRQ equ 0000111010101000b |
|
IRQ_LINE equ 0 |
|
CPU_FREQ equ 2600d |
|
282,9 → 282,6 |
|
EVENT_NOTIFY equ 0x00000200 |
|
OS_BASE equ 0x80000000 |
SLOT_BASE equ OS_BASE+0x0080000 |
|
public START |
public service_proc |
public version |
317,23 → 314,15 |
test eax, eax |
jz .fail |
|
if DEBUG |
mov esi, msgInitCodec |
call SysMsgBoardStr |
end if |
; if DEBUG |
; mov esi, msgInitCodec |
; call SysMsgBoardStr |
; end if |
|
call init_codec |
test eax, eax |
jz .fail |
|
if DEBUG |
mov esi, [codec.ac_vendor_ids] |
call SysMsgBoardStr |
|
mov esi, [codec.chip_ids] |
call SysMsgBoardStr |
end if |
|
call reset_controller |
call setup_codec |
|
677,19 → 666,19 |
mov esi, [edi+8] |
mov [ctrl.ctrl_setup], esi |
|
cmp ebx, VID_INTEL |
cmp edx, VID_INTEL |
jne @F |
mov [ctrl.vendor_ids], msg_Intel |
ret |
@@: |
cmp ebx, VID_NVIDIA |
cmp edx, VID_NVIDIA |
jne @F |
mov [ctrl.vendor_ids], msg_NVidia |
ret |
@@: |
mov [ctrl.vendor_ids], 0 ;something wrong ? |
ret |
.err: |
xor eax, eax |
mov [ctrl.vendor_ids], eax ;something wrong ? |
ret |
endp |
|
742,20 → 731,57 |
shr ebx, 16 |
mov [ctrl.pci_stat], ebx |
|
mov esi, msgPciCmd |
call SysMsgBoardStr |
call dword2str |
call SysMsgBoardStr |
|
mov esi, msgPciStat |
call SysMsgBoardStr |
mov eax, [ctrl.pci_stat] |
call dword2str |
call SysMsgBoardStr |
|
mov esi, msgMixIsaIo |
call SysMsgBoardStr |
|
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x10 |
|
call dword2str |
call SysMsgBoardStr |
|
and eax,0xFFFE |
mov [ctrl.codec_io_base], eax |
|
mov esi, msgCtrlIsaIo |
call SysMsgBoardStr |
|
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x14 |
|
call dword2str |
call SysMsgBoardStr |
|
and eax, 0xFFC0 |
mov [ctrl.ctrl_io_base], eax |
|
mov esi, msgMixMMIo |
call SysMsgBoardStr |
|
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x18 |
mov [ctrl.codec_mem_base], eax |
|
call dword2str |
call SysMsgBoardStr |
|
mov esi, msgCtrlMMIo |
call SysMsgBoardStr |
|
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x1C |
mov [ctrl.ctrl_mem_base], eax |
|
call dword2str |
call SysMsgBoardStr |
|
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x3C |
and eax, 0xFF |
mov [ctrl.int_line], eax |
855,17 → 881,21 |
|
mov edx, CTRL_STAT |
call [ctrl.ctrl_read32] |
|
push eax |
call dword2str |
call SysMsgBoardStr |
pop eax |
cmp eax, 0xFFFFFFFF |
je .err |
|
test eax, CTRL_ST_CREADY |
jnz .ready |
|
call reset_codec |
and eax, eax |
test eax, eax |
jz .err |
|
.ready: |
xor edx, edx ;ac_reg_0 |
call [ctrl.codec_write16] |
|
875,20 → 905,21 |
|
mov [counter], 200 ; total 200*5 ms = 1s |
.wait: |
mov eax, 5000 ; wait 5 ms |
call StallExec |
|
mov edx, CODEC_REG_POWERDOWN |
call [ctrl.codec_read16] |
and eax, 0x0F |
cmp eax, 0x0F |
jz .ready |
jz .done |
|
mov eax, 5000 ; wait 5 ms |
call StallExec |
sub [counter] , 1 |
jnz .wait |
.err: |
xor eax, eax ; timeout error |
ret |
.ready: |
.done: |
mov eax, 2 ;force set 16-bit 2-channel PCM |
mov edx, GLOB_CTRL |
call [ctrl.ctrl_write32] |
953,11 → 984,12 |
mov eax, 100000 ; wait 100 ms |
call StallExec |
|
mov edx, GLOB_CTRL |
mov edx, CTRL_STAT |
call [ctrl.ctrl_read32] |
test eax, 4 |
jz .ok |
sub [counter], 1 |
test eax, CTRL_ST_CREADY |
jnz .ok |
|
dec [counter] |
jnz .wait |
|
if DEBUG |
964,19 → 996,12 |
mov esi, msgWRFail |
call SysMsgBoardStr |
end if |
|
.fail: |
stc |
ret |
.ok: |
mov edx, CTRL_STAT |
call [ctrl.ctrl_read32] |
and eax, CTRL_ST_CREADY |
jz .fail |
clc |
ret |
.fail: |
stc |
ret |
endp |
|
align 4 |
985,7 → 1010,7 |
counter dd ? |
endl |
|
xor eax, eax |
mov eax, 0x02 |
mov edx, GLOB_CTRL |
call [ctrl.ctrl_write32] |
|
994,23 → 1019,21 |
call SysMsgBoardStr |
end if |
|
mov eax, 1000000 ; wait 1 s |
mov eax, 400000 ; wait 400 ms |
call StallExec |
|
mov eax, 2 |
mov edx, GLOB_CTRL |
call [ctrl.ctrl_write32] |
mov [counter], 16 ; total 20*100 ms = 2s |
.wait: |
|
mov [counter], 10 ; total 10*100 ms = 1s |
.wait: |
mov edx, CTRL_STAT |
call [ctrl.ctrl_read32] |
test eax, CTRL_ST_CREADY |
jnz .ok |
|
mov eax, 100000 ; wait 100 ms |
call StallExec |
|
mov edx, GLOB_CTRL |
call [ctrl.ctrl_read32] |
test eax, 4 |
jz .ok |
sub [counter], 1 |
dec [counter] |
jnz .wait |
|
if DEBUG |
1017,18 → 1040,33 |
mov esi, msgCRFail |
call SysMsgBoardStr |
end if |
|
.fail: |
stc |
ret |
.ok: |
mov esi, msgControl |
call SysMsgBoardStr |
|
mov edx, GLOB_CTRL |
call [ctrl.ctrl_read32] |
call dword2str |
call SysMsgBoardStr |
|
mov esi, msgStatus |
call SysMsgBoardStr |
|
mov edx, CTRL_STAT |
call [ctrl.ctrl_read32] |
and eax, CTRL_ST_CREADY |
push eax |
call dword2str |
call SysMsgBoardStr |
pop eax |
|
test eax, CTRL_ST_CREADY |
jz .fail |
clc |
ret |
.fail: |
stc |
ret |
endp |
|
align 4 |
1383,15 → 1421,15 |
|
version dd (5 shl 16) or (API_VERSION and 0xFFFF) |
|
msg_ICH db 'Intel ICH', 13,10, 0 |
msg_ICH0 db 'Intel ICH0', 13,10, 0 |
msg_ICH2 db 'Intel ICH2', 13,10, 0 |
msg_ICH3 db 'Intel ICH3', 13,10, 0 |
msg_ICH4 db 'Intel ICH4', 13,10, 0 |
msg_ICH5 db 'Intel ICH5', 13,10, 0 |
msg_ICH6 db 'Intel ICH6', 13,10, 0 |
msg_ICH7 db 'Intel ICH7', 13,10, 0 |
msg_Intel db 'Intel Corp. ', 0 |
msg_ICH db '802801AA (ICH)', 13,10, 0 |
msg_ICH0 db '802801AB (ICH0)', 13,10, 0 |
msg_ICH2 db '802801BA (ICH2)', 13,10, 0 |
msg_ICH3 db '802801CA (ICH3)', 13,10, 0 |
msg_ICH4 db '802801DB (ICH4)', 13,10, 0 |
msg_ICH5 db '802801EB (ICH5)', 13,10, 0 |
msg_ICH6 db '802801FB (ICH6)', 13,10, 0 |
msg_ICH7 db '802801GB (ICH7)', 13,10, 0 |
msg_Intel db 'Intel ', 0 |
|
msg_NForce db 'NForce', 13,10, 0 |
msg_NForce2 db 'NForce 2', 13,10, 0 |
1413,12 → 1451,12 |
msgInvIRQ db 'IRQ line not assigned or invalid', 13,10, 0 |
msgPlay db 'start play', 13,10,0 |
msgStop db 'stop play', 13,10,0 |
msgNotify db 'call notify',13,10,0 |
msgIRQ db 'AC97 IRQ', 13,10,0 |
;msgNotify db 'call notify',13,10,0 |
;msgIRQ db 'AC97 IRQ', 13,10,0 |
msgInitCtrl db 'init controller',13,10,0 |
msgInitCodec db 'init codec',13,10,0 |
;msgInitCodec db 'init codec',13,10,0 |
msgPrimBuff db 'create primary buffer',13,10,0 |
msgReg db 'set service handler',13,10,0 |
;msgReg db 'set service handler',13,10,0 |
msgOk db 'service installed',13,10,0 |
msgCold db 'cold reset',13,10,0 |
msgWarm db 'warm reset',13,10,0 |
1428,6 → 1466,12 |
msgResetOk db 'reset complete',13,10,0 |
msgStatus db 'global status ',0 |
msgControl db 'global control ',0 |
msgPciCmd db 'PCI command ',0 |
msgPciStat db 'PCI status ',0 |
msgCtrlIsaIo db 'controller io base ',0 |
msgMixIsaIo db 'codec io base ',0 |
msgCtrlMMIo db 'controller mmio base ',0 |
msgMixMMIo db 'codec mmio base ',0 |
|
section '.data' data readable writable align 16 |
|