Rev 214 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 214 | Rev 227 | ||
---|---|---|---|
Line 4... | Line 4... | ||
4 | 4 | ||
Line 5... | Line 5... | ||
5 | 5 | ||
Line 6... | Line 6... | ||
6 | include 'proc32.inc' |
6 | include 'proc32.inc' |
Line 7... | Line 7... | ||
7 | 7 | ||
Line -... | Line 8... | ||
- | 8 | DEBUG equ 1 |
|
- | 9 | ||
- | 10 | VID_ATI equ 0x1002 |
|
- | 11 | ||
- | 12 | LOAD_FROM_FILE equ 0 |
|
- | 13 | LOAD_FROM_MEM equ 1 |
|
- | 14 | LOAD_INDIRECT equ 2 |
|
- | 15 | LOAD_SYSTEM equ 3 |
|
- | 16 | ||
- | 17 | struc BITMAPINFOHEADER { |
|
- | 18 | .biSize dd ? ; DWORD |
|
- | 19 | .biWidth dd ? ; LONG |
|
- | 20 | .biHeight dd ? ; LONG |
|
- | 21 | .biPlanes dw ? ; WORD |
|
- | 22 | .biBitCount dw ? ; WORD |
|
- | 23 | .biCompression dd ? ; DWORD |
|
- | 24 | .biSizeImage dd ? ; DWORD |
|
- | 25 | .biXPelsPerMeter dd ? ; LONG |
|
- | 26 | .biYPelsPerMeter dd ? ; LONG |
|
- | 27 | .biClrUsed dd ? ; DWORD |
|
- | 28 | .biClrImportant dd ? ; DWORD |
|
- | 29 | } |
|
- | 30 | ||
- | 31 | virtual at 0 |
|
- | 32 | BI BITMAPINFOHEADER |
|
- | 33 | end virtual |
|
- | 34 | ||
- | 35 | struc CURSOR |
|
- | 36 | { .magic dd ? |
|
- | 37 | .size dd ? |
|
- | 38 | .pid dd ? |
|
- | 39 | .base dd ? |
|
- | 40 | .hot_x dd ? |
|
- | 41 | .hot_y dd ? |
|
- | 42 | } |
|
- | 43 | virtual at 0 |
|
- | 44 | CURSOR CURSOR |
|
8 | DEBUG equ 0 |
45 | end virtual |
9 | 46 | ||
10 | VID_ATI equ 0x1002 |
47 | CURSOR_SIZE equ 24 |
11 | 48 | ||
12 | R8500 equ 0x514C ;R200 |
49 | R8500 equ 0x514C ;R200 |
Line 115... | Line 152... | ||
115 | 152 | ||
Line 116... | Line 153... | ||
116 | 153 | ||
117 | public START |
154 | public START |
- | 155 | public service_proc |
|
Line 118... | Line 156... | ||
118 | public service_proc |
156 | public version |
119 | 157 | ||
120 | extrn SysMsgBoardStr |
158 | extrn SysMsgBoardStr |
121 | extrn PciApi |
159 | extrn PciApi |
122 | extrn PciRead32 |
160 | extrn PciRead32 |
123 | extrn AllocKernelSpace |
161 | extrn AllocKernelSpace |
124 | extrn MapPage |
162 | extrn MapPage |
- | 163 | extrn RegService |
|
- | 164 | extrn SetHwCursor |
|
125 | extrn RegService |
165 | extrn HwCursorRestore |
126 | extrn SetHwCursor |
166 | extrn HwCursorCreate |
Line 127... | Line 167... | ||
127 | extrn LFBAddress |
167 | extrn LFBAddress |
Line 135... | Line 175... | ||
135 | section '.flat' code readable align 16 |
175 | section '.flat' code readable align 16 |
Line 136... | Line 176... | ||
136 | 176 | ||
Line 137... | Line -... | ||
137 | proc START stdcall, state:dword |
- | |
138 | 177 | proc START stdcall, state:dword |
|
139 | mov eax, [state] |
- | |
140 | cmp eax, 1 |
178 | |
141 | je .entry |
179 | cmp [state], 1 |
142 | jmp .exit |
180 | jne .exit |
143 | .entry: |
181 | |
144 | if DEBUG |
182 | if DEBUG |
145 | mov esi, msgInit |
183 | mov esi, msgInit |
Line 146... | Line 184... | ||
146 | call SysMsgBoardStr |
184 | call SysMsgBoardStr |
147 | end if |
185 | end if |
148 | 186 | ||
Line 149... | Line -... | ||
149 | call detect_ati |
- | |
150 | test eax, eax |
- | |
151 | jz .fail |
- | |
152 | - | ||
153 | stdcall LoadFile, user_file |
- | |
154 | test eax, eax |
- | |
155 | jz @F |
- | |
156 | mov [user_arrow], eax |
187 | call detect_ati |
157 | @@: |
188 | test eax, eax |
158 | stdcall ati_init_cursor, [user_arrow] |
189 | jz .fail |
Line -... | Line 190... | ||
- | 190 | ||
- | 191 | call init_ati |
|
- | 192 | test eax, eax |
|
- | 193 | jz .fail |
|
- | 194 | ||
- | 195 | xor eax, eax |
|
- | 196 | mov edi, cursors |
|
- | 197 | mov ecx, CURSOR_SIZE*16 |
|
- | 198 | cld |
|
- | 199 | rep stosd |
|
- | 200 | ||
- | 201 | not eax |
|
- | 202 | mov [cursor_map], eax |
|
- | 203 | mov [cursor_map+4], eax |
|
159 | 204 | mov edx, cursor_map |
|
160 | call init_ati |
205 | mov [cursor_start], edx |
161 | test eax, eax |
206 | add edx, 4 |
- | 207 | mov [cursor_end], edx |
|
162 | jz .fail |
208 | |
163 | 209 | stdcall RegService, sz_ati_srv, service_proc |
|
164 | stdcall RegService, sz_ati_srv, service_proc |
210 | test eax, eax |
165 | test eax, eax |
211 | jz .fail |
166 | jz .fail |
212 | mov dword [SetHwCursor], drvCursorPos ;enable hardware cursor |
167 | mov ebx, SetHwCursor |
213 | mov dword [HwCursorRestore], drv_restore |
168 | mov dword [ebx], drvCursorPos ;enable hardware cursor |
214 | mov dword [HwCursorCreate], ati_cursor |
169 | ret |
215 | ret |
Line 170... | Line 216... | ||
170 | .fail: |
216 | .fail: |
171 | if DEBUG |
217 | if DEBUG |
172 | mov esi, msgFail |
218 | mov esi, msgFail |
173 | call SysMsgBoardStr |
219 | call SysMsgBoardStr |
174 | end if |
220 | end if |
175 | 221 | ||
Line 176... | Line 222... | ||
176 | .exit: |
222 | .exit: |
177 | xor eax, eax |
223 | xor eax, eax |
Line 238... | Line 284... | ||
238 | je .found |
284 | je .found |
239 | add edi, 4 |
285 | add edi, 4 |
240 | jmp @B |
286 | jmp @B |
241 | 287 | ||
Line -... | Line 288... | ||
- | 288 | .next: |
|
242 | .next: inc [devfn] |
289 | inc [devfn] |
243 | cmp [devfn], 256 |
290 | cmp [devfn], 256 |
244 | jb .next_dev |
291 | jb .next_dev |
245 | mov eax, [bus] |
292 | mov eax, [bus] |
246 | inc eax |
293 | inc eax |
247 | mov [bus], eax |
294 | mov [bus], eax |
Line 294... | Line 341... | ||
294 | shl ebx,20 |
341 | shl ebx,20 |
295 | or eax, ebx |
342 | or eax, ebx |
296 | mov [edi+0x50], eax |
343 | mov [edi+0x50], eax |
297 | 344 | ||
Line 298... | Line -... | ||
298 | pushd 0 |
- | |
299 | pushd 0 |
- | |
300 | call drvCursorPos |
- | |
301 | call drvShowCursor |
345 | call drvShowCursor |
302 | xor eax, eax |
346 | xor eax, eax |
303 | inc eax |
347 | inc eax |
304 | .fail: |
348 | .fail: |
305 | ret |
349 | ret |
306 | endp |
350 | endp |
Line 307... | Line 351... | ||
307 | 351 | ||
- | 352 | align 4 |
|
- | 353 | drv_restore: |
|
- | 354 | ret 8 |
|
- | 355 | ||
308 | align 4 |
356 | align 4 |
309 | drvShowCursor: |
357 | drvShowCursor: |
Line 310... | Line 358... | ||
310 | mov edi, [ati_io] |
358 | mov edi, [ati_io] |
311 | 359 | ||
312 | mov eax, [edi+RD_CRTC_GEN_CNTL] |
360 | mov eax, [edi+RD_CRTC_GEN_CNTL] |
313 | bts eax,16 |
361 | bts eax,16 |
Line 314... | Line 362... | ||
314 | mov [edi+RD_CRTC_GEN_CNTL], eax |
362 | mov [edi+RD_CRTC_GEN_CNTL], eax |
315 | ret |
- | |
316 | - | ||
317 | align 4 |
363 | ret |
- | 364 | ||
318 | drvCursorPos: |
365 | align 4 |
319 | push ebp |
366 | proc drvCursorPos stdcall, hcursor:dword, x:dword, y:dword |
Line 320... | Line 367... | ||
320 | mov ebp, esp |
367 | |
321 | mov eax, 80000000h |
368 | mov eax, 80000000h |
322 | wrr CUR_HORZ_VERT_OFF, eax |
369 | wrr CUR_HORZ_VERT_OFF, eax |
323 | 370 | ||
324 | mov eax, [ebp+8] |
371 | mov eax, [x] |
Line -... | Line 372... | ||
- | 372 | shl eax, 16 |
|
325 | shl eax, 16 |
373 | or eax, [y] |
- | 374 | or eax, 80000000h |
|
326 | or eax, [ebp+12] |
375 | wrr CUR_HORZ_VERT_POSN, eax |
- | 376 | ||
- | 377 | mov esi, [hcursor] |
|
- | 378 | mov eax, [esi+CURSOR.base] |
|
- | 379 | sub eax, LFBAddress |
|
- | 380 | wrr CUR_OFFSET, eax |
|
- | 381 | ret |
|
- | 382 | endp |
|
- | 383 | ||
- | 384 | align 4 |
|
- | 385 | proc video_alloc |
|
- | 386 | ||
- | 387 | pushfd |
|
- | 388 | cli |
|
- | 389 | mov ebx, [cursor_start] |
|
- | 390 | mov ecx, [cursor_end] |
|
- | 391 | .l1: |
|
- | 392 | bsf eax,[ebx]; |
|
- | 393 | jnz .found |
|
- | 394 | add ebx,4 |
|
- | 395 | cmp ebx, ecx |
|
- | 396 | jb .l1 |
|
- | 397 | popfd |
|
- | 398 | xor eax,eax |
|
- | 399 | ret |
|
- | 400 | .found: |
|
- | 401 | btr [ebx], eax |
|
- | 402 | popfd |
|
- | 403 | ||
- | 404 | mov [cursor_start],ebx |
|
- | 405 | sub ebx, cursor_map |
|
- | 406 | shl ebx, 3 |
|
- | 407 | add eax,ebx |
|
- | 408 | ||
- | 409 | shl eax,14 |
|
- | 410 | add eax, LFBAddress+CURSOR_IMAGE_OFFSET |
|
- | 411 | ret |
|
- | 412 | endp |
|
- | 413 | ||
- | 414 | align 4 |
|
- | 415 | proc ati_cursor stdcall, hcursor:dword, src:dword, flags:dword |
|
- | 416 | ||
- | 417 | stdcall video_alloc |
|
- | 418 | ||
- | 419 | mov edi, [hcursor] |
|
- | 420 | mov [edi+CURSOR.base], eax |
|
- | 421 | ||
- | 422 | mov esi, [src] |
|
- | 423 | mov ebx, [flags] |
|
- | 424 | cmp bx, LOAD_INDIRECT |
|
- | 425 | je .indirect |
|
- | 426 | ||
- | 427 | movzx ecx, word [esi+10] |
|
- | 428 | movzx edx, word [esi+12] |
|
- | 429 | mov [edi+CURSOR.hot_x], ecx |
|
327 | or eax, 80000000h |
430 | mov [edi+CURSOR.hot_y], edx |
- | 431 | ||
- | 432 | stdcall ati_init_cursor, eax, esi |
|
- | 433 | mov eax, [hcursor] |
|
- | 434 | .fail: |
|
- | 435 | ret |
|
- | 436 | .indirect: |
|
- | 437 | shr ebx, 16 |
|
- | 438 | movzx ecx, bh |
|
- | 439 | movzx edx, bl |
|
- | 440 | mov [eax+CURSOR.hot_x], ecx |
|
- | 441 | mov [eax+CURSOR.hot_y], edx |
|
- | 442 | ||
- | 443 | xchg edi, eax |
|
- | 444 | push edi |
|
- | 445 | mov ecx, 64*64 |
|
- | 446 | xor eax,eax |
|
- | 447 | rep stosd |
|
- | 448 | ||
- | 449 | mov esi, [src] |
|
- | 450 | pop edi |
|
- | 451 | mov ebx, 32 |
|
- | 452 | cld |
|
- | 453 | @@: |
|
- | 454 | mov ecx, 32 |
|
328 | wrr CUR_HORZ_VERT_POSN, eax |
455 | rep movsd |
- | 456 | add edi, 128 |
|
Line 329... | Line 457... | ||
329 | 457 | dec ebx |
|
330 | mov eax, CURSOR_IMAGE_OFFSET |
458 | jnz @B |
331 | wrr CUR_OFFSET, eax |
459 | mov eax, [hcursor] |
332 | leave |
460 | ret |
333 | ret 8 |
461 | endp |
334 | 462 | ||
335 | align 4 |
463 | align 4 |
336 | proc ati_init_cursor stdcall, arrow:dword |
464 | proc ati_init_cursor stdcall, dst:dword, src:dword |
337 | locals |
465 | locals |
338 | rBase dd ? |
466 | rBase dd ? |
339 | pQuad dd ? |
467 | pQuad dd ? |
Line 340... | Line -... | ||
340 | pBits dd ? |
- | |
341 | pAnd dd ? |
- | |
342 | width dd ? |
468 | pBits dd ? |
343 | height dd ? |
469 | pAnd dd ? |
344 | counter dd ? |
- | |
345 | endl |
470 | width dd ? |
- | 471 | height dd ? |
|
- | 472 | counter dd ? |
|
- | 473 | endl |
|
- | 474 | ||
346 | 475 | mov esi, [src] |
|
347 | cld |
476 | add esi,[esi+18] |
348 | 477 | mov eax,esi |
|
349 | mov esi, [arrow] |
478 | |
350 | add esi,[esi+18d] |
479 | cmp [esi+BI.biBitCount], 24 |
Line 413... | Line 542... | ||
413 | sub edi,128 |
542 | sub edi,128 |
414 | mov [rBase],edi |
543 | mov [rBase],edi |
415 | sub [height],1 |
544 | sub [height],1 |
416 | jnz .l1 |
545 | jnz .l1 |
417 | 546 | jmp .copy |
|
- | 547 | ||
- | 548 | .img_24: |
|
- | 549 | add eax, [esi] |
|
- | 550 | mov [pQuad],eax |
|
- | 551 | add eax, 0xC00 |
|
- | 552 | mov [pAnd],eax |
|
- | 553 | mov eax,[esi+BI.biWidth] |
|
- | 554 | mov [width],eax |
|
- | 555 | mov ebx,[esi+BI.biHeight] |
|
- | 556 | shr ebx,1 |
|
- | 557 | mov [height],ebx |
|
- | 558 | ||
- | 559 | mov edi, pCursor |
|
- | 560 | add edi, 32*31*4 |
|
- | 561 | mov [rBase],edi |
|
- | 562 | ||
- | 563 | mov esi,[pAnd] |
|
- | 564 | mov ebx, [pQuad] |
|
- | 565 | .row_24: |
|
- | 566 | mov eax, [esi] |
|
- | 567 | bswap eax |
|
- | 568 | mov [counter], 32 |
|
- | 569 | @@: |
|
- | 570 | xor edx, edx |
|
- | 571 | shl eax,1 |
|
- | 572 | setc dl |
|
- | 573 | dec edx |
|
- | 574 | ||
- | 575 | mov ecx, [ebx] |
|
- | 576 | and ecx, 0x00FFFFFF |
|
- | 577 | and ecx, edx |
|
- | 578 | and edx, 0xFF000000 |
|
- | 579 | or edx, ecx |
|
- | 580 | mov [edi], edx |
|
- | 581 | add ebx, 3 |
|
- | 582 | add edi, 4 |
|
- | 583 | dec [counter] |
|
- | 584 | jnz @B |
|
- | 585 | ||
Line -... | Line 586... | ||
- | 586 | add esi, 4 |
|
418 | mov edi, LFBAddress |
587 | mov edi,[rBase] |
- | 588 | sub edi,128 |
|
- | 589 | mov [rBase],edi |
|
- | 590 | sub [height],1 |
|
- | 591 | jnz .row_24 |
|
- | 592 | .copy: |
|
419 | add edi, CURSOR_IMAGE_OFFSET |
593 | mov edi, [dst] |
420 | mov ecx, 64*64 |
594 | mov ecx, 64*64 |
421 | xor eax,eax |
595 | xor eax,eax |
422 | rep stosd |
596 | rep stosd |
Line 423... | Line 597... | ||
423 | 597 | ||
424 | mov esi, pCursor |
598 | mov esi, pCursor |
425 | mov edi, LFBAddress |
- | |
426 | add edi, CURSOR_IMAGE_OFFSET |
599 | mov edi, [dst] |
- | 600 | mov ebx, 32 |
|
427 | mov ebx, 32 |
601 | cld |
428 | lc: |
602 | @@: |
429 | mov ecx, 32 |
- | |
430 | lb: |
- | |
431 | mov eax, [esi] |
- | |
432 | mov [edi], eax |
- | |
433 | add esi, 4 |
- | |
434 | add edi, 4 |
- | |
435 | sub ecx, 1 |
603 | mov ecx, 32 |
436 | jnz lb |
- | |
437 | 604 | rep movsd |
|
438 | add edi, 128 |
605 | add edi, 128 |
439 | sub ebx, 1 |
606 | dec ebx |
Line 440... | Line 607... | ||
440 | jnz lc |
607 | jnz @B |
441 | 608 | ||
Line 442... | Line 609... | ||
442 | ret |
609 | ret |
Line 570... | Line 737... | ||
570 | 737 | ||
Line 571... | Line 738... | ||
571 | ret |
738 | ret |
572 | endp |
739 | endp |
Line 573... | Line -... | ||
573 | - | ||
574 | 740 | ||
575 | align 4 |
741 | align 4 |
576 | engSetupSolidFill: |
742 | engSetupSolidFill: |
577 | push ebp |
743 | push ebp |
Line 639... | Line 805... | ||
639 | dd (R9800P shl 16)+VID_ATI |
805 | dd (R9800P shl 16)+VID_ATI |
640 | dd (R9800XT shl 16)+VID_ATI |
806 | dd (R9800XT shl 16)+VID_ATI |
641 | dd 0 ;terminator |
807 | dd 0 ;terminator |
642 | 808 | ||
Line 643... | Line -... | ||
643 | ;szKernel db 'KERNEL', 0 |
- | |
644 | sz_ati_srv db 'ATI2D',0 |
809 | version dd 0x00010001 |
645 | user_file db '/rd/1/user.cur',0 |
- | |
Line -... | Line 810... | ||
- | 810 | ||
Line 646... | Line 811... | ||
646 | 811 | sz_ati_srv db 'HWCURSOR',0 |
|
647 | 812 | ||
648 | msgInit db 'detect hardware...',13,10,0 |
813 | msgInit db 'detect hardware...',13,10,0 |
Line 649... | Line -... | ||
649 | msgPCI db 'PCI accsess not supported',13,10,0 |
- | |
650 | msgFail db 'device not found',13,10,0 |
- | |
651 | - | ||
652 | user_arrow dd pArrow |
- | |
653 | - | ||
Line 654... | Line 814... | ||
654 | align 16 |
814 | msgPCI db 'PCI accsess not supported',13,10,0 |
Line 655... | Line 815... | ||
655 | pArrow: |
815 | msgFail db 'device not found',13,10,0 |
Line -... | Line 816... | ||
- | 816 | ||
- | 817 | ||
- | 818 | section '.data' data readable writable align 16 |
|
- | 819 | ||
- | 820 | pCursor db 4096 dup(?) |
|
656 | file 'arrow.cur' |
821 | |
657 | 822 | cursors rb CURSOR_SIZE*64 |
|
658 | section '.data' data readable writable align 16 |
823 | cursor_map rd 2 |