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