Subversion Repositories Kolibri OS

Rev

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

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