|
|
1.1 ! root 1: ;---------------------------Module-Header------------------------------; ! 2: ; Module Name: strips.asm ! 3: ; ! 4: ; Routines used by line code to draw strips of pixels. ! 5: ; ! 6: ; Copyright (c) 1992 Microsoft Corporation ! 7: ;-----------------------------------------------------------------------; ! 8: ! 9: .386 ! 10: ! 11: .model small,c ! 12: ! 13: assume cs:FLAT,ds:FLAT,es:FLAT,ss:FLAT ! 14: assume fs:nothing,gs:nothing ! 15: ! 16: ; Set LOOP_UNROLL_SHIFT to the log2 of the number of times you want loops in ! 17: ; this module unrolled. For example, LOOP_UNROLL_SHIFT of 3 yields 2**3 = 8 ! 18: ; times unrolling. This is the only thing you need to change to control ! 19: ; unrolling. ! 20: ! 21: LOOP_UNROLL_SHIFT equ 2 ! 22: ! 23: .xlist ! 24: include stdcall.inc ;calling convention cmacros ! 25: include i386\egavga.inc ! 26: include i386\strucs.inc ! 27: include i386\driver.inc ! 28: include i386\lines.inc ! 29: include i386\unroll.inc ! 30: .list ! 31: ! 32: .code ! 33: ! 34: ;--------------------------Private-Routine------------------------------; ! 35: ; vStripSolid0 ! 36: ; ! 37: ; Draw lines in the 1st half-octant. ! 38: ; ! 39: ;-----------------------------------------------------------------------; ! 40: ! 41: cProc vStripSolid0,12,< \ ! 42: uses esi edi ebx, \ ! 43: pStrips: ptr STRIPS, \ ! 44: pls: ptr LINESTATE, \ ! 45: plStripEnd: ptr > ! 46: ! 47: ; Do some initializing: ! 48: ! 49: mov esi, pStrips ! 50: push ebp ! 51: mov ebp, plStripEnd ! 52: ! 53: mov eax,[esi].ST_lNextScan ! 54: mov [ebp],eax ;copy delta ! 55: ! 56: mov eax,[esi].ST_chAndXor ! 57: mov bl,ah ! 58: mov bh,ah ! 59: mov ah,al ! 60: ! 61: mov edi,[esi].ST_pjScreen ! 62: add esi,offset ST_alStrips ! 63: ! 64: ; ax = and mask ! 65: ; bx = xor mask ! 66: ; ecx = pixel count ! 67: ; dx = temporary register ! 68: ; esi = strip pointer ! 69: ; edi = display pointer ! 70: ; ebp = ends of strips pointer ! 71: ; [ebp] = delta ! 72: ! 73: mov ecx,[esi] ! 74: add esi,4 ! 75: test edi,1 ! 76: jnz short sol0_unaligned_start ! 77: ! 78: align 4 ! 79: sol0_aligned_loop: ! 80: sub ecx,2 ! 81: jl short sol0_strip_end_unaligned ! 82: je short sol0_strip_end_aligned ! 83: mov dx,[edi] ! 84: and edx,eax ! 85: xor edx,ebx ! 86: mov [edi],dx ! 87: add edi,2 ! 88: jmp short sol0_aligned_loop ! 89: ! 90: align 4 ! 91: sol0_strip_end_aligned: ! 92: mov dx,[edi] ! 93: and edx,eax ! 94: xor edx,ebx ! 95: mov [edi],dx ! 96: add edi,2 ! 97: add edi,[ebp] ;go to next scan ! 98: ! 99: cmp esi,ebp ! 100: jae short sol0_all_done ! 101: ! 102: mov ecx,[esi] ! 103: add esi,4 ! 104: jmp short sol0_aligned_loop ! 105: ! 106: align 4 ! 107: sol0_strip_end_unaligned: ! 108: mov dl,[edi] ;do last pixel ! 109: and dl,al ! 110: xor dl,bl ! 111: mov [edi],dl ! 112: inc edi ! 113: add edi,[ebp] ;go to next scan ! 114: ! 115: cmp esi,ebp ! 116: jae short sol0_all_done ! 117: ! 118: mov ecx,[esi] ;do first pixel of next strip ! 119: add esi,4 ! 120: ! 121: sol0_unaligned_start: ! 122: mov dl,[edi] ! 123: and dl,al ! 124: xor dl,bl ! 125: mov [edi],dl ! 126: inc edi ! 127: dec ecx ! 128: jnz short sol0_aligned_loop ! 129: ! 130: ; Have to be careful when there is only one pel in the strip and it starts ! 131: ; on an unaligned address: ! 132: ! 133: add edi,[ebp] ! 134: cmp esi,ebp ! 135: jae short sol0_all_done ! 136: ! 137: mov ecx,[esi] ! 138: add esi,4 ! 139: jmp short sol0_aligned_loop ! 140: ! 141: sol0_all_done: ! 142: pop ebp ! 143: mov esi, pStrips ! 144: mov [esi].ST_pjScreen,edi ! 145: cRet vStripSolid0 ! 146: ! 147: endProc vStripSolid0 ! 148: ! 149: ;--------------------------Private-Routine------------------------------; ! 150: ; vStripSolid1 ! 151: ; ! 152: ; Draws lines in the 2nd half-octant. ! 153: ; ! 154: ;-----------------------------------------------------------------------; ! 155: ! 156: cProc vStripSolid1,12,< \ ! 157: uses esi edi ebx, \ ! 158: pStrips: ptr STRIPS, \ ! 159: pls: ptr LINESTATE, \ ! 160: plStripEnd: ptr > ! 161: ! 162: mov esi,pStrips ! 163: push ebp ! 164: mov ebp,plStripEnd ! 165: mov ecx,[esi].ST_lNextScan ! 166: inc ecx ; Make delta advance 1 to right ! 167: mov eax,[esi].ST_chAndXor ! 168: mov edi,[esi].ST_pjScreen ! 169: add esi,offset ST_alStrips ! 170: ! 171: ; al = and mask ! 172: ; ah = xor mask ! 173: ; ebx = pixel count ! 174: ; ecx = delta ! 175: ; dl = temporary register ! 176: ; esi = strip pointer ! 177: ; edi = memory pointer ! 178: ; ebp = end of strips pointer ! 179: ! 180: sol1_next_diagonal: ! 181: mov ebx,[esi] ! 182: add esi, 4 ! 183: ! 184: align 4 ! 185: sol1_diagonal_loop: ! 186: mov dl,[edi] ! 187: and dl,al ! 188: xor dl,ah ! 189: mov [edi],dl ! 190: ! 191: add edi,ecx ! 192: dec ebx ! 193: jnz short sol1_diagonal_loop ! 194: ! 195: sub edi,ecx ! 196: inc edi ! 197: cmp esi,ebp ! 198: jb short sol1_next_diagonal ! 199: ! 200: pop ebp ! 201: mov esi, pStrips ! 202: mov [esi].ST_pjScreen,edi ! 203: cRet vStripSolid1 ! 204: ! 205: endProc vStripSolid1 ! 206: ! 207: ;--------------------------Private-Routine------------------------------; ! 208: ; vStripSolid2 ! 209: ; ! 210: ; Draws lines in the 3rd half-octant. ! 211: ; ! 212: ;-----------------------------------------------------------------------; ! 213: ! 214: cProc vStripSolid2,12,< \ ! 215: uses esi edi ebx, \ ! 216: pStrips: ptr STRIPS, \ ! 217: pls: ptr LINESTATE, \ ! 218: plStripEnd: ptr > ! 219: ! 220: mov esi,pStrips ! 221: push ebp ! 222: mov ebp,plStripEnd ! 223: mov ecx,[esi].ST_lNextScan ! 224: inc ecx ; Make delta advance 1 to right ! 225: mov eax,[esi].ST_chAndXor ! 226: mov edi,[esi].ST_pjScreen ! 227: add esi,offset ST_alStrips ! 228: ! 229: ; al = and mask ! 230: ; ah = xor mask ! 231: ; ebx = pixel count ! 232: ; ecx = delta ! 233: ; dl = temporary register ! 234: ; esi = strip pointer ! 235: ; edi = memory pointer ! 236: ; ebp = end of strips pointer ! 237: ! 238: align 4 ! 239: sol2_next_diagonal: ! 240: mov ebx,[esi] ! 241: add esi,4 ! 242: ! 243: align 4 ! 244: sol2_diagonal_loop: ! 245: mov dl,[edi] ! 246: and dl,al ! 247: xor dl,ah ! 248: mov [edi],dl ! 249: ! 250: add edi,ecx ! 251: dec ebx ! 252: jnz short sol2_diagonal_loop ! 253: ! 254: dec edi ! 255: cmp esi,ebp ! 256: jb short sol2_next_diagonal ! 257: ! 258: pop ebp ! 259: mov esi, pStrips ! 260: mov [esi].ST_pjScreen,edi ! 261: cRet vStripSolid2 ! 262: ! 263: endProc vStripSolid2 ! 264: ! 265: ;--------------------------Private-Routine------------------------------; ! 266: ; vStripSolid3 ! 267: ; ! 268: ; Draws lines in the 4th half-octant. ! 269: ; ! 270: ;-----------------------------------------------------------------------; ! 271: ! 272: cProc vStripSolid3,12,< \ ! 273: uses esi edi ebx, \ ! 274: pStrips: ptr STRIPS, \ ! 275: pls: ptr LINESTATE, \ ! 276: plStripEnd: ptr > ! 277: ! 278: mov esi,pStrips ! 279: push ebp ! 280: mov ebp,plStripEnd ! 281: mov ecx,[esi].ST_lNextScan ! 282: mov eax,[esi].ST_chAndXor ! 283: mov edi,[esi].ST_pjScreen ! 284: add esi,offset ST_alStrips ! 285: ! 286: ; al = and mask ! 287: ; ah = xor mask ! 288: ; ebx = pixel count ! 289: ; ecx = delta ! 290: ; dl = temporary register ! 291: ; esi = strip pointer ! 292: ; edi = memory pointer ! 293: ; ebp = end of strips pointer ! 294: ! 295: align 4 ! 296: sol3_next_vertical: ! 297: mov ebx,[esi] ! 298: add esi,4 ! 299: ! 300: align 4 ! 301: sol3_vertical_loop: ! 302: mov dl,[edi] ! 303: and dl,al ! 304: xor dl,ah ! 305: mov [edi],dl ! 306: ! 307: add edi,ecx ! 308: dec ebx ! 309: jnz short sol3_vertical_loop ! 310: ! 311: inc edi ! 312: cmp esi,ebp ! 313: jb short sol3_next_vertical ! 314: ! 315: pop ebp ! 316: mov esi,pStrips ! 317: mov [esi].ST_pjScreen,edi ! 318: cRet vStripSolid3 ! 319: ! 320: endProc vStripSolid3 ! 321: ! 322: ;--------------------------Private-Routine------------------------------; ! 323: ; vStripStyled0 ! 324: ; ! 325: ; Draws styled lines in the 1st half-octant. ! 326: ; ! 327: ;-----------------------------------------------------------------------; ! 328: ! 329: cProc vStripStyled0,12,< \ ! 330: uses esi edi ebx, \ ! 331: pStrips: ptr STRIPS, \ ! 332: pls: ptr LINESTATE, \ ! 333: plStripEnd: ptr > ! 334: ! 335: local ulSaveEsp: dword ;we need lotsa registers ! 336: local pspEnd: dword ;pointer to end of style array ! 337: local cjMajor: dword ;lNextScan for screen ! 338: local cjStyleDelta: dword ;delta from end of style array to start ! 339: ! 340: ; al = and mask ! 341: ; ah = xor mask ! 342: ; ebx = # of pixels in current strip ! 343: ; ecx = style pointer ! 344: ; edx = temporary register ! 345: ; esi = strips pointer ! 346: ; edi = memory pointer ! 347: ; esp = # of pixels in current style ! 348: ! 349: mov esi,pStrips ! 350: mov ulSaveEsp,esp ! 351: ! 352: mov eax,[esi].ST_lNextScan ! 353: mov cjMajor,eax ! 354: mov eax,[esi].ST_pspEnd ! 355: mov pspEnd,eax ! 356: mov ebx,[esi].ST_pspStart ! 357: sub ebx,eax ;compute cjStyleDelta ! 358: sub ebx,4 ;make it exclusive ! 359: mov cjStyleDelta,ebx ! 360: ! 361: mov eax,[esi].ST_chAndXor ! 362: mov ecx,[esi].ST_psp ! 363: mov edx,[esi].ST_bIsGap ! 364: mov edi,[esi].ST_pjScreen ! 365: mov esp,[esi].ST_spRemaining ! 366: add esi,offset ST_alStrips ! 367: ! 368: mov ebx,[esi] ! 369: add esi,4 ! 370: ! 371: or edx,edx ! 372: jz short sty0_output_loop ;if working on a dash, start there ! 373: jmp short sty0_skip_loop ;if working on a gap, start there ! 374: ! 375: sty0_prepare_for_output: ! 376: add edi,esp ;adjust to do remainder of strip ! 377: ! 378: add ecx,4 ! 379: cmp pspEnd,ecx ;if (ecx == pspEnd + 4) ! 380: sbb edx,edx ; then ecx = pspStart ! 381: and edx,cjStyleDelta ! 382: add ecx,edx ! 383: ! 384: mov ebx,esp ! 385: mov esp,[ecx] ;get next style array element ! 386: neg ebx ! 387: jz short sty0_output_get_new_strip ! 388: ! 389: align 4 ! 390: sty0_output_loop: ! 391: mov dl,[edi] ! 392: and dl,al ! 393: xor dl,ah ! 394: mov [edi],dl ;write pixel ! 395: inc edi ;move one pixel to right ! 396: dec esp ;might have to go to next style element ! 397: jz short sty0_prepare_for_skip ! 398: ! 399: dec ebx ! 400: jnz short sty0_output_loop ! 401: ! 402: sty0_output_get_new_strip: ! 403: add edi,cjMajor ;move up one scan ! 404: cmp esi,plStripEnd ! 405: jae short sty0_output_all_done ! 406: ! 407: mov ebx,[esi] ;get next strip ! 408: add esi,4 ! 409: jmp short sty0_output_loop ! 410: ! 411: sty0_output_all_done: ! 412: mov esi,pStrips ! 413: mov [esi].ST_pjScreen,edi ! 414: mov [esi].ST_bIsGap,0 ;we were working on a dash ! 415: mov [esi].ST_spRemaining,esp ! 416: mov [esi].ST_psp,ecx ! 417: mov esp,ulSaveEsp ! 418: cRet vStripStyled0 ! 419: ! 420: sty0_prepare_for_skip: ! 421: add ecx,4 ! 422: cmp pspEnd,ecx ;if (ecx == pspEnd + 4) ! 423: sbb edx,edx ; then ecx = pspStart ! 424: and edx,cjStyleDelta ! 425: add ecx,edx ! 426: ! 427: dec ebx ! 428: mov esp,[ecx] ;get next style array element ! 429: jz short sty0_skip_get_new_strip ! 430: ! 431: sty0_skip_loop: ! 432: add edi,ebx ;assume we'll skip entire strip ! 433: sub esp,ebx ; (we'll correct it if not) ! 434: jle short sty0_prepare_for_output ! 435: ! 436: sty0_skip_get_new_strip: ! 437: add edi,cjMajor ;move up one scan ! 438: cmp esi,plStripEnd ! 439: jae short sty0_skip_all_done ! 440: ! 441: mov ebx,[esi] ;get next strip ! 442: add esi,4 ! 443: jmp short sty0_skip_loop ! 444: ! 445: sty0_skip_all_done: ! 446: mov esi,pStrips ! 447: mov [esi].ST_pjScreen,edi ! 448: mov [esi].ST_bIsGap,0ffh ;we were working on a gap ! 449: mov [esi].ST_spRemaining,esp ! 450: mov [esi].ST_psp,ecx ! 451: mov esp,ulSaveEsp ! 452: cRet vStripStyled0 ! 453: ! 454: endProc vStripStyled0 ! 455: ! 456: ;--------------------------Private-Routine------------------------------; ! 457: ; vStripStyled123 ! 458: ; ! 459: ; Draws styled lines in the 2nd, 3rd and 4th half-octants. ! 460: ; ! 461: ;-----------------------------------------------------------------------; ! 462: ! 463: cProc vStripStyled123,12,< \ ! 464: uses esi edi ebx, \ ! 465: pStrips: ptr STRIPS, \ ! 466: pls: ptr LINESTATE, \ ! 467: plStripEnd: ptr > ! 468: ! 469: local ulSaveEsp: dword ;we need lotsa registers ! 470: local pspEnd: dword ;pointer to end of style array ! 471: local cjMajor: dword ;delta to go in major direction ! 472: local cjMinor: dword ;delta to go in minor direction ! 473: local cjStyleDelta: dword ;delta from end of style array to start ! 474: ! 475: ; al = and mask ! 476: ; ah = xor mask ! 477: ; ebx = # of pixels in current strip ! 478: ; ecx = style pointer ! 479: ; edx = temporary register ! 480: ; esi = strips pointer ! 481: ; edi = memory pointer ! 482: ; esp = # of pixels in current style ! 483: ! 484: mov esi,pStrips ! 485: mov ulSaveEsp,esp ! 486: ! 487: ; If in half-octant 3, cjMajor = cjDelta and cjMinor = 1 ! 488: ; If in half-octant 2, cjMajor = cjDelta + 1 and cjMinor = -1 ! 489: ; If in half-octant 1, cjMajor = cjDelta + 1 and cjMinor = -cjDelta ! 490: ! 491: mov eax,[esi].ST_lNextScan ! 492: mov ebx,[esi].ST_flFlips ! 493: test ebx,FL_FLIP_HALF ! 494: jz short sty3_halfoctant_3 ! 495: ! 496: inc eax ! 497: mov cjMajor,eax ! 498: mov cjMinor,-1 ! 499: ! 500: test ebx,FL_FLIP_D ! 501: jnz short sty3_done_major_minor_comp ! 502: ! 503: neg eax ! 504: inc eax ! 505: mov cjMinor,eax ! 506: jmp short sty3_done_major_minor_comp ! 507: ! 508: sty3_halfoctant_3: ! 509: mov cjMajor,eax ! 510: mov cjMinor,1 ! 511: ! 512: sty3_done_major_minor_comp: ! 513: mov eax,[esi].ST_pspEnd ! 514: mov pspEnd,eax ! 515: mov ebx,[esi].ST_pspStart ! 516: sub ebx,eax ;compute cjStyleDelta ! 517: sub ebx,4 ;make it exclusive ! 518: mov cjStyleDelta,ebx ! 519: ! 520: mov eax,[esi].ST_chAndXor ! 521: mov ecx,[esi].ST_psp ! 522: mov edx,[esi].ST_bIsGap ! 523: mov edi,[esi].ST_pjScreen ! 524: mov esp,[esi].ST_spRemaining ! 525: add esi,offset ST_alStrips ! 526: ! 527: mov ebx,[esi] ! 528: add esi,4 ! 529: ! 530: or edx,edx ! 531: jz short sty3_output_loop ;if working on a dash, start there ! 532: jmp short sty3_skip_loop ;if working on a gap, start there ! 533: ! 534: sty3_prepare_for_output: ! 535: add ecx,4 ! 536: cmp pspEnd,ecx ;if (ecx == pspEnd + 4) ! 537: sbb edx,edx ; then ecx = pspStart ! 538: and edx,cjStyleDelta ! 539: add ecx,edx ! 540: ! 541: mov ebx,esp ! 542: mov esp,[ecx] ;get next style array element ! 543: neg ebx ;adjust to do remainder of strip ! 544: ! 545: jz short sty3_output_get_new_strip ! 546: ! 547: align 4 ! 548: sty3_output_loop: ! 549: mov dl,[edi] ! 550: and dl,al ! 551: xor dl,ah ! 552: mov [edi],dl ;write pixel ! 553: add edi,cjMajor ;move to next scan ! 554: dec esp ;might have to go to next style element ! 555: jz short sty3_prepare_for_skip ! 556: ! 557: dec ebx ! 558: jnz short sty3_output_loop ! 559: ! 560: sty3_output_get_new_strip: ! 561: add edi,cjMinor ;move one pixel in minor direction ! 562: cmp esi,plStripEnd ! 563: jae short sty3_output_all_done ! 564: ! 565: mov ebx,[esi] ;get next strip ! 566: add esi,4 ! 567: jmp short sty3_output_loop ! 568: ! 569: sty3_output_all_done: ! 570: mov esi,pStrips ! 571: mov [esi].ST_pjScreen,edi ! 572: mov [esi].ST_bIsGap,0 ;we were working on a dash ! 573: mov [esi].ST_spRemaining,esp ! 574: mov [esi].ST_psp,ecx ! 575: mov esp,ulSaveEsp ! 576: cRet vStripStyled123 ! 577: ! 578: sty3_prepare_for_skip: ! 579: add ecx,4 ! 580: cmp pspEnd,ecx ;if (ecx == pspEnd + 4) ! 581: sbb edx,edx ; then ecx = pspStart ! 582: and edx,cjStyleDelta ! 583: add ecx,edx ! 584: ! 585: dec ebx ! 586: mov esp,[ecx] ;get next style array element ! 587: jz short sty3_skip_get_new_strip ! 588: ! 589: sty3_skip_loop: ! 590: ! 591: ; compute min(left in strip, left in style) ! 592: ! 593: sub esp,ebx ;esp = # style - # strip ! 594: sbb edx,edx ! 595: and edx,esp ! 596: add ebx,edx ;ebx = min(pels left in strip, ! 597: ; pels left in style) ! 598: ! 599: mov edx,cjMajor ! 600: imul edx,ebx ! 601: add edi,edx ;adjust our pointer ! 602: ! 603: cmp esp,0 ! 604: jle short sty3_prepare_for_output ! 605: ! 606: sty3_skip_get_new_strip: ! 607: add edi,cjMinor ;move one pixel in minor direction ! 608: cmp esi,plStripEnd ! 609: jae short sty3_skip_all_done ! 610: ! 611: mov ebx,[esi] ;get next strip ! 612: add esi,4 ! 613: jmp short sty3_skip_loop ! 614: ! 615: sty3_skip_all_done: ! 616: mov esi,pStrips ! 617: mov [esi].ST_pjScreen,edi ! 618: mov [esi].ST_bIsGap,0ffh ;we were working on a gap ! 619: mov [esi].ST_spRemaining,esp ! 620: mov [esi].ST_psp,ecx ! 621: mov esp,ulSaveEsp ! 622: cRet vStripStyled123 ! 623: ! 624: endProc vStripStyled123 ! 625: ! 626: ;--------------------------Private-Routine------------------------------; ! 627: ; vStripSolidSet0 ! 628: ; ! 629: ; Draw lines in the 1st half-octant. ! 630: ; ! 631: ;-----------------------------------------------------------------------; ! 632: ! 633: cProc vStripSolidSet0,12,< \ ! 634: uses esi edi ebx, \ ! 635: pStrips: ptr STRIPS, \ ! 636: pls: ptr LINESTATE, \ ! 637: plStripEnd: ptr > ! 638: ! 639: ; Do some initializing: ! 640: ! 641: mov esi, pStrips ! 642: push ebp ! 643: mov ebp, plStripEnd ! 644: ! 645: mov eax,[esi].ST_lNextScan ! 646: mov [ebp],eax ;copy delta ! 647: ! 648: mov eax,[esi].ST_chAndXor ! 649: mov bl,ah ! 650: mov bh,ah ! 651: mov ah,al ! 652: ! 653: mov edi,[esi].ST_pjScreen ! 654: add esi,offset ST_alStrips ! 655: ! 656: ; ax = and mask ! 657: ; bx = xor mask ! 658: ; ecx = pixel count ! 659: ; dx = temporary register ! 660: ; esi = strip pointer ! 661: ; edi = display pointer ! 662: ; ebp = ends of strips pointer ! 663: ; [ebp] = delta ! 664: ! 665: mov ecx,[esi] ! 666: add esi,4 ! 667: test edi,1 ! 668: jnz short sol0s_unaligned_start ! 669: ! 670: align 4 ! 671: sol0s_aligned_loop: ! 672: sub ecx,2 ! 673: jl short sol0s_strip_end_unaligned ! 674: je short sol0s_strip_end_aligned ! 675: mov [edi],bx ! 676: add edi,2 ! 677: jmp short sol0s_aligned_loop ! 678: ! 679: align 4 ! 680: sol0s_strip_end_aligned: ! 681: mov [edi],bx ! 682: add edi,2 ! 683: add edi,[ebp] ;go to next scan ! 684: ! 685: cmp esi,ebp ! 686: jae short sol0s_all_done ! 687: ! 688: mov ecx,[esi] ! 689: add esi,4 ! 690: jmp short sol0s_aligned_loop ! 691: ! 692: align 4 ! 693: sol0s_strip_end_unaligned: ! 694: mov [edi],bl ;do last pixel ! 695: inc edi ! 696: add edi,[ebp] ;go to next scan ! 697: ! 698: cmp esi,ebp ! 699: jae short sol0s_all_done ! 700: ! 701: mov ecx,[esi] ;do first pixel of next strip ! 702: add esi,4 ! 703: ! 704: sol0s_unaligned_start: ! 705: mov [edi],bl ! 706: inc edi ! 707: dec ecx ! 708: jnz short sol0s_aligned_loop ! 709: ! 710: ; Have to be careful when there is only one pel in the strip and it starts ! 711: ; on an unaligned address: ! 712: ! 713: add edi,[ebp] ! 714: cmp esi,ebp ! 715: jae short sol0s_all_done ! 716: ! 717: mov ecx,[esi] ! 718: add esi,4 ! 719: jmp short sol0s_aligned_loop ! 720: ! 721: sol0s_all_done: ! 722: pop ebp ! 723: mov esi, pStrips ! 724: mov [esi].ST_pjScreen,edi ! 725: cRet vStripSolidSet0 ! 726: ! 727: endProc vStripSolidSet0 ! 728: ! 729: ;--------------------------Private-Routine------------------------------; ! 730: ; vStripSolidSet1 ! 731: ; ! 732: ; Draws lines in the 2nd half-octant. ! 733: ; ! 734: ;-----------------------------------------------------------------------; ! 735: ! 736: cProc vStripSolidSet1,12,< \ ! 737: uses esi edi ebx, \ ! 738: pStrips: ptr STRIPS, \ ! 739: pls: ptr LINESTATE, \ ! 740: plStripEnd: ptr > ! 741: ! 742: mov esi,pStrips ! 743: push ebp ! 744: mov ebp,plStripEnd ! 745: mov ecx,[esi].ST_lNextScan ! 746: inc ecx ; Make delta advance 1 to right ! 747: mov eax,[esi].ST_chAndXor ! 748: mov edi,[esi].ST_pjScreen ! 749: add esi,offset ST_alStrips ! 750: ! 751: ; al = and mask ! 752: ; ah = xor mask ! 753: ; ebx = pixel count ! 754: ; ecx = delta ! 755: ; dl = temporary register ! 756: ; esi = strip pointer ! 757: ; edi = memory pointer ! 758: ; ebp = end of strips pointer ! 759: ! 760: align 4 ! 761: sol1s_next_diagonal: ! 762: mov ebx,[esi] ! 763: add esi, 4 ! 764: ! 765: align 4 ! 766: sol1s_diagonal_loop: ! 767: mov [edi],ah ! 768: ! 769: add edi,ecx ! 770: dec ebx ! 771: jnz short sol1s_diagonal_loop ! 772: ! 773: sub edi,ecx ! 774: inc edi ! 775: cmp esi,ebp ! 776: jb short sol1s_next_diagonal ! 777: ! 778: pop ebp ! 779: mov esi, pStrips ! 780: mov [esi].ST_pjScreen,edi ! 781: cRet vStripSolidSet1 ! 782: ! 783: endProc vStripSolidSet1 ! 784: ! 785: ;--------------------------Private-Routine------------------------------; ! 786: ; vStripSolidSet2 ! 787: ; ! 788: ; Draws lines in the 3rd half-octant. ! 789: ; ! 790: ;-----------------------------------------------------------------------; ! 791: ! 792: cProc vStripSolidSet2,12,< \ ! 793: uses esi edi ebx, \ ! 794: pStrips: ptr STRIPS, \ ! 795: pls: ptr LINESTATE, \ ! 796: plStripEnd: ptr > ! 797: ! 798: mov esi,pStrips ! 799: push ebp ! 800: mov ebp,plStripEnd ! 801: mov ecx,[esi].ST_lNextScan ! 802: inc ecx ; Make delta advance 1 to right ! 803: mov eax,[esi].ST_chAndXor ! 804: mov edi,[esi].ST_pjScreen ! 805: add esi,offset ST_alStrips ! 806: ! 807: ; al = and mask ! 808: ; ah = xor mask ! 809: ; ebx = pixel count ! 810: ; ecx = delta ! 811: ; dl = temporary register ! 812: ; esi = strip pointer ! 813: ; edi = memory pointer ! 814: ; ebp = end of strips pointer ! 815: ! 816: align 4 ! 817: sol2s_next_diagonal: ! 818: mov ebx,[esi] ! 819: add esi,4 ! 820: ! 821: align 4 ! 822: sol2s_diagonal_loop: ! 823: mov [edi],ah ! 824: ! 825: add edi,ecx ! 826: dec ebx ! 827: jnz short sol2s_diagonal_loop ! 828: ! 829: dec edi ! 830: cmp esi,ebp ! 831: jb short sol2s_next_diagonal ! 832: ! 833: pop ebp ! 834: mov esi, pStrips ! 835: mov [esi].ST_pjScreen,edi ! 836: cRet vStripSolidSet2 ! 837: ! 838: endProc vStripSolidSet2 ! 839: ! 840: ;--------------------------Private-Routine------------------------------; ! 841: ; vStripSolidSet3 ! 842: ; ! 843: ; Draws lines in the 4th half-octant. ! 844: ; ! 845: ;-----------------------------------------------------------------------; ! 846: ! 847: cProc vStripSolidSet3,12,< \ ! 848: uses esi edi ebx, \ ! 849: pStrips: ptr STRIPS, \ ! 850: pls: ptr LINESTATE, \ ! 851: plStripEnd: ptr > ! 852: ! 853: mov esi,pStrips ! 854: push ebp ! 855: mov ebp,plStripEnd ! 856: mov ecx,[esi].ST_lNextScan ! 857: mov eax,[esi].ST_chAndXor ! 858: mov edi,[esi].ST_pjScreen ! 859: add esi,offset ST_alStrips ! 860: ! 861: ; al = and mask ! 862: ; ah = xor mask ! 863: ; ebx = pixel count ! 864: ; ecx = delta ! 865: ; dl = temporary register ! 866: ; esi = strip pointer ! 867: ; edi = memory pointer ! 868: ; ebp = end of strips pointer ! 869: ! 870: align 4 ! 871: sol3s_next_vertical: ! 872: mov ebx,[esi] ! 873: add esi,4 ! 874: ! 875: align 4 ! 876: sol3s_vertical_loop: ! 877: mov [edi],ah ! 878: ! 879: add edi,ecx ! 880: dec ebx ! 881: jnz short sol3s_vertical_loop ! 882: ! 883: inc edi ! 884: cmp esi,ebp ! 885: jb short sol3s_next_vertical ! 886: ! 887: pop ebp ! 888: mov esi,pStrips ! 889: mov [esi].ST_pjScreen,edi ! 890: cRet vStripSolidSet3 ! 891: ! 892: endProc vStripSolidSet3 ! 893: ! 894: ;--------------------------Private-Routine------------------------------; ! 895: ; vStripStyledSet0 ! 896: ; ! 897: ; Draws styled lines in the 1st half-octant. ! 898: ; ! 899: ;-----------------------------------------------------------------------; ! 900: ! 901: cProc vStripStyledSet0,12,< \ ! 902: uses esi edi ebx, \ ! 903: pStrips: ptr STRIPS, \ ! 904: pls: ptr LINESTATE, \ ! 905: plStripEnd: ptr > ! 906: ! 907: local ulSaveEsp: dword ;we need lotsa registers ! 908: local pspEnd: dword ;pointer to end of style array ! 909: local cjMajor: dword ;lNextScan for screen ! 910: local cjStyleDelta: dword ;delta from end of style array to start ! 911: ! 912: ; al = and mask ! 913: ; ah = xor mask ! 914: ; ebx = # of pixels in current strip ! 915: ; ecx = style pointer ! 916: ; edx = temporary register ! 917: ; esi = strips pointer ! 918: ; edi = memory pointer ! 919: ; esp = # of pixels in current style ! 920: ! 921: mov esi,pStrips ! 922: mov ulSaveEsp,esp ! 923: ! 924: mov eax,[esi].ST_lNextScan ! 925: mov cjMajor,eax ! 926: mov eax,[esi].ST_pspEnd ! 927: mov pspEnd,eax ! 928: mov ebx,[esi].ST_pspStart ! 929: sub ebx,eax ;compute cjStyleDelta ! 930: sub ebx,4 ;make it exclusive ! 931: mov cjStyleDelta,ebx ! 932: ! 933: mov eax,[esi].ST_chAndXor ! 934: mov ecx,[esi].ST_psp ! 935: mov edx,[esi].ST_bIsGap ! 936: mov edi,[esi].ST_pjScreen ! 937: mov esp,[esi].ST_spRemaining ! 938: add esi,offset ST_alStrips ! 939: ! 940: mov ebx,[esi] ! 941: add esi,4 ! 942: ! 943: or edx,edx ! 944: jz short sty0s_output_loop ;if working on a dash, start there ! 945: jmp short sty0s_skip_loop ;if working on a gap, start there ! 946: ! 947: sty0s_prepare_for_output: ! 948: add edi,esp ;adjust to do remainder of strip ! 949: ! 950: add ecx,4 ! 951: cmp pspEnd,ecx ;if (ecx == pspEnd + 4) ! 952: sbb edx,edx ; then ecx = pspStart ! 953: and edx,cjStyleDelta ! 954: add ecx,edx ! 955: ! 956: mov ebx,esp ! 957: mov esp,[ecx] ;get next style array element ! 958: neg ebx ;see if we also need a new strip ! 959: jz short sty0s_output_get_new_strip ! 960: ! 961: align 4 ! 962: sty0s_output_loop: ! 963: mov [edi],ah ;write pixel ! 964: inc edi ;move one pixel to right ! 965: dec esp ;might have to go to next style element ! 966: jz short sty0s_prepare_for_skip ! 967: ! 968: dec ebx ! 969: jnz short sty0s_output_loop ! 970: ! 971: sty0s_output_get_new_strip: ! 972: add edi,cjMajor ;move up one scan ! 973: cmp esi,plStripEnd ! 974: jae short sty0s_output_all_done ! 975: ! 976: mov ebx,[esi] ;get next strip ! 977: add esi,4 ! 978: jmp short sty0s_output_loop ! 979: ! 980: sty0s_output_all_done: ! 981: mov esi,pStrips ! 982: mov [esi].ST_pjScreen,edi ! 983: mov [esi].ST_bIsGap,0 ;we were working on a dash ! 984: mov [esi].ST_spRemaining,esp ! 985: mov [esi].ST_psp,ecx ! 986: mov esp,ulSaveEsp ! 987: cRet vStripStyledSet0 ! 988: ! 989: sty0s_prepare_for_skip: ! 990: add ecx,4 ! 991: cmp pspEnd,ecx ;if (ecx == pspEnd + 4) ! 992: sbb edx,edx ; then ecx = pspStart ! 993: and edx,cjStyleDelta ! 994: add ecx,edx ! 995: ! 996: dec ebx ! 997: mov esp,[ecx] ;get next style array element ! 998: jz short sty0s_skip_get_new_strip ! 999: ! 1000: sty0s_skip_loop: ! 1001: add edi,ebx ;assume we'll skip entire strip ! 1002: sub esp,ebx ; (we'll correct it if not) ! 1003: jle short sty0s_prepare_for_output ! 1004: ! 1005: sty0s_skip_get_new_strip: ! 1006: add edi,cjMajor ;move up one scan ! 1007: cmp esi,plStripEnd ! 1008: jae short sty0s_skip_all_done ! 1009: ! 1010: mov ebx,[esi] ;get next strip ! 1011: add esi,4 ! 1012: jmp short sty0s_skip_loop ! 1013: ! 1014: sty0s_skip_all_done: ! 1015: mov esi,pStrips ! 1016: mov [esi].ST_pjScreen,edi ! 1017: mov [esi].ST_bIsGap,0ffh ;we were working on a gap ! 1018: mov [esi].ST_spRemaining,esp ! 1019: mov [esi].ST_psp,ecx ! 1020: mov esp,ulSaveEsp ! 1021: cRet vStripStyledSet0 ! 1022: ! 1023: endProc vStripStyledSet0 ! 1024: ! 1025: ;--------------------------Private-Routine------------------------------; ! 1026: ; vStripStyledSet123 ! 1027: ; ! 1028: ; Draws styled lines in the 2nd, 3rd and 4th half-octants. ! 1029: ; ! 1030: ;-----------------------------------------------------------------------; ! 1031: ! 1032: cProc vStripStyledSet123,12,< \ ! 1033: uses esi edi ebx, \ ! 1034: pStrips: ptr STRIPS, \ ! 1035: pls: ptr LINESTATE, \ ! 1036: plStripEnd: ptr > ! 1037: ! 1038: local ulSaveEsp: dword ;we need lotsa registers ! 1039: local pspEnd: dword ;pointer to end of style array ! 1040: local cjMajor: dword ;delta to go in major direction ! 1041: local cjMinor: dword ;delta to go in minor direction ! 1042: local cjStyleDelta: dword ;delta from end of style array to start ! 1043: ! 1044: ; al = and mask ! 1045: ; ah = xor mask ! 1046: ; ebx = # of pixels in current strip ! 1047: ; ecx = style pointer ! 1048: ; edx = temporary register ! 1049: ; esi = strips pointer ! 1050: ; edi = memory pointer ! 1051: ; esp = # of pixels in current style ! 1052: ! 1053: mov esi,pStrips ! 1054: mov ulSaveEsp,esp ! 1055: ! 1056: ; If in half-octant 3, cjMajor = cjDelta and cjMinor = 1 ! 1057: ; If in half-octant 2, cjMajor = cjDelta + 1 and cjMinor = -1 ! 1058: ; If in half-octant 1, cjMajor = cjDelta + 1 and cjMinor = -cjDelta ! 1059: ! 1060: mov eax,[esi].ST_lNextScan ! 1061: mov ebx,[esi].ST_flFlips ! 1062: test ebx,FL_FLIP_HALF ! 1063: jz short sty3s_halfoctant_3 ! 1064: ! 1065: inc eax ! 1066: mov cjMajor,eax ! 1067: mov cjMinor,-1 ! 1068: ! 1069: test ebx,FL_FLIP_D ! 1070: jnz short sty3s_done_major_minor_comp ! 1071: ! 1072: neg eax ! 1073: inc eax ! 1074: mov cjMinor,eax ! 1075: jmp short sty3s_done_major_minor_comp ! 1076: ! 1077: sty3s_halfoctant_3: ! 1078: mov cjMajor,eax ! 1079: mov cjMinor,1 ! 1080: ! 1081: sty3s_done_major_minor_comp: ! 1082: mov eax,[esi].ST_pspEnd ! 1083: mov pspEnd,eax ! 1084: mov ebx,[esi].ST_pspStart ! 1085: sub ebx,eax ;compute cjStyleDelta ! 1086: sub ebx,4 ;make it exclusive ! 1087: mov cjStyleDelta,ebx ! 1088: ! 1089: mov eax,[esi].ST_chAndXor ! 1090: mov ecx,[esi].ST_psp ! 1091: mov edx,[esi].ST_bIsGap ! 1092: mov edi,[esi].ST_pjScreen ! 1093: mov esp,[esi].ST_spRemaining ! 1094: add esi,offset ST_alStrips ! 1095: ! 1096: mov ebx,[esi] ! 1097: add esi,4 ! 1098: ! 1099: or edx,edx ! 1100: jz short sty3s_output_loop ;if working on a dash, start there ! 1101: jmp short sty3s_skip_loop ;if working on a gap, start there ! 1102: ! 1103: sty3s_prepare_for_output: ! 1104: add ecx,4 ! 1105: cmp pspEnd,ecx ;if (ecx == pspEnd + 4) ! 1106: sbb edx,edx ; then ecx = pspStart ! 1107: and edx,cjStyleDelta ! 1108: add ecx,edx ! 1109: ! 1110: mov ebx,esp ! 1111: mov esp,[ecx] ;get next style array element ! 1112: neg ebx ;adjust to do remainder of strip ! 1113: jz short sty3s_output_get_new_strip ! 1114: ! 1115: align 4 ! 1116: sty3s_output_loop: ! 1117: mov [edi],ah ;write pixel ! 1118: add edi,cjMajor ;move to next scan ! 1119: dec esp ;might have to go to next style element ! 1120: jz short sty3s_prepare_for_skip ! 1121: ! 1122: dec ebx ! 1123: jnz short sty3s_output_loop ! 1124: ! 1125: sty3s_output_get_new_strip: ! 1126: add edi,cjMinor ;move in minor direction ! 1127: cmp esi,plStripEnd ! 1128: jae short sty3s_output_all_done ! 1129: ! 1130: mov ebx,[esi] ;get next strip ! 1131: add esi,4 ! 1132: jmp short sty3s_output_loop ! 1133: ! 1134: sty3s_output_all_done: ! 1135: mov esi,pStrips ! 1136: mov [esi].ST_pjScreen,edi ! 1137: mov [esi].ST_bIsGap,0 ;we were working on a dash ! 1138: mov [esi].ST_spRemaining,esp ! 1139: mov [esi].ST_psp,ecx ! 1140: mov esp,ulSaveEsp ! 1141: cRet vStripStyledSet123 ! 1142: ! 1143: sty3s_prepare_for_skip: ! 1144: add ecx,4 ! 1145: cmp pspEnd,ecx ;if (ecx == pspEnd + 4) ! 1146: sbb edx,edx ; then ecx = pspStart ! 1147: and edx,cjStyleDelta ! 1148: add ecx,edx ! 1149: ! 1150: dec ebx ! 1151: mov esp,[ecx] ;get next style array element ! 1152: jz short sty3s_skip_get_new_strip ! 1153: ! 1154: sty3s_skip_loop: ! 1155: ! 1156: ; compute min(left in strip, left in style) ! 1157: ! 1158: sub esp,ebx ;esp = # style - # strip ! 1159: sbb edx,edx ! 1160: and edx,esp ! 1161: add ebx,edx ;ebx = min(pels left in strip, ! 1162: ; pels left in style) ! 1163: ! 1164: mov edx,cjMajor ! 1165: imul edx,ebx ! 1166: add edi,edx ;adjust our pointer ! 1167: ! 1168: cmp esp,0 ! 1169: jle short sty3s_prepare_for_output ! 1170: ! 1171: sty3s_skip_get_new_strip: ! 1172: add edi,cjMinor ;move in minor direction ! 1173: cmp esi,plStripEnd ! 1174: jae short sty3s_skip_all_done ! 1175: ! 1176: mov ebx,[esi] ;get next strip ! 1177: add esi,4 ! 1178: jmp short sty3s_skip_loop ! 1179: ! 1180: sty3s_skip_all_done: ! 1181: mov esi,pStrips ! 1182: mov [esi].ST_pjScreen,edi ! 1183: mov [esi].ST_bIsGap,0ffh ;we were working on a gap ! 1184: mov [esi].ST_spRemaining,esp ! 1185: mov [esi].ST_psp,ecx ! 1186: mov esp,ulSaveEsp ! 1187: cRet vStripStyledSet123 ! 1188: ! 1189: endProc vStripStyledSet123 ! 1190: ! 1191: end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.