1)drivers version control

2)extended events format
3)ATI hardware cursor 

git-svn-id: svn://kolibrios.org@227 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Sergey Semyonov (Serge) 2006-12-02 08:18:48 +00:00
parent 94294b0b80
commit 36ae3b7991
15 changed files with 1348 additions and 1001 deletions

View File

@ -171,6 +171,10 @@ system_shutdown: ; shut down the system
call restorefatchain call restorefatchain
mov al, 0xFF
out 0x21, al
out 0xA1, al
mov word [0x467+0],pr_mode_exit-0x10000 mov word [0x467+0],pr_mode_exit-0x10000
mov word [0x467+2],0x1000 mov word [0x467+2],0x1000
@ -224,9 +228,10 @@ org $-0x10000
out 0xA1,al out 0xA1,al
call rdelay call rdelay
mov al,0 mov al,0xB8
out 0x21,al out 0x21,al
call rdelay call rdelay
mov al,0xBD
out 0xA1,al out 0xA1,al
sti sti

View File

@ -296,7 +296,7 @@ EVENT_MOUSE equ 0x00000020
EVENT_IPC equ 0x00000040 EVENT_IPC equ 0x00000040
EVENT_NETWORK equ 0x00000080 EVENT_NETWORK equ 0x00000080
EVENT_DEBUG equ 0x00000100 EVENT_DEBUG equ 0x00000100
EVENT_NOTIFY equ 0x00000200 EVENT_EXTENDED equ 0x00000200
EV_INTR equ 1 EV_INTR equ 1

View File

@ -1,6 +1,10 @@
DRV_ENTRY equ 1 DRV_ENTRY equ 1
DRV_EXIT equ -1 DRV_EXIT equ -1
DRV_COMPAT equ 1 ;minimal required drivers version
DRV_CURRENT equ 1 ;current drivers model version
DRV_VERSION equ (DRV_COMPAT shl 16) or DRV_CURRENT
align 4 align 4
proc attach_int_handler stdcall, irq:dword, handler:dword proc attach_int_handler stdcall, irq:dword, handler:dword
@ -704,7 +708,7 @@ proc load_driver stdcall, file_name:dword
stdcall load_file, [file_name] stdcall load_file, [file_name]
test eax, eax test eax, eax
jz .fail jz .exit
mov [coff], eax mov [coff], eax
@ -775,23 +779,25 @@ proc load_driver stdcall, file_name:dword
stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\ stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
[strings], ebx [strings], ebx
test eax, eax test eax, eax
jnz @F jz .link_fail
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] mov ebx, [coff]
add ebx, 20 add ebx, 20
stdcall fix_coff_relocs, [coff], ebx, [sym] stdcall fix_coff_relocs, [coff], ebx, [sym]
mov ebx, [coff]
stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szVersion
test eax, eax
jz .link_fail
mov eax, [eax]
shr eax, 16
cmp eax, DRV_COMPAT
jb .ver_fail
cmp eax, DRV_CURRENT
ja .ver_fail
mov ebx, [coff] mov ebx, [coff]
stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szSTART stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szSTART
mov [start], eax mov [start], eax
@ -812,7 +818,32 @@ proc load_driver stdcall, file_name:dword
mov ecx, [start] mov ecx, [start]
mov [eax+SRV.entry], ecx mov [eax+SRV.entry], ecx
ret ret
.ver_fail:
mov esi, msg_CR
call sys_msg_board_str
mov esi, [file_name]
call sys_msg_board_str
mov esi, msg_CR
call sys_msg_board_str
mov esi, msg_version
call sys_msg_board_str
mov esi, msg_www
call sys_msg_board_str
jmp .cleanup
.link_fail:
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
.cleanup:
stdcall kernel_free,[img_base]
.fail: .fail:
stdcall kernel_free, [coff]
.exit:
xor eax, eax xor eax, eax
ret ret
endp endp
@ -924,20 +955,19 @@ endp
align 4 align 4
proc stop_all_services proc stop_all_services
pushf not [srv_map]
cli
mov eax, [srv_map]
not eax
mov [srv_map], eax
.next: .next:
bsf eax, [srv_map] bsf eax, [srv_map]
jnz .find jnz .find
popf
ret ret
.find: .find:
btr [srv_map], eax btr [srv_map], eax
shl eax,0x02 shl eax,0x02
lea eax,[srv_tab+eax+eax*8] ;srv_tab+eax*36 lea eax,[srv_tab+eax+eax*8] ;srv_tab+eax*36
cmp [eax+SRV.magic], ' SRV'
jne .next
cmp [eax+SRV.size], SRV_SIZE
jne .next
mov ebx, [eax+SRV.entry] mov ebx, [eax+SRV.entry]
stdcall ebx, dword -1 stdcall ebx, dword -1
jmp .next jmp .next
@ -946,13 +976,11 @@ endp
drv_sound db '/rd/1/drivers/unisound.obj', 0 drv_sound db '/rd/1/drivers/unisound.obj', 0
drv_infinity db '/rd/1/drivers/infinity.obj', 0 drv_infinity db '/rd/1/drivers/infinity.obj', 0
;drv_ati2d db '/rd/1/drivers/vesa.obj', 0 drv_hw_mouse db '/rd/1/drivers/ati2d.obj',0
;drv_cursor db '/rd/1/drivers/vesa.obj',0
szSound db 'SOUND',0 szSound db 'SOUND',0
szInfinity db 'INFINITY',0 szInfinity db 'INFINITY',0
;szHMouse db 'ATI2D',0 szHwMouse db 'HWCURSOR',0
;szCURSOR db 'VESACURSOR',0
szSTART db 'START',0 szSTART db 'START',0
szEXPORTS db 'EXPORTS',0 szEXPORTS db 'EXPORTS',0
@ -960,9 +988,12 @@ szIMPORTS db 'IMPORTS',0
msg_unresolved db 'unresolved ',0 msg_unresolved db 'unresolved ',0
msg_module db 'in module ',0 msg_module db 'in module ',0
msg_version db 'incompatible driver version',13,10,0
msg_www db 'please visit www.kolibrios.org',13,10,0
msg_CR db 13,10,0 msg_CR db 13,10,0
align 4 align 4
create_cursor dd 0
set_hw_cursor dd 0 set_hw_cursor dd 0
hw_restore dd 0 hw_restore dd 0
@ -970,6 +1001,5 @@ align 16
services: services:
dd szSound, drv_sound dd szSound, drv_sound
dd szInfinity, drv_infinity dd szInfinity, drv_infinity
; dd szHMouse, drv_ati2d dd szHwMouse, drv_hw_mouse
; dd szCURSOR, drv_cursor
dd 0 dd 0

View File

@ -1,6 +1,7 @@
iglobal iglobal
szKernel db 'KERNEL', 0 szKernel db 'KERNEL', 0
szVersion db 'version',0
szAttachIntHandler db 'AttachIntHandler',0 szAttachIntHandler db 'AttachIntHandler',0
szSysMsgBoardStr db 'SysMsgBoardStr', 0 szSysMsgBoardStr db 'SysMsgBoardStr', 0
szPciApi db 'PciApi', 0 szPciApi db 'PciApi', 0
@ -20,9 +21,11 @@ iglobal
szFpuRestore db 'FpuRestore',0 szFpuRestore db 'FpuRestore',0
szLoadCursor db 'LoadCursor',0 szLoadCursor db 'LoadCursor',0
szSetHwCursor db 'SetHwCursor',0 szSetHwCursor db 'SetHwCursor',0
szHWRestore db 'HWRestore', 0 szHwCursorRestore db 'HwCursorRestore', 0
szHwCursorCreate db 'HwCursorCreate', 0
szLFBAddress db 'LFBAddress',0 szLFBAddress db 'LFBAddress',0
szLoadFile db 'LoadFile',0 szLoadFile db 'LoadFile',0
szSendEvent db 'SendEvent',0
align 16 align 16
kernel_export: kernel_export:
@ -45,12 +48,13 @@ kernel_export:
dd szFpuRestore , fpu_restore dd szFpuRestore , fpu_restore
dd szLoadCursor , load_cursor dd szLoadCursor , load_cursor
dd szSetHwCursor , set_hw_cursor dd szSetHwCursor , set_hw_cursor
dd szHWRestore , hw_restore dd szHwCursorRestore , hw_restore
dd szHwCursorCreate , create_cursor
dd szLoadFile , load_file dd szLoadFile , load_file
dd szSendEvent , send_event
exp_lfb: exp_lfb:
dd szLFBAddress , 0 dd szLFBAddress , 0
dd 0 dd 0
endg endg

View File

@ -806,12 +806,14 @@ proc sys_ipc_send stdcall, PID:dword, msg_addr:dword, msg_size:dword
add edi, [ipc_tmp] add edi, [ipc_tmp]
cmp dword [edi], 0 cmp dword [edi], 0
jnz .ipc_blocked ;if dword [buffer]<>0 - ipc blocked now jnz .ipc_blocked ;if dword [buffer]<>0 - ipc blocked now
mov ebx, dword [edi+4] mov ebx, dword [edi+4]
mov edx, ebx mov edx, ebx
add ebx, 8 add ebx, 8
add ebx, [msg_size] add ebx, [msg_size]
cmp ebx, [buf_size] cmp ebx, [buf_size]
ja .buffer_overflow ;esi<0 - not enough memory in buffer ja .buffer_overflow ;esi<0 - not enough memory in buffer
mov dword [edi+4], ebx mov dword [edi+4], ebx
mov eax,[TASK_BASE] mov eax,[TASK_BASE]
mov eax, [eax+0x04] ;eax - our PID mov eax, [eax+0x04] ;eax - our PID
@ -937,10 +939,11 @@ new_services:
@@: @@:
cmp eax, 14 cmp eax, 14
ja @f ja @f
add ebx,new_app_base add ebx, new_app_base
cmp ebx, new_app_base cmp ebx, new_app_base
jb .fail jb .fail
stdcall get_notify, ebx stdcall get_event_ex, ebx, ecx
mov [esp+36], eax
ret ret
@@: @@:
cmp eax, 15 cmp eax, 15
@ -980,14 +983,14 @@ new_services:
ret ret
@@: @@:
cmp eax, 19 cmp eax, 19
ja @f ja .fail
add ebx, new_app_base add ebx, new_app_base
cmp ebx, new_app_base cmp ebx, new_app_base
jb .fail jb .fail
stdcall load_library, ebx stdcall load_library, ebx
mov [esp+36], eax mov [esp+36], eax
ret ret
@@:
.fail: .fail:
xor eax, eax xor eax, eax
mov [esp+36], eax mov [esp+36], eax
@ -1293,18 +1296,21 @@ endg
uglobal uglobal
align 16 align 16
dll_tab rb 32*32 dll_tab rb 32*32
srv_tab rb 36*32 srv_tab rb 36*32
mem_block_map rb 512
event_map rb 128
mem_block_list rd 64
mem_block_mask rd 2
dll_map rd 1 dll_map rd 1
srv_map rd 1 srv_map rd 1
mem_used_list rd 1 mem_used_list rd 1
mem_block_list rd 64
mem_block_map rb 512
mem_block_arr rd 1 mem_block_arr rd 1
mem_block_start rd 1 mem_block_start rd 1
mem_block_end rd 1 mem_block_end rd 1
mem_block_mask rd 2
heap_size rd 1 heap_size rd 1
heap_free rd 1 heap_free rd 1
heap_blocks rd 1 heap_blocks rd 1
@ -1312,8 +1318,11 @@ align 16
page_start rd 1 page_start rd 1
page_end rd 1 page_end rd 1
events rd 1
event_start rd 1
event_end rd 1
sys_page_map rd 1 sys_page_map rd 1
; app_load rd 1
endg endg

View File

@ -6,10 +6,47 @@ format MS COFF
include 'proc32.inc' include 'proc32.inc'
DEBUG equ 0 DEBUG equ 1
VID_ATI equ 0x1002 VID_ATI equ 0x1002
LOAD_FROM_FILE equ 0
LOAD_FROM_MEM equ 1
LOAD_INDIRECT equ 2
LOAD_SYSTEM equ 3
struc BITMAPINFOHEADER {
.biSize dd ? ; DWORD
.biWidth dd ? ; LONG
.biHeight dd ? ; LONG
.biPlanes dw ? ; WORD
.biBitCount dw ? ; WORD
.biCompression dd ? ; DWORD
.biSizeImage dd ? ; DWORD
.biXPelsPerMeter dd ? ; LONG
.biYPelsPerMeter dd ? ; LONG
.biClrUsed dd ? ; DWORD
.biClrImportant dd ? ; DWORD
}
virtual at 0
BI BITMAPINFOHEADER
end virtual
struc CURSOR
{ .magic dd ?
.size dd ?
.pid dd ?
.base dd ?
.hot_x dd ?
.hot_y dd ?
}
virtual at 0
CURSOR CURSOR
end virtual
CURSOR_SIZE equ 24
R8500 equ 0x514C ;R200 R8500 equ 0x514C ;R200
R9000 equ 0x4966 ;RV250 R9000 equ 0x4966 ;RV250
R9200 equ 0x5961 ;RV280 R9200 equ 0x5961 ;RV280
@ -117,6 +154,7 @@ macro wrr dest, src
public START public START
public service_proc public service_proc
public version
extrn SysMsgBoardStr extrn SysMsgBoardStr
extrn PciApi extrn PciApi
@ -125,6 +163,8 @@ extrn AllocKernelSpace
extrn MapPage extrn MapPage
extrn RegService extrn RegService
extrn SetHwCursor extrn SetHwCursor
extrn HwCursorRestore
extrn HwCursorCreate
extrn LFBAddress extrn LFBAddress
extrn LoadFile extrn LoadFile
@ -137,47 +177,53 @@ section '.flat' code readable align 16
proc START stdcall, state:dword proc START stdcall, state:dword
mov eax, [state] cmp [state], 1
cmp eax, 1 jne .exit
je .entry
jmp .exit
.entry:
if DEBUG if DEBUG
mov esi, msgInit mov esi, msgInit
call SysMsgBoardStr call SysMsgBoardStr
end if end if
call detect_ati call detect_ati
test eax, eax
jz .fail
stdcall LoadFile, user_file
test eax, eax test eax, eax
jz @F jz .fail
mov [user_arrow], eax
@@:
stdcall ati_init_cursor, [user_arrow]
call init_ati call init_ati
test eax, eax test eax, eax
jz .fail jz .fail
xor eax, eax
mov edi, cursors
mov ecx, CURSOR_SIZE*16
cld
rep stosd
not eax
mov [cursor_map], eax
mov [cursor_map+4], eax
mov edx, cursor_map
mov [cursor_start], edx
add edx, 4
mov [cursor_end], edx
stdcall RegService, sz_ati_srv, service_proc stdcall RegService, sz_ati_srv, service_proc
test eax, eax test eax, eax
jz .fail jz .fail
mov ebx, SetHwCursor mov dword [SetHwCursor], drvCursorPos ;enable hardware cursor
mov dword [ebx], drvCursorPos ;enable hardware cursor mov dword [HwCursorRestore], drv_restore
ret mov dword [HwCursorCreate], ati_cursor
ret
.fail: .fail:
if DEBUG if DEBUG
mov esi, msgFail mov esi, msgFail
call SysMsgBoardStr call SysMsgBoardStr
end if end if
.exit: .exit:
xor eax, eax xor eax, eax
mov ebx, SetHwCursor ; mov ebx, SetHwCursor
mov dword [ebx], eax ;force disable hardware cursor ; mov dword [ebx], eax ;force disable hardware cursor
ret ret
endp endp
@ -194,8 +240,8 @@ proc service_proc stdcall, ioctl:dword
; mov edi, [ioctl] ; mov edi, [ioctl]
; mov eax, [edi+io_code] ; mov eax, [edi+io_code]
xor eax, eax xor eax, eax
ret ret
endp endp
restore handle restore handle
@ -207,53 +253,54 @@ restore out_size
align 4 align 4
proc detect_ati proc detect_ati
locals locals
last_bus dd ? last_bus dd ?
endl endl
xor eax, eax xor eax, eax
mov [bus], eax mov [bus], eax
inc eax inc eax
call PciApi call PciApi
cmp eax, -1 cmp eax, -1
je .err je .err
mov [last_bus], eax mov [last_bus], eax
.next_bus: .next_bus:
and [devfn], 0 and [devfn], 0
.next_dev: .next_dev:
stdcall PciRead32, [bus], [devfn], dword 0 stdcall PciRead32, [bus], [devfn], dword 0
test eax, eax test eax, eax
jz .next jz .next
cmp eax, -1 cmp eax, -1
je .next je .next
mov edi, devices mov edi, devices
@@: @@:
mov ebx, [edi] mov ebx, [edi]
test ebx, ebx test ebx, ebx
jz .next jz .next
cmp eax, ebx cmp eax, ebx
je .found je .found
add edi, 4 add edi, 4
jmp @B jmp @B
.next: inc [devfn] .next:
cmp [devfn], 256 inc [devfn]
jb .next_dev cmp [devfn], 256
mov eax, [bus] jb .next_dev
inc eax mov eax, [bus]
mov [bus], eax
cmp eax, [last_bus]
jna .next_bus
xor eax, eax
ret
.found:
xor eax, eax
inc eax inc eax
ret mov [bus], eax
cmp eax, [last_bus]
jna .next_bus
xor eax, eax
ret
.found:
xor eax, eax
inc eax
ret
.err: .err:
xor eax, eax xor eax, eax
ret ret
@ -276,7 +323,7 @@ proc init_ati
mov edx, 16 mov edx, 16
@@: @@:
stdcall MapPage,edi,esi,PG_SW+PG_NOCACHE stdcall MapPage,edi,esi,PG_SW+PG_NOCACHE
add edi, 0x1000 add edi, 0x1000
add esi, 0x1000 add esi, 0x1000
dec edx dec edx
jnz @B jnz @B
@ -296,9 +343,6 @@ proc init_ati
or eax, ebx or eax, ebx
mov [edi+0x50], eax mov [edi+0x50], eax
pushd 0
pushd 0
call drvCursorPos
call drvShowCursor call drvShowCursor
xor eax, eax xor eax, eax
inc eax inc eax
@ -306,6 +350,10 @@ proc init_ati
ret ret
endp endp
align 4
drv_restore:
ret 8
align 4 align 4
drvShowCursor: drvShowCursor:
mov edi, [ati_io] mov edi, [ati_io]
@ -316,25 +364,105 @@ drvShowCursor:
ret ret
align 4 align 4
drvCursorPos: proc drvCursorPos stdcall, hcursor:dword, x:dword, y:dword
push ebp
mov ebp, esp
mov eax, 80000000h mov eax, 80000000h
wrr CUR_HORZ_VERT_OFF, eax wrr CUR_HORZ_VERT_OFF, eax
mov eax, [ebp+8] mov eax, [x]
shl eax, 16 shl eax, 16
or eax, [ebp+12] or eax, [y]
or eax, 80000000h or eax, 80000000h
wrr CUR_HORZ_VERT_POSN, eax wrr CUR_HORZ_VERT_POSN, eax
mov eax, CURSOR_IMAGE_OFFSET mov esi, [hcursor]
mov eax, [esi+CURSOR.base]
sub eax, LFBAddress
wrr CUR_OFFSET, eax wrr CUR_OFFSET, eax
leave ret
ret 8 endp
align 4 align 4
proc ati_init_cursor stdcall, arrow:dword proc video_alloc
pushfd
cli
mov ebx, [cursor_start]
mov ecx, [cursor_end]
.l1:
bsf eax,[ebx];
jnz .found
add ebx,4
cmp ebx, ecx
jb .l1
popfd
xor eax,eax
ret
.found:
btr [ebx], eax
popfd
mov [cursor_start],ebx
sub ebx, cursor_map
shl ebx, 3
add eax,ebx
shl eax,14
add eax, LFBAddress+CURSOR_IMAGE_OFFSET
ret
endp
align 4
proc ati_cursor stdcall, hcursor:dword, src:dword, flags:dword
stdcall video_alloc
mov edi, [hcursor]
mov [edi+CURSOR.base], eax
mov esi, [src]
mov ebx, [flags]
cmp bx, LOAD_INDIRECT
je .indirect
movzx ecx, word [esi+10]
movzx edx, word [esi+12]
mov [edi+CURSOR.hot_x], ecx
mov [edi+CURSOR.hot_y], edx
stdcall ati_init_cursor, eax, esi
mov eax, [hcursor]
.fail:
ret
.indirect:
shr ebx, 16
movzx ecx, bh
movzx edx, bl
mov [eax+CURSOR.hot_x], ecx
mov [eax+CURSOR.hot_y], edx
xchg edi, eax
push edi
mov ecx, 64*64
xor eax,eax
rep stosd
mov esi, [src]
pop edi
mov ebx, 32
cld
@@:
mov ecx, 32
rep movsd
add edi, 128
dec ebx
jnz @B
mov eax, [hcursor]
ret
endp
align 4
proc ati_init_cursor stdcall, dst:dword, src:dword
locals locals
rBase dd ? rBase dd ?
pQuad dd ? pQuad dd ?
@ -345,12 +473,13 @@ proc ati_init_cursor stdcall, arrow:dword
counter dd ? counter dd ?
endl endl
cld mov esi, [src]
add esi,[esi+18]
mov esi, [arrow]
add esi,[esi+18d]
mov eax,esi mov eax,esi
cmp [esi+BI.biBitCount], 24
je .img_24
.img_4:
add eax, [esi] add eax, [esi]
mov [pQuad],eax mov [pQuad],eax
add eax,64 add eax,64
@ -415,30 +544,68 @@ proc ati_init_cursor stdcall, arrow:dword
mov [rBase],edi mov [rBase],edi
sub [height],1 sub [height],1
jnz .l1 jnz .l1
jmp .copy
mov edi, LFBAddress .img_24:
add edi, CURSOR_IMAGE_OFFSET add eax, [esi]
mov [pQuad],eax
add eax, 0xC00
mov [pAnd],eax
mov eax,[esi+BI.biWidth]
mov [width],eax
mov ebx,[esi+BI.biHeight]
shr ebx,1
mov [height],ebx
mov edi, pCursor
add edi, 32*31*4
mov [rBase],edi
mov esi,[pAnd]
mov ebx, [pQuad]
.row_24:
mov eax, [esi]
bswap eax
mov [counter], 32
@@:
xor edx, edx
shl eax,1
setc dl
dec edx
mov ecx, [ebx]
and ecx, 0x00FFFFFF
and ecx, edx
and edx, 0xFF000000
or edx, ecx
mov [edi], edx
add ebx, 3
add edi, 4
dec [counter]
jnz @B
add esi, 4
mov edi,[rBase]
sub edi,128
mov [rBase],edi
sub [height],1
jnz .row_24
.copy:
mov edi, [dst]
mov ecx, 64*64 mov ecx, 64*64
xor eax,eax xor eax,eax
rep stosd rep stosd
mov esi, pCursor mov esi, pCursor
mov edi, LFBAddress mov edi, [dst]
add edi, CURSOR_IMAGE_OFFSET
mov ebx, 32 mov ebx, 32
lc: cld
@@:
mov ecx, 32 mov ecx, 32
lb: rep movsd
mov eax, [esi]
mov [edi], eax
add esi, 4
add edi, 4
sub ecx, 1
jnz lb
add edi, 128 add edi, 128
sub ebx, 1 dec ebx
jnz lc jnz @B
ret ret
endp endp
@ -489,21 +656,21 @@ cnt equ bp+8
align 4 align 4
proc engWaitForIdle proc engWaitForIdle
push dword 64 push dword 64
call engWaitForFifo call engWaitForFifo
mov edi, [ati_io] mov edi, [ati_io]
mov ecx ,RD_TIMEOUT mov ecx ,RD_TIMEOUT
@@: @@:
mov eax, [edi+RD_RBBM_STATUS] mov eax, [edi+RD_RBBM_STATUS]
and eax,RD_RBBM_ACTIVE and eax,RD_RBBM_ACTIVE
jz .exit jz .exit
sub ecx,1 sub ecx,1
jnz @B jnz @B
.exit: .exit:
call engFlush call engFlush
ret ret
endp endp
align 4 align 4
@ -514,8 +681,8 @@ proc engRestore
; mov dword [MMIO+RD_RB2D_DSTCACHE_MODE], 0 ; mov dword [MMIO+RD_RB2D_DSTCACHE_MODE], 0
push dword 3 push dword 3
call engWaitForFifo call engWaitForFifo
mov edi, [ati_io] mov edi, [ati_io]
@ -572,7 +739,6 @@ proc engRestore
ret ret
endp endp
align 4 align 4
engSetupSolidFill: engSetupSolidFill:
push ebp push ebp
@ -603,28 +769,28 @@ w equ ebp+16
h equ ebp+20 h equ ebp+20
color equ ebp+24 color equ ebp+24
push dword [ebp+24] push dword [ebp+24]
call engSetupSolidFill call engSetupSolidFill
push dword 2 push dword 2
call engWaitForFifo call engWaitForFifo
mov edi, [ati_io] mov edi, [ati_io]
mov eax, [y] mov eax, [y]
mov ebx, [x] mov ebx, [x]
shl eax,16 shl eax,16
or eax, ebx or eax, ebx
mov ecx, [w] mov ecx, [w]
mov edx, [h] mov edx, [h]
shl ecx,16 shl ecx,16
or ecx, edx or ecx, edx
mov [edi+RD_DST_Y_X], eax mov [edi+RD_DST_Y_X], eax
mov [edi+RD_DST_WIDTH_HEIGHT], ecx mov [edi+RD_DST_WIDTH_HEIGHT], ecx
call engFlush call engFlush
leave leave
ret 20 ret 20
align 4 align 4
devices dd (R8500 shl 16)+VID_ATI devices dd (R8500 shl 16)+VID_ATI
@ -641,28 +807,27 @@ devices dd (R8500 shl 16)+VID_ATI
dd (R9800XT shl 16)+VID_ATI dd (R9800XT shl 16)+VID_ATI
dd 0 ;terminator dd 0 ;terminator
;szKernel db 'KERNEL', 0 version dd 0x00010001
sz_ati_srv db 'ATI2D',0
user_file db '/rd/1/user.cur',0
sz_ati_srv db 'HWCURSOR',0
msgInit db 'detect hardware...',13,10,0 msgInit db 'detect hardware...',13,10,0
msgPCI db 'PCI accsess not supported',13,10,0 msgPCI db 'PCI accsess not supported',13,10,0
msgFail db 'device not found',13,10,0 msgFail db 'device not found',13,10,0
user_arrow dd pArrow
align 16
pArrow:
file 'arrow.cur'
section '.data' data readable writable align 16 section '.data' data readable writable align 16
pCursor db 4096 dup(?) pCursor db 4096 dup(?)
bus dd ? cursors rb CURSOR_SIZE*64
devfn dd ? cursor_map rd 2
ati_io dd ? cursor_start rd 1
cursor_end rd 1
bus dd ?
devfn dd ?
ati_io dd ?

View File

@ -28,6 +28,7 @@ PROC_BASE equ OS_BASE+0x0080000
public START public START
public service_proc public service_proc
public version
extrn AttachIntHandler extrn AttachIntHandler
extrn SysMsgBoardStr extrn SysMsgBoardStr
@ -46,6 +47,7 @@ extrn GetService
extrn ServiceHandler extrn ServiceHandler
extrn FpuSave extrn FpuSave
extrn FpuRestore extrn FpuRestore
extrn SendEvent
SND_CREATE_BUFF equ 2 SND_CREATE_BUFF equ 2
SND_PLAY equ 3 SND_PLAY equ 3
@ -74,11 +76,9 @@ section '.flat' code readable align 16
proc START stdcall, state:dword proc START stdcall, state:dword
mov eax, [state] cmp [state], 1
cmp eax, 1 jne .exit
je .entry
jmp .exit
.entry:
stdcall GetService, szSound stdcall GetService, szSound
test eax, eax test eax, eax
jz .fail jz .fail
@ -102,22 +102,22 @@ proc START stdcall, state:dword
stdcall set_handler, [hSound], new_mix stdcall set_handler, [hSound], new_mix
stdcall RegService, szInfinity, service_proc stdcall RegService, szInfinity, service_proc
ret ret
.fail: .fail:
if DEBUG if DEBUG
mov esi, msgFail mov esi, msgFail
call SysMsgBoardStr call SysMsgBoardStr
end if end if
.exit: .exit:
xor eax, eax xor eax, eax
ret ret
.out_of_mem: .out_of_mem:
if DEBUG if DEBUG
mov esi, msgMem mov esi, msgMem
call SysMsgBoardStr call SysMsgBoardStr
end if end if
xor eax, eax xor eax, eax
ret ret
endp endp
@ -134,21 +134,21 @@ proc service_proc stdcall, ioctl:dword
mov edi, [ioctl] mov edi, [ioctl]
mov eax, [edi+io_code] mov eax, [edi+io_code]
cmp eax, SND_CREATE_BUFF cmp eax, SND_CREATE_BUFF
jne @F jne @F
mov ebx, [edi+input] mov ebx, [edi+input]
stdcall CreateBuffer,[ebx] stdcall CreateBuffer,[ebx]
ret ret
@@: @@:
cmp eax, SND_PLAY cmp eax, SND_PLAY
jne @F jne @F
mov ebx, [edi+input] mov ebx, [edi+input]
stdcall play_buffer, [ebx] stdcall play_buffer, [ebx]
ret ret
@@: @@:
cmp eax, SND_STOP cmp eax, SND_STOP
jne @F jne @F
; if DEBUG ; if DEBUG
; mov esi, msgStop ; mov esi, msgStop
@ -156,27 +156,27 @@ proc service_proc stdcall, ioctl:dword
; end if ; end if
mov ebx, [edi+input] mov ebx, [edi+input]
stdcall stop_buffer, [ebx] stdcall stop_buffer, [ebx]
ret ret
@@: @@:
cmp eax, SND_SETBUFF cmp eax, SND_SETBUFF
jne @F jne @F
mov ebx, [edi+input] mov ebx, [edi+input]
mov eax, [ebx+4] mov eax, [ebx+4]
add eax, new_app_base add eax, new_app_base
stdcall set_buffer, [ebx],eax,[ebx+8],[ebx+12] stdcall set_buffer, [ebx],eax,[ebx+8],[ebx+12]
ret ret
@@: @@:
cmp eax, SND_DESTROY_BUFF cmp eax, SND_DESTROY_BUFF
jne @F jne @F
mov ebx, [edi+input] mov ebx, [edi+input]
stdcall DestroyBuffer, [ebx] stdcall DestroyBuffer, [ebx]
ret ret
@@: @@:
xor eax, eax xor eax, eax
ret ret
endp endp
restore handle restore handle
@ -191,54 +191,54 @@ CURRENT_TASK equ 0x0003000
align 8 align 8
proc CreateBuffer stdcall, format:dword proc CreateBuffer stdcall, format:dword
locals locals
str dd ? str dd ?
endl endl
call alloc_stream call alloc_stream
and eax, eax and eax, eax
jz .fail jz .fail
mov [str], eax mov [str], eax
mov edi, eax mov edi, eax
mov edx, [stream_count] mov edx, [stream_count]
mov [stream_list+edx*4], eax mov [stream_list+edx*4], eax
inc [stream_count] inc [stream_count]
mov [edi+STREAM.magic], 'WAVE' mov [edi+STREAM.magic], 'WAVE'
mov [edi+STREAM.size], STREAM_SIZE mov [edi+STREAM.size], STREAM_SIZE
stdcall KernelAlloc, 180*1024 stdcall KernelAlloc, 180*1024
mov edi, [str] mov edi, [str]
mov [edi+STREAM.base], eax mov [edi+STREAM.base], eax
mov [edi+STREAM.curr_seg], eax mov [edi+STREAM.curr_seg], eax
mov [edi+STREAM.notify_off1], eax mov [edi+STREAM.notify_off1], eax
add eax, 0x8000 add eax, 0x8000
mov [edi+STREAM.notify_off2], eax mov [edi+STREAM.notify_off2], eax
add eax, 0x7FFF add eax, 0x7FFF
mov [edi+STREAM.limit], eax mov [edi+STREAM.limit], eax
inc eax inc eax
mov [edi+STREAM.work_buff], eax mov [edi+STREAM.work_buff], eax
mov [edi+STREAM.work_read], eax mov [edi+STREAM.work_read], eax
mov [edi+STREAM.work_write], eax mov [edi+STREAM.work_write], eax
mov [edi+STREAM.work_count], 0 mov [edi+STREAM.work_count], 0
add eax, 0x10000 add eax, 0x10000
mov [edi+STREAM.work_top], eax mov [edi+STREAM.work_top], eax
add eax, 1024*32 add eax, 1024*32
mov [edi+STREAM.r_buff], eax mov [edi+STREAM.r_buff], eax
mov ebx, [CURRENT_TASK] mov ebx, [CURRENT_TASK]
shl ebx, 5 shl ebx, 5
mov eax, [0x3000+ebx+4] mov eax, [0x3000+ebx+4]
mov [edi+STREAM.notify_task], eax mov [edi+STREAM.notify_task], eax
mov eax, [format] mov eax, [format]
mov [edi+STREAM.format], eax mov [edi+STREAM.format], eax
mov [edi+STREAM.flags], SND_STOP mov [edi+STREAM.flags], SND_STOP
xor ebx, ebx xor ebx, ebx
cmp eax, 19 cmp eax, 19
@ -247,7 +247,7 @@ proc CreateBuffer stdcall, format:dword
@@: @@:
mov [edi+STREAM.r_silence], ebx mov [edi+STREAM.r_silence], ebx
shl eax, 4 shl eax, 4
mov ebx, [resampler_params+eax] mov ebx, [resampler_params+eax]
mov ecx, [resampler_params+eax+4] mov ecx, [resampler_params+eax+4]
mov edx, [resampler_params+eax+8] mov edx, [resampler_params+eax+8]
@ -256,50 +256,50 @@ proc CreateBuffer stdcall, format:dword
mov [edi+STREAM.r_end], ecx mov [edi+STREAM.r_end], ecx
mov [edi+STREAM.r_dt], edx mov [edi+STREAM.r_dt], edx
mov ebx, [resampler_params+eax+12] mov ebx, [resampler_params+eax+12]
mov [edi+STREAM.resample], ebx mov [edi+STREAM.resample], ebx
mov edi, [edi+STREAM.base] mov edi, [edi+STREAM.base]
mov ecx, 180*1024/4 mov ecx, 180*1024/4
xor eax, eax xor eax, eax
rep stosd rep stosd
mov eax, [str] mov eax, [str]
ret ret
.fail: .fail:
xor eax, eax xor eax, eax
ret ret
endp endp
align 4 align 4
pid_to_slot: pid_to_slot:
push ebx push ebx
push ecx push ecx
mov ebx,[TASK_COUNT] mov ebx,[TASK_COUNT]
shl ebx,5 shl ebx,5
mov ecx,2*32 mov ecx,2*32
.loop: .loop:
cmp byte [CURRENT_TASK+ecx+0xa],9 cmp byte [CURRENT_TASK+ecx+0xa],9
jz .endloop ;skip empty slots jz .endloop ;skip empty slots
cmp [CURRENT_TASK+ecx+0x4],eax ;check PID cmp [CURRENT_TASK+ecx+0x4],eax ;check PID
jz .pid_found jz .pid_found
.endloop: .endloop:
add ecx,32 add ecx,32
cmp ecx,ebx cmp ecx,ebx
jle .loop jle .loop
pop ecx pop ecx
pop ebx pop ebx
xor eax,eax xor eax,eax
ret ret
.pid_found: .pid_found:
shr ecx,5 shr ecx,5
mov eax,ecx mov eax,ecx
pop ecx pop ecx
pop ebx pop ebx
ret ret
align 4 align 4
proc DestroyBuffer stdcall, str:dword proc DestroyBuffer stdcall, str:dword
@ -307,15 +307,15 @@ proc DestroyBuffer stdcall, str:dword
mov esi, [str] mov esi, [str]
cmp [esi+STREAM.magic], 'WAVE' cmp [esi+STREAM.magic], 'WAVE'
jne .fail jne .fail
cmp [esi+STREAM.size], STREAM_SIZE cmp [esi+STREAM.size], STREAM_SIZE
jne .fail jne .fail
stdcall KernelFree, [esi+STREAM.base] stdcall KernelFree, [esi+STREAM.base]
mov eax, [str] mov eax, [str]
call free_stream call free_stream
mov edi, [str] mov edi, [str]
mov ecx, STREAM_SIZE/4 mov ecx, STREAM_SIZE/4
@ -333,8 +333,8 @@ proc DestroyBuffer stdcall, str:dword
dec ecx dec ecx
jnz @B jnz @B
xor eax, eax xor eax, eax
inc eax inc eax
ret ret
.remove: .remove:
mov edi, esi mov edi, esi
add esi, 4 add esi, 4
@ -342,208 +342,203 @@ proc DestroyBuffer stdcall, str:dword
rep movsd rep movsd
dec [stream_count] dec [stream_count]
xor eax, eax xor eax, eax
inc eax inc eax
ret ret
.fail: .fail:
xor eax, eax xor eax, eax
ret ret
endp endp
align 4 align 4
proc play_buffer stdcall, str:dword proc play_buffer stdcall, str:dword
mov ebx, [str] mov ebx, [str]
cmp [ebx+STREAM.magic], 'WAVE' cmp [ebx+STREAM.magic], 'WAVE'
jne .fail jne .fail
cmp [ebx+STREAM.size], STREAM_SIZE cmp [ebx+STREAM.size], STREAM_SIZE
jne .fail jne .fail
mov [ebx+STREAM.flags], SND_PLAY mov [ebx+STREAM.flags], SND_PLAY
mov eax,[ebx+STREAM.work_buff] mov eax,[ebx+STREAM.work_buff]
mov [ebx+STREAM.work_read], eax mov [ebx+STREAM.work_read], eax
mov [ebx+STREAM.work_write], eax mov [ebx+STREAM.work_write], eax
mov [ebx+STREAM.work_count], 0 mov [ebx+STREAM.work_count], 0
mov eax, [ebx+STREAM.base] mov eax, [ebx+STREAM.base]
mov [ebx+STREAM.curr_seg], eax mov [ebx+STREAM.curr_seg], eax
mov esi, [ebx+STREAM.curr_seg] mov esi, [ebx+STREAM.curr_seg]
mov edi, [ebx+STREAM.work_write] mov edi, [ebx+STREAM.work_write]
mov edx, [ebx+STREAM.r_buff] mov edx, [ebx+STREAM.r_buff]
mov ecx, 32 mov ecx, 32
mov eax, [ebx+STREAM.r_silence] mov eax, [ebx+STREAM.r_silence]
@@: @@:
mov [edx], eax mov [edx], eax
add edx, 4 add edx, 4
dec ecx dec ecx
jnz @B jnz @B
mov edx, [ebx+STREAM.r_buff] mov edx, [ebx+STREAM.r_buff]
stdcall [ebx+STREAM.resample], edi, esi, edx,\ stdcall [ebx+STREAM.resample], edi, esi, edx,\
[ebx+STREAM.r_dt],[ebx+STREAM.r_size],[ebx+STREAM.r_end] [ebx+STREAM.r_dt],[ebx+STREAM.r_size],[ebx+STREAM.r_end]
mov ebx, [str] mov ebx, [str]
add [ebx+STREAM.work_count], eax; add [ebx+STREAM.work_count], eax;
add [ebx+STREAM.work_write], eax; add [ebx+STREAM.work_write], eax;
mov eax, [ebx+STREAM.r_size] mov eax, [ebx+STREAM.r_size]
add [ebx+STREAM.curr_seg], eax add [ebx+STREAM.curr_seg], eax
; if DEBUG ; if DEBUG
; mov esi, msgPlay ; mov esi, msgPlay
; call [SysMsgBoardStr] ; call [SysMsgBoardStr]
; end if ; end if
stdcall dev_play, [hSound] stdcall dev_play, [hSound]
xor eax, eax
xor eax, eax inc eax
inc eax ret
ret
.fail: .fail:
xor eax, eax xor eax, eax
ret ret
endp endp
align 4 align 4
proc stop_buffer stdcall, str:dword proc stop_buffer stdcall, str:dword
mov edi, [str] mov edi, [str]
cmp [edi+STREAM.magic], 'WAVE' cmp [edi+STREAM.magic], 'WAVE'
jne .fail jne .fail
cmp [edi+STREAM.size], STREAM_SIZE cmp [edi+STREAM.size], STREAM_SIZE
jne .fail jne .fail
mov [edi+STREAM.flags], SND_STOP mov [edi+STREAM.flags], SND_STOP
; stdcall [ServiceHandler], [hSound], dword DEV_STOP, 0 ; stdcall [ServiceHandler], [hSound], dword DEV_STOP, 0
xor eax, eax xor eax, eax
inc eax inc eax
ret ret
.fail: .fail:
xor eax, eax xor eax, eax
ret ret
endp endp
align 4 align 4
proc set_buffer stdcall, str:dword,src:dword,offs:dword,size:dword proc set_buffer stdcall, str:dword,src:dword,offs:dword,size:dword
mov edx, [str] mov edx, [str]
test edx, edx test edx, edx
jz .fail jz .fail
cmp [edx+STREAM.magic], 'WAVE' cmp [edx+STREAM.magic], 'WAVE'
jne .fail jne .fail
cmp [edx+STREAM.size], STREAM_SIZE cmp [edx+STREAM.size], STREAM_SIZE
jne .fail jne .fail
mov esi,[src] mov esi,[src]
test esi, esi test esi, esi
jz .fail jz .fail
cmp esi, new_app_base cmp esi, new_app_base
jb .fail jb .fail
mov ecx, [size] mov ecx, [size]
test ecx, ecx test ecx, ecx
jz .fail jz .fail
mov eax, [edx+STREAM.base] mov eax, [edx+STREAM.base]
add eax, [offs] add eax, [offs]
cmp eax, [edx+STREAM.base] cmp eax, [edx+STREAM.base]
jb .fail jb .fail
mov edi, eax mov edi, eax
add eax, ecx add eax, ecx
sub eax, 1 sub eax, 1
cmp eax, [edx+STREAM.limit] cmp eax, [edx+STREAM.limit]
ja .fail ja .fail
shr ecx, 2 shr ecx, 2
cld cld
rep movsd rep movsd
xor eax, eax xor eax, eax
inc eax inc eax
ret ret
.fail: .fail:
xor eax, eax xor eax, eax
ret ret
endp endp
align 4 align 4
proc alloc_stream proc alloc_stream
mov esi, stream_map mov esi, stream_map
pushf pushf
cli cli
bsf eax, [esi] bsf eax, [esi]
jnz .find jnz .find
popf popf
xor eax, eax xor eax, eax
ret ret
.find:
.find: btr [esi], eax btr [esi], eax
popf popf
mov ebx, STREAM_SIZE mov ebx, STREAM_SIZE
mul ebx mul ebx
add eax, stream add eax, stream
ret ret
endp endp
align 4 align 4
proc free_stream proc free_stream
sub eax, stream sub eax, stream
mov ebx, STREAM_SIZE mov ebx, STREAM_SIZE
xor edx, edx xor edx, edx
div ebx div ebx
and edx, edx and edx, edx
jnz .err jnz .err
bts [stream_map], eax bts [stream_map], eax
ret
ret
.err: .err:
xor eax, eax xor eax, eax
ret ret
endp endp
align 4 align 4
proc check_stream proc check_stream
xor edx, edx xor edx, edx
mov ecx, [play_count] mov ecx, [play_count]
.l1: .l1:
mov esi, [play_list+edx] mov esi, [play_list+edx]
mov eax, [esi+STR.curr_seg] mov eax, [esi+STR.curr_seg]
cmp eax, [esi+STR.limit] cmp eax, [esi+STR.limit]
jb .next jb .next
.m1: mov eax,[esi+STR.base] .m1:
mov [esi+STR.curr_seg], eax mov eax,[esi+STR.base]
mov [esi+STR.curr_seg], eax
.next: .next:
add edx, 4 add edx, 4
loop .l1 loop .l1
ret ret
endp endp
@ -552,9 +547,9 @@ proc prepare_playlist
.restart: .restart:
xor ebx, ebx xor ebx, ebx
xor edx, edx xor edx, edx
mov [play_count], 0 mov [play_count], 0
mov ecx, [stream_count] mov ecx, [stream_count]
jcxz .exit jcxz .exit
.l1: .l1:
mov esi, [stream_list+ebx] mov esi, [stream_list+ebx]
@ -576,18 +571,18 @@ proc prepare_playlist
jz .fail jz .fail
cmp [esi+STREAM.flags], SND_PLAY; cmp [esi+STREAM.flags], SND_PLAY;
jne .next jne .next
cmp [esi+STREAM.work_count], 16384 cmp [esi+STREAM.work_count], 16384
jb .next jb .next
mov [play_list+edx], esi mov [play_list+edx], esi
inc [play_count] inc [play_count]
add edx, 4 add edx, 4
.next: .next:
add ebx, 4 add ebx, 4
loop .l1 loop .l1
.exit: .exit:
ret ret
.fail: .fail:
stdcall DestroyBuffer, esi stdcall DestroyBuffer, esi
jmp .restart jmp .restart
@ -596,26 +591,26 @@ endp
align 4 align 4
proc prepare_updatelist proc prepare_updatelist
xor ebx, ebx xor ebx, ebx
xor edx, edx xor edx, edx
mov [play_count], 0 mov [play_count], 0
mov ecx, [stream_count] mov ecx, [stream_count]
jcxz .exit jcxz .exit
.l1: .l1:
mov eax, [stream_list+ebx] mov eax, [stream_list+ebx]
test eax, eax test eax, eax
jz .next jz .next
cmp [eax+STREAM.flags], SND_PLAY cmp [eax+STREAM.flags], SND_PLAY
jne .next jne .next
mov [play_list+edx], eax mov [play_list+edx], eax
inc [play_count] inc [play_count]
add edx, 4 add edx, 4
.next: .next:
add ebx, 4 add ebx, 4
loop .l1 loop .l1
.exit: .exit:
ret ret
endp endp
align 4 align 4
@ -738,6 +733,7 @@ mm80 dq 0x8080808080808080
mm_mask dq 0xFF00FF00FF00FF00 mm_mask dq 0xFF00FF00FF00FF00
stream_map dd 0xFFFF ; 16 stream_map dd 0xFFFF ; 16
version dd 0x00010001
szInfinity db 'INFINITY',0 szInfinity db 'INFINITY',0
szSound db 'SOUND',0 szSound db 'SOUND',0

View File

@ -111,6 +111,9 @@ align 4
proc update_stream proc update_stream
locals locals
stream_index dd ? stream_index dd ?
ev_code dd ? ;EVENT
ev_offs dd ?
rd 4
endl endl
mov [stream_index], 0 mov [stream_index], 0
@ -176,17 +179,19 @@ proc update_stream
ret ret
@@: @@:
mov [ev_code], 0xFF000001
mov [ev_offs], ecx
mov eax, [ebx+STREAM.notify_task] mov eax, [ebx+STREAM.notify_task]
call pid_to_slot
lea edx, [ev_code]
push ebx
stdcall SendEvent, eax, edx
pop ebx
test eax, eax test eax, eax
jnz @f jnz .l_end
not eax not eax
mov [ebx+STREAM.notify_task], eax ;-1 mov [ebx+STREAM.notify_task], eax ;-1
jmp .l_end
@@:
shl eax, 8
mov [eax+PROC_BASE+32],ecx
or dword [eax+PROC_BASE+0xA8],EVENT_NOTIFY
.l_end: .l_end:
inc [stream_index] inc [stream_index]
dec [play_count] dec [play_count]
@ -196,14 +201,13 @@ endp
align 4 align 4
proc refill stdcall, str:dword proc refill stdcall, str:dword
locals
; if DEBUG ev_code dd ? ;EVENT
; mov esi, msgUser ev_offs dd ?
; call [SysMsgBoardStr] rd 4
; end if endl
mov ebx, [str] mov ebx, [str]
mov ecx, [ebx+STREAM.work_write] mov ecx, [ebx+STREAM.work_write]
cmp ecx, [ebx+STREAM.work_top] cmp ecx, [ebx+STREAM.work_top]
jbe .m2 jbe .m2
@ -245,17 +249,19 @@ proc refill stdcall, str:dword
ret ret
@@: @@:
mov [ev_code], 0xFF000001
mov [ev_offs], ecx
mov eax, [ebx+STREAM.notify_task] mov eax, [ebx+STREAM.notify_task]
call pid_to_slot
lea edx, [ev_code]
push ebx
stdcall SendEvent, eax, edx
pop ebx
test eax, eax test eax, eax
jnz @f jnz @F
not eax not eax
mov [ebx+STREAM.notify_task], eax ;-1 mov [ebx+STREAM.notify_task], eax ;-1
ret
@@: @@:
shl eax, 8
mov [eax+PROC_BASE+32],ecx
or dword [eax+PROC_BASE+0xA8],EVENT_NOTIFY
ret ret
endp endp

View File

@ -25,6 +25,7 @@ end virtual
public START public START
public service_proc public service_proc
public version
extrn AttachIntHandler extrn AttachIntHandler
extrn SysMsgBoardStr extrn SysMsgBoardStr
@ -54,11 +55,10 @@ section '.flat' code readable align 16
proc START stdcall, state:dword proc START stdcall, state:dword
mov eax, [state] cmp [state], 1
cmp eax, 1 jne .exit
je .entry
jmp .exit
.entry: .entry:
if DEBUG if DEBUG
mov esi, msgInit mov esi, msgInit
call SysMsgBoardStr call SysMsgBoardStr
@ -161,6 +161,8 @@ align 4
devices dd (DEVICE_ID shl 16)+VENDOR_ID devices dd (DEVICE_ID shl 16)+VENDOR_ID
dd 0 ;terminator dd 0 ;terminator
version dd 0x00010001
my_service db 'MY_SERVICE',0 ;max 16 chars include zero my_service db 'MY_SERVICE',0 ;max 16 chars include zero
msgInit db 'detect hardware...',13,10,0 msgInit db 'detect hardware...',13,10,0

File diff suppressed because it is too large Load Diff

View File

@ -275,6 +275,7 @@ PROC_BASE equ OS_BASE+0x0080000
public START public START
public service_proc public service_proc
public version
extrn AttachIntHandler extrn AttachIntHandler
extrn SysMsgBoardStr extrn SysMsgBoardStr
@ -293,10 +294,8 @@ section '.flat' code readable align 16
proc START stdcall, state:dword proc START stdcall, state:dword
mov eax, [state] cmp [state], 1
cmp eax, 1
jne .stop jne .stop
.entry:
if DEBUG if DEBUG
mov esi, msgInit mov esi, msgInit
@ -376,6 +375,7 @@ proc START stdcall, state:dword
ret ret
.stop: .stop:
call stop call stop
xor eax, eax
ret ret
endp endp
@ -1010,13 +1010,8 @@ endp
align 4 align 4
proc stop proc stop
mov edx, PCM_OUT_CR_REG mov edx, PCM_OUT_CR_REG
mov ax, 0x14 mov ax, 0x0
call [ctrl.ctrl_write8]
mov eax, 16
mov [ctrl.lvi_reg], eax
mov edx, PCM_OUT_LVI_REG
call [ctrl.ctrl_write8] call [ctrl.ctrl_write8]
mov ax, 0x1c mov ax, 0x1c
@ -1336,6 +1331,8 @@ devices dd (CTRL_ICH shl 16)+VID_INTEL,msg_ICH, set_ICH
dd 0 ;terminator dd 0 ;terminator
version dd 0x00010001
msg_ICH db 'Intel ICH', 13,10, 0 msg_ICH db 'Intel ICH', 13,10, 0
msg_ICH0 db 'Intel ICH0', 13,10, 0 msg_ICH0 db 'Intel ICH0', 13,10, 0
msg_ICH2 db 'Intel ICH2', 13,10, 0 msg_ICH2 db 'Intel ICH2', 13,10, 0

View File

@ -1,3 +1,169 @@
struc EVENT
{ .code rd 1
rd 5
.next rd 1 ;+24
.prev rd 1 ;+28
}
EVENT_SIZE equ 32
virtual at 0
EVENT EVENT
end virtual
align 4
init_events:
stdcall kernel_alloc, 1024*EVENT_SIZE
mov [events], eax
xor eax, eax
not eax
mov edi, event_map
mov [event_start], edi
mov ecx, 128/4
cld
rep stosd
mov [event_end], edi
ret
align 4
proc alloc_event
pushfd
cli
mov ebx, [event_start]
mov ecx, [event_end]
.l1:
bsf eax,[ebx]
jnz .found
add ebx,4
cmp ebx, ecx
jb .l1
popfd
xor eax,eax
ret
.found:
btr [ebx], eax
mov [event_start],ebx
sub ebx, event_map
shl ebx, 3
add eax,ebx
shl eax,5
add eax, [events]
popfd
xor ebx, ebx
mov [eax+EVENT.next], ebx
mov [eax+EVENT.prev], ebx
ret
endp
align 4
free_event:
pushfd
cli
sub eax, [events]
shr eax, 5
mov ebx, event_map
bts [ebx], eax
shr eax, 3
and eax, not 3
add eax, ebx
cmp [event_start], eax
ja @f
popfd
ret
@@:
mov [event_start], eax
popfd
ret
align 4
proc send_event stdcall pid:dword, event:dword
locals
slot dd ?
endl
mov eax, [pid]
call pid_to_slot
test eax, eax
jz .fail
shl eax, 8
cmp [PROC_BASE+eax+APPDATA.ev_count], 32
ja .fail
mov [slot], eax
call alloc_event
test eax, eax
jz .fail
mov edi, eax
mov ecx, 6
mov esi, [event]
cld
rep movsd
mov esi, eax
mov eax, [slot]
mov edi, [PROC_BASE+eax+APPDATA.ev_last]
mov [esi+EVENT.prev], edi
test edi, edi
jz .set_last
mov [edi+EVENT.next], esi
.set_last:
mov edx, [PROC_BASE+eax+APPDATA.ev_first]
test edx, edx
jnz @F
mov [PROC_BASE+eax+APPDATA.ev_first], esi
@@:
mov [PROC_BASE+eax+APPDATA.ev_last], esi
inc [PROC_BASE+eax+APPDATA.ev_count]
or [PROC_BASE+eax+APPDATA.event_mask], EVENT_EXTENDED
.fail:
ret
endp
align 4
proc get_event_ex stdcall, p_ev:dword, timeout:dword
; push eax
; push edx
; mov edx, 0x400 ;bocsh
; mov al,0xff ;bocsh
; out dx, al ;bocsh
; pop edx
; pop eax
.wait:
mov ebx,[CURRENT_TASK]
shl ebx,8
cmp [PROC_BASE+ebx+APPDATA.ev_count], 0
je .switch
mov esi, [PROC_BASE+ebx+APPDATA.ev_first]
mov edx, [esi+EVENT.next]
mov [PROC_BASE+ebx+APPDATA.ev_first], edx
test edx, edx
jnz @F
mov [PROC_BASE+ebx+APPDATA.ev_last], edx
and dword [PROC_BASE+ebx+APPDATA.event_mask], not EVENT_EXTENDED
@@:
mov [edx+EVENT.prev], 0
dec [PROC_BASE+ebx+APPDATA.ev_count]
mov eax, esi
and dword [esi], 0xFF00FFFF
mov edi, [p_ev]
mov ecx, 6
cld
rep movsd
call free_event
ret
.switch:
mov eax, [0x3010]
mov [eax+TASKDATA.state], byte 5
call change_task
jmp .wait
endp
sys_getevent: sys_getevent:
call get_event_for_app call get_event_for_app
@ -6,23 +172,22 @@ sys_getevent:
align 4 align 4
sys_wait_event_timeout: sys_wait_event_timeout:
mov ebx,[timer_ticks] mov ebx,[timer_ticks]
add ebx,eax add ebx,eax
cmp ebx,[timer_ticks] cmp ebx,[timer_ticks]
jna .swfet2 jna .swfet2
.swfet1: .swfet1:
call get_event_for_app call get_event_for_app
test eax,eax test eax,eax
jne .eventoccur_time jne .eventoccur_time
call change_task call change_task
cmp ebx,[timer_ticks] cmp ebx,[timer_ticks]
jg .swfet1 jg .swfet1
.swfet2: .swfet2:
xor eax,eax xor eax,eax
.eventoccur_time: .eventoccur_time:
mov [esp+36],eax mov [esp+36],eax
ret ret
@ -46,7 +211,6 @@ sys_waitforevent:
mov [esp+36],eax mov [esp+36],eax
ret ret
get_event_for_app: get_event_for_app:
pushad pushad
@ -164,16 +328,26 @@ get_event_for_app:
no_stack_event: no_stack_event:
test byte [edi+TASKDATA.event_mask+1], 1 ; DEBUG test byte [edi+TASKDATA.event_mask+1], 1 ; DEBUG
jz no_debug_event jz .test_ext
mov eax, [0x3000] mov eax, [0x3000]
shl eax, 8 shl eax, 8
test byte [eax+0x80000+APPDATA.event_mask+1], byte 1 test byte [eax+0x80000+APPDATA.event_mask+1], byte 1
jz no_debug_event jz .test_ext
and byte [eax+0x80000+APPDATA.event_mask+1], not 1 and byte [eax+0x80000+APPDATA.event_mask+1], not 1
popad popad
mov eax, 9 mov eax, 9
ret ret
no_debug_event:
.test_ext:
mov eax, [0x3000]
shl eax, 8
test dword [eax+0x80000+APPDATA.event_mask], EVENT_EXTENDED
jz .test_IRQ
mov eax, 10
ret
.test_IRQ:
cmp dword [edi+TASKDATA.event_mask], 0xFFFF cmp dword [edi+TASKDATA.event_mask], 0xFFFF
jbe no_events jbe no_events
@ -213,3 +387,4 @@ get_event_for_app:
ret ret

View File

@ -440,6 +440,8 @@ include 'detect/disks.inc'
stdcall kernel_alloc, 0x1000 stdcall kernel_alloc, 0x1000
mov [tmp_task_data], eax mov [tmp_task_data], eax
call init_events
mov [dll_map], 0xFFFFFFFF mov [dll_map], 0xFFFFFFFF
mov [srv_map], 0xFFFFFFFF mov [srv_map], 0xFFFFFFFF
@ -550,11 +552,9 @@ include 'vmodeld.inc'
call boot_log call boot_log
call setmouse call setmouse
mov [pci_access_enabled],1
call init_cursors call init_cursors
; mov [pci_access_enabled],1
; stdcall get_service, szCURSOR
; SET PRELIMINARY WINDOW STACK AND POSITIONS ; SET PRELIMINARY WINDOW STACK AND POSITIONS
mov esi,boot_windefs mov esi,boot_windefs

View File

@ -173,20 +173,22 @@ struc APPDATA
db 5 dup(?) db 5 dup(?)
.fpu_state dd ? ;+16 .fpu_state dd ? ;+16
dd ? ;+20 unused .ev_count dd ? ;+20
.fpu_handler dd ? ;+24 .fpu_handler dd ? ;+24
.sse_handler dd ? ;+28 .sse_handler dd ? ;+28
.event dd ? ;+32 .event dd ? ;+32
.heap_base dd ? ;+36 .heap_base dd ? ;+36
.heap_top dd ? ;+40 .heap_top dd ? ;+40
.cursor dd ? ;+44 .cursor dd ? ;+44
.ev_first dd ? ;+48
.ev_last dd ? ;+52
db 80 dup(?) ;+48 db 72 dup(?) ;+56
.wnd_shape dd ? ;+128 .wnd_shape dd ? ;+128
.wnd_shape_scale dd ? .wnd_shape_scale dd ? ;+132
dd ? dd ? ;+136
.mem_size dd ? .mem_size dd ? ;+140
.saved_box BOX .saved_box BOX
.ipc_start dd ? .ipc_start dd ?
.ipc_size dd ? .ipc_size dd ?

View File

@ -151,7 +151,6 @@ proc vesa_init_cursor stdcall, dst:dword, src:dword
sub [height],1 sub [height],1
jnz .row_24 jnz .row_24
ret ret
endp endp
align 4 align 4
@ -172,46 +171,21 @@ proc alloc_cursor
ret ret
.found: .found:
btr [ebx], eax btr [ebx], eax
popfd
mov [cursor_start],ebx mov [cursor_start],ebx
sub ebx, cursor_map sub ebx, cursor_map
shl ebx, 3 shl ebx, 3
add eax,ebx add eax,ebx
shl eax,3 shl eax,3
lea eax,[cursors+eax+eax*2] lea eax,[cursors+eax+eax*2]
popfd
ret
endp
align 4
proc create_cursor
locals
h_cur dd ?
endl
call alloc_cursor
test eax, eax
jz .fail
mov [h_cur], eax
mov edi, eax
xor ebx, ebx xor ebx, ebx
mov [eax+CURSOR.magic], 'CURS'
mov [edi+CURSOR.magic], 'CURS' mov [eax+CURSOR.size], CURSOR_SIZE
mov [edi+CURSOR.size], CURSOR_SIZE mov [eax+CURSOR.pid], ebx
mov [edi+CURSOR.pid], ebx mov [eax+CURSOR.hot_x], ebx
mov [edi+CURSOR.hot_x], ebx mov [eax+CURSOR.hot_y], ebx
mov [edi+CURSOR.hot_y], ebx
stdcall kernel_alloc, dword 0x2000
test eax, eax
jz .fail
mov ebx, eax
mov eax, [h_cur]
mov [eax+CURSOR.base], ebx
ret
.fail:
ret ret
endp endp
@ -224,80 +198,71 @@ proc set_cursor stdcall, hcursor:dword
ret ret
endp endp
proc vesa_cursor stdcall, hcursor:dword, src:dword, flags:dword
stdcall kernel_alloc, 0x1000
test eax, eax
jz .fail
mov edi, [hcursor]
mov [edi+CURSOR.base], eax
mov esi, [src]
mov ebx, [flags]
cmp bx, LOAD_INDIRECT
je .indirect
movzx ecx, word [esi+10]
movzx edx, word [esi+12]
mov [edi+CURSOR.hot_x], ecx
mov [edi+CURSOR.hot_y], edx
stdcall vesa_init_cursor, eax, esi
mov eax, [hcursor]
.fail:
ret
.indirect:
shr ebx, 16
movzx ecx, bh
movzx edx, bl
mov [eax+CURSOR.hot_x], ecx
mov [eax+CURSOR.hot_y], edx
xchg edi, eax
mov ecx, 1024
cld
rep movsd
ret
endp
align 4 align 4
proc load_cursor stdcall, src:dword, flags:dword proc load_cursor stdcall, src:dword, flags:dword
locals locals
handle dd ? handle dd ?
endl endl
movzx eax, word [flags] xor eax, eax
cmp eax, LOAD_FROM_FILE mov [handle], eax
jne .from_mem cmp word [flags], LOAD_FROM_FILE
jne @F
stdcall load_file, [src] stdcall load_file, [src]
test eax, eax test eax, eax
jz .exit jz .exit
mov [src], eax mov [src], eax
@@:
call create_cursor call alloc_cursor
test eax, eax test eax, eax
jz .fail jz .fail
stdcall [create_cursor], eax, [src], [flags]
mov [handle], eax mov [handle], eax
mov esi, [src]
movzx ebx, word [esi+10]
movzx ecx, word [esi+12]
mov [eax+CURSOR.hot_x], ebx
mov [eax+CURSOR.hot_y], ecx
stdcall vesa_init_cursor, [eax+CURSOR.base], esi
stdcall kernel_free, [src]
mov eax, [handle]
ret
.from_mem:
cmp eax, LOAD_FROM_MEM
jne .indirect
call create_cursor
test eax, eax
jz .exit
mov [handle], eax
mov esi, [src]
movzx ebx, word [esi+10]
movzx ecx, word [esi+12]
mov [eax+CURSOR.hot_x], ebx
mov [eax+CURSOR.hot_y], ecx
stdcall vesa_init_cursor, [eax+CURSOR.base], [src]
mov eax, [handle]
ret
.indirect:
cmp eax, LOAD_INDIRECT
jne .fail
call create_cursor
test eax, eax
jz .exit
movzx edx, byte [flags+2]
movzx ebx, byte [flags+3]
mov [eax+CURSOR.hot_x], ebx
mov [eax+CURSOR.hot_y], edx
mov edi, [eax+CURSOR.base]
mov esi, [src]
mov ecx, 1024
cld
rep movsd
ret
.fail: .fail:
mov ebx, [src] cmp word [flags], LOAD_FROM_FILE
stdcall kernel_free, ebx jne .exit
stdcall kernel_free, [src]
.exit: .exit:
xor eax, eax mov eax, [handle]
ret ret
endp endp
@ -330,6 +295,16 @@ proc init_cursors
add edx, 4 add edx, 4
mov [cursor_end], edx mov [cursor_end], edx
stdcall load_driver, drv_hw_mouse
test eax, eax
jz .sw_mouse
stdcall load_cursor, def_arrow, dword LOAD_FROM_MEM
mov [def_cursor], eax
ret
.sw_mouse:
mov [create_cursor], vesa_cursor
stdcall load_cursor, def_arrow, dword LOAD_FROM_MEM stdcall load_cursor, def_arrow, dword LOAD_FROM_MEM
mov [def_cursor], eax mov [def_cursor], eax
@ -446,7 +421,6 @@ proc cursor_24 stdcall, hcursor:dword, x:dword, y:dword
sub edi, ecx sub edi, ecx
cmp edi, eax cmp edi, eax
;cmovg edi, eax
jng @F jng @F
mov edi, eax mov edi, eax
@@: @@:
@ -454,7 +428,6 @@ proc cursor_24 stdcall, hcursor:dword, x:dword, y:dword
sub edx, [y] sub edx, [y]
cmp edx, eax cmp edx, eax
;cmovg edx, eax
jng @F jng @F
mov edx, eax mov edx, eax
@@: @@:
@ -559,7 +532,6 @@ proc cursor_32 stdcall, hcursor:dword, x:dword, y:dword
sub edi, ecx sub edi, ecx
cmp edi, eax cmp edi, eax
; cmovg edi, eax
jng @F jng @F
mov edi, eax mov edi, eax
@@: @@:
@ -567,7 +539,6 @@ proc cursor_32 stdcall, hcursor:dword, x:dword, y:dword
sub edx, [y] sub edx, [y]
cmp edx, eax cmp edx, eax
; cmovg edx, eax
jng @F jng @F
mov edx, eax mov edx, eax
@@: @@: