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