1)drivers version control

2)extended events format
3)ATI hardware cursor 

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -6,10 +6,47 @@ format MS COFF
include 'proc32.inc' include 'proc32.inc'
DEBUG equ 0 DEBUG equ 1
VID_ATI equ 0x1002 VID_ATI equ 0x1002
LOAD_FROM_FILE equ 0
LOAD_FROM_MEM equ 1
LOAD_INDIRECT equ 2
LOAD_SYSTEM equ 3
struc BITMAPINFOHEADER {
.biSize dd ? ; DWORD
.biWidth dd ? ; LONG
.biHeight dd ? ; LONG
.biPlanes dw ? ; WORD
.biBitCount dw ? ; WORD
.biCompression dd ? ; DWORD
.biSizeImage dd ? ; DWORD
.biXPelsPerMeter dd ? ; LONG
.biYPelsPerMeter dd ? ; LONG
.biClrUsed dd ? ; DWORD
.biClrImportant dd ? ; DWORD
}
virtual at 0
BI BITMAPINFOHEADER
end virtual
struc CURSOR
{ .magic dd ?
.size dd ?
.pid dd ?
.base dd ?
.hot_x dd ?
.hot_y dd ?
}
virtual at 0
CURSOR CURSOR
end virtual
CURSOR_SIZE equ 24
R8500 equ 0x514C ;R200 R8500 equ 0x514C ;R200
R9000 equ 0x4966 ;RV250 R9000 equ 0x4966 ;RV250
R9200 equ 0x5961 ;RV280 R9200 equ 0x5961 ;RV280
@ -117,6 +154,7 @@ macro wrr dest, src
public START public START
public service_proc public service_proc
public version
extrn SysMsgBoardStr extrn SysMsgBoardStr
extrn PciApi extrn PciApi
@ -125,6 +163,8 @@ extrn AllocKernelSpace
extrn MapPage extrn MapPage
extrn RegService extrn RegService
extrn SetHwCursor extrn SetHwCursor
extrn HwCursorRestore
extrn HwCursorCreate
extrn LFBAddress extrn LFBAddress
extrn LoadFile extrn LoadFile
@ -137,11 +177,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:
if DEBUG if DEBUG
mov esi, msgInit mov esi, msgInit
call SysMsgBoardStr call SysMsgBoardStr
@ -151,22 +189,30 @@ proc START stdcall, state:dword
test eax, eax test eax, eax
jz .fail jz .fail
stdcall LoadFile, user_file
test eax, eax
jz @F
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
mov dword [HwCursorCreate], ati_cursor
ret ret
.fail: .fail:
if DEBUG if DEBUG
@ -176,8 +222,8 @@ proc START stdcall, state:dword
.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
@ -240,7 +286,8 @@ proc detect_ati
add edi, 4 add edi, 4
jmp @B jmp @B
.next: inc [devfn] .next:
inc [devfn]
cmp [devfn], 256 cmp [devfn], 256
jb .next_dev jb .next_dev
mov eax, [bus] mov eax, [bus]
@ -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
@ -572,7 +739,6 @@ proc engRestore
ret ret
endp endp
align 4 align 4
engSetupSolidFill: engSetupSolidFill:
push ebp push ebp
@ -641,25 +807,24 @@ 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(?)
cursors rb CURSOR_SIZE*64
cursor_map rd 2
cursor_start rd 1
cursor_end rd 1
bus dd ? bus dd ?
devfn dd ? devfn dd ?
ati_io dd ? ati_io dd ?

View File

@ -28,6 +28,7 @@ PROC_BASE equ OS_BASE+0x0080000
public START public START
public service_proc public service_proc
public version
extrn AttachIntHandler extrn AttachIntHandler
extrn SysMsgBoardStr extrn SysMsgBoardStr
@ -46,6 +47,7 @@ extrn GetService
extrn ServiceHandler extrn ServiceHandler
extrn FpuSave extrn FpuSave
extrn FpuRestore extrn FpuRestore
extrn SendEvent
SND_CREATE_BUFF equ 2 SND_CREATE_BUFF equ 2
SND_PLAY equ 3 SND_PLAY equ 3
@ -74,11 +76,9 @@ section '.flat' code readable align 16
proc START stdcall, state:dword proc START stdcall, state:dword
mov eax, [state] cmp [state], 1
cmp eax, 1 jne .exit
je .entry
jmp .exit
.entry:
stdcall GetService, szSound stdcall GetService, szSound
test eax, eax test eax, eax
jz .fail jz .fail
@ -401,15 +401,12 @@ proc play_buffer stdcall, str:dword
; 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
@ -430,11 +427,9 @@ proc stop_buffer stdcall, str:dword
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
@ -499,8 +494,8 @@ proc alloc_stream
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
@ -519,7 +514,6 @@ proc free_stream
jnz .err jnz .err
bts [stream_map], eax bts [stream_map], eax
ret ret
.err: .err:
xor eax, eax xor eax, eax
@ -538,7 +532,8 @@ proc check_stream
cmp eax, [esi+STR.limit] cmp eax, [esi+STR.limit]
jb .next jb .next
.m1: mov eax,[esi+STR.base] .m1:
mov eax,[esi+STR.base]
mov [esi+STR.curr_seg], eax mov [esi+STR.curr_seg], eax
.next: .next:
add edx, 4 add edx, 4
@ -738,6 +733,7 @@ mm80 dq 0x8080808080808080
mm_mask dq 0xFF00FF00FF00FF00 mm_mask dq 0xFF00FF00FF00FF00
stream_map dd 0xFFFF ; 16 stream_map dd 0xFFFF ; 16
version dd 0x00010001
szInfinity db 'INFINITY',0 szInfinity db 'INFINITY',0
szSound db 'SOUND',0 szSound db 'SOUND',0

View File

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

View File

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

View File

@ -249,6 +249,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
@ -267,11 +268,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 .stop
je .entry
jmp .stop
.entry:
if DEBUG if DEBUG
mov esi, msgInit mov esi, msgInit
call SysMsgBoardStr call SysMsgBoardStr
@ -323,7 +322,6 @@ proc START stdcall, state:dword
mov esi, msgOk mov esi, msgOk
call SysMsgBoardStr call SysMsgBoardStr
ret ret
.fail: .fail:
if DEBUG if DEBUG
@ -334,10 +332,7 @@ proc START stdcall, state:dword
ret ret
.stop: .stop:
call stop call stop
mov ax, 0x1c xor eax, eax
mov edx, PCM_OUT_SR_REG
call [ctrl.ctrl_write16]
mov [ctrl.user_callback], 0
ret ret
endp endp
@ -483,25 +478,18 @@ proc create_primary_buff
@@: @@:
mov [edi], eax mov [edi], eax
mov [edi+4], ebx mov [edi+4], ebx
mov [edi+32], eax mov [edi+32], eax
mov [edi+4+32], ebx mov [edi+4+32], ebx
mov [edi+64], eax mov [edi+64], eax
mov [edi+4+64], ebx mov [edi+4+64], ebx
mov [edi+96], eax mov [edi+96], eax
mov [edi+4+96], ebx mov [edi+4+96], ebx
mov [edi+128], eax mov [edi+128], eax
mov [edi+4+128], ebx mov [edi+4+128], ebx
mov [edi+160], eax mov [edi+160], eax
mov [edi+4+160], ebx mov [edi+4+160], ebx
mov [edi+192], eax mov [edi+192], eax
mov [edi+4+192], ebx mov [edi+4+192], ebx
mov [edi+224], eax mov [edi+224], eax
mov [edi+4+224], ebx mov [edi+4+224], ebx
@ -574,7 +562,6 @@ proc detect_controller
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]
@ -586,7 +573,8 @@ proc detect_controller
add edi, 12 add edi, 12
jmp @B jmp @B
.next: inc [devfn] .next:
inc [devfn]
cmp [devfn], 256 cmp [devfn], 256
jb .next_dev jb .next_dev
mov eax, [bus] mov eax, [bus]
@ -615,7 +603,6 @@ proc detect_controller
mov esi, [edi+8] mov esi, [edi+8]
mov [ctrl.ctrl_setup], esi mov [ctrl.ctrl_setup], esi
ret ret
.err: .err:
xor eax, eax xor eax, eax
@ -697,8 +684,6 @@ proc reset_controller
mov edx, MC_IN_CR_REG mov edx, MC_IN_CR_REG
call [ctrl.ctrl_write8] call [ctrl.ctrl_write8]
ret ret
endp endp
@ -799,7 +784,6 @@ proc warm_reset
mov esi, msgWRFail mov esi, msgWRFail
call SysMsgBoardStr call SysMsgBoardStr
end if end if
stc stc
ret ret
.ok: .ok:
@ -887,13 +871,12 @@ 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] call [ctrl.ctrl_write8]
mov eax, 16 mov ax, 0x1c
mov [ctrl.lvi_reg], eax mov edx, PCM_OUT_SR_REG
mov edx, PCM_OUT_LVI_REG call [ctrl.ctrl_write16]
call [ctrl.ctrl_write8]
ret ret
endp endp
@ -1131,6 +1114,8 @@ align 4
devices dd (CTRL_SIS shl 16)+VID_SIS,msg_AC, set_SIS devices dd (CTRL_SIS shl 16)+VID_SIS,msg_AC, set_SIS
dd 0 dd 0
version dd 0x00010001
msg_AC db '7012 AC97 controller',13,10, 0 msg_AC db '7012 AC97 controller',13,10, 0
msg_SIS db 'Silicon Integrated Systems',13,10, 0 msg_SIS db 'Silicon Integrated Systems',13,10, 0

View File

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

View File

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

View File

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

View File

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

View File

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