r_surf8.s (13135B)
1 // 2 // surf8.s 3 // x86 assembly-language 8 bpp surface block drawing code. 4 // 5 6 #include "qasm.h" 7 8 #if id386 9 10 .data 11 12 sb_v: .long 0 13 14 .text 15 16 .align 4 17 .globl C(R_Surf8Start) 18 C(R_Surf8Start): 19 20 //---------------------------------------------------------------------- 21 // Surface block drawer for mip level 0 22 //---------------------------------------------------------------------- 23 24 .align 4 25 .globl C(R_DrawSurfaceBlock8_mip0) 26 C(R_DrawSurfaceBlock8_mip0): 27 pushl %ebp // preserve caller's stack frame 28 pushl %edi 29 pushl %esi // preserve register variables 30 pushl %ebx 31 32 // for (v=0 ; v<numvblocks ; v++) 33 // { 34 movl C(r_lightptr),%ebx 35 movl C(r_numvblocks),%eax 36 37 movl %eax,sb_v 38 movl C(prowdestbase),%edi 39 40 movl C(pbasesource),%esi 41 42 Lv_loop_mip0: 43 44 // lightleft = lightptr[0]; 45 // lightright = lightptr[1]; 46 // lightdelta = (lightleft - lightright) & 0xFFFFF; 47 movl (%ebx),%eax // lightleft 48 movl 4(%ebx),%edx // lightright 49 50 movl %eax,%ebp 51 movl C(r_lightwidth),%ecx 52 53 movl %edx,C(lightright) 54 subl %edx,%ebp 55 56 andl $0xFFFFF,%ebp 57 leal (%ebx,%ecx,4),%ebx 58 59 // lightptr += lightwidth; 60 movl %ebx,C(r_lightptr) 61 62 // lightleftstep = (lightptr[0] - lightleft) >> blockdivshift; 63 // lightrightstep = (lightptr[1] - lightright) >> blockdivshift; 64 // lightdeltastep = ((lightleftstep - lightrightstep) & 0xFFFFF) | 65 // 0xF0000000; 66 movl 4(%ebx),%ecx // lightptr[1] 67 movl (%ebx),%ebx // lightptr[0] 68 69 subl %eax,%ebx 70 subl %edx,%ecx 71 72 sarl $4,%ecx 73 orl $0xF0000000,%ebp 74 75 sarl $4,%ebx 76 movl %ecx,C(lightrightstep) 77 78 subl %ecx,%ebx 79 andl $0xFFFFF,%ebx 80 81 orl $0xF0000000,%ebx 82 subl %ecx,%ecx // high word must be 0 in loop for addressing 83 84 movl %ebx,C(lightdeltastep) 85 subl %ebx,%ebx // high word must be 0 in loop for addressing 86 87 Lblockloop8_mip0: 88 movl %ebp,C(lightdelta) 89 movb 14(%esi),%cl 90 91 sarl $4,%ebp 92 movb %dh,%bh 93 94 movb 15(%esi),%bl 95 addl %ebp,%edx 96 97 movb %dh,%ch 98 addl %ebp,%edx 99 100 movb 0x12345678(%ebx),%ah 101 LBPatch0: 102 movb 13(%esi),%bl 103 104 movb 0x12345678(%ecx),%al 105 LBPatch1: 106 movb 12(%esi),%cl 107 108 movb %dh,%bh 109 addl %ebp,%edx 110 111 rorl $16,%eax 112 movb %dh,%ch 113 114 addl %ebp,%edx 115 movb 0x12345678(%ebx),%ah 116 LBPatch2: 117 118 movb 11(%esi),%bl 119 movb 0x12345678(%ecx),%al 120 LBPatch3: 121 122 movb 10(%esi),%cl 123 movl %eax,12(%edi) 124 125 movb %dh,%bh 126 addl %ebp,%edx 127 128 movb %dh,%ch 129 addl %ebp,%edx 130 131 movb 0x12345678(%ebx),%ah 132 LBPatch4: 133 movb 9(%esi),%bl 134 135 movb 0x12345678(%ecx),%al 136 LBPatch5: 137 movb 8(%esi),%cl 138 139 movb %dh,%bh 140 addl %ebp,%edx 141 142 rorl $16,%eax 143 movb %dh,%ch 144 145 addl %ebp,%edx 146 movb 0x12345678(%ebx),%ah 147 LBPatch6: 148 149 movb 7(%esi),%bl 150 movb 0x12345678(%ecx),%al 151 LBPatch7: 152 153 movb 6(%esi),%cl 154 movl %eax,8(%edi) 155 156 movb %dh,%bh 157 addl %ebp,%edx 158 159 movb %dh,%ch 160 addl %ebp,%edx 161 162 movb 0x12345678(%ebx),%ah 163 LBPatch8: 164 movb 5(%esi),%bl 165 166 movb 0x12345678(%ecx),%al 167 LBPatch9: 168 movb 4(%esi),%cl 169 170 movb %dh,%bh 171 addl %ebp,%edx 172 173 rorl $16,%eax 174 movb %dh,%ch 175 176 addl %ebp,%edx 177 movb 0x12345678(%ebx),%ah 178 LBPatch10: 179 180 movb 3(%esi),%bl 181 movb 0x12345678(%ecx),%al 182 LBPatch11: 183 184 movb 2(%esi),%cl 185 movl %eax,4(%edi) 186 187 movb %dh,%bh 188 addl %ebp,%edx 189 190 movb %dh,%ch 191 addl %ebp,%edx 192 193 movb 0x12345678(%ebx),%ah 194 LBPatch12: 195 movb 1(%esi),%bl 196 197 movb 0x12345678(%ecx),%al 198 LBPatch13: 199 movb (%esi),%cl 200 201 movb %dh,%bh 202 addl %ebp,%edx 203 204 rorl $16,%eax 205 movb %dh,%ch 206 207 movb 0x12345678(%ebx),%ah 208 LBPatch14: 209 movl C(lightright),%edx 210 211 movb 0x12345678(%ecx),%al 212 LBPatch15: 213 movl C(lightdelta),%ebp 214 215 movl %eax,(%edi) 216 217 addl C(sourcetstep),%esi 218 addl C(surfrowbytes),%edi 219 220 addl C(lightrightstep),%edx 221 addl C(lightdeltastep),%ebp 222 223 movl %edx,C(lightright) 224 jc Lblockloop8_mip0 225 226 // if (pbasesource >= r_sourcemax) 227 // pbasesource -= stepback; 228 229 cmpl C(r_sourcemax),%esi 230 jb LSkip_mip0 231 subl C(r_stepback),%esi 232 LSkip_mip0: 233 234 movl C(r_lightptr),%ebx 235 decl sb_v 236 237 jnz Lv_loop_mip0 238 239 popl %ebx // restore register variables 240 popl %esi 241 popl %edi 242 popl %ebp // restore the caller's stack frame 243 ret 244 245 246 //---------------------------------------------------------------------- 247 // Surface block drawer for mip level 1 248 //---------------------------------------------------------------------- 249 250 .align 4 251 .globl C(R_DrawSurfaceBlock8_mip1) 252 C(R_DrawSurfaceBlock8_mip1): 253 pushl %ebp // preserve caller's stack frame 254 pushl %edi 255 pushl %esi // preserve register variables 256 pushl %ebx 257 258 // for (v=0 ; v<numvblocks ; v++) 259 // { 260 movl C(r_lightptr),%ebx 261 movl C(r_numvblocks),%eax 262 263 movl %eax,sb_v 264 movl C(prowdestbase),%edi 265 266 movl C(pbasesource),%esi 267 268 Lv_loop_mip1: 269 270 // lightleft = lightptr[0]; 271 // lightright = lightptr[1]; 272 // lightdelta = (lightleft - lightright) & 0xFFFFF; 273 movl (%ebx),%eax // lightleft 274 movl 4(%ebx),%edx // lightright 275 276 movl %eax,%ebp 277 movl C(r_lightwidth),%ecx 278 279 movl %edx,C(lightright) 280 subl %edx,%ebp 281 282 andl $0xFFFFF,%ebp 283 leal (%ebx,%ecx,4),%ebx 284 285 // lightptr += lightwidth; 286 movl %ebx,C(r_lightptr) 287 288 // lightleftstep = (lightptr[0] - lightleft) >> blockdivshift; 289 // lightrightstep = (lightptr[1] - lightright) >> blockdivshift; 290 // lightdeltastep = ((lightleftstep - lightrightstep) & 0xFFFFF) | 291 // 0xF0000000; 292 movl 4(%ebx),%ecx // lightptr[1] 293 movl (%ebx),%ebx // lightptr[0] 294 295 subl %eax,%ebx 296 subl %edx,%ecx 297 298 sarl $3,%ecx 299 orl $0x70000000,%ebp 300 301 sarl $3,%ebx 302 movl %ecx,C(lightrightstep) 303 304 subl %ecx,%ebx 305 andl $0xFFFFF,%ebx 306 307 orl $0xF0000000,%ebx 308 subl %ecx,%ecx // high word must be 0 in loop for addressing 309 310 movl %ebx,C(lightdeltastep) 311 subl %ebx,%ebx // high word must be 0 in loop for addressing 312 313 Lblockloop8_mip1: 314 movl %ebp,C(lightdelta) 315 movb 6(%esi),%cl 316 317 sarl $3,%ebp 318 movb %dh,%bh 319 320 movb 7(%esi),%bl 321 addl %ebp,%edx 322 323 movb %dh,%ch 324 addl %ebp,%edx 325 326 movb 0x12345678(%ebx),%ah 327 LBPatch22: 328 movb 5(%esi),%bl 329 330 movb 0x12345678(%ecx),%al 331 LBPatch23: 332 movb 4(%esi),%cl 333 334 movb %dh,%bh 335 addl %ebp,%edx 336 337 rorl $16,%eax 338 movb %dh,%ch 339 340 addl %ebp,%edx 341 movb 0x12345678(%ebx),%ah 342 LBPatch24: 343 344 movb 3(%esi),%bl 345 movb 0x12345678(%ecx),%al 346 LBPatch25: 347 348 movb 2(%esi),%cl 349 movl %eax,4(%edi) 350 351 movb %dh,%bh 352 addl %ebp,%edx 353 354 movb %dh,%ch 355 addl %ebp,%edx 356 357 movb 0x12345678(%ebx),%ah 358 LBPatch26: 359 movb 1(%esi),%bl 360 361 movb 0x12345678(%ecx),%al 362 LBPatch27: 363 movb (%esi),%cl 364 365 movb %dh,%bh 366 addl %ebp,%edx 367 368 rorl $16,%eax 369 movb %dh,%ch 370 371 movb 0x12345678(%ebx),%ah 372 LBPatch28: 373 movl C(lightright),%edx 374 375 movb 0x12345678(%ecx),%al 376 LBPatch29: 377 movl C(lightdelta),%ebp 378 379 movl %eax,(%edi) 380 movl C(sourcetstep),%eax 381 382 addl %eax,%esi 383 movl C(surfrowbytes),%eax 384 385 addl %eax,%edi 386 movl C(lightrightstep),%eax 387 388 addl %eax,%edx 389 movl C(lightdeltastep),%eax 390 391 addl %eax,%ebp 392 movl %edx,C(lightright) 393 394 jc Lblockloop8_mip1 395 396 // if (pbasesource >= r_sourcemax) 397 // pbasesource -= stepback; 398 399 cmpl C(r_sourcemax),%esi 400 jb LSkip_mip1 401 subl C(r_stepback),%esi 402 LSkip_mip1: 403 404 movl C(r_lightptr),%ebx 405 decl sb_v 406 407 jnz Lv_loop_mip1 408 409 popl %ebx // restore register variables 410 popl %esi 411 popl %edi 412 popl %ebp // restore the caller's stack frame 413 ret 414 415 416 //---------------------------------------------------------------------- 417 // Surface block drawer for mip level 2 418 //---------------------------------------------------------------------- 419 420 .align 4 421 .globl C(R_DrawSurfaceBlock8_mip2) 422 C(R_DrawSurfaceBlock8_mip2): 423 pushl %ebp // preserve caller's stack frame 424 pushl %edi 425 pushl %esi // preserve register variables 426 pushl %ebx 427 428 // for (v=0 ; v<numvblocks ; v++) 429 // { 430 movl C(r_lightptr),%ebx 431 movl C(r_numvblocks),%eax 432 433 movl %eax,sb_v 434 movl C(prowdestbase),%edi 435 436 movl C(pbasesource),%esi 437 438 Lv_loop_mip2: 439 440 // lightleft = lightptr[0]; 441 // lightright = lightptr[1]; 442 // lightdelta = (lightleft - lightright) & 0xFFFFF; 443 movl (%ebx),%eax // lightleft 444 movl 4(%ebx),%edx // lightright 445 446 movl %eax,%ebp 447 movl C(r_lightwidth),%ecx 448 449 movl %edx,C(lightright) 450 subl %edx,%ebp 451 452 andl $0xFFFFF,%ebp 453 leal (%ebx,%ecx,4),%ebx 454 455 // lightptr += lightwidth; 456 movl %ebx,C(r_lightptr) 457 458 // lightleftstep = (lightptr[0] - lightleft) >> blockdivshift; 459 // lightrightstep = (lightptr[1] - lightright) >> blockdivshift; 460 // lightdeltastep = ((lightleftstep - lightrightstep) & 0xFFFFF) | 461 // 0xF0000000; 462 movl 4(%ebx),%ecx // lightptr[1] 463 movl (%ebx),%ebx // lightptr[0] 464 465 subl %eax,%ebx 466 subl %edx,%ecx 467 468 sarl $2,%ecx 469 orl $0x30000000,%ebp 470 471 sarl $2,%ebx 472 movl %ecx,C(lightrightstep) 473 474 subl %ecx,%ebx 475 476 andl $0xFFFFF,%ebx 477 478 orl $0xF0000000,%ebx 479 subl %ecx,%ecx // high word must be 0 in loop for addressing 480 481 movl %ebx,C(lightdeltastep) 482 subl %ebx,%ebx // high word must be 0 in loop for addressing 483 484 Lblockloop8_mip2: 485 movl %ebp,C(lightdelta) 486 movb 2(%esi),%cl 487 488 sarl $2,%ebp 489 movb %dh,%bh 490 491 movb 3(%esi),%bl 492 addl %ebp,%edx 493 494 movb %dh,%ch 495 addl %ebp,%edx 496 497 movb 0x12345678(%ebx),%ah 498 LBPatch18: 499 movb 1(%esi),%bl 500 501 movb 0x12345678(%ecx),%al 502 LBPatch19: 503 movb (%esi),%cl 504 505 movb %dh,%bh 506 addl %ebp,%edx 507 508 rorl $16,%eax 509 movb %dh,%ch 510 511 movb 0x12345678(%ebx),%ah 512 LBPatch20: 513 movl C(lightright),%edx 514 515 movb 0x12345678(%ecx),%al 516 LBPatch21: 517 movl C(lightdelta),%ebp 518 519 movl %eax,(%edi) 520 movl C(sourcetstep),%eax 521 522 addl %eax,%esi 523 movl C(surfrowbytes),%eax 524 525 addl %eax,%edi 526 movl C(lightrightstep),%eax 527 528 addl %eax,%edx 529 movl C(lightdeltastep),%eax 530 531 addl %eax,%ebp 532 movl %edx,C(lightright) 533 534 jc Lblockloop8_mip2 535 536 // if (pbasesource >= r_sourcemax) 537 // pbasesource -= stepback; 538 539 cmpl C(r_sourcemax),%esi 540 jb LSkip_mip2 541 subl C(r_stepback),%esi 542 LSkip_mip2: 543 544 movl C(r_lightptr),%ebx 545 decl sb_v 546 547 jnz Lv_loop_mip2 548 549 popl %ebx // restore register variables 550 popl %esi 551 popl %edi 552 popl %ebp // restore the caller's stack frame 553 ret 554 555 556 //---------------------------------------------------------------------- 557 // Surface block drawer for mip level 3 558 //---------------------------------------------------------------------- 559 560 .align 4 561 .globl C(R_DrawSurfaceBlock8_mip3) 562 C(R_DrawSurfaceBlock8_mip3): 563 pushl %ebp // preserve caller's stack frame 564 pushl %edi 565 pushl %esi // preserve register variables 566 pushl %ebx 567 568 // for (v=0 ; v<numvblocks ; v++) 569 // { 570 movl C(r_lightptr),%ebx 571 movl C(r_numvblocks),%eax 572 573 movl %eax,sb_v 574 movl C(prowdestbase),%edi 575 576 movl C(pbasesource),%esi 577 578 Lv_loop_mip3: 579 580 // lightleft = lightptr[0]; 581 // lightright = lightptr[1]; 582 // lightdelta = (lightleft - lightright) & 0xFFFFF; 583 movl (%ebx),%eax // lightleft 584 movl 4(%ebx),%edx // lightright 585 586 movl %eax,%ebp 587 movl C(r_lightwidth),%ecx 588 589 movl %edx,C(lightright) 590 subl %edx,%ebp 591 592 andl $0xFFFFF,%ebp 593 leal (%ebx,%ecx,4),%ebx 594 595 movl %ebp,C(lightdelta) 596 // lightptr += lightwidth; 597 movl %ebx,C(r_lightptr) 598 599 // lightleftstep = (lightptr[0] - lightleft) >> blockdivshift; 600 // lightrightstep = (lightptr[1] - lightright) >> blockdivshift; 601 // lightdeltastep = ((lightleftstep - lightrightstep) & 0xFFFFF) | 602 // 0xF0000000; 603 movl 4(%ebx),%ecx // lightptr[1] 604 movl (%ebx),%ebx // lightptr[0] 605 606 subl %eax,%ebx 607 subl %edx,%ecx 608 609 sarl $1,%ecx 610 611 sarl $1,%ebx 612 movl %ecx,C(lightrightstep) 613 614 subl %ecx,%ebx 615 andl $0xFFFFF,%ebx 616 617 sarl $1,%ebp 618 orl $0xF0000000,%ebx 619 620 movl %ebx,C(lightdeltastep) 621 subl %ebx,%ebx // high word must be 0 in loop for addressing 622 623 movb 1(%esi),%bl 624 subl %ecx,%ecx // high word must be 0 in loop for addressing 625 626 movb %dh,%bh 627 movb (%esi),%cl 628 629 addl %ebp,%edx 630 movb %dh,%ch 631 632 movb 0x12345678(%ebx),%al 633 LBPatch16: 634 movl C(lightright),%edx 635 636 movb %al,1(%edi) 637 movb 0x12345678(%ecx),%al 638 LBPatch17: 639 640 movb %al,(%edi) 641 movl C(sourcetstep),%eax 642 643 addl %eax,%esi 644 movl C(surfrowbytes),%eax 645 646 addl %eax,%edi 647 movl C(lightdeltastep),%eax 648 649 movl C(lightdelta),%ebp 650 movb (%esi),%cl 651 652 addl %eax,%ebp 653 movl C(lightrightstep),%eax 654 655 sarl $1,%ebp 656 addl %eax,%edx 657 658 movb %dh,%bh 659 movb 1(%esi),%bl 660 661 addl %ebp,%edx 662 movb %dh,%ch 663 664 movb 0x12345678(%ebx),%al 665 LBPatch30: 666 movl C(sourcetstep),%edx 667 668 movb %al,1(%edi) 669 movb 0x12345678(%ecx),%al 670 LBPatch31: 671 672 movb %al,(%edi) 673 movl C(surfrowbytes),%ebp 674 675 addl %edx,%esi 676 addl %ebp,%edi 677 678 // if (pbasesource >= r_sourcemax) 679 // pbasesource -= stepback; 680 681 cmpl C(r_sourcemax),%esi 682 jb LSkip_mip3 683 subl C(r_stepback),%esi 684 LSkip_mip3: 685 686 movl C(r_lightptr),%ebx 687 decl sb_v 688 689 jnz Lv_loop_mip3 690 691 popl %ebx // restore register variables 692 popl %esi 693 popl %edi 694 popl %ebp // restore the caller's stack frame 695 ret 696 697 698 .globl C(R_Surf8End) 699 C(R_Surf8End): 700 701 //---------------------------------------------------------------------- 702 // Code patching routines 703 //---------------------------------------------------------------------- 704 .data 705 706 .align 4 707 LPatchTable8: 708 .long LBPatch0-4 709 .long LBPatch1-4 710 .long LBPatch2-4 711 .long LBPatch3-4 712 .long LBPatch4-4 713 .long LBPatch5-4 714 .long LBPatch6-4 715 .long LBPatch7-4 716 .long LBPatch8-4 717 .long LBPatch9-4 718 .long LBPatch10-4 719 .long LBPatch11-4 720 .long LBPatch12-4 721 .long LBPatch13-4 722 .long LBPatch14-4 723 .long LBPatch15-4 724 .long LBPatch16-4 725 .long LBPatch17-4 726 .long LBPatch18-4 727 .long LBPatch19-4 728 .long LBPatch20-4 729 .long LBPatch21-4 730 .long LBPatch22-4 731 .long LBPatch23-4 732 .long LBPatch24-4 733 .long LBPatch25-4 734 .long LBPatch26-4 735 .long LBPatch27-4 736 .long LBPatch28-4 737 .long LBPatch29-4 738 .long LBPatch30-4 739 .long LBPatch31-4 740 741 .text 742 743 .align 4 744 .globl C(R_Surf8Patch) 745 C(R_Surf8Patch): 746 pushl %ebx 747 748 movl C(colormap),%eax 749 movl $LPatchTable8,%ebx 750 movl $32,%ecx 751 LPatchLoop8: 752 movl (%ebx),%edx 753 addl $4,%ebx 754 movl %eax,(%edx) 755 decl %ecx 756 jnz LPatchLoop8 757 758 popl %ebx 759 760 ret 761 762 #endif // id386