forked from KolibriOS/kolibrios
complete SSE support. user-level SSE & FPU exceptions handling
git-svn-id: svn://kolibrios.org@168 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
6f8abcc3e7
commit
233c3e6435
@ -86,6 +86,19 @@ CAPS_SVM equ 73 ;secure virual machine
|
|||||||
CAPS_ALTMOVCR8 equ 74 ;
|
CAPS_ALTMOVCR8 equ 74 ;
|
||||||
|
|
||||||
|
|
||||||
|
CR0_PE equ 0x00000001 ;protected mode
|
||||||
|
CR0_MP equ 0x00000002 ;monitor fpu
|
||||||
|
CR0_EM equ 0x00000004 ;fpu emulation
|
||||||
|
CR0_TS equ 0x00000008 ;task switch
|
||||||
|
CR0_ET equ 0x00000010 ;extension type hardcoded to 1
|
||||||
|
CR0_NE equ 0x00000020 ;numeric error
|
||||||
|
CR0_WP equ 0x00010000 ;write protect
|
||||||
|
CR0_AM equ 0x00040000 ;alignment check
|
||||||
|
CR0_NW equ 0x20000000 ;not write-through
|
||||||
|
CR0_CD equ 0x40000000 ;cache disable
|
||||||
|
CR0_PG equ 0x80000000 ;paging
|
||||||
|
|
||||||
|
|
||||||
CR4_VME equ 0x0001
|
CR4_VME equ 0x0001
|
||||||
CR4_PVI equ 0x0002
|
CR4_PVI equ 0x0002
|
||||||
CR4_TSD equ 0x0004
|
CR4_TSD equ 0x0004
|
||||||
@ -98,7 +111,22 @@ CR4_PCE equ 0x0100
|
|||||||
CR4_OSFXSR equ 0x0200
|
CR4_OSFXSR equ 0x0200
|
||||||
CR4_OSXMMEXPT equ 0x0400
|
CR4_OSXMMEXPT equ 0x0400
|
||||||
|
|
||||||
|
SSE_IE equ 0x0001
|
||||||
|
SSE_DE equ 0x0002
|
||||||
|
SSE_ZE equ 0x0004
|
||||||
|
SSE_OE equ 0x0008
|
||||||
|
SSE_UE equ 0x0010
|
||||||
|
SSE_PE equ 0x0020
|
||||||
|
SSE_DAZ equ 0x0040
|
||||||
|
SSE_IM equ 0x0080
|
||||||
|
SSE_DM equ 0x0100
|
||||||
|
SSE_ZM equ 0x0200
|
||||||
|
SSE_OM equ 0x0400
|
||||||
|
SSE_UM equ 0x0800
|
||||||
|
SSE_PM equ 0x1000
|
||||||
|
SSE_FZ equ 0x8000
|
||||||
|
|
||||||
|
SSE_INIT equ (SSE_IM+SSE_DM+SSE_ZM+SSE_OM+SSE_UM+SSE_PM)
|
||||||
|
|
||||||
OS_BASE equ 0; 0x80400000
|
OS_BASE equ 0; 0x80400000
|
||||||
|
|
||||||
|
@ -5,13 +5,13 @@ reg_cs equ ebp+8
|
|||||||
reg_eflags equ ebp+12
|
reg_eflags equ ebp+12
|
||||||
reg_esp equ ebp+16
|
reg_esp equ ebp+16
|
||||||
reg_ss equ ebp+20
|
reg_ss equ ebp+20
|
||||||
fpu_ctrl equ ebp-28
|
;fpu_ctrl equ ebp-28
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
except_16:
|
except_16:
|
||||||
push ebp
|
push ebp
|
||||||
mov ebp, esp
|
mov ebp, esp
|
||||||
sub esp, 28
|
; sub esp, 28
|
||||||
|
|
||||||
push eax
|
push eax
|
||||||
push ebx
|
push ebx
|
||||||
@ -41,11 +41,53 @@ except_16:
|
|||||||
iretd
|
iretd
|
||||||
|
|
||||||
.default:
|
.default:
|
||||||
|
pop edx
|
||||||
|
pop ecx
|
||||||
|
pop ebx
|
||||||
|
pop eax
|
||||||
|
leave
|
||||||
|
|
||||||
fnstenv [fpu_ctrl]
|
save_ring3_context ;debugger support
|
||||||
fnclex
|
|
||||||
or word [fpu_ctrl], 0111111b
|
mov bl, 16
|
||||||
fldenv [fpu_ctrl]
|
jmp exc_c
|
||||||
|
|
||||||
|
; fnstenv [fpu_ctrl]
|
||||||
|
; fnclex
|
||||||
|
; or word [fpu_ctrl], 0111111b
|
||||||
|
; fldenv [fpu_ctrl]
|
||||||
|
|
||||||
|
; pop edx
|
||||||
|
; pop ecx
|
||||||
|
; pop ebx
|
||||||
|
; pop eax
|
||||||
|
|
||||||
|
; leave
|
||||||
|
; iretd
|
||||||
|
|
||||||
|
align 16
|
||||||
|
except_19:
|
||||||
|
push ebp
|
||||||
|
mov ebp, esp
|
||||||
|
|
||||||
|
push eax
|
||||||
|
push ebx
|
||||||
|
push ecx
|
||||||
|
push edx
|
||||||
|
|
||||||
|
mov ebx, [ss:CURRENT_TASK]
|
||||||
|
shl ebx, 8
|
||||||
|
|
||||||
|
mov eax, [ss:ebx+PROC_BASE+APPDATA.sse_handler]
|
||||||
|
test eax, eax
|
||||||
|
jz .default
|
||||||
|
|
||||||
|
mov ecx, [reg_eip]
|
||||||
|
mov edx, [reg_esp]
|
||||||
|
sub edx, 4
|
||||||
|
mov [ss:edx+new_app_base], ecx
|
||||||
|
mov [reg_esp], edx
|
||||||
|
mov dword [reg_eip], eax
|
||||||
|
|
||||||
pop edx
|
pop edx
|
||||||
pop ecx
|
pop ecx
|
||||||
@ -55,10 +97,21 @@ except_16:
|
|||||||
leave
|
leave
|
||||||
iretd
|
iretd
|
||||||
|
|
||||||
|
.default:
|
||||||
|
pop edx
|
||||||
|
pop ecx
|
||||||
|
pop ebx
|
||||||
|
pop eax
|
||||||
|
leave
|
||||||
|
|
||||||
|
save_ring3_context ;debugger support
|
||||||
|
|
||||||
|
mov bl, 19
|
||||||
|
jmp exc_c
|
||||||
|
|
||||||
restore reg_eip
|
restore reg_eip
|
||||||
restore reg_cs
|
restore reg_cs
|
||||||
restore reg_eflags
|
restore reg_eflags
|
||||||
restore reg_esp
|
restore reg_esp
|
||||||
restore reg_ss
|
restore reg_ss
|
||||||
restore fpu_ctrl
|
;restore fpu_ctrl
|
||||||
|
@ -4,7 +4,7 @@ tmp_page_tab equ 0x01000000
|
|||||||
align 4
|
align 4
|
||||||
proc mem_test
|
proc mem_test
|
||||||
mov eax, cr0
|
mov eax, cr0
|
||||||
or eax, 0x60000000 ;disable caching
|
or eax, (CR0_CD+CR0_NW);disable caching
|
||||||
mov cr0, eax
|
mov cr0, eax
|
||||||
wbinvd ;invalidate cache
|
wbinvd ;invalidate cache
|
||||||
|
|
||||||
@ -17,7 +17,7 @@ proc mem_test
|
|||||||
xchg ebx, dword [edi]
|
xchg ebx, dword [edi]
|
||||||
je @b
|
je @b
|
||||||
|
|
||||||
and eax, 0x21
|
and eax, not (CR0_CD+CR0_NW)
|
||||||
mov cr0, eax
|
mov cr0, eax
|
||||||
mov eax, edi
|
mov eax, edi
|
||||||
ret
|
ret
|
||||||
@ -40,7 +40,10 @@ proc init_memEx
|
|||||||
jnc @F
|
jnc @F
|
||||||
or eax, PG_GLOBAL
|
or eax, PG_GLOBAL
|
||||||
or ebx, CR4_PGE
|
or ebx, CR4_PGE
|
||||||
|
|
||||||
@@:
|
@@:
|
||||||
|
mov cr4, ebx
|
||||||
|
|
||||||
mov dword [sys_pgdir], eax
|
mov dword [sys_pgdir], eax
|
||||||
add eax, 0x00400000
|
add eax, 0x00400000
|
||||||
mov dword [sys_pgdir+4], eax
|
mov dword [sys_pgdir+4], eax
|
||||||
@ -52,8 +55,6 @@ proc init_memEx
|
|||||||
mov dword [sys_pgdir+0x600], sys_master_tab+PG_SW
|
mov dword [sys_pgdir+0x600], sys_master_tab+PG_SW
|
||||||
mov dword [sys_master_tab+0x600], sys_master_tab+PG_SW
|
mov dword [sys_master_tab+0x600], sys_master_tab+PG_SW
|
||||||
|
|
||||||
mov cr4, ebx
|
|
||||||
|
|
||||||
mov ecx, [pg_data.kernel_tables]
|
mov ecx, [pg_data.kernel_tables]
|
||||||
sub ecx, 4
|
sub ecx, 4
|
||||||
mov eax, tmp_page_tab+PG_SW
|
mov eax, tmp_page_tab+PG_SW
|
||||||
@ -1102,6 +1103,15 @@ new_services:
|
|||||||
stdcall srv_handlerEx, ebx
|
stdcall srv_handlerEx, ebx
|
||||||
mov [esp+36], eax
|
mov [esp+36], eax
|
||||||
ret
|
ret
|
||||||
|
@@:
|
||||||
|
cmp eax, 18
|
||||||
|
ja @f
|
||||||
|
mov ecx, [CURRENT_TASK]
|
||||||
|
shl ecx, 8
|
||||||
|
mov eax, [ecx+PROC_BASE+APPDATA.sse_handler]
|
||||||
|
mov [ecx+PROC_BASE+APPDATA.sse_handler], ebx
|
||||||
|
mov [esp+36], eax
|
||||||
|
ret
|
||||||
|
|
||||||
@@:
|
@@:
|
||||||
.fail:
|
.fail:
|
||||||
|
@ -172,8 +172,8 @@ iglobal
|
|||||||
dd e8,e9,e10,e11
|
dd e8,e9,e10,e11
|
||||||
dd e12,e13,page_fault_handler,e15
|
dd e12,e13,page_fault_handler,e15
|
||||||
|
|
||||||
dd except_16, e17
|
dd except_16, e17,e18, except_19
|
||||||
times 14 dd unknown_interrupt
|
times 12 dd unknown_interrupt
|
||||||
|
|
||||||
dd irq0 , irq_serv.irq_1, p_irq2 ,irq_serv.irq_3
|
dd irq0 , irq_serv.irq_1, p_irq2 ,irq_serv.irq_3
|
||||||
dd p_irq4 ,irq_serv.irq_5,p_irq6,irq_serv.irq_7
|
dd p_irq4 ,irq_serv.irq_5,p_irq6,irq_serv.irq_7
|
||||||
@ -219,7 +219,7 @@ macro exc_w_code [num]
|
|||||||
jmp exc_c
|
jmp exc_c
|
||||||
}
|
}
|
||||||
|
|
||||||
exc_wo_code 0, 1, 2, 3, 4, 5, 6, 9, 15 ; 18, 19
|
exc_wo_code 0, 1, 2, 3, 4, 5, 6, 9, 15, 18
|
||||||
exc_w_code 8, 10, 11, 12, 13, 14, 17
|
exc_w_code 8, 10, 11, 12, 13, 14, 17
|
||||||
|
|
||||||
exc_c:
|
exc_c:
|
||||||
|
223
kernel/trunk/drivers/codec.inc
Normal file
223
kernel/trunk/drivers/codec.inc
Normal file
@ -0,0 +1,223 @@
|
|||||||
|
|
||||||
|
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
|
||||||
|
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
|
||||||
|
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]
|
||||||
|
test ebx, ebx
|
||||||
|
jz .unknown
|
||||||
|
|
||||||
|
cmp eax,ebx
|
||||||
|
jne .next
|
||||||
|
mov eax, [edi+4]
|
||||||
|
mov [codec.chip_ids], eax
|
||||||
|
ret
|
||||||
|
.next:
|
||||||
|
add edi, 8
|
||||||
|
jmp @b
|
||||||
|
.unknown:
|
||||||
|
mov [codec.chip_ids], chip_unknown
|
||||||
|
ret
|
||||||
|
endp
|
||||||
|
|
||||||
|
align 4
|
||||||
|
proc setup_codec
|
||||||
|
|
||||||
|
xor eax, eax
|
||||||
|
stdcall codec_write, dword CODEC_AUX_VOL
|
||||||
|
|
||||||
|
mov eax, 0x1010
|
||||||
|
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
|
||||||
|
|
||||||
|
align 4
|
||||||
|
proc set_master_vol stdcall, vol:dword
|
||||||
|
|
||||||
|
mov ebx, 63
|
||||||
|
mov ecx, 20644
|
||||||
|
mov eax, [vol]
|
||||||
|
cmp eax, 90
|
||||||
|
jna @f
|
||||||
|
mov eax, 90
|
||||||
|
@@:
|
||||||
|
mul ecx
|
||||||
|
shr eax, 15
|
||||||
|
sub ebx, eax
|
||||||
|
mov ah, bl
|
||||||
|
mov al, bl
|
||||||
|
stdcall codec_write, dword CODEC_MASTER_VOL_REG
|
||||||
|
ret
|
||||||
|
endp
|
||||||
|
|
||||||
|
align 4
|
||||||
|
proc get_master_vol stdcall, pvol:dword
|
||||||
|
|
||||||
|
stdcall codec_read, dword CODEC_MASTER_VOL_REG
|
||||||
|
and eax, 0x3F
|
||||||
|
mov ebx, 63
|
||||||
|
mov ecx, 20644
|
||||||
|
|
||||||
|
xchg eax, ebx
|
||||||
|
sub eax, ebx
|
||||||
|
shl eax, 15
|
||||||
|
xor edx, edx
|
||||||
|
div ecx
|
||||||
|
mov ebx, [pvol]
|
||||||
|
mov [ebx], 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
|
||||||
|
|
||||||
|
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
|
||||||
|
chip_unknown db 'unknown chip', 13,10,0
|
||||||
|
|
||||||
|
CHIP_ANALOG equ 0x41445300
|
||||||
|
CHIP_REALTEK equ 0x414C4700
|
||||||
|
CHIP_CMEDIA equ 0x434D4900
|
||||||
|
|
||||||
|
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 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 0
|
||||||
|
|
||||||
|
chips_Realtek 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 0
|
||||||
|
|
||||||
|
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 0
|
||||||
|
|
||||||
|
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_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
|
||||||
|
|
795
kernel/trunk/drivers/infinity.asm
Normal file
795
kernel/trunk/drivers/infinity.asm
Normal file
@ -0,0 +1,795 @@
|
|||||||
|
;
|
||||||
|
; This file is part of the Infinity sound library.
|
||||||
|
; (C) copyright Serge 2006
|
||||||
|
; email: infinity_sound@mail.ru
|
||||||
|
;
|
||||||
|
; This program is free software; you can redistribute it and/or modify
|
||||||
|
; it under the terms of the GNU General Public License as published by
|
||||||
|
; the Free Software Foundation; either version 2 of the License, or
|
||||||
|
; (at your option) any later version.
|
||||||
|
;
|
||||||
|
; This program is distributed in the hope that it will be useful,
|
||||||
|
; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
; GNU General Public License for more details.
|
||||||
|
|
||||||
|
format MS COFF
|
||||||
|
|
||||||
|
include 'proc32.inc'
|
||||||
|
include 'main.inc'
|
||||||
|
|
||||||
|
DEBUG equ 1
|
||||||
|
|
||||||
|
EVENT_NOTIFY equ 0x00000200
|
||||||
|
|
||||||
|
OS_BASE equ 0; 0x80400000
|
||||||
|
new_app_base equ 0x60400000; 0x01000000
|
||||||
|
PROC_BASE equ OS_BASE+0x0080000
|
||||||
|
|
||||||
|
public service_proc
|
||||||
|
public START
|
||||||
|
public IMPORTS
|
||||||
|
|
||||||
|
SND_CREATE_BUFF equ 2
|
||||||
|
SND_PLAY equ 3
|
||||||
|
SND_STOP equ 4
|
||||||
|
SND_SETBUFF equ 5
|
||||||
|
SND_DESTROY_BUFF equ 6
|
||||||
|
|
||||||
|
DEV_PLAY equ 1
|
||||||
|
DEV_STOP equ 2
|
||||||
|
DEV_CALLBACK equ 3
|
||||||
|
|
||||||
|
struc IOCTL
|
||||||
|
{ .handle dd ?
|
||||||
|
.io_code dd ?
|
||||||
|
.input dd ?
|
||||||
|
.inp_size dd ?
|
||||||
|
.output dd ?
|
||||||
|
.out_size dd ?
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual at 0
|
||||||
|
IOCTL IOCTL
|
||||||
|
end virtual
|
||||||
|
|
||||||
|
section '.flat' align 16
|
||||||
|
|
||||||
|
START:
|
||||||
|
stdcall [GetService], szSound
|
||||||
|
test eax, eax
|
||||||
|
jz .fail
|
||||||
|
mov [hSound], eax
|
||||||
|
|
||||||
|
stdcall [KernelAlloc], 16*512
|
||||||
|
test eax, eax
|
||||||
|
jz .out_of_mem
|
||||||
|
mov [mix_buff], eax
|
||||||
|
|
||||||
|
mov edi, stream_list
|
||||||
|
mov ecx, 17
|
||||||
|
xor eax, eax
|
||||||
|
cld
|
||||||
|
rep stosd
|
||||||
|
|
||||||
|
mov edi, stream
|
||||||
|
mov ecx, 4*STREAM_SIZE
|
||||||
|
rep stosd
|
||||||
|
|
||||||
|
stdcall set_handler, [hSound], new_mix
|
||||||
|
|
||||||
|
stdcall [RegService], szInfinity, service_proc
|
||||||
|
mov [stream_count],0
|
||||||
|
|
||||||
|
ret
|
||||||
|
.fail:
|
||||||
|
if DEBUG
|
||||||
|
mov esi, msgFail
|
||||||
|
call [SysMsgBoardStr]
|
||||||
|
end if
|
||||||
|
xor eax, eax
|
||||||
|
ret
|
||||||
|
|
||||||
|
.out_of_mem:
|
||||||
|
if DEBUG
|
||||||
|
mov esi, msgMem
|
||||||
|
call [SysMsgBoardStr]
|
||||||
|
end if
|
||||||
|
xor eax, eax
|
||||||
|
ret
|
||||||
|
|
||||||
|
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
|
||||||
|
proc service_proc stdcall, ioctl:dword
|
||||||
|
|
||||||
|
mov edi, [ioctl]
|
||||||
|
mov eax, [edi+io_code]
|
||||||
|
|
||||||
|
cmp eax, SND_CREATE_BUFF
|
||||||
|
jne @F
|
||||||
|
mov ebx, [edi+input]
|
||||||
|
stdcall CreateBuffer,[ebx]
|
||||||
|
ret
|
||||||
|
@@:
|
||||||
|
cmp eax, SND_PLAY
|
||||||
|
jne @F
|
||||||
|
|
||||||
|
mov ebx, [edi+input]
|
||||||
|
stdcall play_buffer, [ebx]
|
||||||
|
ret
|
||||||
|
@@:
|
||||||
|
cmp eax, SND_STOP
|
||||||
|
jne @F
|
||||||
|
|
||||||
|
; if DEBUG
|
||||||
|
; mov esi, msgStop
|
||||||
|
; call [SysMsgBoardStr]
|
||||||
|
; end if
|
||||||
|
|
||||||
|
mov ebx, [edi+input]
|
||||||
|
stdcall stop_buffer, [ebx]
|
||||||
|
ret
|
||||||
|
@@:
|
||||||
|
cmp eax, SND_SETBUFF
|
||||||
|
jne @F
|
||||||
|
|
||||||
|
mov ebx, [edi+input]
|
||||||
|
mov eax, [ebx+4]
|
||||||
|
add eax, new_app_base
|
||||||
|
stdcall set_buffer, [ebx],eax,[ebx+8],[ebx+12]
|
||||||
|
ret
|
||||||
|
@@:
|
||||||
|
cmp eax, SND_DESTROY_BUFF
|
||||||
|
jne @F
|
||||||
|
|
||||||
|
mov ebx, [edi+input]
|
||||||
|
stdcall DestroyBuffer, [ebx]
|
||||||
|
ret
|
||||||
|
@@:
|
||||||
|
xor eax, eax
|
||||||
|
ret
|
||||||
|
endp
|
||||||
|
|
||||||
|
restore handle
|
||||||
|
restore io_code
|
||||||
|
restore input
|
||||||
|
restore inp_size
|
||||||
|
restore output
|
||||||
|
restore out_size
|
||||||
|
|
||||||
|
TASK_COUNT equ 0x0003004
|
||||||
|
CURRENT_TASK equ 0x0003000
|
||||||
|
|
||||||
|
|
||||||
|
align 8
|
||||||
|
proc CreateBuffer stdcall, format:dword
|
||||||
|
locals
|
||||||
|
str dd ?
|
||||||
|
endl
|
||||||
|
|
||||||
|
call alloc_stream
|
||||||
|
and eax, eax
|
||||||
|
jz .fail
|
||||||
|
mov [str], eax
|
||||||
|
mov edi, eax
|
||||||
|
|
||||||
|
mov edx, [stream_count]
|
||||||
|
mov [stream_list+edx*4], eax
|
||||||
|
inc [stream_count]
|
||||||
|
|
||||||
|
mov [edi+STREAM.magic], 'WAVE'
|
||||||
|
mov [edi+STREAM.size], STREAM_SIZE
|
||||||
|
|
||||||
|
stdcall [KernelAlloc], 180*1024
|
||||||
|
|
||||||
|
mov edi, [str]
|
||||||
|
mov [edi+STREAM.base], eax
|
||||||
|
mov [edi+STREAM.curr_seg], eax
|
||||||
|
mov [edi+STREAM.notify_off1], eax
|
||||||
|
add eax, 0x8000
|
||||||
|
mov [edi+STREAM.notify_off2], eax
|
||||||
|
add eax, 0x7FFF
|
||||||
|
mov [edi+STREAM.limit], eax
|
||||||
|
|
||||||
|
inc eax
|
||||||
|
|
||||||
|
mov [edi+STREAM.work_buff], eax
|
||||||
|
mov [edi+STREAM.work_read], eax
|
||||||
|
mov [edi+STREAM.work_write], eax
|
||||||
|
mov [edi+STREAM.work_count], 0
|
||||||
|
add eax, 0x10000
|
||||||
|
mov [edi+STREAM.work_top], eax
|
||||||
|
add eax, 1024*32
|
||||||
|
mov [edi+STREAM.r_buff], eax
|
||||||
|
|
||||||
|
mov ebx, [CURRENT_TASK]
|
||||||
|
shl ebx, 5
|
||||||
|
mov eax, [0x3000+ebx+4]
|
||||||
|
|
||||||
|
mov [edi+STREAM.notify_task], eax
|
||||||
|
|
||||||
|
mov eax, [format]
|
||||||
|
mov [edi+STREAM.format], eax
|
||||||
|
mov [edi+STREAM.flags], SND_STOP
|
||||||
|
|
||||||
|
xor ebx, ebx
|
||||||
|
cmp eax, 19
|
||||||
|
jb @f
|
||||||
|
mov ebx, 0x80808080
|
||||||
|
@@:
|
||||||
|
mov [edi+STREAM.r_silence], ebx
|
||||||
|
|
||||||
|
shl eax, 4
|
||||||
|
mov ebx, [resampler_params+eax]
|
||||||
|
mov ecx, [resampler_params+eax+4]
|
||||||
|
mov edx, [resampler_params+eax+8]
|
||||||
|
|
||||||
|
mov [edi+STREAM.r_size],ebx
|
||||||
|
mov [edi+STREAM.r_end], ecx
|
||||||
|
mov [edi+STREAM.r_dt], edx
|
||||||
|
|
||||||
|
mov ebx, [resampler_params+eax+12]
|
||||||
|
mov [edi+STREAM.resample], ebx
|
||||||
|
|
||||||
|
mov edi, [edi+STREAM.base]
|
||||||
|
mov ecx, 180*1024/4
|
||||||
|
xor eax, eax
|
||||||
|
rep stosd
|
||||||
|
|
||||||
|
mov eax, [str]
|
||||||
|
ret
|
||||||
|
|
||||||
|
.fail:
|
||||||
|
xor eax, eax
|
||||||
|
ret
|
||||||
|
endp
|
||||||
|
|
||||||
|
align 4
|
||||||
|
pid_to_slot:
|
||||||
|
|
||||||
|
push ebx
|
||||||
|
push ecx
|
||||||
|
mov ebx,[TASK_COUNT]
|
||||||
|
shl ebx,5
|
||||||
|
mov ecx,2*32
|
||||||
|
.loop:
|
||||||
|
cmp byte [CURRENT_TASK+ecx+0xa],9
|
||||||
|
jz .endloop ;skip empty slots
|
||||||
|
cmp [CURRENT_TASK+ecx+0x4],eax ;check PID
|
||||||
|
jz .pid_found
|
||||||
|
.endloop:
|
||||||
|
add ecx,32
|
||||||
|
cmp ecx,ebx
|
||||||
|
jle .loop
|
||||||
|
pop ecx
|
||||||
|
pop ebx
|
||||||
|
xor eax,eax
|
||||||
|
ret
|
||||||
|
|
||||||
|
.pid_found:
|
||||||
|
shr ecx,5
|
||||||
|
mov eax,ecx
|
||||||
|
pop ecx
|
||||||
|
pop ebx
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
align 4
|
||||||
|
proc DestroyBuffer stdcall, str:dword
|
||||||
|
|
||||||
|
mov esi, [str]
|
||||||
|
|
||||||
|
cmp [esi+STREAM.magic], 'WAVE'
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
cmp [esi+STREAM.size], STREAM_SIZE
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
stdcall [KernelFree], [esi+STREAM.base]
|
||||||
|
|
||||||
|
mov eax, [str]
|
||||||
|
call free_stream
|
||||||
|
|
||||||
|
mov edi, [str]
|
||||||
|
mov ecx, STREAM_SIZE/4
|
||||||
|
xor eax, eax
|
||||||
|
cld
|
||||||
|
rep stosd
|
||||||
|
|
||||||
|
mov eax, [str]
|
||||||
|
mov esi, stream_list
|
||||||
|
mov ecx, 16
|
||||||
|
@@:
|
||||||
|
cmp [esi], eax
|
||||||
|
je .remove
|
||||||
|
add esi, 4
|
||||||
|
dec ecx
|
||||||
|
jnz @B
|
||||||
|
xor eax, eax
|
||||||
|
inc eax
|
||||||
|
ret
|
||||||
|
.remove:
|
||||||
|
mov edi, esi
|
||||||
|
add esi, 4
|
||||||
|
cld
|
||||||
|
rep movsd
|
||||||
|
dec [stream_count]
|
||||||
|
xor eax, eax
|
||||||
|
inc eax
|
||||||
|
ret
|
||||||
|
.fail:
|
||||||
|
xor eax, eax
|
||||||
|
ret
|
||||||
|
endp
|
||||||
|
|
||||||
|
align 4
|
||||||
|
proc play_buffer stdcall, str:dword
|
||||||
|
|
||||||
|
mov ebx, [str]
|
||||||
|
|
||||||
|
cmp [ebx+STREAM.magic], 'WAVE'
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
cmp [ebx+STREAM.size], STREAM_SIZE
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
mov [ebx+STREAM.flags], SND_PLAY
|
||||||
|
|
||||||
|
mov eax,[ebx+STREAM.work_buff]
|
||||||
|
mov [ebx+STREAM.work_read], eax
|
||||||
|
mov [ebx+STREAM.work_write], eax
|
||||||
|
mov [ebx+STREAM.work_count], 0
|
||||||
|
|
||||||
|
mov eax, [ebx+STREAM.base]
|
||||||
|
mov [ebx+STREAM.curr_seg], eax
|
||||||
|
|
||||||
|
mov esi, [ebx+STREAM.curr_seg]
|
||||||
|
mov edi, [ebx+STREAM.work_write]
|
||||||
|
mov edx, [ebx+STREAM.r_buff]
|
||||||
|
|
||||||
|
mov ecx, 32
|
||||||
|
mov eax, [ebx+STREAM.r_silence]
|
||||||
|
@@:
|
||||||
|
mov [edx], eax
|
||||||
|
add edx, 4
|
||||||
|
dec ecx
|
||||||
|
jnz @B
|
||||||
|
|
||||||
|
mov edx, [ebx+STREAM.r_buff]
|
||||||
|
|
||||||
|
stdcall [ebx+STREAM.resample], edi, esi, edx,\
|
||||||
|
[ebx+STREAM.r_dt],[ebx+STREAM.r_size],[ebx+STREAM.r_end]
|
||||||
|
|
||||||
|
mov ebx, [str]
|
||||||
|
|
||||||
|
add [ebx+STREAM.work_count], eax;
|
||||||
|
add [ebx+STREAM.work_write], eax;
|
||||||
|
|
||||||
|
mov eax, [ebx+STREAM.r_size]
|
||||||
|
add [ebx+STREAM.curr_seg], eax
|
||||||
|
|
||||||
|
; if DEBUG
|
||||||
|
; mov esi, msgPlay
|
||||||
|
; call [SysMsgBoardStr]
|
||||||
|
; end if
|
||||||
|
|
||||||
|
stdcall dev_play, [hSound]
|
||||||
|
|
||||||
|
xor eax, eax
|
||||||
|
inc eax
|
||||||
|
ret
|
||||||
|
|
||||||
|
.fail:
|
||||||
|
xor eax, eax
|
||||||
|
ret
|
||||||
|
|
||||||
|
endp
|
||||||
|
|
||||||
|
|
||||||
|
align 4
|
||||||
|
proc stop_buffer stdcall, str:dword
|
||||||
|
|
||||||
|
mov edi, [str]
|
||||||
|
|
||||||
|
cmp [edi+STREAM.magic], 'WAVE'
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
cmp [edi+STREAM.size], STREAM_SIZE
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
mov [edi+STREAM.flags], SND_STOP
|
||||||
|
|
||||||
|
; stdcall [ServiceHandler], [hSound], dword DEV_STOP, 0
|
||||||
|
|
||||||
|
xor eax, eax
|
||||||
|
inc eax
|
||||||
|
ret
|
||||||
|
|
||||||
|
.fail:
|
||||||
|
xor eax, eax
|
||||||
|
ret
|
||||||
|
|
||||||
|
endp
|
||||||
|
|
||||||
|
align 4
|
||||||
|
proc set_buffer stdcall, str:dword,src:dword,offs:dword,size:dword
|
||||||
|
|
||||||
|
mov edx, [str]
|
||||||
|
test edx, edx
|
||||||
|
jz .fail
|
||||||
|
|
||||||
|
cmp [edx+STREAM.magic], 'WAVE'
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
cmp [edx+STREAM.size], STREAM_SIZE
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
mov esi,[src]
|
||||||
|
test esi, esi
|
||||||
|
jz .fail
|
||||||
|
|
||||||
|
cmp esi, new_app_base
|
||||||
|
jb .fail
|
||||||
|
|
||||||
|
mov ecx, [size]
|
||||||
|
test ecx, ecx
|
||||||
|
jz .fail
|
||||||
|
|
||||||
|
mov eax, [edx+STREAM.base]
|
||||||
|
add eax, [offs]
|
||||||
|
|
||||||
|
cmp eax, [edx+STREAM.base]
|
||||||
|
jb .fail
|
||||||
|
|
||||||
|
mov edi, eax
|
||||||
|
add eax, ecx
|
||||||
|
sub eax, 1
|
||||||
|
|
||||||
|
cmp eax, [edx+STREAM.limit]
|
||||||
|
ja .fail
|
||||||
|
|
||||||
|
shr ecx, 2
|
||||||
|
cld
|
||||||
|
rep movsd
|
||||||
|
|
||||||
|
xor eax, eax
|
||||||
|
inc eax
|
||||||
|
ret
|
||||||
|
.fail:
|
||||||
|
xor eax, eax
|
||||||
|
ret
|
||||||
|
endp
|
||||||
|
|
||||||
|
align 4
|
||||||
|
proc alloc_stream
|
||||||
|
|
||||||
|
mov esi, stream_map
|
||||||
|
|
||||||
|
pushf
|
||||||
|
cli
|
||||||
|
|
||||||
|
bsf eax, [esi]
|
||||||
|
jnz .find
|
||||||
|
popf
|
||||||
|
xor eax, eax
|
||||||
|
ret
|
||||||
|
|
||||||
|
.find: btr [esi], eax
|
||||||
|
popf
|
||||||
|
mov ebx, STREAM_SIZE
|
||||||
|
mul ebx
|
||||||
|
add eax, stream
|
||||||
|
ret
|
||||||
|
endp
|
||||||
|
|
||||||
|
align 4
|
||||||
|
proc free_stream
|
||||||
|
sub eax, stream
|
||||||
|
mov ebx, STREAM_SIZE
|
||||||
|
xor edx, edx
|
||||||
|
div ebx
|
||||||
|
|
||||||
|
and edx, edx
|
||||||
|
jnz .err
|
||||||
|
|
||||||
|
bts [stream_map], eax
|
||||||
|
|
||||||
|
ret
|
||||||
|
.err:
|
||||||
|
xor eax, eax
|
||||||
|
ret
|
||||||
|
endp
|
||||||
|
|
||||||
|
align 4
|
||||||
|
proc check_stream
|
||||||
|
|
||||||
|
xor edx, edx
|
||||||
|
mov ecx, [play_count]
|
||||||
|
.l1:
|
||||||
|
mov esi, [play_list+edx]
|
||||||
|
|
||||||
|
mov eax, [esi+STR.curr_seg]
|
||||||
|
cmp eax, [esi+STR.limit]
|
||||||
|
jb .next
|
||||||
|
|
||||||
|
.m1: mov eax,[esi+STR.base]
|
||||||
|
mov [esi+STR.curr_seg], eax
|
||||||
|
.next:
|
||||||
|
add edx, 4
|
||||||
|
loop .l1
|
||||||
|
ret
|
||||||
|
endp
|
||||||
|
|
||||||
|
|
||||||
|
align 4
|
||||||
|
proc prepare_playlist
|
||||||
|
|
||||||
|
.restart:
|
||||||
|
xor ebx, ebx
|
||||||
|
xor edx, edx
|
||||||
|
mov [play_count], 0
|
||||||
|
mov ecx, [stream_count]
|
||||||
|
jcxz .exit
|
||||||
|
.l1:
|
||||||
|
mov esi, [stream_list+ebx]
|
||||||
|
test esi, esi
|
||||||
|
jz .next
|
||||||
|
|
||||||
|
cmp [esi+STREAM.magic], 'WAVE'
|
||||||
|
jne .next
|
||||||
|
|
||||||
|
cmp [esi+STREAM.size], STREAM_SIZE
|
||||||
|
jne .next
|
||||||
|
|
||||||
|
mov eax,[esi+STREAM.notify_task]
|
||||||
|
cmp eax, -1
|
||||||
|
je .fail
|
||||||
|
|
||||||
|
call pid_to_slot
|
||||||
|
test eax, eax
|
||||||
|
jz .fail
|
||||||
|
|
||||||
|
cmp [esi+STREAM.flags], SND_PLAY;
|
||||||
|
jne .next
|
||||||
|
cmp [esi+STREAM.work_count], 16384
|
||||||
|
jb .next
|
||||||
|
|
||||||
|
mov [play_list+edx], esi
|
||||||
|
inc [play_count]
|
||||||
|
add edx, 4
|
||||||
|
.next:
|
||||||
|
add ebx, 4
|
||||||
|
loop .l1
|
||||||
|
.exit:
|
||||||
|
ret
|
||||||
|
|
||||||
|
.fail:
|
||||||
|
stdcall DestroyBuffer, esi
|
||||||
|
jmp .restart
|
||||||
|
endp
|
||||||
|
|
||||||
|
align 4
|
||||||
|
proc prepare_updatelist
|
||||||
|
|
||||||
|
xor ebx, ebx
|
||||||
|
xor edx, edx
|
||||||
|
mov [play_count], 0
|
||||||
|
mov ecx, [stream_count]
|
||||||
|
jcxz .exit
|
||||||
|
.l1:
|
||||||
|
mov eax, [stream_list+ebx]
|
||||||
|
test eax, eax
|
||||||
|
jz .next
|
||||||
|
cmp [eax+STREAM.flags], SND_PLAY
|
||||||
|
jne .next
|
||||||
|
|
||||||
|
mov [play_list+edx], eax
|
||||||
|
inc [play_count]
|
||||||
|
add edx, 4
|
||||||
|
.next:
|
||||||
|
add ebx, 4
|
||||||
|
loop .l1
|
||||||
|
.exit:
|
||||||
|
ret
|
||||||
|
endp
|
||||||
|
|
||||||
|
|
||||||
|
align 4
|
||||||
|
proc set_handler stdcall, hsrv:dword, handler_proc:dword
|
||||||
|
locals
|
||||||
|
handler dd ?
|
||||||
|
io_code dd ?
|
||||||
|
input dd ?
|
||||||
|
inp_size dd ?
|
||||||
|
output dd ?
|
||||||
|
out_size dd ?
|
||||||
|
val dd ?
|
||||||
|
endl
|
||||||
|
|
||||||
|
mov eax, [hsrv]
|
||||||
|
lea ecx, [handler_proc]
|
||||||
|
xor ebx, ebx
|
||||||
|
|
||||||
|
mov [handler], eax
|
||||||
|
mov [io_code], DEV_CALLBACK
|
||||||
|
mov [input], ecx
|
||||||
|
mov [inp_size], 4
|
||||||
|
mov [output], ebx
|
||||||
|
mov [out_size], 0
|
||||||
|
|
||||||
|
lea eax, [handler]
|
||||||
|
stdcall [ServiceHandler], eax
|
||||||
|
ret
|
||||||
|
endp
|
||||||
|
|
||||||
|
align 4
|
||||||
|
proc dev_play stdcall, hsrv:dword
|
||||||
|
locals
|
||||||
|
handle dd ?
|
||||||
|
io_code dd ?
|
||||||
|
input dd ?
|
||||||
|
inp_size dd ?
|
||||||
|
output dd ?
|
||||||
|
out_size dd ?
|
||||||
|
val dd ?
|
||||||
|
endl
|
||||||
|
|
||||||
|
mov eax, [hsrv]
|
||||||
|
xor ebx, ebx
|
||||||
|
|
||||||
|
mov [handle], eax
|
||||||
|
mov [io_code], DEV_PLAY
|
||||||
|
mov [input], ebx
|
||||||
|
mov [inp_size], ebx
|
||||||
|
mov [output], ebx
|
||||||
|
mov [out_size], ebx
|
||||||
|
|
||||||
|
lea eax, [handle]
|
||||||
|
stdcall [ServiceHandler], eax
|
||||||
|
ret
|
||||||
|
endp
|
||||||
|
|
||||||
|
include 'mixer.asm'
|
||||||
|
|
||||||
|
align 16
|
||||||
|
play_list dd 16 dup(0)
|
||||||
|
stream_list dd 17 dup(0)
|
||||||
|
|
||||||
|
align 16
|
||||||
|
resampler_params:
|
||||||
|
;r_size r_end r_dt resampler_func
|
||||||
|
dd 0,0,0,0 ; 0 PCM_ALL
|
||||||
|
dd 16384, 0, 0, copy_stream ; 1 PCM_2_16_48
|
||||||
|
dd 16384, 0, 0, m16_stereo ; 2 PCM_1_16_48
|
||||||
|
|
||||||
|
dd 16384, 0x08000000, 30109, resample_2 ; 3 PCM_2_16_44
|
||||||
|
dd 8192, 0x08000000, 30109, resample_1 ; 4 PCM_1_16_44
|
||||||
|
|
||||||
|
dd 16384, 0x08000000, 21846, resample_2 ; 5 PCM_2_16_32
|
||||||
|
dd 8192, 0x08000000, 21846, resample_1 ; 6 PCM_1_16_32
|
||||||
|
|
||||||
|
dd 16384, 0x08000000, 16384, resample_2 ; 7 PCM_2_16_24
|
||||||
|
dd 8192, 0x08000000, 16384, resample_1 ; 8 PCM_1_16_24
|
||||||
|
|
||||||
|
dd 8192, 0x04000000, 15052, resample_2 ; 9 PCM_2_16_22
|
||||||
|
dd 4096, 0x04000000, 15052, resample_1 ;10 PCM_1_16_22
|
||||||
|
|
||||||
|
dd 8192, 0x04000000, 10923, resample_2 ;11 PCM_2_16_16
|
||||||
|
dd 4096, 0x04000000, 10923, resample_1 ;12 PCM_1_16_16
|
||||||
|
|
||||||
|
dd 8192, 0x04000000, 8192, resample_2 ;13 PCM_2_16_12
|
||||||
|
dd 4096, 0x04000000, 8192, resample_1 ;14 PCM_1_16_12
|
||||||
|
|
||||||
|
dd 4096, 0x02000000, 7527, resample_2 ;15 PCM_2_16_11
|
||||||
|
dd 2048, 0x02000000, 7527, resample_1 ;16 PCM_1_16_11
|
||||||
|
|
||||||
|
dd 4096, 0x02000000, 5462, resample_2 ;17 PCM_2_16_8
|
||||||
|
dd 2048, 0x02000000, 5462, resample_1 ;18 PCM_1_16_8
|
||||||
|
|
||||||
|
dd 16384, 0, 0, s8_stereo ;19 PCM_2_8_48
|
||||||
|
dd 8192, 0, 0, m8_stereo ;20 PCM_1_8_48
|
||||||
|
|
||||||
|
dd 8192, 0x08000000, 30109, resample_28 ;21 PCM_2_8_44
|
||||||
|
dd 4096, 0x08000000, 30109, resample_18 ;22 PCM_1_8_44
|
||||||
|
|
||||||
|
dd 8192, 0x08000000, 21846, resample_28 ;23 PCM_2_8_32
|
||||||
|
dd 4096, 0x08000000, 21846, resample_18 ;24 PCM_1_8_32
|
||||||
|
|
||||||
|
dd 8192, 0x08000000, 16384, resample_28 ;25 PCM_2_8_24
|
||||||
|
dd 4096, 0x08000000, 16384, resample_18 ;26 PCM_1_8_24
|
||||||
|
|
||||||
|
dd 4096, 0x04000000, 15052, resample_28 ;27 PCM_2_8_22
|
||||||
|
dd 2048, 0x04000000, 15052, resample_18 ;28 PCM_1_8_22
|
||||||
|
|
||||||
|
dd 4096, 0x04000000, 10923, resample_28 ;29 PCM_2_8_16
|
||||||
|
dd 2048, 0x04000000, 10923, resample_18 ;30 PCM_1_8_16
|
||||||
|
|
||||||
|
dd 4096, 0x04000000, 8192, resample_28 ;31 PCM_2_8_12
|
||||||
|
dd 2048, 0x04000000, 8192, resample_18 ;32 PCM_1_8_12
|
||||||
|
|
||||||
|
dd 2048, 0x02000000, 7527, resample_28 ;33 PCM_2_8_11
|
||||||
|
dd 1024, 0x02000000, 7527, resample_18 ;34 PCM_1_8_11
|
||||||
|
|
||||||
|
dd 2048, 0x02000000, 5462, resample_28 ;35 PCM_2_8_8
|
||||||
|
dd 1024, 0x02000000, 5462, resample_18 ;36 PCM_1_8_8
|
||||||
|
|
||||||
|
|
||||||
|
play_count dd 0
|
||||||
|
|
||||||
|
stream_count dd 0
|
||||||
|
|
||||||
|
align 8
|
||||||
|
hSound dd 0
|
||||||
|
|
||||||
|
m7 dw 0x8000,0x8000,0x8000,0x8000
|
||||||
|
mm80 dq 0x8080808080808080
|
||||||
|
mm_mask dq 0xFF00FF00FF00FF00
|
||||||
|
|
||||||
|
mix_input dd 16 dup(0)
|
||||||
|
|
||||||
|
align 16
|
||||||
|
;fpu_state db 512 dup(0)
|
||||||
|
|
||||||
|
align 16
|
||||||
|
stream db STREAM_SIZE*16 dup(0)
|
||||||
|
stream_map dd 0xFFFF ; 16
|
||||||
|
mix_buff dd 0
|
||||||
|
mix_buff_map dd 0
|
||||||
|
|
||||||
|
align 16
|
||||||
|
IMPORTS:
|
||||||
|
|
||||||
|
AttachIntHandler dd szAttachIntHandler
|
||||||
|
SysMsgBoardStr dd szSysMsgBoardStr
|
||||||
|
PciApi dd szPciApi
|
||||||
|
PciRead32 dd szPciRead32
|
||||||
|
PciRead8 dd szPciRead8
|
||||||
|
AllocKernelSpace dd szAllocKernelSpace
|
||||||
|
MapPage dd szMapPage
|
||||||
|
KernelAlloc dd szKernelAlloc
|
||||||
|
KernelFree dd szKernelFree
|
||||||
|
GetPgAddr dd szGetPgAddr
|
||||||
|
RegService dd szRegService
|
||||||
|
GetCurrentTask dd szGetCurrentTask
|
||||||
|
GetService dd szGetService
|
||||||
|
ServiceHandler dd szServiceHandler
|
||||||
|
FpuSave dd szFpuSave
|
||||||
|
FpuRestore dd szFpuRestore
|
||||||
|
dd 0
|
||||||
|
|
||||||
|
szKernel db 'KERNEL', 0
|
||||||
|
szAttachIntHandler db 'AttachIntHandler',0
|
||||||
|
szSysMsgBoardStr db 'SysMsgBoardStr', 0
|
||||||
|
szPciApi db 'PciApi', 0
|
||||||
|
szPciRead32 db 'PciRead32', 0
|
||||||
|
szPciRead8 db 'PciRead8', 0
|
||||||
|
szAllocKernelSpace db 'AllocKernelSpace',0
|
||||||
|
szMapPage db 'MapPage',0
|
||||||
|
szRegService db 'RegService',0
|
||||||
|
szKernelAlloc db 'KernelAlloc',0
|
||||||
|
szGetPgAddr db 'GetPgAddr',0
|
||||||
|
szGetCurrentTask db 'GetCurrentTask ',0
|
||||||
|
szGetService db 'GetService',0
|
||||||
|
szServiceHandler db 'ServiceHandler',0
|
||||||
|
szKernelFree db 'KernelFree',0
|
||||||
|
szFpuSave db 'FpuSave',0
|
||||||
|
szFpuRestore db 'FpuRestore',0
|
||||||
|
|
||||||
|
|
||||||
|
szInfinity db 'INFINITY',0
|
||||||
|
szSound db 'SOUND',0
|
||||||
|
|
||||||
|
if DEBUG
|
||||||
|
msgFail db 'Sound service not found',13,10,0
|
||||||
|
msgPlay db 'Play buffer',13,10,0
|
||||||
|
msgStop db 'Stop',13,10,0
|
||||||
|
msgUser db 'User callback',13,10,0
|
||||||
|
msgMem db 'Not enough memory',13,10,0
|
||||||
|
end if
|
133
kernel/trunk/drivers/main.inc
Normal file
133
kernel/trunk/drivers/main.inc
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
;
|
||||||
|
; This file is part of the Infinity sound AC97 driver.
|
||||||
|
; (C) copyright Serge 2006
|
||||||
|
; email: infinity_sound@mail.ru
|
||||||
|
;
|
||||||
|
; This program is free software; you can redistribute it and/or modify
|
||||||
|
; it under the terms of the GNU General Public License as published by
|
||||||
|
; the Free Software Foundation; either version 2 of the License, or
|
||||||
|
; (at your option) any later version.
|
||||||
|
;
|
||||||
|
; This program is distributed in the hope that it will be useful,
|
||||||
|
; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
; GNU General Public License for more details.
|
||||||
|
|
||||||
|
PCM_2_16_48 equ 1
|
||||||
|
PCM_1_16_48 equ 2
|
||||||
|
|
||||||
|
PCM_2_16_44 equ 3
|
||||||
|
PCM_1_16_44 equ 4
|
||||||
|
|
||||||
|
PCM_2_16_32 equ 5
|
||||||
|
PCM_1_16_32 equ 6
|
||||||
|
|
||||||
|
PCM_2_16_24 equ 7
|
||||||
|
PCM_1_16_24 equ 8
|
||||||
|
|
||||||
|
PCM_2_16_22 equ 9
|
||||||
|
PCM_1_16_22 equ 10
|
||||||
|
|
||||||
|
PCM_2_16_16 equ 11
|
||||||
|
PCM_1_16_16 equ 12
|
||||||
|
|
||||||
|
PCM_2_16_12 equ 13
|
||||||
|
PCM_1_16_12 equ 14
|
||||||
|
|
||||||
|
PCM_2_16_11 equ 15
|
||||||
|
PCM_1_16_11 equ 16
|
||||||
|
|
||||||
|
PCM_2_8_48 equ 17
|
||||||
|
PCM_1_8_48 equ 18
|
||||||
|
|
||||||
|
PCM_2_8_44 equ 19
|
||||||
|
PCM_1_8_44 equ 20
|
||||||
|
|
||||||
|
PCM_2_8_32 equ 21
|
||||||
|
PCM_1_8_32 equ 22
|
||||||
|
|
||||||
|
PCM_2_8_24 equ 23
|
||||||
|
PCM_1_8_24 equ 24
|
||||||
|
|
||||||
|
PCM_2_8_22 equ 25
|
||||||
|
PCM_1_8_22 equ 26
|
||||||
|
|
||||||
|
PCM_2_8_16 equ 27
|
||||||
|
PCM_1_8_16 equ 28
|
||||||
|
|
||||||
|
PCM_2_8_12 equ 29
|
||||||
|
PCM_1_8_12 equ 30
|
||||||
|
|
||||||
|
PCM_2_8_11 equ 31
|
||||||
|
PCM_1_8_11 equ 32
|
||||||
|
|
||||||
|
SND_PLAY equ 1
|
||||||
|
SND_STOP equ 2
|
||||||
|
|
||||||
|
; struc SND_DEV
|
||||||
|
;{ .magic dd 0
|
||||||
|
; .size dd 0
|
||||||
|
; .count dd 0
|
||||||
|
; dd 0
|
||||||
|
; .snd_buff dd 16 dup (0)
|
||||||
|
;}
|
||||||
|
|
||||||
|
;virtual at 0
|
||||||
|
; SND_DEV SND_DEV
|
||||||
|
;end virtual
|
||||||
|
|
||||||
|
;SND_DEV_SIZE equ 80
|
||||||
|
|
||||||
|
|
||||||
|
struc STREAM
|
||||||
|
{ .magic dd 0
|
||||||
|
.size dd 0
|
||||||
|
.device dd 0
|
||||||
|
.format dd 0
|
||||||
|
.flags dd 0
|
||||||
|
|
||||||
|
.work_buff dd 0
|
||||||
|
.work_read dd 0
|
||||||
|
.work_write dd 0
|
||||||
|
.work_count dd 0
|
||||||
|
.work_top dd 0
|
||||||
|
.r_buff dd 0
|
||||||
|
.r_size dd 0
|
||||||
|
.r_end dd 0
|
||||||
|
.r_dt dd 0
|
||||||
|
.r_silence dd 0
|
||||||
|
|
||||||
|
.base dd 0
|
||||||
|
.curr_seg dd 0
|
||||||
|
.limit dd 0
|
||||||
|
.buff_size dd 0
|
||||||
|
.notify_off1 dd 0
|
||||||
|
.notify_off2 dd 0
|
||||||
|
.notify_task dd 0
|
||||||
|
.resample dd 0
|
||||||
|
}
|
||||||
|
|
||||||
|
STREAM_SIZE equ 23*4
|
||||||
|
|
||||||
|
virtual at 0
|
||||||
|
STREAM STREAM
|
||||||
|
end virtual
|
||||||
|
|
||||||
|
struc WAVE_HEADER
|
||||||
|
{ .riff_id dd ?
|
||||||
|
.riff_size dd ?
|
||||||
|
.riff_format dd ?
|
||||||
|
|
||||||
|
.fmt_id dd ?
|
||||||
|
.fmt_size dd ?
|
||||||
|
.format_tag dw ?
|
||||||
|
.channels dw ?
|
||||||
|
.freq dd ?
|
||||||
|
.bytes_sec dd ?
|
||||||
|
.block_align dw ?
|
||||||
|
.bits_sample dw ?
|
||||||
|
|
||||||
|
.data_id dd ?
|
||||||
|
.data_size dd ?
|
||||||
|
}
|
||||||
|
|
1290
kernel/trunk/drivers/mixer.asm
Normal file
1290
kernel/trunk/drivers/mixer.asm
Normal file
File diff suppressed because it is too large
Load Diff
268
kernel/trunk/drivers/proc32.inc
Normal file
268
kernel/trunk/drivers/proc32.inc
Normal file
@ -0,0 +1,268 @@
|
|||||||
|
|
||||||
|
; Macroinstructions for defining and calling procedures
|
||||||
|
|
||||||
|
macro stdcall proc,[arg] ; directly call STDCALL procedure
|
||||||
|
{ common
|
||||||
|
if ~ arg eq
|
||||||
|
reverse
|
||||||
|
pushd arg
|
||||||
|
common
|
||||||
|
end if
|
||||||
|
call proc }
|
||||||
|
|
||||||
|
macro invoke proc,[arg] ; indirectly call STDCALL procedure
|
||||||
|
{ common
|
||||||
|
if ~ arg eq
|
||||||
|
reverse
|
||||||
|
pushd arg
|
||||||
|
common
|
||||||
|
end if
|
||||||
|
call [proc] }
|
||||||
|
|
||||||
|
macro ccall proc,[arg] ; directly call CDECL procedure
|
||||||
|
{ common
|
||||||
|
size@ccall = 0
|
||||||
|
if ~ arg eq
|
||||||
|
reverse
|
||||||
|
pushd arg
|
||||||
|
size@ccall = size@ccall+4
|
||||||
|
common
|
||||||
|
end if
|
||||||
|
call proc
|
||||||
|
if size@ccall
|
||||||
|
add esp,size@ccall
|
||||||
|
end if }
|
||||||
|
|
||||||
|
macro cinvoke proc,[arg] ; indirectly call CDECL procedure
|
||||||
|
{ common
|
||||||
|
size@ccall = 0
|
||||||
|
if ~ arg eq
|
||||||
|
reverse
|
||||||
|
pushd arg
|
||||||
|
size@ccall = size@ccall+4
|
||||||
|
common
|
||||||
|
end if
|
||||||
|
call [proc]
|
||||||
|
if size@ccall
|
||||||
|
add esp,size@ccall
|
||||||
|
end if }
|
||||||
|
|
||||||
|
macro proc [args] ; define procedure
|
||||||
|
{ common
|
||||||
|
match name params, args>
|
||||||
|
\{ define@proc name,<params \} }
|
||||||
|
|
||||||
|
prologue@proc equ prologuedef
|
||||||
|
|
||||||
|
macro prologuedef procname,flag,parmbytes,localbytes,reglist
|
||||||
|
{ if parmbytes | localbytes
|
||||||
|
push ebp
|
||||||
|
mov ebp,esp
|
||||||
|
if localbytes
|
||||||
|
sub esp,localbytes
|
||||||
|
end if
|
||||||
|
end if
|
||||||
|
irps reg, reglist \{ push reg \} }
|
||||||
|
|
||||||
|
epilogue@proc equ epiloguedef
|
||||||
|
|
||||||
|
macro epiloguedef procname,flag,parmbytes,localbytes,reglist
|
||||||
|
{ irps reg, reglist \{ reverse pop reg \}
|
||||||
|
if parmbytes | localbytes
|
||||||
|
leave
|
||||||
|
end if
|
||||||
|
if flag and 10000b
|
||||||
|
retn
|
||||||
|
else
|
||||||
|
retn parmbytes
|
||||||
|
end if }
|
||||||
|
|
||||||
|
macro define@proc name,statement
|
||||||
|
{ local params,flag,regs,parmbytes,localbytes,current
|
||||||
|
if used name
|
||||||
|
name:
|
||||||
|
match =stdcall args, statement \{ params equ args
|
||||||
|
flag = 11b \}
|
||||||
|
match =stdcall, statement \{ params equ
|
||||||
|
flag = 11b \}
|
||||||
|
match =c args, statement \{ params equ args
|
||||||
|
flag = 10001b \}
|
||||||
|
match =c, statement \{ params equ
|
||||||
|
flag = 10001b \}
|
||||||
|
match =params, params \{ params equ statement
|
||||||
|
flag = 0 \}
|
||||||
|
virtual at ebp+8
|
||||||
|
match =uses reglist=,args, params \{ regs equ reglist
|
||||||
|
params equ args \}
|
||||||
|
match =regs =uses reglist, regs params \{ regs equ reglist
|
||||||
|
params equ \}
|
||||||
|
match =regs, regs \{ regs equ \}
|
||||||
|
match =,args, params \{ defargs@proc args \}
|
||||||
|
match =args@proc args, args@proc params \{ defargs@proc args \}
|
||||||
|
parmbytes = $ - (ebp+8)
|
||||||
|
end virtual
|
||||||
|
name # % = parmbytes/4
|
||||||
|
all@vars equ
|
||||||
|
current = 0
|
||||||
|
match prologue:reglist, prologue@proc:<regs> \{ prologue name,flag,parmbytes,localbytes,reglist \}
|
||||||
|
macro locals
|
||||||
|
\{ virtual at ebp-localbytes+current
|
||||||
|
macro label . \\{ deflocal@proc .,:, \\}
|
||||||
|
struc db [val] \\{ \common deflocal@proc .,db,val \\}
|
||||||
|
struc dw [val] \\{ \common deflocal@proc .,dw,val \\}
|
||||||
|
struc dp [val] \\{ \common deflocal@proc .,dp,val \\}
|
||||||
|
struc dd [val] \\{ \common deflocal@proc .,dd,val \\}
|
||||||
|
struc dt [val] \\{ \common deflocal@proc .,dt,val \\}
|
||||||
|
struc dq [val] \\{ \common deflocal@proc .,dq,val \\}
|
||||||
|
struc rb cnt \\{ deflocal@proc .,rb cnt, \\}
|
||||||
|
struc rw cnt \\{ deflocal@proc .,rw cnt, \\}
|
||||||
|
struc rp cnt \\{ deflocal@proc .,rp cnt, \\}
|
||||||
|
struc rd cnt \\{ deflocal@proc .,rd cnt, \\}
|
||||||
|
struc rt cnt \\{ deflocal@proc .,rt cnt, \\}
|
||||||
|
struc rq cnt \\{ deflocal@proc .,rq cnt, \\} \}
|
||||||
|
macro endl
|
||||||
|
\{ purge label
|
||||||
|
restruc db,dw,dp,dd,dt,dq
|
||||||
|
restruc rb,rw,rp,rd,rt,rq
|
||||||
|
restruc byte,word,dword,pword,tword,qword
|
||||||
|
current = $-(ebp-localbytes)
|
||||||
|
end virtual \}
|
||||||
|
macro ret operand
|
||||||
|
\{ match any, operand \\{ retn operand \\}
|
||||||
|
match , operand \\{ match epilogue:reglist, epilogue@proc:<regs>
|
||||||
|
\\\{ epilogue name,flag,parmbytes,localbytes,reglist \\\} \\} \}
|
||||||
|
macro finish@proc \{ localbytes = (((current-1) shr 2)+1) shl 2
|
||||||
|
end if \} }
|
||||||
|
|
||||||
|
macro defargs@proc [arg]
|
||||||
|
{ common
|
||||||
|
if ~ arg eq
|
||||||
|
forward
|
||||||
|
local ..arg,current@arg
|
||||||
|
match argname:type, arg
|
||||||
|
\{ current@arg equ argname
|
||||||
|
label ..arg type
|
||||||
|
argname equ ..arg
|
||||||
|
if dqword eq type
|
||||||
|
dd ?,?,?,?
|
||||||
|
else if tbyte eq type
|
||||||
|
dd ?,?,?
|
||||||
|
else if qword eq type | pword eq type
|
||||||
|
dd ?,?
|
||||||
|
else
|
||||||
|
dd ?
|
||||||
|
end if \}
|
||||||
|
match =current@arg,current@arg
|
||||||
|
\{ current@arg equ arg
|
||||||
|
arg equ ..arg
|
||||||
|
..arg dd ? \}
|
||||||
|
common
|
||||||
|
args@proc equ current@arg
|
||||||
|
forward
|
||||||
|
restore current@arg
|
||||||
|
common
|
||||||
|
end if }
|
||||||
|
|
||||||
|
macro deflocal@proc name,def,[val]
|
||||||
|
{ common
|
||||||
|
match vars, all@vars \{ all@vars equ all@vars, \}
|
||||||
|
all@vars equ all@vars name
|
||||||
|
forward
|
||||||
|
local ..var,..tmp
|
||||||
|
..var def val
|
||||||
|
match =?, val \{ ..tmp equ \}
|
||||||
|
match any =dup (=?), val \{ ..tmp equ \}
|
||||||
|
match tmp : value, ..tmp : val
|
||||||
|
\{ tmp: end virtual
|
||||||
|
initlocal@proc ..var,def value
|
||||||
|
virtual at tmp\}
|
||||||
|
common
|
||||||
|
match first rest, ..var, \{ name equ first \} }
|
||||||
|
|
||||||
|
macro initlocal@proc name,def
|
||||||
|
{ virtual at name
|
||||||
|
def
|
||||||
|
size@initlocal = $ - name
|
||||||
|
end virtual
|
||||||
|
position@initlocal = 0
|
||||||
|
while size@initlocal > position@initlocal
|
||||||
|
virtual at name
|
||||||
|
def
|
||||||
|
if size@initlocal - position@initlocal < 2
|
||||||
|
current@initlocal = 1
|
||||||
|
load byte@initlocal byte from name+position@initlocal
|
||||||
|
else if size@initlocal - position@initlocal < 4
|
||||||
|
current@initlocal = 2
|
||||||
|
load word@initlocal word from name+position@initlocal
|
||||||
|
else
|
||||||
|
current@initlocal = 4
|
||||||
|
load dword@initlocal dword from name+position@initlocal
|
||||||
|
end if
|
||||||
|
end virtual
|
||||||
|
if current@initlocal = 1
|
||||||
|
mov byte [name+position@initlocal],byte@initlocal
|
||||||
|
else if current@initlocal = 2
|
||||||
|
mov word [name+position@initlocal],word@initlocal
|
||||||
|
else
|
||||||
|
mov dword [name+position@initlocal],dword@initlocal
|
||||||
|
end if
|
||||||
|
position@initlocal = position@initlocal + current@initlocal
|
||||||
|
end while }
|
||||||
|
|
||||||
|
macro endp
|
||||||
|
{ purge ret,locals,endl
|
||||||
|
finish@proc
|
||||||
|
purge finish@proc
|
||||||
|
restore regs@proc
|
||||||
|
match all,args@proc \{ restore all \}
|
||||||
|
restore args@proc
|
||||||
|
match all,all@vars \{ restore all \} }
|
||||||
|
|
||||||
|
macro local [var]
|
||||||
|
{ common
|
||||||
|
locals
|
||||||
|
forward done@local equ
|
||||||
|
match varname[count]:vartype, var
|
||||||
|
\{ match =BYTE, vartype \\{ varname rb count
|
||||||
|
restore done@local \\}
|
||||||
|
match =WORD, vartype \\{ varname rw count
|
||||||
|
restore done@local \\}
|
||||||
|
match =DWORD, vartype \\{ varname rd count
|
||||||
|
restore done@local \\}
|
||||||
|
match =PWORD, vartype \\{ varname rp count
|
||||||
|
restore done@local \\}
|
||||||
|
match =QWORD, vartype \\{ varname rq count
|
||||||
|
restore done@local \\}
|
||||||
|
match =TBYTE, vartype \\{ varname rt count
|
||||||
|
restore done@local \\}
|
||||||
|
match =DQWORD, vartype \\{ label varname dqword
|
||||||
|
rq count+count
|
||||||
|
restore done@local \\}
|
||||||
|
match , done@local \\{ virtual
|
||||||
|
varname vartype
|
||||||
|
end virtual
|
||||||
|
rb count*sizeof.\#vartype
|
||||||
|
restore done@local \\} \}
|
||||||
|
match :varname:vartype, done@local:var
|
||||||
|
\{ match =BYTE, vartype \\{ varname db ?
|
||||||
|
restore done@local \\}
|
||||||
|
match =WORD, vartype \\{ varname dw ?
|
||||||
|
restore done@local \\}
|
||||||
|
match =DWORD, vartype \\{ varname dd ?
|
||||||
|
restore done@local \\}
|
||||||
|
match =PWORD, vartype \\{ varname dp ?
|
||||||
|
restore done@local \\}
|
||||||
|
match =QWORD, vartype \\{ varname dq ?
|
||||||
|
restore done@local \\}
|
||||||
|
match =TBYTE, vartype \\{ varname dt ?
|
||||||
|
restore done@local \\}
|
||||||
|
match =DQWORD, vartype \\{ label varname dqword
|
||||||
|
dq ?,?
|
||||||
|
restore done@local \\}
|
||||||
|
match , done@local \\{ varname vartype
|
||||||
|
restore done@local \\} \}
|
||||||
|
match ,done@local
|
||||||
|
\{ var
|
||||||
|
restore done@local \}
|
||||||
|
common
|
||||||
|
endl }
|
1177
kernel/trunk/drivers/sis.asm
Normal file
1177
kernel/trunk/drivers/sis.asm
Normal file
File diff suppressed because it is too large
Load Diff
1394
kernel/trunk/drivers/unisound.asm
Normal file
1394
kernel/trunk/drivers/unisound.asm
Normal file
File diff suppressed because it is too large
Load Diff
@ -120,7 +120,7 @@ app_data equ 3+app_data_l-gdts
|
|||||||
|
|
||||||
; CR0 Flags - Protected mode and Paging
|
; CR0 Flags - Protected mode and Paging
|
||||||
|
|
||||||
mov ecx, 0x00000021
|
mov ecx, CR0_PE
|
||||||
|
|
||||||
; Enabling 32 bit protected mode
|
; Enabling 32 bit protected mode
|
||||||
|
|
||||||
@ -400,7 +400,7 @@ include 'detect/disks.inc'
|
|||||||
mov cr3, eax
|
mov cr3, eax
|
||||||
|
|
||||||
mov eax,cr0
|
mov eax,cr0
|
||||||
or eax,0x80000000
|
or eax,CR0_PG
|
||||||
mov cr0,eax
|
mov cr0,eax
|
||||||
|
|
||||||
call init_kernel_heap
|
call init_kernel_heap
|
||||||
@ -447,25 +447,48 @@ include 'detect/disks.inc'
|
|||||||
mov ecx, 16
|
mov ecx, 16
|
||||||
rep movsb
|
rep movsb
|
||||||
|
|
||||||
|
clts
|
||||||
|
fninit
|
||||||
|
|
||||||
bt [cpu_caps], CAPS_FXSR
|
bt [cpu_caps], CAPS_FXSR
|
||||||
jnc .no_FXSR
|
jnc .no_FXSR
|
||||||
|
|
||||||
stdcall kernel_alloc, 512*256
|
stdcall kernel_alloc, 512*256
|
||||||
mov [fpu_data], eax
|
mov [fpu_data], eax
|
||||||
|
|
||||||
mov ebx, cr4
|
mov ebx, cr4
|
||||||
or ebx, CR4_OSFXSR
|
mov ecx, cr0
|
||||||
|
or ebx, CR4_OSFXSR+CR4_OSXMMEXPT
|
||||||
mov cr4, ebx
|
mov cr4, ebx
|
||||||
jmp .clts
|
|
||||||
|
and ecx, not (CR0_MP+CR0_EM)
|
||||||
|
or ecx, CR0_NE
|
||||||
|
mov cr0, ecx
|
||||||
|
|
||||||
|
mov dword [esp-4], SSE_INIT
|
||||||
|
ldmxcsr [esp-4]
|
||||||
|
|
||||||
|
xorps xmm0, xmm0
|
||||||
|
xorps xmm1, xmm1
|
||||||
|
xorps xmm2, xmm2
|
||||||
|
xorps xmm3, xmm3
|
||||||
|
xorps xmm4, xmm4
|
||||||
|
xorps xmm5, xmm5
|
||||||
|
xorps xmm6, xmm6
|
||||||
|
xorps xmm7, xmm7
|
||||||
|
|
||||||
|
jmp .set_cr
|
||||||
.no_FXSR:
|
.no_FXSR:
|
||||||
stdcall kernel_alloc, 112*256
|
stdcall kernel_alloc, 112*256
|
||||||
mov [fpu_data], eax
|
mov [fpu_data], eax
|
||||||
mov ebx, cr4
|
mov ebx, cr4
|
||||||
|
mov ecx, cr0
|
||||||
and ebx, not (CR4_OSFXSR+CR4_OSXMMEXPT)
|
and ebx, not (CR4_OSFXSR+CR4_OSXMMEXPT)
|
||||||
|
and ecx, not CR0_EM
|
||||||
|
or ecx, CR0_MP+CR0_NE
|
||||||
|
mov cr0, ecx
|
||||||
mov cr4, ebx
|
mov cr4, ebx
|
||||||
.clts:
|
.set_cr:
|
||||||
clts
|
|
||||||
fninit
|
|
||||||
|
|
||||||
mov edi, irq_tab
|
mov edi, irq_tab
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
mov ecx, 16
|
mov ecx, 16
|
||||||
|
268
kernel/trunk/proc32.inc
Normal file
268
kernel/trunk/proc32.inc
Normal file
@ -0,0 +1,268 @@
|
|||||||
|
|
||||||
|
; Macroinstructions for defining and calling procedures
|
||||||
|
|
||||||
|
macro stdcall proc,[arg] ; directly call STDCALL procedure
|
||||||
|
{ common
|
||||||
|
if ~ arg eq
|
||||||
|
reverse
|
||||||
|
pushd arg
|
||||||
|
common
|
||||||
|
end if
|
||||||
|
call proc }
|
||||||
|
|
||||||
|
macro invoke proc,[arg] ; indirectly call STDCALL procedure
|
||||||
|
{ common
|
||||||
|
if ~ arg eq
|
||||||
|
reverse
|
||||||
|
pushd arg
|
||||||
|
common
|
||||||
|
end if
|
||||||
|
call [proc] }
|
||||||
|
|
||||||
|
macro ccall proc,[arg] ; directly call CDECL procedure
|
||||||
|
{ common
|
||||||
|
size@ccall = 0
|
||||||
|
if ~ arg eq
|
||||||
|
reverse
|
||||||
|
pushd arg
|
||||||
|
size@ccall = size@ccall+4
|
||||||
|
common
|
||||||
|
end if
|
||||||
|
call proc
|
||||||
|
if size@ccall
|
||||||
|
add esp,size@ccall
|
||||||
|
end if }
|
||||||
|
|
||||||
|
macro cinvoke proc,[arg] ; indirectly call CDECL procedure
|
||||||
|
{ common
|
||||||
|
size@ccall = 0
|
||||||
|
if ~ arg eq
|
||||||
|
reverse
|
||||||
|
pushd arg
|
||||||
|
size@ccall = size@ccall+4
|
||||||
|
common
|
||||||
|
end if
|
||||||
|
call [proc]
|
||||||
|
if size@ccall
|
||||||
|
add esp,size@ccall
|
||||||
|
end if }
|
||||||
|
|
||||||
|
macro proc [args] ; define procedure
|
||||||
|
{ common
|
||||||
|
match name params, args>
|
||||||
|
\{ define@proc name,<params \} }
|
||||||
|
|
||||||
|
prologue@proc equ prologuedef
|
||||||
|
|
||||||
|
macro prologuedef procname,flag,parmbytes,localbytes,reglist
|
||||||
|
{ if parmbytes | localbytes
|
||||||
|
push ebp
|
||||||
|
mov ebp,esp
|
||||||
|
if localbytes
|
||||||
|
sub esp,localbytes
|
||||||
|
end if
|
||||||
|
end if
|
||||||
|
irps reg, reglist \{ push reg \} }
|
||||||
|
|
||||||
|
epilogue@proc equ epiloguedef
|
||||||
|
|
||||||
|
macro epiloguedef procname,flag,parmbytes,localbytes,reglist
|
||||||
|
{ irps reg, reglist \{ reverse pop reg \}
|
||||||
|
if parmbytes | localbytes
|
||||||
|
leave
|
||||||
|
end if
|
||||||
|
if flag and 10000b
|
||||||
|
retn
|
||||||
|
else
|
||||||
|
retn parmbytes
|
||||||
|
end if }
|
||||||
|
|
||||||
|
macro define@proc name,statement
|
||||||
|
{ local params,flag,regs,parmbytes,localbytes,current
|
||||||
|
if used name
|
||||||
|
name:
|
||||||
|
match =stdcall args, statement \{ params equ args
|
||||||
|
flag = 11b \}
|
||||||
|
match =stdcall, statement \{ params equ
|
||||||
|
flag = 11b \}
|
||||||
|
match =c args, statement \{ params equ args
|
||||||
|
flag = 10001b \}
|
||||||
|
match =c, statement \{ params equ
|
||||||
|
flag = 10001b \}
|
||||||
|
match =params, params \{ params equ statement
|
||||||
|
flag = 0 \}
|
||||||
|
virtual at ebp+8
|
||||||
|
match =uses reglist=,args, params \{ regs equ reglist
|
||||||
|
params equ args \}
|
||||||
|
match =regs =uses reglist, regs params \{ regs equ reglist
|
||||||
|
params equ \}
|
||||||
|
match =regs, regs \{ regs equ \}
|
||||||
|
match =,args, params \{ defargs@proc args \}
|
||||||
|
match =args@proc args, args@proc params \{ defargs@proc args \}
|
||||||
|
parmbytes = $ - (ebp+8)
|
||||||
|
end virtual
|
||||||
|
name # % = parmbytes/4
|
||||||
|
all@vars equ
|
||||||
|
current = 0
|
||||||
|
match prologue:reglist, prologue@proc:<regs> \{ prologue name,flag,parmbytes,localbytes,reglist \}
|
||||||
|
macro locals
|
||||||
|
\{ virtual at ebp-localbytes+current
|
||||||
|
macro label . \\{ deflocal@proc .,:, \\}
|
||||||
|
struc db [val] \\{ \common deflocal@proc .,db,val \\}
|
||||||
|
struc dw [val] \\{ \common deflocal@proc .,dw,val \\}
|
||||||
|
struc dp [val] \\{ \common deflocal@proc .,dp,val \\}
|
||||||
|
struc dd [val] \\{ \common deflocal@proc .,dd,val \\}
|
||||||
|
struc dt [val] \\{ \common deflocal@proc .,dt,val \\}
|
||||||
|
struc dq [val] \\{ \common deflocal@proc .,dq,val \\}
|
||||||
|
struc rb cnt \\{ deflocal@proc .,rb cnt, \\}
|
||||||
|
struc rw cnt \\{ deflocal@proc .,rw cnt, \\}
|
||||||
|
struc rp cnt \\{ deflocal@proc .,rp cnt, \\}
|
||||||
|
struc rd cnt \\{ deflocal@proc .,rd cnt, \\}
|
||||||
|
struc rt cnt \\{ deflocal@proc .,rt cnt, \\}
|
||||||
|
struc rq cnt \\{ deflocal@proc .,rq cnt, \\} \}
|
||||||
|
macro endl
|
||||||
|
\{ purge label
|
||||||
|
restruc db,dw,dp,dd,dt,dq
|
||||||
|
restruc rb,rw,rp,rd,rt,rq
|
||||||
|
restruc byte,word,dword,pword,tword,qword
|
||||||
|
current = $-(ebp-localbytes)
|
||||||
|
end virtual \}
|
||||||
|
macro ret operand
|
||||||
|
\{ match any, operand \\{ retn operand \\}
|
||||||
|
match , operand \\{ match epilogue:reglist, epilogue@proc:<regs>
|
||||||
|
\\\{ epilogue name,flag,parmbytes,localbytes,reglist \\\} \\} \}
|
||||||
|
macro finish@proc \{ localbytes = (((current-1) shr 2)+1) shl 2
|
||||||
|
end if \} }
|
||||||
|
|
||||||
|
macro defargs@proc [arg]
|
||||||
|
{ common
|
||||||
|
if ~ arg eq
|
||||||
|
forward
|
||||||
|
local ..arg,current@arg
|
||||||
|
match argname:type, arg
|
||||||
|
\{ current@arg equ argname
|
||||||
|
label ..arg type
|
||||||
|
argname equ ..arg
|
||||||
|
if dqword eq type
|
||||||
|
dd ?,?,?,?
|
||||||
|
else if tbyte eq type
|
||||||
|
dd ?,?,?
|
||||||
|
else if qword eq type | pword eq type
|
||||||
|
dd ?,?
|
||||||
|
else
|
||||||
|
dd ?
|
||||||
|
end if \}
|
||||||
|
match =current@arg,current@arg
|
||||||
|
\{ current@arg equ arg
|
||||||
|
arg equ ..arg
|
||||||
|
..arg dd ? \}
|
||||||
|
common
|
||||||
|
args@proc equ current@arg
|
||||||
|
forward
|
||||||
|
restore current@arg
|
||||||
|
common
|
||||||
|
end if }
|
||||||
|
|
||||||
|
macro deflocal@proc name,def,[val]
|
||||||
|
{ common
|
||||||
|
match vars, all@vars \{ all@vars equ all@vars, \}
|
||||||
|
all@vars equ all@vars name
|
||||||
|
forward
|
||||||
|
local ..var,..tmp
|
||||||
|
..var def val
|
||||||
|
match =?, val \{ ..tmp equ \}
|
||||||
|
match any =dup (=?), val \{ ..tmp equ \}
|
||||||
|
match tmp : value, ..tmp : val
|
||||||
|
\{ tmp: end virtual
|
||||||
|
initlocal@proc ..var,def value
|
||||||
|
virtual at tmp\}
|
||||||
|
common
|
||||||
|
match first rest, ..var, \{ name equ first \} }
|
||||||
|
|
||||||
|
macro initlocal@proc name,def
|
||||||
|
{ virtual at name
|
||||||
|
def
|
||||||
|
size@initlocal = $ - name
|
||||||
|
end virtual
|
||||||
|
position@initlocal = 0
|
||||||
|
while size@initlocal > position@initlocal
|
||||||
|
virtual at name
|
||||||
|
def
|
||||||
|
if size@initlocal - position@initlocal < 2
|
||||||
|
current@initlocal = 1
|
||||||
|
load byte@initlocal byte from name+position@initlocal
|
||||||
|
else if size@initlocal - position@initlocal < 4
|
||||||
|
current@initlocal = 2
|
||||||
|
load word@initlocal word from name+position@initlocal
|
||||||
|
else
|
||||||
|
current@initlocal = 4
|
||||||
|
load dword@initlocal dword from name+position@initlocal
|
||||||
|
end if
|
||||||
|
end virtual
|
||||||
|
if current@initlocal = 1
|
||||||
|
mov byte [name+position@initlocal],byte@initlocal
|
||||||
|
else if current@initlocal = 2
|
||||||
|
mov word [name+position@initlocal],word@initlocal
|
||||||
|
else
|
||||||
|
mov dword [name+position@initlocal],dword@initlocal
|
||||||
|
end if
|
||||||
|
position@initlocal = position@initlocal + current@initlocal
|
||||||
|
end while }
|
||||||
|
|
||||||
|
macro endp
|
||||||
|
{ purge ret,locals,endl
|
||||||
|
finish@proc
|
||||||
|
purge finish@proc
|
||||||
|
restore regs@proc
|
||||||
|
match all,args@proc \{ restore all \}
|
||||||
|
restore args@proc
|
||||||
|
match all,all@vars \{ restore all \} }
|
||||||
|
|
||||||
|
macro local [var]
|
||||||
|
{ common
|
||||||
|
locals
|
||||||
|
forward done@local equ
|
||||||
|
match varname[count]:vartype, var
|
||||||
|
\{ match =BYTE, vartype \\{ varname rb count
|
||||||
|
restore done@local \\}
|
||||||
|
match =WORD, vartype \\{ varname rw count
|
||||||
|
restore done@local \\}
|
||||||
|
match =DWORD, vartype \\{ varname rd count
|
||||||
|
restore done@local \\}
|
||||||
|
match =PWORD, vartype \\{ varname rp count
|
||||||
|
restore done@local \\}
|
||||||
|
match =QWORD, vartype \\{ varname rq count
|
||||||
|
restore done@local \\}
|
||||||
|
match =TBYTE, vartype \\{ varname rt count
|
||||||
|
restore done@local \\}
|
||||||
|
match =DQWORD, vartype \\{ label varname dqword
|
||||||
|
rq count+count
|
||||||
|
restore done@local \\}
|
||||||
|
match , done@local \\{ virtual
|
||||||
|
varname vartype
|
||||||
|
end virtual
|
||||||
|
rb count*sizeof.\#vartype
|
||||||
|
restore done@local \\} \}
|
||||||
|
match :varname:vartype, done@local:var
|
||||||
|
\{ match =BYTE, vartype \\{ varname db ?
|
||||||
|
restore done@local \\}
|
||||||
|
match =WORD, vartype \\{ varname dw ?
|
||||||
|
restore done@local \\}
|
||||||
|
match =DWORD, vartype \\{ varname dd ?
|
||||||
|
restore done@local \\}
|
||||||
|
match =PWORD, vartype \\{ varname dp ?
|
||||||
|
restore done@local \\}
|
||||||
|
match =QWORD, vartype \\{ varname dq ?
|
||||||
|
restore done@local \\}
|
||||||
|
match =TBYTE, vartype \\{ varname dt ?
|
||||||
|
restore done@local \\}
|
||||||
|
match =DQWORD, vartype \\{ label varname dqword
|
||||||
|
dq ?,?
|
||||||
|
restore done@local \\}
|
||||||
|
match , done@local \\{ varname vartype
|
||||||
|
restore done@local \\} \}
|
||||||
|
match ,done@local
|
||||||
|
\{ var
|
||||||
|
restore done@local \}
|
||||||
|
common
|
||||||
|
endl }
|
Loading…
Reference in New Issue
Block a user