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