Subversion Repositories Kolibri OS

Rev

Rev 741 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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