Subversion Repositories Kolibri OS

Rev

Rev 669 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
431 serge 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
214 serge 7
 
8
format MS COFF
9
 
10
include 'proc32.inc'
281 serge 11
include 'imports.inc'
214 serge 12
 
729 serge 13
R500_HW2D       equ 0
14
 
465 serge 15
API_VERSION     equ 0x01000100
214 serge 16
 
465 serge 17
DEBUG           equ 1
214 serge 18
 
630 serge 19
STRIDE          equ 8
20
 
465 serge 21
VID_ATI         equ 0x1002
22
 
227 serge 23
LOAD_FROM_FILE  equ 0
24
LOAD_FROM_MEM   equ 1
25
LOAD_INDIRECT   equ 2
26
LOAD_SYSTEM     equ 3
27
 
465 serge 28
SRV_GETVERSION  equ 0
233 serge 29
 
227 serge 30
struc BITMAPINFOHEADER {
31
  .biSize          dd ? ; DWORD
32
  .biWidth         dd ? ; LONG
33
  .biHeight        dd ? ; LONG
34
  .biPlanes        dw ? ; WORD
35
  .biBitCount      dw ? ; WORD
36
  .biCompression   dd ? ; DWORD
37
  .biSizeImage     dd ? ; DWORD
38
  .biXPelsPerMeter dd ? ; LONG
39
  .biYPelsPerMeter dd ? ; LONG
40
  .biClrUsed       dd ? ; DWORD
41
  .biClrImportant  dd ? ; DWORD
42
}
43
 
44
virtual at 0
45
  BI BITMAPINFOHEADER
46
end virtual
47
 
48
struc CURSOR
281 serge 49
{;common object header
50
   .magic       dd ?   ;'CURS'
51
   .destroy     dd ?   ;internal destructor
52
   .fd          dd ?   ;next object in list
53
   .bk          dd ?   ;prev object in list
54
   .pid         dd ?   ;owner id
55
 
56
 ;cursor data
57
   .base        dd ?   ;allocated memory
58
   .hot_x       dd ?   ;hotspot coords
227 serge 59
   .hot_y       dd ?
60
}
61
virtual at 0
62
  CURSOR CURSOR
63
end virtual
64
 
281 serge 65
CURSOR_SIZE     equ 32
227 serge 66
 
465 serge 67
OS_BASE         equ 0x80000000
68
SLOT_BASE       equ (OS_BASE+0x0080000)
630 serge 69
LFB_BASE        equ 0xFE000000
214 serge 70
 
71
PG_SW        equ 0x003
72
PG_NOCACHE   equ 0x018
73
 
74
struc IOCTL
75
{  .handle           dd ?
76
   .io_code          dd ?
77
   .input            dd ?
78
   .inp_size         dd ?
79
   .output           dd ?
80
   .out_size         dd ?
81
}
82
 
83
virtual at 0
84
  IOCTL IOCTL
85
end virtual
86
 
378 serge 87
;MMIO                   equ 0F9000000h
630 serge 88
RD_RB3D_CNTL               equ 1c3ch
214 serge 89
 
90
RD_MEM_CNTL                equ 0140h
91
RD_CRTC_GEN_CNTL           equ 0050h
92
RD_CRTC_CUR_EN             equ 10000h
93
RD_DISPLAY_BASE_ADDR       equ 023ch
94
RD_DEFAULT_OFFSET          equ 16e0h
630 serge 95
 
214 serge 96
CUR_HORZ_VERT_OFF          equ 0268h
97
CUR_HORZ_VERT_POSN         equ 0264h
98
CUR_OFFSET                 equ 0260h
630 serge 99
 
100
 
214 serge 101
RD_RB3D_CNTL               equ 1c3ch
102
RD_RBBM_STATUS             equ 0e40h
103
RD_RBBM_FIFOCNT_MASK       equ 007fh
104
RD_RBBM_ACTIVE             equ 80000000h
105
RD_TIMEOUT                 equ 2000000
106
 
107
RD_DP_GUI_MASTER_CNTL      equ 0146ch
108
RD_DP_BRUSH_BKGD_CLR       equ 01478h
109
RD_DP_BRUSH_FRGD_CLR       equ 0147ch
110
RD_DP_SRC_BKGD_CLR         equ 015dch
111
RD_DP_SRC_FRGD_CLR         equ 015d8h
112
RD_DP_CNTL                 equ 016c0h
113
RD_DP_DATATYPE             equ 016c4h
114
RD_DP_WRITE_MASK           equ 016cch
115
RD_DP_SRC_SOURCE_MEMORY    equ (2 shl 24)
116
RD_DP_SRC_SOURCE_HOST_DATA equ (3 shl 24)
117
RD_DEFAULT_SC_BOTTOM_RIGHT equ 16e8h
118
RD_GMC_BRUSH_SOLID_COLOR   equ (13 shl 4)
119
RD_DEFAULT_SC_RIGHT_MAX    equ 1fffh
120
RD_DEFAULT_SC_BOTTOM_MAX   equ 1fff0000h
121
RD_GMC_DST_DATATYPE_SHIFT  equ 8
122
 
123
RD_ROP3_S                  equ 00cc0000h
124
RD_ROP3_P                  equ 00f00000h
125
 
126
RD_RB2D_DSTCACHE_MODE      equ 03428h
127
RD_RB2D_DSTCACHE_CTLSTAT   equ 0342ch
128
RD_RB2D_DC_FLUSH_ALL       equ 000fh
129
RD_RB2D_DC_BUSY            equ 80000000h
130
 
131
RD_GMC_BRUSH_SOLID_COLOR   equ 000000D0h
132
RD_GMC_SRC_DATATYPE_COLOR  equ (3 shl 12)
133
RD_GMC_CLR_CMP_CNTL_DIS    equ (1 shl 28)
134
RD_GMC_WR_MSK_DIS          equ (1 shl 30)
135
 
136
cmdSolidFill               equ 73f036d0h
137
 
138
RD_DST_PITCH_OFFSET        equ 142ch
139
RD_SRC_PITCH_OFFSET        equ 1428h
140
 
141
RD_DST_X_LEFT_TO_RIGHT     equ 1
142
RD_DST_Y_TOP_TO_BOTTOM     equ 2
143
RD_DST_Y_X                 equ 1438h
144
RD_DST_WIDTH_HEIGHT        equ 1598h
145
RD_DST_LINE_START          equ 1600h
146
RD_DST_LINE_END            equ 1604h
147
R300_MEM_NUM_CHANNELS_MASK equ 0003h
148
 
149
macro rdr op1, op2
150
{
151
     mov edi, [ati_io]
152
     mov op1, [edi+op2]
153
}
154
 
155
macro wrr dest, src
156
{
157
     mov edi, [ati_io]
158
     mov dword [edi+dest], src
159
}
160
 
729 serge 161
macro rmask dest, val, mask
162
{
163
     mov edi, [ati_io]
164
     mov eax, [edi+dest]
165
     and eax, not mask
166
     or eax, (val and mask)
167
     mov [edi+dest], eax
168
}
214 serge 169
 
170
public START
171
public service_proc
227 serge 172
public version
214 serge 173
 
174
CURSOR_IMAGE_OFFSET  equ 0x00500000
175
 
176
DRV_ENTRY equ 1
177
DRV_EXIT  equ -1
178
 
179
section '.flat' code readable align 16
180
 
181
proc START stdcall, state:dword
182
 
227 serge 183
           cmp [state], 1
630 serge 184
           jne .restore
227 serge 185
 
214 serge 186
     if DEBUG
187
           mov esi, msgInit
188
           call SysMsgBoardStr
189
     end if
190
 
191
           call detect_ati
227 serge 192
           test eax, eax
214 serge 193
           jz .fail
194
 
630 serge 195
           mov ebx, [SelectHwCursor]
196
           mov ecx, [SetHwCursor]
197
           mov edx, [HwCursorRestore]
198
           mov esi, [HwCursorCreate]
214 serge 199
 
630 serge 200
           mov [oldSelect], ebx
201
           mov [oldSet], ecx
202
           mov [oldRestore], edx
203
           mov [oldCreate], esi
204
 
205
           call eax
206
 
281 serge 207
           or eax, -1
227 serge 208
           mov [cursor_map], eax
209
           mov [cursor_map+4], eax
210
           mov edx, cursor_map
211
           mov [cursor_start], edx
281 serge 212
           add edx, 8
227 serge 213
           mov [cursor_end], edx
214
 
214 serge 215
           stdcall RegService, sz_ati_srv, service_proc
216
           test eax, eax
630 serge 217
           jz .restore
218
 
219
           mov ebx, [fnSelect]
220
           mov ecx, [fnSet]
221
 
222
           mov [SelectHwCursor], ebx
223
           mov [SetHwCursor], ecx
227 serge 224
           mov dword [HwCursorRestore], drv_restore
225
           mov dword [HwCursorCreate], ati_cursor
630 serge 226
 
227 serge 227
           ret
630 serge 228
.restore:
229
           mov eax, [oldSelect]
230
           mov ebx, [oldSet]
231
           mov ecx, [oldRestore]
232
           mov edx, [oldCreate]
233
 
234
           mov [SelectHwCursor], eax
235
           mov [SetHwCursor], ebx
236
           mov [HwCursorRestore], ecx
237
           mov [HwCursorCreate], edx
238
 
239
           xor eax, eax
240
           ret
241
 
214 serge 242
.fail:
243
     if DEBUG
227 serge 244
           mov esi, msgFail
214 serge 245
           call SysMsgBoardStr
246
     end if
247
 
248
           xor eax, eax
249
           ret
250
endp
251
 
252
handle     equ  IOCTL.handle
253
io_code    equ  IOCTL.io_code
254
input      equ  IOCTL.input
255
inp_size   equ  IOCTL.inp_size
256
output     equ  IOCTL.output
257
out_size   equ  IOCTL.out_size
258
 
259
align 4
260
proc service_proc stdcall, ioctl:dword
261
 
465 serge 262
           mov ebx, [ioctl]
263
           cmp [ebx+io_code], SRV_GETVERSION
233 serge 264
           jne .fail
214 serge 265
 
465 serge 266
           mov eax, [ebx+output]
267
           cmp [ebx+out_size], 4
268
           jne .fail
269
           mov [eax], dword API_VERSION
270
           xor eax, eax
271
           ret
233 serge 272
.fail:
378 serge 273
           or eax, -1
233 serge 274
           ret
214 serge 275
endp
276
 
277
restore   handle
278
restore   io_code
279
restore   input
280
restore   inp_size
281
restore   output
282
restore   out_size
283
 
284
align 4
285
proc detect_ati
227 serge 286
           locals
287
             last_bus dd ?
288
           endl
214 serge 289
 
227 serge 290
           xor eax, eax
291
           mov [bus], eax
292
           inc eax
214 serge 293
           call PciApi
227 serge 294
           cmp eax, -1
214 serge 295
           je .err
296
 
227 serge 297
           mov [last_bus], eax
214 serge 298
 
299
.next_bus:
227 serge 300
           and [devfn], 0
214 serge 301
.next_dev:
302
           stdcall PciRead32, [bus], [devfn], dword 0
227 serge 303
           test eax, eax
304
           jz .next
305
           cmp eax, -1
306
           je .next
214 serge 307
 
227 serge 308
           mov edi, devices
214 serge 309
@@:
227 serge 310
           mov ebx, [edi]
311
           test ebx, ebx
312
           jz .next
214 serge 313
 
227 serge 314
           cmp eax, ebx
315
           je .found
630 serge 316
           add edi, STRIDE
227 serge 317
           jmp @B
318
.next:
319
           inc [devfn]
320
           cmp [devfn], 256
321
           jb  .next_dev
322
           mov eax, [bus]
323
           inc eax
324
           mov [bus], eax
325
           cmp eax, [last_bus]
326
           jna .next_bus
327
           xor eax, eax
328
           ret
214 serge 329
.found:
630 serge 330
           mov eax, [edi+4]
227 serge 331
           ret
214 serge 332
.err:
333
           xor eax, eax
334
           ret
335
endp
336
 
337
align 4
630 serge 338
proc init_r200
214 serge 339
 
340
           stdcall AllocKernelSpace, dword 0x10000
341
           test eax, eax
342
           jz .fail
343
 
344
           mov [ati_io], eax
345
 
346
           stdcall PciRead32, [bus], [devfn], dword 0x18
347
           and eax, 0xFFFF0000
348
           mov esi, eax
349
 
350
           mov edi, [ati_io]
351
           mov edx, 16
352
@@:
353
           stdcall MapPage,edi,esi,PG_SW+PG_NOCACHE
227 serge 354
           add edi, 0x1000
214 serge 355
           add esi, 0x1000
356
           dec edx
357
           jnz @B
358
 
359
           mov edi, [ati_io]
360
           mov dword [edi+RD_RB3D_CNTL], 0
361
           call engRestore
362
 
363
           mov edi, [ati_io]
364
           mov eax, [edi+0x50]
365
           mov ebx,3
366
           shl ebx,20
367
           not ebx
368
           and eax,ebx
369
           mov ebx, 2
370
           shl ebx,20
371
           or eax, ebx
372
           mov [edi+0x50], eax
373
 
630 serge 374
           call r200_ShowCursor
375
 
376
           mov [fnSelect], r200_SelectCursor
377
           mov [fnSet], r200_SetCursor
378
 
214 serge 379
           xor eax, eax
380
           inc eax
381
.fail:
382
           ret
383
endp
384
 
729 serge 385
if R500_HW2D
386
  include 'r500hw.inc'
387
end if
388
 
214 serge 389
align 4
630 serge 390
proc init_r500
391
 
392
           stdcall AllocKernelSpace, dword 0x10000
393
           test eax, eax
394
           jz .fail
395
 
396
           mov [ati_io], eax
397
 
398
           stdcall PciRead32, [bus], [devfn], dword 0x18
399
           and eax, 0xFFFF0000
400
           mov esi, eax
401
 
402
           mov edi, [ati_io]
403
           mov edx, 16
404
@@:
405
           stdcall MapPage,edi,esi,PG_SW+PG_NOCACHE
406
           add edi, 0x1000
407
           add esi, 0x1000
408
           dec edx
409
           jnz @B
410
 
411
           mov [fnSelect], r500_SelectCursor
412
           mov [fnSet], r500_SetCursor
413
 
414
           rdr eax, 0x6110
415
           mov [r500_LFB], eax
416
 
729 serge 417
if R500_HW2D
418
           call R5xx2DInit
419
end if
630 serge 420
           wrr 0x6410, 0x001F001F
421
           wrr 0x6400, dword (3 shl 8)
422
 
423
           xor eax, eax
424
           inc eax
425
.fail:
426
           ret
427
endp
428
 
429
 
430
align 4
227 serge 431
drv_restore:
432
           ret 8
433
 
630 serge 434
 
227 serge 435
align 4
630 serge 436
proc r500_SelectCursor stdcall,hcursor:dword
437
 
438
           mov esi, [hcursor]
439
 
440
           mov edx, [esi+CURSOR.base]
441
           sub edx, LFB_BASE
442
           add edx, [r500_LFB]
443
           wrr 0x6408, edx
444
 
445
           mov eax, [esi+CURSOR.hot_x]
446
           shl eax, 16
447
           mov ax, word [esi+CURSOR.hot_y]
448
           wrr 0x6418, eax
449
           ret
450
endp
451
 
452
align 4
453
proc r500_SetCursor stdcall, hcursor:dword, x:dword, y:dword
454
           pushfd
455
           cli
456
 
457
           mov esi, [hcursor]
214 serge 458
           mov edi, [ati_io]
459
 
630 serge 460
           mov eax, [x]
461
           shl eax, 16
462
           mov ax, word [y]
463
 
464
           mov [edi+0x6414], eax
465
           or dword [edi+0x6400], 1
466
 
729 serge 467
if 0
468
           stdcall R5xxSetupForSolidFill, 0x80808080, 3, 0xFFFFFFFF
469
           stdcall R5xxSolidFillRect, 100,100, 100,100
470
 
471
           stdcall R5xxSetupForSolidFill, 0xFFFF0000, 3, 0xFFFFFFFF
472
           stdcall R5xxSolidFillRect, 110,110, 80,80
473
 
474
           stdcall R5xxSetupForSolidFill, 0xFF00FF00, 3, 0xFFFFFFFF
475
           stdcall R5xxSolidFillRect, 120,120, 60,60
476
 
477
           stdcall R5xxSetupForSolidFill, 0xFF0000FF, 3, 0xFFFFFFFF
478
           stdcall R5xxSolidFillRect, 130,130, 40,40
479
end if
480
 
630 serge 481
           popfd
482
           ret
483
endp
484
 
485
align 4
486
r500_ShowCursor:
487
 
488
           mov edi, [ati_io]
489
           or dword [edi+0x6400], 1
490
           ret
491
 
492
align 4
493
r200_ShowCursor:
494
           mov edi, [ati_io]
495
 
214 serge 496
           mov eax, [edi+RD_CRTC_GEN_CNTL]
497
           bts eax,16
498
           mov [edi+RD_CRTC_GEN_CNTL], eax
499
           ret
500
 
630 serge 501
 
214 serge 502
align 4
630 serge 503
proc r200_SelectCursor stdcall,hcursor:dword
504
 
505
           ret
506
endp
507
 
508
align 4
509
proc r200_SetCursor stdcall, hcursor:dword, x:dword, y:dword
233 serge 510
           pushfd
511
           cli
227 serge 512
 
233 serge 513
           xor eax, eax
514
           xor edx, edx
515
           mov esi, [hcursor]
516
           mov ebx, [x]
517
           mov ecx, [y]
214 serge 518
 
233 serge 519
           sub ebx, [esi+CURSOR.hot_x]
520
           jnc @F
521
           neg ebx
522
           mov eax, ebx
214 serge 523
           shl eax, 16
233 serge 524
           xor ebx, ebx
525
@@:
526
           sub ecx, [esi+CURSOR.hot_y]
527
           jnc @F
528
           neg ecx
529
           mov ax, cx
530
           mov edx, ecx
531
           xor ecx, ecx
532
@@:
533
           or eax, 0x80000000
534
           wrr CUR_HORZ_VERT_OFF, eax
214 serge 535
 
233 serge 536
           shl ebx, 16
537
           mov bx, cx
538
           or ebx, 0x80000000
539
           wrr CUR_HORZ_VERT_POSN, ebx
540
 
541
           shl edx, 8
542
           add edx, [esi+CURSOR.base]
543
           sub edx, LFBAddress
544
           wrr CUR_OFFSET, edx
545
           popfd
227 serge 546
           ret
547
endp
214 serge 548
 
549
align 4
227 serge 550
proc video_alloc
551
 
552
           pushfd
553
           cli
554
           mov ebx, [cursor_start]
555
           mov ecx, [cursor_end]
556
.l1:
557
           bsf eax,[ebx];
558
           jnz .found
559
           add ebx,4
560
           cmp ebx, ecx
561
           jb .l1
562
           popfd
563
           xor eax,eax
564
           ret
565
.found:
566
           btr [ebx], eax
567
           popfd
568
 
569
           mov [cursor_start],ebx
570
           sub ebx, cursor_map
254 serge 571
           lea eax,[eax+ebx*8]
227 serge 572
 
573
           shl eax,14
574
           add eax, LFBAddress+CURSOR_IMAGE_OFFSET
575
           ret
576
endp
577
 
578
align 4
233 serge 579
video_free:
580
           pushfd
581
           cli
582
           sub eax, LFBAddress+CURSOR_IMAGE_OFFSET
583
           shr eax, 14
584
           mov ebx, cursor_map
585
           bts [ebx], eax
586
           shr eax, 3
587
           and eax, not 3
588
           add eax, ebx
589
           cmp [cursor_start], eax
590
           ja @f
591
           popfd
592
           ret
593
@@:
594
           mov [cursor_start], eax
595
           popfd
596
           ret
597
 
281 serge 598
; param
599
;  eax= pid
600
;  ebx= src
601
;  ecx= flags
602
 
233 serge 603
align 4
281 serge 604
ati_cursor:
605
.src     equ esp
606
.flags   equ esp+4
607
.hcursor equ esp+8
227 serge 608
 
281 serge 609
           sub esp, 4          ;space for .hcursor
610
           push ecx
611
           push ebx
227 serge 612
 
281 serge 613
           mov ebx, eax
614
           mov eax, CURSOR_SIZE
615
           call CreateObject
616
           test eax, eax
617
           jz .fail
618
 
619
           mov [.hcursor],eax
620
 
621
           xor ebx, ebx
622
           mov [eax+CURSOR.magic], 'CURS'
623
           mov [eax+CURSOR.destroy], destroy_cursor
624
           mov [eax+CURSOR.hot_x], ebx
625
           mov [eax+CURSOR.hot_y], ebx
626
 
627
           call video_alloc
628
           mov edi, [.hcursor]
227 serge 629
           mov [edi+CURSOR.base], eax
630
 
281 serge 631
           mov esi, [.src]
632
           mov ebx, [.flags]
227 serge 633
           cmp bx, LOAD_INDIRECT
634
           je .indirect
635
 
636
           movzx ecx, word [esi+10]
637
           movzx edx, word [esi+12]
638
           mov [edi+CURSOR.hot_x], ecx
639
           mov [edi+CURSOR.hot_y], edx
640
 
641
           stdcall ati_init_cursor, eax, esi
281 serge 642
           mov eax, [.hcursor]
227 serge 643
.fail:
281 serge 644
           add esp, 12
227 serge 645
           ret
646
.indirect:
647
           shr ebx, 16
648
           movzx ecx, bh
649
           movzx edx, bl
233 serge 650
           mov [edi+CURSOR.hot_x], ecx
651
           mov [edi+CURSOR.hot_y], edx
227 serge 652
 
281 serge 653
           mov edi, eax
654
           mov ebx, eax
227 serge 655
           mov ecx, 64*64
656
           xor eax,eax
281 serge 657
           cld
227 serge 658
           rep stosd
281 serge 659
           mov edi, ebx
227 serge 660
 
281 serge 661
           mov esi, [.src]
227 serge 662
           mov ebx, 32
663
           cld
664
@@:
665
           mov ecx, 32
666
           rep movsd
667
           add edi, 128
668
           dec ebx
669
           jnz @B
281 serge 670
           mov eax, [.hcursor]
671
           add esp, 12
227 serge 672
           ret
673
 
674
align 4
281 serge 675
destroy_cursor:
676
 
677
           push eax
678
           mov eax, [eax+CURSOR.base]
679
           call video_free
680
           pop eax
681
 
682
           call DestroyObject
683
           ret
684
 
685
align 4
227 serge 686
proc ati_init_cursor stdcall, dst:dword, src:dword
214 serge 687
           locals
688
             rBase    dd ?
689
             pQuad    dd ?
690
             pBits    dd ?
691
             pAnd     dd ?
692
             width    dd ?
693
             height   dd ?
694
             counter  dd ?
695
           endl
696
 
227 serge 697
           mov esi, [src]
698
           add esi,[esi+18]
699
           mov eax,esi
214 serge 700
 
227 serge 701
           cmp [esi+BI.biBitCount], 24
702
           je .img_24
233 serge 703
           cmp [esi+BI.biBitCount], 8
704
           je .img_8
705
           cmp [esi+BI.biBitCount], 4
706
           je .img_4
707
 
708
.img_2:
709
           add eax, [esi]
710
           mov [pQuad],eax
711
           add eax,8
712
           mov [pBits],eax
713
           add eax, 128
714
           mov [pAnd],eax
715
           mov eax,[esi+4]
716
           mov [width],eax
717
           mov ebx,[esi+8]
718
           shr ebx,1
719
           mov [height],ebx
720
 
721
           mov edi, pCursor
722
           add edi, 32*31*4
723
           mov [rBase],edi
724
 
725
           mov esi,[pQuad]
726
.l21:
727
           mov ebx, [pBits]
728
           mov ebx, [ebx]
729
           bswap ebx
730
           mov eax, [pAnd]
731
           mov eax, [eax]
732
           bswap eax
733
           mov [counter], 32
734
@@:
735
           xor edx, edx
736
           shl eax,1
737
           setc dl
738
           dec edx
739
 
740
           xor ecx, ecx
741
           shl ebx,1
742
           setc cl
743
           mov ecx, [esi+ecx*4]
744
           and ecx, edx
745
           and edx, 0xFF000000
746
           or edx, ecx
747
           mov [edi], edx
748
 
749
           add edi, 4
750
           dec [counter]
751
           jnz @B
752
 
753
           add [pBits], 4
754
           add [pAnd], 4
755
           mov edi,[rBase]
756
           sub edi,128
757
           mov [rBase],edi
758
           sub [height],1
759
           jnz .l21
760
           jmp .copy
227 serge 761
.img_4:
214 serge 762
           add eax, [esi]
763
           mov [pQuad],eax
764
           add eax,64
765
           mov [pBits],eax
766
           add eax, 0x200
767
           mov [pAnd],eax
768
           mov eax,[esi+4]
769
           mov [width],eax
770
           mov ebx,[esi+8]
771
           shr ebx,1
772
           mov [height],ebx
773
 
774
           mov edi, pCursor
775
           add edi, 32*31*4
776
           mov [rBase],edi
777
 
233 serge 778
           mov esi,[pQuad]
214 serge 779
           mov ebx, [pBits]
233 serge 780
.l4:
781
           mov eax, [pAnd]
782
           mov eax, [eax]
214 serge 783
           bswap eax
784
           mov [counter], 16
785
@@:
786
           xor edx, edx
787
           shl eax,1
788
           setc dl
789
           dec edx
790
 
233 serge 791
           movzx ecx, byte [ebx]
792
           and cl, 0xF0
214 serge 793
           shr ecx, 2
233 serge 794
           mov ecx, [esi+ecx]
214 serge 795
           and ecx, edx
796
           and edx, 0xFF000000
797
           or edx, ecx
798
           mov [edi], edx
799
 
800
           xor edx, edx
801
           shl eax,1
802
           setc dl
803
           dec edx
804
 
233 serge 805
           movzx ecx, byte [ebx]
806
           and cl, 0x0F
807
           mov ecx, [esi+ecx*4]
214 serge 808
           and ecx, edx
809
           and edx, 0xFF000000
810
           or edx, ecx
811
           mov [edi+4], edx
812
 
813
           inc ebx
814
           add edi, 8
815
           dec [counter]
816
           jnz @B
817
 
233 serge 818
           add [pAnd], 4
214 serge 819
           mov edi,[rBase]
820
           sub edi,128
821
           mov [rBase],edi
822
           sub [height],1
233 serge 823
           jnz .l4
227 serge 824
           jmp .copy
233 serge 825
.img_8:
826
           add eax, [esi]
827
           mov [pQuad],eax
828
           add eax,1024
829
           mov [pBits],eax
830
           add eax, 1024
831
           mov [pAnd],eax
832
           mov eax,[esi+4]
833
           mov [width],eax
834
           mov ebx,[esi+8]
835
           shr ebx,1
836
           mov [height],ebx
214 serge 837
 
233 serge 838
           mov edi, pCursor
839
           add edi, 32*31*4
840
           mov [rBase],edi
841
 
842
           mov esi,[pQuad]
843
           mov ebx, [pBits]
844
.l81:
845
           mov eax, [pAnd]
846
           mov eax, [eax]
847
           bswap eax
848
           mov [counter], 32
849
@@:
850
           xor edx, edx
851
           shl eax,1
852
           setc dl
853
           dec edx
854
 
855
           movzx ecx,  byte [ebx]
856
           mov ecx, [esi+ecx*4]
857
           and ecx, edx
858
           and edx, 0xFF000000
859
           or edx, ecx
860
           mov [edi], edx
861
 
862
           inc ebx
863
           add edi, 4
864
           dec [counter]
865
           jnz @B
866
 
867
           add [pAnd], 4
868
           mov edi,[rBase]
869
           sub edi,128
870
           mov [rBase],edi
871
           sub [height],1
872
           jnz .l81
873
           jmp .copy
227 serge 874
.img_24:
875
           add eax, [esi]
876
           mov [pQuad],eax
877
           add eax, 0xC00
878
           mov [pAnd],eax
879
           mov eax,[esi+BI.biWidth]
880
           mov [width],eax
881
           mov ebx,[esi+BI.biHeight]
882
           shr ebx,1
883
           mov [height],ebx
884
 
885
           mov edi, pCursor
886
           add edi, 32*31*4
887
           mov [rBase],edi
888
 
889
           mov esi,[pAnd]
890
           mov ebx, [pQuad]
891
.row_24:
892
           mov eax, [esi]
893
           bswap eax
894
           mov [counter], 32
895
@@:
896
           xor edx, edx
897
           shl eax,1
898
           setc dl
899
           dec edx
900
 
901
           mov ecx, [ebx]
902
           and ecx, 0x00FFFFFF
903
           and ecx, edx
904
           and edx, 0xFF000000
905
           or edx, ecx
906
           mov [edi], edx
907
           add ebx, 3
908
           add edi, 4
909
           dec [counter]
910
           jnz @B
911
 
912
           add esi, 4
913
           mov edi,[rBase]
914
           sub edi,128
915
           mov [rBase],edi
916
           sub [height],1
917
           jnz .row_24
918
.copy:
919
           mov edi, [dst]
214 serge 920
           mov ecx, 64*64
921
           xor eax,eax
922
           rep stosd
923
 
924
           mov esi, pCursor
227 serge 925
           mov edi, [dst]
214 serge 926
           mov ebx, 32
227 serge 927
           cld
928
@@:
214 serge 929
           mov ecx, 32
227 serge 930
           rep movsd
214 serge 931
           add edi, 128
227 serge 932
           dec ebx
933
           jnz @B
214 serge 934
           ret
935
endp
936
 
937
align 4
938
proc engFlush
939
 
940
           mov edi, [ati_io]
941
 
942
           mov eax, [edi+RD_RB2D_DSTCACHE_CTLSTAT]
943
           or eax,RD_RB2D_DC_FLUSH_ALL
944
           mov [edi+RD_RB2D_DSTCACHE_CTLSTAT],eax
945
 
946
           mov ecx, RD_TIMEOUT
947
@@:
948
           mov eax,[edi+RD_RB2D_DSTCACHE_CTLSTAT]
949
           and eax, RD_RB2D_DC_BUSY
950
           jz .exit
951
 
952
           sub ecx,1
953
           jnz @B
954
.exit:
955
           ret
956
endp
957
 
630 serge 958
 
214 serge 959
align 4
960
engWaitForFifo:
961
cnt equ bp+8
962
           push ebp
963
           mov ebp, esp
964
 
965
           mov edi, [ati_io]
966
 
967
           mov ecx, RD_TIMEOUT
968
@@:
969
           mov eax, [edi+RD_RBBM_STATUS]
970
           and eax, RD_RBBM_FIFOCNT_MASK
971
           cmp eax, [ebp+8]
972
           jae .exit
973
 
974
           sub ecx,1
975
           jmp @B
976
 
977
.exit:
978
           leave
979
           ret 4
980
 
981
align 4
982
proc engWaitForIdle
983
 
227 serge 984
           push dword 64
985
           call engWaitForFifo
214 serge 986
 
227 serge 987
           mov edi, [ati_io]
988
           mov ecx ,RD_TIMEOUT
214 serge 989
@@:
227 serge 990
           mov eax, [edi+RD_RBBM_STATUS]
991
           and eax,RD_RBBM_ACTIVE
992
           jz .exit
214 serge 993
 
227 serge 994
           sub ecx,1
995
           jnz @B
214 serge 996
.exit:
227 serge 997
           call engFlush
998
           ret
214 serge 999
endp
1000
 
630 serge 1001
 
214 serge 1002
align 4
1003
proc engRestore
1004
 
1005
;             push dword 1
1006
;             call engWaitForFifo
1007
 
1008
;             mov dword  [MMIO+RD_RB2D_DSTCACHE_MODE], 0
1009
 
227 serge 1010
           push dword 3
1011
           call engWaitForFifo
214 serge 1012
 
1013
           mov edi, [ati_io]
1014
 
1015
           mov eax, [edi+RD_DISPLAY_BASE_ADDR]
1016
           shr eax, 10d
1017
           or eax,(64d shl 22d)
1018
           mov [edi+RD_DEFAULT_OFFSET],eax
1019
           mov [edi+RD_SRC_PITCH_OFFSET],eax
1020
           mov [edi+RD_DST_PITCH_OFFSET],eax
1021
 
1022
           push dword 1
1023
           call engWaitForFifo
1024
 
1025
           mov edi, [ati_io]
1026
           mov eax, [edi+RD_DP_DATATYPE]
1027
           btr eax, 29d
1028
           mov [edi+RD_DP_DATATYPE],eax
1029
 
1030
           push dword 1
1031
           call engWaitForFifo
1032
 
1033
           mov edi, [ati_io]
1034
           mov dword [edi+RD_DEFAULT_SC_BOTTOM_RIGHT],\
1035
                     (RD_DEFAULT_SC_RIGHT_MAX or RD_DEFAULT_SC_BOTTOM_MAX)
1036
 
1037
           push dword 1
1038
           call engWaitForFifo
1039
 
1040
           mov edi, [ati_io]
1041
           mov dword [edi+RD_DP_GUI_MASTER_CNTL],\
1042
                     (RD_GMC_BRUSH_SOLID_COLOR or \
1043
                      RD_GMC_SRC_DATATYPE_COLOR or \
1044
                     (6 shl RD_GMC_DST_DATATYPE_SHIFT) or \
1045
                      RD_GMC_CLR_CMP_CNTL_DIS or \
1046
                      RD_ROP3_P or \
1047
                      RD_GMC_WR_MSK_DIS)
1048
 
1049
 
1050
           push dword 7
1051
           call engWaitForFifo
1052
 
1053
           mov edi, [ati_io]
1054
 
1055
           mov dword [edi+RD_DST_LINE_START],0
1056
           mov dword [edi+RD_DST_LINE_END], 0
1057
           mov dword [edi+RD_DP_BRUSH_FRGD_CLR], 808000ffh
1058
           mov dword [edi+RD_DP_BRUSH_BKGD_CLR], 002020ffh
1059
           mov dword [edi+RD_DP_SRC_FRGD_CLR],   808000ffh
1060
           mov dword [edi+RD_DP_SRC_BKGD_CLR],   004000ffh
1061
           mov dword [edi+RD_DP_WRITE_MASK],0ffffffffh
1062
 
1063
           call engWaitForIdle
1064
 
1065
           ret
1066
endp
1067
 
1068
 
1069
 
630 serge 1070
align 4
1071
dword2str:
1072
      mov  esi, hex_buff
1073
      mov ecx, -8
1074
@@:
1075
      rol eax, 4
1076
      mov ebx, eax
1077
      and ebx, 0x0F
1078
      mov bl, [ebx+hexletters]
1079
      mov [8+esi+ecx], bl
1080
      inc ecx
1081
      jnz @B
1082
      ret
214 serge 1083
 
630 serge 1084
hexletters   db '0123456789ABCDEF'
1085
hex_buff     db 8 dup(0),13,10,0
214 serge 1086
 
669 andrew_pro 1087
R200M       equ 0x5a62  ;R300
640 andrew_pro 1088
R7000       equ 0x5159  ;R200
630 serge 1089
R8500       equ 0x514C  ;R200
1090
R9000       equ 0x4966  ;RV250
1091
R9200       equ 0x5961  ;RV280
1092
R9200SE     equ 0x5964  ;RV280
1093
R9500       equ 0x4144  ;R300
1094
R9500P      equ 0x4E45  ;R300
1095
R9550       equ 0x4153  ;RV350
1096
R9600       equ 0x4150  ;RV350
1097
R9600XT     equ 0x4152  ;RV360
1098
R9700P      equ 0x4E44  ;R300
1099
R9800       equ 0x4E49  ;R350
1100
R9800P      equ 0x4E48  ;R350
1101
R9800XT     equ 0x4E4A  ;R360
214 serge 1102
 
1103
 
1104
align 4
1105
 
640 andrew_pro 1106
devices:
669 andrew_pro 1107
        dd (R200M   shl 16)+VID_ATI, init_r200   ;R300
1108
        dd (R7000   shl 16)+VID_ATI, init_r200
1109
        dd (R8500   shl 16)+VID_ATI, init_r200
630 serge 1110
        dd (R9000   shl 16)+VID_ATI, init_r200
639 serge 1111
        dd (0x514D  shl 16)+VID_ATI, init_r200   ;R200     9100
1112
 
630 serge 1113
        dd (R9200   shl 16)+VID_ATI, init_r200
1114
        dd (R9200SE shl 16)+VID_ATI, init_r200
639 serge 1115
 
1116
        dd (0x5960  shl 16)+VID_ATI, init_r200   ;RV280    9250
1117
 
630 serge 1118
        dd (R9500   shl 16)+VID_ATI, init_r200
1119
        dd (R9500P  shl 16)+VID_ATI, init_r200
1120
        dd (R9550   shl 16)+VID_ATI, init_r200
214 serge 1121
 
630 serge 1122
        dd (R9600   shl 16)+VID_ATI, init_r200
1123
        dd (R9600XT shl 16)+VID_ATI, init_r200
1124
        dd (0x4155  shl 16)+VID_ATI, init_r200   ;RV350    9600
1125
        dd (0x4151  shl 16)+VID_ATI, init_r200   ;RV350    9600
1126
        dd (0x4E51  shl 16)+VID_ATI, init_r200   ;RV350    9600
214 serge 1127
 
630 serge 1128
        dd (R9700P  shl 16)+VID_ATI, init_r200
214 serge 1129
 
630 serge 1130
        dd (0x4148  shl 16)+VID_ATI, init_r200   ;R350    9800
1131
        dd (R9800   shl 16)+VID_ATI, init_r200
1132
        dd (R9800P  shl 16)+VID_ATI, init_r200
1133
        dd (R9800XT shl 16)+VID_ATI, init_r200
214 serge 1134
 
630 serge 1135
        dd (0x5B60  shl 16)+VID_ATI, init_r200   ;RV370    X300/X550
1136
        dd (0x5B63  shl 16)+VID_ATI, init_r200   ;RV370    X550
1137
        dd (0x5B62  shl 16)+VID_ATI, init_r200   ;RV380x   X600
1138
        dd (0x3E50  shl 16)+VID_ATI, init_r200   ;RV380    X600/X550
214 serge 1139
 
630 serge 1140
        dd (0x5B4F  shl 16)+VID_ATI, init_r200   ;RV410    X700
1141
        dd (0x5B4D  shl 16)+VID_ATI, init_r200   ;RV410    X700
1142
        dd (0x5B4B  shl 16)+VID_ATI, init_r200   ;RV410    X700
1143
        dd (0x5B4C  shl 16)+VID_ATI, init_r200   ;RV410    X700
1144
 
1145
        dd (0x4a49  shl 16)+VID_ATI, init_r200   ;R420     X800 PRO/GTO
1146
        dd (0x4a4B  shl 16)+VID_ATI, init_r200   ;R420     X800
1147
        dd (0x5549  shl 16)+VID_ATI, init_r200   ;R423     X800
1148
        dd (0x4a4A  shl 16)+VID_ATI, init_r200   ;R420     X800
1149
        dd (0x554F  shl 16)+VID_ATI, init_r200   ;R430     X800
1150
        dd (0x554D  shl 16)+VID_ATI, init_r200   ;R430     X800
1151
        dd (0x554E  shl 16)+VID_ATI, init_r200   ;R430     X800
1152
        dd (0x5D57  shl 16)+VID_ATI, init_r200   ;R423     X800 XT
1153
        dd (0x4A50  shl 16)+VID_ATI, init_r200   ;R420     X800 XT
1154
        dd (0x554A  shl 16)+VID_ATI, init_r200   ;R423     X800 XT
1155
        dd (0x5D4F  shl 16)+VID_ATI, init_r200   ;R423     X800/X850
1156
        dd (0x554B  shl 16)+VID_ATI, init_r200   ;R423     X800 GT
1157
 
1158
        dd (0x4B4B  shl 16)+VID_ATI, init_r200   ;R481     X850
1159
        dd (0x4B49  shl 16)+VID_ATI, init_r200   ;R481     X850
1160
        dd (0x4B4C  shl 16)+VID_ATI, init_r200   ;R481     X850
1161
 
1162
        dd (0x5D4D  shl 16)+VID_ATI, init_r200   ;R480     X850
1163
        dd (0x5D52  shl 16)+VID_ATI, init_r200   ;R480     X850
1164
 
1165
        dd (0x791E  shl 16)+VID_ATI, init_r500   ;RS690   X1200
1166
 
1167
        dd (0x7140  shl 16)+VID_ATI, init_r500   ;RV515   X1300
1168
        dd (0x7142  shl 16)+VID_ATI, init_r500   ;RV515   X1300
1169
        dd (0x7146  shl 16)+VID_ATI, init_r500   ;RV515   X1300
1170
        dd (0x714D  shl 16)+VID_ATI, init_r500   ;RV515   X1300
1171
        dd (0x714E  shl 16)+VID_ATI, init_r500   ;RV515   X1300
1172
 
1173
        dd (0x7183  shl 16)+VID_ATI, init_r500   ;RV515   X1300
1174
        dd (0x7187  shl 16)+VID_ATI, init_r500   ;RV515   X1300
1175
        dd (0x718F  shl 16)+VID_ATI, init_r500   ;RV515   X1300
1176
 
1177
        dd (0x7143  shl 16)+VID_ATI, init_r500   ;RV515   X1550
1178
        dd (0x7147  shl 16)+VID_ATI, init_r500   ;RV515   X1550
1179
        dd (0x715F  shl 16)+VID_ATI, init_r500   ;RV515   X1550
1180
        dd (0x7193  shl 16)+VID_ATI, init_r500   ;RV515   X1550
1181
        dd (0x719F  shl 16)+VID_ATI, init_r500   ;RV515   X1550
1182
 
1183
        dd (0x71C0  shl 16)+VID_ATI, init_r500   ;RV530   X1600
1184
        dd (0x71C1  shl 16)+VID_ATI, init_r500   ;RV535   X1650
1185
        dd (0x71C2  shl 16)+VID_ATI, init_r500   ;RV530   X1600
1186
        dd (0x71C3  shl 16)+VID_ATI, init_r500   ;RV535   X1600
1187
        dd (0x71C6  shl 16)+VID_ATI, init_r500   ;RV530   X1600
1188
        dd (0x71C7  shl 16)+VID_ATI, init_r500   ;RV534   X1650
1189
 
1190
        dd (0x7181  shl 16)+VID_ATI, init_r500   ;RV515   X1600
1191
        dd (0x71CD  shl 16)+VID_ATI, init_r500   ;RV530   X1600
1192
 
1193
        dd (0x7291  shl 16)+VID_ATI, init_r500   ;R580    X1650
1194
        dd (0x7293  shl 16)+VID_ATI, init_r500   ;R580    X1650
1195
 
1196
        dd (0x7100  shl 16)+VID_ATI, init_r500   ;RV520   X1800
1197
        dd (0x7109  shl 16)+VID_ATI, init_r500   ;RV520   X1800
1198
        dd (0x710A  shl 16)+VID_ATI, init_r500   ;RV520   X1800 GTO
1199
 
1200
        dd (0x7249  shl 16)+VID_ATI, init_r500   ;RV580   X1900
1201
        dd (0x724B  shl 16)+VID_ATI, init_r500   ;RV580   X1900 GT
1202
 
1203
        dd (0x7240  shl 16)+VID_ATI, init_r500   ;RV580   X1950
1204
        dd (0x7244  shl 16)+VID_ATI, init_r500   ;RV580   X1950
1205
        dd (0x7248  shl 16)+VID_ATI, init_r500   ;RV580   X1950
1206
 
1207
        dd (0x7288  shl 16)+VID_ATI, init_r500   ;R580    X1950 GT
1208
        dd (0x7280  shl 16)+VID_ATI, init_r500   ;R580    X1950 PRO
1209
 
1210
        dd (0x94C3  shl 16)+VID_ATI, init_r500   ;RV610   HD 2400 PRO
1211
        dd (0x94C1  shl 16)+VID_ATI, init_r500   ;RV610   HD 2400 XT
1212
 
1213
        dd (0x9589  shl 16)+VID_ATI, init_r500   ;RV630   HD 2600 PRO
1214
        dd (0x958A  shl 16)+VID_ATI, init_r500   ;RV630   HD 2600 X2
1215
        dd (0x9588  shl 16)+VID_ATI, init_r500   ;RV630   HD 2600 XT
1216
 
1217
        dd (0x9403  shl 16)+VID_ATI, init_r500   ;R600    HD 2900 PRO
1218
        dd (0x9409  shl 16)+VID_ATI, init_r500   ;R600    HD 2900 XT
1219
 
1220
 
214 serge 1221
        dd 0    ;terminator
1222
 
465 serge 1223
version      dd (5 shl 16) or (API_VERSION and 0xFFFF)
214 serge 1224
 
729 serge 1225
if R500_HW2D
630 serge 1226
 
729 serge 1227
align 16
1228
R5xxRops  dd R5XX_ROP3_ZERO, R5XX_ROP3_ZERO  ;GXclear
1229
          dd R5XX_ROP3_DSa,  R5XX_ROP3_DPa   ;Gxand
1230
          dd R5XX_ROP3_SDna, R5XX_ROP3_PDna  ;GXandReverse
1231
          dd R5XX_ROP3_S,    R5XX_ROP3_P     ;GXcopy
1232
          dd R5XX_ROP3_DSna, R5XX_ROP3_DPna  ;GXandInverted
1233
          dd R5XX_ROP3_D,    R5XX_ROP3_D     ;GXnoop
1234
          dd R5XX_ROP3_DSx,  R5XX_ROP3_DPx   ;GXxor
1235
          dd R5XX_ROP3_DSo,  R5XX_ROP3_DPo   ;GXor
1236
          dd R5XX_ROP3_DSon, R5XX_ROP3_DPon  ;GXnor
1237
          dd R5XX_ROP3_DSxn, R5XX_ROP3_PDxn  ;GXequiv
1238
          dd R5XX_ROP3_Dn,   R5XX_ROP3_Dn    ;GXinvert
1239
          dd R5XX_ROP3_SDno, R5XX_ROP3_PDno  ;GXorReverse
1240
          dd R5XX_ROP3_Sn,   R5XX_ROP3_Pn    ;GXcopyInverted
1241
          dd R5XX_ROP3_DSno, R5XX_ROP3_DPno  ;GXorInverted
1242
          dd R5XX_ROP3_DSan, R5XX_ROP3_DPan  ;GXnand
1243
          dd R5XX_ROP3_ONE,  R5XX_ROP3_ONE   ;GXset
1244
end if
1245
 
1246
 
227 serge 1247
sz_ati_srv   db 'HWCURSOR',0
214 serge 1248
 
1249
msgInit      db 'detect hardware...',13,10,0
1250
msgPCI       db 'PCI accsess not supported',13,10,0
1251
msgFail      db 'device not found',13,10,0
233 serge 1252
msg_neg      db 'neg ecx',13,10,0
630 serge 1253
 
729 serge 1254
if R500_HW2D
1255
 
1256
msgR5xx2DFlushtimeout \
1257
             db 'R5xx2DFlush timeout error',13,10,0
1258
msgR5xxFIFOWaitLocaltimeout \
1259
             db 'R5xxFIFOWaitLocal timeout error', 13, 10,0
1260
msgR5xx2DIdleLocaltimeout \
1261
             db 'R5xx2DIdleLocal timeout error', 13,10,0
1262
end if
1263
 
630 serge 1264
if 0
1265
msg6100      db '6100:  ',0
1266
msg6104      db '6104:  ',0
1267
msg6108      db '6108:  ',0
1268
msg6110      db '6110:  ',0
1269
msg6120      db '6120:  ',0
1270
msg6124      db '6124:  ',0
1271
msg6128      db '6128:  ',0
1272
msg612C      db '612C:  ',0
1273
msg6130      db '6130:  ',0
1274
msg6134      db '6134:  ',0
1275
msg6138      db '6138:  ',0
1276
end if
1277
 
233 serge 1278
buff         db 8 dup(0)
1279
             db 13,10, 0
214 serge 1280
 
1281
section '.data' data readable writable align 16
1282
 
1283
pCursor  db 4096 dup(?)
1284
 
227 serge 1285
cursor_map     rd 2
1286
cursor_start   rd 1
1287
cursor_end     rd 1
214 serge 1288
 
630 serge 1289
fnSelect       rd 1
1290
fnSet          rd 1
1291
oldSelect      rd 1
1292
oldSet         rd 1
1293
oldRestore     rd 1
1294
oldCreate      rd 1
1295
 
1296
r500_LFB       rd 1
1297
 
227 serge 1298
bus            dd ?
1299
devfn          dd ?
1300
ati_io         dd ?
214 serge 1301
 
729 serge 1302
if R500_HW2D
214 serge 1303
 
729 serge 1304
rhd            RHD
227 serge 1305
 
729 serge 1306
end if