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