13,7 → 13,7 |
|
USE_SINGLE_MODE equ 0 ; 1 = Single mode; 0 = Normal mode. |
|
TEST_VERSION_NUMBER equ '018b' |
TEST_VERSION_NUMBER equ '018d' |
|
;Asper+ [ |
SDO_TAG equ 1 ;Asper: Output stream tag id (any number except 0) |
452,6 → 452,52 |
|
EVENT_NOTIFY equ 0x00000200 |
|
; Macroses by CleverMouse |
; The following macro assume that we are on uniprocessor machine. |
; Serious work is needed for multiprocessor machines. |
macro spin_lock_irqsave spinlock |
{ |
pushf |
cli |
} |
macro spin_unlock_irqrestore spinlock |
{ |
popf |
} |
macro spin_lock_irq spinlock |
{ |
cli |
} |
macro spin_unlock_irq spinlock |
{ |
sti |
} |
|
SPINLOCK_BUSY = 1 |
SPINLOCK_FREE = 0 |
|
macro spin_lock |
{ |
push eax ebx |
mov eax, aspinlock |
mov ebx, SPINLOCK_BUSY |
@@: |
lock xchg [eax], ebx |
cmp ebx, SPINLOCK_FREE |
jnz @b |
pop ebx eax |
} |
|
macro spin_unlock |
{ |
push eax ebx |
mov eax, aspinlock |
mov eax, aspinlock |
mov ebx, SPINLOCK_FREE |
lock xchg [eax], ebx |
pop ebx eax |
} |
|
public START |
public service_proc |
public version |
602,12 → 648,7 |
stdcall RegService, sz_sound_srv, service_proc |
ret |
.fail: |
if DEBUG |
mov esi, msgFail |
call SysMsgBoardStr |
end if |
xor eax, eax |
ret |
.fail_msg: |
call SysMsgBoardStr |
xor eax, eax |
662,7 → 703,7 |
ret |
@@: |
cmp eax, DEV_CALLBACK |
jne @F |
jne @f |
mov ebx, [edi+input] |
stdcall set_callback, [ebx] |
xor eax, eax |
669,7 → 710,7 |
ret |
@@: |
cmp eax, DEV_SET_MASTERVOL |
jne @F |
jne @f |
mov eax, [edi+input] |
mov eax, [eax] |
call set_master_vol |
677,7 → 718,7 |
ret |
@@: |
cmp eax, DEV_GET_MASTERVOL |
jne @F |
jne @f |
mov ebx, [edi+output] |
stdcall get_master_vol, ebx |
xor eax, eax |
684,7 → 725,7 |
ret |
;@@: |
; cmp eax, DEV_GET_INFO |
; jne @F |
; jne @f |
; mov ebx, [edi+output] |
; stdcall get_dev_info, ebx |
; xor eax, eax |
691,7 → 732,7 |
; ret |
@@: |
cmp eax, DEV_GET_POS |
jne @F |
jne @f |
stdcall azx_get_position |
shr eax, 2 |
mov ebx, [edi+output] |
700,7 → 741,7 |
ret |
@@: |
; cmp eax, DEV_SET_CHANNEL_VOLUME |
; jne @F |
; jne @f |
; if DEBUG |
; mov esi, msgSetChannelVolume |
; call SysMsgBoardStr |
727,7 → 768,7 |
; ret |
;@@: |
; cmp eax, DEV_GET_CHANNEL_VOLUME |
; jne @F |
; jne @f |
; mov cl, byte [edi+input] ; cl=channel |
; call get_channel_volume |
; mov ebx, [edi+output] |
765,6 → 806,7 |
|
align 4 |
proc hda_irq ;+ |
spin_lock |
if DEBUG_IRQ |
push eax esi |
;mov esi, msgIRQ |
778,6 → 820,7 |
call azx_readl |
test eax, eax |
jnz @f |
spin_unlock |
ret |
@@: |
mov ebx, eax ; status |
843,6 → 886,7 |
@@: |
;end if |
or eax, 1 |
spin_unlock |
ret |
endp |
|
935,7 → 979,7 |
; wallclk has 24Mhz clock source |
mov [ctrl.period_wallclk], ((0x4000 * 24000) / 48000) * 1000 |
|
;-call azx_stream_reset |
call azx_stream_reset |
call azx_setup_controller |
ret |
endp |
1290,6 → 1334,7 |
|
align 4 |
play: |
spin_lock |
mov edx, ICH6_REG_WALLCLK |
call azx_readl |
mov [ctrl.start_wallclk], eax |
1296,10 → 1341,12 |
|
call azx_stream_start |
xor eax, eax |
spin_unlock |
ret |
|
align 4 |
stop: |
spin_lock |
;* call azx_stream_stop ;Asper: Hangs system |
;R push ebx ecx edx |
;R ; stop DMA |
1339,6 → 1386,7 |
;Asper ] |
|
xor eax, eax |
spin_unlock |
ret |
|
;align 4 |
1404,6 → 1452,7 |
endp |
|
proc azx_init_cmd_io |
spin_lock_irq |
pusha |
; CORB set up |
mov eax, [ctrl.rb] |
1471,10 → 1520,12 |
call azx_writeb |
|
popa |
spin_unlock_irq |
ret |
endp |
|
proc azx_free_cmd_io |
spin_lock_irq |
push eax edx |
; disable ringbuffer DMAs |
xor al, al |
1483,6 → 1534,7 |
mov edx, ICH6_REG_CORBCTL |
call azx_writeb |
pop edx eax |
spin_unlock_irq |
ret |
endp |
|
1489,6 → 1541,7 |
|
; send a command |
proc azx_corb_send_cmd stdcall, val:dword |
spin_lock_irq |
push edx edi |
xor eax, eax |
; add command to corb |
1509,6 → 1562,7 |
|
pop edi edx |
xor eax, eax ;Asper+ |
spin_unlock_irq |
ret |
endp |
|
1589,7 → 1643,9 |
test ah, ah |
jz @f |
.poll: |
spin_lock_irq |
call azx_update_rirb |
spin_unlock_irq |
@@: |
mov eax, [ctrl.rirb_cmd] |
test eax, eax |
2484,10 → 2540,7 |
|
align 4 |
proc StallExec |
push ecx |
push edx |
push ebx |
push eax |
push ecx edx ebx eax |
|
mov ecx, CPU_FREQ |
mul ecx |
2502,10 → 2555,7 |
sbb edx, ecx |
js @B |
|
pop eax |
pop ebx |
pop edx |
pop ecx |
pop eax ebx edx ecx |
ret |
endp |
|
2584,7 → 2634,7 |
mov bl, [ebx+hexletters] |
mov [8+esi+ecx], bl |
inc ecx |
jnz @B |
jnz @b |
pop eax |
|
mov dword [esi+8], 0 |
2913,6 → 2963,7 |
|
section '.data' data readable writable align 16 |
|
aspinlock dd SPINLOCK_FREE |
|
codec CODEC |
ctrl AC_CNTRL |