forked from KolibriOS/kolibrios
b6950333ac
git-svn-id: svn://kolibrios.org@164 a494cfbc-eb01-0410-851d-a64ba20cac60
617 lines
11 KiB
PHP
617 lines
11 KiB
PHP
;
|
|
; 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.
|
|
|
|
align 4
|
|
proc attach_int_handler stdcall, irq:dword, handler:dword
|
|
|
|
mov ebx, [irq] ;irq num
|
|
test ebx, ebx
|
|
jz .err
|
|
mov eax, [handler]
|
|
test eax, eax
|
|
jz .err
|
|
mov [irq_tab+ebx*4], eax
|
|
stdcall enable_irq, [irq]
|
|
ret
|
|
.err:
|
|
xor eax, eax
|
|
ret
|
|
endp
|
|
|
|
align 4
|
|
proc detach_int_handler
|
|
|
|
ret
|
|
endp
|
|
|
|
align 4
|
|
proc enable_irq stdcall, irq_line:dword
|
|
mov ebx, [irq_line]
|
|
mov edx, 0x21
|
|
cmp ebx, 8
|
|
jb @F
|
|
mov edx, 0xA1
|
|
sub ebx,8
|
|
@@:
|
|
in al,dx
|
|
btr eax, ebx
|
|
out dx, al
|
|
ret
|
|
endp
|
|
|
|
align 16
|
|
;; proc irq_serv
|
|
|
|
irq_serv:
|
|
|
|
.irq_1:
|
|
push eax
|
|
mov eax, 1
|
|
jmp .main
|
|
align 4
|
|
.irq_2:
|
|
push eax
|
|
mov eax, 2
|
|
jmp .main
|
|
align 4
|
|
.irq_3:
|
|
push eax
|
|
mov eax, 3
|
|
jmp .main
|
|
align 4
|
|
.irq_4:
|
|
push eax
|
|
mov eax, 4
|
|
jmp .main
|
|
align 4
|
|
.irq_5:
|
|
push eax
|
|
mov eax, 5
|
|
jmp .main
|
|
align 4
|
|
.irq_6:
|
|
push eax
|
|
mov eax, 6
|
|
jmp .main
|
|
align 4
|
|
.irq_7:
|
|
push eax
|
|
mov eax, 7
|
|
jmp .main
|
|
align 4
|
|
.irq_8:
|
|
push eax
|
|
mov eax, 8
|
|
jmp .main
|
|
align 4
|
|
.irq_9:
|
|
push eax
|
|
mov eax, 9
|
|
jmp .main
|
|
align 4
|
|
.irq_10:
|
|
push eax
|
|
mov eax, 10
|
|
jmp .main
|
|
align 4
|
|
.irq_11:
|
|
push eax
|
|
mov eax, 11
|
|
jmp .main
|
|
align 4
|
|
.irq_12:
|
|
push eax
|
|
mov eax, 12
|
|
jmp .main
|
|
align 4
|
|
.irq_13:
|
|
push eax
|
|
mov eax, 13
|
|
jmp .main
|
|
align 4
|
|
.irq_14:
|
|
push eax
|
|
mov eax, 14
|
|
jmp .main
|
|
align 4
|
|
.irq_15:
|
|
push eax
|
|
mov eax, 15
|
|
jmp .main
|
|
|
|
align 16
|
|
.main:
|
|
save_ring3_context
|
|
mov bx, os_data
|
|
mov ds, bx
|
|
mov es, bx
|
|
|
|
mov ebx, [irq_tab+eax*4]
|
|
test ebx, ebx
|
|
jz .exit
|
|
|
|
call ebx
|
|
|
|
.exit:
|
|
restore_ring3_context
|
|
|
|
cmp eax, 8
|
|
mov al, 0x20
|
|
jb @f
|
|
out 0xa0, al
|
|
@@:
|
|
out 0x20, al
|
|
|
|
pop eax
|
|
iret
|
|
|
|
align 4
|
|
proc get_notify stdcall, p_ev:dword
|
|
|
|
.wait:
|
|
mov ebx,[CURRENT_TASK]
|
|
shl ebx,8
|
|
test dword [ebx+PROC_BASE+0xA8],EVENT_NOTIFY
|
|
jz @f
|
|
and dword [ebx+PROC_BASE+0xA8], not EVENT_NOTIFY
|
|
mov edi, [p_ev]
|
|
mov dword [edi], EV_INTR
|
|
mov eax, [ebx+PROC_BASE+APPDATA.event]
|
|
mov dword [edi+4], eax
|
|
ret
|
|
@@:
|
|
call change_task
|
|
jmp .wait
|
|
endp
|
|
|
|
align 4
|
|
proc pci_read32 stdcall, bus:dword, devfn:dword, reg:dword
|
|
xor eax, eax
|
|
xor ebx, ebx
|
|
mov ah, byte [bus]
|
|
mov al, 6
|
|
mov bh, byte [devfn]
|
|
mov bl, byte [reg]
|
|
call pci_read_reg
|
|
ret
|
|
endp
|
|
|
|
align 4
|
|
proc pci_read8 stdcall, bus:dword, devfn:dword, reg:dword
|
|
xor eax, eax
|
|
xor ebx, ebx
|
|
mov ah, byte [bus]
|
|
mov al, 4
|
|
mov bh, byte [devfn]
|
|
mov bl, byte [reg]
|
|
call pci_read_reg
|
|
ret
|
|
endp
|
|
|
|
align 4
|
|
proc pci_write8 stdcall, bus:dword, devfn:dword, reg:dword, val:dword
|
|
xor eax, eax
|
|
xor ebx, ebx
|
|
mov ah, byte [bus]
|
|
mov al, 8
|
|
mov bh, byte [devfn]
|
|
mov bl, byte [reg]
|
|
mov ecx, [val]
|
|
call pci_write_reg
|
|
ret
|
|
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
|
|
proc srv_handler stdcall, ioctl:dword
|
|
mov esi, [ioctl]
|
|
test esi, esi
|
|
jz .err
|
|
|
|
mov edi, [esi+handle]
|
|
cmp [edi+SRV.magic], ' SRV'
|
|
jne .fail
|
|
|
|
cmp [edi+SRV.size], SRV_SIZE
|
|
jne .fail
|
|
|
|
stdcall [edi+SRV.srv_proc], esi
|
|
ret
|
|
.fail:
|
|
xor eax, eax
|
|
not eax
|
|
mov [esi+output], eax
|
|
mov [esi+out_size], 4
|
|
ret
|
|
.err:
|
|
xor eax, eax
|
|
not eax
|
|
ret
|
|
endp
|
|
|
|
align 4
|
|
proc srv_handlerEx stdcall, ioctl:dword
|
|
mov esi, [ioctl]
|
|
test esi, esi
|
|
jz .err
|
|
add esi, new_app_base
|
|
|
|
mov edi, [esi+handle]
|
|
cmp [edi+SRV.magic], ' SRV'
|
|
jne .fail
|
|
|
|
cmp [edi+SRV.size], SRV_SIZE
|
|
jne .fail
|
|
|
|
add [esi+input], new_app_base
|
|
add [esi+output], new_app_base
|
|
|
|
stdcall [edi+SRV.srv_proc], esi
|
|
ret
|
|
.fail:
|
|
xor eax, eax
|
|
not eax
|
|
mov [esi+output], eax
|
|
mov [esi+out_size], 4
|
|
ret
|
|
.err:
|
|
xor eax, eax
|
|
not eax
|
|
ret
|
|
endp
|
|
|
|
restore handle
|
|
restore io_code
|
|
restore input
|
|
restore inp_size
|
|
restore output
|
|
restore out_size
|
|
|
|
align 4
|
|
proc get_service stdcall, sz_name:dword
|
|
locals
|
|
srv_ptr dd ?
|
|
counter dd ?
|
|
endl
|
|
|
|
mov eax, [sz_name]
|
|
test eax, eax
|
|
jz .fail
|
|
|
|
mov [srv_ptr], srv_tab
|
|
mov [counter], 16
|
|
@@:
|
|
stdcall strncmp, [srv_ptr], [sz_name], 16
|
|
test eax, eax
|
|
je .ok
|
|
|
|
add [srv_ptr], SRV_SIZE
|
|
dec [counter]
|
|
jnz @B
|
|
.not_load:
|
|
|
|
stdcall find_service, [sz_name]
|
|
test eax, eax
|
|
jz .fail
|
|
|
|
stdcall load_lib, eax
|
|
test eax, eax
|
|
jz .fail
|
|
|
|
mov [srv_ptr], srv_tab
|
|
mov [counter], 16
|
|
@@:
|
|
stdcall strncmp, [srv_ptr], [sz_name], 16
|
|
test eax, eax
|
|
je .ok
|
|
|
|
add [srv_ptr], SRV_SIZE
|
|
dec [counter]
|
|
jnz @B
|
|
.fail:
|
|
xor eax, eax
|
|
ret
|
|
.ok:
|
|
mov eax, [srv_ptr]
|
|
ret
|
|
endp
|
|
|
|
align 4
|
|
proc find_service stdcall ,sz_name:dword
|
|
|
|
mov eax, [sz_name]
|
|
test eax, eax
|
|
jz .fail
|
|
|
|
mov esi, services
|
|
@@:
|
|
mov eax, [esi]
|
|
test eax, eax
|
|
jz .fail
|
|
push esi
|
|
stdcall strncmp, eax, [sz_name], 16
|
|
pop esi
|
|
test eax, eax
|
|
je .ok
|
|
|
|
add esi, 8
|
|
jmp @B
|
|
.ok:
|
|
mov eax, [esi+4]
|
|
ret
|
|
.fail:
|
|
xor eax, eax
|
|
ret
|
|
endp
|
|
|
|
align 4
|
|
proc reg_service stdcall, sz_name:dword, handler:dword
|
|
locals
|
|
srv dd ?
|
|
endl
|
|
|
|
mov eax, [sz_name]
|
|
test eax, eax
|
|
jz .fail
|
|
|
|
mov ebx, [handler]
|
|
test ebx, ebx
|
|
jz .fail
|
|
|
|
call alloc_service
|
|
test eax, eax
|
|
jz .fail
|
|
|
|
mov [srv], eax
|
|
mov edi, eax
|
|
mov esi, [sz_name]
|
|
mov ecx, 16
|
|
rep movsb
|
|
|
|
mov edi, eax
|
|
mov [edi+SRV.magic], ' SRV'
|
|
mov [edi+SRV.size], SRV_SIZE
|
|
mov ebx, [handler]
|
|
mov [edi+SRV.srv_proc], ebx
|
|
mov eax, [srv]
|
|
ret
|
|
.fail:
|
|
xor eax, eax
|
|
ret
|
|
endp
|
|
|
|
align 4
|
|
proc get_proc stdcall, exp:dword, sz_name:dword
|
|
|
|
mov edx, [exp]
|
|
.next:
|
|
mov eax, [edx]
|
|
test eax, eax
|
|
jz .end
|
|
|
|
push edx
|
|
stdcall strncmp, eax, [sz_name], 16
|
|
pop edx
|
|
test eax, eax
|
|
jz .ok
|
|
|
|
add edx,8
|
|
jmp .next
|
|
.ok:
|
|
mov eax, [edx+4]
|
|
.end:
|
|
ret
|
|
endp
|
|
|
|
align 4
|
|
proc link_dll stdcall, exp:dword, imp:dword
|
|
mov esi, [imp]
|
|
.next:
|
|
mov eax, [esi]
|
|
test eax, eax
|
|
jz .end
|
|
|
|
push esi
|
|
stdcall get_proc, [exp], eax
|
|
pop esi
|
|
|
|
test eax, eax
|
|
jz @F
|
|
|
|
mov [esi], eax
|
|
@@:
|
|
add esi, 4
|
|
jmp .next
|
|
.end:
|
|
ret
|
|
endp
|
|
|
|
align 4
|
|
proc get_coff_sym stdcall, pSym:dword,count:dword, sz_sym:dword
|
|
|
|
@@:
|
|
stdcall strncmp, [pSym], [sz_sym], 8
|
|
test eax,eax
|
|
jz .ok
|
|
add [pSym], 18
|
|
dec [count]
|
|
jnz @b
|
|
xor eax, eax
|
|
ret
|
|
.ok:
|
|
mov ebx, [pSym]
|
|
mov eax, [ebx+8]
|
|
ret
|
|
endp
|
|
|
|
align 4
|
|
proc load_lib stdcall, name:dword
|
|
locals
|
|
lib dd ?
|
|
base dd ?
|
|
pSym dd ?
|
|
endl
|
|
|
|
mov eax, [name]
|
|
mov ebx, 1 ;index of first block
|
|
mov ecx, 32 ;number of blocks
|
|
mov edx, TMP_BUFF ;temp area
|
|
mov esi, 12 ;file name length
|
|
|
|
call fileread ;read file from RD
|
|
|
|
cmp eax,0
|
|
jne .err
|
|
|
|
; mov eax, [TMP_BUFF+CFH.pSymTable]
|
|
; add eax, TMP_BUFF
|
|
; mov [pSym], eax
|
|
|
|
; mov [TMP_BUFF+20+CFS.VirtualAddress], eax
|
|
|
|
stdcall kernel_alloc, [TMP_BUFF+20+CFS.SizeOfRawData]
|
|
mov [base], eax
|
|
|
|
test eax, eax
|
|
jnz @f
|
|
@@:
|
|
mov [TMP_BUFF+20+CFS.VirtualAddress], eax
|
|
mov ebx, [TMP_BUFF+CFH.pSymTable]
|
|
add ebx, TMP_BUFF
|
|
mov [pSym], ebx
|
|
|
|
stdcall LinkSection, TMP_BUFF, TMP_BUFF+20, ebx
|
|
|
|
mov edi, [base]
|
|
test edi, edi
|
|
jnz @f
|
|
@@:
|
|
mov esi, [TMP_BUFF+20+CFS.PtrRawData]
|
|
add esi, TMP_BUFF
|
|
mov ecx, [TMP_BUFF+20+CFS.SizeOfRawData]
|
|
rep movsb
|
|
|
|
call alloc_dll
|
|
test eax, eax
|
|
jnz @f
|
|
@@:
|
|
mov [lib], eax
|
|
|
|
mov edi, eax
|
|
mov esi, [name]
|
|
mov ecx, 16
|
|
rep movsb
|
|
|
|
stdcall get_coff_sym,[pSym],[TMP_BUFF+CFH.nSymbols],szSTART
|
|
mov edi, [lib]
|
|
add eax, [base]
|
|
mov [edi+LIB.lib_start], eax
|
|
mov ebx, [base]
|
|
mov [edi+LIB.lib_base], ebx
|
|
|
|
stdcall get_coff_sym,[pSym],[TMP_BUFF+CFH.nSymbols], szEXPORTS
|
|
mov edi, [lib]
|
|
add eax, [base]
|
|
mov [edi+LIB.export], eax
|
|
|
|
stdcall get_coff_sym,[pSym],[TMP_BUFF+CFH.nSymbols], szIMPORTS
|
|
mov edi, [lib]
|
|
add eax, [base]
|
|
mov [edi+LIB.import], eax
|
|
|
|
stdcall link_dll, kernel_export, eax
|
|
|
|
mov edi, [lib]
|
|
call [edi+LIB.lib_start]
|
|
|
|
mov eax, [lib]
|
|
ret
|
|
.err:
|
|
xor eax, eax
|
|
ret
|
|
|
|
endp
|
|
|
|
align 4
|
|
proc LinkSection stdcall, pCoff:dword, pSec:dword, pSym:dword
|
|
locals
|
|
pCode dd ?
|
|
endl
|
|
|
|
mov esi, [pSec]
|
|
mov eax, [esi+CFS.PtrRawData]
|
|
add eax, [pCoff]
|
|
mov [pCode], eax
|
|
|
|
mov edi, [esi+CFS.PtrReloc]
|
|
add edi, [pCoff]
|
|
|
|
movzx edx, [esi+CFS.NumReloc]
|
|
mov eax, edx
|
|
lea edx, [edx+edx*8]
|
|
add edx, eax
|
|
add edx, edi
|
|
.l_0:
|
|
cmp edi, edx
|
|
jae .exit
|
|
|
|
mov ebx, [edi+CRELOC.SymIndex]
|
|
add ebx,ebx
|
|
lea ebx,[ebx+ebx*8]
|
|
|
|
add ebx, [pSym]
|
|
|
|
mov ecx, [ebx+CSYM.Value]
|
|
add ecx, [esi+CFS.VirtualAddress]
|
|
|
|
mov eax, [edi+CRELOC.VirtualAddress]
|
|
add eax, [pCode]
|
|
add [eax], ecx
|
|
add edi, 10
|
|
jmp .l_0
|
|
|
|
.exit:
|
|
ret
|
|
endp
|
|
|
|
proc get_curr_task
|
|
mov eax,[CURRENT_TASK]
|
|
shl eax, 8
|
|
ret
|
|
endp
|
|
|
|
drv_sound db 'UNISOUNDOBJ', 0
|
|
drv_infinity db 'INFINITYOBJ', 0
|
|
|
|
szSound db 'SOUND',0
|
|
szInfinity db 'INFINITY',0
|
|
|
|
szSTART db 'START',0
|
|
szEXPORTS db 'EXPORTS',0
|
|
szIMPORTS db 'IMPORTS',0
|
|
|
|
align 16
|
|
services:
|
|
dd szSound, drv_sound
|
|
dd szInfinity, drv_infinity
|
|
dd 0
|