1bits 32 2 3section .text 4 5%define which [ebp+36] ; int which 6%define line [ebp+40] ; int line 7%define where [ebp+44] ; unsigned char *where 8 9%define vram [ebp+24] ; unsigned char *vram 10%define reg [ebp+28] ; unsigned char reg[0x20] 11%define highpal [ebp+32] ; unsigned int *highpal 12 13;%define cache_align times ($$-$) & 3 nop ; Align to 4-byte boundary 14;%define cache_align times ($$-$) & 7 nop ; Align to 8-byte boundary 15%define cache_align times ($$-$) & 31 nop ; Align to 32-byte boundary 16 17global asm_tiles_init 18global drawtile1_solid 19global drawtile1 20global drawtile2_solid 21global drawtile2 22global drawtile3_solid 23global drawtile3 24global drawtile4_solid 25global drawtile4 26 27; Neat utility macro 28%macro triple_xor 2 29 xor %1, %2 ; Triple XOR for a neat register exchange ;) 30 xor %2, %1 31 xor %1, %2 32%endmacro 33 34%macro blit_pixel1 1-* ; 8bpp blitting, solid 35 mov eax, ebx 36 and eax, %1 37 %if %0 > 1 38 shr eax, byte %2 39 %endif 40 or eax, [esi] 41 mov byte [edi], al 42 inc edi 43%endmacro 44 45%macro blit_pixel1_trans 1-* ; 8bpp blitting, transparent 46 mov eax, ebx 47 and eax, %1 48 jz %%trans 49 %if %0 > 1 50 shr eax, byte %2 51 %endif 52 or eax, [esi] 53 mov byte [edi], al 54 %%trans: 55 inc edi 56%endmacro 57 58%macro blit_pixel2 1-* ; 16bpp blitting, solid 59 mov eax, ebx 60 and eax, %1 61 %if %0 > 1 62 shr eax, byte %2 63 %endif 64 lea edx, [esi+eax*4] 65 mov eax, [edx] 66 mov word [edi], ax 67 add edi, byte 2 68%endmacro 69 70%macro blit_pixel2_trans 1-* ; 16bpp blitting, transparent 71 mov eax, ebx 72 and eax, %1 73 jz %%trans 74 %if %0 > 1 75 shr eax, byte %2 76 %endif 77 lea edx, [esi+eax*4] 78 mov eax, [edx] 79 mov word [edi], ax 80 %%trans: 81 add edi, byte 2 82%endmacro 83 84%macro blit_pixel3 1-* ; 24bpp blitting, solid 85 mov eax, ebx 86 and eax, %1 87 %if %0 > 1 88 shr eax, byte %2 89 %endif 90 lea edx, [esi+eax*4+1] 91 mov ax, word [edx] 92 mov word [edi], ax 93 add edi, 2 94 dec edx 95 mov al, byte [edx] 96 mov byte [edi], al 97 inc edi 98%endmacro 99 100%macro blit_pixel3_trans 1-* ; 24bpp blitting, transparent 101 mov eax, ebx 102 and eax, %1 103 jz %%trans 104 %if %0 > 1 105 shr eax, byte %2 106 %endif 107 lea edx, [esi+eax*4+1] 108 mov ax, word [edx] 109 mov word [edi], ax 110 add edi, 2 111 dec edx 112 mov al, byte [edx] 113 mov byte [edi], al 114 inc edi 115 jmp %%next 116 %%trans: 117 add edi, byte 3 118 %%next: 119%endmacro 120 121%macro blit_pixel4 1-* ; 32bpp blitting, solid 122 mov eax, ebx 123 and eax, %1 124 %if %0 > 1 125 shr eax, byte %2 126 %endif 127 lea edx, [esi+eax*4] 128 mov eax, [edx] 129 mov [edi], eax 130 add edi, byte 4 131%endmacro 132 133%macro blit_pixel4_trans 1-* ; 32bpp blitting, transparent 134 mov eax, ebx 135 and eax, %1 136 jz %%trans 137 %if %0 > 1 138 shr eax, byte %2 139 %endif 140 lea edx, [esi+eax*4] 141 mov eax, [edx] 142 mov [edi], eax 143 %%trans: 144 add edi, byte 4 145%endmacro 146 147; ---------------------------------------- 148; int _asm_tiles_init 149; (unsigned char *vram, unsigned char *reg, unsigned char *highpal) 150; ---------------------------------------- 151 152 cache_align 153 154asm_tiles_init: 155 156 push eax 157 push ebx 158 push edx 159 push esp 160 push ebp 161 mov ebp, esp 162 163 mov eax, vram 164 mov ebx, reg 165 mov edx, highpal 166 mov [__vram], eax 167 mov [__reg], ebx 168 mov [__highpal], edx 169 170 pop ebp 171 pop esp 172 pop edx 173 pop ebx 174 pop eax 175 176 ret 177 178 cache_align 179 180; ---------------------------------------- 181; int _drawtile1_solid 182; (int which, int line, unsigned char *where) 183; ---------------------------------------- 184 185 cache_align 186 187drawtile1_solid: 188 189 pushad 190 mov ebp, esp 191 192.setup: 193 194.get_pal: 195 196 mov ebx, which 197 mov esi, [__highpal] 198 mov eax, ebx 199 shr eax, byte 7 200 and eax, 0xc0 201 add esi, eax 202 mov edi, [__reg] 203 push esi 204 205.check_y_flip: 206 207 mov eax, ebx 208 xor ecx, ecx 209 mov edx, line 210 test eax, 0x1000 211 212 jz .check_interlace 213 214.y_flipped: 215 216 xor edx, byte 7 217 218 cache_align 219 220.check_interlace: 221 222 mov esi, [__reg] 223 mov cl, [esi+12] 224 mov esi, [__vram] 225 and eax, 0x7ff 226 test cl, byte 0x2 227 228 jz .no_interlace 229 230.interlace: 231 232 lea edx, [edx*8] 233 shl eax, 6 234 jmp .check_x_flip 235 236 cache_align 237 238.no_interlace: 239 240 lea edx, [edx*4] 241 shl eax, 5 242 243 cache_align 244 245.check_x_flip: 246 247 add eax, edx 248 mov edi, where 249 lea esi, [esi+eax] 250 mov ebx, [esi] 251 pop esi 252 mov eax, which 253 test eax, 0x800 254 255 jz near .x_not_flipped 256 257.x_flipped: 258 259 blit_pixel1 0x0f000000, 24 ; pixel 8 260 blit_pixel1 0xf0000000, 28 ; ..... 7 261 blit_pixel1 0x000f0000, 16 ; ..... 6 262 blit_pixel1 0x00f00000, 20 ; ..... 5 263 blit_pixel1 0x00000f00, 8 ; ..... 4 264 blit_pixel1 0x0000f000, 12 ; ..... 3 265 blit_pixel1 0x0000000f ; ..... 2 266 blit_pixel1 0x000000f0, 4 ; ..... 1 267 268 jmp .cleanup 269 270 cache_align 271 272.x_not_flipped: 273 274 blit_pixel1 0x000000f0, 4 ; pixel 1 275 blit_pixel1 0x0000000f ; ..... 2 276 blit_pixel1 0x0000f000, 12 ; ..... 3 277 blit_pixel1 0x00000f00, 8 ; ..... 4 278 blit_pixel1 0x00f00000, 20 ; ..... 5 279 blit_pixel1 0x000f0000, 16 ; ..... 6 280 blit_pixel1 0xf0000000, 28 ; ..... 7 281 blit_pixel1 0x0f000000, 24 ; ..... 8 282 283 cache_align 284 285.cleanup: 286 287 popad 288 289 ret 290 291 cache_align 292 293; ---------------------------------------- 294 295drawtile1: 296 297 pushad 298 mov ebp, esp 299 300.setup: 301 302.get_pal: 303 304 mov ebx, which 305 mov esi, [__highpal] 306 mov eax, ebx 307 shr eax, byte 7 308 and eax, 0xc0 309 add esi, eax 310 push esi 311 312.check_y_flip: 313 314 mov eax, ebx 315 xor ecx, ecx 316 mov edx, line 317 test eax, 0x1000 318 319 jz .check_interlace 320 321.y_flipped: 322 323 xor edx, byte 7 324 325 cache_align 326 327.check_interlace: 328 329 mov esi, [__reg] 330 mov cl, [esi+12] 331 mov esi, [__vram] 332 and eax, 0x7ff 333 test cl, byte 0x2 334 335 jz .no_interlace 336 337.interlace: 338 339 lea edx, [edx*8] 340 shl eax, 6 341 jmp .check_x_flip 342 343 cache_align 344 345.no_interlace: 346 347 lea edx, [edx*4] 348 shl eax, 5 349 350 cache_align 351 352.check_x_flip: 353 354 add eax, edx 355 mov edi, where 356 lea esi, [esi+eax] 357 mov ebx, [esi] 358 pop esi 359 test ebx, ebx 360 361 jz near .cleanup ; Don't waste time if the tile is blank! 362 363 mov eax, which 364 test eax, 0x800 365 366 jz near .x_not_flipped 367 368.x_flipped: 369 370 blit_pixel1_trans 0x0f000000, 24 ; pixel 8 371 blit_pixel1_trans 0xf0000000, 28 ; ..... 7 372 blit_pixel1_trans 0x000f0000, 16 ; ..... 6 373 blit_pixel1_trans 0x00f00000, 20 ; ..... 5 374 blit_pixel1_trans 0x00000f00, 8 ; ..... 4 375 blit_pixel1_trans 0x0000f000, 12 ; ..... 3 376 blit_pixel1_trans 0x0000000f ; ..... 2 377 blit_pixel1_trans 0x000000f0, 4 ; ..... 1 378 379 jmp .cleanup 380 381 cache_align 382 383.x_not_flipped: 384 385 blit_pixel1_trans 0x000000f0, 4 ; pixel 1 386 blit_pixel1_trans 0x0000000f ; ..... 2 387 blit_pixel1_trans 0x0000f000, 12 ; ..... 3 388 blit_pixel1_trans 0x00000f00, 8 ; ..... 4 389 blit_pixel1_trans 0x00f00000, 20 ; ..... 5 390 blit_pixel1_trans 0x000f0000, 16 ; ..... 6 391 blit_pixel1_trans 0xf0000000, 28 ; ..... 7 392 blit_pixel1_trans 0x0f000000, 24 ; ..... 8 393 394 cache_align 395 396.cleanup: 397 398 popad 399 400 ret 401 402 cache_align 403 404; ---------------------------------------- 405 406 cache_align 407 408drawtile2_solid: 409 410 pushad 411 mov ebp, esp 412 413.setup: 414 415.get_pal: 416 417 mov ebx, which 418 mov esi, [__highpal] 419 mov ecx, esi 420 mov eax, ebx 421 shr eax, byte 7 422 and eax, 0xc0 423 add esi, eax 424; - 425 mov edi, [__reg] 426 mov edx, [edi + 7] 427 push dword [esi] 428 and edx, 0x3f 429 mov eax, [ecx + edx*4] 430 mov [esi], eax 431; - 432 push esi 433 434.check_y_flip: 435 436 mov eax, ebx 437 xor ecx, ecx 438 mov edx, line 439 test eax, 0x1000 440 441 jz .check_interlace 442 443.y_flipped: 444 445 xor edx, byte 7 446 447 cache_align 448 449.check_interlace: 450 451 mov esi, [__reg] 452 mov cl, [esi+12] 453 mov esi, [__vram] 454 and eax, 0x7ff 455 test cl, byte 0x2 456 457 jz .no_interlace 458 459.interlace: 460 461 lea edx, [edx*8] 462 shl eax, 6 463 jmp .check_x_flip 464 465 cache_align 466 467.no_interlace: 468 469 lea edx, [edx*4] 470 shl eax, 5 471 472 cache_align 473 474.check_x_flip: 475 476 add eax, edx 477 mov edi, where 478 lea esi, [esi+eax] 479 mov ebx, [esi] 480 pop esi 481 mov eax, which 482 test eax, 0x800 483 484 jz near .x_not_flipped 485 486.x_flipped: 487 488 blit_pixel2 0x0f000000, 24 ; pixel 8 489 blit_pixel2 0xf0000000, 28 ; ..... 7 490 blit_pixel2 0x000f0000, 16 ; ..... 6 491 blit_pixel2 0x00f00000, 20 ; ..... 5 492 blit_pixel2 0x00000f00, 8 ; ..... 4 493 blit_pixel2 0x0000f000, 12 ; ..... 3 494 blit_pixel2 0x0000000f ; ..... 2 495 blit_pixel2 0x000000f0, 4 ; ..... 1 496 497 jmp .cleanup 498 499 cache_align 500 501.x_not_flipped: 502 503 blit_pixel2 0x000000f0, 4 ; pixel 1 504 blit_pixel2 0x0000000f ; ..... 2 505 blit_pixel2 0x0000f000, 12 ; ..... 3 506 blit_pixel2 0x00000f00, 8 ; ..... 4 507 blit_pixel2 0x00f00000, 20 ; ..... 5 508 blit_pixel2 0x000f0000, 16 ; ..... 6 509 blit_pixel2 0xf0000000, 28 ; ..... 7 510 blit_pixel2 0x0f000000, 24 ; ..... 8 511 512 cache_align 513 514.cleanup: 515 pop dword [esi] 516 popad 517 ret 518 519 cache_align 520 521; ---------------------------------------- 522 523 cache_align 524 525drawtile2: 526 527 pushad 528 mov ebp, esp 529 530.get_pal: 531 532 mov ebx, which 533 mov esi, [__highpal] 534 mov eax, ebx 535 shr eax, 7 536 and eax, 0xc0 537 add esi, eax 538 push esi 539 540.check_y_flip: 541 542 mov eax, ebx 543 xor ecx, ecx 544 mov edx, line 545 test eax, 0x1000 546 547 jz .check_interlace 548 549.y_flipped: 550 551 xor edx, byte 7 552 553 cache_align 554 555.check_interlace: 556 557 mov esi, [__reg] 558 mov cl, [esi+12] 559 mov esi, [__vram] 560 and eax, 0x7ff 561 test cl, byte 0x2 562 563 jz .no_interlace 564 565.interlace: 566 567 lea edx, [edx*8] 568 shl eax, 6 569 570 jmp .check_x_flip 571 572 cache_align 573 574.no_interlace: 575 lea edx, [edx*4] 576 shl eax, 5 577 578 cache_align 579 580.check_x_flip: 581 582 add eax, edx 583 mov edi, where 584 lea esi, [esi+eax] 585 mov ebx, [esi] 586 pop esi 587 test ebx, ebx 588 589 jz near .cleanup ; Don't waste time if the tile is blank! 590 591 mov eax, which 592 test eax, 0x800 593 594 jz near .x_not_flipped 595 596.x_flipped: 597 598 blit_pixel2_trans 0x0f000000, 24 ; pixel 8 599 blit_pixel2_trans 0xf0000000, 28 ; ..... 7 600 blit_pixel2_trans 0x000f0000, 16 ; ..... 6 601 blit_pixel2_trans 0x00f00000, 20 ; ..... 5 602 blit_pixel2_trans 0x00000f00, 8 ; ..... 4 603 blit_pixel2_trans 0x0000f000, 12 ; ..... 3 604 blit_pixel2_trans 0x0000000f ; ..... 2 605 blit_pixel2_trans 0x000000f0, 4 ; ..... 1 606 607 jmp .cleanup 608 609 cache_align 610 611.x_not_flipped: 612 613 blit_pixel2_trans 0x000000f0, 4 ; pixel 1 614 blit_pixel2_trans 0x0000000f ; ..... 2 615 blit_pixel2_trans 0x0000f000, 12 ; ..... 3 616 blit_pixel2_trans 0x00000f00, 8 ; ..... 4 617 blit_pixel2_trans 0x00f00000, 20 ; ..... 5 618 blit_pixel2_trans 0x000f0000, 16 ; ..... 6 619 blit_pixel2_trans 0xf0000000, 28 ; ..... 7 620 blit_pixel2_trans 0x0f000000, 24 ; ..... 8 621 622 cache_align 623 624.cleanup: 625 popad 626 ret 627 628 cache_align 629 630; ---------------------------------------- 631 632drawtile3_solid: 633 634 pushad 635 mov ebp, esp 636 637.setup: 638 639.get_pal: 640 641 mov ebx, which 642 mov esi, [__highpal] 643 mov ecx, esi 644 mov eax, ebx 645 shr eax, byte 7 646 and eax, 0xc0 647 add esi, eax 648; - 649 mov edi, [__reg] 650 mov edx, [edi + 7] 651 push dword [esi] 652 and edx, 0x3f 653 mov eax, [ecx + edx*4] 654 mov [esi], eax 655; - 656 push esi 657 658.check_y_flip: 659 660 mov eax, ebx 661 xor ecx, ecx 662 mov edx, line 663 test eax, 0x1000 664 665 jz .check_interlace 666 667.y_flipped: 668 669 xor edx, byte 7 670 671 cache_align 672 673.check_interlace: 674 675 mov esi, [__reg] 676 mov cl, [esi+12] 677 mov esi, [__vram] 678 and eax, 0x7ff 679 test cl, byte 0x2 680 681 jz .no_interlace 682 683.interlace: 684 685 lea edx, [edx*8] 686 shl eax, 6 687 jmp .check_x_flip 688 689 cache_align 690 691.no_interlace: 692 693 lea edx, [edx*4] 694 shl eax, 5 695 696 cache_align 697 698.check_x_flip: 699 700 add eax, edx 701 mov edi, where 702 lea esi, [esi+eax] 703 mov ebx, [esi] 704 pop esi 705 mov eax, which 706 test eax, 0x800 707 708 jz near .x_not_flipped 709 710.x_flipped: 711 712 blit_pixel3 0x0f000000, 24 ; pixel 8 713 blit_pixel3 0xf0000000, 28 ; ..... 7 714 blit_pixel3 0x000f0000, 16 ; ..... 6 715 blit_pixel3 0x00f00000, 20 ; ..... 5 716 blit_pixel3 0x00000f00, 8 ; ..... 4 717 blit_pixel3 0x0000f000, 12 ; ..... 3 718 blit_pixel3 0x0000000f ; ..... 2 719 blit_pixel3 0x000000f0, 4 ; ..... 1 720 721 jmp .cleanup 722 723 cache_align 724 725.x_not_flipped: 726 727 blit_pixel3 0x000000f0, 4 ; pixel 1 728 blit_pixel3 0x0000000f ; ..... 2 729 blit_pixel3 0x0000f000, 12 ; ..... 3 730 blit_pixel3 0x00000f00, 8 ; ..... 4 731 blit_pixel3 0x00f00000, 20 ; ..... 5 732 blit_pixel3 0x000f0000, 16 ; ..... 6 733 blit_pixel3 0xf0000000, 28 ; ..... 7 734 blit_pixel3 0x0f000000, 24 ; ..... 8 735 736 cache_align 737 738.cleanup: 739 740 pop dword [esi] 741 popad 742 ret 743 744 cache_align 745 746; ---------------------------------------- 747 748drawtile3: 749 750 pushad 751 mov ebp, esp 752 753.setup: 754 755.get_pal: 756 757 mov ebx, which 758 mov esi, [__highpal] 759 mov eax, ebx 760 shr eax, byte 7 761 and eax, 0xc0 762 add esi, eax 763 push esi 764 765.check_y_flip: 766 767 mov eax, ebx 768 xor ecx, ecx 769 mov edx, line 770 test eax, 0x1000 771 772 jz .check_interlace 773 774.y_flipped: 775 776 xor edx, byte 7 777 778 cache_align 779 780.check_interlace: 781 782 mov esi, [__reg] 783 mov cl, [esi+12] 784 mov esi, [__vram] 785 and eax, 0x7ff 786 test cl, byte 0x2 787 788 jz .no_interlace 789 790.interlace: 791 792 lea edx, [edx*8] 793 shl eax, 6 794 jmp .check_x_flip 795 796 cache_align 797 798.no_interlace: 799 800 lea edx, [edx*4] 801 shl eax, 5 802 803 cache_align 804 805.check_x_flip: 806 807 add eax, edx 808 mov edi, where 809 lea esi, [esi+eax] 810 mov ebx, [esi] 811 pop esi 812 test ebx, ebx 813 814 jz near .cleanup ; Don't waste time if the tile is blank! 815 816 mov eax, which 817 test eax, 0x800 818 819 jz near .x_not_flipped 820 821.x_flipped: 822 823 blit_pixel3_trans 0x0f000000, 24 ; pixel 8 824 blit_pixel3_trans 0xf0000000, 28 ; ..... 7 825 blit_pixel3_trans 0x000f0000, 16 ; ..... 6 826 blit_pixel3_trans 0x00f00000, 20 ; ..... 5 827 blit_pixel3_trans 0x00000f00, 8 ; ..... 4 828 blit_pixel3_trans 0x0000f000, 12 ; ..... 3 829 blit_pixel3_trans 0x0000000f ; ..... 2 830 blit_pixel3_trans 0x000000f0, 4 ; ..... 1 831 832 jmp .cleanup 833 834 cache_align 835 836.x_not_flipped: 837 838 blit_pixel3_trans 0x000000f0, 4 ; pixel 1 839 blit_pixel3_trans 0x0000000f ; ..... 2 840 blit_pixel3_trans 0x0000f000, 12 ; ..... 3 841 blit_pixel3_trans 0x00000f00, 8 ; ..... 4 842 blit_pixel3_trans 0x00f00000, 20 ; ..... 5 843 blit_pixel3_trans 0x000f0000, 16 ; ..... 6 844 blit_pixel3_trans 0xf0000000, 28 ; ..... 7 845 blit_pixel3_trans 0x0f000000, 24 ; ..... 8 846 847 cache_align 848 849.cleanup: 850 851 popad 852 853 ret 854 855 cache_align 856 857; ---------------------------------------- 858 859drawtile4_solid: 860 861 pushad 862 mov ebp, esp 863 864.setup: 865 866.get_pal: 867 868 mov ebx, which 869 mov esi, [__highpal] 870 mov ecx, esi 871 mov eax, ebx 872 shr eax, byte 7 873 and eax, 0xc0 874 add esi, eax 875; - 876 mov edi, [__reg] 877 mov edx, [edi + 7] 878 push dword [esi] 879 and edx, 0x3f 880 mov eax, [ecx + edx*4] 881 mov [esi], eax 882; - 883 push esi 884 885.check_y_flip: 886 887 mov eax, ebx 888 xor ecx, ecx 889 mov edx, line 890 test eax, 0x1000 891 892 jz .check_interlace 893 894.y_flipped: 895 896 xor edx, byte 7 897 898 cache_align 899 900.check_interlace: 901 902 mov esi, [__reg] 903 mov cl, [esi+12] 904 mov esi, [__vram] 905 and eax, 0x7ff 906 test cl, byte 0x2 907 908 jz .no_interlace 909 910.interlace: 911 912 lea edx, [edx*8] 913 shl eax, 6 914 jmp .check_x_flip 915 916 cache_align 917 918.no_interlace: 919 920 lea edx, [edx*4] 921 shl eax, 5 922 923 cache_align 924 925.check_x_flip: 926 927 add eax, edx 928 mov edi, where 929 lea esi, [esi+eax] 930 mov ebx, [esi] 931 pop esi 932 mov eax, which 933 test eax, 0x800 934 935 jz near .x_not_flipped 936 937.x_flipped: 938 939 blit_pixel4 0x0f000000, 24 ; pixel 8 940 blit_pixel4 0xf0000000, 28 ; ..... 7 941 blit_pixel4 0x000f0000, 16 ; ..... 6 942 blit_pixel4 0x00f00000, 20 ; ..... 5 943 blit_pixel4 0x00000f00, 8 ; ..... 4 944 blit_pixel4 0x0000f000, 12 ; ..... 3 945 blit_pixel4 0x0000000f ; ..... 2 946 blit_pixel4 0x000000f0, 4 ; ..... 1 947 948 jmp .cleanup 949 950 cache_align 951 952.x_not_flipped: 953 954 blit_pixel4 0x000000f0, 4 ; pixel 1 955 blit_pixel4 0x0000000f ; ..... 2 956 blit_pixel4 0x0000f000, 12 ; ..... 3 957 blit_pixel4 0x00000f00, 8 ; ..... 4 958 blit_pixel4 0x00f00000, 20 ; ..... 5 959 blit_pixel4 0x000f0000, 16 ; ..... 6 960 blit_pixel4 0xf0000000, 28 ; ..... 7 961 blit_pixel4 0x0f000000, 24 ; ..... 8 962 963 cache_align 964 965.cleanup: 966 967 pop dword [esi] 968 popad 969 ret 970 971 cache_align 972 973; ---------------------------------------- 974 975drawtile4: 976 977 pushad 978 mov ebp, esp 979 980.setup: 981 982.get_pal: 983 984 mov ebx, which 985 mov esi, [__highpal] 986 mov eax, ebx 987 shr eax, byte 7 988 and eax, 0xc0 989 add esi, eax 990 push esi 991 992.check_y_flip: 993 994 mov eax, ebx 995 xor ecx, ecx 996 mov edx, line 997 test eax, 0x1000 998 999 jz .check_interlace 1000 1001.y_flipped: 1002 1003 xor edx, byte 7 1004 1005 cache_align 1006 1007.check_interlace: 1008 1009 mov esi, [__reg] 1010 mov cl, [esi+12] 1011 mov esi, [__vram] 1012 and eax, 0x7ff 1013 test cl, byte 0x2 1014 1015 jz .no_interlace 1016 1017.interlace: 1018 1019 lea edx, [edx*8] 1020 shl eax, 6 1021 jmp .check_x_flip 1022 1023 cache_align 1024 1025.no_interlace: 1026 1027 lea edx, [edx*4] 1028 shl eax, 5 1029 1030 cache_align 1031 1032.check_x_flip: 1033 1034 add eax, edx 1035 mov edi, where 1036 lea esi, [esi+eax] 1037 mov ebx, [esi] 1038 pop esi 1039 test ebx, ebx 1040 1041 jz near .cleanup ; Don't waste time if the tile is blank! 1042 1043 mov eax, which 1044 test eax, 0x800 1045 1046 jz near .x_not_flipped 1047 1048.x_flipped: 1049 1050 blit_pixel4_trans 0x0f000000, 24 ; pixel 8 1051 blit_pixel4_trans 0xf0000000, 28 ; ..... 7 1052 blit_pixel4_trans 0x000f0000, 16 ; ..... 6 1053 blit_pixel4_trans 0x00f00000, 20 ; ..... 5 1054 blit_pixel4_trans 0x00000f00, 8 ; ..... 4 1055 blit_pixel4_trans 0x0000f000, 12 ; ..... 3 1056 blit_pixel4_trans 0x0000000f ; ..... 2 1057 blit_pixel4_trans 0x000000f0, 4 ; ..... 1 1058 1059 jmp .cleanup 1060 1061 cache_align 1062 1063.x_not_flipped: 1064 1065 blit_pixel4_trans 0x000000f0, 4 ; pixel 1 1066 blit_pixel4_trans 0x0000000f ; ..... 2 1067 blit_pixel4_trans 0x0000f000, 12 ; ..... 3 1068 blit_pixel4_trans 0x00000f00, 8 ; ..... 4 1069 blit_pixel4_trans 0x00f00000, 20 ; ..... 5 1070 blit_pixel4_trans 0x000f0000, 16 ; ..... 6 1071 blit_pixel4_trans 0xf0000000, 28 ; ..... 7 1072 blit_pixel4_trans 0x0f000000, 24 ; ..... 8 1073 1074 cache_align 1075 1076.cleanup: 1077 1078 popad 1079 1080 ret 1081 1082 cache_align 1083 1084section .data 1085 1086 __vram dd 0 1087 __reg dd 0 1088 __highpal dd 0 1089 1090; ---------------------------------------- 1091 1092%ifdef NASM_STACK_NOEXEC 1093section .note.GNU-stack noalloc noexec nowrite progbits 1094%endif 1095