1/*************************************************************************** 2 gfx.S - description 3 ------------------- 4 begin : Mon Mar 13 2000 5 copyright : (C) 2000 by Michael Speck 6 email : 7 ***************************************************************************/ 8 9/*************************************************************************** 10 * * 11 * This program is free software; you can redistribute it and/or modify * 12 * it under the terms of the GNU General Public License as published by * 13 * the Free Software Foundation; either version 2 of the License, or * 14 * (at your option) any later version. * 15 * * 16 ***************************************************************************/ 17 18.macro CrtStack 19 pushl %ebp 20 movl %esp, %ebp 21 pushl %ebx 22.endm 23 24 25 26.macro DelStack 27 popl %ebx 28 popl %ebp 29.endm 30 31 .data 32 .balign 16 33 34.globl rrShft 35rrShft: .byte 0 36.globl grShft 37grShft: .byte 0 38.globl brShft 39brShft: .byte 0 40.globl rlShft 41rlShft: .byte 0 42.globl glShft 43glShft: .byte 0 44.globl blShft 45blShft: .byte 0 46.globl rMask 47rMask: .long 0 48.globl gMask 49gMask: .long 0 50.globl bMask 51bMask: .long 0 52.globl bpp 53bpp: .byte 0 54.globl pixelsize 55pixelsize: .byte 0 56.globl clp_lx 57clp_lx: .long 0 58.globl clp_ty 59clp_ty: .long 0 60.globl clp_rx 61clp_rx: .long 0 62.globl clp_by 63clp_by: .long 0 64 65 .text 66 .balign 16 67 68.globl SD_Pnt 69SD_Pnt: 70 CrtStack 71 72 //x < lx 73 movl clp_lx, %eax 74 cmp %eax, 16(%ebp) 75 jl 9f 76 //y < ty 77 movl clp_ty, %eax 78 cmp %eax, 20(%ebp) 79 jl 9f 80 //x > rx 81 movl clp_rx, %eax 82 cmp %eax, 16(%ebp) 83 jg 9f 84 //y > ry 85 subl clp_by, %eax 86 cmp %eax, 20(%ebp) 87 jg 9f 88 89 xorw %bx, %bx 90 movb 26(%ebp), %bl //get red part 91 movb rrShft, %cl 92 shrb %cl, %bl 93 movb rlShft, %cl 94 shlw %cl, %bx 95 96 xorw %ax, %ax 97 movb 25(%ebp), %al //get green part 98 movb grShft, %cl 99 shrb %cl, %al 100 movb glShft, %cl 101 shlw %cl, %ax 102 orw %ax, %bx 103 104 xorw %ax, %ax 105 movb 24(%ebp), %al //get blue part 106 movb brShft, %cl 107 shrb %cl, %al 108 movb blShft, %cl 109 shlw %cl, %ax 110 orw %ax, %bx //wordvalue in bx 111 112 movl 20(%ebp), %eax //y 113 movl 12(%ebp), %ecx //w 114 mull %ecx 115 addl 16(%ebp), %eax //offset in eax 116 117 movl 8(%ebp), %ecx 118 movw %bx, (%ecx,%eax,2) 119 1209: 121 DelStack 122 ret 123 124 125.globl SD_Box 126SD_Box: 127 CrtStack 128 pushl %edi 129 130 //x < lx ? 131 movl clp_lx, %eax 132 cmpl %eax, 16(%ebp) 133 jge 0f 134 movl 16(%ebp), %ebx 135 subl %ebx, %eax 136 subl %eax, 24(%ebp) 137 movl clp_lx, %eax 138 movl %eax, 16(%ebp) 1390: 140 //y < ty ? 141 movl clp_ty, %eax 142 cmp %eax, 20(%ebp) 143 jge 1f 144 movl 20(%ebp), %ebx 145 subl %ebx, %eax 146 subl %eax, 28(%ebp) 147 movl clp_ty, %eax 148 movl %eax, 20(%ebp) 1491: 150 //x > rx 151 movl clp_rx, %eax 152 movl 16(%ebp), %ebx 153 addl 24(%ebp), %ebx 154 subl $1, %ebx 155 cmp %eax, %ebx 156 jle 2f 157 movl clp_rx, %ebx 158 movl 16(%ebp), %eax 159 subl %eax, %ebx 160 addl $1, %ebx 161 movl %ebx, 24(%ebp) 1622: 163 //y > ty 164 movl clp_by, %eax 165 movl 20(%ebp), %ebx 166 subl $1, %ebx 167 addl 28(%ebp), %ebx 168 cmp %eax, %ebx 169 jle 3f 170 movl clp_by, %ebx 171 movl 20(%ebp), %eax 172 subl %eax, %ebx 173 addl $1, %ebx 174 movl %ebx, 28(%ebp) 1753: 176 177 //valid w? 178 movl 24(%ebp), %eax 179 cmpl $0, %eax 180 jle 4f 181 //valid h? 182 movl 28(%ebp), %eax 183 cmpl $0, %eax 184 jle 4f 185 186 xorw %bx, %bx 187 movb 34(%ebp), %bl //get red part 188 movb rrShft, %cl 189 shrb %cl, %bl 190 movb rlShft, %cl 191 shlw %cl, %bx 192 193 xorw %ax, %ax 194 movb 33(%ebp), %al //get green part 195 movb grShft, %cl 196 shrb %cl, %al 197 movb glShft, %cl 198 shlw %cl, %ax 199 orw %ax, %bx 200 201 xorw %ax, %ax 202 movb 32(%ebp), %al //get blue part 203 movb brShft, %cl 204 shrb %cl, %al 205 movb blShft, %cl 206 shlw %cl, %ax 207 orw %bx, %ax //wordvalue in ax 208 pushw %ax; 209 210 movl 20(%ebp), %eax //load y_pos 211 mull 12(%ebp) 212 addl 16(%ebp), %eax 213 movl %eax, %edi 214 shll $1, %edi //offset in lpdest 215 addl 8(%ebp), %edi //add lpdest_EA 216 217 pushl %ds 218 popl %es 219 220 movl 28(%ebp), %edx //get height 221 222 movl 12(%ebp), %ebx 223 subl 24(%ebp), %ebx 224 shll $1, %ebx //edi add-on 225 226 popw %ax 227lp: 228 movl 24(%ebp), %ecx 229 rep; stosw 230 addl %ebx, %edi 231 decl %edx 232 jnz lp 233 2344: 235 popl %edi 236 DelStack 237 ret 238 239 240.globl SD_Rct 241SD_Rct: 242 CrtStack 243 pushl %edi 244 245 //x < lx ? 246 movl clp_lx, %eax 247 cmpl %eax, 16(%ebp) 248 jge 0f 249 movl 16(%ebp), %ebx 250 subl %ebx, %eax 251 subl %eax, 24(%ebp) 252 movl clp_lx, %eax 253 movl %eax, 16(%ebp) 2540: 255 //y < ty ? 256 movl clp_ty, %eax 257 cmp %eax, 20(%ebp) 258 jge 1f 259 movl 20(%ebp), %ebx 260 subl %ebx, %eax 261 subl %eax, 28(%ebp) 262 movl clp_ty, %eax 263 movl %eax, 20(%ebp) 2641: 265 //x > rx 266 movl clp_rx, %eax 267 movl 16(%ebp), %ebx 268 addl 24(%ebp), %ebx 269 subl $1, %ebx 270 cmp %eax, %ebx 271 jle 2f 272 movl clp_rx, %ebx 273 movl 16(%ebp), %eax 274 subl %eax, %ebx 275 addl $1, %ebx 276 movl %ebx, 24(%ebp) 2772: 278 //y > ty 279 movl clp_by, %eax 280 movl 20(%ebp), %ebx 281 subl $1, %ebx 282 addl 28(%ebp), %ebx 283 cmp %eax, %ebx 284 jle 3f 285 movl clp_by, %ebx 286 movl 20(%ebp), %eax 287 subl %eax, %ebx 288 addl $1, %ebx 289 movl %ebx, 28(%ebp) 2903: 291 292 //valid w? 293 movl 24(%ebp), %eax 294 cmpl $0, %eax 295 jle 4f 296 //valid h? 297 movl 28(%ebp), %eax 298 cmpl $0, %eax 299 jle 4f 300 301 xorw %bx, %bx 302 movb 34(%ebp), %bl //get red part 303 movb rrShft, %cl 304 shrb %cl, %bl 305 movb rlShft, %cl 306 shlw %cl, %bx 307 308 xorw %ax, %ax 309 movb 33(%ebp), %al //get green part 310 movb grShft, %cl 311 shrb %cl, %al 312 movb glShft, %cl 313 shlw %cl, %ax 314 orw %ax, %bx 315 316 xorw %ax, %ax 317 movb 32(%ebp), %al //get blue part 318 movb brShft, %cl 319 shrb %cl, %al 320 movb blShft, %cl 321 shlw %cl, %ax 322 orw %bx, %ax //wordvalue in ax 323 pushw %ax; 324 325 movl 20(%ebp), %eax //load y_pos 326 mull 12(%ebp) 327 addl 16(%ebp), %eax 328 movl %eax, %edi 329 shll $1, %edi //offset in lpdest 330 addl 8(%ebp), %edi //add lpdest_EA 331 332 pushl %ds 333 popl %es 334 335 movl 28(%ebp), %edx //get height 336 subl $2, %edx 337 338 movl 12(%ebp), %ebx 339 subl 24(%ebp), %ebx 340 shll $1, %ebx //edi add-on 341 342 popw %ax 343 movl 24(%ebp), %ecx 344 rep; stosw 345 addl %ebx, %edi 346 347 cmp $0, %edx 348 jle 9f 349lp2: 350 movw %ax, (%edi) 351 movl 24(%ebp), %ecx 352 subl $1, %ecx 353 shll $1, %ecx 354 addl %ecx, %edi; 355 movw %ax, (%edi) 356 addl $2, %edi; 357 addl %ebx, %edi 358 decl %edx 359 jnz lp2 360 3619: 362 movl 24(%ebp), %ecx 363 rep; stosw 364 3654: 366 popl %edi 367 DelStack 368 ret 369 370.globl SD_CBx 371SD_CBx: 372 CrtStack 373 pushl %edi 374 375 //x < lx ? 376 movl clp_lx, %eax 377 cmpl %eax, 16(%ebp) 378 jge 0f 379 movl 16(%ebp), %ebx 380 subl %ebx, %eax 381 subl %eax, 24(%ebp) 382 movl clp_lx, %eax 383 movl %eax, 16(%ebp) 3840: 385 //y < ty ? 386 movl clp_ty, %eax 387 cmp %eax, 20(%ebp) 388 jge 1f 389 movl 20(%ebp), %ebx 390 subl %ebx, %eax 391 subl %eax, 28(%ebp) 392 movl clp_ty, %eax 393 movl %eax, 20(%ebp) 3941: 395 //x > rx 396 movl clp_rx, %eax 397 movl 16(%ebp), %ebx 398 addl 24(%ebp), %ebx 399 subl $1, %ebx 400 cmp %eax, %ebx 401 jle 2f 402 movl clp_rx, %ebx 403 movl 16(%ebp), %eax 404 subl %eax, %ebx 405 addl $1, %ebx 406 movl %ebx, 24(%ebp) 4072: 408 //y > ty 409 movl clp_by, %eax 410 movl 20(%ebp), %ebx 411 subl $1, %ebx 412 addl 28(%ebp), %ebx 413 cmp %eax, %ebx 414 jle 3f 415 movl clp_by, %ebx 416 movl 20(%ebp), %eax 417 subl %eax, %ebx 418 addl $1, %ebx 419 movl %ebx, 28(%ebp) 4203: 421 422 //valid w? 423 movl 24(%ebp), %eax 424 cmpl $0, %eax 425 jle 4f 426 //valid h? 427 movl 28(%ebp), %eax 428 cmpl $0, %eax 429 jle 4f 430 431 xorl %edi, %edi 432 xorl %eax, %eax 433 434 //edi destination 435 pushl %ds 436 popl %es 437 movl 20(%ebp), %eax 438 mull 12(%ebp) 439 addl 16(%ebp), %eax 440 shll $1, %eax 441 addl 8(%ebp), %eax 442 movl %eax, %edi //dest offset in edi 443 444 movl 28(%ebp), %edx //height 445outerl5: 446 movl 24(%ebp), %ecx //width 447 pushl %edx 448innerl5: 449 pushl %ecx 450 451 xor %eax, %eax 452 movb 34(%ebp), %al 453 movb rrShft, %cl 454 shrb %cl, %al 455 mull 36(%ebp) 456 movb rlShft, %cl 457 shll %cl, %eax 458 pushl %eax //relative red source part 459 movl (%edi), %eax 460 andl rMask, %eax 461 shrl %cl, %eax 462 movl $100, %ebx 463 subl 36(%ebp), %ebx 464 mull %ebx 465 shll %cl, %eax //relative red dest part 466 popl %ebx 467 addl %ebx, %eax 468 movl $100, %ebx 469 divl %ebx 470 andl rMask, %eax 471 pushl %eax 472 473 xor %eax, %eax 474 movb 33(%ebp), %al 475 movb grShft, %cl 476 shrb %cl, %al 477 mull 36(%ebp) 478 movb glShft, %cl 479 shll %cl, %eax 480 pushl %eax //relative green source part 481 movl (%edi), %eax 482 andl gMask, %eax 483 shrl %cl, %eax 484 movl $100, %ebx 485 subl 36(%ebp), %ebx 486 mull %ebx 487 shll %cl, %eax //relative green dest part 488 popl %ebx 489 addl %ebx, %eax 490 movl $100, %ebx 491 divl %ebx 492 andl gMask, %eax 493 pushl %eax 494 495 xor %eax, %eax 496 movb 32(%ebp), %al 497 movb brShft, %cl 498 shrb %cl, %al 499 mull 36(%ebp) 500 movb blShft, %cl 501 shll %cl, %eax 502 pushl %eax //relative blue source part 503 movl (%edi), %eax 504 andl bMask, %eax 505 shrl %cl, %eax 506 movl $100, %ebx 507 subl 36(%ebp), %ebx 508 mull %ebx 509 shll %cl, %eax //relative blue dest part 510 popl %ebx 511 addl %ebx, %eax 512 movl $100, %ebx 513 divl %ebx 514 andl bMask, %eax 515 516 popl %ebx 517 orl %ebx, %eax 518 popl %ebx 519 orl %ebx, %eax 520 521 movw %ax, (%edi) 522 523 addl $2, %edi 524 popl %ecx 525 decl %ecx 526 jnz innerl5 527 528 popl %edx 529 530 movl 12(%ebp), %ebx 531 subl 24(%ebp), %ebx 532 shll $1, %ebx 533 addl %ebx, %edi 534 535 decl %edx 536 jnz outerl5 537 5384: 539 popl %edi 540 DelStack 541 ret 542 543.globl SC_Opq 544SC_Opq: 545 CrtStack 546 pushl %edi 547 pushl %esi 548 549 //x < lx ? 550 movl clp_lx, %eax 551 cmpl %eax, 16(%ebp) 552 jge 0f 553 movl 16(%ebp), %ebx 554 subl %ebx, %eax 555 subl %eax, 40(%ebp) 556 addl %eax, 32(%ebp) 557 movl clp_lx, %eax 558 movl %eax, 16(%ebp) 5590: 560 //y < ty ? 561 movl clp_ty, %eax 562 cmp %eax, 20(%ebp) 563 jge 1f 564 movl 20(%ebp), %ebx 565 subl %ebx, %eax 566 subl %eax, 44(%ebp) 567 addl %eax, 36(%ebp) 568 movl clp_ty, %eax 569 movl %eax, 20(%ebp) 5701: 571 //x > rx 572 movl clp_rx, %eax 573 movl 16(%ebp), %ebx 574 addl 40(%ebp), %ebx 575 subl $1, %ebx 576 cmp %eax, %ebx 577 jle 2f 578 movl clp_rx, %ebx 579 movl 16(%ebp), %eax 580 subl %eax, %ebx 581 addl $1, %ebx 582 movl %ebx, 40(%ebp) 5832: 584 //y > ty 585 movl clp_by, %eax 586 movl 20(%ebp), %ebx 587 addl 44(%ebp), %ebx 588 subl $1, %ebx 589 cmp %eax, %ebx 590 jle 3f 591 movl clp_by, %ebx 592 movl 20(%ebp), %eax 593 subl %eax, %ebx 594 addl $1, %ebx 595 movl %ebx, 44(%ebp) 5963: 597 598 //valid w? 599 movl 40(%ebp), %eax 600 cmpl $0, %eax 601 jle 4f 602 //valid h? 603 movl 44(%ebp), %eax 604 cmpl $0, %eax 605 jle 4f 606 607 xorl %edi, %edi 608 xorl %esi, %esi 609 xorl %eax, %eax 610 611 //esi source 612 movl 36(%ebp), %eax //sy 613 mull 28(%ebp) //dw 614 addl 32(%ebp), %eax //sx 615 shll $1, %eax 616 addl 24(%ebp), %eax 617 movl %eax, %esi //source offset in esi 618 619 //edi destination 620 pushl %ds 621 popl %es 622 movl 20(%ebp), %eax 623 mull 12(%ebp) 624 addl 16(%ebp), %eax 625 shll $1, %eax 626 addl 8(%ebp), %eax 627 movl %eax, %edi //dest offset in edi 628 629 movl 12(%ebp), %eax 630 subl 40(%ebp), %eax 631 shll $1, %eax //edi add-on after completed line 632 633 movl 28(%ebp), %ebx 634 subl 40(%ebp), %ebx 635 shll $1, %ebx //esi add-on after completed line 636 637 movl 44(%ebp), %edx //height 638outerl3: 639 movl 40(%ebp), %ecx //line width 640 rep; movsw 641 addl %eax, %edi 642 addl %ebx, %esi 643 dec %edx 644 jnz outerl3 645 6464: 647 popl %esi 648 popl %edi 649 DelStack 650 ret 651 652.globl SC_Clp 653SC_Clp: 654 CrtStack 655 pushl %edi 656 pushl %esi 657 658 //x < lx ? 659 movl clp_lx, %eax 660 cmpl %eax, 16(%ebp) 661 jge 0f 662 movl 16(%ebp), %ebx 663 subl %ebx, %eax 664 subl %eax, 40(%ebp) 665 addl %eax, 32(%ebp) 666 movl clp_lx, %eax 667 movl %eax, 16(%ebp) 6680: 669 //y < ty ? 670 movl clp_ty, %eax 671 cmp %eax, 20(%ebp) 672 jge 1f 673 movl 20(%ebp), %ebx 674 subl %ebx, %eax 675 subl %eax, 44(%ebp) 676 addl %eax, 36(%ebp) 677 movl clp_ty, %eax 678 movl %eax, 20(%ebp) 6791: 680 //x > rx 681 movl clp_rx, %eax 682 movl 16(%ebp), %ebx 683 addl 40(%ebp), %ebx 684 subl $1, %ebx 685 cmp %eax, %ebx 686 jle 2f 687 movl clp_rx, %ebx 688 movl 16(%ebp), %eax 689 subl %eax, %ebx 690 addl $1, %ebx 691 movl %ebx, 40(%ebp) 6922: 693 //y > ty 694 movl clp_by, %eax 695 movl 20(%ebp), %ebx 696 addl 44(%ebp), %ebx 697 subl $1, %ebx 698 cmp %eax, %ebx 699 jle 3f 700 movl clp_by, %ebx 701 movl 20(%ebp), %eax 702 subl %eax, %ebx 703 addl $1, %ebx 704 movl %ebx, 44(%ebp) 7053: 706 707 //valid w? 708 movl 40(%ebp), %eax 709 cmpl $0, %eax 710 jle 4f 711 //valid h? 712 movl 44(%ebp), %eax 713 cmpl $0, %eax 714 jle 4f 715 716 xorl %edi, %edi 717 xorl %esi, %esi 718 xorl %eax, %eax 719 720 //esi source 721 movl 36(%ebp), %eax //sy 722 mull 28(%ebp) //dw 723 addl 32(%ebp), %eax //sx 724 shll $1, %eax 725 addl 24(%ebp), %eax 726 movl %eax, %esi //source offset in esi 727 728 //edi destination 729 pushl %ds 730 popl %es 731 movl 20(%ebp), %eax 732 mull 12(%ebp) 733 addl 16(%ebp), %eax 734 shll $1, %eax 735 addl 8(%ebp), %eax 736 movl %eax, %edi //dest offset in edi 737 738 movl 12(%ebp), %eax 739 subl 40(%ebp), %eax 740 shll $1, %eax //edi add-on after completed line 741 742 movl 28(%ebp), %ebx 743 subl 40(%ebp), %ebx 744 shll $1, %ebx //esi add-on after completed line 745 746 movl 44(%ebp), %edx 747outerl2: 748 movl 40(%ebp), %ecx 749innerl2: 750 pushl %ecx 751 movw (%esi), %cx 752 cmp $0, %cx 753 jz nopixel 754 movw (%esi), %cx 755 movw %cx, (%edi) 756nopixel: 757 addl $2, %esi 758 addl $2, %edi 759 popl %ecx 760 decl %ecx 761 jnz innerl2 762 763 addl %eax, %edi 764 addl %ebx, %esi 765 766 decl %edx 767 jnz outerl2 768 7694: 770 popl %esi 771 popl %edi 772 DelStack 773 ret 774 775.globl SC_Trp_11 776SC_Trp_11: 777 CrtStack 778 pushl %edi 779 pushl %esi 780 781 //x < lx ? 782 movl clp_lx, %eax 783 cmpl %eax, 16(%ebp) 784 jge 0f 785 movl 16(%ebp), %ebx 786 subl %ebx, %eax 787 subl %eax, 40(%ebp) 788 addl %eax, 32(%ebp) 789 movl clp_lx, %eax 790 movl %eax, 16(%ebp) 7910: 792 //y < ty ? 793 movl clp_ty, %eax 794 cmp %eax, 20(%ebp) 795 jge 1f 796 movl 20(%ebp), %ebx 797 subl %ebx, %eax 798 subl %eax, 44(%ebp) 799 addl %eax, 36(%ebp) 800 movl clp_ty, %eax 801 movl %eax, 20(%ebp) 8021: 803 //x > rx 804 movl clp_rx, %eax 805 movl 16(%ebp), %ebx 806 addl 40(%ebp), %ebx 807 subl $1, %ebx 808 cmp %eax, %ebx 809 jle 2f 810 movl clp_rx, %ebx 811 movl 16(%ebp), %eax 812 subl %eax, %ebx 813 addl $1, %ebx 814 movl %ebx, 40(%ebp) 8152: 816 //y > ty 817 movl clp_by, %eax 818 movl 20(%ebp), %ebx 819 addl 44(%ebp), %ebx 820 subl $1, %ebx 821 cmp %eax, %ebx 822 jle 3f 823 movl clp_by, %ebx 824 movl 20(%ebp), %eax 825 subl %eax, %ebx 826 addl $1, %ebx 827 movl %ebx, 44(%ebp) 8283: 829 830 //valid w? 831 movl 40(%ebp), %eax 832 cmpl $0, %eax 833 jle 4f 834 //valid h? 835 movl 44(%ebp), %eax 836 cmpl $0, %eax 837 jle 4f 838 839 xorl %edi, %edi 840 xorl %esi, %esi 841 xorl %eax, %eax 842 843 //esi source 844 movl 36(%ebp), %eax //sy 845 mull 28(%ebp) //dw 846 addl 32(%ebp), %eax //sx 847 shll $1, %eax 848 addl 24(%ebp), %eax 849 movl %eax, %esi //source offset in esi 850 851 //edi destination 852 pushl %ds 853 popl %es 854 movl 20(%ebp), %eax 855 mull 12(%ebp) 856 addl 16(%ebp), %eax 857 shll $1, %eax 858 addl 8(%ebp), %eax 859 movl %eax, %edi //dest offset in edi 860 861 movl 44(%ebp), %edx 862outerl: 863 movl 40(%ebp), %ecx 864innerl: 865 movw (%esi), %bx 866 cmpw $0, %bx 867 jz 7f 868 869 movl (%esi), %eax 870 andl rMask, %eax 871 movl (%edi), %ebx 872 andl rMask, %ebx 873 addl %ebx, %eax 874 shrl $1, %eax 875 andl rMask, %eax 876 pushl %eax 877 878 movl (%esi), %eax 879 andl gMask, %eax 880 movl (%edi), %ebx 881 andl gMask, %ebx 882 addl %ebx, %eax 883 shrl $1, %eax 884 andl gMask, %eax 885 pushl %eax 886 887 movl (%esi), %eax 888 andl bMask, %eax 889 movl (%edi), %ebx 890 andl bMask, %ebx 891 addl %ebx, %eax 892 shrl $1, %eax 893 andl bMask, %eax 894 895 popl %ebx 896 orl %ebx, %eax 897 popl %ebx 898 orl %ebx, %eax 899 900 movw %ax, (%edi) 901 9027: 903 addl $2, %esi 904 addl $2, %edi 905 decl %ecx 906 jnz innerl 907 908 movl 12(%ebp), %ebx 909 subl 40(%ebp), %ebx 910 shll $1, %ebx 911 addl %ebx, %edi 912 913 movl 28(%ebp), %ebx 914 subl 40(%ebp), %ebx 915 shll $1, %ebx 916 addl %ebx, %esi 917 918 decl %edx 919 jnz outerl 920 9214: 922 popl %esi 923 popl %edi 924 DelStack 925 ret 926 927.globl SC_Trp_X 928SC_Trp_X: 929 CrtStack 930 pushl %edi 931 pushl %esi 932 933 //x < lx ? 934 movl clp_lx, %eax 935 cmpl %eax, 16(%ebp) 936 jge 0f 937 movl 16(%ebp), %ebx 938 subl %ebx, %eax 939 subl %eax, 40(%ebp) 940 addl %eax, 32(%ebp) 941 movl clp_lx, %eax 942 movl %eax, 16(%ebp) 9430: 944 //y < ty ? 945 movl clp_ty, %eax 946 cmp %eax, 20(%ebp) 947 jge 1f 948 movl 20(%ebp), %ebx 949 subl %ebx, %eax 950 subl %eax, 44(%ebp) 951 addl %eax, 36(%ebp) 952 movl clp_ty, %eax 953 movl %eax, 20(%ebp) 9541: 955 //x > rx 956 movl clp_rx, %eax 957 movl 16(%ebp), %ebx 958 addl 40(%ebp), %ebx 959 subl $1, %ebx 960 cmp %eax, %ebx 961 jle 2f 962 movl clp_rx, %ebx 963 movl 16(%ebp), %eax 964 subl %eax, %ebx 965 addl $1, %ebx 966 movl %ebx, 40(%ebp) 9672: 968 //y > ty 969 movl clp_by, %eax 970 movl 20(%ebp), %ebx 971 addl 44(%ebp), %ebx 972 subl $1, %ebx 973 cmp %eax, %ebx 974 jle 3f 975 movl clp_by, %ebx 976 movl 20(%ebp), %eax 977 subl %eax, %ebx 978 addl $1, %ebx 979 movl %ebx, 44(%ebp) 9803: 981 982 //valid w? 983 movl 40(%ebp), %eax 984 cmpl $0, %eax 985 jle 4f 986 //valid h? 987 movl 44(%ebp), %eax 988 cmpl $0, %eax 989 jle 4f 990 991 xorl %edi, %edi 992 xorl %esi, %esi 993 xorl %eax, %eax 994 995 //esi source 996 movl 36(%ebp), %eax //sy 997 mull 28(%ebp) //dw 998 addl 32(%ebp), %eax //sx 999 shll $1, %eax 1000 addl 24(%ebp), %eax 1001 movl %eax, %esi //source offset in esi 1002 1003 //edi destination 1004 pushl %ds 1005 popl %es 1006 movl 20(%ebp), %eax 1007 mull 12(%ebp) 1008 addl 16(%ebp), %eax 1009 shll $1, %eax 1010 addl 8(%ebp), %eax 1011 movl %eax, %edi //dest offset in edi 1012 1013 movl 44(%ebp), %edx 1014outerl4: 1015 movl 40(%ebp), %ecx 1016 pushl %edx 1017innerl4: 1018 pushl %ecx 1019 1020 movw (%esi), %bx 1021 cmpw $0, %bx 1022 jz 7f 1023 1024 movl (%esi), %eax 1025 andl rMask, %eax 1026 movb rlShft, %cl 1027 shrl %cl, %eax 1028 mull 48(%ebp) 1029 shll %cl, %eax 1030 pushl %eax //relative red source part 1031 movl (%edi), %eax 1032 andl rMask, %eax 1033 shrl %cl, %eax 1034 movl $100, %ebx 1035 subl 48(%ebp), %ebx 1036 mull %ebx 1037 shll %cl, %eax //relative green dest part 1038 popl %ebx 1039 addl %ebx, %eax 1040 movl $100, %ebx 1041 divl %ebx 1042 andl rMask, %eax 1043 pushl %eax 1044 1045 movl (%esi), %eax 1046 andl gMask, %eax 1047 movb glShft, %cl 1048 shrl %cl, %eax 1049 mull 48(%ebp) 1050 shll %cl, %eax 1051 pushl %eax //relative red source part 1052 movl (%edi), %eax 1053 andl gMask, %eax 1054 shrl %cl, %eax 1055 movl $100, %ebx 1056 subl 48(%ebp), %ebx 1057 mull %ebx 1058 shll %cl, %eax //relative green dest part 1059 popl %ebx 1060 addl %ebx, %eax 1061 movl $100, %ebx 1062 divl %ebx 1063 andl gMask, %eax 1064 pushl %eax 1065 1066 movl (%esi), %eax 1067 andl bMask, %eax 1068 movb blShft, %cl 1069 shrl %cl, %eax 1070 mull 48(%ebp) 1071 shll %cl, %eax 1072 pushl %eax //relative blue source part 1073 movl (%edi), %eax 1074 andl bMask, %eax 1075 shrl %cl, %eax 1076 movl $100, %ebx 1077 subl 48(%ebp), %ebx 1078 mull %ebx 1079 shll %cl, %eax //relative blue dest part 1080 popl %ebx 1081 addl %ebx, %eax 1082 movl $100, %ebx 1083 divl %ebx 1084 andl bMask, %eax 1085 1086 popl %ebx 1087 orl %ebx, %eax 1088 popl %ebx 1089 orl %ebx, %eax 1090 1091 movw %ax, (%edi) 1092 10937: 1094 addl $2, %esi 1095 addl $2, %edi 1096 popl %ecx 1097 decl %ecx 1098 jnz innerl4 1099 1100 popl %edx 1101 1102 movl 12(%ebp), %ebx 1103 subl 40(%ebp), %ebx 1104 shll $1, %ebx 1105 addl %ebx, %edi 1106 1107 movl 28(%ebp), %ebx 1108 subl 40(%ebp), %ebx 1109 shll $1, %ebx 1110 addl %ebx, %esi 1111 1112 decl %edx 1113 jnz outerl4 1114 11154: 1116 popl %esi 1117 popl %edi 1118 DelStack 1119 ret 1120 1121.globl SC_Clr_11 1122SC_Clr_11: 1123 CrtStack 1124 pushl %edi 1125 pushl %esi 1126 1127 //x < lx ? 1128 movl clp_lx, %eax 1129 cmpl %eax, 16(%ebp) 1130 jge 0f 1131 movl 16(%ebp), %ebx 1132 subl %ebx, %eax 1133 subl %eax, 40(%ebp) 1134 addl %eax, 32(%ebp) 1135 movl clp_lx, %eax 1136 movl %eax, 16(%ebp) 11370: 1138 //y < ty ? 1139 movl clp_ty, %eax 1140 cmp %eax, 20(%ebp) 1141 jge 1f 1142 movl 20(%ebp), %ebx 1143 subl %ebx, %eax 1144 subl %eax, 44(%ebp) 1145 addl %eax, 36(%ebp) 1146 movl clp_ty, %eax 1147 movl %eax, 20(%ebp) 11481: 1149 //x > rx 1150 movl clp_rx, %eax 1151 movl 16(%ebp), %ebx 1152 addl 40(%ebp), %ebx 1153 subl $1, %ebx 1154 cmp %eax, %ebx 1155 jle 2f 1156 movl clp_rx, %ebx 1157 movl 16(%ebp), %eax 1158 subl %eax, %ebx 1159 addl $1, %ebx 1160 movl %ebx, 40(%ebp) 11612: 1162 //y > ty 1163 movl clp_by, %eax 1164 movl 20(%ebp), %ebx 1165 addl 44(%ebp), %ebx 1166 subl $1, %ebx 1167 cmp %eax, %ebx 1168 jle 3f 1169 movl clp_by, %ebx 1170 movl 20(%ebp), %eax 1171 subl %eax, %ebx 1172 addl $1, %ebx 1173 movl %ebx, 44(%ebp) 11743: 1175 1176 //valid w? 1177 movl 40(%ebp), %eax 1178 cmpl $0, %eax 1179 jle 4f 1180 //valid h? 1181 movl 44(%ebp), %eax 1182 cmpl $0, %eax 1183 jle 4f 1184 1185 xorl %edi, %edi 1186 xorl %esi, %esi 1187 xorl %eax, %eax 1188 1189 //esi source 1190 movl 36(%ebp), %eax //sy 1191 mull 28(%ebp) //dw 1192 addl 32(%ebp), %eax //sx 1193 shll $1, %eax 1194 addl 24(%ebp), %eax 1195 movl %eax, %esi //source offset in esi 1196 1197 //edi destination 1198 pushl %ds 1199 popl %es 1200 movl 20(%ebp), %eax 1201 mull 12(%ebp) 1202 addl 16(%ebp), %eax 1203 shll $1, %eax 1204 addl 8(%ebp), %eax 1205 movl %eax, %edi //dest offset in edi 1206 1207 movl 44(%ebp), %edx //height 1208outerl7: 1209 movl 40(%ebp), %ecx //width 1210 pushl %edx 1211innerl7: 1212 pushl %ecx 1213 1214 movw (%esi), %bx 1215 cmpw $0, %bx 1216 jz 7f 1217 1218 xor %ebx, %ebx 1219 movb 46(%ebp), %bl 1220 movb rrShft, %cl 1221 shrb %cl, %bl 1222 movb rlShft, %cl 1223 shll %cl, %ebx //relative red sourve value 1224 movl (%edi), %eax 1225 andl rMask, %eax 1226 addl %ebx, %eax 1227 shrl $1, %eax 1228 andl rMask, %eax 1229 pushl %eax 1230 1231 xor %ebx, %ebx 1232 movb 45(%ebp), %bl 1233 movb grShft, %cl 1234 shrb %cl, %bl 1235 movb glShft, %cl 1236 shll %cl, %ebx //relative green sourve value 1237 movl (%edi), %eax 1238 andl gMask, %eax 1239 addl %ebx, %eax 1240 shrl $1, %eax 1241 andl gMask, %eax 1242 pushl %eax 1243 1244 xor %ebx, %ebx 1245 movb 44(%ebp), %bl 1246 movb brShft, %cl 1247 shrb %cl, %bl 1248 movb blShft, %cl 1249 shll %cl, %ebx //relative blue sourve value 1250 movl (%edi), %eax 1251 andl bMask, %eax 1252 addl %ebx, %eax 1253 shrl $1, %eax 1254 andl bMask, %eax 1255 1256 popl %ebx 1257 orl %ebx, %eax 1258 popl %ebx 1259 orl %ebx, %eax 1260 1261 movw %ax, (%edi) 1262 12637: 1264 addl $2, %edi 1265 addl $2, %esi 1266 popl %ecx 1267 decl %ecx 1268 jnz innerl7 1269 1270 movl 28(%ebp), %eax 1271 subl 40(%ebp), %eax 1272 shll $1, %eax 1273 addl %eax, %esi 1274 1275 movl 12(%ebp), %ebx 1276 subl 40(%ebp), %ebx 1277 shll $1, %ebx 1278 addl %ebx, %edi 1279 1280 popl %edx 1281 decl %edx 1282 jnz outerl7 1283 12844: 1285 popl %esi 1286 popl %edi 1287 DelStack 1288 ret 1289 1290.globl SC_Clr_X 1291SC_Clr_X: 1292 CrtStack 1293 pushl %edi 1294 pushl %esi 1295 1296 //x < lx ? 1297 movl clp_lx, %eax 1298 cmpl %eax, 16(%ebp) 1299 jge 0f 1300 movl 16(%ebp), %ebx 1301 subl %ebx, %eax 1302 subl %eax, 40(%ebp) 1303 addl %eax, 32(%ebp) 1304 movl clp_lx, %eax 1305 movl %eax, 16(%ebp) 13060: 1307 //y < ty ? 1308 movl clp_ty, %eax 1309 cmp %eax, 20(%ebp) 1310 jge 1f 1311 movl 20(%ebp), %ebx 1312 subl %ebx, %eax 1313 subl %eax, 44(%ebp) 1314 addl %eax, 36(%ebp) 1315 movl clp_ty, %eax 1316 movl %eax, 20(%ebp) 13171: 1318 //x > rx 1319 movl clp_rx, %eax 1320 movl 16(%ebp), %ebx 1321 addl 40(%ebp), %ebx 1322 subl $1, %ebx 1323 cmp %eax, %ebx 1324 jle 2f 1325 movl clp_rx, %ebx 1326 movl 16(%ebp), %eax 1327 subl %eax, %ebx 1328 addl $1, %ebx 1329 movl %ebx, 40(%ebp) 13302: 1331 //y > ty 1332 movl clp_by, %eax 1333 movl 20(%ebp), %ebx 1334 addl 44(%ebp), %ebx 1335 subl $1, %ebx 1336 cmp %eax, %ebx 1337 jle 3f 1338 movl clp_by, %ebx 1339 movl 20(%ebp), %eax 1340 subl %eax, %ebx 1341 addl $1, %ebx 1342 movl %ebx, 44(%ebp) 13433: 1344 1345 //valid w? 1346 movl 40(%ebp), %eax 1347 cmpl $0, %eax 1348 jle 4f 1349 //valid h? 1350 movl 44(%ebp), %eax 1351 cmpl $0, %eax 1352 jle 4f 1353 1354 xorl %edi, %edi 1355 xorl %esi, %esi 1356 xorl %eax, %eax 1357 1358 //esi source 1359 movl 36(%ebp), %eax //sy 1360 mull 28(%ebp) //dw 1361 addl 32(%ebp), %eax //sx 1362 shll $1, %eax 1363 addl 24(%ebp), %eax 1364 movl %eax, %esi //source offset in esi 1365 1366 //edi destination 1367 pushl %ds 1368 popl %es 1369 movl 20(%ebp), %eax 1370 mull 12(%ebp) 1371 addl 16(%ebp), %eax 1372 shll $1, %eax 1373 addl 8(%ebp), %eax 1374 movl %eax, %edi //dest offset in edi 1375 1376 movl 44(%ebp), %edx //height 1377outerl6: 1378 movl 40(%ebp), %ecx //width 1379 pushl %edx 1380innerl6: 1381 pushl %ecx 1382 1383 movw (%esi), %bx 1384 cmpw $0, %bx 1385 jz 7f 1386 1387 xor %eax, %eax 1388 movb 50(%ebp), %al 1389 movb rrShft, %cl 1390 shrb %cl, %al 1391 mull 52(%ebp) 1392 movb rlShft, %cl 1393 shll %cl, %eax 1394 pushl %eax //relative red source part 1395 movl (%edi), %eax 1396 andl rMask, %eax 1397 shrl %cl, %eax 1398 movl $100, %ebx 1399 subl 52(%ebp), %ebx 1400 mull %ebx 1401 shll %cl, %eax //relative red dest part 1402 popl %ebx 1403 addl %ebx, %eax 1404 movl $100, %ebx 1405 divl %ebx 1406 andl rMask, %eax 1407 pushl %eax 1408 1409 xor %eax, %eax 1410 movb 49(%ebp), %al 1411 movb grShft, %cl 1412 shrb %cl, %al 1413 mull 52(%ebp) 1414 movb glShft, %cl 1415 shll %cl, %eax 1416 pushl %eax //relative green source part 1417 movl (%edi), %eax 1418 andl gMask, %eax 1419 shrl %cl, %eax 1420 movl $100, %ebx 1421 subl 52(%ebp), %ebx 1422 mull %ebx 1423 shll %cl, %eax //relative green dest part 1424 popl %ebx 1425 addl %ebx, %eax 1426 movl $100, %ebx 1427 divl %ebx 1428 andl gMask, %eax 1429 pushl %eax 1430 1431 xor %eax, %eax 1432 movb 48(%ebp), %al 1433 movb brShft, %cl 1434 shrb %cl, %al 1435 mull 52(%ebp) 1436 movb blShft, %cl 1437 shll %cl, %eax 1438 pushl %eax //relative blue source part 1439 movl (%edi), %eax 1440 andl bMask, %eax 1441 shrl %cl, %eax 1442 movl $100, %ebx 1443 subl 52(%ebp), %ebx 1444 mull %ebx 1445 shll %cl, %eax //relative blue dest part 1446 popl %ebx 1447 addl %ebx, %eax 1448 movl $100, %ebx 1449 divl %ebx 1450 andl bMask, %eax 1451 1452 popl %ebx 1453 orl %ebx, %eax 1454 popl %ebx 1455 orl %ebx, %eax 1456 1457 movw %ax, (%edi) 1458 14597: 1460 addl $2, %edi 1461 addl $2, %esi 1462 popl %ecx 1463 decl %ecx 1464 jnz innerl6 1465 1466 movl 28(%ebp), %eax 1467 subl 40(%ebp), %eax 1468 shll $1, %eax 1469 addl %eax, %esi 1470 1471 movl 12(%ebp), %ebx 1472 subl 40(%ebp), %ebx 1473 shll $1, %ebx 1474 addl %ebx, %edi 1475 1476 popl %edx 1477 decl %edx 1478 jnz outerl6 1479 14804: 1481 popl %esi 1482 popl %edi 1483 DelStack 1484 ret 1485 1486.globl Gfx_SetClipRgn 1487Gfx_SetClipRgn: 1488 CrtStack 1489 1490 movl 8(%ebp), %eax 1491 movl %eax, clp_lx //left x 1492 movl 12(%ebp), %eax 1493 movl %eax, clp_ty //top y 1494 movl 8(%ebp), %eax 1495 addl 16(%ebp), %eax 1496 subl $1, %eax 1497 movl %eax, clp_rx //right x 1498 movl 12(%ebp), %eax 1499 addl 20(%ebp), %eax 1500 subl $1, %eax 1501 movl %eax, clp_by //bottom y 1502 1503 DelStack 1504 ret 1505