Subversion Repositories Kolibri OS

Rev

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

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