forked from KolibriOS/kolibrios
* sound drivers converted to PE
* sound driver selector: revert r5071 and fix the problem properly * sis: integrate changes from drivers/audio/sisnbook, add to autobuild * intelac97: fix clicks during play on VBox * intel_hda: fix problems at shutdown git-svn-id: svn://kolibrios.org@5077 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
4afcb5706b
commit
11bd59473f
@ -127,11 +127,6 @@ FASM_PROGRAMS:=\
|
|||||||
develop/info/html.syn:DEVELOP/INFO/HTML.SYN:$(PROGS)/other/t_edit/info/html_syn.asm \
|
develop/info/html.syn:DEVELOP/INFO/HTML.SYN:$(PROGS)/other/t_edit/info/html_syn.asm \
|
||||||
develop/info/ini_files.syn:DEVELOP/INFO/INI_FILES.SYN:$(PROGS)/other/t_edit/info/ini_files_syn.asm \
|
develop/info/ini_files.syn:DEVELOP/INFO/INI_FILES.SYN:$(PROGS)/other/t_edit/info/ini_files_syn.asm \
|
||||||
develop/info/win_const.syn:DEVELOP/INFO/WIN_CONST.SYN:$(PROGS)/other/t_edit/info/win_const_syn.asm \
|
develop/info/win_const.syn:DEVELOP/INFO/WIN_CONST.SYN:$(PROGS)/other/t_edit/info/win_const_syn.asm \
|
||||||
drivers/emu10k1x.obj:DRIVERS/EMU10K1X.OBJ:$(KERNEL)/drivers/emu10k1x.asm \
|
|
||||||
drivers/fm801.obj:DRIVERS/FM801.OBJ:$(KERNEL)/drivers/fm801.asm \
|
|
||||||
drivers/infinity.obj:DRIVERS/INFINITY.OBJ:$(KERNEL)/drivers/infinity.asm \
|
|
||||||
drivers/intelac97.obj:DRIVERS/INTELAC97.OBJ:$(KERNEL)/drivers/intelac97.asm \
|
|
||||||
drivers/vt823x.obj:DRIVERS/VT823X.OBJ:$(KERNEL)/drivers/vt823x.asm \
|
|
||||||
File|Managers/kfar:File|Managers/KFAR:$(PROGS)/fs/kfar/trunk/kfar.asm \
|
File|Managers/kfar:File|Managers/KFAR:$(PROGS)/fs/kfar/trunk/kfar.asm \
|
||||||
File|Managers/kfm:File|Managers/KFM:$(PROGS)/fs/kfm/trunk/kfm.asm \
|
File|Managers/kfm:File|Managers/KFM:$(PROGS)/fs/kfm/trunk/kfm.asm \
|
||||||
File|Managers/opendial:File|Managers/OPENDIAL:$(PROGS)/fs/opendial/opendial.asm \
|
File|Managers/opendial:File|Managers/OPENDIAL:$(PROGS)/fs/opendial/opendial.asm \
|
||||||
@ -230,6 +225,12 @@ FASM_PROGRAMS_PESTRIP:=\
|
|||||||
drivers/intel_hda.sys:DRIVERS/intel_hda.sys:$(REPOSITORY)/drivers/audio/intel_hda/intel_hda.asm \
|
drivers/intel_hda.sys:DRIVERS/intel_hda.sys:$(REPOSITORY)/drivers/audio/intel_hda/intel_hda.asm \
|
||||||
drivers/sb16.sys:DRIVERS/SB16.SYS:$(REPOSITORY)/drivers/audio/sb16/sb16.asm \
|
drivers/sb16.sys:DRIVERS/SB16.SYS:$(REPOSITORY)/drivers/audio/sb16/sb16.asm \
|
||||||
drivers/sound.sys:DRIVERS/SOUND.SYS:$(REPOSITORY)/drivers/audio/sound.asm \
|
drivers/sound.sys:DRIVERS/SOUND.SYS:$(REPOSITORY)/drivers/audio/sound.asm \
|
||||||
|
drivers/infinity.sys:DRIVERS/INFINITY.SYS:$(REPOSITORY)/drivers/audio/infinity/infinity.asm \
|
||||||
|
drivers/intelac97.sys:DRIVERS/INTELAC97.SYS:$(REPOSITORY)/drivers/audio/intelac97.asm \
|
||||||
|
drivers/emu10k1x.sys:DRIVERS/EMU10K1X.SYS:$(REPOSITORY)/drivers/audio/emu10k1x.asm \
|
||||||
|
drivers/fm801.sys:DRIVERS/FM801.SYS:$(REPOSITORY)/drivers/audio/fm801.asm \
|
||||||
|
drivers/vt823x.sys:DRIVERS/VT823X.SYS:$(REPOSITORY)/drivers/audio/vt823x.asm \
|
||||||
|
drivers/sis.sys:DRIVERS/SIS.SYS:$(REPOSITORY)/drivers/audio/sis.asm \
|
||||||
# end of list
|
# end of list
|
||||||
# The list of all FASM programs with one main FASM file for CD image.
|
# The list of all FASM programs with one main FASM file for CD image.
|
||||||
# Format of an item is exactly the same as in the previous list.
|
# Format of an item is exactly the same as in the previous list.
|
||||||
|
@ -36,7 +36,7 @@ proc detect_codec
|
|||||||
mov eax, [edi+4]
|
mov eax, [edi+4]
|
||||||
mov [codec.ac_vendor_ids], eax
|
mov [codec.ac_vendor_ids], eax
|
||||||
mov esi, eax
|
mov esi, eax
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
stdcall detect_chip, [edi+8]
|
stdcall detect_chip, [edi+8]
|
||||||
|
|
||||||
ret
|
ret
|
||||||
@ -48,10 +48,10 @@ proc detect_codec
|
|||||||
mov [codec.chip_ids], chip_unknown
|
mov [codec.chip_ids], chip_unknown
|
||||||
|
|
||||||
mov esi, chip_unknown
|
mov esi, chip_unknown
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
mov eax, [codec.chip_id]
|
mov eax, [codec.chip_id]
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
|
|
||||||
@ -72,7 +72,7 @@ proc detect_chip stdcall, chip_tab:dword
|
|||||||
mov eax, [edi+4]
|
mov eax, [edi+4]
|
||||||
mov [codec.chip_ids], eax
|
mov [codec.chip_ids], eax
|
||||||
mov esi, eax
|
mov esi, eax
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
ret
|
ret
|
||||||
.next:
|
.next:
|
||||||
add edi, 8
|
add edi, 8
|
||||||
@ -80,10 +80,10 @@ proc detect_chip stdcall, chip_tab:dword
|
|||||||
.unknown:
|
.unknown:
|
||||||
mov [codec.chip_ids], chip_unknown
|
mov [codec.chip_ids], chip_unknown
|
||||||
mov esi, chip_unknown
|
mov esi, chip_unknown
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
mov eax, [codec.chip_id]
|
mov eax, [codec.chip_id]
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
|
|
@ -1,17 +1,15 @@
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;;
|
;; Copyright (C) KolibriOS team 2004-2014. All rights reserved. ;;
|
||||||
;; Distributed under terms of the GNU General Public License ;;
|
;; Distributed under terms of the GNU General Public License ;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
format MS COFF
|
format PE DLL native 0.05
|
||||||
|
entry START
|
||||||
|
|
||||||
DEBUG equ 1
|
DEBUG equ 1
|
||||||
|
|
||||||
include 'proc32.inc'
|
|
||||||
include 'imports.inc'
|
|
||||||
|
|
||||||
API_VERSION equ 0x01000100
|
API_VERSION equ 0x01000100
|
||||||
|
|
||||||
USE_COM_IRQ equ 0 ;make irq 3 and irq 4 available for PCI devices
|
USE_COM_IRQ equ 0 ;make irq 3 and irq 4 available for PCI devices
|
||||||
@ -315,35 +313,23 @@ struc CTRL_INFO
|
|||||||
.codec_id dd ?
|
.codec_id dd ?
|
||||||
}
|
}
|
||||||
|
|
||||||
struc IOCTL
|
|
||||||
{ .handle dd ?
|
|
||||||
.io_code dd ?
|
|
||||||
.input dd ?
|
|
||||||
.inp_size dd ?
|
|
||||||
.output dd ?
|
|
||||||
.out_size dd ?
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual at 0
|
|
||||||
IOCTL IOCTL
|
|
||||||
end virtual
|
|
||||||
|
|
||||||
EVENT_NOTIFY equ 0x00000200
|
EVENT_NOTIFY equ 0x00000200
|
||||||
|
|
||||||
public START
|
section '.flat' code readable writable executable
|
||||||
public service_proc
|
include '../struct.inc'
|
||||||
public version
|
include '../macros.inc'
|
||||||
|
include '../proc32.inc'
|
||||||
|
include '../peimport.inc'
|
||||||
|
|
||||||
section '.flat' code readable align 16
|
|
||||||
|
|
||||||
proc START stdcall, state:dword
|
proc START c uses ebx esi edi, state:dword, cmdline:dword
|
||||||
|
|
||||||
cmp [state], 1
|
cmp [state], 1
|
||||||
jne .stop
|
jne .stop
|
||||||
|
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgInit
|
mov esi, msgInit
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
|
|
||||||
call detect_controller
|
call detect_controller
|
||||||
@ -352,9 +338,9 @@ proc START stdcall, state:dword
|
|||||||
|
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, [ctrl.vendor_ids]
|
mov esi, [ctrl.vendor_ids]
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
mov esi, [ctrl.ctrl_ids]
|
mov esi, [ctrl.ctrl_ids]
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
|
|
||||||
call init_controller
|
call init_controller
|
||||||
@ -368,10 +354,10 @@ proc START stdcall, state:dword
|
|||||||
call setup_codec
|
call setup_codec
|
||||||
|
|
||||||
mov esi, msgPrimBuff
|
mov esi, msgPrimBuff
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
call create_primary_buff
|
call create_primary_buff
|
||||||
mov esi, msgDone
|
mov esi, msgDone
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
if IRQ_REMAP
|
if IRQ_REMAP
|
||||||
pushf
|
pushf
|
||||||
@ -399,7 +385,7 @@ proc START stdcall, state:dword
|
|||||||
mov [ctrl.int_line], IRQ_LINE
|
mov [ctrl.int_line], IRQ_LINE
|
||||||
popf
|
popf
|
||||||
mov esi, msgRemap
|
mov esi, msgRemap
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
|
|
||||||
mov eax, VALID_IRQ
|
mov eax, VALID_IRQ
|
||||||
@ -412,21 +398,21 @@ proc START stdcall, state:dword
|
|||||||
bt eax, ebx
|
bt eax, ebx
|
||||||
jnc .fail_msg
|
jnc .fail_msg
|
||||||
|
|
||||||
stdcall AttachIntHandler, ebx, ac97_irq, dword 0
|
invoke AttachIntHandler, ebx, ac97_irq, dword 0
|
||||||
stdcall create
|
stdcall create
|
||||||
|
|
||||||
.reg:
|
.reg:
|
||||||
stdcall RegService, sz_sound_srv, service_proc
|
invoke RegService, sz_sound_srv, service_proc
|
||||||
ret
|
ret
|
||||||
.fail:
|
.fail:
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgFail
|
mov esi, msgFail
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
ret
|
ret
|
||||||
.fail_msg:
|
.fail_msg:
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
ret
|
ret
|
||||||
.stop:
|
.stop:
|
||||||
@ -462,7 +448,7 @@ proc service_proc stdcall, ioctl:dword
|
|||||||
jne @F
|
jne @F
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgPlay
|
mov esi, msgPlay
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
call play
|
call play
|
||||||
ret
|
ret
|
||||||
@ -471,7 +457,7 @@ proc service_proc stdcall, ioctl:dword
|
|||||||
jne @F
|
jne @F
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgStop
|
mov esi, msgStop
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
call stop
|
call stop
|
||||||
ret
|
ret
|
||||||
@ -543,7 +529,7 @@ endp
|
|||||||
align 4
|
align 4
|
||||||
proc create_primary_buff
|
proc create_primary_buff
|
||||||
|
|
||||||
stdcall KernelAlloc, 0x10000
|
invoke KernelAlloc, 0x10000
|
||||||
mov [ctrl.buffer], eax
|
mov [ctrl.buffer], eax
|
||||||
|
|
||||||
mov edi, eax
|
mov edi, eax
|
||||||
@ -553,7 +539,7 @@ proc create_primary_buff
|
|||||||
rep stosd
|
rep stosd
|
||||||
|
|
||||||
mov eax, [ctrl.buffer]
|
mov eax, [ctrl.buffer]
|
||||||
call GetPgAddr
|
invoke GetPgAddr
|
||||||
|
|
||||||
mov edi, pcmout_bdl
|
mov edi, pcmout_bdl
|
||||||
stosd
|
stosd
|
||||||
@ -565,7 +551,7 @@ proc create_primary_buff
|
|||||||
stosd ;1.]
|
stosd ;1.]
|
||||||
|
|
||||||
mov eax, [ctrl.buffer]
|
mov eax, [ctrl.buffer]
|
||||||
call GetPgAddr
|
invoke GetPgAddr
|
||||||
|
|
||||||
stdcall ptr_write, PLAYBACK_POINTER, 0, 0
|
stdcall ptr_write, PLAYBACK_POINTER, 0, 0
|
||||||
stdcall ptr_write, PLAYBACK_UNKNOWN1, 0, 0
|
stdcall ptr_write, PLAYBACK_UNKNOWN1, 0, 0
|
||||||
@ -574,7 +560,7 @@ proc create_primary_buff
|
|||||||
|
|
||||||
mov eax, pcmout_bdl
|
mov eax, pcmout_bdl
|
||||||
mov ebx, eax
|
mov ebx, eax
|
||||||
call GetPgAddr
|
invoke GetPgAddr
|
||||||
and ebx, 0xFFF
|
and ebx, 0xFFF
|
||||||
add eax, ebx
|
add eax, ebx
|
||||||
|
|
||||||
@ -601,7 +587,7 @@ proc detect_controller
|
|||||||
xor eax, eax
|
xor eax, eax
|
||||||
mov [bus], eax
|
mov [bus], eax
|
||||||
inc eax
|
inc eax
|
||||||
call PciApi
|
invoke PciApi
|
||||||
cmp eax, -1
|
cmp eax, -1
|
||||||
je .err
|
je .err
|
||||||
|
|
||||||
@ -610,7 +596,7 @@ proc detect_controller
|
|||||||
.next_bus:
|
.next_bus:
|
||||||
and [devfn], 0
|
and [devfn], 0
|
||||||
.next_dev:
|
.next_dev:
|
||||||
stdcall PciRead32, [bus], [devfn], dword 0
|
invoke PciRead32, [bus], [devfn], dword 0
|
||||||
test eax, eax
|
test eax, eax
|
||||||
jz .next
|
jz .next
|
||||||
cmp eax, -1
|
cmp eax, -1
|
||||||
@ -670,13 +656,13 @@ endp
|
|||||||
align 4
|
align 4
|
||||||
proc init_controller
|
proc init_controller
|
||||||
|
|
||||||
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x2C
|
invoke PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x2C
|
||||||
mov esi, msgPciSubsys
|
mov esi, msgPciSubsys
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 4
|
invoke PciRead32, [ctrl.bus], [ctrl.devfn], dword 4
|
||||||
mov ebx, eax
|
mov ebx, eax
|
||||||
and eax, 0xFFFF
|
and eax, 0xFFFF
|
||||||
mov [ctrl.pci_cmd], eax
|
mov [ctrl.pci_cmd], eax
|
||||||
@ -684,27 +670,27 @@ proc init_controller
|
|||||||
mov [ctrl.pci_stat], ebx
|
mov [ctrl.pci_stat], ebx
|
||||||
|
|
||||||
mov esi, msgPciCmd
|
mov esi, msgPciCmd
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
mov esi, msgPciStat
|
mov esi, msgPciStat
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
mov eax, [ctrl.pci_stat]
|
mov eax, [ctrl.pci_stat]
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
mov esi, msgCtrlIsaIo
|
mov esi, msgCtrlIsaIo
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x10
|
invoke PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x10
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
and eax, 0xFFC0
|
and eax, 0xFFC0
|
||||||
mov [ctrl.ctrl_io_base], eax
|
mov [ctrl.ctrl_io_base], eax
|
||||||
|
|
||||||
.default:
|
.default:
|
||||||
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x3C
|
invoke PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x3C
|
||||||
and eax, 0xFF
|
and eax, 0xFF
|
||||||
@@:
|
@@:
|
||||||
mov [ctrl.int_line], eax
|
mov [ctrl.int_line], eax
|
||||||
@ -753,7 +739,7 @@ proc reset_codec
|
|||||||
|
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgCold
|
mov esi, msgCold
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
|
|
||||||
mov eax, 100000 ; wait 100 ms ;400000 ; wait 400 ms
|
mov eax, 100000 ; wait 100 ms ;400000 ; wait 400 ms
|
||||||
@ -775,7 +761,7 @@ proc reset_codec
|
|||||||
|
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgCRFail
|
mov esi, msgCRFail
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
|
|
||||||
.fail:
|
.fail:
|
||||||
@ -851,11 +837,11 @@ endp
|
|||||||
|
|
||||||
align 4
|
align 4
|
||||||
proc create stdcall
|
proc create stdcall
|
||||||
stdcall PciRead16, [ctrl.bus], [ctrl.devfn], dword 4
|
invoke PciRead16, [ctrl.bus], [ctrl.devfn], 4
|
||||||
test eax, 4 ; test master bit
|
test eax, 4 ; test master bit
|
||||||
jnz @f
|
jnz @f
|
||||||
or eax, 4
|
or eax, 4
|
||||||
stdcall PciWrite16, [ctrl.bus], [ctrl.devfn], dword 4, eax ; set master bit
|
invoke PciWrite16, [ctrl.bus], [ctrl.devfn], 4, eax ; set master bit
|
||||||
@@:
|
@@:
|
||||||
|
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
@ -1117,8 +1103,6 @@ devices dd (CTRL_CT0200 shl 16)+VID_Creative,msg_CT_EMU10K1X,set_Creative
|
|||||||
dd 0 ;terminator
|
dd 0 ;terminator
|
||||||
|
|
||||||
|
|
||||||
version dd (5 shl 16) or (API_VERSION and 0xFFFF)
|
|
||||||
|
|
||||||
msg_CT_EMU10K1X db 'SB Live! Dell OEM', 13,10, 0
|
msg_CT_EMU10K1X db 'SB Live! Dell OEM', 13,10, 0
|
||||||
msg_Creative db 'Creative ', 0
|
msg_Creative db 'Creative ', 0
|
||||||
|
|
||||||
@ -1157,8 +1141,11 @@ msgCtrlIsaIo db 'controller io base ',0
|
|||||||
;msgMixMMIo db 'codec mmio base ',0
|
;msgMixMMIo db 'codec mmio base ',0
|
||||||
;msgIrqMap db 'AC97 irq map as ',0
|
;msgIrqMap db 'AC97 irq map as ',0
|
||||||
|
|
||||||
section '.data' data readable writable align 16
|
align 4
|
||||||
|
data fixups
|
||||||
|
end data
|
||||||
|
|
||||||
|
align 8
|
||||||
pcmout_bdl rq 32
|
pcmout_bdl rq 32
|
||||||
buff_list rd 32
|
buff_list rd 32
|
||||||
|
|
@ -1,18 +1,16 @@
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;;
|
;; Copyright (C) KolibriOS team 2004-2014. All rights reserved. ;;
|
||||||
;; Distributed under terms of the GNU General Public License ;;
|
;; Distributed under terms of the GNU General Public License ;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
format MS COFF
|
format PE DLL native 0.05
|
||||||
|
entry START
|
||||||
|
|
||||||
DEBUG equ 1
|
DEBUG equ 1
|
||||||
DEBUG_IRQ equ 0
|
DEBUG_IRQ equ 0
|
||||||
|
|
||||||
include 'proc32.inc'
|
|
||||||
include 'imports.inc'
|
|
||||||
|
|
||||||
API_VERSION equ 0x01000100
|
API_VERSION equ 0x01000100
|
||||||
|
|
||||||
USE_COM_IRQ equ 0 ;make irq 3 and irq 4 available for PCI devices
|
USE_COM_IRQ equ 0 ;make irq 3 and irq 4 available for PCI devices
|
||||||
@ -276,28 +274,15 @@ struc CTRL_INFO
|
|||||||
.codec_id dd ?
|
.codec_id dd ?
|
||||||
}
|
}
|
||||||
|
|
||||||
struc IOCTL
|
|
||||||
{ .handle dd ?
|
|
||||||
.io_code dd ?
|
|
||||||
.input dd ?
|
|
||||||
.inp_size dd ?
|
|
||||||
.output dd ?
|
|
||||||
.out_size dd ?
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual at 0
|
|
||||||
IOCTL IOCTL
|
|
||||||
end virtual
|
|
||||||
|
|
||||||
EVENT_NOTIFY equ 0x00000200
|
EVENT_NOTIFY equ 0x00000200
|
||||||
|
|
||||||
public START
|
section '.flat' code readable writable executable
|
||||||
public service_proc
|
include '../struct.inc'
|
||||||
public version
|
include '../macros.inc'
|
||||||
|
include '../proc32.inc'
|
||||||
|
include '../peimport.inc'
|
||||||
|
|
||||||
section '.flat' code readable align 16
|
proc START c uses ebx esi edi, state:dword, cmdline:dword
|
||||||
|
|
||||||
proc START stdcall, state:dword
|
|
||||||
|
|
||||||
cmp [state], 1
|
cmp [state], 1
|
||||||
jne .stop
|
jne .stop
|
||||||
@ -305,9 +290,9 @@ proc START stdcall, state:dword
|
|||||||
if DEBUG
|
if DEBUG
|
||||||
mov eax, START
|
mov eax, START
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
mov esi, msgInit
|
mov esi, msgInit
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
|
|
||||||
call detect_controller
|
call detect_controller
|
||||||
@ -316,9 +301,9 @@ proc START stdcall, state:dword
|
|||||||
|
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, [ctrl.vendor_ids]
|
mov esi, [ctrl.vendor_ids]
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
mov esi, [ctrl.ctrl_ids]
|
mov esi, [ctrl.ctrl_ids]
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
end if
|
end if
|
||||||
|
|
||||||
@ -334,11 +319,11 @@ proc START stdcall, state:dword
|
|||||||
call setup_codec
|
call setup_codec
|
||||||
|
|
||||||
mov esi, msgPrimBuff
|
mov esi, msgPrimBuff
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
call create_primary_buff
|
call create_primary_buff
|
||||||
|
|
||||||
mov esi, msgDone
|
mov esi, msgDone
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
mov eax, VALID_IRQ
|
mov eax, VALID_IRQ
|
||||||
mov ebx, [ctrl.int_line]
|
mov ebx, [ctrl.int_line]
|
||||||
@ -350,20 +335,20 @@ proc START stdcall, state:dword
|
|||||||
bt eax, ebx
|
bt eax, ebx
|
||||||
jnc .fail_msg
|
jnc .fail_msg
|
||||||
|
|
||||||
stdcall AttachIntHandler, ebx, ac97_irq, dword 0
|
invoke AttachIntHandler, ebx, ac97_irq, dword 0
|
||||||
.reg:
|
.reg:
|
||||||
|
|
||||||
stdcall RegService, sz_sound_srv, service_proc
|
invoke RegService, sz_sound_srv, service_proc
|
||||||
ret
|
ret
|
||||||
.fail:
|
.fail:
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgFail
|
mov esi, msgFail
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
ret
|
ret
|
||||||
.fail_msg:
|
.fail_msg:
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
ret
|
ret
|
||||||
.stop:
|
.stop:
|
||||||
@ -400,7 +385,7 @@ proc service_proc stdcall, ioctl:dword
|
|||||||
jne @F
|
jne @F
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgPlay
|
mov esi, msgPlay
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
call play
|
call play
|
||||||
ret
|
ret
|
||||||
@ -409,7 +394,7 @@ proc service_proc stdcall, ioctl:dword
|
|||||||
jne @F
|
jne @F
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgStop
|
mov esi, msgStop
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
call stop
|
call stop
|
||||||
ret
|
ret
|
||||||
@ -485,7 +470,7 @@ proc ac97_irq
|
|||||||
|
|
||||||
if DEBUG_IRQ
|
if DEBUG_IRQ
|
||||||
mov esi, msgIRQ
|
mov esi, msgIRQ
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
|
|
||||||
mov edx, FM_INTSTATUS
|
mov edx, FM_INTSTATUS
|
||||||
@ -508,7 +493,7 @@ endp
|
|||||||
align 4
|
align 4
|
||||||
proc create_primary_buff
|
proc create_primary_buff
|
||||||
|
|
||||||
stdcall KernelAlloc, 0x10000
|
invoke KernelAlloc, 0x10000
|
||||||
mov [ctrl.buffer], eax
|
mov [ctrl.buffer], eax
|
||||||
|
|
||||||
mov edi, eax
|
mov edi, eax
|
||||||
@ -518,7 +503,7 @@ proc create_primary_buff
|
|||||||
rep stosd
|
rep stosd
|
||||||
|
|
||||||
mov eax, [ctrl.buffer]
|
mov eax, [ctrl.buffer]
|
||||||
call GetPgAddr
|
invoke GetPgAddr
|
||||||
mov [buffer_pgaddr], eax
|
mov [buffer_pgaddr], eax
|
||||||
|
|
||||||
ret
|
ret
|
||||||
@ -535,7 +520,7 @@ proc detect_controller
|
|||||||
xor eax, eax
|
xor eax, eax
|
||||||
mov [bus], eax
|
mov [bus], eax
|
||||||
inc eax
|
inc eax
|
||||||
call PciApi
|
invoke PciApi
|
||||||
cmp eax, -1
|
cmp eax, -1
|
||||||
je .err
|
je .err
|
||||||
|
|
||||||
@ -544,14 +529,14 @@ proc detect_controller
|
|||||||
.next_bus:
|
.next_bus:
|
||||||
and [devfn], 0
|
and [devfn], 0
|
||||||
.next_dev:
|
.next_dev:
|
||||||
stdcall PciRead32, [bus], [devfn], dword 0
|
invoke PciRead32, [bus], [devfn], dword 0
|
||||||
test eax, eax
|
test eax, eax
|
||||||
jz .next
|
jz .next
|
||||||
cmp eax, -1
|
cmp eax, -1
|
||||||
je .next
|
je .next
|
||||||
|
|
||||||
push eax
|
push eax
|
||||||
stdcall PciRead32, [bus], [devfn], dword 0x09
|
invoke PciRead32, [bus], [devfn], dword 0x09
|
||||||
and eax, 0xffffff
|
and eax, 0xffffff
|
||||||
cmp eax, 0x060100 ;pci-isa
|
cmp eax, 0x060100 ;pci-isa
|
||||||
jne .no_bridge
|
jne .no_bridge
|
||||||
@ -612,7 +597,7 @@ endp
|
|||||||
align 4
|
align 4
|
||||||
proc init_controller
|
proc init_controller
|
||||||
|
|
||||||
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 4
|
invoke PciRead32, [ctrl.bus], [ctrl.devfn], 4
|
||||||
mov ebx, eax
|
mov ebx, eax
|
||||||
and eax, 0xFFFF
|
and eax, 0xFFFF
|
||||||
mov [ctrl.pci_cmd], eax
|
mov [ctrl.pci_cmd], eax
|
||||||
@ -620,36 +605,36 @@ proc init_controller
|
|||||||
mov [ctrl.pci_stat], ebx
|
mov [ctrl.pci_stat], ebx
|
||||||
|
|
||||||
mov esi, msgPciCmd
|
mov esi, msgPciCmd
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
mov esi, msgPciStat
|
mov esi, msgPciStat
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
mov eax, [ctrl.pci_stat]
|
mov eax, [ctrl.pci_stat]
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
mov esi, msgCtrlIsaIo
|
mov esi, msgCtrlIsaIo
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x10
|
invoke PciRead32, [ctrl.bus], [ctrl.devfn], 0x10
|
||||||
|
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
and eax, 0xFFFE
|
and eax, 0xFFFE
|
||||||
mov [ctrl.ctrl_io_base], eax
|
mov [ctrl.ctrl_io_base], eax
|
||||||
|
|
||||||
mov esi, msgIrqNum
|
mov esi, msgIrqNum
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x3C
|
invoke PciRead32, [ctrl.bus], [ctrl.devfn], 0x3C
|
||||||
and eax, 0xFF
|
and eax, 0xFF
|
||||||
mov [ctrl.int_line], eax
|
mov [ctrl.int_line], eax
|
||||||
|
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
call [ctrl.ctrl_setup]
|
call [ctrl.ctrl_setup]
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
@ -676,7 +661,7 @@ align 4
|
|||||||
proc reset_controller
|
proc reset_controller
|
||||||
|
|
||||||
mov esi, msgInitCtrl
|
mov esi, msgInitCtrl
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
mov edx, FM_CARD_CTL
|
mov edx, FM_CARD_CTL
|
||||||
call [ctrl.ctrl_read8]
|
call [ctrl.ctrl_read8]
|
||||||
@ -719,7 +704,7 @@ align 4
|
|||||||
proc init_codec
|
proc init_codec
|
||||||
|
|
||||||
mov esi, msgInitCodec
|
mov esi, msgInitCodec
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
mov al, FM_CODEC_CMD_READ
|
mov al, FM_CODEC_CMD_READ
|
||||||
mov edx, FM_CODEC_CMD
|
mov edx, FM_CODEC_CMD
|
||||||
@ -1024,8 +1009,6 @@ align 4
|
|||||||
devices dd (CTRL_FM801 shl 16)+VID_FM801, msg_FM801, set_FM
|
devices dd (CTRL_FM801 shl 16)+VID_FM801, msg_FM801, set_FM
|
||||||
dd 0
|
dd 0
|
||||||
|
|
||||||
version dd (5 shl 16) or (API_VERSION and 0xFFFF)
|
|
||||||
|
|
||||||
msg_FM801 db 'FM801 AC97 controller',13,10, 0
|
msg_FM801 db 'FM801 AC97 controller',13,10, 0
|
||||||
msg_FM db 'Forte Media',13,10, 0
|
msg_FM db 'Forte Media',13,10, 0
|
||||||
|
|
||||||
@ -1053,7 +1036,9 @@ msgCtrlIsaIo db 'controller io base ',0
|
|||||||
msgIrqNum db 'IRQ default ',0
|
msgIrqNum db 'IRQ default ',0
|
||||||
;msgIrqMap db 'AC97 irq map as ',0
|
;msgIrqMap db 'AC97 irq map as ',0
|
||||||
|
|
||||||
section '.data' data readable writable align 16
|
align 4
|
||||||
|
data fixups
|
||||||
|
end data
|
||||||
|
|
||||||
codec CODEC
|
codec CODEC
|
||||||
ctrl AC_CNTRL
|
ctrl AC_CNTRL
|
@ -1,6 +1,6 @@
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;; Copyright (C) KolibriOS team 2006-2011. All rights reserved. ;;
|
;; Copyright (C) KolibriOS team 2006-2014. All rights reserved. ;;
|
||||||
;; Distributed under terms of the GNU General Public License ;;
|
;; Distributed under terms of the GNU General Public License ;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
@ -8,16 +8,12 @@
|
|||||||
; Serge 2006-2008
|
; Serge 2006-2008
|
||||||
; email: infinity_sound@mail.ru
|
; email: infinity_sound@mail.ru
|
||||||
|
|
||||||
format MS COFF
|
format PE DLL native 0.05
|
||||||
|
entry START
|
||||||
|
|
||||||
DEBUG equ 1
|
DEBUG equ 1
|
||||||
|
|
||||||
|
|
||||||
include 'proc32.inc'
|
|
||||||
include 'main.inc'
|
|
||||||
include 'imports.inc'
|
|
||||||
|
|
||||||
|
|
||||||
CURRENT_API equ 0x0101 ;1.01
|
CURRENT_API equ 0x0101 ;1.01
|
||||||
COMPATIBLE_API equ 0x0100 ;1.00
|
COMPATIBLE_API equ 0x0100 ;1.00
|
||||||
|
|
||||||
@ -38,10 +34,6 @@ OS_BASE equ 0x80000000
|
|||||||
CAPS_SSE2 equ 26
|
CAPS_SSE2 equ 26
|
||||||
PG_SW equ 0x003
|
PG_SW equ 0x003
|
||||||
|
|
||||||
public START
|
|
||||||
public service_proc
|
|
||||||
public version
|
|
||||||
|
|
||||||
RT_INP_EMPTY equ 0xFF000001
|
RT_INP_EMPTY equ 0xFF000001
|
||||||
RT_OUT_EMPTY equ 0xFF000002
|
RT_OUT_EMPTY equ 0xFF000002
|
||||||
RT_INP_FULL equ 0xFF000003
|
RT_INP_FULL equ 0xFF000003
|
||||||
@ -57,32 +49,26 @@ DEV_STOP equ 2
|
|||||||
DEV_CALLBACK equ 3
|
DEV_CALLBACK equ 3
|
||||||
DEV_GET_POS equ 9
|
DEV_GET_POS equ 9
|
||||||
|
|
||||||
struc IOCTL
|
section '.flat' code readable executable
|
||||||
{ .handle dd ?
|
include '../../struct.inc'
|
||||||
.io_code dd ?
|
include '../../macros.inc'
|
||||||
.input dd ?
|
include '../../proc32.inc'
|
||||||
.inp_size dd ?
|
include 'main.inc'
|
||||||
.output dd ?
|
include '../../peimport.inc'
|
||||||
.out_size dd ?
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual at 0
|
|
||||||
IOCTL IOCTL
|
|
||||||
end virtual
|
|
||||||
|
|
||||||
section '.flat' code readable align 16
|
|
||||||
|
|
||||||
proc START stdcall, state:dword
|
proc START c uses ebx esi edi, state:dword, cmdline:dword
|
||||||
|
|
||||||
cmp [state], 1
|
cmp [state], 1
|
||||||
jne .exit
|
jne .exit
|
||||||
|
|
||||||
stdcall GetService, szSound
|
invoke GetService, szSound
|
||||||
test eax, eax
|
test eax, eax
|
||||||
jz .fail
|
jz .fail
|
||||||
mov [hSound], eax
|
mov [hSound], eax
|
||||||
|
|
||||||
stdcall KernelAlloc, 16*512
|
invoke KernelAlloc, 16*512
|
||||||
test eax, eax
|
test eax, eax
|
||||||
jz .out_of_mem
|
jz .out_of_mem
|
||||||
mov [mix_buff], eax
|
mov [mix_buff], eax
|
||||||
@ -133,12 +119,12 @@ end if
|
|||||||
end if
|
end if
|
||||||
stdcall set_handler, [hSound], new_mix
|
stdcall set_handler, [hSound], new_mix
|
||||||
mov [eng_state], SND_STOP
|
mov [eng_state], SND_STOP
|
||||||
stdcall RegService, szInfinity, service_proc
|
invoke RegService, szInfinity, service_proc
|
||||||
ret
|
ret
|
||||||
.fail:
|
.fail:
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgFail
|
mov esi, msgFail
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
.exit:
|
.exit:
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
@ -147,21 +133,12 @@ end if
|
|||||||
.out_of_mem:
|
.out_of_mem:
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgMem
|
mov esi, msgMem
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
|
|
||||||
handle equ IOCTL.handle
|
|
||||||
io_code equ IOCTL.io_code
|
|
||||||
input equ IOCTL.input
|
|
||||||
inp_size equ IOCTL.inp_size
|
|
||||||
output equ IOCTL.output
|
|
||||||
out_size equ IOCTL.out_size
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
|
|
||||||
srv_calls dd service_proc.srv_getversion ; 0
|
srv_calls dd service_proc.srv_getversion ; 0
|
||||||
@ -189,7 +166,7 @@ srv_calls_end:
|
|||||||
proc service_proc stdcall, ioctl:dword
|
proc service_proc stdcall, ioctl:dword
|
||||||
|
|
||||||
mov edi, [ioctl]
|
mov edi, [ioctl]
|
||||||
mov eax, [edi+io_code]
|
mov eax, [edi+IOCTL.io_code]
|
||||||
|
|
||||||
cmp eax, (srv_calls_end-srv_calls)/4
|
cmp eax, (srv_calls_end-srv_calls)/4
|
||||||
ja .fail
|
ja .fail
|
||||||
@ -200,7 +177,7 @@ proc service_proc stdcall, ioctl:dword
|
|||||||
; cmp [edi+inp_size], 4
|
; cmp [edi+inp_size], 4
|
||||||
; jb .fali
|
; jb .fali
|
||||||
|
|
||||||
mov ebx, [edi+input]
|
mov ebx, [edi+IOCTL.input]
|
||||||
mov edx, [ebx]
|
mov edx, [ebx]
|
||||||
|
|
||||||
cmp [edx+STREAM.magic], 'WAVE'
|
cmp [edx+STREAM.magic], 'WAVE'
|
||||||
@ -219,8 +196,8 @@ proc service_proc stdcall, ioctl:dword
|
|||||||
|
|
||||||
align 4
|
align 4
|
||||||
.srv_getversion:
|
.srv_getversion:
|
||||||
mov eax, [edi+output]
|
mov eax, [edi+IOCTL.output]
|
||||||
cmp [edi+out_size], 4
|
cmp [edi+IOCTL.out_size], 4
|
||||||
jne .fail
|
jne .fail
|
||||||
mov eax, [eax]
|
mov eax, [eax]
|
||||||
mov [eax], dword API_VERSION
|
mov [eax], dword API_VERSION
|
||||||
@ -229,10 +206,10 @@ align 4
|
|||||||
|
|
||||||
align 4
|
align 4
|
||||||
.snd_create_buff:
|
.snd_create_buff:
|
||||||
mov ebx, [edi+input]
|
mov ebx, [edi+IOCTL.input]
|
||||||
stdcall CreateBuffer, [ebx], [ebx+4]
|
stdcall CreateBuffer, [ebx], [ebx+4]
|
||||||
mov edi, [ioctl]
|
mov edi, [ioctl]
|
||||||
mov ecx, [edi+output]
|
mov ecx, [edi+IOCTL.output]
|
||||||
mov ecx, [ecx]
|
mov ecx, [ecx]
|
||||||
mov [ecx], ebx
|
mov [ecx], ebx
|
||||||
ret
|
ret
|
||||||
@ -251,7 +228,7 @@ align 4
|
|||||||
align 4
|
align 4
|
||||||
.snd_getformat:
|
.snd_getformat:
|
||||||
movzx eax, word [edx+STREAM.format]
|
movzx eax, word [edx+STREAM.format]
|
||||||
mov ecx, [edi+output]
|
mov ecx, [edi+IOCTL.output]
|
||||||
mov ecx, [ecx]
|
mov ecx, [ecx]
|
||||||
mov [ecx], eax
|
mov [ecx], eax
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
@ -271,7 +248,7 @@ align 4
|
|||||||
.snd_getpos:
|
.snd_getpos:
|
||||||
stdcall GetBufferPos, edx
|
stdcall GetBufferPos, edx
|
||||||
mov edi, [ioctl]
|
mov edi, [ioctl]
|
||||||
mov ecx, [edi+output]
|
mov ecx, [edi+IOCTL.output]
|
||||||
mov ecx, [ecx]
|
mov ecx, [ecx]
|
||||||
mov [ecx], ebx
|
mov [ecx], ebx
|
||||||
ret
|
ret
|
||||||
@ -305,7 +282,7 @@ align 4
|
|||||||
|
|
||||||
align 4
|
align 4
|
||||||
.snd_getvolume:
|
.snd_getvolume:
|
||||||
mov eax, [edi+output]
|
mov eax, [edi+IOCTL.output]
|
||||||
mov ecx, [eax]
|
mov ecx, [eax]
|
||||||
mov eax, [eax+4]
|
mov eax, [eax+4]
|
||||||
stdcall GetBufferVol, edx, ecx, eax
|
stdcall GetBufferVol, edx, ecx, eax
|
||||||
@ -318,7 +295,7 @@ align 4
|
|||||||
align 4
|
align 4
|
||||||
.snd_getpan:
|
.snd_getpan:
|
||||||
mov eax, [edx+STREAM.pan]
|
mov eax, [edx+STREAM.pan]
|
||||||
mov ebx, [edi+output]
|
mov ebx, [edi+IOCTL.output]
|
||||||
mov ebx, [ebx]
|
mov ebx, [ebx]
|
||||||
mov [ebx], eax
|
mov [ebx], eax
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
@ -327,7 +304,7 @@ align 4
|
|||||||
align 4
|
align 4
|
||||||
.snd_getbuffsize:
|
.snd_getbuffsize:
|
||||||
mov eax, [edx+STREAM.in_size]
|
mov eax, [edx+STREAM.in_size]
|
||||||
mov ecx, [edi+output]
|
mov ecx, [edi+IOCTL.output]
|
||||||
mov ecx, [ecx]
|
mov ecx, [ecx]
|
||||||
mov [ecx], eax
|
mov [ecx], eax
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
@ -339,13 +316,13 @@ align 4
|
|||||||
jz .fail
|
jz .fail
|
||||||
|
|
||||||
mov ebx, [edx+STREAM.in_free]
|
mov ebx, [edx+STREAM.in_free]
|
||||||
mov ecx, [edi+output]
|
mov ecx, [edi+IOCTL.output]
|
||||||
mov [ecx], ebx
|
mov [ecx], ebx
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
ret
|
ret
|
||||||
align 4
|
align 4
|
||||||
.snd_settimebase:
|
.snd_settimebase:
|
||||||
cmp [edi+inp_size], 12
|
cmp [edi+IOCTL.inp_size], 12
|
||||||
jne .fail
|
jne .fail
|
||||||
|
|
||||||
mov eax, [ebx+4]
|
mov eax, [ebx+4]
|
||||||
@ -364,7 +341,7 @@ align 4
|
|||||||
|
|
||||||
align 4
|
align 4
|
||||||
.snd_gettimestamp:
|
.snd_gettimestamp:
|
||||||
cmp [edi+out_size], 8
|
cmp [edi+IOCTL.out_size], 8
|
||||||
jne .fail
|
jne .fail
|
||||||
|
|
||||||
pushfd
|
pushfd
|
||||||
@ -393,7 +370,7 @@ align 4
|
|||||||
push dword [hSound] ;.handle
|
push dword [hSound] ;.handle
|
||||||
mov eax, esp
|
mov eax, esp
|
||||||
|
|
||||||
stdcall ServiceHandler, eax
|
invoke ServiceHandler, eax
|
||||||
add esp, 6*4
|
add esp, 6*4
|
||||||
|
|
||||||
pop edi
|
pop edi
|
||||||
@ -407,7 +384,7 @@ align 4
|
|||||||
|
|
||||||
mov dword [esp], 0 ; clear offset
|
mov dword [esp], 0 ; clear offset
|
||||||
@@:
|
@@:
|
||||||
mov edi, [edi+output]
|
mov edi, [edi+IOCTL.output]
|
||||||
|
|
||||||
emms
|
emms
|
||||||
fild qword [edx+STREAM.time_stamp]
|
fild qword [edx+STREAM.time_stamp]
|
||||||
@ -461,11 +438,11 @@ proc CreateBuffer stdcall, format:dword, size:dword
|
|||||||
jnz .fail
|
jnz .fail
|
||||||
.test_ok:
|
.test_ok:
|
||||||
|
|
||||||
call GetPid
|
invoke GetPid
|
||||||
mov ebx, eax
|
mov ebx, eax
|
||||||
mov eax, STREAM.sizeof
|
mov eax, STREAM.sizeof
|
||||||
|
|
||||||
call CreateObject
|
invoke CreateObject
|
||||||
test eax, eax
|
test eax, eax
|
||||||
jz .fail
|
jz .fail
|
||||||
mov [str], eax
|
mov [str], eax
|
||||||
@ -516,7 +493,7 @@ proc CreateBuffer stdcall, format:dword, size:dword
|
|||||||
shr ebx, 12
|
shr ebx, 12
|
||||||
mov [ring_pages], ebx
|
mov [ring_pages], ebx
|
||||||
|
|
||||||
stdcall CreateRingBuffer, eax, PG_SW
|
invoke CreateRingBuffer, eax, PG_SW
|
||||||
|
|
||||||
mov edi, [str]
|
mov edi, [str]
|
||||||
mov ecx, [ring_size]
|
mov ecx, [ring_size]
|
||||||
@ -536,7 +513,7 @@ proc CreateBuffer stdcall, format:dword, size:dword
|
|||||||
mov ecx, [size]
|
mov ecx, [size]
|
||||||
add ecx, 128 ;resampler required
|
add ecx, 128 ;resampler required
|
||||||
mov [eax+STREAM.in_size], ecx
|
mov [eax+STREAM.in_size], ecx
|
||||||
stdcall KernelAlloc, ecx
|
invoke KernelAlloc, ecx
|
||||||
|
|
||||||
mov edi, [str]
|
mov edi, [str]
|
||||||
mov [edi+STREAM.in_base], eax
|
mov [edi+STREAM.in_base], eax
|
||||||
@ -550,7 +527,7 @@ proc CreateBuffer stdcall, format:dword, size:dword
|
|||||||
mov [edi+STREAM.in_top], eax
|
mov [edi+STREAM.in_top], eax
|
||||||
|
|
||||||
.out_buff:
|
.out_buff:
|
||||||
stdcall AllocKernelSpace, dword 128*1024
|
invoke AllocKernelSpace, dword 128*1024
|
||||||
|
|
||||||
mov edi, [str]
|
mov edi, [str]
|
||||||
xor ebx, ebx
|
xor ebx, ebx
|
||||||
@ -569,19 +546,19 @@ proc CreateBuffer stdcall, format:dword, size:dword
|
|||||||
mov dword [edi+STREAM.time_stamp+4], ebx
|
mov dword [edi+STREAM.time_stamp+4], ebx
|
||||||
mov dword [edi+STREAM.last_ts], ebx
|
mov dword [edi+STREAM.last_ts], ebx
|
||||||
|
|
||||||
stdcall AllocPages, dword 64/4
|
invoke AllocPages, dword 64/4
|
||||||
mov edi, [str]
|
mov edi, [str]
|
||||||
mov ebx, [edi+STREAM.out_base]
|
mov ebx, [edi+STREAM.out_base]
|
||||||
mov ecx, 16
|
mov ecx, 16
|
||||||
or eax, PG_SW
|
or eax, PG_SW
|
||||||
push eax
|
push eax
|
||||||
push ebx
|
push ebx
|
||||||
call CommitPages ;eax, ebx, ecx
|
invoke CommitPages ;eax, ebx, ecx
|
||||||
mov ecx, 16
|
mov ecx, 16
|
||||||
pop ebx
|
pop ebx
|
||||||
pop eax
|
pop eax
|
||||||
add ebx, 64*1024
|
add ebx, 64*1024
|
||||||
call CommitPages ;double mapped
|
invoke CommitPages ;double mapped
|
||||||
|
|
||||||
mov edi, [str]
|
mov edi, [str]
|
||||||
mov ecx, [edi+STREAM.in_top]
|
mov ecx, [edi+STREAM.in_top]
|
||||||
@ -599,7 +576,7 @@ proc CreateBuffer stdcall, format:dword, size:dword
|
|||||||
|
|
||||||
xor esi, esi
|
xor esi, esi
|
||||||
mov ecx, MANUAL_DESTROY
|
mov ecx, MANUAL_DESTROY
|
||||||
call CreateEvent
|
invoke CreateEvent
|
||||||
|
|
||||||
mov ebx, [str]
|
mov ebx, [str]
|
||||||
mov [ebx+STREAM.notify_event], eax
|
mov [ebx+STREAM.notify_event], eax
|
||||||
@ -647,12 +624,12 @@ DestroyBuffer:
|
|||||||
mov [ecx+STREAM.str_fd], ebx
|
mov [ecx+STREAM.str_fd], ebx
|
||||||
popf
|
popf
|
||||||
|
|
||||||
stdcall KernelFree, [eax+STREAM.in_base]
|
invoke KernelFree, [eax+STREAM.in_base]
|
||||||
mov eax, [.handle]
|
mov eax, [.handle]
|
||||||
stdcall KernelFree, [eax+STREAM.out_base]
|
invoke KernelFree, [eax+STREAM.out_base]
|
||||||
|
|
||||||
pop eax ;restore stack
|
pop eax ;restore stack
|
||||||
call DestroyObject ;eax= stream
|
invoke DestroyObject ;eax= stream
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
ret
|
ret
|
||||||
.fail:
|
.fail:
|
||||||
@ -833,7 +810,7 @@ proc wave_out stdcall, str:dword,src:dword,size:dword
|
|||||||
jne @F
|
jne @F
|
||||||
lea eax, [fpu_state+15]
|
lea eax, [fpu_state+15]
|
||||||
and eax, -16
|
and eax, -16
|
||||||
call FpuSave
|
invoke FpuSave
|
||||||
mov [state_saved], 1
|
mov [state_saved], 1
|
||||||
@@:
|
@@:
|
||||||
stdcall refill, edx
|
stdcall refill, edx
|
||||||
@ -853,7 +830,7 @@ proc wave_out stdcall, str:dword,src:dword,size:dword
|
|||||||
mov edx, [str]
|
mov edx, [str]
|
||||||
mov eax, [edx+STREAM.notify_event]
|
mov eax, [edx+STREAM.notify_event]
|
||||||
mov ebx, [edx+STREAM.notify_id]
|
mov ebx, [edx+STREAM.notify_id]
|
||||||
call WaitEvent ;eax ebx
|
invoke WaitEvent ;eax ebx
|
||||||
jmp .main_loop
|
jmp .main_loop
|
||||||
.done:
|
.done:
|
||||||
cmp [state_saved], 1
|
cmp [state_saved], 1
|
||||||
@ -861,7 +838,7 @@ proc wave_out stdcall, str:dword,src:dword,size:dword
|
|||||||
|
|
||||||
lea eax, [fpu_state+15]
|
lea eax, [fpu_state+15]
|
||||||
and eax, -16
|
and eax, -16
|
||||||
call FpuRestore
|
invoke FpuRestore
|
||||||
@@:
|
@@:
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
ret
|
ret
|
||||||
@ -1156,7 +1133,7 @@ proc play_buffer stdcall, str:dword, flags:dword
|
|||||||
.wait:
|
.wait:
|
||||||
mov eax, [edx+STREAM.notify_event]
|
mov eax, [edx+STREAM.notify_event]
|
||||||
mov ebx, [edx+STREAM.notify_id]
|
mov ebx, [edx+STREAM.notify_id]
|
||||||
call WaitEvent ;eax ebx
|
invoke WaitEvent ;eax ebx
|
||||||
|
|
||||||
mov edx, [str]
|
mov edx, [str]
|
||||||
cmp [edx+STREAM.flags], SND_STOP
|
cmp [edx+STREAM.flags], SND_STOP
|
||||||
@ -1182,7 +1159,7 @@ proc stop_buffer stdcall, str:dword
|
|||||||
|
|
||||||
mov eax, [edx+STREAM.notify_event]
|
mov eax, [edx+STREAM.notify_event]
|
||||||
mov ebx, [edx+STREAM.notify_id]
|
mov ebx, [edx+STREAM.notify_id]
|
||||||
call ClearEvent ;eax ebx
|
invoke ClearEvent ;eax ebx
|
||||||
|
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
ret
|
ret
|
||||||
@ -1315,7 +1292,7 @@ proc set_handler stdcall, hsrv:dword, handler_proc:dword
|
|||||||
mov [out_size], 0
|
mov [out_size], 0
|
||||||
|
|
||||||
lea eax, [handler]
|
lea eax, [handler]
|
||||||
stdcall ServiceHandler, eax
|
invoke ServiceHandler, eax
|
||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
|
|
||||||
@ -1342,7 +1319,7 @@ proc dev_play stdcall, hsrv:dword
|
|||||||
mov [out_size], ebx
|
mov [out_size], ebx
|
||||||
|
|
||||||
lea eax, [handle]
|
lea eax, [handle]
|
||||||
stdcall ServiceHandler, eax
|
invoke ServiceHandler, eax
|
||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
|
|
||||||
@ -1441,7 +1418,6 @@ vol_min dd 0x0000D8F0,0x0000D8F0
|
|||||||
pan_max dd 0x00002710,0x00002710
|
pan_max dd 0x00002710,0x00002710
|
||||||
|
|
||||||
;stream_map dd 0xFFFF ; 16
|
;stream_map dd 0xFFFF ; 16
|
||||||
version dd (5 shl 16) or SOUND_VERSION
|
|
||||||
|
|
||||||
szInfinity db 'INFINITY',0
|
szInfinity db 'INFINITY',0
|
||||||
szSound db 'SOUND',0
|
szSound db 'SOUND',0
|
||||||
@ -1457,7 +1433,11 @@ msgWaveout db 'Play waveout', 13,10,0
|
|||||||
msgSetVolume db 'Set volume',13,10,0
|
msgSetVolume db 'Set volume',13,10,0
|
||||||
end if
|
end if
|
||||||
|
|
||||||
section '.data' data readable writable align 16
|
align 4
|
||||||
|
data fixups
|
||||||
|
end data
|
||||||
|
|
||||||
|
section '.data' data readable writable
|
||||||
|
|
||||||
play_list rd 16
|
play_list rd 16
|
||||||
mix_input rd 16
|
mix_input rd 16
|
@ -1,6 +1,6 @@
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;; Copyright (C) KolibriOS team 2006-2011. All rights reserved. ;;
|
;; Copyright (C) KolibriOS team 2006-2014. All rights reserved. ;;
|
||||||
;; Distributed under terms of the GNU General Public License ;;
|
;; Distributed under terms of the GNU General Public License ;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
@ -27,7 +27,7 @@ proc new_mix stdcall, output:dword
|
|||||||
|
|
||||||
lea eax, [fpu_state+16]
|
lea eax, [fpu_state+16]
|
||||||
and eax, -16 ;must be 16b aligned
|
and eax, -16 ;must be 16b aligned
|
||||||
call FpuSave
|
invoke FpuSave
|
||||||
|
|
||||||
call update_streams
|
call update_streams
|
||||||
.mix:
|
.mix:
|
||||||
@ -66,7 +66,7 @@ end if
|
|||||||
.exit:
|
.exit:
|
||||||
lea eax, [fpu_state+16]
|
lea eax, [fpu_state+16]
|
||||||
and eax, -16
|
and eax, -16
|
||||||
call FpuRestore
|
invoke FpuRestore
|
||||||
ret
|
ret
|
||||||
.done:
|
.done:
|
||||||
mov ecx, [main_count]
|
mov ecx, [main_count]
|
||||||
@ -196,7 +196,7 @@ proc refill stdcall, str:dword
|
|||||||
mov ebx, [ebx+STREAM.notify_id]
|
mov ebx, [ebx+STREAM.notify_id]
|
||||||
mov edx, EVENT_WATCHED
|
mov edx, EVENT_WATCHED
|
||||||
xor esi, esi
|
xor esi, esi
|
||||||
call RaiseEvent ;eax, ebx, edx, esi
|
invoke RaiseEvent ;eax, ebx, edx, esi
|
||||||
.exit:
|
.exit:
|
||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
@ -267,7 +267,7 @@ proc refill_ring stdcall, str:dword
|
|||||||
|
|
||||||
mov ebx, [ebx+STREAM.notify_id]
|
mov ebx, [ebx+STREAM.notify_id]
|
||||||
xor edx, edx
|
xor edx, edx
|
||||||
call RaiseEvent ;eax, ebx, edx, esi
|
invoke RaiseEvent ;eax, ebx, edx, esi
|
||||||
.exit:
|
.exit:
|
||||||
ret
|
ret
|
||||||
endp
|
endp
|
@ -500,10 +500,9 @@ include '../../peimport.inc'
|
|||||||
include 'CODEC_H.INC'
|
include 'CODEC_H.INC'
|
||||||
|
|
||||||
entry START
|
entry START
|
||||||
section '.flat' readable writable executable
|
|
||||||
|
|
||||||
;proc START stdcall, state:dword
|
;proc START c, reason:dword, cmdline:dword
|
||||||
proc START c, state:dword, cmdline:dword
|
proc START
|
||||||
push ebx esi ; save used registers to be stdcall
|
push ebx esi ; save used registers to be stdcall
|
||||||
virtual at esp
|
virtual at esp
|
||||||
rd 2 ; saved registers
|
rd 2 ; saved registers
|
||||||
@ -512,8 +511,8 @@ virtual at esp
|
|||||||
.cmdline dd ? ; normally NULL
|
.cmdline dd ? ; normally NULL
|
||||||
end virtual
|
end virtual
|
||||||
; 1. Check the reason for the call, do nothing unless initializing.
|
; 1. Check the reason for the call, do nothing unless initializing.
|
||||||
;cmp [.reason], DRV_ENTRY
|
cmp [.reason], DRV_ENTRY
|
||||||
;jne .stop
|
jne .stop
|
||||||
|
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgTV
|
mov esi, msgTV
|
||||||
|
@ -1,17 +1,17 @@
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;;
|
;; Copyright (C) KolibriOS team 2004-2014. All rights reserved. ;;
|
||||||
;; Distributed under terms of the GNU General Public License ;;
|
;; Distributed under terms of the GNU General Public License ;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
format MS COFF
|
format PE DLL native 0.05
|
||||||
|
entry START
|
||||||
|
|
||||||
|
include '../struct.inc'
|
||||||
|
|
||||||
DEBUG equ 1
|
DEBUG equ 1
|
||||||
|
|
||||||
include 'proc32.inc'
|
|
||||||
include 'imports.inc'
|
|
||||||
|
|
||||||
API_VERSION equ 0x01000100
|
API_VERSION equ 0x01000100
|
||||||
|
|
||||||
DEBUG_IRQ equ 0
|
DEBUG_IRQ equ 0
|
||||||
@ -274,35 +274,21 @@ struc CTRL_INFO
|
|||||||
.codec_id dd ?
|
.codec_id dd ?
|
||||||
}
|
}
|
||||||
|
|
||||||
struc IOCTL
|
|
||||||
{ .handle dd ?
|
|
||||||
.io_code dd ?
|
|
||||||
.input dd ?
|
|
||||||
.inp_size dd ?
|
|
||||||
.output dd ?
|
|
||||||
.out_size dd ?
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual at 0
|
|
||||||
IOCTL IOCTL
|
|
||||||
end virtual
|
|
||||||
|
|
||||||
EVENT_NOTIFY equ 0x00000200
|
EVENT_NOTIFY equ 0x00000200
|
||||||
|
|
||||||
public START
|
section '.flat' code readable executable
|
||||||
public service_proc
|
include '../macros.inc'
|
||||||
public version
|
include '../proc32.inc'
|
||||||
|
include '../peimport.inc'
|
||||||
|
|
||||||
section '.flat' code readable align 16
|
proc START c uses ebx esi edi, state:dword, cmdline:dword
|
||||||
|
|
||||||
proc START stdcall, state:dword
|
|
||||||
|
|
||||||
cmp [state], 1
|
cmp [state], 1
|
||||||
jne .stop
|
jne .stop
|
||||||
|
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgInit
|
mov esi, msgInit
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
|
|
||||||
call detect_controller
|
call detect_controller
|
||||||
@ -311,9 +297,9 @@ proc START stdcall, state:dword
|
|||||||
|
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, [ctrl.vendor_ids]
|
mov esi, [ctrl.vendor_ids]
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
mov esi, [ctrl.ctrl_ids]
|
mov esi, [ctrl.ctrl_ids]
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
end if
|
end if
|
||||||
|
|
||||||
@ -329,10 +315,10 @@ proc START stdcall, state:dword
|
|||||||
call setup_codec
|
call setup_codec
|
||||||
|
|
||||||
mov esi, msgPrimBuff
|
mov esi, msgPrimBuff
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
call create_primary_buff
|
call create_primary_buff
|
||||||
mov esi, msgDone
|
mov esi, msgDone
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
if IRQ_REMAP
|
if IRQ_REMAP
|
||||||
pushf
|
pushf
|
||||||
@ -360,23 +346,23 @@ proc START stdcall, state:dword
|
|||||||
mov [ctrl.int_line], IRQ_LINE
|
mov [ctrl.int_line], IRQ_LINE
|
||||||
popf
|
popf
|
||||||
mov esi, msgRemap
|
mov esi, msgRemap
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
|
|
||||||
mov ebx, [ctrl.int_line]
|
mov ebx, [ctrl.int_line]
|
||||||
stdcall AttachIntHandler, ebx, ac97_irq, dword 0
|
invoke AttachIntHandler, ebx, ac97_irq, 0
|
||||||
.reg:
|
.reg:
|
||||||
stdcall RegService, sz_sound_srv, service_proc
|
invoke RegService, sz_sound_srv, service_proc
|
||||||
ret
|
ret
|
||||||
.fail:
|
.fail:
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgFail
|
mov esi, msgFail
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
ret
|
ret
|
||||||
.fail_msg:
|
.fail_msg:
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
ret
|
ret
|
||||||
.stop:
|
.stop:
|
||||||
@ -413,7 +399,7 @@ proc service_proc stdcall, ioctl:dword
|
|||||||
jne @F
|
jne @F
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgPlay
|
mov esi, msgPlay
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
call play
|
call play
|
||||||
ret
|
ret
|
||||||
@ -422,7 +408,7 @@ proc service_proc stdcall, ioctl:dword
|
|||||||
jne @F
|
jne @F
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgStop
|
mov esi, msgStop
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
call stop
|
call stop
|
||||||
ret
|
ret
|
||||||
@ -484,7 +470,7 @@ proc ac97_irq
|
|||||||
|
|
||||||
if DEBUG_IRQ
|
if DEBUG_IRQ
|
||||||
mov esi, msgIRQ
|
mov esi, msgIRQ
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
|
|
||||||
mov edx, CTRL_STAT
|
mov edx, CTRL_STAT
|
||||||
@ -508,9 +494,9 @@ proc ac97_irq
|
|||||||
.do_intr:
|
.do_intr:
|
||||||
push eax
|
push eax
|
||||||
|
|
||||||
mov edx, PCM_OUT_CR_REG
|
; mov edx, PCM_OUT_CR_REG
|
||||||
mov al, 0x10; 0x10
|
; mov al, 0x10; 0x10
|
||||||
call [ctrl.ctrl_write8]
|
; call [ctrl.ctrl_write8]
|
||||||
|
|
||||||
mov ax, 0x1c
|
mov ax, 0x1c
|
||||||
mov edx, PCM_OUT_SR_REG
|
mov edx, PCM_OUT_SR_REG
|
||||||
@ -531,19 +517,16 @@ proc ac97_irq
|
|||||||
mov edx, PCM_OUT_LVI_REG
|
mov edx, PCM_OUT_LVI_REG
|
||||||
call [ctrl.ctrl_write8]
|
call [ctrl.ctrl_write8]
|
||||||
|
|
||||||
mov edx, PCM_OUT_CR_REG
|
; mov edx, PCM_OUT_CR_REG
|
||||||
mov ax, 0x11 ;0x1D
|
; mov ax, 0x11 ;0x1D
|
||||||
call [ctrl.ctrl_write8]
|
; call [ctrl.ctrl_write8]
|
||||||
|
|
||||||
mov eax, [civ_val]
|
|
||||||
add eax, 1
|
|
||||||
and eax, 31
|
|
||||||
mov ebx, dword [buff_list+eax*4]
|
|
||||||
|
|
||||||
cmp [ctrl.user_callback], 0
|
cmp [ctrl.user_callback], 0
|
||||||
je .done
|
je .done
|
||||||
|
|
||||||
stdcall [ctrl.user_callback], ebx
|
mov eax, [ctrl.lvi_reg]
|
||||||
|
stdcall [ctrl.user_callback], [buff_list+eax*4]
|
||||||
|
|
||||||
.done:
|
.done:
|
||||||
pop eax
|
pop eax
|
||||||
and eax, 0x40
|
and eax, 0x40
|
||||||
@ -552,16 +535,16 @@ proc ac97_irq
|
|||||||
or eax, 1
|
or eax, 1
|
||||||
ret
|
ret
|
||||||
.skip:
|
.skip:
|
||||||
mov edx, PCM_OUT_CR_REG
|
; mov edx, PCM_OUT_CR_REG
|
||||||
mov ax, 0x11 ;0x1D
|
; mov ax, 0x11 ;0x1D
|
||||||
call [ctrl.ctrl_write8]
|
; call [ctrl.ctrl_write8]
|
||||||
jmp .done
|
jmp .done
|
||||||
endp
|
endp
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
proc create_primary_buff
|
proc create_primary_buff
|
||||||
|
|
||||||
stdcall KernelAlloc, 0x10000
|
invoke KernelAlloc, 0x10000
|
||||||
mov [ctrl.buffer], eax
|
mov [ctrl.buffer], eax
|
||||||
|
|
||||||
mov edi, eax
|
mov edi, eax
|
||||||
@ -571,7 +554,7 @@ proc create_primary_buff
|
|||||||
rep stosd
|
rep stosd
|
||||||
|
|
||||||
mov eax, [ctrl.buffer]
|
mov eax, [ctrl.buffer]
|
||||||
call GetPgAddr
|
invoke GetPgAddr
|
||||||
|
|
||||||
mov ebx, 0xC0002000
|
mov ebx, 0xC0002000
|
||||||
mov ecx, 4
|
mov ecx, 4
|
||||||
@ -624,7 +607,7 @@ proc create_primary_buff
|
|||||||
|
|
||||||
mov eax, pcmout_bdl
|
mov eax, pcmout_bdl
|
||||||
mov ebx, eax
|
mov ebx, eax
|
||||||
call GetPgAddr ;eax
|
invoke GetPgAddr ;eax
|
||||||
and ebx, 0xFFF
|
and ebx, 0xFFF
|
||||||
add eax, ebx
|
add eax, ebx
|
||||||
|
|
||||||
@ -640,59 +623,36 @@ endp
|
|||||||
|
|
||||||
align 4
|
align 4
|
||||||
proc detect_controller
|
proc detect_controller
|
||||||
locals
|
push ebx edi
|
||||||
last_bus dd ?
|
invoke GetPCIList
|
||||||
bus dd ?
|
mov ebx, eax
|
||||||
devfn dd ?
|
|
||||||
endl
|
|
||||||
|
|
||||||
xor eax, eax
|
|
||||||
mov [bus], eax
|
|
||||||
inc eax
|
|
||||||
call PciApi
|
|
||||||
cmp eax, -1
|
|
||||||
je .err
|
|
||||||
|
|
||||||
mov [last_bus], eax
|
|
||||||
|
|
||||||
.next_bus:
|
|
||||||
and [devfn], 0
|
|
||||||
.next_dev:
|
.next_dev:
|
||||||
stdcall PciRead32, [bus], [devfn], dword 0
|
mov eax, [eax+PCIDEV.fd]
|
||||||
test eax, eax
|
cmp eax, ebx
|
||||||
jz .next
|
jz .not_found
|
||||||
cmp eax, -1
|
mov edx, [eax+PCIDEV.vendor_device_id]
|
||||||
je .next
|
|
||||||
|
|
||||||
mov edi, devices
|
mov edi, devices
|
||||||
@@:
|
@@:
|
||||||
mov ebx, [edi]
|
cmp dword [edi], 0
|
||||||
test ebx, ebx
|
jz .next_dev
|
||||||
jz .next
|
cmp edx, [edi]
|
||||||
|
jz .found
|
||||||
cmp eax, ebx
|
|
||||||
je .found
|
|
||||||
add edi, 12
|
add edi, 12
|
||||||
jmp @B
|
jmp @B
|
||||||
.next:
|
|
||||||
inc [devfn]
|
.not_found:
|
||||||
cmp [devfn], 256
|
|
||||||
jb .next_dev
|
|
||||||
mov eax, [bus]
|
|
||||||
inc eax
|
|
||||||
mov [bus], eax
|
|
||||||
cmp eax, [last_bus]
|
|
||||||
jna .next_bus
|
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
|
pop edi ebx
|
||||||
ret
|
ret
|
||||||
.found:
|
.found:
|
||||||
mov ebx, [bus]
|
movzx ebx, [eax+PCIDEV.bus]
|
||||||
mov [ctrl.bus], ebx
|
mov [ctrl.bus], ebx
|
||||||
|
|
||||||
mov ecx, [devfn]
|
movzx ecx, [eax+PCIDEV.devfn]
|
||||||
mov [ctrl.devfn], ecx
|
mov [ctrl.devfn], ecx
|
||||||
|
|
||||||
mov edx, eax
|
mov eax, edx
|
||||||
and edx, 0xFFFF
|
and edx, 0xFFFF
|
||||||
mov [ctrl.vendor], edx
|
mov [ctrl.vendor], edx
|
||||||
shr eax, 16
|
shr eax, 16
|
||||||
@ -700,29 +660,32 @@ proc detect_controller
|
|||||||
|
|
||||||
mov ebx, [edi+4]
|
mov ebx, [edi+4]
|
||||||
mov [ctrl.ctrl_ids], ebx
|
mov [ctrl.ctrl_ids], ebx
|
||||||
mov esi, [edi+8]
|
mov eax, [edi+8]
|
||||||
mov [ctrl.ctrl_setup], esi
|
mov [ctrl.ctrl_setup], eax
|
||||||
|
|
||||||
cmp edx, VID_INTEL
|
cmp edx, VID_INTEL
|
||||||
jne @F
|
jne @F
|
||||||
mov [ctrl.vendor_ids], msg_Intel
|
mov [ctrl.vendor_ids], msg_Intel
|
||||||
|
pop edi ebx
|
||||||
ret
|
ret
|
||||||
@@:
|
@@:
|
||||||
cmp edx, VID_NVIDIA
|
cmp edx, VID_NVIDIA
|
||||||
jne @F
|
jne @F
|
||||||
mov [ctrl.vendor_ids], msg_NVidia
|
mov [ctrl.vendor_ids], msg_NVidia
|
||||||
|
pop edi ebx
|
||||||
ret
|
ret
|
||||||
@@:
|
@@:
|
||||||
.err:
|
.err:
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
mov [ctrl.vendor_ids], eax ;something wrong ?
|
mov [ctrl.vendor_ids], eax ;something wrong ?
|
||||||
|
pop edi ebx
|
||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
proc init_controller
|
proc init_controller
|
||||||
|
|
||||||
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 4
|
invoke PciRead32, [ctrl.bus], [ctrl.devfn], 4
|
||||||
mov ebx, eax
|
mov ebx, eax
|
||||||
and eax, 0xFFFF
|
and eax, 0xFFFF
|
||||||
mov [ctrl.pci_cmd], eax
|
mov [ctrl.pci_cmd], eax
|
||||||
@ -730,55 +693,55 @@ proc init_controller
|
|||||||
mov [ctrl.pci_stat], ebx
|
mov [ctrl.pci_stat], ebx
|
||||||
|
|
||||||
mov esi, msgPciCmd
|
mov esi, msgPciCmd
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
mov esi, msgPciStat
|
mov esi, msgPciStat
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
mov eax, [ctrl.pci_stat]
|
mov eax, [ctrl.pci_stat]
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
mov esi, msgMixIsaIo
|
mov esi, msgMixIsaIo
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x10
|
invoke PciRead32, [ctrl.bus], [ctrl.devfn], 0x10
|
||||||
|
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
and eax, 0xFFFE
|
and eax, 0xFFFE
|
||||||
mov [ctrl.codec_io_base], eax
|
mov [ctrl.codec_io_base], eax
|
||||||
|
|
||||||
mov esi, msgCtrlIsaIo
|
mov esi, msgCtrlIsaIo
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x14
|
invoke PciRead32, [ctrl.bus], [ctrl.devfn], 0x14
|
||||||
|
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
and eax, 0xFFC0
|
and eax, 0xFFC0
|
||||||
mov [ctrl.ctrl_io_base], eax
|
mov [ctrl.ctrl_io_base], eax
|
||||||
|
|
||||||
mov esi, msgMixMMIo
|
mov esi, msgMixMMIo
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x18
|
invoke PciRead32, [ctrl.bus], [ctrl.devfn], 0x18
|
||||||
mov [ctrl.codec_mem_base], eax
|
mov [ctrl.codec_mem_base], eax
|
||||||
|
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
mov esi, msgCtrlMMIo
|
mov esi, msgCtrlMMIo
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x1C
|
invoke PciRead32, [ctrl.bus], [ctrl.devfn], 0x1C
|
||||||
mov [ctrl.ctrl_mem_base], eax
|
mov [ctrl.ctrl_mem_base], eax
|
||||||
|
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
if 0
|
if 0
|
||||||
|
|
||||||
@ -787,11 +750,11 @@ if 0
|
|||||||
jne .default
|
jne .default
|
||||||
|
|
||||||
mov esi, msgIrqMap
|
mov esi, msgIrqMap
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
stdcall PciRead8, 0, 0xF8, 0x61
|
invoke PciRead8, 0, 0xF8, 0x61
|
||||||
and eax, 0xFF
|
and eax, 0xFF
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
btr eax, 7 ;when bit 7 set remap disabled
|
btr eax, 7 ;when bit 7 set remap disabled
|
||||||
jnc @F
|
jnc @F
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
@ -799,12 +762,12 @@ if 0
|
|||||||
end if
|
end if
|
||||||
|
|
||||||
.default:
|
.default:
|
||||||
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x3C
|
invoke PciRead32, [ctrl.bus], [ctrl.devfn], 0x3C
|
||||||
and eax, 0xFF
|
and eax, 0xFF
|
||||||
@@:
|
@@:
|
||||||
mov [ctrl.int_line], eax
|
mov [ctrl.int_line], eax
|
||||||
|
|
||||||
stdcall PciRead8, [ctrl.bus], [ctrl.devfn], dword 0x41
|
invoke PciRead8, [ctrl.bus], [ctrl.devfn], 0x41
|
||||||
and eax, 0xFF
|
and eax, 0xFF
|
||||||
mov [ctrl.cfg_reg], eax
|
mov [ctrl.cfg_reg], eax
|
||||||
|
|
||||||
@ -837,10 +800,10 @@ PG_NOCACHE equ 0x018
|
|||||||
align 4
|
align 4
|
||||||
proc set_ICH4
|
proc set_ICH4
|
||||||
|
|
||||||
stdcall MapIoMem, [ctrl.codec_mem_base], 0x1000, PG_SW+PG_NOCACHE
|
invoke MapIoMem, [ctrl.codec_mem_base], 0x1000, PG_SW+PG_NOCACHE
|
||||||
mov [ctrl.codec_mem_base], eax
|
mov [ctrl.codec_mem_base], eax
|
||||||
|
|
||||||
stdcall MapIoMem, [ctrl.ctrl_mem_base], 0x1000, PG_SW+PG_NOCACHE
|
invoke MapIoMem, [ctrl.ctrl_mem_base], 0x1000, PG_SW+PG_NOCACHE
|
||||||
mov [ctrl.ctrl_mem_base], eax
|
mov [ctrl.ctrl_mem_base], eax
|
||||||
|
|
||||||
mov [ctrl.codec_read16], codec_mem_r16 ;virtual
|
mov [ctrl.codec_read16], codec_mem_r16 ;virtual
|
||||||
@ -888,21 +851,21 @@ proc init_codec
|
|||||||
endl
|
endl
|
||||||
|
|
||||||
mov esi, msgControl
|
mov esi, msgControl
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
mov edx, GLOB_CTRL
|
mov edx, GLOB_CTRL
|
||||||
call [ctrl.ctrl_read32]
|
call [ctrl.ctrl_read32]
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
mov esi, msgStatus
|
mov esi, msgStatus
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
mov edx, CTRL_STAT
|
mov edx, CTRL_STAT
|
||||||
call [ctrl.ctrl_read32]
|
call [ctrl.ctrl_read32]
|
||||||
push eax
|
push eax
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
pop eax
|
pop eax
|
||||||
cmp eax, 0xFFFFFFFF
|
cmp eax, 0xFFFFFFFF
|
||||||
je .err
|
je .err
|
||||||
@ -968,14 +931,14 @@ proc reset_codec
|
|||||||
|
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgCFail
|
mov esi, msgCFail
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
xor eax, eax ; timeout error
|
xor eax, eax ; timeout error
|
||||||
ret
|
ret
|
||||||
.ok:
|
.ok:
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgResetOk
|
mov esi, msgResetOk
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
|
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
@ -995,7 +958,7 @@ proc warm_reset
|
|||||||
|
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgWarm
|
mov esi, msgWarm
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
|
|
||||||
mov [counter], 10 ; total 10*100 ms = 1s
|
mov [counter], 10 ; total 10*100 ms = 1s
|
||||||
@ -1013,7 +976,7 @@ proc warm_reset
|
|||||||
|
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgWRFail
|
mov esi, msgWRFail
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
.fail:
|
.fail:
|
||||||
stc
|
stc
|
||||||
@ -1035,7 +998,7 @@ proc cold_reset
|
|||||||
|
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgCold
|
mov esi, msgCold
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
|
|
||||||
mov eax, 400000 ; wait 400 ms
|
mov eax, 400000 ; wait 400 ms
|
||||||
@ -1057,7 +1020,7 @@ proc cold_reset
|
|||||||
|
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgCRFail
|
mov esi, msgCRFail
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
|
|
||||||
.fail:
|
.fail:
|
||||||
@ -1065,21 +1028,21 @@ proc cold_reset
|
|||||||
ret
|
ret
|
||||||
.ok:
|
.ok:
|
||||||
mov esi, msgControl
|
mov esi, msgControl
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
mov edx, GLOB_CTRL
|
mov edx, GLOB_CTRL
|
||||||
call [ctrl.ctrl_read32]
|
call [ctrl.ctrl_read32]
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
mov esi, msgStatus
|
mov esi, msgStatus
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
mov edx, CTRL_STAT
|
mov edx, CTRL_STAT
|
||||||
call [ctrl.ctrl_read32]
|
call [ctrl.ctrl_read32]
|
||||||
push eax
|
push eax
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
pop eax
|
pop eax
|
||||||
|
|
||||||
test eax, CTRL_ST_CREADY
|
test eax, CTRL_ST_CREADY
|
||||||
@ -1438,8 +1401,6 @@ devices dd (CTRL_ICH shl 16)+VID_INTEL,msg_ICH, set_ICH
|
|||||||
dd 0 ;terminator
|
dd 0 ;terminator
|
||||||
|
|
||||||
|
|
||||||
version dd (5 shl 16) or (API_VERSION and 0xFFFF)
|
|
||||||
|
|
||||||
msg_ICH db '802801AA (ICH)', 13,10, 0
|
msg_ICH db '802801AA (ICH)', 13,10, 0
|
||||||
msg_ICH0 db '802801AB (ICH0)', 13,10, 0
|
msg_ICH0 db '802801AB (ICH0)', 13,10, 0
|
||||||
msg_ICH2 db '802801BA (ICH2)', 13,10, 0
|
msg_ICH2 db '802801BA (ICH2)', 13,10, 0
|
||||||
@ -1495,7 +1456,11 @@ msgCtrlMMIo db 'controller mmio base ',0
|
|||||||
msgMixMMIo db 'codec mmio base ',0
|
msgMixMMIo db 'codec mmio base ',0
|
||||||
msgIrqMap db 'AC97 irq map as ',0
|
msgIrqMap db 'AC97 irq map as ',0
|
||||||
|
|
||||||
section '.data' data readable writable align 16
|
align 4
|
||||||
|
data fixups
|
||||||
|
end data
|
||||||
|
|
||||||
|
section '.data' data readable writable
|
||||||
|
|
||||||
pcmout_bdl rq 32
|
pcmout_bdl rq 32
|
||||||
buff_list rd 32
|
buff_list rd 32
|
@ -1,18 +1,15 @@
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;;
|
;; Copyright (C) KolibriOS team 2004-2014. All rights reserved. ;;
|
||||||
;; Distributed under terms of the GNU General Public License ;;
|
;; Distributed under terms of the GNU General Public License ;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
format MS COFF
|
format PE DLL native 0.05
|
||||||
|
entry START
|
||||||
|
|
||||||
DEBUG equ 1
|
DEBUG equ 1
|
||||||
|
|
||||||
include 'proc32.inc'
|
|
||||||
include 'imports.inc'
|
|
||||||
|
|
||||||
API_VERSION equ 0x01000100
|
API_VERSION equ 0x01000100
|
||||||
DEBUG_IRQ equ 0
|
DEBUG_IRQ equ 0
|
||||||
|
|
||||||
@ -30,7 +27,7 @@ if USE_COM_IRQ
|
|||||||
ATTCH_IRQ equ 0000111010111000b
|
ATTCH_IRQ equ 0000111010111000b
|
||||||
end if
|
end if
|
||||||
|
|
||||||
CPU_FREQ equ 2600d
|
CPU_FREQ equ 2000d
|
||||||
|
|
||||||
BIT0 EQU 0x00000001
|
BIT0 EQU 0x00000001
|
||||||
BIT1 EQU 0x00000002
|
BIT1 EQU 0x00000002
|
||||||
@ -251,35 +248,23 @@ struc CTRL_INFO
|
|||||||
.codec_id dd ?
|
.codec_id dd ?
|
||||||
}
|
}
|
||||||
|
|
||||||
struc IOCTL
|
|
||||||
{ .handle dd ?
|
|
||||||
.io_code dd ?
|
|
||||||
.input dd ?
|
|
||||||
.inp_size dd ?
|
|
||||||
.output dd ?
|
|
||||||
.out_size dd ?
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual at 0
|
|
||||||
IOCTL IOCTL
|
|
||||||
end virtual
|
|
||||||
|
|
||||||
EVENT_NOTIFY equ 0x00000200
|
EVENT_NOTIFY equ 0x00000200
|
||||||
|
|
||||||
public START
|
section '.flat' code readable writable executable
|
||||||
public service_proc
|
include '../struct.inc'
|
||||||
public version
|
include '../macros.inc'
|
||||||
|
include '../proc32.inc'
|
||||||
|
include '../peimport.inc'
|
||||||
|
|
||||||
section '.flat' code readable align 16
|
|
||||||
|
|
||||||
proc START stdcall, state:dword
|
proc START c uses ebx esi edi, state:dword, cmdline:dword
|
||||||
|
|
||||||
cmp [state], 1
|
cmp [state], 1
|
||||||
jne .stop
|
jne .stop
|
||||||
|
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgInit
|
mov esi, msgInit
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
|
|
||||||
call detect_controller
|
call detect_controller
|
||||||
@ -288,9 +273,9 @@ proc START stdcall, state:dword
|
|||||||
|
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, [ctrl.vendor_ids]
|
mov esi, [ctrl.vendor_ids]
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
mov esi, [ctrl.ctrl_ids]
|
mov esi, [ctrl.ctrl_ids]
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
end if
|
end if
|
||||||
|
|
||||||
@ -306,10 +291,10 @@ proc START stdcall, state:dword
|
|||||||
call setup_codec
|
call setup_codec
|
||||||
|
|
||||||
mov esi, msgPrimBuff
|
mov esi, msgPrimBuff
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
call create_primary_buff
|
call create_primary_buff
|
||||||
mov esi, msgDone
|
mov esi, msgDone
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
if IRQ_REMAP
|
if IRQ_REMAP
|
||||||
pushf
|
pushf
|
||||||
@ -322,13 +307,13 @@ proc START stdcall, state:dword
|
|||||||
test ebx, ebx
|
test ebx, ebx
|
||||||
jz .skip
|
jz .skip
|
||||||
bts ax, bx ;mask old line
|
bts ax, bx ;mask old line
|
||||||
.skip
|
.skip:
|
||||||
bts ax, IRQ_LINE ;mask new ine
|
bts ax, IRQ_LINE ;mask new ine
|
||||||
out 0x21, al
|
out 0x21, al
|
||||||
mov al, ah
|
mov al, ah
|
||||||
out 0xA1, al
|
out 0xA1, al
|
||||||
;remap IRQ
|
;remap IRQ
|
||||||
stdcall PciWrite8, 0, 0xF8, 0x61, IRQ_LINE
|
invoke PciWrite8, 0, 0xF8, 0x61, IRQ_LINE
|
||||||
|
|
||||||
mov dx, 0x4d0 ;8259 ELCR1
|
mov dx, 0x4d0 ;8259 ELCR1
|
||||||
in al, dx
|
in al, dx
|
||||||
@ -337,7 +322,7 @@ proc START stdcall, state:dword
|
|||||||
mov [ctrl.int_line], IRQ_LINE
|
mov [ctrl.int_line], IRQ_LINE
|
||||||
popf
|
popf
|
||||||
mov esi, msgRemap
|
mov esi, msgRemap
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
|
|
||||||
mov eax, VALID_IRQ
|
mov eax, VALID_IRQ
|
||||||
@ -350,19 +335,19 @@ proc START stdcall, state:dword
|
|||||||
bt eax, ebx
|
bt eax, ebx
|
||||||
jnc .fail_msg
|
jnc .fail_msg
|
||||||
|
|
||||||
stdcall AttachIntHandler, ebx, ac97_irq, dword 0
|
invoke AttachIntHandler, ebx, ac97_irq, 0
|
||||||
.reg:
|
.reg:
|
||||||
stdcall RegService, sz_sound_srv, service_proc
|
invoke RegService, sz_sound_srv, service_proc
|
||||||
ret
|
ret
|
||||||
.fail:
|
.fail:
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgFail
|
mov esi, msgFail
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
ret
|
ret
|
||||||
.fail_msg:
|
.fail_msg:
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
ret
|
ret
|
||||||
.stop:
|
.stop:
|
||||||
@ -399,7 +384,7 @@ proc service_proc stdcall, ioctl:dword
|
|||||||
jne @F
|
jne @F
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgPlay
|
mov esi, msgPlay
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
call play
|
call play
|
||||||
ret
|
ret
|
||||||
@ -408,7 +393,7 @@ proc service_proc stdcall, ioctl:dword
|
|||||||
jne @F
|
jne @F
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgStop
|
mov esi, msgStop
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
call stop
|
call stop
|
||||||
ret
|
ret
|
||||||
@ -455,7 +440,7 @@ proc ac97_irq
|
|||||||
|
|
||||||
if DEBUG_IRQ
|
if DEBUG_IRQ
|
||||||
mov esi, msgIRQ
|
mov esi, msgIRQ
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
|
|
||||||
mov edx, PCM_OUT_CR_REG
|
mov edx, PCM_OUT_CR_REG
|
||||||
@ -507,7 +492,7 @@ endp
|
|||||||
align 4
|
align 4
|
||||||
proc create_primary_buff
|
proc create_primary_buff
|
||||||
|
|
||||||
stdcall KernelAlloc, 0x10000
|
invoke KernelAlloc, 0x10000
|
||||||
mov [ctrl.buffer], eax
|
mov [ctrl.buffer], eax
|
||||||
|
|
||||||
mov edi, eax
|
mov edi, eax
|
||||||
@ -517,7 +502,7 @@ proc create_primary_buff
|
|||||||
rep stosd
|
rep stosd
|
||||||
|
|
||||||
mov eax, [ctrl.buffer]
|
mov eax, [ctrl.buffer]
|
||||||
call GetPgAddr
|
invoke GetPgAddr
|
||||||
|
|
||||||
mov ebx, 0xC0004000
|
mov ebx, 0xC0004000
|
||||||
mov ecx, 4
|
mov ecx, 4
|
||||||
@ -570,7 +555,7 @@ proc create_primary_buff
|
|||||||
|
|
||||||
mov eax, pcmout_bdl
|
mov eax, pcmout_bdl
|
||||||
mov ebx, eax
|
mov ebx, eax
|
||||||
call GetPgAddr ;eax
|
invoke GetPgAddr ;eax
|
||||||
and ebx, 0xFFF
|
and ebx, 0xFFF
|
||||||
add eax, ebx
|
add eax, ebx
|
||||||
|
|
||||||
@ -593,143 +578,132 @@ endp
|
|||||||
|
|
||||||
align 4
|
align 4
|
||||||
proc detect_controller
|
proc detect_controller
|
||||||
locals
|
push ebx
|
||||||
last_bus dd ?
|
invoke GetPCIList
|
||||||
bus dd ?
|
mov ebx, eax
|
||||||
devfn dd ?
|
|
||||||
endl
|
|
||||||
|
|
||||||
xor eax, eax
|
|
||||||
mov [bus], eax
|
|
||||||
inc eax
|
|
||||||
call PciApi
|
|
||||||
cmp eax, -1
|
|
||||||
je .err
|
|
||||||
|
|
||||||
mov [last_bus], eax
|
|
||||||
|
|
||||||
.next_bus:
|
|
||||||
and [devfn], 0
|
|
||||||
.next_dev:
|
.next_dev:
|
||||||
stdcall PciRead32, [bus], [devfn], dword 0
|
mov eax, [eax+PCIDEV.fd]
|
||||||
test eax, eax
|
|
||||||
jz .next
|
|
||||||
cmp eax, -1
|
|
||||||
je .next
|
|
||||||
|
|
||||||
mov edi, devices
|
|
||||||
@@:
|
|
||||||
mov ebx, [edi]
|
|
||||||
test ebx, ebx
|
|
||||||
jz .next
|
|
||||||
|
|
||||||
cmp eax, ebx
|
cmp eax, ebx
|
||||||
je .found
|
je .err
|
||||||
add edi, 12
|
cmp [eax+PCIDEV.class], 0x060100 ;pci-isa
|
||||||
jmp @B
|
jne .no_bridge
|
||||||
.next:
|
movzx edx, [eax+PCIDEV.bus]
|
||||||
inc [devfn]
|
mov [brg_bus], edx
|
||||||
cmp [devfn], 256
|
movzx edx, [eax+PCIDEV.devfn]
|
||||||
jb .next_dev
|
mov [brg_devfn], edx
|
||||||
mov eax, [bus]
|
.no_bridge:
|
||||||
inc eax
|
mov edx, [eax+PCIDEV.vendor_device_id]
|
||||||
mov [bus], eax
|
mov esi, devices
|
||||||
cmp eax, [last_bus]
|
@@:
|
||||||
jna .next_bus
|
cmp dword [esi], 0
|
||||||
|
jz .next_dev
|
||||||
|
cmp dword [esi], edx
|
||||||
|
jz .found
|
||||||
|
add esi, 12
|
||||||
|
jmp @b
|
||||||
|
.err:
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
|
pop ebx
|
||||||
ret
|
ret
|
||||||
.found:
|
.found:
|
||||||
mov ebx, [bus]
|
movzx ebx, [eax+PCIDEV.bus]
|
||||||
mov [ctrl.bus], ebx
|
mov [ctrl.bus], ebx
|
||||||
|
|
||||||
mov ecx, [devfn]
|
movzx ecx, [eax+PCIDEV.devfn]
|
||||||
mov [ctrl.devfn], ecx
|
mov [ctrl.devfn], ecx
|
||||||
|
|
||||||
mov edx, eax
|
mov eax, edx
|
||||||
and edx, 0xFFFF
|
and edx, 0xFFFF
|
||||||
mov [ctrl.vendor], edx
|
mov [ctrl.vendor], edx
|
||||||
shr eax, 16
|
shr eax, 16
|
||||||
mov [ctrl.dev_id], eax
|
mov [ctrl.dev_id], eax
|
||||||
|
|
||||||
mov ebx, [edi+4]
|
mov ebx, [esi+4]
|
||||||
mov [ctrl.ctrl_ids], ebx
|
mov [ctrl.ctrl_ids], ebx
|
||||||
mov [ctrl.vendor_ids], msg_SIS
|
mov [ctrl.vendor_ids], msg_SIS
|
||||||
|
|
||||||
mov esi, [edi+8]
|
mov eax, [esi+8]
|
||||||
mov [ctrl.ctrl_setup], esi
|
mov [ctrl.ctrl_setup], eax
|
||||||
ret
|
pop ebx
|
||||||
.err:
|
|
||||||
xor eax, eax
|
|
||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
proc init_controller
|
proc init_controller
|
||||||
|
|
||||||
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 4
|
invoke PciRead32, [ctrl.bus], [ctrl.devfn], 4
|
||||||
mov ebx, eax
|
mov ebx, eax
|
||||||
and eax, 0xFFFF
|
or al, 5
|
||||||
|
invoke PciWrite16, [ctrl.bus], [ctrl.devfn], 4, eax
|
||||||
|
movzx eax, bx
|
||||||
mov [ctrl.pci_cmd], eax
|
mov [ctrl.pci_cmd], eax
|
||||||
shr ebx, 16
|
shr ebx, 16
|
||||||
mov [ctrl.pci_stat], ebx
|
mov [ctrl.pci_stat], ebx
|
||||||
|
|
||||||
mov esi, msgPciCmd
|
mov esi, msgPciCmd
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
mov esi, msgPciStat
|
mov esi, msgPciStat
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
mov eax, [ctrl.pci_stat]
|
mov eax, [ctrl.pci_stat]
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
mov esi, msgMixIsaIo
|
mov esi, msgMixIsaIo
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x10
|
invoke PciRead32, [ctrl.bus], [ctrl.devfn], 0x10
|
||||||
|
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
and eax, 0xFFFE
|
and eax, 0xFFFE
|
||||||
mov [ctrl.codec_io_base], eax
|
mov [ctrl.codec_io_base], eax
|
||||||
|
|
||||||
mov esi, msgCtrlIsaIo
|
mov esi, msgCtrlIsaIo
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x14
|
invoke PciRead32, [ctrl.bus], [ctrl.devfn], 0x14
|
||||||
|
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
and eax, 0xFFC0
|
and eax, 0xFFC0
|
||||||
mov [ctrl.ctrl_io_base], eax
|
mov [ctrl.ctrl_io_base], eax
|
||||||
|
|
||||||
mov esi, msgMixMMIo
|
mov esi, msgMixMMIo
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x18
|
invoke PciRead32, [ctrl.bus], [ctrl.devfn], 0x18
|
||||||
mov [ctrl.codec_mem_base], eax
|
mov [ctrl.codec_mem_base], eax
|
||||||
|
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
mov esi, msgCtrlMMIo
|
mov esi, msgCtrlMMIo
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x1C
|
invoke PciRead32, [ctrl.bus], [ctrl.devfn], 0x1C
|
||||||
mov [ctrl.ctrl_mem_base], eax
|
mov [ctrl.ctrl_mem_base], eax
|
||||||
|
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
.default:
|
|
||||||
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x3C
|
invoke PciRead32, [ctrl.bus], [ctrl.devfn], 0x3C
|
||||||
and eax, 0xFF
|
cmp al, 0xFF
|
||||||
|
jnz @f
|
||||||
|
movzx eax, ah
|
||||||
|
add eax, 0x40
|
||||||
|
invoke PciWrite8, [brg_bus], [brg_devfn], eax, 5
|
||||||
|
invoke PciWrite8, [ctrl.bus], [ctrl.devfn], 0x3C, 5
|
||||||
|
mov al, 5
|
||||||
@@:
|
@@:
|
||||||
|
and eax, 0xFF
|
||||||
mov [ctrl.int_line], eax
|
mov [ctrl.int_line], eax
|
||||||
|
|
||||||
stdcall PciRead8, [ctrl.bus], [ctrl.devfn], dword 0x41
|
invoke PciRead8, [ctrl.bus], [ctrl.devfn], 0x41
|
||||||
and eax, 0xFF
|
and eax, 0xFF
|
||||||
mov [ctrl.cfg_reg], eax
|
mov [ctrl.cfg_reg], eax
|
||||||
|
|
||||||
@ -786,27 +760,27 @@ proc init_codec
|
|||||||
endl
|
endl
|
||||||
|
|
||||||
mov esi, msgControl
|
mov esi, msgControl
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
mov edx, GLOB_CTRL
|
mov edx, GLOB_CTRL
|
||||||
call [ctrl.ctrl_read32]
|
call [ctrl.ctrl_read32]
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
mov esi, msgStatus
|
mov esi, msgStatus
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
mov edx, CTRL_STAT
|
mov edx, CTRL_STAT
|
||||||
call [ctrl.ctrl_read32]
|
call [ctrl.ctrl_read32]
|
||||||
push eax
|
push eax
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
pop eax
|
pop eax
|
||||||
cmp eax, 0xFFFFFFFF
|
cmp eax, 0xFFFFFFFF
|
||||||
je .err
|
je .err
|
||||||
|
|
||||||
test eax, CTRL_ST_CREADY
|
test eax, CTRL_ST_CREADY
|
||||||
jnz .done ;;;;;.ready
|
jnz .ready
|
||||||
|
|
||||||
call reset_codec
|
call reset_codec
|
||||||
test eax, eax
|
test eax, eax
|
||||||
@ -866,7 +840,7 @@ proc reset_codec
|
|||||||
|
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgCFail
|
mov esi, msgCFail
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
xor eax, eax ; timeout error
|
xor eax, eax ; timeout error
|
||||||
ret
|
ret
|
||||||
@ -888,7 +862,7 @@ proc warm_reset
|
|||||||
|
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgWarm
|
mov esi, msgWarm
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
|
|
||||||
mov [counter], 10 ; total 10*100 ms = 1s
|
mov [counter], 10 ; total 10*100 ms = 1s
|
||||||
@ -906,7 +880,7 @@ proc warm_reset
|
|||||||
|
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgWRFail
|
mov esi, msgWRFail
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
.fail:
|
.fail:
|
||||||
stc
|
stc
|
||||||
@ -928,7 +902,7 @@ proc cold_reset
|
|||||||
|
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgCold
|
mov esi, msgCold
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
|
|
||||||
mov eax, 400000 ; wait 400 ms
|
mov eax, 400000 ; wait 400 ms
|
||||||
@ -950,7 +924,7 @@ proc cold_reset
|
|||||||
|
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgCRFail
|
mov esi, msgCRFail
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
|
|
||||||
.fail:
|
.fail:
|
||||||
@ -958,21 +932,21 @@ proc cold_reset
|
|||||||
ret
|
ret
|
||||||
.ok:
|
.ok:
|
||||||
mov esi, msgControl
|
mov esi, msgControl
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
mov edx, GLOB_CTRL
|
mov edx, GLOB_CTRL
|
||||||
call [ctrl.ctrl_read32]
|
call [ctrl.ctrl_read32]
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
mov esi, msgStatus
|
mov esi, msgStatus
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
mov edx, CTRL_STAT
|
mov edx, CTRL_STAT
|
||||||
call [ctrl.ctrl_read32]
|
call [ctrl.ctrl_read32]
|
||||||
push eax
|
push eax
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
pop eax
|
pop eax
|
||||||
|
|
||||||
test eax, CTRL_ST_CREADY
|
test eax, CTRL_ST_CREADY
|
||||||
@ -1089,12 +1063,6 @@ endp
|
|||||||
|
|
||||||
align 4
|
align 4
|
||||||
proc codec_write stdcall, ac_reg:dword
|
proc codec_write stdcall, ac_reg:dword
|
||||||
push eax
|
|
||||||
call check_semafore
|
|
||||||
and eax, eax
|
|
||||||
jz .err
|
|
||||||
pop eax
|
|
||||||
|
|
||||||
mov esi, [ac_reg]
|
mov esi, [ac_reg]
|
||||||
mov edx, esi
|
mov edx, esi
|
||||||
call [ctrl.codec_write16]
|
call [ctrl.codec_write16]
|
||||||
@ -1102,9 +1070,6 @@ proc codec_write stdcall, ac_reg:dword
|
|||||||
shr esi, 1
|
shr esi, 1
|
||||||
bts [codec.shadow_flag], esi
|
bts [codec.shadow_flag], esi
|
||||||
ret
|
ret
|
||||||
.err:
|
|
||||||
pop eax
|
|
||||||
ret
|
|
||||||
endp
|
endp
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
@ -1124,7 +1089,7 @@ proc codec_check_ready
|
|||||||
endp
|
endp
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
proc check_semafore
|
proc check_semaphore
|
||||||
local counter:DWORD
|
local counter:DWORD
|
||||||
|
|
||||||
mov [counter], 100
|
mov [counter], 100
|
||||||
@ -1180,15 +1145,27 @@ endp
|
|||||||
|
|
||||||
align 4
|
align 4
|
||||||
proc codec_io_r16
|
proc codec_io_r16
|
||||||
|
push eax edx
|
||||||
|
call check_semaphore
|
||||||
|
test eax, eax
|
||||||
|
pop edx eax
|
||||||
|
jz .err
|
||||||
add edx, [ctrl.codec_io_base]
|
add edx, [ctrl.codec_io_base]
|
||||||
in ax, dx
|
in ax, dx
|
||||||
|
.err:
|
||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
proc codec_io_w16
|
proc codec_io_w16
|
||||||
|
push eax edx
|
||||||
|
call check_semaphore
|
||||||
|
test eax, eax
|
||||||
|
pop edx eax
|
||||||
|
jz .err
|
||||||
add edx, [ctrl.codec_io_base]
|
add edx, [ctrl.codec_io_base]
|
||||||
out dx, ax
|
out dx, ax
|
||||||
|
.err:
|
||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
|
|
||||||
@ -1257,8 +1234,6 @@ align 4
|
|||||||
devices dd (CTRL_SIS shl 16)+VID_SIS,msg_AC, set_SIS
|
devices dd (CTRL_SIS shl 16)+VID_SIS,msg_AC, set_SIS
|
||||||
dd 0
|
dd 0
|
||||||
|
|
||||||
version dd (5 shl 16) or (API_VERSION and 0xFFFF)
|
|
||||||
|
|
||||||
msg_AC db '7012 AC97 controller',13,10, 0
|
msg_AC db '7012 AC97 controller',13,10, 0
|
||||||
msg_SIS db 'Silicon Integrated Systems',13,10, 0
|
msg_SIS db 'Silicon Integrated Systems',13,10, 0
|
||||||
|
|
||||||
@ -1295,8 +1270,11 @@ msgCtrlMMIo db 'controller mmio base ',0
|
|||||||
msgMixMMIo db 'codec mmio base ',0
|
msgMixMMIo db 'codec mmio base ',0
|
||||||
msgIrqMap db 'AC97 irq map as ',0
|
msgIrqMap db 'AC97 irq map as ',0
|
||||||
|
|
||||||
section '.data' data readable writable align 16
|
align 4
|
||||||
|
data fixups
|
||||||
|
end data
|
||||||
|
|
||||||
|
align 8
|
||||||
pcmout_bdl rq 32
|
pcmout_bdl rq 32
|
||||||
buff_list rd 32
|
buff_list rd 32
|
||||||
|
|
||||||
@ -1305,3 +1283,6 @@ ctrl AC_CNTRL
|
|||||||
|
|
||||||
lpc_bus rd 1
|
lpc_bus rd 1
|
||||||
civ_val rd 1
|
civ_val rd 1
|
||||||
|
|
||||||
|
brg_bus dd ?
|
||||||
|
brg_devfn dd ?
|
@ -1,289 +0,0 @@
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
;; ;;
|
|
||||||
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
|
|
||||||
;; Distributed under terms of the GNU General Public License ;;
|
|
||||||
;; ;;
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
|
|
||||||
AD_LOSEL equ BIT5
|
|
||||||
AD_HPSEL equ BIT10
|
|
||||||
|
|
||||||
align 4
|
|
||||||
proc detect_codec
|
|
||||||
locals
|
|
||||||
codec_id dd ?
|
|
||||||
endl
|
|
||||||
|
|
||||||
stdcall codec_read, dword 0x7C
|
|
||||||
shl eax, 16
|
|
||||||
|
|
||||||
|
|
||||||
mov [codec_id], eax
|
|
||||||
|
|
||||||
stdcall codec_read, dword 0x7E
|
|
||||||
or eax, [codec_id]
|
|
||||||
|
|
||||||
|
|
||||||
mov [codec.chip_id], eax
|
|
||||||
|
|
||||||
and eax, 0xFFFFFF00
|
|
||||||
|
|
||||||
mov edi, codecs
|
|
||||||
@@:
|
|
||||||
mov ebx, [edi]
|
|
||||||
test ebx, ebx
|
|
||||||
jz .unknown
|
|
||||||
|
|
||||||
cmp eax, ebx
|
|
||||||
jne .next
|
|
||||||
mov eax, [edi+4]
|
|
||||||
mov [codec.ac_vendor_ids], eax
|
|
||||||
mov esi, eax
|
|
||||||
call SysMsgBoardStr
|
|
||||||
stdcall detect_chip, [edi+8]
|
|
||||||
|
|
||||||
ret
|
|
||||||
.next:
|
|
||||||
add edi, 12
|
|
||||||
jmp @B
|
|
||||||
.unknown:
|
|
||||||
mov [codec.ac_vendor_ids], ac_unknown
|
|
||||||
mov [codec.chip_ids], chip_unknown
|
|
||||||
|
|
||||||
mov esi, chip_unknown
|
|
||||||
call SysMsgBoardStr
|
|
||||||
mov eax, [codec.chip_id]
|
|
||||||
call dword2str
|
|
||||||
call SysMsgBoardStr
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
align 4
|
|
||||||
proc detect_chip stdcall, chip_tab:dword
|
|
||||||
|
|
||||||
mov eax, [codec.chip_id]
|
|
||||||
and eax, 0xFF
|
|
||||||
|
|
||||||
mov edi, [chip_tab]
|
|
||||||
@@:
|
|
||||||
mov ebx, [edi]
|
|
||||||
cmp ebx, 0xFF
|
|
||||||
je .unknown
|
|
||||||
|
|
||||||
cmp eax,ebx
|
|
||||||
jne .next
|
|
||||||
mov eax, [edi+4]
|
|
||||||
mov [codec.chip_ids], eax
|
|
||||||
mov esi, eax
|
|
||||||
call SysMsgBoardStr
|
|
||||||
ret
|
|
||||||
.next:
|
|
||||||
add edi, 8
|
|
||||||
jmp @b
|
|
||||||
.unknown:
|
|
||||||
mov [codec.chip_ids], chip_unknown
|
|
||||||
mov esi, chip_unknown
|
|
||||||
call SysMsgBoardStr
|
|
||||||
mov eax, [codec.chip_id]
|
|
||||||
call dword2str
|
|
||||||
call SysMsgBoardStr
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
align 4
|
|
||||||
proc setup_codec
|
|
||||||
|
|
||||||
xor eax, eax
|
|
||||||
stdcall codec_write, dword CODEC_AUX_VOL
|
|
||||||
|
|
||||||
mov eax, 0x0B0B
|
|
||||||
stdcall codec_write, dword CODEC_MASTER_VOL_REG
|
|
||||||
|
|
||||||
mov ax, 0x08
|
|
||||||
stdcall codec_write, dword 0x0C
|
|
||||||
|
|
||||||
mov ax, 0x0808
|
|
||||||
stdcall codec_write, dword CODEC_PCM_OUT_REG
|
|
||||||
|
|
||||||
mov ax, 0x0808
|
|
||||||
stdcall codec_write, dword 0x10
|
|
||||||
|
|
||||||
mov ax, 0x0808
|
|
||||||
stdcall codec_write, dword 0x12
|
|
||||||
|
|
||||||
mov ax, 0x0808
|
|
||||||
stdcall codec_write, dword 0x16
|
|
||||||
|
|
||||||
|
|
||||||
stdcall codec_read, dword CODEC_EXT_AUDIO_CTRL_REG
|
|
||||||
and eax, 0FFFFh - BIT1 ; clear DRA (BIT1)
|
|
||||||
or eax, BIT0 ; set VRA (BIT0)
|
|
||||||
stdcall codec_write, dword CODEC_EXT_AUDIO_CTRL_REG
|
|
||||||
|
|
||||||
stdcall set_sample_rate, dword 48000
|
|
||||||
|
|
||||||
.init_error:
|
|
||||||
xor eax, eax ; exit with error
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
|
|
||||||
; param
|
|
||||||
; eax= volume -10000 - 0 for both channels
|
|
||||||
|
|
||||||
align 4
|
|
||||||
set_master_vol:
|
|
||||||
cmp eax, 0
|
|
||||||
jl @F
|
|
||||||
xor eax, eax
|
|
||||||
jmp .set
|
|
||||||
@@:
|
|
||||||
cmp eax, -9450
|
|
||||||
jg .set
|
|
||||||
mov eax, -9450 ;clamp into 6 bits
|
|
||||||
.set:
|
|
||||||
cdq
|
|
||||||
mov ebx, -150
|
|
||||||
idiv ebx
|
|
||||||
mov ah, al
|
|
||||||
stdcall codec_write, dword CODEC_MASTER_VOL_REG
|
|
||||||
xor eax, eax
|
|
||||||
ret
|
|
||||||
|
|
||||||
align 4
|
|
||||||
proc get_master_vol stdcall, pvol:dword
|
|
||||||
|
|
||||||
stdcall codec_read, dword CODEC_MASTER_VOL_REG
|
|
||||||
and eax, 0x3F
|
|
||||||
imul eax, -150
|
|
||||||
mov ebx, [pvol]
|
|
||||||
mov [ebx], eax
|
|
||||||
xor eax, eax
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
align 4
|
|
||||||
proc set_sample_rate stdcall, rate:dword
|
|
||||||
mov eax, [rate]
|
|
||||||
stdcall codec_write, dword CODEC_PCM_FRONT_DACRATE_REG
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
patch_AD:
|
|
||||||
stdcall codec_read, 0x76
|
|
||||||
or ax, BIT5+BIT10
|
|
||||||
stdcall codec_write, 0x76
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
align 16
|
|
||||||
ac_unknown db 'unknown manufacturer',13,10,0
|
|
||||||
ac_Realtek db 'Realtek Semiconductor',13,10,0
|
|
||||||
ac_Analog db 'Analog Devices',13,10,0
|
|
||||||
ac_CMedia db 'C-Media Electronics',13,10,0
|
|
||||||
ac_Cirrus db 'Cirrus Logic',13,10,0
|
|
||||||
|
|
||||||
chip_unknown db 'unknown codec id ', 0
|
|
||||||
|
|
||||||
CHIP_ANALOG equ 0x41445300
|
|
||||||
CHIP_REALTEK equ 0x414C4700
|
|
||||||
CHIP_CMEDIA equ 0x434D4900
|
|
||||||
CHIP_CIRRUS equ 0x43525900
|
|
||||||
|
|
||||||
align 16
|
|
||||||
codecs dd CHIP_ANALOG, ac_Analog, chips_Analog
|
|
||||||
dd CHIP_CMEDIA, ac_CMedia, chips_CMedia
|
|
||||||
dd CHIP_REALTEK,ac_Realtek, chips_Realtek
|
|
||||||
dd CHIP_CIRRUS, ac_Cirrus, chips_Cirrus
|
|
||||||
dd 0
|
|
||||||
|
|
||||||
align 16
|
|
||||||
chips_Analog dd 0x03, chip_AD1819
|
|
||||||
dd 0x40, chip_AD1881
|
|
||||||
dd 0x48, chip_AD1881A
|
|
||||||
dd 0x60, chip_AD1884
|
|
||||||
dd 0x61, chip_AD1886
|
|
||||||
dd 0x62, chip_AD1887
|
|
||||||
dd 0x63, chip_AD1886A
|
|
||||||
dd 0x70, chip_AD1980
|
|
||||||
dd 0x75, chip_AD1985
|
|
||||||
dd 0xFF
|
|
||||||
|
|
||||||
chips_Realtek:
|
|
||||||
dd 0x10, chip_ALC201a
|
|
||||||
dd 0x20, chip_ALC650
|
|
||||||
dd 0x21, chip_ALC650D
|
|
||||||
dd 0x22, chip_ALC650E
|
|
||||||
dd 0x23, chip_ALC650F
|
|
||||||
dd 0x60, chip_ALC655
|
|
||||||
dd 0x80, chip_ALC658
|
|
||||||
dd 0x81, chip_ALC658D
|
|
||||||
dd 0x90, chip_ALC850
|
|
||||||
dd 0xFF
|
|
||||||
|
|
||||||
chips_CMedia dd 0x41, chip_CM9738
|
|
||||||
dd 0x61, chip_CM9739
|
|
||||||
dd 0x69, chip_CM9780
|
|
||||||
dd 0x78, chip_CM9761
|
|
||||||
dd 0x82, chip_CM9761
|
|
||||||
dd 0x83, chip_CM9761
|
|
||||||
dd 0xFF
|
|
||||||
|
|
||||||
chips_Cirrus dd 0x00, chip_CS4297
|
|
||||||
dd 0x10, chip_CS4297A
|
|
||||||
dd 0x20, chip_CS4298
|
|
||||||
dd 0x28, chip_CS4294
|
|
||||||
dd 0x30, chip_CS4299
|
|
||||||
dd 0x34, chip_CS4299D
|
|
||||||
dd 0x48, chip_CS4201
|
|
||||||
dd 0x58, chip_CS4205
|
|
||||||
dd 0x60, chip_CS4291
|
|
||||||
dd 0x70, chip_CS4202
|
|
||||||
dd 0xFF
|
|
||||||
|
|
||||||
|
|
||||||
align 16
|
|
||||||
;Analog Devices
|
|
||||||
chip_AD1819 db 'AD1819 ',0dh,0ah,00h
|
|
||||||
chip_AD1881 db 'AD1881 ',0dh,0ah,00h
|
|
||||||
chip_AD1881A db 'AD1881A',0dh,0ah,00h
|
|
||||||
chip_AD1884 db 'AD1885 ',0dh,0ah,00h
|
|
||||||
chip_AD1885 db 'AD1885 ',0dh,0ah,00h
|
|
||||||
chip_AD1886 db 'AD1886 ',0dh,0ah,00h
|
|
||||||
chip_AD1886A db 'AD1886A',0dh,0ah,00h
|
|
||||||
chip_AD1887 db 'AD1887 ',0dh,0ah,00h
|
|
||||||
chip_AD1980 db 'AD1980 ',0dh,0ah,00h
|
|
||||||
chip_AD1985 db 'AD1985 ',0dh,0ah,00h
|
|
||||||
|
|
||||||
;Realtek
|
|
||||||
chip_ALC201a db 'ALC201a',0dh,0ah,00h
|
|
||||||
chip_ALC650 db 'ALC650 ',0dh,0ah,00h
|
|
||||||
chip_ALC650D db 'ALC650D',0dh,0ah,00h
|
|
||||||
chip_ALC650E db 'ALC650E',0dh,0ah,00h
|
|
||||||
chip_ALC650F db 'ALC650F',0dh,0ah,00h
|
|
||||||
chip_ALC655 db 'ALC655 ',0dh,0ah,00h
|
|
||||||
chip_ALC658 db 'ALC658 ',0dh,0ah,00h
|
|
||||||
chip_ALC658D db 'ALC658D',0dh,0ah,00h
|
|
||||||
chip_ALC850 db 'ALC850 ',0dh,0ah,00h
|
|
||||||
|
|
||||||
;CMedia
|
|
||||||
chip_CM9738 db 'CMI9738', 0dh,0ah,0
|
|
||||||
chip_CM9739 db 'CMI9739', 0dh,0ah,0
|
|
||||||
chip_CM9780 db 'CMI9780', 0dh,0ah,0
|
|
||||||
chip_CM9761 db 'CMI9761', 0dh,0ah,0
|
|
||||||
|
|
||||||
;Cirrus
|
|
||||||
chip_CS4297 db 'CS4297',13,10,0
|
|
||||||
chip_CS4297A db 'CS4297A',13,10,0
|
|
||||||
chip_CS4298 db 'CS4298',13,10,0
|
|
||||||
chip_CS4294 db 'CS4294',13,10,0
|
|
||||||
chip_CS4299 db 'CS4299',13,10,0
|
|
||||||
chip_CS4299D db 'CS4299D',13,10,0
|
|
||||||
chip_CS4201 db 'CS4201',13,10,0
|
|
||||||
chip_CS4205 db 'CS4205',13,10,0
|
|
||||||
chip_CS4291 db 'CS4291',13,10,0
|
|
||||||
chip_CS4202 db 'CS4202',13,10,0
|
|
||||||
|
|
||||||
|
|
@ -1,14 +0,0 @@
|
|||||||
Немного переделал драйвер звука для чипа SIS
|
|
||||||
|
|
||||||
-добавил подключение PCI устройства к контроллеру прерывания
|
|
||||||
(БИОС неназначил номер прерывания) назначается IRQ 5
|
|
||||||
-изменил чтение регистра кодека (считывание и запись производится через 'семафор')
|
|
||||||
|
|
||||||
в остальном оставил все как есть :)
|
|
||||||
|
|
||||||
SIS.obj - просто бинарник
|
|
||||||
sis.asm - исходник
|
|
||||||
codec.inc - (добавил номер определения своего кодека)
|
|
||||||
|
|
||||||
|
|
||||||
G@K
|
|
File diff suppressed because it is too large
Load Diff
@ -11,10 +11,10 @@ entry START
|
|||||||
DEBUG = 1
|
DEBUG = 1
|
||||||
|
|
||||||
section '.flat' code readable writable executable
|
section '.flat' code readable writable executable
|
||||||
|
|
||||||
include '../proc32.inc'
|
include '../proc32.inc'
|
||||||
include '../struct.inc'
|
include '../struct.inc'
|
||||||
include '../macros.inc'
|
include '../macros.inc'
|
||||||
|
include '../peimport.inc'
|
||||||
|
|
||||||
VID_INTEL = 0x8086
|
VID_INTEL = 0x8086
|
||||||
VID_NVIDIA = 0x10DE
|
VID_NVIDIA = 0x10DE
|
||||||
@ -160,20 +160,27 @@ struct SRV
|
|||||||
ends
|
ends
|
||||||
|
|
||||||
|
|
||||||
proc START c, state:dword, cmdline:dword
|
proc START c uses ebx esi edi, state:dword, cmdline:dword
|
||||||
|
|
||||||
|
mov eax, [srv_entry]
|
||||||
cmp [state], 1
|
cmp [state], 1
|
||||||
jne .fail
|
jne .stop
|
||||||
|
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgInit
|
mov esi, msgInit
|
||||||
invoke SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
|
|
||||||
|
test eax, eax
|
||||||
|
jnz .done
|
||||||
call detect_controller
|
call detect_controller
|
||||||
ret
|
ret
|
||||||
|
.stop:
|
||||||
.fail:
|
test eax, eax
|
||||||
|
jz .done
|
||||||
|
leave
|
||||||
|
jmp eax
|
||||||
|
.done:
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
@ -229,10 +236,6 @@ endl
|
|||||||
mov [bus], eax
|
mov [bus], eax
|
||||||
cmp eax, [last_bus]
|
cmp eax, [last_bus]
|
||||||
jna .next_bus
|
jna .next_bus
|
||||||
if DEBUG
|
|
||||||
mov esi, msgNotFound
|
|
||||||
invoke SysMsgBoardStr
|
|
||||||
end if
|
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
ret
|
ret
|
||||||
.found:
|
.found:
|
||||||
@ -402,13 +405,10 @@ emu10k1x db 'EMU10K1X', 0
|
|||||||
intelhda db 'INTEL_HDA', 0
|
intelhda db 'INTEL_HDA', 0
|
||||||
|
|
||||||
msgInit db 'Detecting hardware...',13,10,0
|
msgInit db 'Detecting hardware...',13,10,0
|
||||||
msgNotFound db 'No compatible soundcard found!',13,10,0
|
msgFail db 'No compatible soundcard found!',13,10,0
|
||||||
msgFail db 'Failed',13,10,0
|
|
||||||
msgLoading db 'Loading ',0
|
msgLoading db 'Loading ',0
|
||||||
msgNewline db 13,10,0
|
msgNewline db 13,10,0
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
data fixups
|
data fixups
|
||||||
end data
|
end data
|
||||||
|
|
||||||
include '../peimport.inc'
|
|
@ -5,13 +5,11 @@
|
|||||||
;; ;;
|
;; ;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
format MS COFF
|
format PE DLL native 0.05
|
||||||
|
entry START
|
||||||
|
|
||||||
DEBUG equ 1
|
DEBUG equ 1
|
||||||
|
|
||||||
include 'proc32.inc'
|
|
||||||
include 'imports.inc'
|
|
||||||
|
|
||||||
API_VERSION equ 0x01000100
|
API_VERSION equ 0x01000100
|
||||||
|
|
||||||
USE_COM_IRQ equ 0 ;make irq 3 and irq 4 available for PCI devices
|
USE_COM_IRQ equ 0 ;make irq 3 and irq 4 available for PCI devices
|
||||||
@ -311,35 +309,22 @@ struc CTRL_INFO
|
|||||||
.codec_id dd ?
|
.codec_id dd ?
|
||||||
}
|
}
|
||||||
|
|
||||||
struc IOCTL
|
|
||||||
{ .handle dd ?
|
|
||||||
.io_code dd ?
|
|
||||||
.input dd ?
|
|
||||||
.inp_size dd ?
|
|
||||||
.output dd ?
|
|
||||||
.out_size dd ?
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual at 0
|
|
||||||
IOCTL IOCTL
|
|
||||||
end virtual
|
|
||||||
|
|
||||||
EVENT_NOTIFY equ 0x00000200
|
EVENT_NOTIFY equ 0x00000200
|
||||||
|
|
||||||
public START
|
section '.flat' code readable writable executable
|
||||||
public service_proc
|
include '../struct.inc'
|
||||||
public version
|
include '../macros.inc'
|
||||||
|
include '../proc32.inc'
|
||||||
|
include '../peimport.inc'
|
||||||
|
|
||||||
section '.flat' code readable align 16
|
proc START c, state:dword, cmdline:dword
|
||||||
|
|
||||||
proc START stdcall, state:dword
|
|
||||||
|
|
||||||
cmp [state], 1
|
cmp [state], 1
|
||||||
jne .stop
|
jne .stop
|
||||||
|
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgInit
|
mov esi, msgInit
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
|
|
||||||
call detect_controller
|
call detect_controller
|
||||||
@ -348,9 +333,9 @@ proc START stdcall, state:dword
|
|||||||
|
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, [ctrl.vendor_ids]
|
mov esi, [ctrl.vendor_ids]
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
mov esi, [ctrl.ctrl_ids]
|
mov esi, [ctrl.ctrl_ids]
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
|
|
||||||
call init_controller
|
call init_controller
|
||||||
@ -364,10 +349,10 @@ proc START stdcall, state:dword
|
|||||||
call setup_codec
|
call setup_codec
|
||||||
|
|
||||||
mov esi, msgPrimBuff
|
mov esi, msgPrimBuff
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
call create_primary_buff
|
call create_primary_buff
|
||||||
mov esi, msgDone
|
mov esi, msgDone
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
if IRQ_REMAP
|
if IRQ_REMAP
|
||||||
pushf
|
pushf
|
||||||
@ -386,7 +371,7 @@ proc START stdcall, state:dword
|
|||||||
mov al, ah
|
mov al, ah
|
||||||
out 0xA1, al
|
out 0xA1, al
|
||||||
|
|
||||||
stdcall PciWrite8, 0, 0xF8, 0x61, IRQ_LINE ;remap IRQ
|
invoke PciWrite8, 0, 0xF8, 0x61, IRQ_LINE ;remap IRQ
|
||||||
|
|
||||||
mov dx, 0x4d0 ;8259 ELCR1
|
mov dx, 0x4d0 ;8259 ELCR1
|
||||||
in al, dx
|
in al, dx
|
||||||
@ -395,7 +380,7 @@ proc START stdcall, state:dword
|
|||||||
mov [ctrl.int_line], IRQ_LINE
|
mov [ctrl.int_line], IRQ_LINE
|
||||||
popf
|
popf
|
||||||
mov esi, msgRemap
|
mov esi, msgRemap
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
|
|
||||||
mov eax, VALID_IRQ
|
mov eax, VALID_IRQ
|
||||||
@ -408,19 +393,19 @@ proc START stdcall, state:dword
|
|||||||
bt eax, ebx
|
bt eax, ebx
|
||||||
jnc .fail_msg
|
jnc .fail_msg
|
||||||
|
|
||||||
stdcall AttachIntHandler, ebx, ac97_irq_VIA, dword 0
|
invoke AttachIntHandler, ebx, ac97_irq_VIA, 0
|
||||||
.reg:
|
.reg:
|
||||||
stdcall RegService, sz_sound_srv, service_proc
|
invoke RegService, sz_sound_srv, service_proc
|
||||||
ret
|
ret
|
||||||
.fail:
|
.fail:
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgFail
|
mov esi, msgFail
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
ret
|
ret
|
||||||
.fail_msg:
|
.fail_msg:
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
ret
|
ret
|
||||||
.stop:
|
.stop:
|
||||||
@ -456,7 +441,7 @@ proc service_proc stdcall, ioctl:dword
|
|||||||
jne @F
|
jne @F
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgPlay
|
mov esi, msgPlay
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
call play
|
call play
|
||||||
ret
|
ret
|
||||||
@ -465,7 +450,7 @@ proc service_proc stdcall, ioctl:dword
|
|||||||
jne @F
|
jne @F
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgStop
|
mov esi, msgStop
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
call stop
|
call stop
|
||||||
ret
|
ret
|
||||||
@ -552,7 +537,7 @@ endp
|
|||||||
align 4
|
align 4
|
||||||
proc create_primary_buff
|
proc create_primary_buff
|
||||||
|
|
||||||
stdcall KernelAlloc, 0x10000
|
invoke KernelAlloc, 0x10000
|
||||||
mov [ctrl.buffer], eax
|
mov [ctrl.buffer], eax
|
||||||
|
|
||||||
mov edi, eax
|
mov edi, eax
|
||||||
@ -562,7 +547,7 @@ proc create_primary_buff
|
|||||||
rep stosd
|
rep stosd
|
||||||
|
|
||||||
mov eax, [ctrl.buffer]
|
mov eax, [ctrl.buffer]
|
||||||
call GetPgAddr
|
invoke GetPgAddr
|
||||||
mov edi, pcmout_bdl
|
mov edi, pcmout_bdl
|
||||||
stosd
|
stosd
|
||||||
mov eax, 0x80004000
|
mov eax, 0x80004000
|
||||||
@ -590,7 +575,7 @@ proc create_primary_buff
|
|||||||
|
|
||||||
mov eax, pcmout_bdl
|
mov eax, pcmout_bdl
|
||||||
mov ebx, eax
|
mov ebx, eax
|
||||||
call GetPgAddr
|
invoke GetPgAddr
|
||||||
and ebx, 0xFFF
|
and ebx, 0xFFF
|
||||||
add eax, ebx
|
add eax, ebx
|
||||||
|
|
||||||
@ -669,7 +654,7 @@ proc detect_controller
|
|||||||
xor eax, eax
|
xor eax, eax
|
||||||
mov [bus], eax
|
mov [bus], eax
|
||||||
inc eax
|
inc eax
|
||||||
call PciApi
|
invoke PciApi
|
||||||
cmp eax, -1
|
cmp eax, -1
|
||||||
je .err
|
je .err
|
||||||
|
|
||||||
@ -678,7 +663,7 @@ proc detect_controller
|
|||||||
.next_bus:
|
.next_bus:
|
||||||
and [devfn], 0
|
and [devfn], 0
|
||||||
.next_dev:
|
.next_dev:
|
||||||
stdcall PciRead32, [bus], [devfn], dword 0
|
invoke PciRead32, [bus], [devfn], dword 0
|
||||||
test eax, eax
|
test eax, eax
|
||||||
jz .next
|
jz .next
|
||||||
cmp eax, -1
|
cmp eax, -1
|
||||||
@ -738,7 +723,7 @@ endp
|
|||||||
align 4
|
align 4
|
||||||
proc init_controller
|
proc init_controller
|
||||||
|
|
||||||
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 4
|
invoke PciRead32, [ctrl.bus], [ctrl.devfn], dword 4
|
||||||
mov ebx, eax
|
mov ebx, eax
|
||||||
and eax, 0xFFFF
|
and eax, 0xFFFF
|
||||||
mov [ctrl.pci_cmd], eax
|
mov [ctrl.pci_cmd], eax
|
||||||
@ -746,27 +731,27 @@ proc init_controller
|
|||||||
mov [ctrl.pci_stat], ebx
|
mov [ctrl.pci_stat], ebx
|
||||||
|
|
||||||
mov esi, msgPciCmd
|
mov esi, msgPciCmd
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
mov esi, msgPciStat
|
mov esi, msgPciStat
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
mov eax, [ctrl.pci_stat]
|
mov eax, [ctrl.pci_stat]
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
mov esi, msgCtrlIsaIo
|
mov esi, msgCtrlIsaIo
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x10
|
invoke PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x10
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
and eax, 0xFFC0
|
and eax, 0xFFC0
|
||||||
mov [ctrl.ctrl_io_base], eax
|
mov [ctrl.ctrl_io_base], eax
|
||||||
|
|
||||||
.default:
|
.default:
|
||||||
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x3C
|
invoke PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x3C
|
||||||
and eax, 0xFF
|
and eax, 0xFF
|
||||||
@@:
|
@@:
|
||||||
mov [ctrl.int_line], eax
|
mov [ctrl.int_line], eax
|
||||||
@ -813,19 +798,19 @@ proc init_codec
|
|||||||
endl
|
endl
|
||||||
|
|
||||||
mov esi, msgControl
|
mov esi, msgControl
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
stdcall PciRead8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_CTRL
|
invoke PciRead8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_CTRL
|
||||||
and eax, 0xFF
|
and eax, 0xFF
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
mov esi, msgStatus
|
mov esi, msgStatus
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
stdcall PciRead8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_STAT
|
invoke PciRead8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_STAT
|
||||||
and eax, 0xFF
|
and eax, 0xFF
|
||||||
push eax
|
push eax
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
pop eax
|
pop eax
|
||||||
|
|
||||||
test eax, VIA_ACLINK_C00_READY
|
test eax, VIA_ACLINK_C00_READY
|
||||||
@ -854,7 +839,7 @@ endp
|
|||||||
|
|
||||||
align 4
|
align 4
|
||||||
proc reset_codec
|
proc reset_codec
|
||||||
stdcall PciWrite8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_CTRL, \
|
invoke PciWrite8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_CTRL, \
|
||||||
VIA_ACLINK_CTRL_ENABLE or VIA_ACLINK_CTRL_RESET or VIA_ACLINK_CTRL_SYNC
|
VIA_ACLINK_CTRL_ENABLE or VIA_ACLINK_CTRL_RESET or VIA_ACLINK_CTRL_SYNC
|
||||||
mov eax, 100000 ; wait 100 ms
|
mov eax, 100000 ; wait 100 ms
|
||||||
call StallExec
|
call StallExec
|
||||||
@ -864,14 +849,14 @@ proc reset_codec
|
|||||||
|
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgCFail
|
mov esi, msgCFail
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
xor eax, eax ; timeout error
|
xor eax, eax ; timeout error
|
||||||
ret
|
ret
|
||||||
.ok:
|
.ok:
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgResetOk
|
mov esi, msgResetOk
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
inc eax
|
inc eax
|
||||||
@ -885,11 +870,11 @@ proc cold_reset
|
|||||||
counter dd ?
|
counter dd ?
|
||||||
endl
|
endl
|
||||||
|
|
||||||
stdcall PciWrite8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_CTRL, dword 0
|
invoke PciWrite8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_CTRL, dword 0
|
||||||
|
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgCold
|
mov esi, msgCold
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
|
|
||||||
mov eax, 100000 ; wait 100 ms ;400000 ; wait 400 ms
|
mov eax, 100000 ; wait 100 ms ;400000 ; wait 400 ms
|
||||||
@ -897,11 +882,11 @@ proc cold_reset
|
|||||||
|
|
||||||
;; ACLink on, deassert ACLink reset, VSR, SGD data out
|
;; ACLink on, deassert ACLink reset, VSR, SGD data out
|
||||||
;; note - FM data out has trouble with non VRA codecs !!
|
;; note - FM data out has trouble with non VRA codecs !!
|
||||||
stdcall PciWrite8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_CTRL, dword VIA_ACLINK_CTRL_INIT
|
invoke PciWrite8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_CTRL, dword VIA_ACLINK_CTRL_INIT
|
||||||
|
|
||||||
mov [counter], 16 ; total 20*100 ms = 2s
|
mov [counter], 16 ; total 20*100 ms = 2s
|
||||||
.wait:
|
.wait:
|
||||||
stdcall PciRead8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_STAT
|
invoke PciRead8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_STAT
|
||||||
test eax, VIA_ACLINK_C00_READY
|
test eax, VIA_ACLINK_C00_READY
|
||||||
jnz .ok
|
jnz .ok
|
||||||
|
|
||||||
@ -913,7 +898,7 @@ proc cold_reset
|
|||||||
|
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgCRFail
|
mov esi, msgCRFail
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
|
|
||||||
.fail:
|
.fail:
|
||||||
@ -921,18 +906,18 @@ proc cold_reset
|
|||||||
ret
|
ret
|
||||||
.ok:
|
.ok:
|
||||||
mov esi, msgControl
|
mov esi, msgControl
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
stdcall PciRead8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_CTRL
|
invoke PciRead8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_CTRL
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
|
|
||||||
mov esi, msgStatus
|
mov esi, msgStatus
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
stdcall PciRead8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_STAT
|
invoke PciRead8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_STAT
|
||||||
and eax, 0xFF
|
and eax, 0xFF
|
||||||
push eax
|
push eax
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
pop eax
|
pop eax
|
||||||
|
|
||||||
test eax, VIA_ACLINK_C00_READY ;CTRL_ST_CREADY
|
test eax, VIA_ACLINK_C00_READY ;CTRL_ST_CREADY
|
||||||
@ -1087,7 +1072,7 @@ proc codec_read stdcall, ac_reg:dword ; reg = edx, reval = eax
|
|||||||
.err:
|
.err:
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgCInvalid
|
mov esi, msgCInvalid
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
mov eax, -1 ; invalid codec error
|
mov eax, -1 ; invalid codec error
|
||||||
ret
|
ret
|
||||||
@ -1120,7 +1105,7 @@ proc codec_write stdcall, ac_reg:dword
|
|||||||
.err:
|
.err:
|
||||||
if DEBUG
|
if DEBUG
|
||||||
mov esi, msgCFail
|
mov esi, msgCFail
|
||||||
call SysMsgBoardStr
|
invoke SysMsgBoardStr
|
||||||
end if
|
end if
|
||||||
;mov eax, -1 ; codec not ready error
|
;mov eax, -1 ; codec not ready error
|
||||||
ret
|
ret
|
||||||
@ -1244,8 +1229,6 @@ devices dd (CTRL_VT82C686 shl 16)+VID_VIA,msg_VT82C686,set_VIA
|
|||||||
dd 0 ;terminator
|
dd 0 ;terminator
|
||||||
|
|
||||||
|
|
||||||
version dd (5 shl 16) or (API_VERSION and 0xFFFF)
|
|
||||||
|
|
||||||
msg_VT82C686 db 'VT82C686', 13,10, 0
|
msg_VT82C686 db 'VT82C686', 13,10, 0
|
||||||
msg_VT8233 db 'VT8233', 13,10, 0
|
msg_VT8233 db 'VT8233', 13,10, 0
|
||||||
msg_VIA db 'VIA' , 13,10, 0
|
msg_VIA db 'VIA' , 13,10, 0
|
||||||
@ -1284,9 +1267,11 @@ msgCtrlIsaIo db 'controller io base ',0
|
|||||||
;msgMixMMIo db 'codec mmio base ',0
|
;msgMixMMIo db 'codec mmio base ',0
|
||||||
;msgIrqMap db 'AC97 irq map as ',0
|
;msgIrqMap db 'AC97 irq map as ',0
|
||||||
|
|
||||||
|
align 4
|
||||||
|
data fixups
|
||||||
|
end data
|
||||||
|
|
||||||
section '.data' data readable writable align 16
|
align 8
|
||||||
|
|
||||||
pcmout_bdl rq 32
|
pcmout_bdl rq 32
|
||||||
buff_list rd 32
|
buff_list rd 32
|
||||||
|
|
@ -1,438 +0,0 @@
|
|||||||
; Stub of videodriver for RDC Semiconductor Co. M2010/M2012 videocards (controller names: R3306/R3308).
|
|
||||||
; It is used in SoC produced by DMP Electronics Inc.:
|
|
||||||
; Vortex86MX (contains RDC M2010 graphics card, appears in eBox-3300MX)
|
|
||||||
; Vortex86MX+ (contains RDC M2012 graphics card, appears in eBox-3310MX)
|
|
||||||
; Link to manufacturers websites -
|
|
||||||
; RDC Semiconductor Co.: http://www.rdc.com.tw
|
|
||||||
; DM&P Electronics Inc.: http://www.dmp.com.tw and http://www.compactpc.com.tw
|
|
||||||
; Code stolen from vidintel.asm driver (c) by CleverMouse and adapted for RDC.
|
|
||||||
|
|
||||||
; When the start procedure gets control,
|
|
||||||
; it tries to detect preferred resolution,
|
|
||||||
; sets the detected resolution assuming 32-bpp VESA mode and exits
|
|
||||||
; (without registering a service).
|
|
||||||
; Detection can be overloaded with compile-time settings
|
|
||||||
; use_predefined_mode/predefined_width/predefined_height.
|
|
||||||
|
|
||||||
; set predefined resolution here
|
|
||||||
use_predefined_mode = 0;1
|
|
||||||
predefined_width = 0;1366
|
|
||||||
predefined_height = 0;768
|
|
||||||
|
|
||||||
; standard driver stuff
|
|
||||||
format MS COFF
|
|
||||||
|
|
||||||
DEBUG = 1
|
|
||||||
|
|
||||||
include 'proc32.inc'
|
|
||||||
include 'imports.inc'
|
|
||||||
|
|
||||||
public START
|
|
||||||
public version
|
|
||||||
|
|
||||||
section '.flat' code readable align 16
|
|
||||||
; the start procedure (see the description above)
|
|
||||||
START:
|
|
||||||
; 1. Detect device. Abort if not found.
|
|
||||||
push esi
|
|
||||||
call DetectDevice
|
|
||||||
test esi, esi
|
|
||||||
jz .return0
|
|
||||||
|
|
||||||
;{START}yogev_ezra: temporary exit after detection
|
|
||||||
pusha
|
|
||||||
mov esi, exitmsg
|
|
||||||
call SysMsgBoardStr
|
|
||||||
popa
|
|
||||||
jmp .return0
|
|
||||||
;{END}yogev_ezra: temporary exit after detection
|
|
||||||
|
|
||||||
; 2. Detect optimal mode unless the mode is given explicitly. Abort if failed.
|
|
||||||
if use_predefined_mode = 0
|
|
||||||
call DetectMode
|
|
||||||
end if
|
|
||||||
cmp [width], 0
|
|
||||||
jz .return0_cleanup
|
|
||||||
; 3. Set the detected mode.
|
|
||||||
call SetMode
|
|
||||||
; 4. Cleanup and return.
|
|
||||||
.return0_cleanup:
|
|
||||||
stdcall FreeKernelSpace, esi
|
|
||||||
.return0:
|
|
||||||
pop esi
|
|
||||||
xor eax, eax
|
|
||||||
ret 4
|
|
||||||
|
|
||||||
; check that there is RDC videocard
|
|
||||||
; if so, map MMIO registers and set internal variables
|
|
||||||
; esi points to MMIO block; NULL means no device
|
|
||||||
DetectDevice:
|
|
||||||
; 1. Sanity check: check that we are dealing with RDC videocard.
|
|
||||||
; Integrated video device for RDC is always at PCI:0:13:0 (bus:dev:fn=0:0d:0)
|
|
||||||
xor esi, esi ; initialize return value to NULL
|
|
||||||
; 1a. Get PCI VendorID and DeviceID.
|
|
||||||
push esi ; in: reg=0 (register) -> register 00 means return DeviceID (bits 16-31) + VendorID (bits 0-15)
|
|
||||||
push 68h ; in: devfn=13:0 | device:5bit (0Dh = 1101) + func:3bit (0 = 000) -> total:1byte (1101000b = 68h)
|
|
||||||
push esi ; in: bus=0
|
|
||||||
call PciRead32
|
|
||||||
; 1b. loword(eax) = ax = VendorID, hiword(eax) = DeviceID.
|
|
||||||
; Test whether we have RDC Semiconductor Co. chipset.
|
|
||||||
cmp ax, 17F3h ;VendorID 0x17F3, 'RDC Semiconductor Co.'
|
|
||||||
jnz .return
|
|
||||||
; 1c. Say hi including DeviceID.
|
|
||||||
shr eax, 10h ; now, ax = HIWORD(eax) = PCI DeviceID
|
|
||||||
push edi
|
|
||||||
pusha
|
|
||||||
mov edi, pciid_text ; edi='0000'
|
|
||||||
call WriteWord
|
|
||||||
mov esi, hellomsg
|
|
||||||
call SysMsgBoardStr
|
|
||||||
popa
|
|
||||||
; 1d. Test whether we know this DeviceID.
|
|
||||||
; If this is the case, remember the position of the device in line of RDC cards;
|
|
||||||
; this knowledge will be useful later.
|
|
||||||
; Tested on devices with id: 17F3:2010, 17F3:2012.
|
|
||||||
mov ecx, pciids_num
|
|
||||||
mov edi, pciids
|
|
||||||
repnz scasw
|
|
||||||
pop edi
|
|
||||||
jnz .return_unknown_pciid
|
|
||||||
sub ecx, pciids_num - 1
|
|
||||||
neg ecx
|
|
||||||
mov [deviceType], ecx
|
|
||||||
; 1e. Continue saying hi with positive intonation.
|
|
||||||
pusha
|
|
||||||
mov esi, knownmsg
|
|
||||||
call SysMsgBoardStr
|
|
||||||
popa
|
|
||||||
; 2. Prepare MMIO region to control the card.
|
|
||||||
; 2a. Read MMIO physical address from PCI config space.
|
|
||||||
; According to RDC M2010/M2012 registers manual, their memory-mapped I/O space is located at Base address #1
|
|
||||||
push 14h ; in: reg=14h (register) -> register 14h means Base address #1 (BAR1) in PCI configuration space
|
|
||||||
push 68h ; in: devfn=13:0 | device:5bit (0Dh = 1101) + func:3bit (0 = 000) -> total:1byte (1101000b = 68h)
|
|
||||||
push esi ; in: bus=0
|
|
||||||
call PciRead32
|
|
||||||
; 2b. Mask out PCI region type, lower 4 bits.
|
|
||||||
and al, not 0xF
|
|
||||||
; 2c. Create virtual mapping of the physical memory.
|
|
||||||
push 1Bh
|
|
||||||
push 100000h
|
|
||||||
push eax
|
|
||||||
call MapIoMem
|
|
||||||
; 3. Return.
|
|
||||||
xchg esi, eax
|
|
||||||
.return:
|
|
||||||
ret
|
|
||||||
; 1f. If we do not know DeviceID, continue saying hi with negative intonation.
|
|
||||||
.return_unknown_pciid:
|
|
||||||
pusha
|
|
||||||
mov esi, unknownmsg
|
|
||||||
call SysMsgBoardStr
|
|
||||||
popa
|
|
||||||
ret
|
|
||||||
|
|
||||||
; Convert word in ax to hexadecimal text in edi, advance edi.
|
|
||||||
WriteWord:
|
|
||||||
; 1. Convert high byte.
|
|
||||||
push eax
|
|
||||||
mov al, ah
|
|
||||||
call WriteByte
|
|
||||||
pop eax
|
|
||||||
; 2. Convert low byte.
|
|
||||||
; Fall through to WriteByte; ret from WriteByte is ret from WriteWord too.
|
|
||||||
|
|
||||||
; Convert byte in al to hexadecimal text in edi, advance edi.
|
|
||||||
WriteByte:
|
|
||||||
; 1. Convert high nibble.
|
|
||||||
push eax
|
|
||||||
shr al, 4
|
|
||||||
call WriteNibble
|
|
||||||
pop eax
|
|
||||||
; 2. Convert low nibble.
|
|
||||||
and al, 0xF
|
|
||||||
; Fall through to WriteNibble; ret from WriteNibble is ret from WriteByte too.
|
|
||||||
|
|
||||||
; Convert nibble in al to hexadecimal text in edi, advance edi.
|
|
||||||
WriteNibble:
|
|
||||||
; Obvious, isn't it?
|
|
||||||
cmp al, 10
|
|
||||||
sbb al, 69h
|
|
||||||
das
|
|
||||||
stosb ; This instruction uses EDI implicitly
|
|
||||||
ret
|
|
||||||
|
|
||||||
if use_predefined_mode = 0
|
|
||||||
; detect resolution of the flat panel
|
|
||||||
DetectMode:
|
|
||||||
push esi edi
|
|
||||||
; 1. Get the location of block of GMBUS* registers.
|
|
||||||
; Starting with Ironlake, GMBUS* registers were moved.
|
|
||||||
add esi, 5100h
|
|
||||||
cmp [deviceType], pciids_num ;ironlake_start
|
|
||||||
jb @f
|
|
||||||
add esi, 0xC0000
|
|
||||||
@@:
|
|
||||||
; 2. Initialize GMBUS engine.
|
|
||||||
mov edi, edid
|
|
||||||
mov ecx, 0x10000
|
|
||||||
@@:
|
|
||||||
test byte [esi+8+1], 80h
|
|
||||||
loopnz @b
|
|
||||||
jnz .fail
|
|
||||||
mov dword [esi], 3
|
|
||||||
test byte [esi+8+1], 4
|
|
||||||
jz .noreset
|
|
||||||
call ResetGMBus
|
|
||||||
jnz .fail
|
|
||||||
.noreset:
|
|
||||||
; 3. Send read command.
|
|
||||||
and dword [esi+20h], 0
|
|
||||||
mov dword [esi+4], 4E8000A1h
|
|
||||||
; 4. Wait for data, writing to the buffer as data arrive.
|
|
||||||
.getdata:
|
|
||||||
mov ecx, 0x10000
|
|
||||||
@@:
|
|
||||||
test byte [esi+8+1], 8
|
|
||||||
loopz @b
|
|
||||||
test byte [esi+8+1], 4
|
|
||||||
jz .dataok
|
|
||||||
call ResetGMBus
|
|
||||||
jmp .fail
|
|
||||||
.dataok:
|
|
||||||
mov eax, [esi+0Ch]
|
|
||||||
stosd
|
|
||||||
cmp edi, edid+80h
|
|
||||||
jb .getdata
|
|
||||||
; 5. Wait for bus idle.
|
|
||||||
mov ecx, 0x10000
|
|
||||||
@@:
|
|
||||||
test byte [esi+8+1], 2
|
|
||||||
loopnz @b
|
|
||||||
; 6. We got EDID; dump it if DEBUG.
|
|
||||||
if DEBUG
|
|
||||||
pusha
|
|
||||||
xor ecx, ecx
|
|
||||||
mov esi, edid
|
|
||||||
mov edi, edid_text
|
|
||||||
.dumploop:
|
|
||||||
lodsb
|
|
||||||
call WriteByte
|
|
||||||
mov al, ' '
|
|
||||||
stosb
|
|
||||||
inc cl
|
|
||||||
test cl, 15
|
|
||||||
jnz @f
|
|
||||||
mov byte [edi-1], 13
|
|
||||||
mov al, 10
|
|
||||||
stosb
|
|
||||||
@@:
|
|
||||||
test cl, cl
|
|
||||||
jns .dumploop
|
|
||||||
mov esi, edidmsg
|
|
||||||
call SysMsgBoardStr
|
|
||||||
popa
|
|
||||||
end if
|
|
||||||
; 7. Test whether EDID is good.
|
|
||||||
; 7a. Signature: 00 FF FF FF FF FF FF 00.
|
|
||||||
mov esi, edid
|
|
||||||
cmp dword [esi], 0xFFFFFF00
|
|
||||||
jnz .fail
|
|
||||||
cmp dword [esi+4], 0x00FFFFFF
|
|
||||||
jnz .fail
|
|
||||||
; 7b. Checksum must be zero.
|
|
||||||
xor edx, edx
|
|
||||||
mov ecx, 80h
|
|
||||||
@@:
|
|
||||||
lodsb
|
|
||||||
add dl, al
|
|
||||||
loop @b
|
|
||||||
jnz .fail
|
|
||||||
; 8. Get width and height from EDID.
|
|
||||||
xor eax, eax
|
|
||||||
mov ah, [esi-80h+3Ah]
|
|
||||||
shr ah, 4
|
|
||||||
mov al, [esi-80h+38h]
|
|
||||||
mov [width], eax
|
|
||||||
mov ah, [esi-80h+3Dh]
|
|
||||||
shr ah, 4
|
|
||||||
mov al, [esi-80h+3Bh]
|
|
||||||
mov [height], eax
|
|
||||||
; 9. Return.
|
|
||||||
.fail:
|
|
||||||
pop edi esi
|
|
||||||
ret
|
|
||||||
|
|
||||||
; reset bus, clear all errors
|
|
||||||
ResetGMBus:
|
|
||||||
; look into the PRM
|
|
||||||
mov dword [esi+4], 80000000h
|
|
||||||
mov dword [esi+4], 0
|
|
||||||
mov ecx, 0x10000
|
|
||||||
@@:
|
|
||||||
test byte [esi+8+1], 2
|
|
||||||
loopnz @b
|
|
||||||
ret
|
|
||||||
end if
|
|
||||||
|
|
||||||
; set resolution [width]*[height]
|
|
||||||
SetMode:
|
|
||||||
; 1. Program the registers of videocard.
|
|
||||||
; look into the PRM
|
|
||||||
cli
|
|
||||||
; or byte [esi+7000Ah], 0Ch ; PIPEACONF: disable Display+Cursor Planes
|
|
||||||
; or byte [esi+7100Ah], 0Ch ; PIPEBCONF: disable Display+Cursor Planes
|
|
||||||
xor eax, eax
|
|
||||||
xor edx, edx
|
|
||||||
cmp [deviceType], pciids_num ;i965_start
|
|
||||||
jb @f
|
|
||||||
mov dl, 9Ch - 84h
|
|
||||||
@@:
|
|
||||||
; or byte [esi+71403h], 80h ; VGACNTRL: VGA Display Disable
|
|
||||||
and byte [esi+70080h], not 27h ; CURACNTR: disable cursor A
|
|
||||||
mov dword [esi+70084h], eax ; CURABASE: force write to CURA* regs
|
|
||||||
and byte [esi+700C0h], not 27h ; CURBCNTR: disable cursor B
|
|
||||||
mov dword [esi+700C4h], eax ; CURBBASE: force write to CURB* regs
|
|
||||||
and byte [esi+70183h], not 80h ; DSPACNTR: disable Primary A Plane
|
|
||||||
mov dword [esi+edx+70184h], eax ; DSPALINOFF/DSPASURF: force write to DSPA* regs
|
|
||||||
and byte [esi+71183h], not 80h ; DSPBCNTR: disable Primary B Plane
|
|
||||||
mov dword [esi+edx+71184h], eax ; DSPBLINOFF/DSPBSURF: force write to DSPB* regs
|
|
||||||
if 1
|
|
||||||
cmp [deviceType], pciids_num ;ironlake_start
|
|
||||||
jae .disable_pipes
|
|
||||||
mov edx, 10000h
|
|
||||||
or byte [esi+70024h], 2 ; PIPEASTAT: clear VBLANK status
|
|
||||||
or byte [esi+71024h], 2 ; PIPEBSTAT: clear VBLANK status
|
|
||||||
.wait_vblank_preironlake1:
|
|
||||||
mov ecx, 1000h
|
|
||||||
loop $
|
|
||||||
test byte [esi+7000Bh], 80h ; PIPEACONF: pipe A active?
|
|
||||||
jz @f
|
|
||||||
test byte [esi+70024h], 2 ; PIPEASTAT: got VBLANK?
|
|
||||||
jz .wait_vblank_preironlake2
|
|
||||||
@@:
|
|
||||||
test byte [esi+7100Bh], 80h ; PIPEBCONF: pipe B active?
|
|
||||||
jz .disable_pipes
|
|
||||||
test byte [esi+71024h], 2 ; PIPEBSTAT: got VBLANK?
|
|
||||||
jnz .disable_pipes
|
|
||||||
.wait_vblank_preironlake2:
|
|
||||||
dec edx
|
|
||||||
jnz .wait_vblank_preironlake1
|
|
||||||
jmp .not_disabled
|
|
||||||
.disable_pipes:
|
|
||||||
end if
|
|
||||||
and byte [esi+7000Bh], not 80h ; PIPEACONF: disable pipe
|
|
||||||
and byte [esi+7100Bh], not 80h ; PIPEBCONF: disable pipe
|
|
||||||
cmp [deviceType], pciids_num ;gen4_start
|
|
||||||
jb .wait_watching_scanline
|
|
||||||
; g45 and later: use special flag from PIPE*CONF
|
|
||||||
mov edx, 10000h
|
|
||||||
@@:
|
|
||||||
mov ecx, 1000h
|
|
||||||
loop $
|
|
||||||
test byte [esi+7000Bh], 40h ; PIPEACONF: wait until pipe disabled
|
|
||||||
jz @f
|
|
||||||
dec edx
|
|
||||||
jnz @b
|
|
||||||
jmp .not_disabled
|
|
||||||
@@:
|
|
||||||
test byte [esi+7100Bh], 40h ; PIPEBCONF: wait until pipe disabled
|
|
||||||
jz .disabled
|
|
||||||
mov ecx, 1000h
|
|
||||||
loop $
|
|
||||||
dec edx
|
|
||||||
jnz @b
|
|
||||||
jmp .not_disabled
|
|
||||||
; pineview and before: wait while scanline still changes
|
|
||||||
.wait_watching_scanline:
|
|
||||||
mov edx, 1000h
|
|
||||||
.dis1:
|
|
||||||
push dword [esi+71000h]
|
|
||||||
push dword [esi+70000h]
|
|
||||||
mov ecx, 10000h
|
|
||||||
loop $
|
|
||||||
pop eax
|
|
||||||
xor eax, [esi+70000h]
|
|
||||||
and eax, 1FFFh
|
|
||||||
pop eax
|
|
||||||
jnz .notdis1
|
|
||||||
xor eax, [esi+71000h]
|
|
||||||
and eax, 1FFFh
|
|
||||||
jz .disabled
|
|
||||||
.notdis1:
|
|
||||||
dec edx
|
|
||||||
jnz .dis1
|
|
||||||
.not_disabled:
|
|
||||||
sti
|
|
||||||
jmp .return
|
|
||||||
.disabled:
|
|
||||||
lea eax, [esi+61183h]
|
|
||||||
cmp [deviceType], pciids_num ;ironlake_start
|
|
||||||
jb @f
|
|
||||||
add eax, 0xE0000 - 0x60000
|
|
||||||
@@:
|
|
||||||
lea edx, [esi+60000h]
|
|
||||||
test byte [eax], 40h
|
|
||||||
jz @f
|
|
||||||
add edx, 1000h
|
|
||||||
@@:
|
|
||||||
mov eax, [width]
|
|
||||||
dec eax
|
|
||||||
shl eax, 16
|
|
||||||
mov ax, word [height]
|
|
||||||
dec eax
|
|
||||||
mov dword [edx+1Ch], eax ; PIPEASRC: set source image size
|
|
||||||
ror eax, 16
|
|
||||||
mov dword [edx+10190h], eax ; for old cards
|
|
||||||
mov ecx, [width]
|
|
||||||
add ecx, 15
|
|
||||||
and ecx, not 15
|
|
||||||
shl ecx, 2
|
|
||||||
mov dword [edx+10188h], ecx ; DSPASTRIDE: set scanline length
|
|
||||||
mov dword [edx+10184h], 0 ; DSPALINOFF: force write to DSPA* registers
|
|
||||||
and byte [esi+61233h], not 80h ; PFIT_CONTROL: disable panel fitting
|
|
||||||
or byte [edx+1000Bh], 80h ; PIPEACONF: enable pipe
|
|
||||||
; and byte [edx+1000Ah], not 0Ch ; PIPEACONF: enable Display+Cursor Planes
|
|
||||||
or byte [edx+10183h], 80h ; DSPACNTR: enable Display Plane A
|
|
||||||
sti
|
|
||||||
; 2. Notify the kernel that resolution has changed.
|
|
||||||
call GetDisplay
|
|
||||||
mov edx, [width]
|
|
||||||
mov dword [eax+8], edx
|
|
||||||
mov edx, [height]
|
|
||||||
mov dword [eax+0Ch], edx
|
|
||||||
mov [eax+18h], ecx
|
|
||||||
mov eax, [width]
|
|
||||||
dec eax
|
|
||||||
dec edx
|
|
||||||
call SetScreen
|
|
||||||
.return:
|
|
||||||
ret
|
|
||||||
|
|
||||||
align 4
|
|
||||||
hellomsg db 'RDC videocard detected, PciId=17F3:' ;VendorID 0x17F3, 'RDC Semiconductor Co.'
|
|
||||||
pciid_text db '0000'
|
|
||||||
db ', which is ', 0
|
|
||||||
knownmsg db 'known',13,10,0
|
|
||||||
unknownmsg db 'unknown',13,10,0
|
|
||||||
exitmsg db 'Card detected successfully, exiting driver...',13,10,0
|
|
||||||
|
|
||||||
if DEBUG
|
|
||||||
edidmsg db 'EDID successfully read:',13,10
|
|
||||||
edid_text rb 8*(16*3+1)
|
|
||||||
db 0
|
|
||||||
end if
|
|
||||||
|
|
||||||
version:
|
|
||||||
dd 0x50005
|
|
||||||
|
|
||||||
width dd predefined_width
|
|
||||||
height dd predefined_height
|
|
||||||
|
|
||||||
pciids:
|
|
||||||
dw 0x2010 ; M2010 - appears in eBox-3300MX (Vortex86MX SoC)
|
|
||||||
dw 0x2012 ; M2012 - appears in eBox-3310MX (Vortex86MX+ SoC)
|
|
||||||
pciids_num = ($ - pciids) / 2
|
|
||||||
|
|
||||||
align 4
|
|
||||||
deviceType dd ?
|
|
||||||
edid rb 0x80
|
|
Loading…
Reference in New Issue
Block a user