Subversion Repositories Kolibri OS

Rev

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