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