Subversion Repositories Kolibri OS

Rev

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

Rev 444 Rev 462
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
 
-
 
13
API_VERSION     equ 0x01000100
12
 
14
 
13
DEBUG     equ 1
15
DEBUG           equ 1
14
 
16
 
15
VID_ATI     equ 0x1002
17
VID_ATI         equ 0x1002
16
 
18
 
17
LOAD_FROM_FILE  equ 0
19
LOAD_FROM_FILE  equ 0
18
LOAD_FROM_MEM   equ 1
20
LOAD_FROM_MEM   equ 1
19
LOAD_INDIRECT   equ 2
21
LOAD_INDIRECT   equ 2
20
LOAD_SYSTEM     equ 3
22
LOAD_SYSTEM     equ 3
21
 
23
 
22
VIDEO_FREE      equ 2
24
SRV_GETVERSION  equ 0
23
 
25
 
24
struc BITMAPINFOHEADER {
26
struc BITMAPINFOHEADER {
25
  .biSize          dd ? ; DWORD
27
  .biSize          dd ? ; DWORD
26
  .biWidth         dd ? ; LONG
28
  .biWidth         dd ? ; LONG
27
  .biHeight        dd ? ; LONG
29
  .biHeight        dd ? ; LONG
28
  .biPlanes        dw ? ; WORD
30
  .biPlanes        dw ? ; WORD
29
  .biBitCount      dw ? ; WORD
31
  .biBitCount      dw ? ; WORD
30
  .biCompression   dd ? ; DWORD
32
  .biCompression   dd ? ; DWORD
31
  .biSizeImage     dd ? ; DWORD
33
  .biSizeImage     dd ? ; DWORD
32
  .biXPelsPerMeter dd ? ; LONG
34
  .biXPelsPerMeter dd ? ; LONG
33
  .biYPelsPerMeter dd ? ; LONG
35
  .biYPelsPerMeter dd ? ; LONG
34
  .biClrUsed       dd ? ; DWORD
36
  .biClrUsed       dd ? ; DWORD
35
  .biClrImportant  dd ? ; DWORD
37
  .biClrImportant  dd ? ; DWORD
36
}
38
}
37
 
39
 
38
virtual at 0
40
virtual at 0
39
  BI BITMAPINFOHEADER
41
  BI BITMAPINFOHEADER
40
end virtual
42
end virtual
41
 
43
 
42
struc CURSOR
44
struc CURSOR
43
{;common object header
45
{;common object header
44
   .magic       dd ?   ;'CURS'
46
   .magic       dd ?   ;'CURS'
45
   .destroy     dd ?   ;internal destructor
47
   .destroy     dd ?   ;internal destructor
46
   .fd          dd ?   ;next object in list
48
   .fd          dd ?   ;next object in list
47
   .bk          dd ?   ;prev object in list
49
   .bk          dd ?   ;prev object in list
48
   .pid         dd ?   ;owner id
50
   .pid         dd ?   ;owner id
49
 
51
 
50
 ;cursor data
52
 ;cursor data
51
   .base        dd ?   ;allocated memory
53
   .base        dd ?   ;allocated memory
52
   .hot_x       dd ?   ;hotspot coords
54
   .hot_x       dd ?   ;hotspot coords
53
   .hot_y       dd ?
55
   .hot_y       dd ?
54
}
56
}
55
virtual at 0
57
virtual at 0
56
  CURSOR CURSOR
58
  CURSOR CURSOR
57
end virtual
59
end virtual
58
 
60
 
59
CURSOR_SIZE     equ 32
61
CURSOR_SIZE     equ 32
60
 
62
 
61
R8500       equ 0x514C  ;R200
63
R8500       equ 0x514C  ;R200
62
R9000       equ 0x4966  ;RV250
64
R9000       equ 0x4966  ;RV250
63
R9200       equ 0x5961  ;RV280
65
R9200       equ 0x5961  ;RV280
64
R9500       equ 0x4144  ;R300
66
R9500       equ 0x4144  ;R300
65
R9500P      equ 0x4E45  ;R300
67
R9500P      equ 0x4E45  ;R300
66
R9550       equ 0x4153  ;RV350
68
R9550       equ 0x4153  ;RV350
67
R9600       equ 0x4150  ;RV350
69
R9600       equ 0x4150  ;RV350
68
R9600XT     equ 0x4152  ;RV360
70
R9600XT     equ 0x4152  ;RV360
69
R9700P      equ 0x4E44  ;R300
71
R9700P      equ 0x4E44  ;R300
70
R9800       equ 0x4E49  ;R350
72
R9800       equ 0x4E49  ;R350
71
R9800P      equ 0x4E48  ;R350
73
R9800P      equ 0x4E48  ;R350
72
R9800XT     equ 0x4E4A  ;R360
74
R9800XT     equ 0x4E4A  ;R360
73
 
75
 
74
OS_BASE         equ 0x80000000
76
OS_BASE         equ 0x80000000
75
SLOT_BASE       equ (OS_BASE+0x0080000)
77
SLOT_BASE       equ (OS_BASE+0x0080000)
76
 
78
 
77
PG_SW        equ 0x003
79
PG_SW        equ 0x003
78
PG_NOCACHE   equ 0x018
80
PG_NOCACHE   equ 0x018
79
 
81
 
80
struc IOCTL
82
struc IOCTL
81
{  .handle           dd ?
83
{  .handle           dd ?
82
   .io_code          dd ?
84
   .io_code          dd ?
83
   .input            dd ?
85
   .input            dd ?
84
   .inp_size         dd ?
86
   .inp_size         dd ?
85
   .output           dd ?
87
   .output           dd ?
86
   .out_size         dd ?
88
   .out_size         dd ?
87
}
89
}
88
 
90
 
89
virtual at 0
91
virtual at 0
90
  IOCTL IOCTL
92
  IOCTL IOCTL
91
end virtual
93
end virtual
92
 
94
 
93
;MMIO                   equ 0F9000000h
95
;MMIO                   equ 0F9000000h
94
RD_RB3D_CNTL            equ 1c3ch
96
RD_RB3D_CNTL            equ 1c3ch
95
 
97
 
96
RD_MEM_CNTL                equ 0140h
98
RD_MEM_CNTL                equ 0140h
97
RD_CRTC_GEN_CNTL           equ 0050h
99
RD_CRTC_GEN_CNTL           equ 0050h
98
RD_CRTC_CUR_EN             equ 10000h
100
RD_CRTC_CUR_EN             equ 10000h
99
RD_DISPLAY_BASE_ADDR       equ 023ch
101
RD_DISPLAY_BASE_ADDR       equ 023ch
100
RD_DEFAULT_OFFSET          equ 16e0h
102
RD_DEFAULT_OFFSET          equ 16e0h
101
CUR_HORZ_VERT_OFF          equ 0268h
103
CUR_HORZ_VERT_OFF          equ 0268h
102
CUR_HORZ_VERT_POSN         equ 0264h
104
CUR_HORZ_VERT_POSN         equ 0264h
103
CUR_OFFSET                 equ 0260h
105
CUR_OFFSET                 equ 0260h
104
RD_RB3D_CNTL               equ 1c3ch
106
RD_RB3D_CNTL               equ 1c3ch
105
RD_RBBM_STATUS             equ 0e40h
107
RD_RBBM_STATUS             equ 0e40h
106
RD_RBBM_FIFOCNT_MASK       equ 007fh
108
RD_RBBM_FIFOCNT_MASK       equ 007fh
107
RD_RBBM_ACTIVE             equ 80000000h
109
RD_RBBM_ACTIVE             equ 80000000h
108
RD_TIMEOUT                 equ 2000000
110
RD_TIMEOUT                 equ 2000000
109
 
111
 
110
RD_DP_GUI_MASTER_CNTL      equ 0146ch
112
RD_DP_GUI_MASTER_CNTL      equ 0146ch
111
RD_DP_BRUSH_BKGD_CLR       equ 01478h
113
RD_DP_BRUSH_BKGD_CLR       equ 01478h
112
RD_DP_BRUSH_FRGD_CLR       equ 0147ch
114
RD_DP_BRUSH_FRGD_CLR       equ 0147ch
113
RD_DP_SRC_BKGD_CLR         equ 015dch
115
RD_DP_SRC_BKGD_CLR         equ 015dch
114
RD_DP_SRC_FRGD_CLR         equ 015d8h
116
RD_DP_SRC_FRGD_CLR         equ 015d8h
115
RD_DP_CNTL                 equ 016c0h
117
RD_DP_CNTL                 equ 016c0h
116
RD_DP_DATATYPE             equ 016c4h
118
RD_DP_DATATYPE             equ 016c4h
117
RD_DP_WRITE_MASK           equ 016cch
119
RD_DP_WRITE_MASK           equ 016cch
118
RD_DP_SRC_SOURCE_MEMORY    equ (2 shl 24)
120
RD_DP_SRC_SOURCE_MEMORY    equ (2 shl 24)
119
RD_DP_SRC_SOURCE_HOST_DATA equ (3 shl 24)
121
RD_DP_SRC_SOURCE_HOST_DATA equ (3 shl 24)
120
RD_DEFAULT_SC_BOTTOM_RIGHT equ 16e8h
122
RD_DEFAULT_SC_BOTTOM_RIGHT equ 16e8h
121
RD_GMC_BRUSH_SOLID_COLOR   equ (13 shl 4)
123
RD_GMC_BRUSH_SOLID_COLOR   equ (13 shl 4)
122
RD_DEFAULT_SC_RIGHT_MAX    equ 1fffh
124
RD_DEFAULT_SC_RIGHT_MAX    equ 1fffh
123
RD_DEFAULT_SC_BOTTOM_MAX   equ 1fff0000h
125
RD_DEFAULT_SC_BOTTOM_MAX   equ 1fff0000h
124
RD_GMC_DST_DATATYPE_SHIFT  equ 8
126
RD_GMC_DST_DATATYPE_SHIFT  equ 8
125
 
127
 
126
RD_ROP3_S                  equ 00cc0000h
128
RD_ROP3_S                  equ 00cc0000h
127
RD_ROP3_P                  equ 00f00000h
129
RD_ROP3_P                  equ 00f00000h
128
 
130
 
129
RD_RB2D_DSTCACHE_MODE      equ 03428h
131
RD_RB2D_DSTCACHE_MODE      equ 03428h
130
RD_RB2D_DSTCACHE_CTLSTAT   equ 0342ch
132
RD_RB2D_DSTCACHE_CTLSTAT   equ 0342ch
131
RD_RB2D_DC_FLUSH_ALL       equ 000fh
133
RD_RB2D_DC_FLUSH_ALL       equ 000fh
132
RD_RB2D_DC_BUSY            equ 80000000h
134
RD_RB2D_DC_BUSY            equ 80000000h
133
 
135
 
134
RD_GMC_BRUSH_SOLID_COLOR   equ 000000D0h
136
RD_GMC_BRUSH_SOLID_COLOR   equ 000000D0h
135
RD_GMC_SRC_DATATYPE_COLOR  equ (3 shl 12)
137
RD_GMC_SRC_DATATYPE_COLOR  equ (3 shl 12)
136
RD_GMC_CLR_CMP_CNTL_DIS    equ (1 shl 28)
138
RD_GMC_CLR_CMP_CNTL_DIS    equ (1 shl 28)
137
RD_GMC_WR_MSK_DIS          equ (1 shl 30)
139
RD_GMC_WR_MSK_DIS          equ (1 shl 30)
138
 
140
 
139
cmdSolidFill               equ 73f036d0h
141
cmdSolidFill               equ 73f036d0h
140
 
142
 
141
RD_DST_PITCH_OFFSET        equ 142ch
143
RD_DST_PITCH_OFFSET        equ 142ch
142
RD_SRC_PITCH_OFFSET        equ 1428h
144
RD_SRC_PITCH_OFFSET        equ 1428h
143
 
145
 
144
RD_DST_X_LEFT_TO_RIGHT     equ 1
146
RD_DST_X_LEFT_TO_RIGHT     equ 1
145
RD_DST_Y_TOP_TO_BOTTOM     equ 2
147
RD_DST_Y_TOP_TO_BOTTOM     equ 2
146
RD_DST_Y_X                 equ 1438h
148
RD_DST_Y_X                 equ 1438h
147
RD_DST_WIDTH_HEIGHT        equ 1598h
149
RD_DST_WIDTH_HEIGHT        equ 1598h
148
RD_DST_LINE_START          equ 1600h
150
RD_DST_LINE_START          equ 1600h
149
RD_DST_LINE_END            equ 1604h
151
RD_DST_LINE_END            equ 1604h
150
R300_MEM_NUM_CHANNELS_MASK equ 0003h
152
R300_MEM_NUM_CHANNELS_MASK equ 0003h
151
 
153
 
152
macro rdr op1, op2
154
macro rdr op1, op2
153
{
155
{
154
     mov edi, [ati_io]
156
     mov edi, [ati_io]
155
     mov op1, [edi+op2]
157
     mov op1, [edi+op2]
156
}
158
}
157
 
159
 
158
macro wrr dest, src
160
macro wrr dest, src
159
{
161
{
160
     mov edi, [ati_io]
162
     mov edi, [ati_io]
161
     mov dword [edi+dest], src
163
     mov dword [edi+dest], src
162
}
164
}
163
 
165
 
164
 
166
 
165
public START
167
public START
166
public service_proc
168
public service_proc
167
public version
169
public version
168
 
170
 
169
CURSOR_IMAGE_OFFSET  equ 0x00500000
171
CURSOR_IMAGE_OFFSET  equ 0x00500000
170
 
172
 
171
DRV_ENTRY equ 1
173
DRV_ENTRY equ 1
172
DRV_EXIT  equ -1
174
DRV_EXIT  equ -1
173
 
175
 
174
section '.flat' code readable align 16
176
section '.flat' code readable align 16
175
 
177
 
176
proc START stdcall, state:dword
178
proc START stdcall, state:dword
177
 
179
 
178
           cmp [state], 1
180
           cmp [state], 1
179
           jne .exit
181
           jne .exit
180
 
182
 
181
     if DEBUG
183
     if DEBUG
182
           mov esi, msgInit
184
           mov esi, msgInit
183
           call SysMsgBoardStr
185
           call SysMsgBoardStr
184
     end if
186
     end if
185
 
187
 
186
           call detect_ati
188
           call detect_ati
187
           test eax, eax
189
           test eax, eax
188
           jz .fail
190
           jz .fail
189
 
191
 
190
           call init_ati
192
           call init_ati
191
           test eax, eax
193
           test eax, eax
192
           jz .fail
194
           jz .fail
193
 
195
 
194
           or eax, -1
196
           or eax, -1
195
           mov [cursor_map], eax
197
           mov [cursor_map], eax
196
           mov [cursor_map+4], eax
198
           mov [cursor_map+4], eax
197
           mov edx, cursor_map
199
           mov edx, cursor_map
198
           mov [cursor_start], edx
200
           mov [cursor_start], edx
199
           add edx, 8
201
           add edx, 8
200
           mov [cursor_end], edx
202
           mov [cursor_end], edx
201
 
203
 
202
           stdcall RegService, sz_ati_srv, service_proc
204
           stdcall RegService, sz_ati_srv, service_proc
203
           test eax, eax
205
           test eax, eax
204
           jz .fail
206
           jz .fail
205
           mov dword [SetHwCursor], drvCursorPos ;enable hardware cursor
207
           mov dword [SetHwCursor], drvCursorPos ;enable hardware cursor
206
           mov dword [HwCursorRestore], drv_restore
208
           mov dword [HwCursorRestore], drv_restore
207
           mov dword [HwCursorCreate], ati_cursor
209
           mov dword [HwCursorCreate], ati_cursor
208
           ret
210
           ret
209
.fail:
211
.fail:
210
     if DEBUG
212
     if DEBUG
211
           mov esi, msgFail
213
           mov esi, msgFail
212
           call SysMsgBoardStr
214
           call SysMsgBoardStr
213
     end if
215
     end if
214
 
216
 
215
.exit:
217
.exit:
216
           xor eax, eax
218
           xor eax, eax
217
;           mov ebx, SetHwCursor
219
;           mov ebx, SetHwCursor
218
;           mov dword [ebx], eax    ;force disable hardware cursor
220
;           mov dword [ebx], eax    ;force disable hardware cursor
219
           ret
221
           ret
220
endp
222
endp
221
 
223
 
222
handle     equ  IOCTL.handle
224
handle     equ  IOCTL.handle
223
io_code    equ  IOCTL.io_code
225
io_code    equ  IOCTL.io_code
224
input      equ  IOCTL.input
226
input      equ  IOCTL.input
225
inp_size   equ  IOCTL.inp_size
227
inp_size   equ  IOCTL.inp_size
226
output     equ  IOCTL.output
228
output     equ  IOCTL.output
227
out_size   equ  IOCTL.out_size
229
out_size   equ  IOCTL.out_size
228
 
230
 
229
align 4
231
align 4
230
proc service_proc stdcall, ioctl:dword
232
proc service_proc stdcall, ioctl:dword
231
 
233
 
232
           mov edi, [ioctl]
-
 
233
           mov ebx, [edi+io_code]
234
           mov ebx, [ioctl]
234
           cmp ebx, VIDEO_FREE
235
           cmp [ebx+io_code], SRV_GETVERSION
235
           jne .fail
236
           jne .fail
-
 
237
 
-
 
238
           mov eax, [ebx+output]
-
 
239
           cmp [ebx+out_size], 4
236
 
240
           jne .fail
-
 
241
           mov [eax], dword API_VERSION
237
           mov eax, [edi+input]
242
           xor eax, eax
238
           call video_free
243
           ret
239
.fail:
244
.fail:
240
           or eax, -1
245
           or eax, -1
241
           ret
246
           ret
242
endp
247
endp
243
 
248
 
244
restore   handle
249
restore   handle
245
restore   io_code
250
restore   io_code
246
restore   input
251
restore   input
247
restore   inp_size
252
restore   inp_size
248
restore   output
253
restore   output
249
restore   out_size
254
restore   out_size
250
 
255
 
251
align 4
256
align 4
252
proc detect_ati
257
proc detect_ati
253
           locals
258
           locals
254
             last_bus dd ?
259
             last_bus dd ?
255
           endl
260
           endl
256
 
261
 
257
           xor eax, eax
262
           xor eax, eax
258
           mov [bus], eax
263
           mov [bus], eax
259
           inc eax
264
           inc eax
260
           call PciApi
265
           call PciApi
261
           cmp eax, -1
266
           cmp eax, -1
262
           je .err
267
           je .err
263
 
268
 
264
           mov [last_bus], eax
269
           mov [last_bus], eax
265
 
270
 
266
.next_bus:
271
.next_bus:
267
           and [devfn], 0
272
           and [devfn], 0
268
.next_dev:
273
.next_dev:
269
           stdcall PciRead32, [bus], [devfn], dword 0
274
           stdcall PciRead32, [bus], [devfn], dword 0
270
           test eax, eax
275
           test eax, eax
271
           jz .next
276
           jz .next
272
           cmp eax, -1
277
           cmp eax, -1
273
           je .next
278
           je .next
274
 
279
 
275
           mov edi, devices
280
           mov edi, devices
276
@@:
281
@@:
277
           mov ebx, [edi]
282
           mov ebx, [edi]
278
           test ebx, ebx
283
           test ebx, ebx
279
           jz .next
284
           jz .next
280
 
285
 
281
           cmp eax, ebx
286
           cmp eax, ebx
282
           je .found
287
           je .found
283
           add edi, 4
288
           add edi, 4
284
           jmp @B
289
           jmp @B
285
 
290
 
286
.next:
291
.next:
287
           inc [devfn]
292
           inc [devfn]
288
           cmp [devfn], 256
293
           cmp [devfn], 256
289
           jb  .next_dev
294
           jb  .next_dev
290
           mov eax, [bus]
295
           mov eax, [bus]
291
           inc eax
296
           inc eax
292
           mov [bus], eax
297
           mov [bus], eax
293
           cmp eax, [last_bus]
298
           cmp eax, [last_bus]
294
           jna .next_bus
299
           jna .next_bus
295
           xor eax, eax
300
           xor eax, eax
296
           ret
301
           ret
297
.found:
302
.found:
298
           xor eax, eax
303
           xor eax, eax
299
           inc eax
304
           inc eax
300
           ret
305
           ret
301
.err:
306
.err:
302
           xor eax, eax
307
           xor eax, eax
303
           ret
308
           ret
304
endp
309
endp
305
 
310
 
306
align 4
311
align 4
307
proc init_ati
312
proc init_ati
308
 
313
 
309
           stdcall AllocKernelSpace, dword 0x10000
314
           stdcall AllocKernelSpace, dword 0x10000
310
           test eax, eax
315
           test eax, eax
311
           jz .fail
316
           jz .fail
312
 
317
 
313
           mov [ati_io], eax
318
           mov [ati_io], eax
314
 
319
 
315
           stdcall PciRead32, [bus], [devfn], dword 0x18
320
           stdcall PciRead32, [bus], [devfn], dword 0x18
316
           and eax, 0xFFFF0000
321
           and eax, 0xFFFF0000
317
           mov esi, eax
322
           mov esi, eax
318
 
323
 
319
           mov edi, [ati_io]
324
           mov edi, [ati_io]
320
           mov edx, 16
325
           mov edx, 16
321
@@:
326
@@:
322
           stdcall MapPage,edi,esi,PG_SW+PG_NOCACHE
327
           stdcall MapPage,edi,esi,PG_SW+PG_NOCACHE
323
           add edi, 0x1000
328
           add edi, 0x1000
324
           add esi, 0x1000
329
           add esi, 0x1000
325
           dec edx
330
           dec edx
326
           jnz @B
331
           jnz @B
327
 
332
 
328
           mov edi, [ati_io]
333
           mov edi, [ati_io]
329
           mov dword [edi+RD_RB3D_CNTL], 0
334
           mov dword [edi+RD_RB3D_CNTL], 0
330
           call engRestore
335
           call engRestore
331
 
336
 
332
           mov edi, [ati_io]
337
           mov edi, [ati_io]
333
           mov eax, [edi+0x50]
338
           mov eax, [edi+0x50]
334
           mov ebx,3
339
           mov ebx,3
335
           shl ebx,20
340
           shl ebx,20
336
           not ebx
341
           not ebx
337
           and eax,ebx
342
           and eax,ebx
338
           mov ebx, 2
343
           mov ebx, 2
339
           shl ebx,20
344
           shl ebx,20
340
           or eax, ebx
345
           or eax, ebx
341
           mov [edi+0x50], eax
346
           mov [edi+0x50], eax
342
 
347
 
343
           call drvShowCursor
348
           call drvShowCursor
344
           xor eax, eax
349
           xor eax, eax
345
           inc eax
350
           inc eax
346
.fail:
351
.fail:
347
           ret
352
           ret
348
endp
353
endp
349
 
354
 
350
align 4
355
align 4
351
drv_restore:
356
drv_restore:
352
           ret 8
357
           ret 8
353
 
358
 
354
align 4
359
align 4
355
drvShowCursor:
360
drvShowCursor:
356
           mov edi, [ati_io]
361
           mov edi, [ati_io]
357
 
362
 
358
           mov eax, [edi+RD_CRTC_GEN_CNTL]
363
           mov eax, [edi+RD_CRTC_GEN_CNTL]
359
           bts eax,16
364
           bts eax,16
360
           mov [edi+RD_CRTC_GEN_CNTL], eax
365
           mov [edi+RD_CRTC_GEN_CNTL], eax
361
           ret
366
           ret
362
 
367
 
363
align 4
368
align 4
364
proc drvCursorPos stdcall, hcursor:dword, x:dword, y:dword
369
proc drvCursorPos stdcall, hcursor:dword, x:dword, y:dword
365
           pushfd
370
           pushfd
366
           cli
371
           cli
367
 
372
 
368
           xor eax, eax
373
           xor eax, eax
369
           xor edx, edx
374
           xor edx, edx
370
           mov esi, [hcursor]
375
           mov esi, [hcursor]
371
           mov ebx, [x]
376
           mov ebx, [x]
372
           mov ecx, [y]
377
           mov ecx, [y]
373
 
378
 
374
           sub ebx, [esi+CURSOR.hot_x]
379
           sub ebx, [esi+CURSOR.hot_x]
375
           jnc @F
380
           jnc @F
376
           neg ebx
381
           neg ebx
377
           mov eax, ebx
382
           mov eax, ebx
378
           shl eax, 16
383
           shl eax, 16
379
           xor ebx, ebx
384
           xor ebx, ebx
380
@@:
385
@@:
381
           sub ecx, [esi+CURSOR.hot_y]
386
           sub ecx, [esi+CURSOR.hot_y]
382
           jnc @F
387
           jnc @F
383
           neg ecx
388
           neg ecx
384
           mov ax, cx
389
           mov ax, cx
385
           mov edx, ecx
390
           mov edx, ecx
386
           xor ecx, ecx
391
           xor ecx, ecx
387
@@:
392
@@:
388
           or eax, 0x80000000
393
           or eax, 0x80000000
389
           wrr CUR_HORZ_VERT_OFF, eax
394
           wrr CUR_HORZ_VERT_OFF, eax
390
 
395
 
391
           shl ebx, 16
396
           shl ebx, 16
392
           mov bx, cx
397
           mov bx, cx
393
           or ebx, 0x80000000
398
           or ebx, 0x80000000
394
           wrr CUR_HORZ_VERT_POSN, ebx
399
           wrr CUR_HORZ_VERT_POSN, ebx
395
 
400
 
396
           shl edx, 8
401
           shl edx, 8
397
           add edx, [esi+CURSOR.base]
402
           add edx, [esi+CURSOR.base]
398
           sub edx, LFBAddress
403
           sub edx, LFBAddress
399
           wrr CUR_OFFSET, edx
404
           wrr CUR_OFFSET, edx
400
           popfd
405
           popfd
401
           ret
406
           ret
402
endp
407
endp
403
 
408
 
404
align 4
409
align 4
405
proc video_alloc
410
proc video_alloc
406
 
411
 
407
           pushfd
412
           pushfd
408
           cli
413
           cli
409
           mov ebx, [cursor_start]
414
           mov ebx, [cursor_start]
410
           mov ecx, [cursor_end]
415
           mov ecx, [cursor_end]
411
.l1:
416
.l1:
412
           bsf eax,[ebx];
417
           bsf eax,[ebx];
413
           jnz .found
418
           jnz .found
414
           add ebx,4
419
           add ebx,4
415
           cmp ebx, ecx
420
           cmp ebx, ecx
416
           jb .l1
421
           jb .l1
417
           popfd
422
           popfd
418
           xor eax,eax
423
           xor eax,eax
419
           ret
424
           ret
420
.found:
425
.found:
421
           btr [ebx], eax
426
           btr [ebx], eax
422
           popfd
427
           popfd
423
 
428
 
424
           mov [cursor_start],ebx
429
           mov [cursor_start],ebx
425
           sub ebx, cursor_map
430
           sub ebx, cursor_map
426
           lea eax,[eax+ebx*8]
431
           lea eax,[eax+ebx*8]
427
 
432
 
428
           shl eax,14
433
           shl eax,14
429
           add eax, LFBAddress+CURSOR_IMAGE_OFFSET
434
           add eax, LFBAddress+CURSOR_IMAGE_OFFSET
430
           ret
435
           ret
431
endp
436
endp
432
 
437
 
433
align 4
438
align 4
434
video_free:
439
video_free:
435
           pushfd
440
           pushfd
436
           cli
441
           cli
437
           sub eax, LFBAddress+CURSOR_IMAGE_OFFSET
442
           sub eax, LFBAddress+CURSOR_IMAGE_OFFSET
438
           shr eax, 14
443
           shr eax, 14
439
           mov ebx, cursor_map
444
           mov ebx, cursor_map
440
           bts [ebx], eax
445
           bts [ebx], eax
441
           shr eax, 3
446
           shr eax, 3
442
           and eax, not 3
447
           and eax, not 3
443
           add eax, ebx
448
           add eax, ebx
444
           cmp [cursor_start], eax
449
           cmp [cursor_start], eax
445
           ja @f
450
           ja @f
446
           popfd
451
           popfd
447
           ret
452
           ret
448
@@:
453
@@:
449
           mov [cursor_start], eax
454
           mov [cursor_start], eax
450
           popfd
455
           popfd
451
           ret
456
           ret
452
 
457
 
453
; param
458
; param
454
;  eax= pid
459
;  eax= pid
455
;  ebx= src
460
;  ebx= src
456
;  ecx= flags
461
;  ecx= flags
457
 
462
 
458
align 4
463
align 4
459
ati_cursor:
464
ati_cursor:
460
.src     equ esp
465
.src     equ esp
461
.flags   equ esp+4
466
.flags   equ esp+4
462
.hcursor equ esp+8
467
.hcursor equ esp+8
463
 
468
 
464
           sub esp, 4          ;space for .hcursor
469
           sub esp, 4          ;space for .hcursor
465
           push ecx
470
           push ecx
466
           push ebx
471
           push ebx
467
 
472
 
468
           mov ebx, eax
473
           mov ebx, eax
469
           mov eax, CURSOR_SIZE
474
           mov eax, CURSOR_SIZE
470
           call CreateObject
475
           call CreateObject
471
           test eax, eax
476
           test eax, eax
472
           jz .fail
477
           jz .fail
473
 
478
 
474
           mov [.hcursor],eax
479
           mov [.hcursor],eax
475
 
480
 
476
           xor ebx, ebx
481
           xor ebx, ebx
477
           mov [eax+CURSOR.magic], 'CURS'
482
           mov [eax+CURSOR.magic], 'CURS'
478
           mov [eax+CURSOR.destroy], destroy_cursor
483
           mov [eax+CURSOR.destroy], destroy_cursor
479
           mov [eax+CURSOR.hot_x], ebx
484
           mov [eax+CURSOR.hot_x], ebx
480
           mov [eax+CURSOR.hot_y], ebx
485
           mov [eax+CURSOR.hot_y], ebx
481
 
486
 
482
           call video_alloc
487
           call video_alloc
483
           mov edi, [.hcursor]
488
           mov edi, [.hcursor]
484
           mov [edi+CURSOR.base], eax
489
           mov [edi+CURSOR.base], eax
485
 
490
 
486
           mov esi, [.src]
491
           mov esi, [.src]
487
           mov ebx, [.flags]
492
           mov ebx, [.flags]
488
           cmp bx, LOAD_INDIRECT
493
           cmp bx, LOAD_INDIRECT
489
           je .indirect
494
           je .indirect
490
 
495
 
491
           movzx ecx, word [esi+10]
496
           movzx ecx, word [esi+10]
492
           movzx edx, word [esi+12]
497
           movzx edx, word [esi+12]
493
           mov [edi+CURSOR.hot_x], ecx
498
           mov [edi+CURSOR.hot_x], ecx
494
           mov [edi+CURSOR.hot_y], edx
499
           mov [edi+CURSOR.hot_y], edx
495
 
500
 
496
           stdcall ati_init_cursor, eax, esi
501
           stdcall ati_init_cursor, eax, esi
497
           mov eax, [.hcursor]
502
           mov eax, [.hcursor]
498
.fail:
503
.fail:
499
           add esp, 12
504
           add esp, 12
500
           ret
505
           ret
501
.indirect:
506
.indirect:
502
           shr ebx, 16
507
           shr ebx, 16
503
           movzx ecx, bh
508
           movzx ecx, bh
504
           movzx edx, bl
509
           movzx edx, bl
505
           mov [edi+CURSOR.hot_x], ecx
510
           mov [edi+CURSOR.hot_x], ecx
506
           mov [edi+CURSOR.hot_y], edx
511
           mov [edi+CURSOR.hot_y], edx
507
 
512
 
508
           mov edi, eax
513
           mov edi, eax
509
           mov ebx, eax
514
           mov ebx, eax
510
           mov ecx, 64*64
515
           mov ecx, 64*64
511
           xor eax,eax
516
           xor eax,eax
512
           cld
517
           cld
513
           rep stosd
518
           rep stosd
514
           mov edi, ebx
519
           mov edi, ebx
515
 
520
 
516
           mov esi, [.src]
521
           mov esi, [.src]
517
           mov ebx, 32
522
           mov ebx, 32
518
           cld
523
           cld
519
@@:
524
@@:
520
           mov ecx, 32
525
           mov ecx, 32
521
           rep movsd
526
           rep movsd
522
           add edi, 128
527
           add edi, 128
523
           dec ebx
528
           dec ebx
524
           jnz @B
529
           jnz @B
525
           mov eax, [.hcursor]
530
           mov eax, [.hcursor]
526
           add esp, 12
531
           add esp, 12
527
           ret
532
           ret
528
 
533
 
529
align 4
534
align 4
530
destroy_cursor:
535
destroy_cursor:
531
 
536
 
532
           push eax
537
           push eax
533
           mov eax, [eax+CURSOR.base]
538
           mov eax, [eax+CURSOR.base]
534
           call video_free
539
           call video_free
535
           pop eax
540
           pop eax
536
 
541
 
537
           call DestroyObject
542
           call DestroyObject
538
           ret
543
           ret
539
 
544
 
540
align 4
545
align 4
541
proc ati_init_cursor stdcall, dst:dword, src:dword
546
proc ati_init_cursor stdcall, dst:dword, src:dword
542
           locals
547
           locals
543
             rBase    dd ?
548
             rBase    dd ?
544
             pQuad    dd ?
549
             pQuad    dd ?
545
             pBits    dd ?
550
             pBits    dd ?
546
             pAnd     dd ?
551
             pAnd     dd ?
547
             width    dd ?
552
             width    dd ?
548
             height   dd ?
553
             height   dd ?
549
             counter  dd ?
554
             counter  dd ?
550
           endl
555
           endl
551
 
556
 
552
           mov esi, [src]
557
           mov esi, [src]
553
           add esi,[esi+18]
558
           add esi,[esi+18]
554
           mov eax,esi
559
           mov eax,esi
555
 
560
 
556
           cmp [esi+BI.biBitCount], 24
561
           cmp [esi+BI.biBitCount], 24
557
           je .img_24
562
           je .img_24
558
           cmp [esi+BI.biBitCount], 8
563
           cmp [esi+BI.biBitCount], 8
559
           je .img_8
564
           je .img_8
560
           cmp [esi+BI.biBitCount], 4
565
           cmp [esi+BI.biBitCount], 4
561
           je .img_4
566
           je .img_4
562
 
567
 
563
.img_2:
568
.img_2:
564
           add eax, [esi]
569
           add eax, [esi]
565
           mov [pQuad],eax
570
           mov [pQuad],eax
566
           add eax,8
571
           add eax,8
567
           mov [pBits],eax
572
           mov [pBits],eax
568
           add eax, 128
573
           add eax, 128
569
           mov [pAnd],eax
574
           mov [pAnd],eax
570
           mov eax,[esi+4]
575
           mov eax,[esi+4]
571
           mov [width],eax
576
           mov [width],eax
572
           mov ebx,[esi+8]
577
           mov ebx,[esi+8]
573
           shr ebx,1
578
           shr ebx,1
574
           mov [height],ebx
579
           mov [height],ebx
575
 
580
 
576
           mov edi, pCursor
581
           mov edi, pCursor
577
           add edi, 32*31*4
582
           add edi, 32*31*4
578
           mov [rBase],edi
583
           mov [rBase],edi
579
 
584
 
580
           mov esi,[pQuad]
585
           mov esi,[pQuad]
581
.l21:
586
.l21:
582
           mov ebx, [pBits]
587
           mov ebx, [pBits]
583
           mov ebx, [ebx]
588
           mov ebx, [ebx]
584
           bswap ebx
589
           bswap ebx
585
           mov eax, [pAnd]
590
           mov eax, [pAnd]
586
           mov eax, [eax]
591
           mov eax, [eax]
587
           bswap eax
592
           bswap eax
588
           mov [counter], 32
593
           mov [counter], 32
589
@@:
594
@@:
590
           xor edx, edx
595
           xor edx, edx
591
           shl eax,1
596
           shl eax,1
592
           setc dl
597
           setc dl
593
           dec edx
598
           dec edx
594
 
599
 
595
           xor ecx, ecx
600
           xor ecx, ecx
596
           shl ebx,1
601
           shl ebx,1
597
           setc cl
602
           setc cl
598
           mov ecx, [esi+ecx*4]
603
           mov ecx, [esi+ecx*4]
599
           and ecx, edx
604
           and ecx, edx
600
           and edx, 0xFF000000
605
           and edx, 0xFF000000
601
           or edx, ecx
606
           or edx, ecx
602
           mov [edi], edx
607
           mov [edi], edx
603
 
608
 
604
           add edi, 4
609
           add edi, 4
605
           dec [counter]
610
           dec [counter]
606
           jnz @B
611
           jnz @B
607
 
612
 
608
           add [pBits], 4
613
           add [pBits], 4
609
           add [pAnd], 4
614
           add [pAnd], 4
610
           mov edi,[rBase]
615
           mov edi,[rBase]
611
           sub edi,128
616
           sub edi,128
612
           mov [rBase],edi
617
           mov [rBase],edi
613
           sub [height],1
618
           sub [height],1
614
           jnz .l21
619
           jnz .l21
615
           jmp .copy
620
           jmp .copy
616
.img_4:
621
.img_4:
617
           add eax, [esi]
622
           add eax, [esi]
618
           mov [pQuad],eax
623
           mov [pQuad],eax
619
           add eax,64
624
           add eax,64
620
           mov [pBits],eax
625
           mov [pBits],eax
621
           add eax, 0x200
626
           add eax, 0x200
622
           mov [pAnd],eax
627
           mov [pAnd],eax
623
           mov eax,[esi+4]
628
           mov eax,[esi+4]
624
           mov [width],eax
629
           mov [width],eax
625
           mov ebx,[esi+8]
630
           mov ebx,[esi+8]
626
           shr ebx,1
631
           shr ebx,1
627
           mov [height],ebx
632
           mov [height],ebx
628
 
633
 
629
           mov edi, pCursor
634
           mov edi, pCursor
630
           add edi, 32*31*4
635
           add edi, 32*31*4
631
           mov [rBase],edi
636
           mov [rBase],edi
632
 
637
 
633
           mov esi,[pQuad]
638
           mov esi,[pQuad]
634
           mov ebx, [pBits]
639
           mov ebx, [pBits]
635
.l4:
640
.l4:
636
           mov eax, [pAnd]
641
           mov eax, [pAnd]
637
           mov eax, [eax]
642
           mov eax, [eax]
638
           bswap eax
643
           bswap eax
639
           mov [counter], 16
644
           mov [counter], 16
640
@@:
645
@@:
641
           xor edx, edx
646
           xor edx, edx
642
           shl eax,1
647
           shl eax,1
643
           setc dl
648
           setc dl
644
           dec edx
649
           dec edx
645
 
650
 
646
           movzx ecx, byte [ebx]
651
           movzx ecx, byte [ebx]
647
           and cl, 0xF0
652
           and cl, 0xF0
648
           shr ecx, 2
653
           shr ecx, 2
649
           mov ecx, [esi+ecx]
654
           mov ecx, [esi+ecx]
650
           and ecx, edx
655
           and ecx, edx
651
           and edx, 0xFF000000
656
           and edx, 0xFF000000
652
           or edx, ecx
657
           or edx, ecx
653
           mov [edi], edx
658
           mov [edi], edx
654
 
659
 
655
           xor edx, edx
660
           xor edx, edx
656
           shl eax,1
661
           shl eax,1
657
           setc dl
662
           setc dl
658
           dec edx
663
           dec edx
659
 
664
 
660
           movzx ecx, byte [ebx]
665
           movzx ecx, byte [ebx]
661
           and cl, 0x0F
666
           and cl, 0x0F
662
           mov ecx, [esi+ecx*4]
667
           mov ecx, [esi+ecx*4]
663
           and ecx, edx
668
           and ecx, edx
664
           and edx, 0xFF000000
669
           and edx, 0xFF000000
665
           or edx, ecx
670
           or edx, ecx
666
           mov [edi+4], edx
671
           mov [edi+4], edx
667
 
672
 
668
           inc ebx
673
           inc ebx
669
           add edi, 8
674
           add edi, 8
670
           dec [counter]
675
           dec [counter]
671
           jnz @B
676
           jnz @B
672
 
677
 
673
           add [pAnd], 4
678
           add [pAnd], 4
674
           mov edi,[rBase]
679
           mov edi,[rBase]
675
           sub edi,128
680
           sub edi,128
676
           mov [rBase],edi
681
           mov [rBase],edi
677
           sub [height],1
682
           sub [height],1
678
           jnz .l4
683
           jnz .l4
679
           jmp .copy
684
           jmp .copy
680
.img_8:
685
.img_8:
681
           add eax, [esi]
686
           add eax, [esi]
682
           mov [pQuad],eax
687
           mov [pQuad],eax
683
           add eax,1024
688
           add eax,1024
684
           mov [pBits],eax
689
           mov [pBits],eax
685
           add eax, 1024
690
           add eax, 1024
686
           mov [pAnd],eax
691
           mov [pAnd],eax
687
           mov eax,[esi+4]
692
           mov eax,[esi+4]
688
           mov [width],eax
693
           mov [width],eax
689
           mov ebx,[esi+8]
694
           mov ebx,[esi+8]
690
           shr ebx,1
695
           shr ebx,1
691
           mov [height],ebx
696
           mov [height],ebx
692
 
697
 
693
           mov edi, pCursor
698
           mov edi, pCursor
694
           add edi, 32*31*4
699
           add edi, 32*31*4
695
           mov [rBase],edi
700
           mov [rBase],edi
696
 
701
 
697
           mov esi,[pQuad]
702
           mov esi,[pQuad]
698
           mov ebx, [pBits]
703
           mov ebx, [pBits]
699
.l81:
704
.l81:
700
           mov eax, [pAnd]
705
           mov eax, [pAnd]
701
           mov eax, [eax]
706
           mov eax, [eax]
702
           bswap eax
707
           bswap eax
703
           mov [counter], 32
708
           mov [counter], 32
704
@@:
709
@@:
705
           xor edx, edx
710
           xor edx, edx
706
           shl eax,1
711
           shl eax,1
707
           setc dl
712
           setc dl
708
           dec edx
713
           dec edx
709
 
714
 
710
           movzx ecx,  byte [ebx]
715
           movzx ecx,  byte [ebx]
711
           mov ecx, [esi+ecx*4]
716
           mov ecx, [esi+ecx*4]
712
           and ecx, edx
717
           and ecx, edx
713
           and edx, 0xFF000000
718
           and edx, 0xFF000000
714
           or edx, ecx
719
           or edx, ecx
715
           mov [edi], edx
720
           mov [edi], edx
716
 
721
 
717
           inc ebx
722
           inc ebx
718
           add edi, 4
723
           add edi, 4
719
           dec [counter]
724
           dec [counter]
720
           jnz @B
725
           jnz @B
721
 
726
 
722
           add [pAnd], 4
727
           add [pAnd], 4
723
           mov edi,[rBase]
728
           mov edi,[rBase]
724
           sub edi,128
729
           sub edi,128
725
           mov [rBase],edi
730
           mov [rBase],edi
726
           sub [height],1
731
           sub [height],1
727
           jnz .l81
732
           jnz .l81
728
           jmp .copy
733
           jmp .copy
729
.img_24:
734
.img_24:
730
           add eax, [esi]
735
           add eax, [esi]
731
           mov [pQuad],eax
736
           mov [pQuad],eax
732
           add eax, 0xC00
737
           add eax, 0xC00
733
           mov [pAnd],eax
738
           mov [pAnd],eax
734
           mov eax,[esi+BI.biWidth]
739
           mov eax,[esi+BI.biWidth]
735
           mov [width],eax
740
           mov [width],eax
736
           mov ebx,[esi+BI.biHeight]
741
           mov ebx,[esi+BI.biHeight]
737
           shr ebx,1
742
           shr ebx,1
738
           mov [height],ebx
743
           mov [height],ebx
739
 
744
 
740
           mov edi, pCursor
745
           mov edi, pCursor
741
           add edi, 32*31*4
746
           add edi, 32*31*4
742
           mov [rBase],edi
747
           mov [rBase],edi
743
 
748
 
744
           mov esi,[pAnd]
749
           mov esi,[pAnd]
745
           mov ebx, [pQuad]
750
           mov ebx, [pQuad]
746
.row_24:
751
.row_24:
747
           mov eax, [esi]
752
           mov eax, [esi]
748
           bswap eax
753
           bswap eax
749
           mov [counter], 32
754
           mov [counter], 32
750
@@:
755
@@:
751
           xor edx, edx
756
           xor edx, edx
752
           shl eax,1
757
           shl eax,1
753
           setc dl
758
           setc dl
754
           dec edx
759
           dec edx
755
 
760
 
756
           mov ecx, [ebx]
761
           mov ecx, [ebx]
757
           and ecx, 0x00FFFFFF
762
           and ecx, 0x00FFFFFF
758
           and ecx, edx
763
           and ecx, edx
759
           and edx, 0xFF000000
764
           and edx, 0xFF000000
760
           or edx, ecx
765
           or edx, ecx
761
           mov [edi], edx
766
           mov [edi], edx
762
           add ebx, 3
767
           add ebx, 3
763
           add edi, 4
768
           add edi, 4
764
           dec [counter]
769
           dec [counter]
765
           jnz @B
770
           jnz @B
766
 
771
 
767
           add esi, 4
772
           add esi, 4
768
           mov edi,[rBase]
773
           mov edi,[rBase]
769
           sub edi,128
774
           sub edi,128
770
           mov [rBase],edi
775
           mov [rBase],edi
771
           sub [height],1
776
           sub [height],1
772
           jnz .row_24
777
           jnz .row_24
773
.copy:
778
.copy:
774
           mov edi, [dst]
779
           mov edi, [dst]
775
           mov ecx, 64*64
780
           mov ecx, 64*64
776
           xor eax,eax
781
           xor eax,eax
777
           rep stosd
782
           rep stosd
778
 
783
 
779
           mov esi, pCursor
784
           mov esi, pCursor
780
           mov edi, [dst]
785
           mov edi, [dst]
781
           mov ebx, 32
786
           mov ebx, 32
782
           cld
787
           cld
783
@@:
788
@@:
784
           mov ecx, 32
789
           mov ecx, 32
785
           rep movsd
790
           rep movsd
786
           add edi, 128
791
           add edi, 128
787
           dec ebx
792
           dec ebx
788
           jnz @B
793
           jnz @B
789
           ret
794
           ret
790
endp
795
endp
791
 
796
 
792
align 4
797
align 4
793
proc engFlush
798
proc engFlush
794
 
799
 
795
           mov edi, [ati_io]
800
           mov edi, [ati_io]
796
 
801
 
797
           mov eax, [edi+RD_RB2D_DSTCACHE_CTLSTAT]
802
           mov eax, [edi+RD_RB2D_DSTCACHE_CTLSTAT]
798
           or eax,RD_RB2D_DC_FLUSH_ALL
803
           or eax,RD_RB2D_DC_FLUSH_ALL
799
           mov [edi+RD_RB2D_DSTCACHE_CTLSTAT],eax
804
           mov [edi+RD_RB2D_DSTCACHE_CTLSTAT],eax
800
 
805
 
801
           mov ecx, RD_TIMEOUT
806
           mov ecx, RD_TIMEOUT
802
@@:
807
@@:
803
           mov eax,[edi+RD_RB2D_DSTCACHE_CTLSTAT]
808
           mov eax,[edi+RD_RB2D_DSTCACHE_CTLSTAT]
804
           and eax, RD_RB2D_DC_BUSY
809
           and eax, RD_RB2D_DC_BUSY
805
           jz .exit
810
           jz .exit
806
 
811
 
807
           sub ecx,1
812
           sub ecx,1
808
           jnz @B
813
           jnz @B
809
.exit:
814
.exit:
810
           ret
815
           ret
811
endp
816
endp
812
 
817
 
813
align 4
818
align 4
814
engWaitForFifo:
819
engWaitForFifo:
815
cnt equ bp+8
820
cnt equ bp+8
816
           push ebp
821
           push ebp
817
           mov ebp, esp
822
           mov ebp, esp
818
 
823
 
819
           mov edi, [ati_io]
824
           mov edi, [ati_io]
820
 
825
 
821
           mov ecx, RD_TIMEOUT
826
           mov ecx, RD_TIMEOUT
822
@@:
827
@@:
823
           mov eax, [edi+RD_RBBM_STATUS]
828
           mov eax, [edi+RD_RBBM_STATUS]
824
           and eax, RD_RBBM_FIFOCNT_MASK
829
           and eax, RD_RBBM_FIFOCNT_MASK
825
           cmp eax, [ebp+8]
830
           cmp eax, [ebp+8]
826
           jae .exit
831
           jae .exit
827
 
832
 
828
           sub ecx,1
833
           sub ecx,1
829
           jmp @B
834
           jmp @B
830
 
835
 
831
.exit:
836
.exit:
832
           leave
837
           leave
833
           ret 4
838
           ret 4
834
 
839
 
835
align 4
840
align 4
836
proc engWaitForIdle
841
proc engWaitForIdle
837
 
842
 
838
           push dword 64
843
           push dword 64
839
           call engWaitForFifo
844
           call engWaitForFifo
840
 
845
 
841
           mov edi, [ati_io]
846
           mov edi, [ati_io]
842
           mov ecx ,RD_TIMEOUT
847
           mov ecx ,RD_TIMEOUT
843
@@:
848
@@:
844
           mov eax, [edi+RD_RBBM_STATUS]
849
           mov eax, [edi+RD_RBBM_STATUS]
845
           and eax,RD_RBBM_ACTIVE
850
           and eax,RD_RBBM_ACTIVE
846
           jz .exit
851
           jz .exit
847
 
852
 
848
           sub ecx,1
853
           sub ecx,1
849
           jnz @B
854
           jnz @B
850
.exit:
855
.exit:
851
           call engFlush
856
           call engFlush
852
           ret
857
           ret
853
endp
858
endp
854
 
859
 
855
align 4
860
align 4
856
proc engRestore
861
proc engRestore
857
 
862
 
858
;             push dword 1
863
;             push dword 1
859
;             call engWaitForFifo
864
;             call engWaitForFifo
860
 
865
 
861
;             mov dword  [MMIO+RD_RB2D_DSTCACHE_MODE], 0
866
;             mov dword  [MMIO+RD_RB2D_DSTCACHE_MODE], 0
862
 
867
 
863
           push dword 3
868
           push dword 3
864
           call engWaitForFifo
869
           call engWaitForFifo
865
 
870
 
866
           mov edi, [ati_io]
871
           mov edi, [ati_io]
867
 
872
 
868
           mov eax, [edi+RD_DISPLAY_BASE_ADDR]
873
           mov eax, [edi+RD_DISPLAY_BASE_ADDR]
869
           shr eax, 10d
874
           shr eax, 10d
870
           or eax,(64d shl 22d)
875
           or eax,(64d shl 22d)
871
           mov [edi+RD_DEFAULT_OFFSET],eax
876
           mov [edi+RD_DEFAULT_OFFSET],eax
872
           mov [edi+RD_SRC_PITCH_OFFSET],eax
877
           mov [edi+RD_SRC_PITCH_OFFSET],eax
873
           mov [edi+RD_DST_PITCH_OFFSET],eax
878
           mov [edi+RD_DST_PITCH_OFFSET],eax
874
 
879
 
875
           push dword 1
880
           push dword 1
876
           call engWaitForFifo
881
           call engWaitForFifo
877
 
882
 
878
           mov edi, [ati_io]
883
           mov edi, [ati_io]
879
           mov eax, [edi+RD_DP_DATATYPE]
884
           mov eax, [edi+RD_DP_DATATYPE]
880
           btr eax, 29d
885
           btr eax, 29d
881
           mov [edi+RD_DP_DATATYPE],eax
886
           mov [edi+RD_DP_DATATYPE],eax
882
 
887
 
883
           push dword 1
888
           push dword 1
884
           call engWaitForFifo
889
           call engWaitForFifo
885
 
890
 
886
           mov edi, [ati_io]
891
           mov edi, [ati_io]
887
           mov dword [edi+RD_DEFAULT_SC_BOTTOM_RIGHT],\
892
           mov dword [edi+RD_DEFAULT_SC_BOTTOM_RIGHT],\
888
                     (RD_DEFAULT_SC_RIGHT_MAX or RD_DEFAULT_SC_BOTTOM_MAX)
893
                     (RD_DEFAULT_SC_RIGHT_MAX or RD_DEFAULT_SC_BOTTOM_MAX)
889
 
894
 
890
           push dword 1
895
           push dword 1
891
           call engWaitForFifo
896
           call engWaitForFifo
892
 
897
 
893
           mov edi, [ati_io]
898
           mov edi, [ati_io]
894
           mov dword [edi+RD_DP_GUI_MASTER_CNTL],\
899
           mov dword [edi+RD_DP_GUI_MASTER_CNTL],\
895
                     (RD_GMC_BRUSH_SOLID_COLOR or \
900
                     (RD_GMC_BRUSH_SOLID_COLOR or \
896
                      RD_GMC_SRC_DATATYPE_COLOR or \
901
                      RD_GMC_SRC_DATATYPE_COLOR or \
897
                     (6 shl RD_GMC_DST_DATATYPE_SHIFT) or \
902
                     (6 shl RD_GMC_DST_DATATYPE_SHIFT) or \
898
                      RD_GMC_CLR_CMP_CNTL_DIS or \
903
                      RD_GMC_CLR_CMP_CNTL_DIS or \
899
                      RD_ROP3_P or \
904
                      RD_ROP3_P or \
900
                      RD_GMC_WR_MSK_DIS)
905
                      RD_GMC_WR_MSK_DIS)
901
 
906
 
902
 
907
 
903
           push dword 7
908
           push dword 7
904
           call engWaitForFifo
909
           call engWaitForFifo
905
 
910
 
906
           mov edi, [ati_io]
911
           mov edi, [ati_io]
907
 
912
 
908
           mov dword [edi+RD_DST_LINE_START],0
913
           mov dword [edi+RD_DST_LINE_START],0
909
           mov dword [edi+RD_DST_LINE_END], 0
914
           mov dword [edi+RD_DST_LINE_END], 0
910
           mov dword [edi+RD_DP_BRUSH_FRGD_CLR], 808000ffh
915
           mov dword [edi+RD_DP_BRUSH_FRGD_CLR], 808000ffh
911
           mov dword [edi+RD_DP_BRUSH_BKGD_CLR], 002020ffh
916
           mov dword [edi+RD_DP_BRUSH_BKGD_CLR], 002020ffh
912
           mov dword [edi+RD_DP_SRC_FRGD_CLR],   808000ffh
917
           mov dword [edi+RD_DP_SRC_FRGD_CLR],   808000ffh
913
           mov dword [edi+RD_DP_SRC_BKGD_CLR],   004000ffh
918
           mov dword [edi+RD_DP_SRC_BKGD_CLR],   004000ffh
914
           mov dword [edi+RD_DP_WRITE_MASK],0ffffffffh
919
           mov dword [edi+RD_DP_WRITE_MASK],0ffffffffh
915
 
920
 
916
           call engWaitForIdle
921
           call engWaitForIdle
917
 
922
 
918
           ret
923
           ret
919
endp
924
endp
920
 
925
 
921
align 4
926
align 4
922
engSetupSolidFill:
927
engSetupSolidFill:
923
           push ebp
928
           push ebp
924
           mov ebp, esp
929
           mov ebp, esp
925
 
930
 
926
           push dword 3
931
           push dword 3
927
           call engWaitForFifo
932
           call engWaitForFifo
928
 
933
 
929
           wrr RD_DP_GUI_MASTER_CNTL, cmdSolidFill
934
           wrr RD_DP_GUI_MASTER_CNTL, cmdSolidFill
930
 
935
 
931
           mov eax, [ebp+8]
936
           mov eax, [ebp+8]
932
           wrr RD_DP_BRUSH_FRGD_CLR,eax
937
           wrr RD_DP_BRUSH_FRGD_CLR,eax
933
 
938
 
934
           mov edi, [ati_io]
939
           mov edi, [ati_io]
935
           mov dword [edi+RD_DP_CNTL],(RD_DST_X_LEFT_TO_RIGHT or RD_DST_Y_TOP_TO_BOTTOM)
940
           mov dword [edi+RD_DP_CNTL],(RD_DST_X_LEFT_TO_RIGHT or RD_DST_Y_TOP_TO_BOTTOM)
936
           leave
941
           leave
937
           ret 4
942
           ret 4
938
 
943
 
939
 
944
 
940
align 4
945
align 4
941
drvSolidFill:
946
drvSolidFill:
942
;x:word,y:word,w:word,h:word,color:dword
947
;x:word,y:word,w:word,h:word,color:dword
943
            push ebp
948
            push ebp
944
            mov ebp, esp
949
            mov ebp, esp
945
x equ ebp+8
950
x equ ebp+8
946
y equ ebp+12
951
y equ ebp+12
947
w equ ebp+16
952
w equ ebp+16
948
h equ ebp+20
953
h equ ebp+20
949
color equ ebp+24
954
color equ ebp+24
950
 
955
 
951
           push dword [ebp+24]
956
           push dword [ebp+24]
952
           call engSetupSolidFill
957
           call engSetupSolidFill
953
 
958
 
954
           push dword 2
959
           push dword 2
955
           call engWaitForFifo
960
           call engWaitForFifo
956
 
961
 
957
           mov edi, [ati_io]
962
           mov edi, [ati_io]
958
 
963
 
959
           mov eax, [y]
964
           mov eax, [y]
960
           mov ebx, [x]
965
           mov ebx, [x]
961
           shl eax,16
966
           shl eax,16
962
           or eax, ebx
967
           or eax, ebx
963
 
968
 
964
           mov ecx,  [w]
969
           mov ecx,  [w]
965
           mov edx,  [h]
970
           mov edx,  [h]
966
           shl ecx,16
971
           shl ecx,16
967
           or ecx, edx
972
           or ecx, edx
968
           mov [edi+RD_DST_Y_X], eax
973
           mov [edi+RD_DST_Y_X], eax
969
           mov [edi+RD_DST_WIDTH_HEIGHT], ecx
974
           mov [edi+RD_DST_WIDTH_HEIGHT], ecx
970
           call engFlush
975
           call engFlush
971
           leave
976
           leave
972
           ret 20
977
           ret 20
973
 
978
 
974
align 4
979
align 4
975
devices dd (R8500   shl 16)+VID_ATI
980
devices dd (R8500   shl 16)+VID_ATI
976
        dd (R9000   shl 16)+VID_ATI
981
        dd (R9000   shl 16)+VID_ATI
977
        dd (R9200   shl 16)+VID_ATI
982
        dd (R9200   shl 16)+VID_ATI
978
        dd (R9500   shl 16)+VID_ATI
983
        dd (R9500   shl 16)+VID_ATI
979
        dd (R9500P  shl 16)+VID_ATI
984
        dd (R9500P  shl 16)+VID_ATI
980
        dd (R9550   shl 16)+VID_ATI
985
        dd (R9550   shl 16)+VID_ATI
981
        dd (R9600   shl 16)+VID_ATI
986
        dd (R9600   shl 16)+VID_ATI
982
        dd (R9600XT shl 16)+VID_ATI
987
        dd (R9600XT shl 16)+VID_ATI
983
        dd (R9700P  shl 16)+VID_ATI
988
        dd (R9700P  shl 16)+VID_ATI
984
        dd (R9800   shl 16)+VID_ATI
989
        dd (R9800   shl 16)+VID_ATI
985
        dd (R9800P  shl 16)+VID_ATI
990
        dd (R9800P  shl 16)+VID_ATI
986
        dd (R9800XT shl 16)+VID_ATI
991
        dd (R9800XT shl 16)+VID_ATI
987
        dd 0    ;terminator
992
        dd 0    ;terminator
988
 
993
 
989
version dd 0x00040004
994
version      dd (5 shl 16) or (API_VERSION and 0xFFFF)
990
 
995
 
991
sz_ati_srv   db 'HWCURSOR',0
996
sz_ati_srv   db 'HWCURSOR',0
992
 
997
 
993
msgInit      db 'detect hardware...',13,10,0
998
msgInit      db 'detect hardware...',13,10,0
994
msgPCI       db 'PCI accsess not supported',13,10,0
999
msgPCI       db 'PCI accsess not supported',13,10,0
995
msgFail      db 'device not found',13,10,0
1000
msgFail      db 'device not found',13,10,0
996
msg_neg      db 'neg ecx',13,10,0
1001
msg_neg      db 'neg ecx',13,10,0
997
buff         db 8 dup(0)
1002
buff         db 8 dup(0)
998
             db 13,10, 0
1003
             db 13,10, 0
999
 
1004
 
1000
section '.data' data readable writable align 16
1005
section '.data' data readable writable align 16
1001
 
1006
 
1002
pCursor  db 4096 dup(?)
1007
pCursor  db 4096 dup(?)
1003
 
1008
 
1004
cursor_map     rd 2
1009
cursor_map     rd 2
1005
cursor_start   rd 1
1010
cursor_start   rd 1
1006
cursor_end     rd 1
1011
cursor_end     rd 1
1007
 
1012
 
1008
bus            dd ?
1013
bus            dd ?
1009
devfn          dd ?
1014
devfn          dd ?
1010
ati_io         dd ?
1015
ati_io         dd ?