| 384 | } |
| 385 | |
| 386 | static void |
| 387 | vesa_WritePixel32(unsigned x, unsigned y, unsigned long color) |
| 388 | { |
| 389 | unsigned long offset = y * vesa_scan_line + x * vesa_pixel_bytes; |
| 390 | unsigned long addr; |
| 391 | unsigned i; |
| 392 | |
| 393 | if (vesa_segment != 0) { |
| 394 | /* Linear frame buffer in use */ |
| 395 | switch (vesa_pixel_size) { |
| 396 | case 8: |
| 397 | _farpokeb(vesa_segment, offset, color); |
| 398 | break; |
| 399 | |
| 400 | case 15: |
| 401 | case 16: |
| 402 | _farpokew(vesa_segment, offset, color); |
| 403 | break; |
| 404 | |
| 405 | case 24: |
| 406 | if (offset & 1) { |
| 407 | _farpokeb(vesa_segment, offset + 0, color & 0xFF); |
| 408 | _farpokew(vesa_segment, offset + 1, color >> 8); |
| 409 | } else { |
| 410 | _farpokew(vesa_segment, offset + 0, color & 0xFFFF); |
| 411 | _farpokeb(vesa_segment, offset + 2, color >> 16); |
| 412 | } |
| 413 | break; |
| 414 | |
| 415 | case 32: |
| 416 | _farpokel(vesa_segment, offset, color); |
| 417 | break; |
| 418 | |
| 419 | default: /* Shouldn't happen */ |
| 420 | color = 0; |
| 421 | break; |
| 422 | } |
| 423 | } else { |
| 424 | switch (vesa_pixel_size) { |
| 425 | case 8: |
| 426 | addr = vesa_SetWindow(vesa_write_win, offset); |
| 427 | _farpokeb(_dos_ds, addr, color); |
| 428 | break; |
| 429 | |
| 430 | case 15: |
| 431 | case 16: |
| 432 | addr = vesa_SetWindow(vesa_write_win, offset); |
| 433 | _farpokew(_dos_ds, addr, color); |
| 434 | break; |
| 435 | |
| 436 | case 24: |
| 437 | /* Pixel may cross a window boundary */ |
| 438 | for (i = 0; i < 3; ++i) { |
| 439 | addr = vesa_SetWindow(vesa_write_win, offset + i); |
| 440 | _farpokeb(_dos_ds, addr, (unsigned char) (color >> (i * 8))); |
| 441 | } |
| 442 | break; |
| 443 |
no test coverage detected