1; "Build Engine & Tools" Copyright (c) 1993-1997 Ken Silverman 2; Ken Silverman's official web site: "http://www.advsys.net/ken" 3; See the included license file "BUILDLIC.TXT" for license info. 4 5.586P 6.8087 7;include mmx.inc ;Include this if using < WATCOM 11.0 WASM 8 9;Warning: IN THIS FILE, ALL SEGMENTS ARE REMOVED. THIS MEANS THAT DS:[] 10;MUST BE ADDED FOR ALL SELF-MODIFIES FOR MASM TO WORK. 11; 12;WASM PROBLEMS: 13; 1. Requires all scaled registers (*1,*2,*4,*8) to be last thing on line 14; 2. Using 'DATA' is nice for self-mod. code, but WDIS only works with 'CODE' 15; 16;MASM PROBLEMS: 17; 1. Requires DS: to be written out for self-modifying code to work 18; 2. Doesn't encode short jumps automatically like WASM 19; 3. Stupidly adds wait prefix to ffree's 20 21EXTRN _asm1 : dword 22EXTRN _asm2 : dword 23EXTRN _asm3 : dword 24EXTRN _asm4 : dword 25EXTRN _reciptable : near 26EXTRN _fpuasm : dword 27EXTRN _globalx3 : dword 28EXTRN _globaly3 : dword 29EXTRN _ylookup : near 30 31EXTRN _vplce : near 32EXTRN _vince : near 33EXTRN _palookupoffse : near 34EXTRN _bufplce : near 35 36EXTRN _ebpbak : dword 37EXTRN _espbak : dword 38 39EXTRN _pow2char : near 40EXTRN _pow2long : near 41 42CODE SEGMENT PUBLIC USE32 'DATA' 43ASSUME cs:CODE,ds:CODE 44 45ALIGN 16 46PUBLIC sethlinesizes_ 47sethlinesizes_: 48 mov byte ptr [machxbits1+2], al 49 mov byte ptr [machxbits2+2], al 50 mov byte ptr [machxbits3+2], al 51 neg al 52 mov byte ptr [hxsiz1+2], al 53 mov byte ptr [hxsiz2+2], al 54 mov byte ptr [hxsiz3+2], al 55 mov byte ptr [hxsiz4+2], al 56 mov byte ptr [machnegxbits1+2], al 57 58 mov byte ptr [hysiz1+3], bl 59 mov byte ptr [hysiz2+3], bl 60 mov byte ptr [hysiz3+3], bl 61 mov byte ptr [hysiz4+3], bl 62 mov byte ptr [hmach3a+2], bl 63 mov byte ptr [hmach3b+2], bl 64 mov byte ptr [hmach3c+2], bl 65 mov byte ptr [hmach3d+2], bl 66 67 mov dword ptr [hoffs1+2], ecx 68 mov dword ptr [hoffs2+2], ecx 69 mov dword ptr [hoffs3+2], ecx 70 mov dword ptr [hoffs4+2], ecx 71 mov dword ptr [hoffs5+2], ecx 72 mov dword ptr [hoffs6+2], ecx 73 mov dword ptr [hoffs7+2], ecx 74 mov dword ptr [hoffs8+2], ecx 75 76 mov edx, -1 77 mov cl, al 78 sub cl, bl 79 shr edx, cl 80 mov dword ptr [hmach2a+1], edx 81 mov dword ptr [hmach2b+1], edx 82 mov dword ptr [hmach2c+1], edx 83 mov dword ptr [hmach2d+1], edx 84 85 ret 86 87ALIGN 16 88PUBLIC prosethlinesizes_ 89prosethlinesizes_: 90 mov dword ptr [prohbuf-4], ecx 91 neg eax 92 mov ecx, eax 93 sub eax, ebx 94 mov byte ptr [prohshru-1], al ;bl = 32-al-bl 95 mov eax, -1 96 shr eax, cl 97 mov ecx, ebx 98 shl eax, cl 99 mov dword ptr [prohand-4], eax ;((-1>>(-oal))<<obl) 100 neg ebx 101 mov byte ptr [prohshrv-1], bl ;bl = 32-bl 102 ret 103 104ALIGN 16 105PUBLIC setvlinebpl_ 106setvlinebpl_: 107 mov dword ptr [fixchain1a+2], eax 108 mov dword ptr [fixchain1b+2], eax 109 mov dword ptr [fixchain1m+2], eax 110 mov dword ptr [fixchain1t+2], eax 111 mov dword ptr [fixchain1s+2], eax 112 mov dword ptr [mfixchain1s+2], eax 113 mov dword ptr [tfixchain1s+2], eax 114 mov dword ptr [fixchain2a+2], eax 115 mov dword ptr [profixchain2a+2], eax 116 mov dword ptr [fixchain2ma+2], eax 117 mov dword ptr [fixchain2mb+2], eax 118 mov dword ptr [fixchaint2a+1], eax 119 mov dword ptr [fixchaint2b+2], eax 120 mov dword ptr [fixchaint2c+2], eax 121 mov dword ptr [fixchaint2d+2], eax 122 mov dword ptr [fixchaint2e+2], eax 123 ret 124 125ALIGN 16 126PUBLIC setpalookupaddress_ 127setpalookupaddress_: 128 mov dword ptr [pal1+2], eax 129 mov dword ptr [pal2+2], eax 130 mov dword ptr [pal3+2], eax 131 mov dword ptr [pal4+2], eax 132 mov dword ptr [pal5+2], eax 133 mov dword ptr [pal6+2], eax 134 mov dword ptr [pal7+2], eax 135 mov dword ptr [pal8+2], eax 136 ret 137 138ALIGN 16 139PUBLIC prosetpalookupaddress_ 140prosetpalookupaddress_: 141 mov dword ptr [prohpala-4], eax 142 ret 143 144ALIGN 16 145PUBLIC setuphlineasm4_ 146setuphlineasm4_: 147machxbits3: rol eax, 6 ;xbits 148 mov dword ptr [hmach4a+2], eax 149 mov dword ptr [hmach4b+2], eax 150 mov bl, al 151 mov dword ptr [hmach4c+2], eax 152 mov dword ptr [hmach4d+2], eax 153 mov dword ptr [hmach1a+2], ebx 154 mov dword ptr [hmach1b+2], ebx 155 mov dword ptr [hmach1c+2], ebx 156 mov dword ptr [hmach1d+2], ebx 157 ret 158 159 ;Non-256-stuffed ceiling&floor method with NO SHLD!: 160 ;yinc&0xffffff00 lea eax, [edx+88888800h] 1 1/2 161 ;ybits...xbits and edx, 88000088h 1 1/2 162 ;ybits rol edx, 6 2 1/2 163 ;xinc<<xbits add esi, 88888888h 1 1/2 164 ;xinc>>(32-xbits) adc al, 88h 1 1/2 165 ;bufplc mov cl, byte ptr [edx+88888888h] 1 1/2 166 ;paloffs&255 mov bl, byte ptr [ecx+88888888h] 1 1/2 167ALIGN 16 168PUBLIC hlineasm4_ 169hlineasm4_: 170 push ebp 171 172 lea ebp, [eax+1] 173 174 cmp ebp, 8 175 jle shorthline 176 177 test edi, 1 178 jnz short skipthe1byte 179 180 mov eax, esi 181hxsiz1: shr eax, 26 182hysiz1: shld eax, edx, 6 183hoffs1: mov cl, byte ptr [eax+88888888h] 184pal1: mov bl, byte ptr [ecx+88888888h] 185 sub esi, _asm1 186 sub edx, _asm2 187 mov byte ptr [edi], bl 188 dec edi 189 dec ebp 190 191skipthe1byte: 192 test edi, 2 193 jnz short skipthe2byte 194 195 mov eax, esi 196hxsiz2: shr eax, 26 197hysiz2: shld eax, edx, 6 198hoffs2: mov cl, byte ptr [eax+88888888h] 199pal2: mov bh, byte ptr [ecx+88888888h] 200 sub esi, _asm1 201 sub edx, _asm2 202 203 mov eax, esi 204hxsiz3: shr eax, 26 205hysiz3: shld eax, edx, 6 206hoffs3: mov cl, byte ptr [eax+88888888h] 207pal3: mov bl, byte ptr [ecx+88888888h] 208 sub esi, _asm1 209 sub edx, _asm2 210 mov word ptr [edi-1], bx 211 sub edi, 2 212 sub ebp, 2 213 214skipthe2byte: 215 216 mov eax, esi 217machxbits1: shl esi, 6 ;xbits 218machnegxbits1: shr eax, 32-6 ;32-xbits 219 mov dl, al 220 221 inc edi 222 223 add ebx, ebx 224 mov eax, edx 225 jc beginhline64 226 227 mov eax, _asm1 228machxbits2: rol eax, 6 ;xbits 229 mov dword ptr [hmach4a+2], eax 230 mov dword ptr [hmach4b+2], eax 231 mov dword ptr [hmach4c+2], eax 232 mov dword ptr [hmach4d+2], eax 233 mov ebx, eax 234 mov eax, _asm2 235 mov al, bl 236 mov dword ptr [hmach1a+2], eax 237 mov dword ptr [hmach1b+2], eax 238 mov dword ptr [hmach1c+2], eax 239 mov dword ptr [hmach1d+2], eax 240 241 mov eax, edx 242 jmp beginhline64 243ALIGN 16 244prebeginhline64: 245 mov dword ptr [edi], ebx 246beginhline64: 247 248hmach3a: rol eax, 6 249hmach2a: and eax, 00008888h 250hmach4a: sub esi, 88888888h 251hmach1a: sbb edx, 88888888h 252 sub edi, 4 253hoffs4: mov cl, byte ptr [eax+88888888h] 254 mov eax, edx 255 256hmach3b: rol eax, 6 257hmach2b: and eax, 00008888h 258hmach4b: sub esi, 88888888h 259hmach1b: sbb edx, 88888888h 260pal4: mov bh, byte ptr [ecx+88888888h] 261hoffs5: mov cl, byte ptr [eax+88888888h] 262 mov eax, edx 263 264hmach3c: rol eax, 6 265pal5: mov bl, byte ptr [ecx+88888888h] 266hmach2c: and eax, 00008888h 267 shl ebx, 16 268hmach4c: sub esi, 88888888h 269hmach1c: sbb edx, 88888888h 270hoffs6: mov cl, byte ptr [eax+88888888h] 271 272 mov eax, edx 273 ;( 274 275hmach3d: rol eax, 6 276hmach2d: and eax, 00008888h 277hmach4d: sub esi, 88888888h 278hmach1d: sbb edx, 88888888h 279pal6: mov bh, byte ptr [ecx+88888888h] 280hoffs7: mov cl, byte ptr [eax+88888888h] 281 mov eax, edx 282 sub ebp, 4 283 nop 284pal7: mov bl, byte ptr [ecx+88888888h] 285 jnc prebeginhline64 286skipthe4byte: 287 288 test ebp, 2 289 jz skipdrawthe2 290 rol ebx, 16 291 mov word ptr [edi+2], bx 292 sub edi, 2 293skipdrawthe2: 294 test ebp, 1 295 jz skipdrawthe1 296 shr ebx, 24 297 mov byte ptr [edi+3], bl 298skipdrawthe1: 299 300 pop ebp 301 ret 302 303shorthline: 304 test ebp, ebp 305 jz endshorthline 306begshorthline: 307 mov eax, esi 308hxsiz4: shr eax, 26 309hysiz4: shld eax, edx, 6 310hoffs8: mov cl, byte ptr [eax+88888888h] 311pal8: mov bl, byte ptr [ecx+88888888h] 312 sub esi, _asm1 313 sub edx, _asm2 314 mov byte ptr [edi], bl 315 dec edi 316 dec ebp 317 jnz begshorthline 318endshorthline: 319 pop ebp 320 ret 321 322 323 ;eax: 00000000 00000000 00000000 temp---- 324 ;ebx: 00000000 00000000 00000000 temp---- 325 ;ecx: UUUUUUuu uuuuuuuu uuuuuuuu uuuuuuuu 326 ;edx: VVVVVVvv vvvvvvvv vvvvvvvv vvvvvvvv 327 ;esi: cnt----- -------- -------- -------- 328 ;edi: vid----- -------- -------- -------- 329 ;ebp: paloffs- -------- -------- -------- 330 ;esp: ???????? ???????? ???????? ???????? 331ALIGN 16 332PUBLIC prohlineasm4_ 333prohlineasm4_: 334 push ebp 335 336 lea ebp, [ecx+88888888h] 337prohpala: 338 mov ecx, esi 339 lea esi, [eax+1] 340 sub edi, esi 341 342prohbeg: 343 mov eax, ecx 344 shr eax, 20 345prohshru: 346 mov ebx, edx 347 shr ebx, 26 348prohshrv: 349 and eax, 88888888h 350prohand: 351 movzx eax, byte ptr [eax+ebx+88888888h] 352prohbuf: 353 mov al, [eax+ebp] 354 sub ecx, _asm1 355 sub edx, _asm2 356 mov [edi+esi], al 357 dec esi 358 jnz prohbeg 359 360 pop ebp 361 ret 362 363 364 365ALIGN 16 366PUBLIC setupvlineasm_ 367setupvlineasm_: 368 ;First 2 lines for VLINEASM1, rest for VLINEASM4 369 mov byte ptr [premach3a+2], al 370 mov byte ptr [mach3a+2], al 371 372 push ecx 373 mov byte ptr [machvsh1+2], al ;32-shy 374 mov byte ptr [machvsh3+2], al ;32-shy 375 mov byte ptr [machvsh5+2], al ;32-shy 376 mov byte ptr [machvsh6+2], al ;32-shy 377 mov ah, al 378 sub ah, 16 379 mov byte ptr [machvsh8+2], ah ;16-shy 380 neg al 381 mov byte ptr [machvsh7+2], al ;shy 382 mov byte ptr [machvsh9+2], al ;shy 383 mov byte ptr [machvsh10+2], al ;shy 384 mov byte ptr [machvsh11+2], al ;shy 385 mov byte ptr [machvsh12+2], al ;shy 386 mov cl, al 387 mov eax, 1 388 shl eax, cl 389 dec eax 390 mov dword ptr [machvsh2+2], eax ;(1<<shy)-1 391 mov dword ptr [machvsh4+2], eax ;(1<<shy)-1 392 pop ecx 393 ret 394 395ALIGN 16 396PUBLIC prosetupvlineasm_ 397prosetupvlineasm_: 398 ;First 2 lines for VLINEASM1, rest for VLINEASM4 399 mov byte ptr [premach3a+2], al 400 mov byte ptr [mach3a+2], al 401 402 push ecx 403 mov byte ptr [promachvsh1+2], al ;32-shy 404 mov byte ptr [promachvsh3+2], al ;32-shy 405 mov byte ptr [promachvsh5+2], al ;32-shy 406 mov byte ptr [promachvsh6+2], al ;32-shy 407 mov ah, al 408 sub ah, 16 409 mov byte ptr [promachvsh8+2], ah ;16-shy 410 neg al 411 mov byte ptr [promachvsh7+2], al ;shy 412 mov byte ptr [promachvsh9+2], al ;shy 413 mov byte ptr [promachvsh10+2], al ;shy 414 mov byte ptr [promachvsh11+2], al ;shy 415 mov byte ptr [promachvsh12+2], al ;shy 416 mov cl, al 417 mov eax, 1 418 shl eax, cl 419 dec eax 420 mov dword ptr [promachvsh2+2], eax ;(1<<shy)-1 421 mov dword ptr [promachvsh4+2], eax ;(1<<shy)-1 422 pop ecx 423 ret 424 425ALIGN 16 426PUBLIC setupmvlineasm_ 427setupmvlineasm_: 428 mov byte ptr [maskmach3a+2], al 429 mov byte ptr [machmv13+2], al 430 mov byte ptr [machmv14+2], al 431 mov byte ptr [machmv15+2], al 432 mov byte ptr [machmv16+2], al 433 ret 434 435ALIGN 16 436PUBLIC setuptvlineasm_ 437setuptvlineasm_: 438 mov byte ptr [transmach3a+2], al 439 ret 440 441ALIGN 16 442PUBLIC prevlineasm1_ 443prevlineasm1_: 444 test ecx, ecx 445 jnz vlineasm1_ 446 447 add eax, edx 448premach3a: shr edx, 32 449 mov dl, byte ptr [esi+edx] 450 mov cl, byte ptr [ebx+edx] 451 mov byte ptr [edi], cl 452 ret 453 454ALIGN 16 455PUBLIC vlineasm1_ 456vlineasm1_: 457 push ebp 458 mov ebp, ebx 459 inc ecx 460fixchain1a: sub edi, 320 461beginvline: 462 mov ebx, edx 463mach3a: shr ebx, 32 464fixchain1b: add edi, 320 465 mov bl, byte ptr [esi+ebx] 466 add edx, eax 467 dec ecx 468 mov bl, byte ptr [ebp+ebx] 469 mov byte ptr [edi], bl 470 jnz short beginvline 471 pop ebp 472 mov eax, edx 473 ret 474 475ALIGN 16 476PUBLIC mvlineasm1_ ;Masked vline 477mvlineasm1_: 478 push ebp 479 mov ebp, ebx 480beginmvline: 481 mov ebx, edx 482maskmach3a: shr ebx, 32 483 mov bl, byte ptr [esi+ebx] 484 cmp bl, 255 485 je short skipmask1 486maskmach3c: mov bl, [ebp+ebx] 487 mov byte ptr [edi], bl 488skipmask1: 489 add edx, eax 490fixchain1m: add edi, 320 491 sub ecx, 1 492 jnc short beginmvline 493 494 pop ebp 495 mov eax, edx 496 ret 497 498ALIGN 16 499PUBLIC fixtransluscence_ 500fixtransluscence_: 501 mov dword ptr [transmach4+2], eax 502 mov dword ptr [tmach1+2], eax 503 mov dword ptr [tmach2+2], eax 504 mov dword ptr [tmach3+2], eax 505 mov dword ptr [tmach4+2], eax 506 mov dword ptr [tran2traa+2], eax 507 mov dword ptr [tran2trab+2], eax 508 mov dword ptr [tran2trac+2], eax 509 mov dword ptr [tran2trad+2], eax 510 ret 511 512ALIGN 16 513PUBLIC settransnormal_ 514settransnormal_: 515 mov byte ptr [transrev0+1], 83h 516 mov byte ptr [transrev1+1], 27h 517 mov byte ptr [transrev2+1], 3fh 518 mov byte ptr [transrev3+1], 98h 519 mov byte ptr [transrev4+1], 90h 520 mov byte ptr [transrev5+1], 37h 521 mov byte ptr [transrev6+1], 90h 522 mov word ptr [transrev7+0], 0f38ah 523 mov byte ptr [transrev8+1], 90h 524 mov word ptr [transrev9+0], 0f78ah 525 mov byte ptr [transrev10+1], 0a7h 526 mov byte ptr [transrev11+1], 81h 527 mov byte ptr [transrev12+2], 9fh 528 mov word ptr [transrev13+0], 0dc88h 529 mov byte ptr [transrev14+1], 81h 530 mov byte ptr [transrev15+1], 9ah 531 mov byte ptr [transrev16+1], 0a7h 532 mov byte ptr [transrev17+1], 82h 533 ret 534 535ALIGN 16 536PUBLIC settransreverse_ 537settransreverse_: 538 mov byte ptr [transrev0+1], 0a3h 539 mov byte ptr [transrev1+1], 7h 540 mov byte ptr [transrev2+1], 1fh 541 mov byte ptr [transrev3+1], 0b8h 542 mov byte ptr [transrev4+1], 0b0h 543 mov byte ptr [transrev5+1], 17h 544 mov byte ptr [transrev6+1], 0b0h 545 mov word ptr [transrev7+0], 0d38ah 546 mov byte ptr [transrev8+1], 0b0h 547 mov word ptr [transrev9+0], 0d78ah 548 mov byte ptr [transrev10+1], 87h 549 mov byte ptr [transrev11+1], 0a1h 550 mov byte ptr [transrev12+2], 87h 551 mov word ptr [transrev13+0], 0e388h 552 mov byte ptr [transrev14+1], 0a1h 553 mov byte ptr [transrev15+1], 0bah 554 mov byte ptr [transrev16+1], 87h 555 mov byte ptr [transrev17+1], 0a2h 556 ret 557 558ALIGN 16 559PUBLIC tvlineasm1_ ;Masked & transluscent vline 560tvlineasm1_: 561 push ebp 562 mov ebp, eax 563 xor eax, eax 564 inc ecx 565 mov dword ptr [transmach3c+2], ebx 566 jmp short begintvline 567ALIGN 16 568begintvline: 569 mov ebx, edx 570transmach3a: shr ebx, 32 571 mov bl, byte ptr [esi+ebx] 572 cmp bl, 255 573 je short skiptrans1 574transrev0: 575transmach3c: mov al, [ebx+88888888h] 576transrev1: 577 mov ah, byte ptr [edi] 578transmach4: mov al, byte ptr [eax+88888888h] ;_transluc[eax] 579 mov byte ptr [edi], al 580skiptrans1: 581 add edx, ebp 582fixchain1t: add edi, 320 583 dec ecx 584 jnz short begintvline 585 586 pop ebp 587 mov eax, edx 588 ret 589 590 ;eax: -------temp1------- 591 ;ebx: -------temp2------- 592 ;ecx: dat dat dat dat 593 ;edx: ylo2 ylo4 594 ;esi: yhi1 yhi2 595 ;edi: ---videoplc/cnt---- 596 ;ebp: yhi3 yhi4 597 ;esp: 598ALIGN 16 599PUBLIC vlineasm4_ 600vlineasm4_: 601 push ebp 602 603 mov eax, dword ptr _ylookup[ecx*4] 604 add eax, edi 605 mov dword ptr [machvline4end+2], eax 606 sub edi, eax 607 608 mov eax, dword ptr _bufplce[0] 609 mov ebx, dword ptr _bufplce[4] 610 mov ecx, dword ptr _bufplce[8] 611 mov edx, dword ptr _bufplce[12] 612 mov dword ptr [machvbuf1+2], ecx 613 mov dword ptr [machvbuf2+2], edx 614 mov dword ptr [machvbuf3+2], eax 615 mov dword ptr [machvbuf4+2], ebx 616 617 mov eax, dword ptr _palookupoffse[0] 618 mov ebx, dword ptr _palookupoffse[4] 619 mov ecx, dword ptr _palookupoffse[8] 620 mov edx, dword ptr _palookupoffse[12] 621 mov dword ptr [machvpal1+2], ecx 622 mov dword ptr [machvpal2+2], edx 623 mov dword ptr [machvpal3+2], eax 624 mov dword ptr [machvpal4+2], ebx 625 626 ; �������������������������������Ŀ 627 ;edx: �v3lo �v1lo � 628 ; �������������������������������Ĵ 629 ;esi: �v2hi v2lo � v3hi� 630 ; �������������������������������Ĵ 631 ;ebp: �v0hi v0lo � v1hi� 632 ; ��������������������������������� 633 634 mov ebp, dword ptr _vince[0] 635 mov ebx, dword ptr _vince[4] 636 mov esi, dword ptr _vince[8] 637 mov eax, dword ptr _vince[12] 638 and esi, 0fffffe00h 639 and ebp, 0fffffe00h 640machvsh9: rol eax, 88h ;sh 641machvsh10: rol ebx, 88h ;sh 642 mov edx, eax 643 mov ecx, ebx 644 shr ecx, 16 645 and edx, 0ffff0000h 646 add edx, ecx 647 and eax, 000001ffh 648 and ebx, 000001ffh 649 add esi, eax 650 add ebp, ebx 651 ; 652 mov eax, edx 653 and eax, 0ffff0000h 654 mov dword ptr [machvinc1+2], eax 655 mov dword ptr [machvinc2+2], esi 656 mov byte ptr [machvinc3+2], dl 657 mov byte ptr [machvinc4+2], dh 658 mov dword ptr [machvinc5+2], ebp 659 660 mov ebp, dword ptr _vplce[0] 661 mov ebx, dword ptr _vplce[4] 662 mov esi, dword ptr _vplce[8] 663 mov eax, dword ptr _vplce[12] 664 and esi, 0fffffe00h 665 and ebp, 0fffffe00h 666machvsh11: rol eax, 88h ;sh 667machvsh12: rol ebx, 88h ;sh 668 mov edx, eax 669 mov ecx, ebx 670 shr ecx, 16 671 and edx, 0ffff0000h 672 add edx, ecx 673 and eax, 000001ffh 674 and ebx, 000001ffh 675 add esi, eax 676 add ebp, ebx 677 678 mov ecx, esi 679 jmp short beginvlineasm4 680ALIGN 16 681 nop 682 nop 683 nop 684beginvlineasm4: 685machvsh1: shr ecx, 88h ;32-sh 686 mov ebx, esi 687machvsh2: and ebx, 00000088h ;(1<<sh)-1 688machvinc1: add edx, 88880000h 689machvinc2: adc esi, 88888088h 690machvbuf1: mov cl, byte ptr [ecx+88888888h] 691machvbuf2: mov bl, byte ptr [ebx+88888888h] 692 mov eax, ebp 693machvsh3: shr eax, 88h ;32-sh 694machvpal1: mov cl, byte ptr [ecx+88888888h] 695machvpal2: mov ch, byte ptr [ebx+88888888h] 696 mov ebx, ebp 697 shl ecx, 16 698machvsh4: and ebx, 00000088h ;(1<<sh)-1 699machvinc3: add dl, 88h 700machvbuf3: mov al, byte ptr [eax+88888888h] 701machvinc4: adc dh, 88h 702machvbuf4: mov bl, byte ptr [ebx+88888888h] 703machvinc5: adc ebp, 88888088h 704machvpal3: mov cl, byte ptr [eax+88888888h] 705machvpal4: mov ch, byte ptr [ebx+88888888h] 706machvline4end: mov dword ptr [edi+88888888h], ecx 707fixchain2a: add edi, 88888888h 708 mov ecx, esi 709 jnc short beginvlineasm4 710 711 ; �������������������������������Ŀ 712 ;edx: �v3lo �v1lo � 713 ; �������������������������������Ĵ 714 ;esi: �v2hi v2lo � v3hi� 715 ; �������������������������������Ĵ 716 ;ebp: �v0hi v0lo � v1hi� 717 ; ��������������������������������� 718 719 mov dword ptr _vplce[8], esi 720 mov dword ptr _vplce[0], ebp 721 ;vplc2 = (esi<<(32-sh))+(edx>>sh) 722 ;vplc3 = (ebp<<(32-sh))+((edx&65535)<<(16-sh)) 723machvsh5: shl esi, 88h ;32-sh 724 mov eax, edx 725machvsh6: shl ebp, 88h ;32-sh 726 and edx, 0000ffffh 727machvsh7: shr eax, 88h ;sh 728 add esi, eax 729machvsh8: shl edx, 88h ;16-sh 730 add ebp, edx 731 mov dword ptr _vplce[12], esi 732 mov dword ptr _vplce[4], ebp 733 734 pop ebp 735 ret 736 737 ;eax: -------temp1------- 738 ;ebx: -------temp2------- 739 ;ecx: ylo4 --------- 740 ;edx: ylo2 --------- 741 ;esi: yhi1 yhi2 742 ;edi: ---videoplc/cnt---- 743 ;ebp: yhi3 yhi4 744 ;esp: 745ALIGN 16 746PUBLIC provlineasm4_ 747provlineasm4_: 748 push ebp 749 750 mov eax, dword ptr _ylookup[ecx*4] 751 add eax, edi 752 mov dword ptr [promachvline4end1+2], eax 753 inc eax 754 mov dword ptr [promachvline4end2+2], eax 755 inc eax 756 mov dword ptr [promachvline4end3+2], eax 757 inc eax 758 mov dword ptr [promachvline4end4+2], eax 759 sub eax, 3 760 sub edi, eax 761 762 mov eax, dword ptr _bufplce[0] 763 mov ebx, dword ptr _bufplce[4] 764 mov ecx, dword ptr _bufplce[8] 765 mov edx, dword ptr _bufplce[12] 766 mov dword ptr [promachvbuf1+3], ecx 767 mov dword ptr [promachvbuf2+3], edx 768 mov dword ptr [promachvbuf3+3], eax 769 mov dword ptr [promachvbuf4+3], ebx 770 771 mov eax, dword ptr _palookupoffse[0] 772 mov ebx, dword ptr _palookupoffse[4] 773 mov ecx, dword ptr _palookupoffse[8] 774 mov edx, dword ptr _palookupoffse[12] 775 mov dword ptr [promachvpal1+2], ecx 776 mov dword ptr [promachvpal2+2], edx 777 mov dword ptr [promachvpal3+2], eax 778 mov dword ptr [promachvpal4+2], ebx 779 780 ; �������������������������������Ŀ 781 ;edx: �v3lo �v1lo � 782 ; �������������������������������Ĵ 783 ;esi: �v2hi v2lo � v3hi� 784 ; �������������������������������Ĵ 785 ;ebp: �v0hi v0lo � v1hi� 786 ; ��������������������������������� 787 788 mov ebp, dword ptr _vince[0] 789 mov ebx, dword ptr _vince[4] 790 mov esi, dword ptr _vince[8] 791 mov eax, dword ptr _vince[12] 792 and esi, 0fffffe00h 793 and ebp, 0fffffe00h 794promachvsh9: rol eax, 88h ;sh 795promachvsh10: rol ebx, 88h ;sh 796 mov edx, eax 797 mov ecx, ebx 798 shr ecx, 16 799 and edx, 0ffff0000h 800 add edx, ecx 801 and eax, 000001ffh 802 and ebx, 000001ffh 803 add esi, eax 804 add ebp, ebx 805 ; 806 mov eax, edx 807 and eax, 0ffff0000h 808 mov dword ptr [promachvinc1+2], eax 809 mov dword ptr [promachvinc2+2], esi 810 shl edx, 16 811 mov dword ptr [promachvinc3+2], edx 812 mov dword ptr [promachvinc5+2], ebp 813 814 mov ebp, dword ptr _vplce[0] 815 mov ebx, dword ptr _vplce[4] 816 mov esi, dword ptr _vplce[8] 817 mov eax, dword ptr _vplce[12] 818 and esi, 0fffffe00h 819 and ebp, 0fffffe00h 820promachvsh11: rol eax, 88h ;sh 821promachvsh12: rol ebx, 88h ;sh 822 mov edx, eax 823 mov ecx, ebx 824 shr ecx, 16 825 and edx, 0ffff0000h 826 add edx, ecx 827 and eax, 000001ffh 828 and ebx, 000001ffh 829 add esi, eax 830 add ebp, ebx 831 832 mov eax, esi 833 mov ecx, edx 834 shl ecx, 16 835 jmp short probeginvlineasm4 836ALIGN 16 837 nop 838 nop 839 nop 840probeginvlineasm4: 841promachvsh1: shr eax, 88h ;32-sh 842 mov ebx, esi 843promachvsh2: and ebx, 00000088h ;(1<<sh)-1 844promachvinc1: add edx, 88880000h 845promachvinc2: adc esi, 88888088h 846promachvbuf1: movzx eax, byte ptr [eax+88888888h] 847promachvbuf2: movzx ebx, byte ptr [ebx+88888888h] 848promachvpal1: mov al, byte ptr [eax+88888888h] 849promachvline4end3: mov byte ptr [edi+88888888h], al 850 mov eax, ebp 851promachvsh3: shr eax, 88h ;32-sh 852promachvpal2: mov bl, byte ptr [ebx+88888888h] 853promachvline4end4: mov byte ptr [edi+88888888h], bl 854 mov ebx, ebp 855promachvsh4: and ebx, 00000088h ;(1<<sh)-1 856promachvbuf3: movzx eax, byte ptr [eax+88888888h] 857promachvinc3: add ecx, 88888888h 858promachvbuf4: movzx ebx, byte ptr [ebx+88888888h] 859promachvinc5: adc ebp, 88888088h 860promachvpal3: mov al, byte ptr [eax+88888888h] 861promachvline4end1: mov byte ptr [edi+88888888h], al 862promachvpal4: mov bl, byte ptr [ebx+88888888h] 863promachvline4end2: mov byte ptr [edi+88888888h], bl 864profixchain2a: add edi, 88888888h 865 mov eax, esi 866 jnc short probeginvlineasm4 867 868 ; �������������������������������Ŀ 869 ;edx: �v3lo �v1lo � 870 ; �������������������������������Ĵ 871 ;esi: �v2hi v2lo � v3hi� 872 ; �������������������������������Ĵ 873 ;ebp: �v0hi v0lo � v1hi� 874 ; ��������������������������������� 875 876 mov dword ptr _vplce[8], esi 877 mov dword ptr _vplce[0], ebp 878 ;vplc2 = (esi<<(32-sh))+(edx>>sh) 879 ;vplc3 = (ebp<<(32-sh))+((edx&65535)<<(16-sh)) 880promachvsh5: shl esi, 88h ;32-sh 881 mov eax, edx 882promachvsh6: shl ebp, 88h ;32-sh 883 and edx, 0000ffffh 884promachvsh7: shr eax, 88h ;sh 885 add esi, eax 886promachvsh8: shl edx, 88h ;16-sh 887 add ebp, edx 888 mov dword ptr _vplce[12], esi 889 mov dword ptr _vplce[4], ebp 890 891 pop ebp 892 ret 893 894 895ALIGN 16 896PUBLIC mvlineasm4_ 897mvlineasm4_: 898 push ebp 899 900 mov eax, dword ptr _bufplce[0] 901 mov ebx, dword ptr _bufplce[4] 902 mov dword ptr [machmv1+2], eax 903 mov dword ptr [machmv4+2], ebx 904 mov eax, dword ptr _bufplce[8] 905 mov ebx, dword ptr _bufplce[12] 906 mov dword ptr [machmv7+2], eax 907 mov dword ptr [machmv10+2], ebx 908 909 mov eax, dword ptr _palookupoffse[0] 910 mov ebx, dword ptr _palookupoffse[4] 911 mov dword ptr [machmv2+2], eax 912 mov dword ptr [machmv5+2], ebx 913 mov eax, dword ptr _palookupoffse[8] 914 mov ebx, dword ptr _palookupoffse[12] 915 mov dword ptr [machmv8+2], eax 916 mov dword ptr [machmv11+2], ebx 917 918 mov eax, dword ptr _vince[0] ;vince 919 mov ebx, dword ptr _vince[4] 920 xor al, al 921 xor bl, bl 922 mov dword ptr [machmv3+2], eax 923 mov dword ptr [machmv6+2], ebx 924 mov eax, dword ptr _vince[8] 925 mov ebx, dword ptr _vince[12] 926 mov dword ptr [machmv9+2], eax 927 mov dword ptr [machmv12+2], ebx 928 929 mov ebx, ecx 930 mov ecx, dword ptr _vplce[0] 931 mov edx, dword ptr _vplce[4] 932 mov esi, dword ptr _vplce[8] 933 mov ebp, dword ptr _vplce[12] 934 mov cl, bl 935 inc cl 936 inc bh 937 mov byte ptr _asm3[0], bh 938fixchain2ma: sub edi, 320 939 940 jmp short beginmvlineasm4 941ALIGN 16 942beginmvlineasm4: 943 dec cl 944 jz endmvlineasm4 945beginmvlineasm42: 946 mov eax, ebp 947 mov ebx, esi 948machmv16: shr eax, 32 949machmv15: shr ebx, 32 950machmv12: add ebp, 88888888h ;vince[3] 951machmv9: add esi, 88888888h ;vince[2] 952machmv10: mov al, byte ptr [eax+88888888h] ;bufplce[3] 953machmv7: mov bl, byte ptr [ebx+88888888h] ;bufplce[2] 954 cmp al, 255 955 adc dl, dl 956 cmp bl, 255 957 adc dl, dl 958machmv8: mov bl, byte ptr [ebx+88888888h] ;palookupoffs[2] 959machmv11: mov bh, byte ptr [eax+88888888h] ;palookupoffs[3] 960 961 mov eax, edx 962machmv14: shr eax, 32 963 shl ebx, 16 964machmv4: mov al, byte ptr [eax+88888888h] ;bufplce[1] 965 cmp al, 255 966 adc dl, dl 967machmv6: add edx, 88888888h ;vince[1] 968machmv5: mov bh, byte ptr [eax+88888888h] ;palookupoffs[1] 969 970 mov eax, ecx 971machmv13: shr eax, 32 972machmv3: add ecx, 88888888h ;vince[0] 973machmv1: mov al, byte ptr [eax+88888888h] ;bufplce[0] 974 cmp al, 255 975 adc dl, dl 976machmv2: mov bl, byte ptr [eax+88888888h] ;palookupoffs[0] 977 978 shl dl, 4 979 xor eax, eax 980fixchain2mb: add edi, 320 981 mov al, dl 982 add eax, offset mvcase0 983 jmp eax ;16 byte cases 984 985ALIGN 16 986endmvlineasm4: 987 dec byte ptr _asm3[0] 988 jnz beginmvlineasm42 989 990 mov dword ptr _vplce[0], ecx 991 mov dword ptr _vplce[4], edx 992 mov dword ptr _vplce[8], esi 993 mov dword ptr _vplce[12], ebp 994 pop ebp 995 ret 996 997 ;5,7,8,8,11,13,12,14,11,13,14,14,12,14,15,7 998ALIGN 16 999mvcase0: 1000 jmp beginmvlineasm4 1001ALIGN 16 1002mvcase1: 1003 mov byte ptr [edi], bl 1004 jmp beginmvlineasm4 1005ALIGN 16 1006mvcase2: 1007 mov byte ptr [edi+1], bh 1008 jmp beginmvlineasm4 1009ALIGN 16 1010mvcase3: 1011 mov word ptr [edi], bx 1012 jmp beginmvlineasm4 1013ALIGN 16 1014mvcase4: 1015 shr ebx, 16 1016 mov byte ptr [edi+2], bl 1017 jmp beginmvlineasm4 1018ALIGN 16 1019mvcase5: 1020 mov byte ptr [edi], bl 1021 shr ebx, 16 1022 mov byte ptr [edi+2], bl 1023 jmp beginmvlineasm4 1024ALIGN 16 1025 mvcase6: 1026 shr ebx, 8 1027 mov word ptr [edi+1], bx 1028 jmp beginmvlineasm4 1029ALIGN 16 1030mvcase7: 1031 mov word ptr [edi], bx 1032 shr ebx, 16 1033 mov byte ptr [edi+2], bl 1034 jmp beginmvlineasm4 1035ALIGN 16 1036mvcase8: 1037 shr ebx, 16 1038 mov byte ptr [edi+3], bh 1039 jmp beginmvlineasm4 1040ALIGN 16 1041mvcase9: 1042 mov byte ptr [edi], bl 1043 shr ebx, 16 1044 mov byte ptr [edi+3], bh 1045 jmp beginmvlineasm4 1046ALIGN 16 1047mvcase10: 1048 mov byte ptr [edi+1], bh 1049 shr ebx, 16 1050 mov byte ptr [edi+3], bh 1051 jmp beginmvlineasm4 1052ALIGN 16 1053mvcase11: 1054 mov word ptr [edi], bx 1055 shr ebx, 16 1056 mov byte ptr [edi+3], bh 1057 jmp beginmvlineasm4 1058ALIGN 16 1059mvcase12: 1060 shr ebx, 16 1061 mov word ptr [edi+2], bx 1062 jmp beginmvlineasm4 1063ALIGN 16 1064mvcase13: 1065 mov byte ptr [edi], bl 1066 shr ebx, 16 1067 mov word ptr [edi+2], bx 1068 jmp beginmvlineasm4 1069ALIGN 16 1070mvcase14: 1071 mov byte ptr [edi+1], bh 1072 shr ebx, 16 1073 mov word ptr [edi+2], bx 1074 jmp beginmvlineasm4 1075ALIGN 16 1076mvcase15: 1077 mov dword ptr [edi], ebx 1078 jmp beginmvlineasm4 1079 1080ALIGN 16 1081PUBLIC setupspritevline_ 1082setupspritevline_: 1083 mov dword ptr [spal+2], eax 1084 1085 mov eax, esi ;xinc's 1086 shl eax, 16 1087 mov dword ptr [smach1+2], eax 1088 mov dword ptr [smach4+2], eax 1089 mov eax, esi 1090 sar eax, 16 1091 add eax, ebx ;watch out with ebx - it's passed 1092 mov dword ptr [smach2+2], eax 1093 add eax, edx 1094 mov dword ptr [smach5+2], eax 1095 1096 mov dword ptr [smach3+2], ecx ;yinc's 1097 ret 1098 1099ALIGN 16 1100PUBLIC spritevline_ 1101 ;eax = 0, ebx = x, ecx = cnt, edx = y, esi = yplc, edi = p 1102prestartsvline: 1103smach1: add ebx, 88888888h ;xincshl16 1104 mov al, byte ptr [esi] 1105smach2: adc esi, 88888888h ;xincshr16+yalwaysinc 1106 1107startsvline: 1108spal: mov al, [eax+88888888h] ;palookup 1109 mov byte ptr [edi], al 1110fixchain1s: add edi, 320 1111 1112spritevline_: 1113smach3: add edx, 88888888h ;dayinc 1114 dec ecx 1115 ja short prestartsvline ;jump if (no carry (add)) and (not zero (dec))! 1116 jz short endsvline 1117smach4: add ebx, 88888888h ;xincshl16 1118 mov al, byte ptr [esi] 1119smach5: adc esi, 88888888h ;xincshr16+yalwaysinc+daydime 1120 jmp short startsvline 1121endsvline: 1122 ret 1123 1124ALIGN 16 1125PUBLIC msetupspritevline_ 1126msetupspritevline_: 1127 mov dword ptr [mspal+2], eax 1128 1129 mov eax, esi ;xinc's 1130 shl eax, 16 1131 mov dword ptr [msmach1+2], eax 1132 mov dword ptr [msmach4+2], eax 1133 mov eax, esi 1134 sar eax, 16 1135 add eax, ebx ;watch out with ebx - it's passed 1136 mov dword ptr [msmach2+2], eax 1137 add eax, edx 1138 mov dword ptr [msmach5+2], eax 1139 1140 mov dword ptr [msmach3+2], ecx ;yinc's 1141 ret 1142 1143ALIGN 16 1144PUBLIC mspritevline_ 1145 ;eax = 0, ebx = x, ecx = cnt, edx = y, esi = yplc, edi = p 1146mprestartsvline: 1147msmach1: add ebx, 88888888h ;xincshl16 1148 mov al, byte ptr [esi] 1149msmach2: adc esi, 88888888h ;xincshr16+yalwaysinc 1150 1151mstartsvline: 1152 cmp al, 255 1153 je short mskipsvline 1154mspal: mov al, [eax+88888888h] ;palookup 1155 mov byte ptr [edi], al 1156mskipsvline: 1157mfixchain1s: add edi, 320 1158 1159mspritevline_: 1160msmach3: add edx, 88888888h ;dayinc 1161 dec ecx 1162 ja short mprestartsvline ;jump if (no carry (add)) and (not zero (dec))! 1163 jz short mendsvline 1164msmach4: add ebx, 88888888h ;xincshl16 1165 mov al, byte ptr [esi] 1166msmach5: adc esi, 88888888h ;xincshr16+yalwaysinc+daydime 1167 jmp short mstartsvline 1168mendsvline: 1169 ret 1170 1171ALIGN 16 1172PUBLIC tsetupspritevline_ 1173tsetupspritevline_: 1174 mov dword ptr [tspal+2], eax 1175 1176 mov eax, esi ;xinc's 1177 shl eax, 16 1178 mov dword ptr [tsmach1+2], eax 1179 mov dword ptr [tsmach4+2], eax 1180 mov eax, esi 1181 sar eax, 16 1182 add eax, ebx ;watch out with ebx - it's passed 1183 mov dword ptr [tsmach2+2], eax 1184 add eax, edx 1185 mov dword ptr [tsmach5+2], eax 1186 1187 mov dword ptr [tsmach3+2], ecx ;yinc's 1188 ret 1189 1190ALIGN 16 1191PUBLIC tspritevline_ 1192tspritevline_: 1193 ;eax = 0, ebx = x, ecx = cnt, edx = y, esi = yplc, edi = p 1194 push ebp 1195 mov ebp, ebx 1196 xor ebx, ebx 1197 jmp tenterspritevline 1198ALIGN 16 1199tprestartsvline: 1200tsmach1: add ebp, 88888888h ;xincshl16 1201 mov al, byte ptr [esi] 1202tsmach2: adc esi, 88888888h ;xincshr16+yalwaysinc 1203 1204tstartsvline: 1205 cmp al, 255 1206 je short tskipsvline 1207transrev2: 1208 mov bh, byte ptr [edi] 1209transrev3: 1210tspal: mov bl, [eax+88888888h] ;palookup 1211tmach4: mov al, byte ptr [ebx+88888888h] ;_transluc 1212 mov byte ptr [edi], al 1213tskipsvline: 1214tfixchain1s: add edi, 320 1215 1216tenterspritevline: 1217tsmach3: add edx, 88888888h ;dayinc 1218 dec ecx 1219 ja short tprestartsvline ;jump if (no carry (add)) and (not zero (dec))! 1220 jz short tendsvline 1221tsmach4: add ebp, 88888888h ;xincshl16 1222 mov al, byte ptr [esi] 1223tsmach5: adc esi, 88888888h ;xincshr16+yalwaysinc+daydime 1224 jmp short tstartsvline 1225tendsvline: 1226 pop ebp 1227 ret 1228 1229ALIGN 16 1230PUBLIC msethlineshift_ 1231msethlineshift_: 1232 neg al 1233 mov byte ptr [msh1d+2], al 1234 mov byte ptr [msh2d+3], bl 1235 mov byte ptr [msh3d+2], al 1236 mov byte ptr [msh4d+3], bl 1237 mov byte ptr [msh5d+2], al 1238 mov byte ptr [msh6d+3], bl 1239 ret 1240 1241ALIGN 16 1242PUBLIC mhline_ 1243mhline_: 1244 ;_asm1 = bxinc 1245 ;_asm2 = byinc 1246 ;_asm3 = shadeoffs 1247 ;eax = picoffs 1248 ;ebx = bx 1249 ;ecx = cnt 1250 ;edx = ? 1251 ;esi = by 1252 ;edi = p 1253 1254 mov dword ptr [mmach1d+2], eax 1255 mov dword ptr [mmach5d+2], eax 1256 mov dword ptr [mmach9d+2], eax 1257 mov eax, _asm3 1258 mov dword ptr [mmach2d+2], eax 1259 mov dword ptr [mmach2da+2], eax 1260 mov dword ptr [mmach2db+2], eax 1261 mov dword ptr [mmach6d+2], eax 1262 mov dword ptr [mmach10d+2], eax 1263 mov eax, _asm1 1264 mov dword ptr [mmach3d+2], eax 1265 mov dword ptr [mmach7d+2], eax 1266 mov eax, _asm2 1267 mov dword ptr [mmach4d+2], eax 1268 mov dword ptr [mmach8d+2], eax 1269 jmp short mhlineskipmodify_ 1270 1271ALIGN 16 1272PUBLIC mhlineskipmodify_ 1273mhlineskipmodify_: 1274 1275 push ebp 1276 1277 xor eax, eax 1278 mov ebp, ebx 1279 1280 test ecx, 00010000h 1281 jnz short mbeghline 1282 1283msh1d: shr ebx, 26 1284msh2d: shld ebx, esi, 6 1285 add ebp, _asm1 1286mmach9d: mov al, byte ptr [ebx+88888888h] ;picoffs 1287 add esi, _asm2 1288 cmp al, 255 1289 je mskip5 1290 1291 mmach10d: mov cl, byte ptr [eax+88888888h] ;shadeoffs 1292 mov byte ptr [edi], cl 1293mskip5: 1294 inc edi 1295 sub ecx, 65536 1296 jc mendhline 1297 jmp short mbeghline 1298 1299ALIGN 16 1300mpreprebeghline: ;1st only 1301 mov al, cl 1302mmach2d: mov al, byte ptr [eax+88888888h] ;shadeoffs 1303 mov byte ptr [edi], al 1304 1305mprebeghline: 1306 add edi, 2 1307 sub ecx, 131072 1308 jc short mendhline 1309mbeghline: 1310mmach3d: lea ebx, [ebp+88888888h] ;bxinc 1311msh3d: shr ebp, 26 1312msh4d: shld ebp, esi, 6 1313mmach4d: add esi, 88888888h ;byinc 1314mmach1d: mov cl, byte ptr [ebp+88888888h] ;picoffs 1315mmach7d: lea ebp, [ebx+88888888h] ;bxinc 1316 1317msh5d: shr ebx, 26 1318msh6d: shld ebx, esi, 6 1319mmach8d: add esi, 88888888h ;byinc 1320mmach5d: mov ch, byte ptr [ebx+88888888h] ;picoffs 1321 1322 cmp cl, 255 1323 je short mskip1 1324 cmp ch, 255 1325 je short mpreprebeghline 1326 1327 mov al, cl ;BOTH 1328mmach2da: mov bl, byte ptr [eax+88888888h] ;shadeoffs 1329 mov al, ch 1330mmach2db: mov bh, byte ptr [eax+88888888h] ;shadeoffs 1331 mov word ptr [edi], bx 1332 add edi, 2 1333 sub ecx, 131072 1334 jnc short mbeghline 1335 jmp mendhline 1336mskip1: ;2nd only 1337 cmp ch, 255 1338 je short mprebeghline 1339 1340 mov al, ch 1341mmach6d: mov al, byte ptr [eax+88888888h] ;shadeoffs 1342 mov byte ptr [edi+1], al 1343 add edi, 2 1344 sub ecx, 131072 1345 jnc short mbeghline 1346mendhline: 1347 1348 pop ebp 1349 ret 1350 1351ALIGN 16 1352PUBLIC tsethlineshift_ 1353tsethlineshift_: 1354 neg al 1355 mov byte ptr [tsh1d+2], al 1356 mov byte ptr [tsh2d+3], bl 1357 mov byte ptr [tsh3d+2], al 1358 mov byte ptr [tsh4d+3], bl 1359 mov byte ptr [tsh5d+2], al 1360 mov byte ptr [tsh6d+3], bl 1361 ret 1362 1363ALIGN 16 1364PUBLIC thline_ 1365thline_: 1366 ;_asm1 = bxinc 1367 ;_asm2 = byinc 1368 ;_asm3 = shadeoffs 1369 ;eax = picoffs 1370 ;ebx = bx 1371 ;ecx = cnt 1372 ;edx = ? 1373 ;esi = by 1374 ;edi = p 1375 1376 mov dword ptr [tmach1d+2], eax 1377 mov dword ptr [tmach5d+2], eax 1378 mov dword ptr [tmach9d+2], eax 1379 mov eax, _asm3 1380 mov dword ptr [tmach2d+2], eax 1381 mov dword ptr [tmach6d+2], eax 1382 mov dword ptr [tmach10d+2], eax 1383 mov eax, _asm1 1384 mov dword ptr [tmach3d+2], eax 1385 mov dword ptr [tmach7d+2], eax 1386 mov eax, _asm2 1387 mov dword ptr [tmach4d+2], eax 1388 mov dword ptr [tmach8d+2], eax 1389 jmp thlineskipmodify_ 1390 1391ALIGN 16 1392PUBLIC thlineskipmodify_ 1393thlineskipmodify_: 1394 1395 push ebp 1396 1397 xor eax, eax 1398 xor edx, edx 1399 mov ebp, ebx 1400 1401 test ecx, 00010000h 1402 jnz short tbeghline 1403 1404tsh1d: shr ebx, 26 1405tsh2d: shld ebx, esi, 6 1406 add ebp, _asm1 1407tmach9d: mov al, byte ptr [ebx+88888888h] ;picoffs 1408 add esi, _asm2 1409 cmp al, 255 1410 je tskip5 1411 1412transrev4: 1413tmach10d: mov dl, byte ptr [eax+88888888h] ;shadeoffs 1414transrev5: 1415 mov dh, byte ptr [edi] 1416tmach1: mov al, byte ptr [edx+88888888h] ;_transluc 1417 mov byte ptr [edi], al 1418tskip5: 1419 inc edi 1420 sub ecx, 65536 1421 jc tendhline 1422 jmp short tbeghline 1423 1424ALIGN 16 1425tprebeghline: 1426 add edi, 2 1427 sub ecx, 131072 1428 jc short tendhline 1429tbeghline: 1430tmach3d: lea ebx, [ebp+88888888h] ;bxinc 1431tsh3d: shr ebp, 26 1432tsh4d: shld ebp, esi, 6 1433tmach4d: add esi, 88888888h ;byinc 1434tmach1d: mov cl, byte ptr [ebp+88888888h] ;picoffs 1435tmach7d: lea ebp, [ebx+88888888h] ;bxinc 1436 1437tsh5d: shr ebx, 26 1438tsh6d: shld ebx, esi, 6 1439tmach8d: add esi, 88888888h ;byinc 1440tmach5d: mov ch, byte ptr [ebx+88888888h] ;picoffs 1441 1442 cmp cx, 0ffffh 1443 je short tprebeghline 1444 1445 mov bx, word ptr [edi] 1446 1447 cmp cl, 255 1448 je short tskip1 1449 mov al, cl 1450transrev6: 1451tmach2d: mov dl, byte ptr [eax+88888888h] ;shadeoffs 1452transrev7: 1453 mov dh, bl 1454tmach2: mov al, byte ptr [edx+88888888h] ;_transluc 1455 mov byte ptr [edi], al 1456 1457 cmp ch, 255 1458 je short tskip2 1459tskip1: 1460 mov al, ch 1461transrev8: 1462tmach6d: mov dl, byte ptr [eax+88888888h] ;shadeoffs 1463transrev9: 1464 mov dh, bh 1465tmach3: mov al, byte ptr [edx+88888888h] ;_transluc 1466 mov byte ptr [edi+1], al 1467tskip2: 1468 1469 add edi, 2 1470 sub ecx, 131072 1471 jnc tbeghline 1472tendhline: 1473 1474 pop ebp 1475 ret 1476 1477 1478 ;eax=shiftval, ebx=palookup1, ecx=palookup2 1479ALIGN 16 1480PUBLIC setuptvlineasm2_ 1481setuptvlineasm2_: 1482 mov byte ptr [tran2shra+2], al 1483 mov byte ptr [tran2shrb+2], al 1484 mov dword ptr [tran2pala+2], ebx 1485 mov dword ptr [tran2palb+2], ecx 1486 mov dword ptr [tran2palc+2], ebx 1487 mov dword ptr [tran2pald+2], ecx 1488 ret 1489 1490 ;Pass: eax=vplc2, ebx=vinc1, ecx=bufplc1, edx=bufplc2, esi=vplc1, edi=p 1491 ; _asm1=vinc2, _asm2=pend 1492 ;Return: _asm1=vplc1, _asm2=vplc2 1493ALIGN 16 1494PUBLIC tvlineasm2_ 1495tvlineasm2_: 1496 push ebp 1497 1498 mov ebp, eax 1499 1500 mov dword ptr [tran2inca+2], ebx 1501 mov eax, _asm1 1502 mov dword ptr [tran2incb+2], eax 1503 1504 mov dword ptr [tran2bufa+2], ecx ;bufplc1 1505 mov dword ptr [tran2bufb+2], edx ;bufplc2 1506 1507 mov eax, _asm2 1508 sub edi, eax 1509 mov dword ptr [tran2edia+3], eax 1510 mov dword ptr [tran2edic+2], eax 1511 inc eax 1512 mov dword ptr [tran2edie+2], eax 1513fixchaint2a: sub eax, 320 1514 mov dword ptr [tran2edif+2], eax 1515 dec eax 1516 mov dword ptr [tran2edib+3], eax 1517 mov dword ptr [tran2edid+2], eax 1518 1519 xor ecx, ecx 1520 xor edx, edx 1521 jmp short begintvline2 1522 1523 ;eax 0000000000 temp temp 1524 ;ebx 0000000000 odat2 odat1 1525 ;ecx 0000000000000000 ndat1 1526 ;edx 0000000000000000 ndat2 1527 ;esi vplc1 1528 ;edi videoplc-------------- 1529 ;ebp vplc2 1530 1531ALIGN 16 1532 ;LEFT ONLY 1533skipdraw2: 1534transrev10: 1535tran2edic: mov ah, byte ptr [edi+88888888h] ;getpixel 1536transrev11: 1537tran2palc: mov al, byte ptr [ecx+88888888h] ;palookup1 1538fixchaint2d: add edi, 320 1539tran2trac: mov bl, byte ptr [eax+88888888h] ;_transluc 1540tran2edid: mov byte ptr [edi+88888888h-320], bl ;drawpixel 1541 jnc short begintvline2 1542 jmp endtvline2 1543 1544skipdraw1: 1545 cmp dl, 255 1546 jne short skipdraw3 1547fixchaint2b: add edi, 320 1548 jc short endtvline2 1549 1550begintvline2: 1551 mov eax, esi 1552tran2shra: shr eax, 88h ;globalshift 1553 mov ebx, ebp 1554tran2shrb: shr ebx, 88h ;globalshift 1555tran2inca: add esi, 88888888h ;vinc1 1556tran2incb: add ebp, 88888888h ;vinc2 1557tran2bufa: mov cl, byte ptr [eax+88888888h] ;bufplc1 1558 cmp cl, 255 1559tran2bufb: mov dl, byte ptr [ebx+88888888h] ;bufplc2 1560 je short skipdraw1 1561 cmp dl, 255 1562 je short skipdraw2 1563 1564 ;mov ax The transluscent reverse of both! 1565 ;mov bl, ah 1566 ;mov ah 1567 ;mov bh 1568 1569 ;BOTH 1570transrev12: 1571tran2edia: mov bx, word ptr [edi+88888888h] ;getpixels 1572transrev13: 1573 mov ah, bl 1574transrev14: 1575tran2pala: mov al, byte ptr [ecx+88888888h] ;palookup1 1576transrev15: 1577tran2palb: mov bl, byte ptr [edx+88888888h] ;palookup2 1578fixchaint2c: add edi, 320 1579tran2traa: mov al, byte ptr [eax+88888888h] ;_transluc 1580tran2trab: mov ah, byte ptr [ebx+88888888h] ;_transluc 1581tran2edib: mov word ptr [edi+88888888h-320], ax ;drawpixels 1582 jnc short begintvline2 1583 jmp short endtvline2 1584 1585 ;RIGHT ONLY 1586skipdraw3: 1587transrev16: 1588tran2edie: mov ah, byte ptr [edi+88888889h] ;getpixel 1589transrev17: 1590tran2pald: mov al, byte ptr [edx+88888888h] ;palookup2 1591fixchaint2e: add edi, 320 1592tran2trad: mov bl, byte ptr [eax+88888888h] ;_transluc 1593tran2edif: mov byte ptr [edi+88888889h-320], bl ;drawpixel 1594 jnc short begintvline2 1595 1596endtvline2: 1597 mov _asm1, esi 1598 mov _asm2, ebp 1599 1600 pop ebp 1601 ret 1602 1603 1604BITSOFPRECISION equ 3 1605BITSOFPRECISIONPOW equ 8 1606 1607;Double-texture mapping with palette lookup 1608;eax: ylo1------------|----dat|----dat 1609;ebx: ylo2--------------------|----cnt 1610;ecx: 000000000000000000000000|---temp 1611;edx: xhi1-xlo1---------------|---yhi1 1612;esi: xhi2-xlo2---------------|---yhi2 1613;edi: ------------------------videopos 1614;ebp: ----------------------------temp 1615 1616ALIGN 16 1617PUBLIC setupslopevlin2_ 1618setupslopevlin2_: 1619 mov dword ptr [slop3+2], edx ;ptr 1620 mov dword ptr [slop7+2], edx ;ptr 1621 mov dword ptr [slop4+2], esi ;tptr 1622 mov dword ptr [slop8+2], esi ;tptr 1623 mov byte ptr [slop2+2], ah ;ybits 1624 mov byte ptr [slop6+2], ah ;ybits 1625 mov dword ptr [slop9+2], edi ;pinc 1626 1627 mov edx, 1 1628 mov cl, al 1629 add cl, ah 1630 shl edx, cl 1631 dec edx 1632 mov cl, ah 1633 ror edx, cl 1634 1635 mov dword ptr [slop1+2], edx ;ybits...xbits 1636 mov dword ptr [slop5+2], edx ;ybits...xbits 1637 1638 ret 1639 1640ALIGN 16 1641PUBLIC slopevlin2_ 1642slopevlin2_: 1643 push ebp 1644 xor ecx, ecx 1645 1646slopevlin2begin: 1647 mov ebp, edx 1648slop1: and ebp, 88000088h ;ybits...xbits 1649slop2: rol ebp, 6 ;ybits 1650 add eax, _asm1 ;xinc1<<xbits 1651 adc edx, _asm2 ;(yinc1&0xffffff00)+(xinc1>>(32-xbits)) 1652slop3: mov cl, byte ptr [ebp+88888888h] ;bufplc 1653 1654 mov ebp, esi 1655slop4: mov al, byte ptr [ecx+88888888h] ;paloffs 1656slop5: and ebp, 88000088h ;ybits...xbits 1657slop6: rol ebp, 6 ;ybits 1658 add ebx, _asm3 ;xinc2<<xbits 1659slop7: mov cl, byte ptr [ebp+88888888h] ;bufplc 1660 adc esi, _asm4 ;(yinc2&0xffffff00)+(xinc2>>(32-xbits)) 1661slop8: mov ah, byte ptr [ecx+88888888h] ;paloffs 1662 1663 dec bl 1664 mov word ptr [edi], ax 1665slop9: lea edi, [edi+88888888h] ;pinc 1666 jnz short slopevlin2begin 1667 1668 pop ebp 1669 mov eax, edi 1670 ret 1671 1672 1673ALIGN 16 1674PUBLIC setupslopevlin_ 1675setupslopevlin_: 1676 mov dword ptr [slopmach3+3], ebx ;ptr 1677 mov dword ptr [slopmach5+2], ecx ;pinc 1678 neg ecx 1679 mov dword ptr [slopmach6+2], ecx ;-pinc 1680 1681 mov edx, 1 1682 mov cl, al 1683 shl edx, cl 1684 dec edx 1685 mov cl, ah 1686 shl edx, cl 1687 mov dword ptr [slopmach7+2], edx 1688 1689 neg ah 1690 mov byte ptr [slopmach2+2], ah 1691 1692 sub ah, al 1693 mov byte ptr [slopmach1+2], ah 1694 1695 fild dword ptr _asm1 1696 fstp dword ptr _asm2 1697 ret 1698 1699ALIGN 16 1700PUBLIC slopevlin_ 1701slopevlin_: 1702 mov _ebpbak, ebp 1703 mov _espbak, esp 1704 1705 sub ecx, esp 1706 mov dword ptr [slopmach4+3], ecx 1707 1708 fild dword ptr _asm3 1709slopmach6: lea ebp, [eax+88888888h] 1710 fadd dword ptr _asm2 1711 1712 mov _asm1, ebx 1713 shl ebx, 3 1714 1715 mov eax, _globalx3 1716 mov ecx, _globaly3 1717 imul eax, ebx 1718 imul ecx, ebx 1719 add esi, eax 1720 add edi, ecx 1721 1722 mov ebx, edx 1723 jmp short bigslopeloop 1724ALIGN 16 1725bigslopeloop: 1726 fst dword ptr _fpuasm 1727 1728 mov eax, _fpuasm 1729 add eax, eax 1730 sbb edx, edx 1731 mov ecx, eax 1732 shr ecx, 24 1733 and eax, 00ffe000h 1734 shr eax, 11 1735 sub cl, 2 1736 mov eax, dword ptr _reciptable[eax] 1737 shr eax, cl 1738 xor eax, edx 1739 mov edx, _asm1 1740 mov ecx, _globalx3 1741 mov _asm1, eax 1742 sub eax, edx 1743 mov edx, _globaly3 1744 imul ecx, eax 1745 imul eax, edx 1746 1747 fadd dword ptr _asm2 1748 1749 cmp ebx, BITSOFPRECISIONPOW 1750 mov _asm4, ebx 1751 mov cl, bl 1752 jl short slopeskipmin 1753 mov cl, BITSOFPRECISIONPOW 1754slopeskipmin: 1755 1756;eax: yinc............. 1757;ebx: 0 0 0 ? 1758;ecx: xinc......... cnt 1759;edx: ? 1760;esi: xplc............. 1761;edi: yplc............. 1762;ebp: videopos 1763 1764 mov ebx, esi 1765 mov edx, edi 1766 1767beginnerslopeloop: 1768slopmach1: shr ebx, 20 1769 add esi, ecx 1770slopmach2: shr edx, 26 1771slopmach7: and ebx, 88888888h 1772 add edi, eax 1773slopmach5: add ebp, 88888888h ;pinc 1774slopmach3: mov dl, byte ptr [ebx+edx+88888888h] ;ptr 1775slopmach4: mov ebx, dword ptr [esp+88888888h] 1776 sub esp, 4 1777 dec cl 1778 mov al, byte ptr [ebx+edx] ;tptr 1779 mov ebx, esi 1780 mov [ebp], al 1781 mov edx, edi 1782 jnz short beginnerslopeloop 1783 1784 mov ebx, _asm4 1785 sub ebx, BITSOFPRECISIONPOW 1786 jg bigslopeloop 1787 1788 ffree st(0) 1789 1790 mov esp, _espbak 1791 mov ebp, _ebpbak 1792 ret 1793 1794 1795ALIGN 16 1796PUBLIC setuprhlineasm4_ 1797setuprhlineasm4_: 1798 mov dword ptr [rmach1a+2], eax 1799 mov dword ptr [rmach1b+2], eax 1800 mov dword ptr [rmach1c+2], eax 1801 mov dword ptr [rmach1d+2], eax 1802 mov dword ptr [rmach1e+2], eax 1803 1804 mov dword ptr [rmach2a+2], ebx 1805 mov dword ptr [rmach2b+2], ebx 1806 mov dword ptr [rmach2c+2], ebx 1807 mov dword ptr [rmach2d+2], ebx 1808 mov dword ptr [rmach2e+2], ebx 1809 1810 mov dword ptr [rmach3a+2], ecx 1811 mov dword ptr [rmach3b+2], ecx 1812 mov dword ptr [rmach3c+2], ecx 1813 mov dword ptr [rmach3d+2], ecx 1814 mov dword ptr [rmach3e+2], ecx 1815 1816 mov dword ptr [rmach4a+2], edx 1817 mov dword ptr [rmach4b+2], edx 1818 mov dword ptr [rmach4c+2], edx 1819 mov dword ptr [rmach4d+2], edx 1820 mov dword ptr [rmach4e+2], edx 1821 1822 mov dword ptr [rmach5a+2], esi 1823 mov dword ptr [rmach5b+2], esi 1824 mov dword ptr [rmach5c+2], esi 1825 mov dword ptr [rmach5d+2], esi 1826 mov dword ptr [rmach5e+2], esi 1827 ret 1828 1829 ;Non power of 2, non masking, with palookup method #1 (6 clock cycles) 1830 ;eax: dat dat dat dat 1831 ;ebx: bufplc 1832 ;ecx: 0 dat 1833 ;edx: xlo 1834 ;esi: ylo 1835 ;edi: videopos/cnt 1836 ;ebp: tempvar 1837 ;esp: 1838ALIGN 16 1839PUBLIC rhlineasm4_ 1840rhlineasm4_: 1841 push ebp 1842 1843 cmp eax, 0 1844 jle endrhline 1845 1846 lea ebp, [edi-4] 1847 sub ebp, eax 1848 mov dword ptr [rmach6a+2], ebp 1849 add ebp, 3 1850 mov dword ptr [rmach6b+2], ebp 1851 mov edi, eax 1852 test edi, 3 1853 jz short begrhline 1854 jmp short startrhline1 1855 1856ALIGN 16 1857startrhline1: 1858 mov cl, byte ptr [ebx] ;bufplc 1859rmach1e: sub edx, 88888888h ;xlo 1860 sbb ebp, ebp 1861rmach2e: sub esi, 88888888h ;ylo 1862rmach3e: sbb ebx, 88888888h ;xhi*tilesizy + yhi+ycarry 1863rmach4e: mov al, byte ptr [ecx+88888888h] ;palookup 1864rmach5e: and ebp, 88888888h ;tilesizy 1865rmach6b: mov byte ptr [edi+88888888h], al ;vidcntoffs 1866 sub ebx, ebp 1867 dec edi 1868 test edi, 3 1869 jnz short startrhline1 1870 test edi, edi 1871 jz endrhline 1872 1873begrhline: 1874 mov cl, byte ptr [ebx] ;bufplc 1875rmach1a: sub edx, 88888888h ;xlo 1876 sbb ebp, ebp 1877rmach2a: sub esi, 88888888h ;ylo 1878rmach3a: sbb ebx, 88888888h ;xhi*tilesizy + yhi+ycarry 1879rmach5a: and ebp, 88888888h ;tilesizy 1880 sub ebx, ebp 1881 1882rmach1b: sub edx, 88888888h ;xlo 1883 sbb ebp, ebp 1884rmach4a: mov ah, byte ptr [ecx+88888888h] ;palookup 1885 mov cl, byte ptr [ebx] ;bufplc 1886rmach2b: sub esi, 88888888h ;ylo 1887rmach3b: sbb ebx, 88888888h ;xhi*tilesizy + yhi+ycarry 1888rmach5b: and ebp, 88888888h ;tilesizy 1889rmach4b: mov al, byte ptr [ecx+88888888h] ;palookup 1890 sub ebx, ebp 1891 1892 shl eax, 16 1893 1894 mov cl, byte ptr [ebx] ;bufplc 1895rmach1c: sub edx, 88888888h ;xlo 1896 sbb ebp, ebp 1897rmach2c: sub esi, 88888888h ;ylo 1898rmach3c: sbb ebx, 88888888h ;xhi*tilesizy + yhi+ycarry 1899rmach5c: and ebp, 88888888h ;tilesizy 1900 sub ebx, ebp 1901 1902rmach1d: sub edx, 88888888h ;xlo 1903 sbb ebp, ebp 1904rmach4c: mov ah, byte ptr [ecx+88888888h] ;palookup 1905 mov cl, byte ptr [ebx] ;bufplc 1906rmach2d: sub esi, 88888888h ;ylo 1907rmach3d: sbb ebx, 88888888h ;xhi*tilesizy + yhi+ycarry 1908rmach5d: and ebp, 88888888h ;tilesizy 1909rmach4d: mov al, byte ptr [ecx+88888888h] ;palookup 1910 sub ebx, ebp 1911 1912rmach6a: mov dword ptr [edi+88888888h], eax ;vidcntoffs 1913 sub edi, 4 1914 jnz begrhline 1915endrhline: 1916 pop ebp 1917 ret 1918 1919ALIGN 16 1920PUBLIC setuprmhlineasm4_ 1921setuprmhlineasm4_: 1922 mov dword ptr [rmmach1+2], eax 1923 mov dword ptr [rmmach2+2], ebx 1924 mov dword ptr [rmmach3+2], ecx 1925 mov dword ptr [rmmach4+2], edx 1926 mov dword ptr [rmmach5+2], esi 1927 ret 1928 1929ALIGN 16 1930PUBLIC rmhlineasm4_ 1931rmhlineasm4_: 1932 push ebp 1933 1934 cmp eax, 0 1935 jle short endrmhline 1936 1937 lea ebp, [edi-1] 1938 sub ebp, eax 1939 mov dword ptr [rmmach6+2], ebp 1940 mov edi, eax 1941 jmp short begrmhline 1942 1943ALIGN 16 1944begrmhline: 1945 mov cl, byte ptr [ebx] ;bufplc 1946rmmach1: sub edx, 88888888h ;xlo 1947 sbb ebp, ebp 1948rmmach2: sub esi, 88888888h ;ylo 1949rmmach3: sbb ebx, 88888888h ;xhi*tilesizy + yhi+ycarry 1950rmmach5: and ebp, 88888888h ;tilesizy 1951 cmp cl, 255 1952 je short rmskip 1953rmmach4: mov al, byte ptr [ecx+88888888h] ;palookup 1954rmmach6: mov byte ptr [edi+88888888h], al ;vidcntoffs 1955rmskip: 1956 sub ebx, ebp 1957 dec edi 1958 jnz short begrmhline 1959endrmhline: 1960 pop ebp 1961 ret 1962 1963ALIGN 16 1964PUBLIC setupqrhlineasm4_ 1965setupqrhlineasm4_: 1966 mov dword ptr [qrmach2e+2], ebx 1967 mov dword ptr [qrmach3e+2], ecx 1968 xor edi, edi 1969 sub edi, ecx 1970 mov dword ptr [qrmach7a+2], edi 1971 mov dword ptr [qrmach7b+2], edi 1972 1973 add ebx, ebx 1974 adc ecx, ecx 1975 mov dword ptr [qrmach2a+2], ebx 1976 mov dword ptr [qrmach2b+2], ebx 1977 mov dword ptr [qrmach3a+2], ecx 1978 mov dword ptr [qrmach3b+2], ecx 1979 1980 mov dword ptr [qrmach4a+2], edx 1981 mov dword ptr [qrmach4b+2], edx 1982 mov dword ptr [qrmach4c+2], edx 1983 mov dword ptr [qrmach4d+2], edx 1984 mov dword ptr [qrmach4e+2], edx 1985 ret 1986 1987 ;Non power of 2, non masking, with palookup method (FASTER BUT NO SBB'S) 1988 ;eax: dat dat dat dat 1989 ;ebx: bufplc 1990 ;ecx: 0 dat 1991 ;edx: 0 dat 1992 ;esi: ylo 1993 ;edi: videopos/cnt 1994 ;ebp: ? 1995 ;esp: 1996ALIGN 16 1997PUBLIC qrhlineasm4_ ;4 pixels in 9 cycles! 2.25 cycles/pixel 1998qrhlineasm4_: 1999 push ebp 2000 2001 cmp eax, 0 2002 jle endqrhline 2003 2004 mov ebp, eax 2005 test ebp, 3 2006 jz short skipqrhline1 2007 jmp short startqrhline1 2008 2009ALIGN 16 2010startqrhline1: 2011 mov cl, byte ptr [ebx] ;bufplc 2012 dec edi 2013qrmach2e: sub esi, 88888888h ;ylo 2014 dec ebp 2015qrmach3e: sbb ebx, 88888888h ;xhi*tilesizy + yhi+ycarry 2016qrmach4e: mov al, byte ptr [ecx+88888888h] ;palookup 2017 mov byte ptr [edi], al ;vidcntoffs 2018 test ebp, 3 2019 jnz short startqrhline1 2020 test ebp, ebp 2021 jz short endqrhline 2022 2023skipqrhline1: 2024 mov cl, byte ptr [ebx] ;bufplc 2025 jmp short begqrhline 2026ALIGN 16 2027begqrhline: 2028qrmach7a: mov dl, byte ptr [ebx+88888888h] ;bufplc 2029qrmach2a: sub esi, 88888888h ;ylo 2030qrmach3a: sbb ebx, 88888888h ;xhi*tilesizy + yhi+ycarry 2031qrmach4a: mov ah, byte ptr [ecx+88888888h] ;palookup 2032qrmach4b: mov al, byte ptr [edx+88888888h] ;palookup 2033 sub edi, 4 2034 shl eax, 16 2035 mov cl, byte ptr [ebx] ;bufplc 2036qrmach7b: mov dl, byte ptr [ebx+88888888h] ;bufplc 2037qrmach2b: sub esi, 88888888h ;ylo 2038qrmach3b: sbb ebx, 88888888h ;xhi*tilesizy + yhi+ycarry 2039qrmach4c: mov ah, byte ptr [ecx+88888888h] ;palookup 2040qrmach4d: mov al, byte ptr [edx+88888888h] ;palookup 2041 mov cl, byte ptr [ebx] ;bufplc 2042 mov dword ptr [edi], eax 2043 sub ebp, 4 2044 jnz short begqrhline 2045 2046endqrhline: 2047 pop ebp 2048 ret 2049 2050 2051PUBLIC setupdrawslab_ 2052setupdrawslab_: 2053 mov dword ptr [voxbpl1+2], eax 2054 mov dword ptr [voxbpl2+2], eax 2055 mov dword ptr [voxbpl3+2], eax 2056 mov dword ptr [voxbpl4+2], eax 2057 mov dword ptr [voxbpl5+2], eax 2058 mov dword ptr [voxbpl6+2], eax 2059 mov dword ptr [voxbpl7+2], eax 2060 mov dword ptr [voxbpl8+2], eax 2061 2062 mov dword ptr [voxpal1+2], ebx 2063 mov dword ptr [voxpal2+2], ebx 2064 mov dword ptr [voxpal3+2], ebx 2065 mov dword ptr [voxpal4+2], ebx 2066 mov dword ptr [voxpal5+2], ebx 2067 mov dword ptr [voxpal6+2], ebx 2068 mov dword ptr [voxpal7+2], ebx 2069 mov dword ptr [voxpal8+2], ebx 2070 ret 2071 2072ALIGN 16 2073PUBLIC drawslab_ 2074drawslab_: 2075 push ebp 2076 cmp eax, 2 2077 je voxbegdraw2 2078 ja voxskip2 2079 xor eax, eax 2080voxbegdraw1: 2081 mov ebp, ebx 2082 shr ebp, 16 2083 add ebx, edx 2084 dec ecx 2085 mov al, byte ptr [esi+ebp] 2086voxpal1: mov al, byte ptr [eax+88888888h] 2087 mov byte ptr [edi], al 2088voxbpl1: lea edi, [edi+88888888h] 2089 jnz voxbegdraw1 2090 pop ebp 2091 ret 2092 2093voxbegdraw2: 2094 mov ebp, ebx 2095 shr ebp, 16 2096 add ebx, edx 2097 xor eax, eax 2098 dec ecx 2099 mov al, byte ptr [esi+ebp] 2100voxpal2: mov al, byte ptr [eax+88888888h] 2101 mov ah, al 2102 mov word ptr [edi], ax 2103voxbpl2: lea edi, [edi+88888888h] 2104 jnz voxbegdraw2 2105 pop ebp 2106 ret 2107 2108voxskip2: 2109 cmp eax, 4 2110 jne voxskip4 2111 xor eax, eax 2112voxbegdraw4: 2113 mov ebp, ebx 2114 add ebx, edx 2115 shr ebp, 16 2116 xor eax, eax 2117 mov al, byte ptr [esi+ebp] 2118voxpal3: mov al, byte ptr [eax+88888888h] 2119 mov ah, al 2120 shl eax, 8 2121 mov al, ah 2122 shl eax, 8 2123 mov al, ah 2124 mov dword ptr [edi], eax 2125voxbpl3: add edi, 88888888h 2126 dec ecx 2127 jnz voxbegdraw4 2128 pop ebp 2129 ret 2130 2131voxskip4: 2132 add eax, edi 2133 2134 test edi, 1 2135 jz voxskipslab1 2136 cmp edi, eax 2137 je voxskipslab1 2138 2139 push eax 2140 push ebx 2141 push ecx 2142 push edi 2143voxbegslab1: 2144 mov ebp, ebx 2145 add ebx, edx 2146 shr ebp, 16 2147 xor eax, eax 2148 mov al, byte ptr [esi+ebp] 2149voxpal4: mov al, byte ptr [eax+88888888h] 2150 mov byte ptr [edi], al 2151voxbpl4: add edi, 88888888h 2152 dec ecx 2153 jnz voxbegslab1 2154 pop edi 2155 pop ecx 2156 pop ebx 2157 pop eax 2158 inc edi 2159 2160voxskipslab1: 2161 push eax 2162 test edi, 2 2163 jz voxskipslab2 2164 dec eax 2165 cmp edi, eax 2166 jge voxskipslab2 2167 2168 push ebx 2169 push ecx 2170 push edi 2171voxbegslab2: 2172 mov ebp, ebx 2173 add ebx, edx 2174 shr ebp, 16 2175 xor eax, eax 2176 mov al, byte ptr [esi+ebp] 2177voxpal5: mov al, byte ptr [eax+88888888h] 2178 mov ah, al 2179 mov word ptr [edi], ax 2180voxbpl5: add edi, 88888888h 2181 dec ecx 2182 jnz voxbegslab2 2183 pop edi 2184 pop ecx 2185 pop ebx 2186 add edi, 2 2187 2188voxskipslab2: 2189 mov eax, [esp] 2190 2191 sub eax, 3 2192 cmp edi, eax 2193 jge voxskipslab3 2194 2195voxprebegslab3: 2196 push ebx 2197 push ecx 2198 push edi 2199voxbegslab3: 2200 mov ebp, ebx 2201 add ebx, edx 2202 shr ebp, 16 2203 xor eax, eax 2204 mov al, byte ptr [esi+ebp] 2205voxpal6: mov al, byte ptr [eax+88888888h] 2206 mov ah, al 2207 shl eax, 8 2208 mov al, ah 2209 shl eax, 8 2210 mov al, ah 2211 mov dword ptr [edi], eax 2212voxbpl6: add edi, 88888888h 2213 dec ecx 2214 jnz voxbegslab3 2215 pop edi 2216 pop ecx 2217 pop ebx 2218 add edi, 4 2219 2220 mov eax, [esp] 2221 2222 sub eax, 3 2223 cmp edi, eax 2224 jl voxprebegslab3 2225 2226voxskipslab3: 2227 mov eax, [esp] 2228 2229 dec eax 2230 cmp edi, eax 2231 jge voxskipslab4 2232 2233 push ebx 2234 push ecx 2235 push edi 2236voxbegslab4: 2237 mov ebp, ebx 2238 add ebx, edx 2239 shr ebp, 16 2240 xor eax, eax 2241 mov al, byte ptr [esi+ebp] 2242voxpal7: mov al, byte ptr [eax+88888888h] 2243 mov ah, al 2244 mov word ptr [edi], ax 2245voxbpl7: add edi, 88888888h 2246 dec ecx 2247 jnz voxbegslab4 2248 pop edi 2249 pop ecx 2250 pop ebx 2251 add edi, 2 2252 2253voxskipslab4: 2254 pop eax 2255 2256 cmp edi, eax 2257 je voxskipslab5 2258 2259voxbegslab5: 2260 mov ebp, ebx 2261 add ebx, edx 2262 shr ebp, 16 2263 xor eax, eax 2264 mov al, byte ptr [esi+ebp] 2265voxpal8: mov al, byte ptr [eax+88888888h] 2266 mov byte ptr [edi], al 2267voxbpl8: add edi, 88888888h 2268 dec ecx 2269 jnz voxbegslab5 2270 2271voxskipslab5: 2272 pop ebp 2273 ret 2274 2275;modify: loinc 2276;eax: | dat | dat | dat | dat | 2277;ebx: | loplc1 | 2278;ecx: | loplc2 | cnthi | cntlo | 2279;edx: |--------|--------|--------| hiplc1 | 2280;esi: |--------|--------|--------| hiplc2 | 2281;edi: |--------|--------|--------| vidplc | 2282;ebp: |--------|--------|--------| hiinc | 2283 2284PUBLIC stretchhline_ 2285stretchhline_: 2286 push ebp 2287 2288 mov eax, ebx 2289 shl ebx, 16 2290 sar eax, 16 2291 and ecx, 0000ffffh 2292 or ecx, ebx 2293 2294 add esi, eax 2295 mov eax, edx 2296 mov edx, esi 2297 2298 mov ebp, eax 2299 shl eax, 16 2300 sar ebp, 16 2301 2302 add ecx, eax 2303 adc esi, ebp 2304 2305 add eax, eax 2306 adc ebp, ebp 2307 mov dword ptr [loinc1+2], eax 2308 mov dword ptr [loinc2+2], eax 2309 mov dword ptr [loinc3+2], eax 2310 mov dword ptr [loinc4+2], eax 2311 2312 inc ch 2313 2314 jmp begloop 2315 2316begloop: 2317 mov al, [edx] 2318loinc1: sub ebx, 88888888h 2319 sbb edx, ebp 2320 mov ah, [esi] 2321loinc2: sub ecx, 88888888h 2322 sbb esi, ebp 2323 sub edi, 4 2324 shl eax, 16 2325loinc3: sub ebx, 88888888h 2326 mov al, [edx] 2327 sbb edx, ebp 2328 mov ah, [esi] 2329loinc4: sub ecx, 88888888h 2330 sbb esi, ebp 2331 mov [edi], eax 2332 dec cl 2333 jnz begloop 2334 dec ch 2335 jnz begloop 2336 2337 pop ebp 2338 ret 2339 2340 2341PUBLIC mmxoverlay_ 2342mmxoverlay_: 2343 pushfd ;Check if CPUID is available 2344 pop eax 2345 mov ebx, eax 2346 xor eax, 00200000h 2347 push eax 2348 popfd 2349 pushfd 2350 pop eax 2351 cmp eax, ebx 2352 je pentium 2353 xor eax, eax 2354 dw 0a20fh 2355 test eax, eax 2356 jz pentium 2357 mov eax, 1 2358 dw 0a20fh 2359 and eax, 00000f00h 2360 test edx, 00800000h ;Check if MMX is available 2361 jz nommx 2362 cmp eax, 00000600h ;Check if P6 Family or not 2363 jae pentiumii 2364 jmp pentiummmx 2365nommx: 2366 cmp eax, 00000600h ;Check if P6 Family or not 2367 jae pentiumpro 2368pentium: 2369 ret 2370 2371;��������������������������������������������������������������Ŀ 2372;� PENTIUM II Overlays � 2373;���������������������������������������������������������������� 2374pentiumii: 2375 ;Hline overlay (MMX doens't help) 2376 mov byte ptr [sethlinesizes_], 0xe9 2377 mov dword ptr [sethlinesizes_+1], (offset prosethlinesizes_)-(offset sethlinesizes_)-5 2378 mov byte ptr [setpalookupaddress_], 0xe9 2379 mov dword ptr [setpalookupaddress_+1], (offset prosetpalookupaddress_)-(offset setpalookupaddress_)-5 2380 mov byte ptr [setuphlineasm4_], 0xc3 ;ret (no code required) 2381 mov byte ptr [hlineasm4_], 0xe9 2382 mov dword ptr [hlineasm4_+1], (offset prohlineasm4_)-(offset hlineasm4_)-5 2383 2384 ;Vline overlay 2385 mov byte ptr [setupvlineasm_], 0xe9 2386 mov dword ptr [setupvlineasm_+1], (offset prosetupvlineasm_)-(offset setupvlineasm_)-5 2387 mov byte ptr [vlineasm4_], 0xe9 2388 mov dword ptr [vlineasm4_+1], (offset provlineasm4_)-(offset vlineasm4_)-5 2389 2390 ret 2391 2392;��������������������������������������������������������������Ŀ 2393;� PENTIUM MMX Overlays � 2394;���������������������������������������������������������������� 2395pentiummmx: 2396 ret 2397 2398;��������������������������������������������������������������Ŀ 2399;� PENTIUM PRO Overlays � 2400;���������������������������������������������������������������� 2401pentiumpro: 2402 ;Hline overlay (MMX doens't help) 2403 mov byte ptr [sethlinesizes_], 0xe9 2404 mov dword ptr [sethlinesizes_+1], (offset prosethlinesizes_)-(offset sethlinesizes_)-5 2405 mov byte ptr [setpalookupaddress_], 0xe9 2406 mov dword ptr [setpalookupaddress_+1], (offset prosetpalookupaddress_)-(offset setpalookupaddress_)-5 2407 mov byte ptr [setuphlineasm4_], 0xc3 ;ret (no code required) 2408 mov byte ptr [hlineasm4_], 0xe9 2409 mov dword ptr [hlineasm4_+1], (offset prohlineasm4_)-(offset hlineasm4_)-5 2410 2411 ;Vline overlay 2412 mov byte ptr [setupvlineasm_], 0xe9 2413 mov dword ptr [setupvlineasm_+1], (offset prosetupvlineasm_)-(offset setupvlineasm_)-5 2414 mov byte ptr [vlineasm4_], 0xe9 2415 mov dword ptr [vlineasm4_+1], (offset provlineasm4_)-(offset vlineasm4_)-5 2416 2417 ret 2418 2419CODE ENDS 2420END 2421