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
|
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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
@ -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 ?
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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
@ -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
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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 ?
|
||||||
|
@ -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
|
||||||
@@:
|
@@:
|
||||||
|
Loading…
Reference in New Issue
Block a user