Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 187 → Rev 188

/kernel/trunk/const.inc
162,7 → 162,7
BTN_COUNT equ OS_BASE+0x000F500
BTN_BUFF equ OS_BASE+0x000F501
 
TSC equ OS_BASE+0x000F600
CPU_FREQ equ OS_BASE+0x000F600
MOUSE_PORT equ OS_BASE+0x000F604
 
PS2_CHUNK equ OS_BASE+0x000FB00
233,12 → 233,9
 
tss_data equ OS_BASE+0x0920000
 
;tmp_pg_dir equ OS_BASE+0x00050000
;tmp_page_map equ 0x00051000
;master_tab equ 0x80200000
 
pages_tab equ 0x60000000
master_tab equ 0x60180000
current_pgdir equ 0x60180000
 
sys_pgdir equ OS_BASE+0x00050000
sys_master_tab equ OS_BASE+0x00051000
379,7 → 376,7
{ .srv_name rb 16
.magic dd ?
.size dd ?
.lib dd ?
.base dd ?
.srv_proc dd ?
}
 
421,6 → 418,7
.StorageClass db ?
.NumAuxSymbols db ?
}
CSYM_SIZE equ 18
 
struc IOCTL
{ .handle dd ?
447,6 → 445,10
end virtual
 
virtual at 0
CFH COFF_HEADER
end virtual
 
virtual at 0
CFS COFF_SECTION
end virtual
 
458,8 → 460,3
CSYM COFF_SYM
end virtual
 
virtual at 0
CFH COFF_HEADER
end virtual
 
 
/kernel/trunk/core/dll.inc
295,8 → 295,9
 
mov eax, [sz_name]
test eax, eax
jz .fail
 
jnz @F
ret
@@:
mov [srv_ptr], srv_tab
mov [counter], 16
@@:
308,27 → 309,12
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
jnz @F
ret
@@:
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
stdcall load_driver, eax
ret
.ok:
mov eax, [srv_ptr]
423,29 → 409,6
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
 
@@:
464,143 → 427,387
endp
 
align 4
proc load_lib stdcall, name:dword
proc get_curr_task
mov eax,[CURRENT_TASK]
shl eax, 8
ret
endp
 
align 4
proc get_fileinfo stdcall, file_name:dword, info:dword
locals
lib dd ?
base dd ?
pSym dd ?
cmd dd ?
offset dd ?
dd ?
count dd ?
buff dd ?
db ?
name 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
xor eax, eax
mov ebx, [file_name]
sub ebx, new_app_base
mov ecx, [info]
sub ecx, new_app_base
 
call fileread ;read file from RD
mov [cmd], 5
mov [offset], eax
mov [offset+4], eax
mov [count], eax
mov [buff], ecx
mov byte [buff+4], al
mov [name], ebx
 
cmp eax,0
jne .err
mov eax, 70
lea ebx, [cmd]
sub ebx, new_app_base
int 0x40
ret
endp
 
; mov eax, [TMP_BUFF+CFH.pSymTable]
; add eax, TMP_BUFF
; mov [pSym], eax
align 4
proc read_file stdcall,file_name:dword, buffer:dword, off:dword,\
bytes:dword
locals
cmd dd ?
offset dd ?
dd ?
count dd ?
buff dd ?
db ?
name dd ?
endl
 
; mov [TMP_BUFF+20+CFS.VirtualAddress], eax
xor eax, eax
mov ebx, [file_name]
mov ecx, [off]
mov edx, [bytes]
mov esi, [buffer]
sub ebx, new_app_base
sub esi, new_app_base
 
stdcall kernel_alloc, [TMP_BUFF+20+CFS.SizeOfRawData]
mov [base], eax
mov [cmd], eax
mov [offset], ecx
mov [offset+4], eax
mov [count], edx
mov [buff], esi
mov byte [buff+4], al
mov [name], ebx
 
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
mov eax, 70
lea ebx, [cmd]
sub ebx, new_app_base
int 0x40
ret
endp
 
stdcall LinkSection, TMP_BUFF, TMP_BUFF+20, ebx
align 4
proc load_file stdcall, file_name:dword
locals
attr dd ?
flags dd ?
cr_time dd ?
cr_date dd ?
acc_time dd ?
acc_date dd ?
mod_time dd ?
mod_date dd ?
file_size dd ?
 
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
file dd ?
endl
 
call alloc_dll
lea eax, [attr]
stdcall get_fileinfo, [file_name], eax
test eax, eax
jnz @f
@@:
mov [lib], eax
jnz .fail
 
mov edi, eax
mov esi, [name]
mov ecx, 16
rep movsb
stdcall kernel_alloc, [file_size]
mov [file], eax
 
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 read_file, [file_name], eax, dword 0, [file_size]
cmp ebx, [file_size]
jne .cleanup
mov eax, [file]
ret
.cleanup:
stdcall kernel_free, [file]
.fail:
xor eax, eax
ret
endp
 
stdcall get_coff_sym,[pSym],[TMP_BUFF+CFH.nSymbols], szEXPORTS
mov edi, [lib]
add eax, [base]
mov [edi+LIB.export], eax
align 4
proc get_proc_ex stdcall, proc_name:dword, imports:dword
 
stdcall get_coff_sym,[pSym],[TMP_BUFF+CFH.nSymbols], szIMPORTS
mov edi, [lib]
add eax, [base]
mov [edi+LIB.import], eax
.look_up:
mov edx, [imports]
mov edx, [edx]
test edx, edx
jz .end
.next:
mov eax, [edx]
test eax, eax
jz .next_table
 
stdcall link_dll, kernel_export, eax
push edx
stdcall strncmp, eax, [proc_name], 16
pop edx
test eax, eax
jz .ok
 
mov edi, [lib]
call [edi+LIB.lib_start]
 
mov eax, [lib]
add edx,8
jmp .next
.next_table:
add [imports], 4
jmp .look_up
.ok:
mov eax, [edx+4]
ret
.err:
.end:
xor eax, eax
ret
endp
 
align 4
proc fix_coff_symbols stdcall, sec:dword, symbols:dword,\
sym_count:dword, strings:dword, imports:dword
locals
retval dd ?
endl
 
mov edi, [symbols]
mov [retval], 1
.fix:
movzx ebx, [edi+CSYM.SectionNumber]
test ebx, ebx
jnz .internal
mov eax, dword [edi+CSYM.Name]
test eax, eax
jnz @F
 
mov edi, [edi+4]
add edi, [strings]
@@:
push edi
stdcall get_proc_ex, edi,[imports]
pop edi
 
xor ebx, ebx
test eax, eax
jnz @F
 
mov esi, msg_unresolved
call sys_msg_board_str
mov esi, edi
call sys_msg_board_str
mov esi, msg_CR
call sys_msg_board_str
 
mov [retval],0
@@:
mov edi, [symbols]
mov [edi+CSYM.Value], eax
jmp .next
.internal:
dec ebx
shl ebx, 3
lea ebx, [ebx+ebx*4]
add ebx, [sec]
 
mov eax, [ebx+CFS.VirtualAddress]
add [edi+CSYM.Value], eax
.next:
add edi, CSYM_SIZE
mov [symbols], edi
dec [sym_count]
jnz .fix
mov eax, [retval]
ret
endp
 
align 4
proc LinkSection stdcall, pCoff:dword, pSec:dword, pSym:dword
proc fix_coff_relocs stdcall, coff:dword, sec:dword, sym:dword
locals
pCode dd ?
n_sec dd ?
endl
 
mov esi, [pSec]
mov eax, [esi+CFS.PtrRawData]
add eax, [pCoff]
mov [pCode], eax
 
mov eax, [coff]
movzx ebx, [eax+CFH.nSections]
mov [n_sec], ebx
.fix_sec:
mov esi, [sec]
mov edi, [esi+CFS.PtrReloc]
add edi, [pCoff]
add edi, [coff]
 
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
 
movzx ecx, [esi+CFS.NumReloc]
test ecx, ecx
jz .next
.next_reloc:
mov ebx, [edi+CRELOC.SymIndex]
add ebx,ebx
lea ebx,[ebx+ebx*8]
add ebx, [sym]
 
add ebx, [pSym]
mov edx, [ebx+CSYM.Value]
 
mov ecx, [ebx+CSYM.Value]
add ecx, [esi+CFS.VirtualAddress]
cmp [edi+CRELOC.Type], 6
je .dir_32
 
cmp [edi+CRELOC.Type], 20
jne .next_reloc
.rel_32:
mov eax, [edi+CRELOC.VirtualAddress]
add eax, [pCode]
add [eax], ecx
add eax, [esi+CFS.VirtualAddress]
sub edx, eax
sub edx, 4
jmp .fix
.dir_32:
mov eax, [edi+CRELOC.VirtualAddress]
add eax, [esi+CFS.VirtualAddress]
.fix:
add [eax], edx
add edi, 10
jmp .l_0
 
dec ecx
jnz .next_reloc
.next:
add [sec], 40
dec [n_sec]
jnz .fix_sec
.exit:
ret
endp
 
proc get_curr_task
mov eax,[CURRENT_TASK]
shl eax, 8
align 4
proc load_driver stdcall, file_name:dword
locals
coff dd ?
sym dd ?
strings dd ?
img_size dd ?
img_base dd ?
start dd ?
 
exports dd ? ;fake exports table
dd ?
endl
 
stdcall load_file, [file_name]
test eax, eax
jz .fail
 
mov [coff], eax
 
movzx ecx, [eax+CFH.nSections]
xor ebx, ebx
 
lea edx, [eax+20]
@@:
add ebx, [edx+CFS.SizeOfRawData]
add ebx, 15
and ebx, not 15
add edx, 18
dec ecx
jnz @B
mov [img_size], ebx
 
stdcall kernel_alloc, ebx
test eax, eax
jz .fail
mov [img_base], eax
 
mov edi, eax
xor eax, eax
mov ecx, [img_size]
add ecx, 4095
and ecx, not 4095
shr ecx, 2
cld
rep stosd
 
mov edx, [coff]
movzx ebx, [edx+CFH.nSections]
mov edi, [img_base]
lea eax, [edx+20]
@@:
mov [eax+CFS.VirtualAddress], edi
mov esi, [eax+CFS.PtrRawData]
test esi, esi
jnz .copy
add edi, [eax+CFS.SizeOfRawData]
jmp .next
.copy:
add esi, edx
mov ecx, [eax+CFS.SizeOfRawData]
cld
rep movsb
.next:
add edi, 15
and edi, not 15
add eax, 40
dec ebx
jnz @B
 
mov ebx, [edx+CFH.pSymTable]
add ebx, edx
mov [sym], ebx
mov ecx, [edx+CFH.nSymbols]
add ecx,ecx
lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
add ecx, [sym]
mov [strings], ecx
 
lea ebx, [exports]
mov dword [ebx], kernel_export
mov dword [ebx+4], 0
lea eax, [edx+20]
 
stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
[strings], ebx
test eax, eax
jnz @F
 
mov esi, msg_module
call sys_msg_board_str
mov esi, [file_name]
call sys_msg_board_str
mov esi, msg_CR
call sys_msg_board_str
 
stdcall kernel_free,[coff]
xor eax, eax
ret
@@:
mov ebx, [coff]
add ebx, 20
stdcall fix_coff_relocs, [coff], ebx, [sym]
 
mov ebx, [coff]
stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szSTART
mov [start], eax
 
stdcall kernel_free, [coff]
 
mov ebx, [start]
call ebx
test eax, eax
jnz .ok
 
stdcall kernel_free, [img_base]
xor eax, eax
ret
.ok:
mov ebx, [img_base]
mov [eax+SRV.base], ebx
ret
.fail:
xor eax, eax
ret
endp
 
drv_sound db 'UNISOUNDOBJ', 0
drv_infinity db 'INFINITYOBJ', 0
drv_sound db '/rd/1/unisound.obj', 0
drv_infinity db '/rd/1/infinity.obj', 0
 
szSound db 'SOUND',0
szInfinity db 'INFINITY',0
609,6 → 816,10
szEXPORTS db 'EXPORTS',0
szIMPORTS db 'IMPORTS',0
 
msg_unresolved db 'unresolved ',0
msg_module db 'in module ',0
msg_CR db 13,10,0
 
align 16
services:
dd szSound, drv_sound
/kernel/trunk/core/heap.inc
101,7 → 101,6
mov ecx, 32
mov edx, eax
mov edi, HEAP_BASE
 
.l1:
stdcall map_page,edi,edx,PG_SW
add edi, 0x1000
626,11 → 625,10
 
;;;;;;;;;;;;;; USER ;;;;;;;;;;;;;;;;;
 
HEAP_TOP equ 0x5FC00000
 
align 4
proc init_heap stdcall, heap_size:dword
locals
tab_count dd ?
endl
proc init_heap
 
mov ebx,[CURRENT_TASK]
shl ebx,8
641,60 → 639,20
sub eax, 4096
ret
@@:
mov edx, [heap_size]
and edx, edx
jz .exit
add edx, (4095+4096)
and edx, not 4095
mov [heap_size], edx
add edx, 0x003FFFFF
and edx, not 0x003FFFFF
shr edx, 22
mov [tab_count], edx
 
mov esi, [PROC_BASE+APPDATA.mem_size+ebx]
add esi, 0x003FFFFF
and esi, not 0x003FFFFF
mov edi, esi
add esi, 4095
and esi, not 4095
mov eax, HEAP_TOP
mov [PROC_BASE+APPDATA.heap_base+ebx], esi
add esi, [heap_size]
mov [PROC_BASE+APPDATA.heap_top+ebx], esi
mov [PROC_BASE+APPDATA.heap_top+ebx], eax
 
mov eax, cr3
and eax, not 0xFFF
stdcall map_page,[current_pdir],eax,dword PG_SW
 
add edi, new_app_base
@@:
call alloc_page
test eax, eax
jz .exit
 
stdcall map_page_table, [current_pdir], edi, eax
add edi, 0x00400000
dec edx
jnz @B
 
mov ecx, [tab_count]
shl ecx, 12-2
mov ebx,[CURRENT_TASK]
shl ebx,8
mov edi, [PROC_BASE+APPDATA.heap_base+ebx]
add edi, new_app_base
shr edi, 10
mov esi, edi
add edi, pages_tab
xor eax, eax
cld
rep stosd
 
stdcall map_page,[current_pdir],dword PG_UNMAP
 
mov ebx, [heap_size]
mov eax, ebx
sub eax, esi
add esi, new_app_base
shr esi, 10
mov ecx, eax
sub eax, 4096
or ebx, FREE_BLOCK
mov [pages_tab+esi], ebx
or ecx, FREE_BLOCK
mov [pages_tab+esi], ecx
ret
.exit:
xor eax, eax
776,7 → 734,7
shr esi, 12
mov eax, [pages_tab+esi*4]
test eax, USED_BLOCK
jz @f
jz .not_used
 
and eax, not 4095
mov ecx, eax
786,12 → 744,16
sub ecx, 4096
shr ecx, 12
.release:
mov eax, [pages_tab+esi*4]
xor eax, eax
xchg eax, [pages_tab+esi*4]
test eax, 1
jz @F
call free_page
@@:
inc esi
dec ecx
jnz .release
@@:
.not_used:
mov ebx, [CURRENT_TASK]
shl ebx, 8
mov esi, dword [ebx+PROC_BASE+APPDATA.heap_base]; heap_base
/kernel/trunk/core/memory.inc
52,14 → 52,12
add eax, 0x00400000
mov dword [sys_pgdir+12], eax
 
mov dword [sys_pgdir+0x600], sys_master_tab+PG_SW
mov dword [sys_master_tab+0x600], sys_master_tab+PG_SW
mov dword [sys_pgdir+0x600], sys_pgdir+PG_SW
 
mov ecx, [pg_data.kernel_tables]
sub ecx, 4
mov eax, tmp_page_tab+PG_SW
mov edi, sys_pgdir+16
mov esi, sys_master_tab+16
 
jmp .map_kernel_tabs
.no_PSE:
82,15 → 80,12
mov ecx, [pg_data.kernel_tables]
mov eax, tmp_page_tab+PG_SW
mov edi, sys_pgdir
mov esi, sys_master_tab
 
.map_kernel_tabs:
 
mov [edi], eax
mov [esi], eax
add eax, 0x1000
add edi, 4
add esi, 4
dec ecx
jnz .map_kernel_tabs
 
106,8 → 101,8
cld
rep stosd
 
mov dword [sys_pgdir+0x600], sys_master_tab+PG_SW
mov dword [sys_master_tab+0x600], sys_master_tab+PG_SW
mov dword [sys_pgdir+0x600], sys_pgdir+PG_SW
 
ret
endp
 
201,7 → 196,6
.find:
mov edx, [count]
mov edi, ecx
 
.match:
cmp byte [ecx], 0xFF
jne .next
272,15 → 266,13
endp
 
align 4
proc map_page_table stdcall,page_dir:dword, lin_addr:dword, phis_addr:dword
proc map_page_table stdcall, lin_addr:dword, phis_addr:dword
mov ebx, [lin_addr]
shr ebx, 22
mov eax, [phis_addr]
and eax, not 0xFFF
or eax, PG_UW ;+PG_NOCACHE
mov ecx, [page_dir]
mov dword [ecx+ebx*4], eax
mov dword [master_tab+ebx*4], eax
mov dword [current_pgdir+ebx*4], eax
mov eax, [lin_addr]
shr eax, 10
add eax, pages_tab
339,7 → 331,7
 
@@:
call alloc_page
stdcall map_page_table,sys_pgdir, esi, eax
stdcall map_page_table, esi, eax
add esi, 0x00400000
dec edi
jnz @B
457,15 → 449,12
 
xchg esi, edi
 
mov eax, cr3
stdcall map_page,[tmp_task_pdir],eax,dword PG_SW+PG_NOCACHE
 
@@:
call alloc_page
test eax, eax
jz .exit
 
stdcall map_page_table,[tmp_task_pdir], edi, eax
stdcall map_page_table, edi, eax
 
push edi
shr edi, 10
479,8 → 468,6
add edi, 0x00400000
cmp edi, esi
jb @B
 
stdcall map_page,[tmp_task_pdir],dword 0,dword PG_UNMAP
.grow:
pop edi
pop esi
519,7 → 506,7
ret
endp
 
align 16
align 4
proc page_fault_handler
pushad
 
527,10 → 514,14
mov eax, cr2
push eax
push ds
push es
 
mov ax, 0x10
mov ds, ax
mov es, ax
 
inc [pg_data.pages_faults]
 
mov ebx, [ebp-4]
 
cmp ebx, 0xe0000000
539,6 → 530,9
cmp ebx, 0x60400000
jae .user_space
 
cmp ebx, master_tab+0x1000
jae .alloc
 
cmp ebx, 0x60000000
jae .tab_space
 
545,8 → 539,6
jmp .kernel_space
 
.user_space:
inc [pg_data.pages_faults]
 
shr ebx, 12
mov ecx, ebx
shr ecx, 10
557,7 → 549,7
mov eax, [pages_tab+ebx*4]
test eax, 2
jz .fail
 
.alloc:
call alloc_page
and eax, eax
jz .exit
564,16 → 556,14
 
stdcall map_page,[ebp-4],eax,dword PG_UW
 
mov esi, [ebp-4]
and esi, 0xFFFFF000
mov edi, [ebp-4]
and edi, 0xFFFFF000
mov ecx, 1024
xor eax, eax
@@:
mov [esi], eax
add esi, 4
dec ecx
jnz @B
cld
rep stosd
.exit:
pop es
pop ds
mov esp, ebp
popad
580,6 → 570,7
add esp, 4
iretd
.fail:
pop es
pop ds
mov esp, ebp
popad
592,52 → 583,29
iretd
 
.kernel_space:
shr ebx, 12
mov eax, [pages_tab+ebx*4]
shr ebx, 10
mov eax, [master_tab+ebx*4]
 
pop ds
mov esp, ebp
popad
add esp, 4
iretd
 
; shr ebx, 12
; mov eax, [pages_tab+ebx*4]
; shr ebx, 10
; mov eax, [master_tab+ebx*4]
jmp .exit
.old_addr:
shr ebx, 12
; shr ebx, 12
; mov eax, [pages_tab+ebx*4]
shr ebx, 10
mov eax, [master_tab+ebx*4]
 
pop ds
mov esp, ebp
popad
add esp, 4
iretd
 
; shr ebx, 10
; mov eax, [master_tab+ebx*4]
jmp .exit
.lfb_addr:
shr ebx, 22
;mov ecx, [sys_page_dir]
mov eax, [master_tab+ebx*4]
 
pop ds
mov esp, ebp
popad
add esp, 4
iretd
 
; shr ebx, 22
; ;mov ecx, [sys_page_dir]
; mov eax, [master_tab+ebx*4]
jmp .exit
.tab_space:
shr ebx, 12
; shr ebx, 12
; mov eax, [pages_tab+ebx*4]
shr ebx, 10
;mov ecx, [sys_page_dir]
mov eax, [master_tab+ebx*4]
 
pop ds
mov esp, ebp
popad
add esp, 4
iretd
; shr ebx, 10
; ;mov ecx, [sys_page_dir]
; mov eax, [master_tab+ebx*4]
jmp .exit
endp
 
align 4
758,7 → 726,6
call set_ipc_buff
mov [esp+36], eax
ret
 
@@:
cmp eax, 2
jne @f
765,7 → 732,6
stdcall sys_ipc_send, ebx, ecx, edx
mov [esp+36], eax
ret
 
@@:
xor eax, eax
not eax
945,7 → 911,7
jb .fail
ja @f
 
stdcall init_heap, ebx
call init_heap
mov [esp+36], eax
ret
@@:
958,7 → 924,7
@@:
cmp eax, 13
ja @f
 
add ebx, new_app_base
stdcall user_free, ebx
mov [esp+36], eax
ret
983,6 → 949,8
cmp eax, 16
ja @f
 
test ebx, ebx
jz .fail
add ebx, new_app_base
cmp ebx, new_app_base
jb .fail
1299,7 → 1267,7
tmp_task_ptab rd 1
tmp_task_data rd 1
 
current_pdir rd 1
; current_pdir rd 1
 
fpu_data rd 1
fdd_buff rd 1
/kernel/trunk/core/taskman.inc
119,7 → 119,6
app_pages dd ?
img_pages dd ?
dir_addr dd ?
master_addr dd ?
app_tabs dd ?
endl
 
127,7 → 126,6
 
xor eax, eax
mov [dir_addr], eax
mov [master_addr], eax
 
mov eax, [app_size]
add eax, 4095
179,32 → 177,10
mov esi, sys_pgdir+0xc00
rep movsd
 
call alloc_page
test eax, eax
jz .fail
mov [master_addr], eax
stdcall map_page,[tmp_task_ptab],eax,dword PG_SW
 
mov ecx, 384
mov edi, [tmp_task_ptab]
mov esi, master_tab
cld
rep movsd
 
mov ecx, 384
xor eax, eax
rep stosd
 
mov ecx, 256
mov esi, master_tab+0xc00
rep movsd
 
mov eax, [master_addr]
mov eax, [dir_addr]
or eax, PG_SW
mov ebx, [tmp_task_pdir]
mov [ebx+0x600], eax
mov ecx, [tmp_task_ptab]
mov [ecx+0x600],eax
 
mov eax, [dir_addr]
call set_cr3
216,7 → 192,7
test eax, eax
jz .fail
 
stdcall map_page_table,[tmp_task_pdir], edi, eax
stdcall map_page_table, edi, eax
add edi, 0x00400000
dec edx
jnz @B
230,7 → 206,6
rep stosd
 
mov edx, new_app_base
 
.alloc:
call alloc_page
test eax, eax
262,7 → 237,6
cld
rep stosd
 
stdcall map_page,[tmp_task_ptab],dword 0,dword PG_UNMAP
stdcall map_page,[tmp_task_pdir],dword 0,dword PG_UNMAP
 
dec [pg_data.pg_mutex]
344,10 → 318,7
and eax, not 0xFFF
stdcall map_page,[tmp_task_pdir],eax,dword PG_SW
mov esi, [tmp_task_pdir]
add esi, 0x600
mov eax, [esi]
call free_page ;destroy master table
add esi, 4
add esi, 0x604
mov edi, 383
.destroy:
mov eax, [esi]
/kernel/trunk/docs/sysfuncr.txt
3708,14 → 3708,13
 à ¬¥âàë:
* eax = 68 - ­®¬¥à ä㭪樨
* ebx = 11 - ­®¬¥à ¯®¤ä㭪樨
* ecx = à §¬¥à ªãç¨ (¢ ¡ ©â å)
‚®§¢à é ¥¬®¥ §­ ç¥­¨¥:
* eax = 0 - ­¥ãᯥå
* ¨­ ç¥ à §¬¥à ᮧ¤ ­­®© ªãç¨
‡ ¬¥ç ­¨ï:
*  §¬¥à ªãç¨ ¢ëà ¢­¨¢ ¥âáï ¢ ¡®«ìèãî áâ®à®­ã ­  £à ­¨æã áâà ­¨æë.
* ‚맮¢ ä㭪樨 ¨­¨æ¨ «¨§¨àã¥â ªãçã, ¨§ ª®â®à®© ¢¯®á«¥¤á⢨¨ ¬®¦­®
¢ë¤¥«ïâì ¨ ®á¢®¡®¦¤ âì ¡«®ª¨ ¯ ¬ï⨠¯®¤äã­ªæ¨ï¬¨ 12 ¨ 13.
 §¬¥à ªãç¨ à ¢¥­ à §¬¥à㠢ᥩ ᢮¡®¤­®© ¯ ¬ï⨠¯à¨«®¦¥­¨ï.
* à¨ ¯®¢â®à­®¬ ¢ë§®¢¥ ä㭪樨 ⥬ ¦¥ ¯à®æ¥áᮬ äã­ªæ¨ï ¢¥à­ñâ à §¬¥à
áãé¥áâ¢ãî饩 ªãç¨.
* ®á«¥ ᮧ¤ ­¨ï ªãç¨ ¢ë§®¢ë ä㭪樨 64.1 ¨£­®à¨àãîâáï.
/kernel/trunk/drivers/infinity.asm
26,10 → 26,28
new_app_base equ 0x60400000; 0x01000000
PROC_BASE equ OS_BASE+0x0080000
 
public START
public STOP
public service_proc
public START
public IMPORTS
 
extrn AttachIntHandler
extrn SysMsgBoardStr
extrn PciApi
extrn PciRead32
extrn PciRead8
extrn PciWrite8
extrn AllocKernelSpace
extrn MapPage
extrn RegService
extrn KernelAlloc
extrn KernelFree
extrn GetPgAddr
extrn GetCurrentTask
extrn GetService
extrn ServiceHandler
extrn FpuSave
extrn FpuRestore
 
SND_CREATE_BUFF equ 2
SND_PLAY equ 3
SND_STOP equ 4
53,15 → 71,15
IOCTL IOCTL
end virtual
 
section '.flat' align 16
section '.flat' code readable align 16
 
START:
stdcall [GetService], szSound
stdcall GetService, szSound
test eax, eax
jz .fail
mov [hSound], eax
 
stdcall [KernelAlloc], 16*512
stdcall KernelAlloc, 16*512
test eax, eax
jz .out_of_mem
mov [mix_buff], eax
75,17 → 93,15
mov edi, stream
mov ecx, 4*STREAM_SIZE
rep stosd
mov [stream_count],0
 
stdcall set_handler, [hSound], new_mix
 
stdcall [RegService], szInfinity, service_proc
mov [stream_count],0
 
stdcall RegService, szInfinity, service_proc
ret
.fail:
if DEBUG
mov esi, msgFail
call [SysMsgBoardStr]
call SysMsgBoardStr
end if
xor eax, eax
ret
93,9 → 109,10
.out_of_mem:
if DEBUG
mov esi, msgMem
call [SysMsgBoardStr]
call SysMsgBoardStr
end if
xor eax, eax
STOP:
ret
 
handle equ IOCTL.handle
166,7 → 183,6
TASK_COUNT equ 0x0003004
CURRENT_TASK equ 0x0003000
 
 
align 8
proc CreateBuffer stdcall, format:dword
locals
186,7 → 202,7
mov [edi+STREAM.magic], 'WAVE'
mov [edi+STREAM.size], STREAM_SIZE
 
stdcall [KernelAlloc], 180*1024
stdcall KernelAlloc, 180*1024
 
mov edi, [str]
mov [edi+STREAM.base], eax
279,8 → 295,6
pop ebx
ret
 
 
 
align 4
proc DestroyBuffer stdcall, str:dword
 
292,7 → 306,7
cmp [esi+STREAM.size], STREAM_SIZE
jne .fail
 
stdcall [KernelFree], [esi+STREAM.base]
stdcall KernelFree, [esi+STREAM.base]
 
mov eax, [str]
call free_stream
625,7 → 639,7
mov [out_size], 0
 
lea eax, [handler]
stdcall [ServiceHandler], eax
stdcall ServiceHandler, eax
ret
endp
 
652,7 → 666,7
mov [out_size], ebx
 
lea eax, [handle]
stdcall [ServiceHandler], eax
stdcall ServiceHandler, eax
ret
endp
 
659,10 → 673,6
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
720,69 → 730,12
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
 
793,3 → 746,18
msgUser db 'User callback',13,10,0
msgMem db 'Not enough memory',13,10,0
end if
 
section '.data' data readable writable align 16
 
stream rb STREAM_SIZE*16
 
play_list rd 16
mix_input rd 16
 
stream_list rd 17
play_count rd 1
stream_count rd 1
hSound rd 1
mix_buff rd 1
mix_buff_map rd 1
 
/kernel/trunk/drivers/mixer.asm
31,7 → 31,7
je .exit
; mov eax, fpu_state
; fnsave [eax]
call [FpuSave]
call FpuSave
emms
mov [main_count], 32;
 
98,7 → 98,7
jnz .l00
 
call update_stream
call [FpuRestore]
call FpuRestore
ret
.exit:
mov edi, [output]
/kernel/trunk/drivers/sis.asm
95,125 → 95,125
DEV_GET_INFO equ 8
 
struc AC_CNTRL ;AC controller base class
{ .bus dd 0
.devfn dd 0
{ .bus dd ?
.devfn dd ?
 
.vendor dd 0
.dev_id dd 0
.pci_cmd dd 0
.pci_stat dd 0
.vendor dd ?
.dev_id dd ?
.pci_cmd dd ?
.pci_stat dd ?
 
.codec_io_base dd 0
.codec_mem_base dd 0
.codec_io_base dd ?
.codec_mem_base dd ?
 
.ctrl_io_base dd 0
.ctrl_mem_base dd 0
.cfg_reg dd 0
.int_line dd 0
.ctrl_io_base dd ?
.ctrl_mem_base dd ?
.cfg_reg dd ?
.int_line dd ?
 
.vendor_ids dd 0 ;vendor id string
.ctrl_ids dd 0 ;hub id string
.vendor_ids dd ? ;vendor id string
.ctrl_ids dd ? ;hub id string
 
.buffer dd 0
.buffer dd ?
 
.notify_pos dd 0
.notify_task dd 0
.notify_pos dd ?
.notify_task dd ?
 
.lvi_reg dd 0
.ctrl_setup dd 0
.user_callback dd 0
.codec_read16 dd 0
.codec_write16 dd 0
.lvi_reg dd ?
.ctrl_setup dd ?
.user_callback dd ?
.codec_read16 dd ?
.codec_write16 dd ?
 
.ctrl_read8 dd 0
.ctrl_read16 dd 0
.ctrl_read32 dd 0
.ctrl_read8 dd ?
.ctrl_read16 dd ?
.ctrl_read32 dd ?
 
.ctrl_write8 dd 0
.ctrl_write16 dd 0
.ctrl_write32 dd 0
.ctrl_write8 dd ?
.ctrl_write16 dd ?
.ctrl_write32 dd ?
}
 
struc CODEC ;Audio Chip base class
{
.chip_id dd 0
.flags dd 0
.status dd 0
.chip_id dd ?
.flags dd ?
.status dd ?
 
.ac_vendor_ids dd 0 ;ac vendor id string
.chip_ids dd 0 ;chip model string
.ac_vendor_ids dd ? ;ac vendor id string
.chip_ids dd ? ;chip model string
 
.shadow_flag dd 0
dd 0
.shadow_flag dd ?
dd ?
 
.regs dw 0 ; codec registers
.reg_master_vol dw 0 ;0x02
.reg_aux_out_vol dw 0 ;0x04
.reg_mone_vol dw 0 ;0x06
.reg_master_tone dw 0 ;0x08
.reg_beep_vol dw 0 ;0x0A
.reg_phone_vol dw 0 ;0x0C
.reg_mic_vol dw 0 ;0x0E
.reg_line_in_vol dw 0 ;0x10
.reg_cd_vol dw 0 ;0x12
.reg_video_vol dw 0 ;0x14
.reg_aux_in_vol dw 0 ;0x16
.reg_pcm_out_vol dw 0 ;0x18
.reg_rec_select dw 0 ;0x1A
.reg_rec_gain dw 0 ;0x1C
.reg_rec_gain_mic dw 0 ;0x1E
.reg_gen dw 0 ;0x20
.reg_3d_ctrl dw 0 ;0X22
.reg_page dw 0 ;0X24
.reg_powerdown dw 0 ;0x26
.reg_ext_audio dw 0 ;0x28
.reg_ext_st dw 0 ;0x2a
.reg_pcm_front_rate dw 0 ;0x2c
.reg_pcm_surr_rate dw 0 ;0x2e
.reg_lfe_rate dw 0 ;0x30
.reg_pcm_in_rate dw 0 ;0x32
dw 0 ;0x34
.reg_cent_lfe_vol dw 0 ;0x36
.reg_surr_vol dw 0 ;0x38
.reg_spdif_ctrl dw 0 ;0x3A
dw 0 ;0x3C
dw 0 ;0x3E
dw 0 ;0x40
dw 0 ;0x42
dw 0 ;0x44
dw 0 ;0x46
dw 0 ;0x48
dw 0 ;0x4A
dw 0 ;0x4C
dw 0 ;0x4E
dw 0 ;0x50
dw 0 ;0x52
dw 0 ;0x54
dw 0 ;0x56
dw 0 ;0x58
dw 0 ;0x5A
dw 0 ;0x5C
dw 0 ;0x5E
.reg_page_0 dw 0 ;0x60
.reg_page_1 dw 0 ;0x62
.reg_page_2 dw 0 ;0x64
.reg_page_3 dw 0 ;0x66
.reg_page_4 dw 0 ;0x68
.reg_page_5 dw 0 ;0x6A
.reg_page_6 dw 0 ;0x6C
.reg_page_7 dw 0 ;0x6E
dw 0 ;0x70
dw 0 ;0x72
dw 0 ;0x74
dw 0 ;0x76
dw 0 ;0x78
dw 0 ;0x7A
.reg_vendor_id_1 dw 0 ;0x7C
.reg_vendor_id_2 dw 0 ;0x7E
.regs dw ? ; codec registers
.reg_master_vol dw ? ;0x02
.reg_aux_out_vol dw ? ;0x04
.reg_mone_vol dw ? ;0x06
.reg_master_tone dw ? ;0x08
.reg_beep_vol dw ? ;0x0A
.reg_phone_vol dw ? ;0x0C
.reg_mic_vol dw ? ;0x0E
.reg_line_in_vol dw ? ;0x10
.reg_cd_vol dw ? ;0x12
.reg_video_vol dw ? ;0x14
.reg_aux_in_vol dw ? ;0x16
.reg_pcm_out_vol dw ? ;0x18
.reg_rec_select dw ? ;0x1A
.reg_rec_gain dw ? ;0x1C
.reg_rec_gain_mic dw ? ;0x1E
.reg_gen dw ? ;0x20
.reg_3d_ctrl dw ? ;0X22
.reg_page dw ? ;0X24
.reg_powerdown dw ? ;0x26
.reg_ext_audio dw ? ;0x28
.reg_ext_st dw ? ;0x2a
.reg_pcm_front_rate dw ? ;0x2c
.reg_pcm_surr_rate dw ? ;0x2e
.reg_lfe_rate dw ? ;0x30
.reg_pcm_in_rate dw ? ;0x32
dw ? ;0x34
.reg_cent_lfe_vol dw ? ;0x36
.reg_surr_vol dw ? ;0x38
.reg_spdif_ctrl dw ? ;0x3A
dw ? ;0x3C
dw ? ;0x3E
dw ? ;0x40
dw ? ;0x42
dw ? ;0x44
dw ? ;0x46
dw ? ;0x48
dw ? ;0x4A
dw ? ;0x4C
dw ? ;0x4E
dw ? ;0x50
dw ? ;0x52
dw ? ;0x54
dw ? ;0x56
dw ? ;0x58
dw ? ;0x5A
dw ? ;0x5C
dw ? ;0x5E
.reg_page_0 dw ? ;0x60
.reg_page_1 dw ? ;0x62
.reg_page_2 dw ? ;0x64
.reg_page_3 dw ? ;0x66
.reg_page_4 dw ? ;0x68
.reg_page_5 dw ? ;0x6A
.reg_page_6 dw ? ;0x6C
.reg_page_7 dw ? ;0x6E
dw ? ;0x70
dw ? ;0x72
dw ? ;0x74
dw ? ;0x76
dw ? ;0x78
dw ? ;0x7A
.reg_vendor_id_1 dw ? ;0x7C
.reg_vendor_id_2 dw ? ;0x7E
 
 
.reset dd 0 ;virual
.set_master_vol dd 0
.reset dd ? ;virual
.set_master_vol dd ?
}
 
struc CTRL_INFO
247,17 → 247,29
new_app_base equ 0x60400000; 0x01000000
PROC_BASE equ OS_BASE+0x0080000
 
 
public START
public STOP
public service_proc
public START
public IMPORTS
 
section '.flat' align 16
extrn AttachIntHandler
extrn SysMsgBoardStr
extrn PciApi
extrn PciRead32
extrn PciRead8
extrn PciWrite8
extrn AllocKernelSpace
extrn MapPage
extrn RegService
extrn KernelAlloc
extrn GetPgAddr
extrn GetCurrentTask
 
section '.flat' code readable align 16
 
START:
if DEBUG
mov esi, msgInit
call [SysMsgBoardStr]
call SysMsgBoardStr
end if
 
call detect_controller
266,9 → 278,9
 
if DEBUG
mov esi,[ctrl.vendor_ids]
call [SysMsgBoardStr]
call SysMsgBoardStr
mov esi, [ctrl.ctrl_ids]
call [SysMsgBoardStr]
call SysMsgBoardStr
end if
 
call init_controller
277,7 → 289,7
 
if DEBUG
mov esi, msgInitCodec
call [SysMsgBoardStr]
call SysMsgBoardStr
end if
 
call init_codec
286,10 → 298,10
 
if DEBUG
mov esi, [codec.ac_vendor_ids]
call [SysMsgBoardStr]
call SysMsgBoardStr
 
mov esi, [codec.chip_ids]
call [SysMsgBoardStr]
call SysMsgBoardStr
end if
 
call reset_controller
296,16 → 308,16
call setup_codec
 
mov esi, msgPrimBuff
call [SysMsgBoardStr]
call SysMsgBoardStr
 
call create_primary_buff
 
stdcall [AttachIntHandler], [ctrl.int_line], ac97_irq
stdcall AttachIntHandler, [ctrl.int_line], ac97_irq
 
stdcall [RegService], sz_sound_srv, service_proc
stdcall RegService, sz_sound_srv, service_proc
 
mov esi, msgOk
call [SysMsgBoardStr]
call SysMsgBoardStr
 
ret
 
312,9 → 324,9
.fail:
if DEBUG
mov esi, msgFail
call [SysMsgBoardStr]
call SysMsgBoardStr
end if
 
STOP:
xor eax, eax
ret
 
334,7 → 346,7
jne @F
if DEBUG
mov esi, msgPlay
call [SysMsgBoardStr]
call SysMsgBoardStr
end if
call play
ret
343,7 → 355,7
jne @F
if DEBUG
mov esi, msgStop
call [SysMsgBoardStr]
call SysMsgBoardStr
end if
call stop
ret
392,7 → 404,7
 
; if DEBUG
; mov esi, msgIRQ
; call [SysMsgBoardStr]
; call SysMsgBoardStr
; end if
 
mov edx, PCM_OUT_CR_REG
444,7 → 456,7
align 4
proc create_primary_buff
 
stdcall [KernelAlloc], 0x10000
stdcall KernelAlloc, 0x10000
mov [ctrl.buffer], eax
 
mov edi, eax
452,7 → 464,7
xor eax, eax
rep stosd
 
stdcall [GetPgAddr], [ctrl.buffer]
stdcall GetPgAddr, [ctrl.buffer]
 
mov ebx, 0xC0004000
mov ecx, 4
504,7 → 516,7
loop @B
 
mov ecx, pcmout_bdl
stdcall [GetPgAddr], ecx
stdcall GetPgAddr, ecx
and ecx, 0xFFF
add eax, ecx
 
537,7 → 549,7
xor eax, eax
mov [bus], eax
inc eax
call [PciApi]
call PciApi
cmp eax, -1
je .err
 
546,7 → 558,7
.next_bus:
and [devfn], 0
.next_dev:
stdcall [PciRead32], [bus], [devfn], dword 0
stdcall PciRead32, [bus], [devfn], dword 0
test eax, eax
jz .next
cmp eax, -1
602,7 → 614,7
align 4
proc init_controller
 
stdcall [PciRead32], [ctrl.bus], [ctrl.devfn], dword 4
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 4
mov ebx, eax
and eax, 0xFFFF
mov [ctrl.pci_cmd], eax
609,25 → 621,25
shr ebx, 16
mov [ctrl.pci_stat], ebx
 
stdcall [PciRead32], [ctrl.bus], [ctrl.devfn], dword 0x10
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x10
and eax,0xFFFE
mov [ctrl.codec_io_base], eax
 
stdcall [PciRead32], [ctrl.bus], [ctrl.devfn], dword 0x14
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x14
and eax, 0xFFC0
mov [ctrl.ctrl_io_base], eax
 
stdcall [PciRead32], [ctrl.bus], [ctrl.devfn], dword 0x18
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x18
mov [ctrl.codec_mem_base], eax
 
stdcall [PciRead32], [ctrl.bus], [ctrl.devfn], dword 0x1C
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x1C
mov [ctrl.ctrl_mem_base], eax
 
stdcall [PciRead32], [ctrl.bus], [ctrl.devfn], dword 0x3C
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x3C
and eax, 0xFF
mov [ctrl.int_line], eax
 
stdcall [PciRead8], [ctrl.bus], [ctrl.devfn], dword 0x41
stdcall PciRead8, [ctrl.bus], [ctrl.devfn], dword 0x41
and eax, 0xFF
mov [ctrl.cfg_reg], eax
 
735,7 → 747,7
 
if DEBUG
mov esi, msgCFail
call [SysMsgBoardStr]
call SysMsgBoardStr
end if
xor eax, eax ; timeout error
ret
757,7 → 769,7
 
if DEBUG
mov esi, msgWarm
call [SysMsgBoardStr]
call SysMsgBoardStr
end if
 
mov [counter], 10 ; total 10*100 ms = 1s
774,7 → 786,7
 
if DEBUG
mov esi, msgWRFail
call [SysMsgBoardStr]
call SysMsgBoardStr
end if
 
stc
803,7 → 815,7
 
if DEBUG
mov esi, msgCold
call [SysMsgBoardStr]
call SysMsgBoardStr
end if
 
mov eax, 1000000 ; wait 1 s
827,7 → 839,7
 
if DEBUG
mov esi, msgCRFail
call [SysMsgBoardStr]
call SysMsgBoardStr
end if
stc
ret
1105,58 → 1117,13
 
include "codec.inc"
 
 
align 16
pcmout_bdl dq 32 dup(0)
buff_list dd 32 dup(0)
 
align 16
ctrl AC_CNTRL
 
align 16
codec CODEC
 
civ_val dd 0
 
align 16
align 4
devices dd (CTRL_SIS shl 16)+VID_SIS,msg_AC, set_SIS
dd 0
 
align 16
imp_table:
IMPORTS:
 
AttachIntHandler dd szAttachIntHandler
SysMsgBoardStr dd szSysMsgBoardStr
PciApi dd szPciApi
PciRead32 dd szPciRead32
PciRead8 dd szPciRead8
PciWrite8 dd szPciWrite8
AllocKernelSpace dd szAllocKernelSpace
MapPage dd szMapPage
KernelAlloc dd szKernelAlloc
GetPgAddr dd szGetPgAddr
RegService dd szRegService
GetCurrentTask dd szGetCurrentTask
dd 0
 
msg_AC db '7012 AC97 controller',13,10, 0
msg_SIS db 'Silicon Integrated Systems',13,10, 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
szPciWrite8 db 'PciWrite8',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
 
sz_sound_srv db 'SOUND',0
 
msgInit db 'detect hardware...',13,10,0
1175,3 → 1142,14
msgWRFail db 'warm reset failed',13,10,0
msgCRFail db 'cold reset failed',13,10,0
msgCFail db 'codec not ready',13,10,0
 
section '.data' data readable writable align 16
 
pcmout_bdl rq 32
buff_list rd 32
 
codec CODEC
ctrl AC_CNTRL
 
lpc_bus rd 1
civ_val rd 1
/kernel/trunk/drivers/unisound.asm
116,125 → 116,125
DEV_GET_INFO equ 8
 
struc AC_CNTRL ;AC controller base class
{ .bus dd 0
.devfn dd 0
{ .bus dd ?
.devfn dd ?
 
.vendor dd 0
.dev_id dd 0
.pci_cmd dd 0
.pci_stat dd 0
.vendor dd ?
.dev_id dd ?
.pci_cmd dd ?
.pci_stat dd ?
 
.codec_io_base dd 0
.codec_mem_base dd 0
.codec_io_base dd ?
.codec_mem_base dd ?
 
.ctrl_io_base dd 0
.ctrl_mem_base dd 0
.cfg_reg dd 0
.int_line dd 0
.ctrl_io_base dd ?
.ctrl_mem_base dd ?
.cfg_reg dd ?
.int_line dd ?
 
.vendor_ids dd 0 ;vendor id string
.ctrl_ids dd 0 ;hub id string
.vendor_ids dd ? ;vendor id string
.ctrl_ids dd ? ;hub id string
 
.buffer dd 0
.buffer dd ?
 
.notify_pos dd 0
.notify_task dd 0
.notify_pos dd ?
.notify_task dd ?
 
.lvi_reg dd 0
.ctrl_setup dd 0
.user_callback dd 0
.codec_read16 dd 0
.codec_write16 dd 0
.lvi_reg dd ?
.ctrl_setup dd ?
.user_callback dd ?
.codec_read16 dd ?
.codec_write16 dd ?
 
.ctrl_read8 dd 0
.ctrl_read16 dd 0
.ctrl_read32 dd 0
.ctrl_read8 dd ?
.ctrl_read16 dd ?
.ctrl_read32 dd ?
 
.ctrl_write8 dd 0
.ctrl_write16 dd 0
.ctrl_write32 dd 0
.ctrl_write8 dd ?
.ctrl_write16 dd ?
.ctrl_write32 dd ?
}
 
struc CODEC ;Audio Chip base class
{
.chip_id dd 0
.flags dd 0
.status dd 0
.chip_id dd ?
.flags dd ?
.status dd ?
 
.ac_vendor_ids dd 0 ;ac vendor id string
.chip_ids dd 0 ;chip model string
.ac_vendor_ids dd ? ;ac vendor id string
.chip_ids dd ? ;chip model string
 
.shadow_flag dd 0
dd 0
.shadow_flag dd ?
dd ?
 
.regs dw 0 ; codec registers
.reg_master_vol dw 0 ;0x02
.reg_aux_out_vol dw 0 ;0x04
.reg_mone_vol dw 0 ;0x06
.reg_master_tone dw 0 ;0x08
.reg_beep_vol dw 0 ;0x0A
.reg_phone_vol dw 0 ;0x0C
.reg_mic_vol dw 0 ;0x0E
.reg_line_in_vol dw 0 ;0x10
.reg_cd_vol dw 0 ;0x12
.reg_video_vol dw 0 ;0x14
.reg_aux_in_vol dw 0 ;0x16
.reg_pcm_out_vol dw 0 ;0x18
.reg_rec_select dw 0 ;0x1A
.reg_rec_gain dw 0 ;0x1C
.reg_rec_gain_mic dw 0 ;0x1E
.reg_gen dw 0 ;0x20
.reg_3d_ctrl dw 0 ;0X22
.reg_page dw 0 ;0X24
.reg_powerdown dw 0 ;0x26
.reg_ext_audio dw 0 ;0x28
.reg_ext_st dw 0 ;0x2a
.reg_pcm_front_rate dw 0 ;0x2c
.reg_pcm_surr_rate dw 0 ;0x2e
.reg_lfe_rate dw 0 ;0x30
.reg_pcm_in_rate dw 0 ;0x32
dw 0 ;0x34
.reg_cent_lfe_vol dw 0 ;0x36
.reg_surr_vol dw 0 ;0x38
.reg_spdif_ctrl dw 0 ;0x3A
dw 0 ;0x3C
dw 0 ;0x3E
dw 0 ;0x40
dw 0 ;0x42
dw 0 ;0x44
dw 0 ;0x46
dw 0 ;0x48
dw 0 ;0x4A
dw 0 ;0x4C
dw 0 ;0x4E
dw 0 ;0x50
dw 0 ;0x52
dw 0 ;0x54
dw 0 ;0x56
dw 0 ;0x58
dw 0 ;0x5A
dw 0 ;0x5C
dw 0 ;0x5E
.reg_page_0 dw 0 ;0x60
.reg_page_1 dw 0 ;0x62
.reg_page_2 dw 0 ;0x64
.reg_page_3 dw 0 ;0x66
.reg_page_4 dw 0 ;0x68
.reg_page_5 dw 0 ;0x6A
.reg_page_6 dw 0 ;0x6C
.reg_page_7 dw 0 ;0x6E
dw 0 ;0x70
dw 0 ;0x72
dw 0 ;0x74
dw 0 ;0x76
dw 0 ;0x78
dw 0 ;0x7A
.reg_vendor_id_1 dw 0 ;0x7C
.reg_vendor_id_2 dw 0 ;0x7E
.regs dw ? ; codec registers
.reg_master_vol dw ? ;0x02
.reg_aux_out_vol dw ? ;0x04
.reg_mone_vol dw ? ;0x06
.reg_master_tone dw ? ;0x08
.reg_beep_vol dw ? ;0x0A
.reg_phone_vol dw ? ;0x0C
.reg_mic_vol dw ? ;0x0E
.reg_line_in_vol dw ? ;0x10
.reg_cd_vol dw ? ;0x12
.reg_video_vol dw ? ;0x14
.reg_aux_in_vol dw ? ;0x16
.reg_pcm_out_vol dw ? ;0x18
.reg_rec_select dw ? ;0x1A
.reg_rec_gain dw ? ;0x1C
.reg_rec_gain_mic dw ? ;0x1E
.reg_gen dw ? ;0x20
.reg_3d_ctrl dw ? ;0X22
.reg_page dw ? ;0X24
.reg_powerdown dw ? ;0x26
.reg_ext_audio dw ? ;0x28
.reg_ext_st dw ? ;0x2a
.reg_pcm_front_rate dw ? ;0x2c
.reg_pcm_surr_rate dw ? ;0x2e
.reg_lfe_rate dw ? ;0x30
.reg_pcm_in_rate dw ? ;0x32
dw ? ;0x34
.reg_cent_lfe_vol dw ? ;0x36
.reg_surr_vol dw ? ;0x38
.reg_spdif_ctrl dw ? ;0x3A
dw ? ;0x3C
dw ? ;0x3E
dw ? ;0x40
dw ? ;0x42
dw ? ;0x44
dw ? ;0x46
dw ? ;0x48
dw ? ;0x4A
dw ? ;0x4C
dw ? ;0x4E
dw ? ;0x50
dw ? ;0x52
dw ? ;0x54
dw ? ;0x56
dw ? ;0x58
dw ? ;0x5A
dw ? ;0x5C
dw ? ;0x5E
.reg_page_0 dw ? ;0x60
.reg_page_1 dw ? ;0x62
.reg_page_2 dw ? ;0x64
.reg_page_3 dw ? ;0x66
.reg_page_4 dw ? ;0x68
.reg_page_5 dw ? ;0x6A
.reg_page_6 dw ? ;0x6C
.reg_page_7 dw ? ;0x6E
dw ? ;0x70
dw ? ;0x72
dw ? ;0x74
dw ? ;0x76
dw ? ;0x78
dw ? ;0x7A
.reg_vendor_id_1 dw ? ;0x7C
.reg_vendor_id_2 dw ? ;0x7E
 
 
.reset dd 0 ;virual
.set_master_vol dd 0
.reset dd ? ;virual
.set_master_vol dd ?
}
 
struc CTRL_INFO
268,16 → 268,29
new_app_base equ 0x60400000; 0x01000000
PROC_BASE equ OS_BASE+0x0080000
 
public START
public STOP
public service_proc
public START
public IMPORTS
 
section '.flat' align 16
extrn AttachIntHandler
extrn SysMsgBoardStr
extrn PciApi
extrn PciRead32
extrn PciRead8
extrn PciWrite8
extrn AllocKernelSpace
extrn MapPage
extrn RegService
extrn KernelAlloc
extrn GetPgAddr
extrn GetCurrentTask
 
section '.flat' code readable align 16
 
START:
if DEBUG
mov esi, msgInit
call [SysMsgBoardStr]
call SysMsgBoardStr
end if
 
call detect_controller
286,9 → 299,9
 
if DEBUG
mov esi,[ctrl.vendor_ids]
call [SysMsgBoardStr]
call SysMsgBoardStr
mov esi, [ctrl.ctrl_ids]
call [SysMsgBoardStr]
call SysMsgBoardStr
 
end if
 
298,7 → 311,7
 
if DEBUG
mov esi, msgInitCodec
call [SysMsgBoardStr]
call SysMsgBoardStr
end if
 
call init_codec
307,10 → 320,10
 
if DEBUG
mov esi, [codec.ac_vendor_ids]
call [SysMsgBoardStr]
call SysMsgBoardStr
 
mov esi, [codec.chip_ids]
call [SysMsgBoardStr]
call SysMsgBoardStr
end if
 
call reset_controller
317,7 → 330,7
call setup_codec
 
mov esi, msgPrimBuff
call [SysMsgBoardStr]
call SysMsgBoardStr
 
call create_primary_buff
 
341,22 → 354,16
bt eax, ebx
jnc .fail
 
stdcall [AttachIntHandler], ebx, ac97_irq
 
stdcall [RegService], sz_sound_srv, service_proc
 
mov esi, msgOk
call [SysMsgBoardStr]
 
stdcall AttachIntHandler, ebx, ac97_irq
stdcall RegService, sz_sound_srv, service_proc
ret
 
.fail:
if DEBUG
mov esi, msgFail
call [SysMsgBoardStr]
call SysMsgBoardStr
end if
 
xor eax, eax
STOP:
ret
 
handle equ IOCTL.handle
375,7 → 382,7
jne @F
if DEBUG
mov esi, msgPlay
call [SysMsgBoardStr]
call SysMsgBoardStr
end if
call play
ret
384,7 → 391,7
jne @F
if DEBUG
mov esi, msgStop
call [SysMsgBoardStr]
call SysMsgBoardStr
end if
call stop
ret
440,7 → 447,7
bts ax, IRQ_LINE
out dx, aX
 
stdcall [PciWrite8], dword 0, dword 0xF8, dword 0x61, dword IRQ_LINE
stdcall PciWrite8, dword 0, dword 0xF8, dword 0x61, dword IRQ_LINE
mov [ctrl.int_line], IRQ_LINE
 
.exit:
452,7 → 459,7
 
; if DEBUG
; mov esi, msgIRQ
; call [SysMsgBoardStr]
; call SysMsgBoardStr
; end if
 
mov edx, PCM_OUT_CR_REG
504,7 → 511,7
align 4
proc create_primary_buff
 
stdcall [KernelAlloc], 0x10000
stdcall KernelAlloc, 0x10000
mov [ctrl.buffer], eax
 
mov edi, eax
513,7 → 520,7
cld
rep stosd
 
stdcall [GetPgAddr], [ctrl.buffer]
stdcall GetPgAddr, [ctrl.buffer]
 
mov ebx, 0xC0002000
mov ecx, 4
565,7 → 572,7
loop @B
 
mov ecx, pcmout_bdl
stdcall [GetPgAddr], ecx
stdcall GetPgAddr, ecx
and ecx, 0xFFF
add eax, ecx
 
591,7 → 598,7
xor eax, eax
mov [bus], eax
inc eax
call [PciApi]
call PciApi
cmp eax, -1
je .err
 
600,7 → 607,7
.next_bus:
and [devfn], 0
.next_dev:
stdcall [PciRead32], [bus], [devfn], dword 0
stdcall PciRead32, [bus], [devfn], dword 0
test eax, eax
jz .next
cmp eax, -1
677,7 → 684,7
 
mov [last_bus], eax
.next_bus:
stdcall [PciRead32], [bus], dword 0xF8, dword 0
stdcall PciRead32, [bus], dword 0xF8, dword 0
test eax, eax
jz .next
cmp eax, -1
703,7 → 710,7
align 4
proc init_controller
 
stdcall [PciRead32], [ctrl.bus], [ctrl.devfn], dword 4
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 4
mov ebx, eax
and eax, 0xFFFF
mov [ctrl.pci_cmd], eax
710,25 → 717,25
shr ebx, 16
mov [ctrl.pci_stat], ebx
 
stdcall [PciRead32], [ctrl.bus], [ctrl.devfn], dword 0x10
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x10
and eax,0xFFFE
mov [ctrl.codec_io_base], eax
 
stdcall [PciRead32], [ctrl.bus], [ctrl.devfn], dword 0x14
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x14
and eax, 0xFFC0
mov [ctrl.ctrl_io_base], eax
 
stdcall [PciRead32], [ctrl.bus], [ctrl.devfn], dword 0x18
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x18
mov [ctrl.codec_mem_base], eax
 
stdcall [PciRead32], [ctrl.bus], [ctrl.devfn], dword 0x1C
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x1C
mov [ctrl.ctrl_mem_base], eax
 
stdcall [PciRead32], [ctrl.bus], [ctrl.devfn], dword 0x3C
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x3C
and eax, 0xFF
mov [ctrl.int_line], eax
 
stdcall [PciRead8], [ctrl.bus], [ctrl.devfn], dword 0x41
stdcall PciRead8, [ctrl.bus], [ctrl.devfn], dword 0x41
and eax, 0xFF
mov [ctrl.cfg_reg], eax
 
758,12 → 765,12
 
align 4
proc set_ICH4
stdcall [AllocKernelSpace], dword 0x2000
stdcall AllocKernelSpace, dword 0x2000
mov edi, eax
stdcall [MapPage], edi,[ctrl.codec_mem_base],PG_SW+PG_NOCACHE
stdcall MapPage, edi,[ctrl.codec_mem_base],PG_SW+PG_NOCACHE
mov [ctrl.codec_mem_base], edi
add edi, 0x1000
stdcall [MapPage], edi, [ctrl.ctrl_mem_base],PG_SW+PG_NOCACHE
stdcall MapPage, edi, [ctrl.ctrl_mem_base],PG_SW+PG_NOCACHE
mov [ctrl.ctrl_mem_base], edi
 
mov [ctrl.codec_read16], codec_mem_r16 ;virtual
861,7 → 868,7
 
if DEBUG
mov esi, msgCFail
call [SysMsgBoardStr]
call SysMsgBoardStr
end if
xor eax, eax ; timeout error
ret
868,7 → 875,7
.ok:
if DEBUG
mov esi, msgResetOk
call [SysMsgBoardStr]
call SysMsgBoardStr
end if
 
xor eax, eax
888,7 → 895,7
 
if DEBUG
mov esi, msgWarm
call [SysMsgBoardStr]
call SysMsgBoardStr
end if
 
mov [counter], 10 ; total 10*100 ms = 1s
905,7 → 912,7
 
if DEBUG
mov esi, msgWRFail
call [SysMsgBoardStr]
call SysMsgBoardStr
end if
 
stc
934,7 → 941,7
 
if DEBUG
mov esi, msgCold
call [SysMsgBoardStr]
call SysMsgBoardStr
end if
 
mov eax, 1000000 ; wait 1 s
958,7 → 965,7
 
if DEBUG
mov esi, msgCRFail
call [SysMsgBoardStr]
call SysMsgBoardStr
end if
stc
ret
1292,21 → 1299,7
 
include "codec.inc"
 
 
align 16
pcmout_bdl dq 32 dup(0)
buff_list dd 32 dup(0)
 
align 16
ctrl AC_CNTRL
 
align 16
codec CODEC
 
lpc_bus dd 0
civ_val dd 0
 
align 16
align 4
devices dd (CTRL_ICH shl 16)+VID_INTEL,msg_ICH, set_ICH
dd (CTRL_ICH0 shl 16)+VID_INTEL,msg_ICH0,set_ICH
dd (CTRL_ICH2 shl 16)+VID_INTEL,msg_ICH2,set_ICH
1322,24 → 1315,6
 
dd 0 ;terminator
 
align 16
imp_table:
IMPORTS:
 
AttachIntHandler dd szAttachIntHandler
SysMsgBoardStr dd szSysMsgBoardStr
PciApi dd szPciApi
PciRead32 dd szPciRead32
PciRead8 dd szPciRead8
PciWrite8 dd szPciWrite8
AllocKernelSpace dd szAllocKernelSpace
MapPage dd szMapPage
KernelAlloc dd szKernelAlloc
GetPgAddr dd szGetPgAddr
RegService dd szRegService
GetCurrentTask dd szGetCurrentTask
dd 0
 
msg_ICH db 'Intel ICH', 13,10, 0
msg_ICH0 db 'Intel ICH0', 13,10, 0
msg_ICH2 db 'Intel ICH2', 13,10, 0
1355,21 → 1330,7
msg_NForce3 db 'NForce 3', 13,10, 0
msg_NVidia db 'NVidea', 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
szPciWrite8 db 'PciWrite8',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
 
sz_sound_srv db 'SOUND',0
 
msgInit db 'detect hardware...',13,10,0
1392,3 → 1353,15
msgCFail db 'codec not ready',13,10,0
msgResetOk db 'reset complete',13,10,0
 
section '.data' data readable writable align 16
 
pcmout_bdl rq 32
buff_list rd 32
 
codec CODEC
ctrl AC_CNTRL
 
lpc_bus rd 1
civ_val rd 1
 
 
/kernel/trunk/kernel.asm
16,8 → 16,6
 
include "const.inc"
 
NEW equ 0
 
;WinMapAddress equ 0x460000
;display_data = 0x460000
 
412,7 → 410,7
call init_LFB
call init_mtrr
 
stdcall alloc_kernel_space, 0x50000
stdcall alloc_kernel_space, 0x4F000
mov [ipc_tmp], eax
mov ebx, 0x1000
 
426,9 → 424,6
mov [proc_mem_tab], eax
 
add eax, ebx
mov [current_pdir], eax
 
add eax, ebx
mov [tmp_task_pdir], eax
 
add eax, ebx