forked from KolibriOS/kolibrios
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:
parent
94294b0b80
commit
36ae3b7991
@ -171,6 +171,10 @@ system_shutdown: ; shut down the system
|
||||
|
||||
call restorefatchain
|
||||
|
||||
mov al, 0xFF
|
||||
out 0x21, al
|
||||
out 0xA1, al
|
||||
|
||||
mov word [0x467+0],pr_mode_exit-0x10000
|
||||
mov word [0x467+2],0x1000
|
||||
|
||||
@ -224,9 +228,10 @@ org $-0x10000
|
||||
out 0xA1,al
|
||||
call rdelay
|
||||
|
||||
mov al,0
|
||||
mov al,0xB8
|
||||
out 0x21,al
|
||||
call rdelay
|
||||
mov al,0xBD
|
||||
out 0xA1,al
|
||||
sti
|
||||
|
||||
|
@ -296,7 +296,7 @@ EVENT_MOUSE equ 0x00000020
|
||||
EVENT_IPC equ 0x00000040
|
||||
EVENT_NETWORK equ 0x00000080
|
||||
EVENT_DEBUG equ 0x00000100
|
||||
EVENT_NOTIFY equ 0x00000200
|
||||
EVENT_EXTENDED equ 0x00000200
|
||||
|
||||
EV_INTR equ 1
|
||||
|
||||
|
@ -1,6 +1,10 @@
|
||||
|
||||
DRV_ENTRY equ 1
|
||||
DRV_EXIT equ -1
|
||||
DRV_ENTRY 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
|
||||
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]
|
||||
|
||||
test eax, eax
|
||||
jz .fail
|
||||
jz .exit
|
||||
|
||||
mov [coff], eax
|
||||
|
||||
@ -775,23 +779,25 @@ proc load_driver stdcall, file_name:dword
|
||||
stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
|
||||
[strings], ebx
|
||||
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]
|
||||
add ebx, 20
|
||||
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]
|
||||
stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szSTART
|
||||
mov [start], eax
|
||||
@ -812,7 +818,32 @@ proc load_driver stdcall, file_name:dword
|
||||
mov ecx, [start]
|
||||
mov [eax+SRV.entry], ecx
|
||||
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:
|
||||
stdcall kernel_free, [coff]
|
||||
.exit:
|
||||
xor eax, eax
|
||||
ret
|
||||
endp
|
||||
@ -924,20 +955,19 @@ endp
|
||||
|
||||
align 4
|
||||
proc stop_all_services
|
||||
pushf
|
||||
cli
|
||||
mov eax, [srv_map]
|
||||
not eax
|
||||
mov [srv_map], eax
|
||||
not [srv_map]
|
||||
.next:
|
||||
bsf eax, [srv_map]
|
||||
jnz .find
|
||||
popf
|
||||
ret
|
||||
.find:
|
||||
btr [srv_map], eax
|
||||
shl eax,0x02
|
||||
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]
|
||||
stdcall ebx, dword -1
|
||||
jmp .next
|
||||
@ -946,13 +976,11 @@ endp
|
||||
|
||||
drv_sound db '/rd/1/drivers/unisound.obj', 0
|
||||
drv_infinity db '/rd/1/drivers/infinity.obj', 0
|
||||
;drv_ati2d db '/rd/1/drivers/vesa.obj', 0
|
||||
;drv_cursor db '/rd/1/drivers/vesa.obj',0
|
||||
drv_hw_mouse db '/rd/1/drivers/ati2d.obj',0
|
||||
|
||||
szSound db 'SOUND',0
|
||||
szInfinity db 'INFINITY',0
|
||||
;szHMouse db 'ATI2D',0
|
||||
;szCURSOR db 'VESACURSOR',0
|
||||
szHwMouse db 'HWCURSOR',0
|
||||
|
||||
szSTART db 'START',0
|
||||
szEXPORTS db 'EXPORTS',0
|
||||
@ -960,9 +988,12 @@ szIMPORTS db 'IMPORTS',0
|
||||
|
||||
msg_unresolved db 'unresolved ',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
|
||||
|
||||
align 4
|
||||
create_cursor dd 0
|
||||
set_hw_cursor dd 0
|
||||
hw_restore dd 0
|
||||
|
||||
@ -970,6 +1001,5 @@ align 16
|
||||
services:
|
||||
dd szSound, drv_sound
|
||||
dd szInfinity, drv_infinity
|
||||
; dd szHMouse, drv_ati2d
|
||||
; dd szCURSOR, drv_cursor
|
||||
dd szHwMouse, drv_hw_mouse
|
||||
dd 0
|
||||
|
@ -1,6 +1,7 @@
|
||||
|
||||
iglobal
|
||||
szKernel db 'KERNEL', 0
|
||||
szVersion db 'version',0
|
||||
szAttachIntHandler db 'AttachIntHandler',0
|
||||
szSysMsgBoardStr db 'SysMsgBoardStr', 0
|
||||
szPciApi db 'PciApi', 0
|
||||
@ -20,9 +21,11 @@ iglobal
|
||||
szFpuRestore db 'FpuRestore',0
|
||||
szLoadCursor db 'LoadCursor',0
|
||||
szSetHwCursor db 'SetHwCursor',0
|
||||
szHWRestore db 'HWRestore', 0
|
||||
szHwCursorRestore db 'HwCursorRestore', 0
|
||||
szHwCursorCreate db 'HwCursorCreate', 0
|
||||
szLFBAddress db 'LFBAddress',0
|
||||
szLoadFile db 'LoadFile',0
|
||||
szSendEvent db 'SendEvent',0
|
||||
|
||||
align 16
|
||||
kernel_export:
|
||||
@ -45,12 +48,13 @@ kernel_export:
|
||||
dd szFpuRestore , fpu_restore
|
||||
dd szLoadCursor , load_cursor
|
||||
dd szSetHwCursor , set_hw_cursor
|
||||
dd szHWRestore , hw_restore
|
||||
dd szHwCursorRestore , hw_restore
|
||||
dd szHwCursorCreate , create_cursor
|
||||
dd szLoadFile , load_file
|
||||
dd szSendEvent , send_event
|
||||
exp_lfb:
|
||||
dd szLFBAddress , 0
|
||||
dd 0
|
||||
|
||||
|
||||
endg
|
||||
|
||||
|
@ -806,12 +806,14 @@ proc sys_ipc_send stdcall, PID:dword, msg_addr:dword, msg_size:dword
|
||||
add edi, [ipc_tmp]
|
||||
cmp dword [edi], 0
|
||||
jnz .ipc_blocked ;if dword [buffer]<>0 - ipc blocked now
|
||||
|
||||
mov ebx, dword [edi+4]
|
||||
mov edx, ebx
|
||||
add ebx, 8
|
||||
add ebx, [msg_size]
|
||||
cmp ebx, [buf_size]
|
||||
ja .buffer_overflow ;esi<0 - not enough memory in buffer
|
||||
|
||||
mov dword [edi+4], ebx
|
||||
mov eax,[TASK_BASE]
|
||||
mov eax, [eax+0x04] ;eax - our PID
|
||||
@ -937,10 +939,11 @@ new_services:
|
||||
@@:
|
||||
cmp eax, 14
|
||||
ja @f
|
||||
add ebx,new_app_base
|
||||
add ebx, new_app_base
|
||||
cmp ebx, new_app_base
|
||||
jb .fail
|
||||
stdcall get_notify, ebx
|
||||
stdcall get_event_ex, ebx, ecx
|
||||
mov [esp+36], eax
|
||||
ret
|
||||
@@:
|
||||
cmp eax, 15
|
||||
@ -980,14 +983,14 @@ new_services:
|
||||
ret
|
||||
@@:
|
||||
cmp eax, 19
|
||||
ja @f
|
||||
ja .fail
|
||||
add ebx, new_app_base
|
||||
cmp ebx, new_app_base
|
||||
jb .fail
|
||||
stdcall load_library, ebx
|
||||
mov [esp+36], eax
|
||||
ret
|
||||
@@:
|
||||
|
||||
.fail:
|
||||
xor eax, eax
|
||||
mov [esp+36], eax
|
||||
@ -1293,18 +1296,21 @@ endg
|
||||
|
||||
uglobal
|
||||
align 16
|
||||
|
||||
dll_tab rb 32*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
|
||||
srv_map rd 1
|
||||
|
||||
mem_used_list rd 1
|
||||
mem_block_list rd 64
|
||||
mem_block_map rb 512
|
||||
mem_block_arr rd 1
|
||||
mem_block_start rd 1
|
||||
mem_block_end rd 1
|
||||
mem_block_mask rd 2
|
||||
heap_size rd 1
|
||||
heap_free rd 1
|
||||
heap_blocks rd 1
|
||||
@ -1312,8 +1318,11 @@ align 16
|
||||
|
||||
page_start rd 1
|
||||
page_end rd 1
|
||||
events rd 1
|
||||
event_start rd 1
|
||||
event_end rd 1
|
||||
|
||||
sys_page_map rd 1
|
||||
; app_load rd 1
|
||||
endg
|
||||
|
||||
|
||||
|
@ -6,10 +6,47 @@ format MS COFF
|
||||
|
||||
include 'proc32.inc'
|
||||
|
||||
DEBUG equ 0
|
||||
DEBUG equ 1
|
||||
|
||||
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
|
||||
R9000 equ 0x4966 ;RV250
|
||||
R9200 equ 0x5961 ;RV280
|
||||
@ -117,6 +154,7 @@ macro wrr dest, src
|
||||
|
||||
public START
|
||||
public service_proc
|
||||
public version
|
||||
|
||||
extrn SysMsgBoardStr
|
||||
extrn PciApi
|
||||
@ -125,6 +163,8 @@ extrn AllocKernelSpace
|
||||
extrn MapPage
|
||||
extrn RegService
|
||||
extrn SetHwCursor
|
||||
extrn HwCursorRestore
|
||||
extrn HwCursorCreate
|
||||
extrn LFBAddress
|
||||
extrn LoadFile
|
||||
|
||||
@ -137,47 +177,53 @@ section '.flat' code readable align 16
|
||||
|
||||
proc START stdcall, state:dword
|
||||
|
||||
mov eax, [state]
|
||||
cmp eax, 1
|
||||
je .entry
|
||||
jmp .exit
|
||||
.entry:
|
||||
cmp [state], 1
|
||||
jne .exit
|
||||
|
||||
if DEBUG
|
||||
mov esi, msgInit
|
||||
call SysMsgBoardStr
|
||||
end if
|
||||
|
||||
call detect_ati
|
||||
test eax, eax
|
||||
jz .fail
|
||||
|
||||
stdcall LoadFile, user_file
|
||||
test eax, eax
|
||||
jz @F
|
||||
mov [user_arrow], eax
|
||||
@@:
|
||||
stdcall ati_init_cursor, [user_arrow]
|
||||
jz .fail
|
||||
|
||||
call init_ati
|
||||
test eax, eax
|
||||
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
|
||||
test eax, eax
|
||||
jz .fail
|
||||
mov ebx, SetHwCursor
|
||||
mov dword [ebx], drvCursorPos ;enable hardware cursor
|
||||
ret
|
||||
mov dword [SetHwCursor], drvCursorPos ;enable hardware cursor
|
||||
mov dword [HwCursorRestore], drv_restore
|
||||
mov dword [HwCursorCreate], ati_cursor
|
||||
ret
|
||||
.fail:
|
||||
if DEBUG
|
||||
mov esi, msgFail
|
||||
mov esi, msgFail
|
||||
call SysMsgBoardStr
|
||||
end if
|
||||
|
||||
.exit:
|
||||
xor eax, eax
|
||||
mov ebx, SetHwCursor
|
||||
mov dword [ebx], eax ;force disable hardware cursor
|
||||
; mov ebx, SetHwCursor
|
||||
; mov dword [ebx], eax ;force disable hardware cursor
|
||||
ret
|
||||
endp
|
||||
|
||||
@ -194,8 +240,8 @@ proc service_proc stdcall, ioctl:dword
|
||||
; mov edi, [ioctl]
|
||||
; mov eax, [edi+io_code]
|
||||
|
||||
xor eax, eax
|
||||
ret
|
||||
xor eax, eax
|
||||
ret
|
||||
endp
|
||||
|
||||
restore handle
|
||||
@ -207,53 +253,54 @@ restore out_size
|
||||
|
||||
align 4
|
||||
proc detect_ati
|
||||
locals
|
||||
last_bus dd ?
|
||||
endl
|
||||
locals
|
||||
last_bus dd ?
|
||||
endl
|
||||
|
||||
xor eax, eax
|
||||
mov [bus], eax
|
||||
inc eax
|
||||
xor eax, eax
|
||||
mov [bus], eax
|
||||
inc eax
|
||||
call PciApi
|
||||
cmp eax, -1
|
||||
cmp eax, -1
|
||||
je .err
|
||||
|
||||
mov [last_bus], eax
|
||||
mov [last_bus], eax
|
||||
|
||||
.next_bus:
|
||||
and [devfn], 0
|
||||
and [devfn], 0
|
||||
.next_dev:
|
||||
stdcall PciRead32, [bus], [devfn], dword 0
|
||||
test eax, eax
|
||||
jz .next
|
||||
cmp eax, -1
|
||||
je .next
|
||||
test eax, eax
|
||||
jz .next
|
||||
cmp eax, -1
|
||||
je .next
|
||||
|
||||
mov edi, devices
|
||||
mov edi, devices
|
||||
@@:
|
||||
mov ebx, [edi]
|
||||
test ebx, ebx
|
||||
jz .next
|
||||
mov ebx, [edi]
|
||||
test ebx, ebx
|
||||
jz .next
|
||||
|
||||
cmp eax, ebx
|
||||
je .found
|
||||
cmp eax, ebx
|
||||
je .found
|
||||
add edi, 4
|
||||
jmp @B
|
||||
jmp @B
|
||||
|
||||
.next: inc [devfn]
|
||||
cmp [devfn], 256
|
||||
jb .next_dev
|
||||
mov eax, [bus]
|
||||
inc eax
|
||||
mov [bus], eax
|
||||
cmp eax, [last_bus]
|
||||
jna .next_bus
|
||||
xor eax, eax
|
||||
ret
|
||||
.found:
|
||||
xor eax, eax
|
||||
.next:
|
||||
inc [devfn]
|
||||
cmp [devfn], 256
|
||||
jb .next_dev
|
||||
mov eax, [bus]
|
||||
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:
|
||||
xor eax, eax
|
||||
ret
|
||||
@ -276,7 +323,7 @@ proc init_ati
|
||||
mov edx, 16
|
||||
@@:
|
||||
stdcall MapPage,edi,esi,PG_SW+PG_NOCACHE
|
||||
add edi, 0x1000
|
||||
add edi, 0x1000
|
||||
add esi, 0x1000
|
||||
dec edx
|
||||
jnz @B
|
||||
@ -296,9 +343,6 @@ proc init_ati
|
||||
or eax, ebx
|
||||
mov [edi+0x50], eax
|
||||
|
||||
pushd 0
|
||||
pushd 0
|
||||
call drvCursorPos
|
||||
call drvShowCursor
|
||||
xor eax, eax
|
||||
inc eax
|
||||
@ -306,6 +350,10 @@ proc init_ati
|
||||
ret
|
||||
endp
|
||||
|
||||
align 4
|
||||
drv_restore:
|
||||
ret 8
|
||||
|
||||
align 4
|
||||
drvShowCursor:
|
||||
mov edi, [ati_io]
|
||||
@ -316,25 +364,105 @@ drvShowCursor:
|
||||
ret
|
||||
|
||||
align 4
|
||||
drvCursorPos:
|
||||
push ebp
|
||||
mov ebp, esp
|
||||
proc drvCursorPos stdcall, hcursor:dword, x:dword, y:dword
|
||||
|
||||
mov eax, 80000000h
|
||||
wrr CUR_HORZ_VERT_OFF, eax
|
||||
|
||||
mov eax, [ebp+8]
|
||||
mov eax, [x]
|
||||
shl eax, 16
|
||||
or eax, [ebp+12]
|
||||
or eax, [y]
|
||||
or eax, 80000000h
|
||||
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
|
||||
leave
|
||||
ret 8
|
||||
ret
|
||||
endp
|
||||
|
||||
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
|
||||
rBase dd ?
|
||||
pQuad dd ?
|
||||
@ -345,12 +473,13 @@ proc ati_init_cursor stdcall, arrow:dword
|
||||
counter dd ?
|
||||
endl
|
||||
|
||||
cld
|
||||
|
||||
mov esi, [arrow]
|
||||
add esi,[esi+18d]
|
||||
|
||||
mov esi, [src]
|
||||
add esi,[esi+18]
|
||||
mov eax,esi
|
||||
|
||||
cmp [esi+BI.biBitCount], 24
|
||||
je .img_24
|
||||
.img_4:
|
||||
add eax, [esi]
|
||||
mov [pQuad],eax
|
||||
add eax,64
|
||||
@ -415,30 +544,68 @@ proc ati_init_cursor stdcall, arrow:dword
|
||||
mov [rBase],edi
|
||||
sub [height],1
|
||||
jnz .l1
|
||||
jmp .copy
|
||||
|
||||
mov edi, LFBAddress
|
||||
add edi, CURSOR_IMAGE_OFFSET
|
||||
.img_24:
|
||||
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
|
||||
xor eax,eax
|
||||
rep stosd
|
||||
|
||||
mov esi, pCursor
|
||||
mov edi, LFBAddress
|
||||
add edi, CURSOR_IMAGE_OFFSET
|
||||
mov edi, [dst]
|
||||
mov ebx, 32
|
||||
lc:
|
||||
cld
|
||||
@@:
|
||||
mov ecx, 32
|
||||
lb:
|
||||
mov eax, [esi]
|
||||
mov [edi], eax
|
||||
add esi, 4
|
||||
add edi, 4
|
||||
sub ecx, 1
|
||||
jnz lb
|
||||
|
||||
rep movsd
|
||||
add edi, 128
|
||||
sub ebx, 1
|
||||
jnz lc
|
||||
dec ebx
|
||||
jnz @B
|
||||
|
||||
ret
|
||||
endp
|
||||
@ -489,21 +656,21 @@ cnt equ bp+8
|
||||
align 4
|
||||
proc engWaitForIdle
|
||||
|
||||
push dword 64
|
||||
call engWaitForFifo
|
||||
push dword 64
|
||||
call engWaitForFifo
|
||||
|
||||
mov edi, [ati_io]
|
||||
mov ecx ,RD_TIMEOUT
|
||||
mov edi, [ati_io]
|
||||
mov ecx ,RD_TIMEOUT
|
||||
@@:
|
||||
mov eax, [edi+RD_RBBM_STATUS]
|
||||
and eax,RD_RBBM_ACTIVE
|
||||
jz .exit
|
||||
mov eax, [edi+RD_RBBM_STATUS]
|
||||
and eax,RD_RBBM_ACTIVE
|
||||
jz .exit
|
||||
|
||||
sub ecx,1
|
||||
jnz @B
|
||||
sub ecx,1
|
||||
jnz @B
|
||||
.exit:
|
||||
call engFlush
|
||||
ret
|
||||
call engFlush
|
||||
ret
|
||||
endp
|
||||
|
||||
align 4
|
||||
@ -514,8 +681,8 @@ proc engRestore
|
||||
|
||||
; mov dword [MMIO+RD_RB2D_DSTCACHE_MODE], 0
|
||||
|
||||
push dword 3
|
||||
call engWaitForFifo
|
||||
push dword 3
|
||||
call engWaitForFifo
|
||||
|
||||
mov edi, [ati_io]
|
||||
|
||||
@ -572,7 +739,6 @@ proc engRestore
|
||||
ret
|
||||
endp
|
||||
|
||||
|
||||
align 4
|
||||
engSetupSolidFill:
|
||||
push ebp
|
||||
@ -603,28 +769,28 @@ w equ ebp+16
|
||||
h equ ebp+20
|
||||
color equ ebp+24
|
||||
|
||||
push dword [ebp+24]
|
||||
call engSetupSolidFill
|
||||
push dword [ebp+24]
|
||||
call engSetupSolidFill
|
||||
|
||||
push dword 2
|
||||
call engWaitForFifo
|
||||
push dword 2
|
||||
call engWaitForFifo
|
||||
|
||||
mov edi, [ati_io]
|
||||
mov edi, [ati_io]
|
||||
|
||||
mov eax, [y]
|
||||
mov ebx, [x]
|
||||
shl eax,16
|
||||
or eax, ebx
|
||||
mov eax, [y]
|
||||
mov ebx, [x]
|
||||
shl eax,16
|
||||
or eax, ebx
|
||||
|
||||
mov ecx, [w]
|
||||
mov edx, [h]
|
||||
shl ecx,16
|
||||
or ecx, edx
|
||||
mov [edi+RD_DST_Y_X], eax
|
||||
mov [edi+RD_DST_WIDTH_HEIGHT], ecx
|
||||
call engFlush
|
||||
leave
|
||||
ret 20
|
||||
mov ecx, [w]
|
||||
mov edx, [h]
|
||||
shl ecx,16
|
||||
or ecx, edx
|
||||
mov [edi+RD_DST_Y_X], eax
|
||||
mov [edi+RD_DST_WIDTH_HEIGHT], ecx
|
||||
call engFlush
|
||||
leave
|
||||
ret 20
|
||||
|
||||
align 4
|
||||
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 0 ;terminator
|
||||
|
||||
;szKernel db 'KERNEL', 0
|
||||
sz_ati_srv db 'ATI2D',0
|
||||
user_file db '/rd/1/user.cur',0
|
||||
version dd 0x00010001
|
||||
|
||||
sz_ati_srv db 'HWCURSOR',0
|
||||
|
||||
msgInit db 'detect hardware...',13,10,0
|
||||
msgPCI db 'PCI accsess not supported',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
|
||||
|
||||
pCursor db 4096 dup(?)
|
||||
|
||||
bus dd ?
|
||||
devfn dd ?
|
||||
ati_io dd ?
|
||||
cursors rb CURSOR_SIZE*64
|
||||
cursor_map rd 2
|
||||
cursor_start rd 1
|
||||
cursor_end rd 1
|
||||
|
||||
bus dd ?
|
||||
devfn dd ?
|
||||
ati_io dd ?
|
||||
|
||||
|
||||
|
||||
|
@ -28,6 +28,7 @@ PROC_BASE equ OS_BASE+0x0080000
|
||||
|
||||
public START
|
||||
public service_proc
|
||||
public version
|
||||
|
||||
extrn AttachIntHandler
|
||||
extrn SysMsgBoardStr
|
||||
@ -46,6 +47,7 @@ extrn GetService
|
||||
extrn ServiceHandler
|
||||
extrn FpuSave
|
||||
extrn FpuRestore
|
||||
extrn SendEvent
|
||||
|
||||
SND_CREATE_BUFF equ 2
|
||||
SND_PLAY equ 3
|
||||
@ -74,11 +76,9 @@ section '.flat' code readable align 16
|
||||
|
||||
proc START stdcall, state:dword
|
||||
|
||||
mov eax, [state]
|
||||
cmp eax, 1
|
||||
je .entry
|
||||
jmp .exit
|
||||
.entry:
|
||||
cmp [state], 1
|
||||
jne .exit
|
||||
|
||||
stdcall GetService, szSound
|
||||
test eax, eax
|
||||
jz .fail
|
||||
@ -102,22 +102,22 @@ proc START stdcall, state:dword
|
||||
|
||||
stdcall set_handler, [hSound], new_mix
|
||||
stdcall RegService, szInfinity, service_proc
|
||||
ret
|
||||
ret
|
||||
.fail:
|
||||
if DEBUG
|
||||
mov esi, msgFail
|
||||
mov esi, msgFail
|
||||
call SysMsgBoardStr
|
||||
end if
|
||||
.exit:
|
||||
xor eax, eax
|
||||
ret
|
||||
xor eax, eax
|
||||
ret
|
||||
|
||||
.out_of_mem:
|
||||
if DEBUG
|
||||
mov esi, msgMem
|
||||
call SysMsgBoardStr
|
||||
end if
|
||||
xor eax, eax
|
||||
xor eax, eax
|
||||
ret
|
||||
endp
|
||||
|
||||
@ -134,21 +134,21 @@ proc service_proc stdcall, ioctl:dword
|
||||
mov edi, [ioctl]
|
||||
mov eax, [edi+io_code]
|
||||
|
||||
cmp eax, SND_CREATE_BUFF
|
||||
jne @F
|
||||
cmp eax, SND_CREATE_BUFF
|
||||
jne @F
|
||||
mov ebx, [edi+input]
|
||||
stdcall CreateBuffer,[ebx]
|
||||
ret
|
||||
ret
|
||||
@@:
|
||||
cmp eax, SND_PLAY
|
||||
jne @F
|
||||
cmp eax, SND_PLAY
|
||||
jne @F
|
||||
|
||||
mov ebx, [edi+input]
|
||||
stdcall play_buffer, [ebx]
|
||||
ret
|
||||
stdcall play_buffer, [ebx]
|
||||
ret
|
||||
@@:
|
||||
cmp eax, SND_STOP
|
||||
jne @F
|
||||
cmp eax, SND_STOP
|
||||
jne @F
|
||||
|
||||
; if DEBUG
|
||||
; mov esi, msgStop
|
||||
@ -156,27 +156,27 @@ proc service_proc stdcall, ioctl:dword
|
||||
; end if
|
||||
|
||||
mov ebx, [edi+input]
|
||||
stdcall stop_buffer, [ebx]
|
||||
ret
|
||||
stdcall stop_buffer, [ebx]
|
||||
ret
|
||||
@@:
|
||||
cmp eax, SND_SETBUFF
|
||||
jne @F
|
||||
cmp eax, SND_SETBUFF
|
||||
jne @F
|
||||
|
||||
mov ebx, [edi+input]
|
||||
mov eax, [ebx+4]
|
||||
add eax, new_app_base
|
||||
stdcall set_buffer, [ebx],eax,[ebx+8],[ebx+12]
|
||||
ret
|
||||
mov eax, [ebx+4]
|
||||
add eax, new_app_base
|
||||
stdcall set_buffer, [ebx],eax,[ebx+8],[ebx+12]
|
||||
ret
|
||||
@@:
|
||||
cmp eax, SND_DESTROY_BUFF
|
||||
jne @F
|
||||
jne @F
|
||||
|
||||
mov ebx, [edi+input]
|
||||
stdcall DestroyBuffer, [ebx]
|
||||
ret
|
||||
ret
|
||||
@@:
|
||||
xor eax, eax
|
||||
ret
|
||||
xor eax, eax
|
||||
ret
|
||||
endp
|
||||
|
||||
restore handle
|
||||
@ -191,54 +191,54 @@ CURRENT_TASK equ 0x0003000
|
||||
|
||||
align 8
|
||||
proc CreateBuffer stdcall, format:dword
|
||||
locals
|
||||
str dd ?
|
||||
endl
|
||||
locals
|
||||
str dd ?
|
||||
endl
|
||||
|
||||
call alloc_stream
|
||||
and eax, eax
|
||||
jz .fail
|
||||
mov [str], eax
|
||||
call alloc_stream
|
||||
and eax, eax
|
||||
jz .fail
|
||||
mov [str], eax
|
||||
mov edi, eax
|
||||
|
||||
mov edx, [stream_count]
|
||||
mov [stream_list+edx*4], eax
|
||||
inc [stream_count]
|
||||
mov edx, [stream_count]
|
||||
mov [stream_list+edx*4], eax
|
||||
inc [stream_count]
|
||||
|
||||
mov [edi+STREAM.magic], 'WAVE'
|
||||
mov [edi+STREAM.size], STREAM_SIZE
|
||||
mov [edi+STREAM.magic], 'WAVE'
|
||||
mov [edi+STREAM.size], STREAM_SIZE
|
||||
|
||||
stdcall KernelAlloc, 180*1024
|
||||
|
||||
mov edi, [str]
|
||||
mov [edi+STREAM.base], eax
|
||||
mov [edi+STREAM.curr_seg], eax
|
||||
mov [edi+STREAM.notify_off1], eax
|
||||
add eax, 0x8000
|
||||
mov [edi+STREAM.notify_off2], eax
|
||||
add eax, 0x7FFF
|
||||
mov [edi+STREAM.limit], eax
|
||||
mov edi, [str]
|
||||
mov [edi+STREAM.base], eax
|
||||
mov [edi+STREAM.curr_seg], eax
|
||||
mov [edi+STREAM.notify_off1], eax
|
||||
add eax, 0x8000
|
||||
mov [edi+STREAM.notify_off2], eax
|
||||
add eax, 0x7FFF
|
||||
mov [edi+STREAM.limit], eax
|
||||
|
||||
inc eax
|
||||
inc eax
|
||||
|
||||
mov [edi+STREAM.work_buff], eax
|
||||
mov [edi+STREAM.work_read], eax
|
||||
mov [edi+STREAM.work_write], eax
|
||||
mov [edi+STREAM.work_count], 0
|
||||
add eax, 0x10000
|
||||
mov [edi+STREAM.work_top], eax
|
||||
add eax, 1024*32
|
||||
mov [edi+STREAM.r_buff], eax
|
||||
mov [edi+STREAM.work_buff], eax
|
||||
mov [edi+STREAM.work_read], eax
|
||||
mov [edi+STREAM.work_write], eax
|
||||
mov [edi+STREAM.work_count], 0
|
||||
add eax, 0x10000
|
||||
mov [edi+STREAM.work_top], eax
|
||||
add eax, 1024*32
|
||||
mov [edi+STREAM.r_buff], eax
|
||||
|
||||
mov ebx, [CURRENT_TASK]
|
||||
mov ebx, [CURRENT_TASK]
|
||||
shl ebx, 5
|
||||
mov eax, [0x3000+ebx+4]
|
||||
|
||||
mov [edi+STREAM.notify_task], eax
|
||||
mov [edi+STREAM.notify_task], eax
|
||||
|
||||
mov eax, [format]
|
||||
mov [edi+STREAM.format], eax
|
||||
mov [edi+STREAM.flags], SND_STOP
|
||||
mov eax, [format]
|
||||
mov [edi+STREAM.format], eax
|
||||
mov [edi+STREAM.flags], SND_STOP
|
||||
|
||||
xor ebx, ebx
|
||||
cmp eax, 19
|
||||
@ -247,7 +247,7 @@ proc CreateBuffer stdcall, format:dword
|
||||
@@:
|
||||
mov [edi+STREAM.r_silence], ebx
|
||||
|
||||
shl eax, 4
|
||||
shl eax, 4
|
||||
mov ebx, [resampler_params+eax]
|
||||
mov ecx, [resampler_params+eax+4]
|
||||
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_dt], edx
|
||||
|
||||
mov ebx, [resampler_params+eax+12]
|
||||
mov [edi+STREAM.resample], ebx
|
||||
mov ebx, [resampler_params+eax+12]
|
||||
mov [edi+STREAM.resample], ebx
|
||||
|
||||
mov edi, [edi+STREAM.base]
|
||||
mov ecx, 180*1024/4
|
||||
xor eax, eax
|
||||
rep stosd
|
||||
mov edi, [edi+STREAM.base]
|
||||
mov ecx, 180*1024/4
|
||||
xor eax, eax
|
||||
rep stosd
|
||||
|
||||
mov eax, [str]
|
||||
ret
|
||||
mov eax, [str]
|
||||
ret
|
||||
|
||||
.fail:
|
||||
xor eax, eax
|
||||
ret
|
||||
xor eax, eax
|
||||
ret
|
||||
endp
|
||||
|
||||
align 4
|
||||
pid_to_slot:
|
||||
|
||||
push ebx
|
||||
push ecx
|
||||
mov ebx,[TASK_COUNT]
|
||||
shl ebx,5
|
||||
mov ecx,2*32
|
||||
push ebx
|
||||
push ecx
|
||||
mov ebx,[TASK_COUNT]
|
||||
shl ebx,5
|
||||
mov ecx,2*32
|
||||
.loop:
|
||||
cmp byte [CURRENT_TASK+ecx+0xa],9
|
||||
jz .endloop ;skip empty slots
|
||||
cmp [CURRENT_TASK+ecx+0x4],eax ;check PID
|
||||
jz .pid_found
|
||||
cmp byte [CURRENT_TASK+ecx+0xa],9
|
||||
jz .endloop ;skip empty slots
|
||||
cmp [CURRENT_TASK+ecx+0x4],eax ;check PID
|
||||
jz .pid_found
|
||||
.endloop:
|
||||
add ecx,32
|
||||
cmp ecx,ebx
|
||||
jle .loop
|
||||
pop ecx
|
||||
pop ebx
|
||||
xor eax,eax
|
||||
ret
|
||||
add ecx,32
|
||||
cmp ecx,ebx
|
||||
jle .loop
|
||||
pop ecx
|
||||
pop ebx
|
||||
xor eax,eax
|
||||
ret
|
||||
|
||||
.pid_found:
|
||||
shr ecx,5
|
||||
mov eax,ecx
|
||||
pop ecx
|
||||
pop ebx
|
||||
ret
|
||||
shr ecx,5
|
||||
mov eax,ecx
|
||||
pop ecx
|
||||
pop ebx
|
||||
ret
|
||||
|
||||
align 4
|
||||
proc DestroyBuffer stdcall, str:dword
|
||||
@ -307,15 +307,15 @@ proc DestroyBuffer stdcall, str:dword
|
||||
mov esi, [str]
|
||||
|
||||
cmp [esi+STREAM.magic], 'WAVE'
|
||||
jne .fail
|
||||
jne .fail
|
||||
|
||||
cmp [esi+STREAM.size], STREAM_SIZE
|
||||
jne .fail
|
||||
jne .fail
|
||||
|
||||
stdcall KernelFree, [esi+STREAM.base]
|
||||
|
||||
mov eax, [str]
|
||||
call free_stream
|
||||
call free_stream
|
||||
|
||||
mov edi, [str]
|
||||
mov ecx, STREAM_SIZE/4
|
||||
@ -333,8 +333,8 @@ proc DestroyBuffer stdcall, str:dword
|
||||
dec ecx
|
||||
jnz @B
|
||||
xor eax, eax
|
||||
inc eax
|
||||
ret
|
||||
inc eax
|
||||
ret
|
||||
.remove:
|
||||
mov edi, esi
|
||||
add esi, 4
|
||||
@ -342,208 +342,203 @@ proc DestroyBuffer stdcall, str:dword
|
||||
rep movsd
|
||||
dec [stream_count]
|
||||
xor eax, eax
|
||||
inc eax
|
||||
ret
|
||||
inc eax
|
||||
ret
|
||||
.fail:
|
||||
xor eax, eax
|
||||
ret
|
||||
xor eax, eax
|
||||
ret
|
||||
endp
|
||||
|
||||
align 4
|
||||
proc play_buffer stdcall, str:dword
|
||||
|
||||
mov ebx, [str]
|
||||
mov ebx, [str]
|
||||
|
||||
cmp [ebx+STREAM.magic], 'WAVE'
|
||||
jne .fail
|
||||
cmp [ebx+STREAM.magic], 'WAVE'
|
||||
jne .fail
|
||||
|
||||
cmp [ebx+STREAM.size], STREAM_SIZE
|
||||
jne .fail
|
||||
cmp [ebx+STREAM.size], STREAM_SIZE
|
||||
jne .fail
|
||||
|
||||
mov [ebx+STREAM.flags], SND_PLAY
|
||||
mov [ebx+STREAM.flags], SND_PLAY
|
||||
|
||||
mov eax,[ebx+STREAM.work_buff]
|
||||
mov [ebx+STREAM.work_read], eax
|
||||
mov [ebx+STREAM.work_write], eax
|
||||
mov [ebx+STREAM.work_count], 0
|
||||
mov eax,[ebx+STREAM.work_buff]
|
||||
mov [ebx+STREAM.work_read], eax
|
||||
mov [ebx+STREAM.work_write], eax
|
||||
mov [ebx+STREAM.work_count], 0
|
||||
|
||||
mov eax, [ebx+STREAM.base]
|
||||
mov [ebx+STREAM.curr_seg], eax
|
||||
mov eax, [ebx+STREAM.base]
|
||||
mov [ebx+STREAM.curr_seg], eax
|
||||
|
||||
mov esi, [ebx+STREAM.curr_seg]
|
||||
mov edi, [ebx+STREAM.work_write]
|
||||
mov edx, [ebx+STREAM.r_buff]
|
||||
mov esi, [ebx+STREAM.curr_seg]
|
||||
mov edi, [ebx+STREAM.work_write]
|
||||
mov edx, [ebx+STREAM.r_buff]
|
||||
|
||||
mov ecx, 32
|
||||
mov ecx, 32
|
||||
mov eax, [ebx+STREAM.r_silence]
|
||||
@@:
|
||||
mov [edx], eax
|
||||
add edx, 4
|
||||
dec ecx
|
||||
jnz @B
|
||||
mov [edx], eax
|
||||
add edx, 4
|
||||
dec ecx
|
||||
jnz @B
|
||||
|
||||
mov edx, [ebx+STREAM.r_buff]
|
||||
mov edx, [ebx+STREAM.r_buff]
|
||||
|
||||
stdcall [ebx+STREAM.resample], edi, esi, edx,\
|
||||
[ebx+STREAM.r_dt],[ebx+STREAM.r_size],[ebx+STREAM.r_end]
|
||||
stdcall [ebx+STREAM.resample], edi, esi, edx,\
|
||||
[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_write], eax;
|
||||
add [ebx+STREAM.work_count], eax;
|
||||
add [ebx+STREAM.work_write], eax;
|
||||
|
||||
mov eax, [ebx+STREAM.r_size]
|
||||
add [ebx+STREAM.curr_seg], eax
|
||||
mov eax, [ebx+STREAM.r_size]
|
||||
add [ebx+STREAM.curr_seg], eax
|
||||
|
||||
; if DEBUG
|
||||
; mov esi, msgPlay
|
||||
; call [SysMsgBoardStr]
|
||||
; end if
|
||||
|
||||
stdcall dev_play, [hSound]
|
||||
|
||||
xor eax, eax
|
||||
inc eax
|
||||
ret
|
||||
|
||||
stdcall dev_play, [hSound]
|
||||
xor eax, eax
|
||||
inc eax
|
||||
ret
|
||||
.fail:
|
||||
xor eax, eax
|
||||
ret
|
||||
|
||||
xor eax, eax
|
||||
ret
|
||||
endp
|
||||
|
||||
align 4
|
||||
proc stop_buffer stdcall, str:dword
|
||||
|
||||
mov edi, [str]
|
||||
mov edi, [str]
|
||||
|
||||
cmp [edi+STREAM.magic], 'WAVE'
|
||||
jne .fail
|
||||
cmp [edi+STREAM.magic], 'WAVE'
|
||||
jne .fail
|
||||
|
||||
cmp [edi+STREAM.size], STREAM_SIZE
|
||||
jne .fail
|
||||
cmp [edi+STREAM.size], STREAM_SIZE
|
||||
jne .fail
|
||||
|
||||
mov [edi+STREAM.flags], SND_STOP
|
||||
mov [edi+STREAM.flags], SND_STOP
|
||||
|
||||
; stdcall [ServiceHandler], [hSound], dword DEV_STOP, 0
|
||||
|
||||
xor eax, eax
|
||||
inc eax
|
||||
ret
|
||||
|
||||
xor eax, eax
|
||||
inc eax
|
||||
ret
|
||||
.fail:
|
||||
xor eax, eax
|
||||
ret
|
||||
|
||||
xor eax, eax
|
||||
ret
|
||||
endp
|
||||
|
||||
align 4
|
||||
proc set_buffer stdcall, str:dword,src:dword,offs:dword,size:dword
|
||||
|
||||
mov edx, [str]
|
||||
test edx, edx
|
||||
jz .fail
|
||||
mov edx, [str]
|
||||
test edx, edx
|
||||
jz .fail
|
||||
|
||||
cmp [edx+STREAM.magic], 'WAVE'
|
||||
jne .fail
|
||||
cmp [edx+STREAM.magic], 'WAVE'
|
||||
jne .fail
|
||||
|
||||
cmp [edx+STREAM.size], STREAM_SIZE
|
||||
jne .fail
|
||||
cmp [edx+STREAM.size], STREAM_SIZE
|
||||
jne .fail
|
||||
|
||||
mov esi,[src]
|
||||
test esi, esi
|
||||
jz .fail
|
||||
mov esi,[src]
|
||||
test esi, esi
|
||||
jz .fail
|
||||
|
||||
cmp esi, new_app_base
|
||||
jb .fail
|
||||
|
||||
mov ecx, [size]
|
||||
test ecx, ecx
|
||||
jz .fail
|
||||
mov ecx, [size]
|
||||
test ecx, ecx
|
||||
jz .fail
|
||||
|
||||
mov eax, [edx+STREAM.base]
|
||||
add eax, [offs]
|
||||
mov eax, [edx+STREAM.base]
|
||||
add eax, [offs]
|
||||
|
||||
cmp eax, [edx+STREAM.base]
|
||||
jb .fail
|
||||
|
||||
mov edi, eax
|
||||
add eax, ecx
|
||||
sub eax, 1
|
||||
mov edi, eax
|
||||
add eax, ecx
|
||||
sub eax, 1
|
||||
|
||||
cmp eax, [edx+STREAM.limit]
|
||||
cmp eax, [edx+STREAM.limit]
|
||||
ja .fail
|
||||
|
||||
shr ecx, 2
|
||||
shr ecx, 2
|
||||
cld
|
||||
rep movsd
|
||||
rep movsd
|
||||
|
||||
xor eax, eax
|
||||
inc eax
|
||||
ret
|
||||
xor eax, eax
|
||||
inc eax
|
||||
ret
|
||||
.fail:
|
||||
xor eax, eax
|
||||
ret
|
||||
xor eax, eax
|
||||
ret
|
||||
endp
|
||||
|
||||
align 4
|
||||
proc alloc_stream
|
||||
|
||||
mov esi, stream_map
|
||||
mov esi, stream_map
|
||||
|
||||
pushf
|
||||
cli
|
||||
pushf
|
||||
cli
|
||||
|
||||
bsf eax, [esi]
|
||||
jnz .find
|
||||
popf
|
||||
xor eax, eax
|
||||
ret
|
||||
|
||||
.find: btr [esi], eax
|
||||
popf
|
||||
mov ebx, STREAM_SIZE
|
||||
mul ebx
|
||||
add eax, stream
|
||||
ret
|
||||
bsf eax, [esi]
|
||||
jnz .find
|
||||
popf
|
||||
xor eax, eax
|
||||
ret
|
||||
.find:
|
||||
btr [esi], eax
|
||||
popf
|
||||
mov ebx, STREAM_SIZE
|
||||
mul ebx
|
||||
add eax, stream
|
||||
ret
|
||||
endp
|
||||
|
||||
align 4
|
||||
proc free_stream
|
||||
sub eax, stream
|
||||
sub eax, stream
|
||||
mov ebx, STREAM_SIZE
|
||||
xor edx, edx
|
||||
div ebx
|
||||
xor edx, edx
|
||||
div ebx
|
||||
|
||||
and edx, edx
|
||||
and edx, edx
|
||||
jnz .err
|
||||
|
||||
bts [stream_map], eax
|
||||
|
||||
ret
|
||||
bts [stream_map], eax
|
||||
ret
|
||||
.err:
|
||||
xor eax, eax
|
||||
ret
|
||||
ret
|
||||
endp
|
||||
|
||||
align 4
|
||||
proc check_stream
|
||||
|
||||
xor edx, edx
|
||||
mov ecx, [play_count]
|
||||
xor edx, edx
|
||||
mov ecx, [play_count]
|
||||
.l1:
|
||||
mov esi, [play_list+edx]
|
||||
mov esi, [play_list+edx]
|
||||
|
||||
mov eax, [esi+STR.curr_seg]
|
||||
cmp eax, [esi+STR.limit]
|
||||
jb .next
|
||||
mov eax, [esi+STR.curr_seg]
|
||||
cmp eax, [esi+STR.limit]
|
||||
jb .next
|
||||
|
||||
.m1: mov eax,[esi+STR.base]
|
||||
mov [esi+STR.curr_seg], eax
|
||||
.m1:
|
||||
mov eax,[esi+STR.base]
|
||||
mov [esi+STR.curr_seg], eax
|
||||
.next:
|
||||
add edx, 4
|
||||
loop .l1
|
||||
ret
|
||||
add edx, 4
|
||||
loop .l1
|
||||
ret
|
||||
endp
|
||||
|
||||
|
||||
@ -552,9 +547,9 @@ proc prepare_playlist
|
||||
|
||||
.restart:
|
||||
xor ebx, ebx
|
||||
xor edx, edx
|
||||
mov [play_count], 0
|
||||
mov ecx, [stream_count]
|
||||
xor edx, edx
|
||||
mov [play_count], 0
|
||||
mov ecx, [stream_count]
|
||||
jcxz .exit
|
||||
.l1:
|
||||
mov esi, [stream_list+ebx]
|
||||
@ -576,18 +571,18 @@ proc prepare_playlist
|
||||
jz .fail
|
||||
|
||||
cmp [esi+STREAM.flags], SND_PLAY;
|
||||
jne .next
|
||||
jne .next
|
||||
cmp [esi+STREAM.work_count], 16384
|
||||
jb .next
|
||||
|
||||
mov [play_list+edx], esi
|
||||
inc [play_count]
|
||||
add edx, 4
|
||||
inc [play_count]
|
||||
add edx, 4
|
||||
.next:
|
||||
add ebx, 4
|
||||
loop .l1
|
||||
add ebx, 4
|
||||
loop .l1
|
||||
.exit:
|
||||
ret
|
||||
ret
|
||||
.fail:
|
||||
stdcall DestroyBuffer, esi
|
||||
jmp .restart
|
||||
@ -596,26 +591,26 @@ endp
|
||||
align 4
|
||||
proc prepare_updatelist
|
||||
|
||||
xor ebx, ebx
|
||||
xor edx, edx
|
||||
mov [play_count], 0
|
||||
mov ecx, [stream_count]
|
||||
xor ebx, ebx
|
||||
xor edx, edx
|
||||
mov [play_count], 0
|
||||
mov ecx, [stream_count]
|
||||
jcxz .exit
|
||||
.l1:
|
||||
mov eax, [stream_list+ebx]
|
||||
mov eax, [stream_list+ebx]
|
||||
test eax, eax
|
||||
jz .next
|
||||
cmp [eax+STREAM.flags], SND_PLAY
|
||||
jne .next
|
||||
cmp [eax+STREAM.flags], SND_PLAY
|
||||
jne .next
|
||||
|
||||
mov [play_list+edx], eax
|
||||
inc [play_count]
|
||||
add edx, 4
|
||||
mov [play_list+edx], eax
|
||||
inc [play_count]
|
||||
add edx, 4
|
||||
.next:
|
||||
add ebx, 4
|
||||
loop .l1
|
||||
add ebx, 4
|
||||
loop .l1
|
||||
.exit:
|
||||
ret
|
||||
ret
|
||||
endp
|
||||
|
||||
align 4
|
||||
@ -738,6 +733,7 @@ mm80 dq 0x8080808080808080
|
||||
mm_mask dq 0xFF00FF00FF00FF00
|
||||
|
||||
stream_map dd 0xFFFF ; 16
|
||||
version dd 0x00010001
|
||||
|
||||
szInfinity db 'INFINITY',0
|
||||
szSound db 'SOUND',0
|
||||
|
@ -111,6 +111,9 @@ align 4
|
||||
proc update_stream
|
||||
locals
|
||||
stream_index dd ?
|
||||
ev_code dd ? ;EVENT
|
||||
ev_offs dd ?
|
||||
rd 4
|
||||
endl
|
||||
|
||||
mov [stream_index], 0
|
||||
@ -176,17 +179,19 @@ proc update_stream
|
||||
|
||||
ret
|
||||
@@:
|
||||
mov [ev_code], 0xFF000001
|
||||
mov [ev_offs], ecx
|
||||
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
|
||||
jnz @f
|
||||
jnz .l_end
|
||||
|
||||
not eax
|
||||
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:
|
||||
inc [stream_index]
|
||||
dec [play_count]
|
||||
@ -196,14 +201,13 @@ endp
|
||||
|
||||
align 4
|
||||
proc refill stdcall, str:dword
|
||||
|
||||
; if DEBUG
|
||||
; mov esi, msgUser
|
||||
; call [SysMsgBoardStr]
|
||||
; end if
|
||||
locals
|
||||
ev_code dd ? ;EVENT
|
||||
ev_offs dd ?
|
||||
rd 4
|
||||
endl
|
||||
|
||||
mov ebx, [str]
|
||||
|
||||
mov ecx, [ebx+STREAM.work_write]
|
||||
cmp ecx, [ebx+STREAM.work_top]
|
||||
jbe .m2
|
||||
@ -245,17 +249,19 @@ proc refill stdcall, str:dword
|
||||
|
||||
ret
|
||||
@@:
|
||||
mov [ev_code], 0xFF000001
|
||||
mov [ev_offs], ecx
|
||||
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
|
||||
jnz @f
|
||||
jnz @F
|
||||
not eax
|
||||
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
|
||||
endp
|
||||
|
||||
|
@ -25,6 +25,7 @@ end virtual
|
||||
|
||||
public START
|
||||
public service_proc
|
||||
public version
|
||||
|
||||
extrn AttachIntHandler
|
||||
extrn SysMsgBoardStr
|
||||
@ -54,11 +55,10 @@ section '.flat' code readable align 16
|
||||
|
||||
proc START stdcall, state:dword
|
||||
|
||||
mov eax, [state]
|
||||
cmp eax, 1
|
||||
je .entry
|
||||
jmp .exit
|
||||
cmp [state], 1
|
||||
jne .exit
|
||||
.entry:
|
||||
|
||||
if DEBUG
|
||||
mov esi, msgInit
|
||||
call SysMsgBoardStr
|
||||
@ -161,6 +161,8 @@ align 4
|
||||
devices dd (DEVICE_ID shl 16)+VENDOR_ID
|
||||
dd 0 ;terminator
|
||||
|
||||
version dd 0x00010001
|
||||
|
||||
my_service db 'MY_SERVICE',0 ;max 16 chars include zero
|
||||
|
||||
msgInit db 'detect hardware...',13,10,0
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -275,6 +275,7 @@ PROC_BASE equ OS_BASE+0x0080000
|
||||
|
||||
public START
|
||||
public service_proc
|
||||
public version
|
||||
|
||||
extrn AttachIntHandler
|
||||
extrn SysMsgBoardStr
|
||||
@ -293,10 +294,8 @@ section '.flat' code readable align 16
|
||||
|
||||
proc START stdcall, state:dword
|
||||
|
||||
mov eax, [state]
|
||||
cmp eax, 1
|
||||
cmp [state], 1
|
||||
jne .stop
|
||||
.entry:
|
||||
|
||||
if DEBUG
|
||||
mov esi, msgInit
|
||||
@ -376,6 +375,7 @@ proc START stdcall, state:dword
|
||||
ret
|
||||
.stop:
|
||||
call stop
|
||||
xor eax, eax
|
||||
ret
|
||||
endp
|
||||
|
||||
@ -1010,13 +1010,8 @@ endp
|
||||
|
||||
align 4
|
||||
proc stop
|
||||
mov edx, PCM_OUT_CR_REG
|
||||
mov ax, 0x14
|
||||
call [ctrl.ctrl_write8]
|
||||
|
||||
mov eax, 16
|
||||
mov [ctrl.lvi_reg], eax
|
||||
mov edx, PCM_OUT_LVI_REG
|
||||
mov edx, PCM_OUT_CR_REG
|
||||
mov ax, 0x0
|
||||
call [ctrl.ctrl_write8]
|
||||
|
||||
mov ax, 0x1c
|
||||
@ -1336,6 +1331,8 @@ devices dd (CTRL_ICH shl 16)+VID_INTEL,msg_ICH, set_ICH
|
||||
|
||||
dd 0 ;terminator
|
||||
|
||||
version dd 0x00010001
|
||||
|
||||
msg_ICH db 'Intel ICH', 13,10, 0
|
||||
msg_ICH0 db 'Intel ICH0', 13,10, 0
|
||||
msg_ICH2 db 'Intel ICH2', 13,10, 0
|
||||
|
@ -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:
|
||||
|
||||
call get_event_for_app
|
||||
@ -6,23 +172,22 @@ sys_getevent:
|
||||
|
||||
|
||||
align 4
|
||||
|
||||
sys_wait_event_timeout:
|
||||
|
||||
mov ebx,[timer_ticks]
|
||||
add ebx,eax
|
||||
cmp ebx,[timer_ticks]
|
||||
jna .swfet2
|
||||
.swfet1:
|
||||
.swfet1:
|
||||
call get_event_for_app
|
||||
test eax,eax
|
||||
jne .eventoccur_time
|
||||
call change_task
|
||||
cmp ebx,[timer_ticks]
|
||||
jg .swfet1
|
||||
.swfet2:
|
||||
.swfet2:
|
||||
xor eax,eax
|
||||
.eventoccur_time:
|
||||
.eventoccur_time:
|
||||
mov [esp+36],eax
|
||||
ret
|
||||
|
||||
@ -46,7 +211,6 @@ sys_waitforevent:
|
||||
mov [esp+36],eax
|
||||
ret
|
||||
|
||||
|
||||
get_event_for_app:
|
||||
|
||||
pushad
|
||||
@ -164,16 +328,26 @@ get_event_for_app:
|
||||
no_stack_event:
|
||||
|
||||
test byte [edi+TASKDATA.event_mask+1], 1 ; DEBUG
|
||||
jz no_debug_event
|
||||
jz .test_ext
|
||||
mov eax, [0x3000]
|
||||
shl eax, 8
|
||||
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
|
||||
popad
|
||||
mov eax, 9
|
||||
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
|
||||
jbe no_events
|
||||
@ -213,3 +387,4 @@ get_event_for_app:
|
||||
ret
|
||||
|
||||
|
||||
|
||||
|
@ -440,6 +440,8 @@ include 'detect/disks.inc'
|
||||
stdcall kernel_alloc, 0x1000
|
||||
mov [tmp_task_data], eax
|
||||
|
||||
call init_events
|
||||
|
||||
mov [dll_map], 0xFFFFFFFF
|
||||
mov [srv_map], 0xFFFFFFFF
|
||||
|
||||
@ -550,11 +552,9 @@ include 'vmodeld.inc'
|
||||
call boot_log
|
||||
call setmouse
|
||||
|
||||
mov [pci_access_enabled],1
|
||||
call init_cursors
|
||||
|
||||
; mov [pci_access_enabled],1
|
||||
; stdcall get_service, szCURSOR
|
||||
|
||||
; SET PRELIMINARY WINDOW STACK AND POSITIONS
|
||||
|
||||
mov esi,boot_windefs
|
||||
|
@ -173,20 +173,22 @@ struc APPDATA
|
||||
db 5 dup(?)
|
||||
|
||||
.fpu_state dd ? ;+16
|
||||
dd ? ;+20 unused
|
||||
.ev_count dd ? ;+20
|
||||
.fpu_handler dd ? ;+24
|
||||
.sse_handler dd ? ;+28
|
||||
.event dd ? ;+32
|
||||
.heap_base dd ? ;+36
|
||||
.heap_top dd ? ;+40
|
||||
.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_scale dd ?
|
||||
dd ?
|
||||
.mem_size dd ?
|
||||
.wnd_shape_scale dd ? ;+132
|
||||
dd ? ;+136
|
||||
.mem_size dd ? ;+140
|
||||
.saved_box BOX
|
||||
.ipc_start dd ?
|
||||
.ipc_size dd ?
|
||||
|
@ -151,7 +151,6 @@ proc vesa_init_cursor stdcall, dst:dword, src:dword
|
||||
sub [height],1
|
||||
jnz .row_24
|
||||
ret
|
||||
|
||||
endp
|
||||
|
||||
align 4
|
||||
@ -172,46 +171,21 @@ proc alloc_cursor
|
||||
ret
|
||||
.found:
|
||||
btr [ebx], eax
|
||||
popfd
|
||||
|
||||
mov [cursor_start],ebx
|
||||
sub ebx, cursor_map
|
||||
shl ebx, 3
|
||||
add eax,ebx
|
||||
shl eax,3
|
||||
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
|
||||
|
||||
mov [edi+CURSOR.magic], 'CURS'
|
||||
mov [edi+CURSOR.size], CURSOR_SIZE
|
||||
mov [edi+CURSOR.pid], ebx
|
||||
mov [edi+CURSOR.hot_x], 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:
|
||||
mov [eax+CURSOR.magic], 'CURS'
|
||||
mov [eax+CURSOR.size], CURSOR_SIZE
|
||||
mov [eax+CURSOR.pid], ebx
|
||||
mov [eax+CURSOR.hot_x], ebx
|
||||
mov [eax+CURSOR.hot_y], ebx
|
||||
ret
|
||||
endp
|
||||
|
||||
@ -224,80 +198,71 @@ proc set_cursor stdcall, hcursor:dword
|
||||
ret
|
||||
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
|
||||
proc load_cursor stdcall, src:dword, flags:dword
|
||||
locals
|
||||
handle dd ?
|
||||
endl
|
||||
|
||||
movzx eax, word [flags]
|
||||
cmp eax, LOAD_FROM_FILE
|
||||
jne .from_mem
|
||||
xor eax, eax
|
||||
mov [handle], eax
|
||||
cmp word [flags], LOAD_FROM_FILE
|
||||
jne @F
|
||||
|
||||
stdcall load_file, [src]
|
||||
test eax, eax
|
||||
jz .exit
|
||||
mov [src], eax
|
||||
|
||||
call create_cursor
|
||||
@@:
|
||||
call alloc_cursor
|
||||
test eax, eax
|
||||
jz .fail
|
||||
|
||||
stdcall [create_cursor], eax, [src], [flags]
|
||||
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:
|
||||
mov ebx, [src]
|
||||
stdcall kernel_free, ebx
|
||||
cmp word [flags], LOAD_FROM_FILE
|
||||
jne .exit
|
||||
stdcall kernel_free, [src]
|
||||
.exit:
|
||||
xor eax, eax
|
||||
mov eax, [handle]
|
||||
ret
|
||||
endp
|
||||
|
||||
@ -330,6 +295,16 @@ proc init_cursors
|
||||
add edx, 4
|
||||
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
|
||||
mov [def_cursor], eax
|
||||
|
||||
@ -446,7 +421,6 @@ proc cursor_24 stdcall, hcursor:dword, x:dword, y:dword
|
||||
|
||||
sub edi, ecx
|
||||
cmp edi, eax
|
||||
;cmovg edi, eax
|
||||
jng @F
|
||||
mov edi, eax
|
||||
@@:
|
||||
@ -454,7 +428,6 @@ proc cursor_24 stdcall, hcursor:dword, x:dword, y:dword
|
||||
|
||||
sub edx, [y]
|
||||
cmp edx, eax
|
||||
;cmovg edx, eax
|
||||
jng @F
|
||||
mov edx, eax
|
||||
@@:
|
||||
@ -559,7 +532,6 @@ proc cursor_32 stdcall, hcursor:dword, x:dword, y:dword
|
||||
|
||||
sub edi, ecx
|
||||
cmp edi, eax
|
||||
; cmovg edi, eax
|
||||
jng @F
|
||||
mov edi, eax
|
||||
@@:
|
||||
@ -567,7 +539,6 @@ proc cursor_32 stdcall, hcursor:dword, x:dword, y:dword
|
||||
|
||||
sub edx, [y]
|
||||
cmp edx, eax
|
||||
; cmovg edx, eax
|
||||
jng @F
|
||||
mov edx, eax
|
||||
@@:
|
||||
|
Loading…
Reference in New Issue
Block a user