Rev 2434 | Rev 2465 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
431 | serge | 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
||
3 | ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;; |
||
4 | ;; Distributed under terms of the GNU General Public License ;; |
||
5 | ;; ;; |
||
6 | ;; VGA.INC ;; |
||
7 | ;; ;; |
||
8 | ;; 640x480 mode 0x12 VGA functions for MenuetOS ;; |
||
9 | ;; ;; |
||
10 | ;; Paul Butcher, paul.butcher@asa.co.uk ;; |
||
11 | ;; ;; |
||
12 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
1 | ha | 13 | |
593 | mikedld | 14 | $Revision: 2439 $ |
1 | ha | 15 | |
2439 | Serge | 16 | ;------------------------------------------------------------------------------ |
17 | align 4 |
||
1 | ha | 18 | paletteVGA: |
19 | |||
20 | ;16 colour palette |
||
2434 | Serge | 21 | mov dx, 0x3c8 |
22 | mov al, 0 |
||
23 | out dx, al |
||
1 | ha | 24 | |
2434 | Serge | 25 | mov ecx, 16 |
26 | mov dx, 0x3c9 |
||
27 | xor eax, eax |
||
2439 | Serge | 28 | ;-------------------------------------- |
29 | align 4 |
||
30 | palvganew: |
||
2434 | Serge | 31 | mov al, 0 |
32 | test ah, 4 |
||
33 | jz palvgalbl1 |
||
34 | add al, 31 |
||
35 | test ah, 8 |
||
36 | jz palvgalbl1 |
||
37 | add al, 32 |
||
2439 | Serge | 38 | ;-------------------------------------- |
39 | align 4 |
||
40 | palvgalbl1: |
||
2434 | Serge | 41 | out dx, al; red 0,31 or 63 |
42 | mov al, 0 |
||
43 | test ah, 2 |
||
44 | jz palvgalbl2 |
||
45 | add al, 31 |
||
46 | test ah, 8 |
||
47 | jz palvgalbl2 |
||
48 | add al, 32 |
||
2439 | Serge | 49 | ;-------------------------------------- |
50 | align 4 |
||
51 | palvgalbl2: |
||
2434 | Serge | 52 | out dx, al; blue 0,31 or 63 |
53 | mov al, 0 |
||
54 | test ah, 1 |
||
55 | jz palvgalbl3 |
||
56 | add al, 31 |
||
57 | test ah, 8 |
||
58 | jz palvgalbl3 |
||
59 | add al, 32 |
||
2439 | Serge | 60 | ;-------------------------------------- |
61 | align 4 |
||
62 | palvgalbl3: |
||
2434 | Serge | 63 | out dx, al; green 0,31 or 63 |
64 | add ah, 1 |
||
65 | loop palvganew |
||
117 | mario79 | 66 | ; mov dx, 3ceh |
379 | serge | 67 | ; mov ax, 0005h |
68 | ; out dx, ax |
||
2434 | Serge | 69 | ret |
2439 | Serge | 70 | ;------------------------------------------------------------------------------ |
71 | align 4 |
||
117 | mario79 | 72 | palette320x200: |
2434 | Serge | 73 | mov edx, 0x3c8 |
74 | xor eax, eax |
||
75 | out dx, al |
||
76 | mov ecx, 256 |
||
77 | mov edx, 0x3c9 |
||
78 | xor eax, eax |
||
2439 | Serge | 79 | ;-------------------------------------- |
80 | align 4 |
||
81 | palnew: |
||
2434 | Serge | 82 | mov al, 0 |
83 | test ah, 64 |
||
84 | jz pallbl1 |
||
85 | add al, 21 |
||
2439 | Serge | 86 | ;-------------------------------------- |
87 | align 4 |
||
88 | pallbl1: |
||
2434 | Serge | 89 | test ah, 128 |
90 | jz pallbl2 |
||
91 | add al, 42 |
||
2439 | Serge | 92 | ;-------------------------------------- |
93 | align 4 |
||
94 | pallbl2: |
||
2434 | Serge | 95 | out dx, al |
96 | mov al, 0 |
||
97 | test ah, 8 |
||
98 | jz pallbl3 |
||
99 | add al, 8 |
||
2439 | Serge | 100 | ;-------------------------------------- |
101 | align 4 |
||
102 | pallbl3: |
||
2434 | Serge | 103 | test ah, 16 |
104 | jz pallbl4 |
||
105 | add al, 15 |
||
2439 | Serge | 106 | ;-------------------------------------- |
107 | align 4 |
||
108 | pallbl4: |
||
2434 | Serge | 109 | test ah, 32 |
110 | jz pallbl5 |
||
111 | add al, 40 |
||
2439 | Serge | 112 | ;-------------------------------------- |
113 | align 4 |
||
114 | pallbl5: |
||
2434 | Serge | 115 | out dx, al |
116 | mov al, 0 |
||
117 | test ah, 1 |
||
118 | jz pallbl6 |
||
119 | add al, 8 |
||
2439 | Serge | 120 | ;-------------------------------------- |
121 | align 4 |
||
122 | pallbl6: |
||
2434 | Serge | 123 | test ah, 2 |
124 | jz pallbl7 |
||
125 | add al, 15 |
||
2439 | Serge | 126 | ;-------------------------------------- |
127 | align 4 |
||
128 | pallbl7: |
||
2434 | Serge | 129 | test ah, 4 |
130 | jz pallbl8 |
||
131 | add al, 40 |
||
2439 | Serge | 132 | ;-------------------------------------- |
133 | align 4 |
||
134 | pallbl8: |
||
2434 | Serge | 135 | out dx, al |
136 | add ah, 1 |
||
137 | loop palnew |
||
138 | ret |
||
2439 | Serge | 139 | ;------------------------------------------------------------------------------ |
1168 | Lrz | 140 | align 4 |
117 | mario79 | 141 | uglobal |
142 | novesachecksum dd 0x0 |
||
143 | EGA_counter db 0 |
||
144 | VGA_drawing_screen db 0 |
||
379 | serge | 145 | VGA_8_pixels: |
117 | mario79 | 146 | rb 16 |
147 | temp: |
||
148 | .cx dd 0 |
||
149 | endg |
||
2439 | Serge | 150 | ;------------------------------------------------------------------------------ |
1168 | Lrz | 151 | align 4 |
117 | mario79 | 152 | checkVga_N13: |
2434 | Serge | 153 | cmp [SCR_MODE], dword 0x13 |
154 | jne @f |
||
1 | ha | 155 | |
117 | mario79 | 156 | pushad |
2434 | Serge | 157 | cmp [EGA_counter], 1 |
158 | je novesal |
||
159 | mov ecx, [MOUSE_X] |
||
160 | cmp ecx, [novesachecksum] |
||
161 | jne novesal |
||
117 | mario79 | 162 | popad |
2439 | Serge | 163 | ;-------------------------------------- |
164 | align 4 |
||
165 | @@: |
||
117 | mario79 | 166 | ret |
2439 | Serge | 167 | ;-------------------------------------- |
168 | align 4 |
||
169 | novesal: |
||
2434 | Serge | 170 | mov [novesachecksum], ecx |
171 | mov ecx, 0 |
||
172 | movzx eax, word [MOUSE_Y] |
||
173 | cmp eax, 100 |
||
174 | jge m13l3 |
||
175 | mov eax, 100 |
||
2439 | Serge | 176 | ;-------------------------------------- |
177 | align 4 |
||
178 | m13l3: |
||
2434 | Serge | 179 | cmp eax, 480-100 |
180 | jbe m13l4 |
||
181 | mov eax, 480-100 |
||
2439 | Serge | 182 | ;-------------------------------------- |
183 | align 4 |
||
184 | m13l4: |
||
2434 | Serge | 185 | sub eax, 100 |
186 | imul eax, 640*4 |
||
187 | add ecx, eax |
||
188 | movzx eax, word [MOUSE_X] |
||
189 | cmp eax, 160 |
||
190 | jge m13l1 |
||
191 | mov eax, 160 |
||
2439 | Serge | 192 | ;-------------------------------------- |
193 | align 4 |
||
194 | m13l1: |
||
2434 | Serge | 195 | cmp eax, 640-160 |
196 | jbe m13l2 |
||
197 | mov eax, 640-160 |
||
2439 | Serge | 198 | ;-------------------------------------- |
199 | align 4 |
||
200 | m13l2: |
||
2434 | Serge | 201 | sub eax, 160 |
202 | shl eax, 2 |
||
203 | add ecx, eax |
||
204 | mov esi, [LFBAddress] |
||
205 | add esi, ecx |
||
206 | mov edi, VGABasePtr |
||
207 | mov edx, 200 |
||
208 | mov ecx, 320 |
||
117 | mario79 | 209 | cld |
2439 | Serge | 210 | ;-------------------------------------- |
211 | align 4 |
||
212 | m13pix: |
||
117 | mario79 | 213 | lodsd |
2434 | Serge | 214 | test eax, eax |
215 | jz .save_pixel |
||
216 | push eax |
||
217 | mov ebx, eax |
||
218 | and eax, (128+64+32) ; blue |
||
219 | shr eax, 5 |
||
220 | and ebx, (128+64+32)*256; green |
||
221 | shr ebx, 8+2 |
||
222 | add eax, ebx |
||
223 | pop ebx |
||
224 | and ebx, (128+64)*256*256; red |
||
225 | shr ebx, 8+8 |
||
226 | add eax, ebx |
||
2439 | Serge | 227 | ;-------------------------------------- |
228 | align 4 |
||
229 | .save_pixel: |
||
117 | mario79 | 230 | stosb |
2434 | Serge | 231 | loop m13pix |
232 | mov ecx, 320 |
||
233 | add esi, 4*(640-320) |
||
234 | dec edx |
||
235 | jnz m13pix |
||
236 | mov [EGA_counter], 0 |
||
117 | mario79 | 237 | popad |
238 | ret |
||
2439 | Serge | 239 | ;------------------------------------------------------------------------------ |
240 | align 4 |
||
119 | mario79 | 241 | VGA_drawbackground: |
379 | serge | 242 | ; draw all |
117 | mario79 | 243 | pushad |
2434 | Serge | 244 | mov esi, [LFBAddress] |
245 | mov edi, VGABasePtr |
||
246 | mov ebx, 640/32; 640*480/(8*4) |
||
247 | mov edx, 480 |
||
2439 | Serge | 248 | ;-------------------------------------- |
249 | align 4 |
||
250 | @@: |
||
2434 | Serge | 251 | push ebx edx esi edi |
252 | shl edx, 9 |
||
253 | lea edx, [edx+edx*4] |
||
254 | add esi, edx |
||
255 | shr edx, 5 |
||
256 | add edi, edx |
||
257 | call VGA_draw_long_line |
||
258 | pop edi esi edx ebx |
||
259 | dec edx |
||
260 | jnz @r |
||
261 | call VGA_draw_long_line_1 |
||
117 | mario79 | 262 | popad |
263 | ret |
||
2439 | Serge | 264 | ;------------------------------------------------------------------------------ |
265 | align 4 |
||
117 | mario79 | 266 | VGA_draw_long_line: |
2434 | Serge | 267 | mov dx, 3ceh |
268 | mov ax, 0ff08h |
||
117 | mario79 | 269 | cli |
2434 | Serge | 270 | out dx, ax |
271 | mov ax, 0005h |
||
272 | out dx, ax |
||
2439 | Serge | 273 | ;-------------------------------------- |
274 | align 4 |
||
275 | m12pix: |
||
2434 | Serge | 276 | call VGA_draw_32_pixels |
277 | dec ebx |
||
278 | jnz m12pix |
||
279 | mov dx, 3c4h |
||
280 | mov ax, 0ff02h |
||
281 | out dx, ax |
||
282 | mov dx, 3ceh |
||
283 | mov ax, 0205h |
||
284 | out dx, ax |
||
285 | mov dx, 3ceh |
||
286 | mov al, 08h |
||
287 | out dx, al |
||
117 | mario79 | 288 | sti |
289 | ret |
||
2439 | Serge | 290 | ;------------------------------------------------------------------------------ |
291 | align 4 |
||
117 | mario79 | 292 | VGA_draw_32_pixels: |
2434 | Serge | 293 | xor eax, eax |
294 | mov ebp, VGA_8_pixels |
||
295 | mov [ebp], eax |
||
296 | mov [ebp+4], eax |
||
297 | mov [ebp+8], eax |
||
298 | mov [ebp+12], eax |
||
299 | mov ch, 4 |
||
2439 | Serge | 300 | ;-------------------------------------- |
301 | align 4 |
||
302 | .main_loop: |
||
2434 | Serge | 303 | mov cl, 8 |
2439 | Serge | 304 | ;-------------------------------------- |
305 | align 4 |
||
306 | .convert_pixels_to_VGA: |
||
117 | mario79 | 307 | lodsd ; eax = 24bit colour |
2434 | Serge | 308 | test eax, eax |
309 | jz .end |
||
310 | rol eax, 8 |
||
311 | mov al, ch |
||
312 | ror eax, 8 |
||
313 | mov ch, 1 |
||
314 | dec cl |
||
315 | shl ch, cl |
||
316 | cmp al, 85 |
||
119 | mario79 | 317 | jbe .p13green |
2434 | Serge | 318 | or [ebp], ch |
319 | cmp al, 170 |
||
119 | mario79 | 320 | jbe .p13green |
2434 | Serge | 321 | or [ebp+12], ch |
2439 | Serge | 322 | ;-------------------------------------- |
323 | align 4 |
||
324 | .p13green: |
||
2434 | Serge | 325 | cmp ah, 85 |
119 | mario79 | 326 | jbe .p13red |
2434 | Serge | 327 | or [ebp+4], ch |
328 | cmp ah, 170 |
||
119 | mario79 | 329 | jbe .p13red |
2434 | Serge | 330 | or [ebp+12], ch |
2439 | Serge | 331 | ;-------------------------------------- |
332 | align 4 |
||
333 | .p13red: |
||
2434 | Serge | 334 | shr eax, 8 |
335 | cmp ah, 85 |
||
119 | mario79 | 336 | jbe .p13cont |
2434 | Serge | 337 | or [ebp+8], ch |
338 | cmp ah, 170 |
||
119 | mario79 | 339 | jbe .p13cont |
2434 | Serge | 340 | or [ebp+12], ch |
2439 | Serge | 341 | ;-------------------------------------- |
342 | align 4 |
||
343 | .p13cont: |
||
2434 | Serge | 344 | ror eax, 8 |
345 | mov ch, ah |
||
346 | inc cl |
||
2439 | Serge | 347 | ;-------------------------------------- |
348 | align 4 |
||
349 | .end: |
||
2434 | Serge | 350 | dec cl |
351 | jnz .convert_pixels_to_VGA |
||
352 | inc ebp |
||
353 | dec ch |
||
354 | jnz .main_loop |
||
355 | push esi |
||
356 | sub ebp, 4 |
||
357 | mov esi, ebp |
||
358 | mov dx, 3c4h |
||
359 | mov ah, 1h |
||
2439 | Serge | 360 | ;-------------------------------------- |
361 | align 4 |
||
362 | @@: |
||
2434 | Serge | 363 | mov al, 02h |
364 | out dx, ax |
||
365 | xchg ax, bp |
||
117 | mario79 | 366 | lodsd |
2434 | Serge | 367 | mov [edi], eax |
368 | xchg ax, bp |
||
369 | shl ah, 1 |
||
370 | cmp ah, 10h |
||
371 | jnz @r |
||
372 | add edi, 4 |
||
373 | pop esi |
||
117 | mario79 | 374 | ret |
2439 | Serge | 375 | ;------------------------------------------------------------------------------ |
376 | align 4 |
||
1 | ha | 377 | VGA_putpixel: |
378 | ; eax = x |
||
379 | ; ebx = y |
||
2434 | Serge | 380 | mov ecx, eax |
117 | mario79 | 381 | mov eax, [esp+32-8+4] ; color |
2439 | Serge | 382 | ;-------------------------------------- |
383 | push ecx |
||
384 | shl ecx, 16 |
||
385 | mov cx, bx |
||
386 | ; check mouse area for putpixel |
||
387 | test eax, 0x04000000 |
||
388 | jnz @f |
||
389 | call [_display.check_mouse] |
||
390 | ;-------------------------------------- |
||
391 | align 4 |
||
392 | @@: |
||
393 | pop ecx |
||
2434 | Serge | 394 | shl ebx, 9 |
395 | lea ebx, [ebx+ebx*4] ; умножение на 5 |
||
117 | mario79 | 396 | lea edx, [ebx+ecx*4] ; + x*BytesPerPixel (Vesa2.0 32) |
2434 | Serge | 397 | mov edi, edx |
381 | serge | 398 | add edi, [LFBAddress] ; + LFB address |
117 | mario79 | 399 | mov [edi], eax ; write to LFB for Vesa2.0 |
2434 | Serge | 400 | shr edx, 5 ; change BytesPerPixel to 1/8 |
401 | mov edi, edx |
||
381 | serge | 402 | add edi, VGABasePtr ; address of pixel in VGA area |
2434 | Serge | 403 | and ecx, 0x07 ; bit no. (modulo 8) |
117 | mario79 | 404 | pushfd |
405 | ; edi = address, eax = 24bit colour, ecx = bit no. (modulo 8) |
||
2434 | Serge | 406 | xor edx, edx |
407 | test eax, eax |
||
408 | jz .p13cont |
||
409 | cmp al, 85 |
||
410 | jbe .p13green |
||
411 | or dl, 0x01 |
||
412 | cmp al, 170 |
||
413 | jbe .p13green |
||
414 | or dl, 0x08 |
||
2439 | Serge | 415 | ;-------------------------------------- |
416 | align 4 |
||
117 | mario79 | 417 | .p13green: |
2434 | Serge | 418 | cmp ah, 85 |
419 | jbe .p13red |
||
420 | or dl, 0x02 |
||
421 | cmp ah, 170 |
||
422 | jbe .p13red |
||
423 | or dl, 0x08 |
||
2439 | Serge | 424 | ;-------------------------------------- |
425 | align 4 |
||
379 | serge | 426 | .p13red: |
2434 | Serge | 427 | shr eax, 8 |
428 | cmp ah, 85 |
||
429 | jbe .p13cont |
||
430 | or dl, 0x04 |
||
431 | cmp ah, 170 |
||
432 | jbe .p13cont |
||
433 | or dl, 0x08 |
||
2439 | Serge | 434 | ;-------------------------------------- |
435 | align 4 |
||
117 | mario79 | 436 | .p13cont: |
2434 | Serge | 437 | ror edx, 8 |
438 | inc cl |
||
439 | xor eax, eax |
||
440 | inc ah |
||
441 | shr ax, cl |
||
442 | mov dx, 3cfh |
||
117 | mario79 | 443 | cli |
2434 | Serge | 444 | out dx, al |
445 | mov al, [edi] ; dummy read |
||
446 | rol edx, 8 |
||
447 | mov [edi], dl |
||
117 | mario79 | 448 | popfd |
449 | ret |
||
2439 | Serge | 450 | ;------------------------------------------------------------------------------ |
451 | align 4 |
||
117 | mario79 | 452 | VGA__putimage: |
453 | ; ecx = size [x|y] |
||
454 | ; edx = coordinates [x|y] |
||
2434 | Serge | 455 | pushad |
456 | rol edx, 16 |
||
457 | movzx eax, dx |
||
458 | rol edx, 16 |
||
459 | movzx ebx, dx |
||
460 | movzx edx, cx |
||
461 | rol ecx, 16 |
||
462 | movzx ecx, cx |
||
463 | call VGA_draw_bar_1 |
||
464 | popad |
||
465 | ret |
||
2439 | Serge | 466 | ;------------------------------------------------------------------------------ |
467 | align 4 |
||
117 | mario79 | 468 | VGA_draw_bar: |
469 | ; eax cx |
||
470 | ; ebx cy |
||
471 | ; ecx xe |
||
472 | ; edx ye |
||
2434 | Serge | 473 | pushad |
474 | sub ecx, eax |
||
475 | sub edx, ebx |
||
476 | and eax, 0xffff |
||
477 | and ebx, 0xffff |
||
478 | and ecx, 0xffff |
||
479 | and edx, 0xffff |
||
480 | call VGA_draw_bar_1 |
||
481 | popad |
||
482 | ret |
||
2439 | Serge | 483 | ;------------------------------------------------------------------------------ |
484 | align 4 |
||
117 | mario79 | 485 | VGA_draw_bar_1: |
2434 | Serge | 486 | mov [temp.cx], eax |
379 | serge | 487 | mov eax, [TASK_BASE] |
117 | mario79 | 488 | add ebx, [eax-twdw + 4] |
489 | mov eax, [eax-twdw + 0] |
||
490 | add eax, [temp.cx] |
||
2434 | Serge | 491 | and eax, 0xfff8 |
492 | shl ebx, 9 |
||
493 | lea ebx, [ebx+ebx*4]; умножение на 5 |
||
117 | mario79 | 494 | lea ebx, [ebx+eax*4] ; + x*BytesPerPixel (Vesa2.0 32) |
2434 | Serge | 495 | mov esi, ebx |
381 | serge | 496 | add esi, [LFBAddress] ; + LFB address |
2434 | Serge | 497 | shr ebx, 5 ; change BytesPerPixel to 1/8 |
498 | mov edi, ebx |
||
381 | serge | 499 | add edi, VGABasePtr ; address of pixel in VGA area |
2434 | Serge | 500 | mov ebx, ecx |
501 | shr ebx, 5 |
||
117 | mario79 | 502 | inc ebx |
2439 | Serge | 503 | ;-------------------------------------- |
504 | align 4 |
||
117 | mario79 | 505 | .main_loop: |
2434 | Serge | 506 | call VGA_draw_long_line_1 |
507 | dec edx |
||
508 | jnz .main_loop |
||
509 | call VGA_draw_long_line_1 |
||
117 | mario79 | 510 | ret |
2439 | Serge | 511 | ;------------------------------------------------------------------------------ |
512 | align 4 |
||
117 | mario79 | 513 | VGA_draw_long_line_1: |
2434 | Serge | 514 | push ebx edx esi edi |
515 | shl edx, 9 |
||
516 | lea edx, [edx+edx*4] |
||
517 | add esi, edx |
||
518 | shr edx, 5 |
||
519 | add edi, edx |
||
520 | call VGA_draw_long_line |
||
521 | pop edi esi edx ebx |
||
117 | mario79 | 522 | ret |
2439 | Serge | 523 | ;------------------------------------------------------------------------------ |