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 ? |