1 2; 3; Date: 1999-03-07 Mikael Kalms (Scout/C-Lous & more) 4; Email: mikael@kalms.org 5; 6; 1x1 8bpl cpu5 C2P for arbitrary BitMaps 7; 8; Features: 9; Performs CPU-only C2P conversion using rather state-of-the-art (as of 10; the creation date, anyway) techniques 11; Different routines for non-modulo and modulo C2P conversions 12; Handles bitmaps of virtually any size (>4096x4096) 13; Position-independent (PC-relative) code 14; 15; Restrictions: 16; Chunky-buffer must be an even multiple of 32 pixels wide 17; X-Offset must be set to an even multiple of 8 18; If these conditions not are met, the routine will abort. 19; If incorrect/invalid parameters are specified, the routine will 20; most probably crash. 21; 22; c2p1x1_8_c5_bm 23 24 25 xdef _c2p1x1_8_c5_bm 26 xdef c2p1x1_8_c5_bm 27 28 incdir include: 29 include graphics/gfx.i 30 31 32 rsreset 33C2P1X1_8_C5_BM_CHUNKYX rs.w 1 34C2P1X1_8_C5_BM_CHUNKYY rs.w 1 35C2P1X1_8_C5_BM_ROWMOD rs.l 1 36C2P1X1_8_C5_BM_SIZEOF rs.b 0 37 38 39 section code,code 40 41; d0.w chunkyx [chunky-pixels] 42; d1.w chunkyy [chunky-pixels] 43; d2.w offsx [screen-pixels] 44; d3.w offsy [screen-pixels] 45; a0 chunkyscreen 46; a1 BitMap 47 48_c2p1x1_8_c5_bm 49c2p1x1_8_c5_bm 50 movem.l d2-d7/a2-a6,-(sp) 51 subq.l #C2P1X1_8_C5_BM_SIZEOF,sp 52 ; A few sanity checks 53 cmpi.b #8,bm_Depth(a1) ; At least 8 valid bplptrs? 54 blo .exit 55 move.w d0,d4 56 move.w d2,d5 57 andi.w #$1f,d4 ; Even 32-pixel width? 58 bne .exit 59 andi.w #$7,d5 ; Even 8-pixel xoffset? 60 bne .exit 61 moveq #0,d4 62 move.w bm_BytesPerRow(a1),d4 63 64 move.w d0,C2P1X1_8_C5_BM_CHUNKYX(sp) ; Skip if 0 pixels to convert 65 beq .exit 66 move.w d1,C2P1X1_8_C5_BM_CHUNKYY(sp) 67 beq .exit 68 69 ext.l d2 ; Offs to first pixel to draw in bpl 70 mulu.w d4,d3 71 lsr.l #3,d2 72 add.l d2,d3 73 74 lsl.w #3,d4 ; Modulo c2p required? 75 sub.w d0,d4 76 bmi .exit 77 bne .c2p_mod 78 79 mulu.w d0,d1 80 add.l a0,d1 81 move.l d1,a2 ; Ptr to end of chunkybuffer 82 83 movem.l a0-a1/d3,-(sp) 84 85 movem.l bm_Planes(a1),a3-a6 ; Setup ptrs to bpl0-3 86 add.l d3,a3 87 add.l d3,a4 88 add.l d3,a5 89 add.l d3,a6 90 91 move.l (a0)+,d0 ; Convert lower 4 bpls 92 move.l (a0)+,d2 93 move.l (a0)+,d1 94 move.l (a0)+,d3 95 96 move.l #$0f0f0f0f,d6 ; Merge 4x1, part 1 97 and.l d6,d0 98 and.l d6,d1 99 and.l d6,d2 100 and.l d6,d3 101 lsl.l #4,d0 102 lsl.l #4,d1 103 or.l d2,d0 104 or.l d3,d1 105 106 move.l (a0)+,d2 107 move.l (a0)+,d6 108 move.l (a0)+,d3 109 move.l (a0)+,d7 110 111 move.l #$0f0f0f0f,d4 ; Merge 4x1, part 2 112 and.l d4,d2 113 and.l d4,d6 114 and.l d4,d3 115 and.l d4,d7 116 lsl.l #4,d2 117 lsl.l #4,d3 118 or.l d6,d2 119 or.l d7,d3 120 121 move.w d2,d6 ; Swap 16x2 122 move.w d3,d7 123 move.w d0,d2 124 move.w d1,d3 125 swap d2 126 swap d3 127 move.w d2,d0 128 move.w d3,d1 129 move.w d6,d2 130 move.w d7,d3 131 132 move.l #$33333333,d4 133 move.l d2,d6 ; Swap 2x2 134 move.l d3,d7 135 lsr.l #2,d6 136 lsr.l #2,d7 137 eor.l d0,d6 138 eor.l d1,d7 139 and.l d4,d6 140 and.l d4,d7 141 eor.l d6,d0 142 eor.l d7,d1 143 lsl.l #2,d6 144 lsl.l #2,d7 145 eor.l d6,d2 146 eor.l d7,d3 147 148 move.l #$00ff00ff,d4 149 move.l d1,d6 ; Swap 8x1 150 move.l d3,d7 151 lsr.l #8,d6 152 lsr.l #8,d7 153 eor.l d0,d6 154 eor.l d2,d7 155 bra .x1start 156 157.x1 158 move.l (a0)+,d0 159 move.l (a0)+,d2 160 move.l (a0)+,d1 161 move.l (a0)+,d3 162 move.l d7,(a3)+ 163 164 move.l #$0f0f0f0f,d6 ; Merge 4x1, part 1 165 and.l d6,d0 166 and.l d6,d1 167 and.l d6,d2 168 and.l d6,d3 169 lsl.l #4,d0 170 lsl.l #4,d1 171 or.l d2,d0 172 or.l d3,d1 173 174 move.l (a0)+,d2 175 move.l (a0)+,d6 176 move.l (a0)+,d3 177 move.l (a0)+,d7 178 move.l d4,(a4)+ 179 180 move.l #$0f0f0f0f,d4 ; Merge 4x1, part 2 181 and.l d4,d2 182 and.l d4,d6 183 and.l d4,d3 184 and.l d4,d7 185 lsl.l #4,d2 186 lsl.l #4,d3 187 or.l d6,d2 188 or.l d7,d3 189 190 move.w d2,d6 ; Swap 16x2 191 move.w d3,d7 192 move.w d0,d2 193 move.w d1,d3 194 swap d2 195 swap d3 196 move.w d2,d0 197 move.w d3,d1 198 move.w d6,d2 199 move.w d7,d3 200 move.l d5,(a5)+ 201 202 move.l #$33333333,d4 203 move.l d2,d6 ; Swap 2x2 204 move.l d3,d7 205 lsr.l #2,d6 206 lsr.l #2,d7 207 eor.l d0,d6 208 eor.l d1,d7 209 and.l d4,d6 210 and.l d4,d7 211 eor.l d6,d0 212 eor.l d7,d1 213 lsl.l #2,d6 214 lsl.l #2,d7 215 eor.l d6,d2 216 eor.l d7,d3 217 218 move.l #$00ff00ff,d4 219 move.l d1,d6 ; Swap 8x1 220 move.l d3,d7 221 lsr.l #8,d6 222 lsr.l #8,d7 223 eor.l d0,d6 224 eor.l d2,d7 225 move.l a1,(a6)+ 226.x1start 227 and.l d4,d6 228 and.l d4,d7 229 eor.l d6,d0 230 eor.l d7,d2 231 lsl.l #8,d6 232 lsl.l #8,d7 233 eor.l d6,d1 234 eor.l d7,d3 235 236 move.l #$55555555,d4 237 move.l d1,d5 ; Swap 1x1 238 move.l d3,d7 239 lsr.l #1,d5 240 lsr.l #1,d7 241 eor.l d0,d5 242 eor.l d2,d7 243 and.l d4,d5 244 and.l d4,d7 245 eor.l d5,d0 246 eor.l d7,d2 247 add.l d5,d5 248 add.l d7,d7 249 eor.l d1,d5 250 eor.l d3,d7 251 252 move.l d0,a1 253 move.l d2,d4 254 255 cmpa.l a0,a2 256 bne .x1 257 258 move.l d7,(a3)+ 259 move.l d4,(a4)+ 260 move.l d5,(a5)+ 261 move.l a1,(a6)+ 262 263 movem.l (sp)+,a0-a1/d3 264 265 movem.l bm_Planes+4*4(a1),a3-a6 ; Setup ptrs to bpl4-7 266 add.l d3,a3 267 add.l d3,a4 268 add.l d3,a5 269 add.l d3,a6 270 271 move.l (a0)+,d0 ; Convert upper 4 bpls 272 move.l (a0)+,d2 273 move.l (a0)+,d1 274 move.l (a0)+,d3 275 276 move.l #$f0f0f0f0,d6 ; Merge 4x1, part 1 277 and.l d6,d0 278 and.l d6,d1 279 and.l d6,d2 280 and.l d6,d3 281 lsr.l #4,d2 282 lsr.l #4,d3 283 or.l d2,d0 284 or.l d3,d1 285 286 move.l (a0)+,d2 287 move.l (a0)+,d6 288 move.l (a0)+,d3 289 move.l (a0)+,d7 290 291 move.l #$f0f0f0f0,d4 ; Merge 4x1, part 2 292 and.l d4,d2 293 and.l d4,d6 294 and.l d4,d3 295 and.l d4,d7 296 lsr.l #4,d6 297 lsr.l #4,d7 298 or.l d6,d2 299 or.l d7,d3 300 301 move.w d2,d6 ; Swap 16x2 302 move.w d3,d7 303 move.w d0,d2 304 move.w d1,d3 305 swap d2 306 swap d3 307 move.w d2,d0 308 move.w d3,d1 309 move.w d6,d2 310 move.w d7,d3 311 312 move.l #$33333333,d4 313 move.l d2,d6 ; Swap 2x2 314 move.l d3,d7 315 lsr.l #2,d6 316 lsr.l #2,d7 317 eor.l d0,d6 318 eor.l d1,d7 319 and.l d4,d6 320 and.l d4,d7 321 eor.l d6,d0 322 eor.l d7,d1 323 lsl.l #2,d6 324 lsl.l #2,d7 325 eor.l d6,d2 326 eor.l d7,d3 327 328 move.l #$00ff00ff,d4 329 move.l d1,d6 ; Swap 8x1 330 move.l d3,d7 331 lsr.l #8,d6 332 lsr.l #8,d7 333 eor.l d0,d6 334 eor.l d2,d7 335 bra .x2start 336 337.x2 338 move.l (a0)+,d0 339 move.l (a0)+,d2 340 move.l (a0)+,d1 341 move.l (a0)+,d3 342 move.l d7,(a3)+ 343 344 move.l #$f0f0f0f0,d6 ; Merge 4x1, part 1 345 and.l d6,d0 346 and.l d6,d1 347 and.l d6,d2 348 and.l d6,d3 349 lsr.l #4,d2 350 lsr.l #4,d3 351 or.l d2,d0 352 or.l d3,d1 353 354 move.l (a0)+,d2 355 move.l (a0)+,d6 356 move.l (a0)+,d3 357 move.l (a0)+,d7 358 move.l d4,(a4)+ 359 360 move.l #$f0f0f0f0,d4 ; Merge 4x1, part 2 361 and.l d4,d2 362 and.l d4,d6 363 and.l d4,d3 364 and.l d4,d7 365 lsr.l #4,d6 366 lsr.l #4,d7 367 or.l d6,d2 368 or.l d7,d3 369 370 move.w d2,d6 ; Swap 16x2 371 move.w d3,d7 372 move.w d0,d2 373 move.w d1,d3 374 swap d2 375 swap d3 376 move.w d2,d0 377 move.w d3,d1 378 move.w d6,d2 379 move.w d7,d3 380 move.l d5,(a5)+ 381 382 move.l #$33333333,d4 383 move.l d2,d6 ; Swap 2x2 384 move.l d3,d7 385 lsr.l #2,d6 386 lsr.l #2,d7 387 eor.l d0,d6 388 eor.l d1,d7 389 and.l d4,d6 390 and.l d4,d7 391 eor.l d6,d0 392 eor.l d7,d1 393 lsl.l #2,d6 394 lsl.l #2,d7 395 eor.l d6,d2 396 eor.l d7,d3 397 398 move.l #$00ff00ff,d4 399 move.l d1,d6 ; Swap 8x1 400 move.l d3,d7 401 lsr.l #8,d6 402 lsr.l #8,d7 403 eor.l d0,d6 404 eor.l d2,d7 405 move.l a1,(a6)+ 406.x2start 407 and.l d4,d6 408 and.l d4,d7 409 eor.l d6,d0 410 eor.l d7,d2 411 lsl.l #8,d6 412 lsl.l #8,d7 413 eor.l d6,d1 414 eor.l d7,d3 415 416 move.l #$55555555,d4 417 move.l d1,d5 ; Swap 1x1 418 move.l d3,d7 419 lsr.l #1,d5 420 lsr.l #1,d7 421 eor.l d0,d5 422 eor.l d2,d7 423 and.l d4,d5 424 and.l d4,d7 425 eor.l d5,d0 426 eor.l d7,d2 427 add.l d5,d5 428 add.l d7,d7 429 eor.l d1,d5 430 eor.l d3,d7 431 432 move.l d0,a1 433 move.l d2,d4 434 435 cmpa.l a0,a2 436 bne .x2 437 438 move.l d7,(a3)+ 439 move.l d4,(a4)+ 440 move.l d5,(a5)+ 441 move.l a1,(a6)+ 442 443.exit 444 addq.l #C2P1X1_8_C5_BM_SIZEOF,sp 445 movem.l (sp)+,d2-d7/a2-a6 446.earlyexit 447 rts 448 449.c2p_mod 450 lsr.w #3,d4 451 move.l d4,C2P1X1_8_C5_BM_ROWMOD(sp) ; Modulo between two rows 452 453 move.l a0,a2 ; Ptr to end of line + 1 iter 454 add.w C2P1X1_8_C5_BM_CHUNKYX(sp),a2 455 add.w #32,a2 456 457 movem.l a0-a2/d1/d3,-(sp) 458 459 movem.l bm_Planes(a1),a3-a6 ; Setup ptrs to bpl0-3 460 add.l d3,a3 461 add.l d3,a4 462 add.l d3,a5 463 add.l d3,a6 464 465 move.l (a0)+,d0 ; Convert lower 4 bpls 466 move.l (a0)+,d2 467 move.l (a0)+,d1 468 move.l (a0)+,d3 469 470 move.l #$0f0f0f0f,d6 ; Merge 4x1, part 1 471 and.l d6,d0 472 and.l d6,d1 473 and.l d6,d2 474 and.l d6,d3 475 lsl.l #4,d0 476 lsl.l #4,d1 477 or.l d2,d0 478 or.l d3,d1 479 480 move.l (a0)+,d2 481 move.l (a0)+,d6 482 move.l (a0)+,d3 483 move.l (a0)+,d7 484 485 move.l #$0f0f0f0f,d4 ; Merge 4x1, part 2 486 and.l d4,d2 487 and.l d4,d6 488 and.l d4,d3 489 and.l d4,d7 490 lsl.l #4,d2 491 lsl.l #4,d3 492 or.l d6,d2 493 or.l d7,d3 494 495 move.w d2,d6 ; Swap 16x2 496 move.w d3,d7 497 move.w d0,d2 498 move.w d1,d3 499 swap d2 500 swap d3 501 move.w d2,d0 502 move.w d3,d1 503 move.w d6,d2 504 move.w d7,d3 505 506 move.l #$33333333,d4 507 move.l d2,d6 ; Swap 2x2 508 move.l d3,d7 509 lsr.l #2,d6 510 lsr.l #2,d7 511 eor.l d0,d6 512 eor.l d1,d7 513 and.l d4,d6 514 and.l d4,d7 515 eor.l d6,d0 516 eor.l d7,d1 517 lsl.l #2,d6 518 lsl.l #2,d7 519 eor.l d6,d2 520 eor.l d7,d3 521 522 move.l #$00ff00ff,d4 523 move.l d1,d6 ; Swap 8x1 524 move.l d3,d7 525 lsr.l #8,d6 526 lsr.l #8,d7 527 eor.l d0,d6 528 eor.l d2,d7 529 bra .modx1start 530.modx1y 531 add.w C2P1X1_8_C5_BM_CHUNKYX+20(sp),a2 ; Skip to end of next 532 ; line + 1 iter 533 move.l C2P1X1_8_C5_BM_ROWMOD+20(sp),d0 ; Skip to beginning of 534 add.l d0,a3 ; next line 535 add.l d0,a4 536 add.l d0,a5 537 add.l d0,a6 538.modx1 539 move.l (a0)+,d0 540 move.l (a0)+,d2 541 move.l (a0)+,d1 542 move.l (a0)+,d3 543 move.l d7,(a3)+ 544 545 move.l #$0f0f0f0f,d6 ; Merge 4x1, part 1 546 and.l d6,d0 547 and.l d6,d1 548 and.l d6,d2 549 and.l d6,d3 550 lsl.l #4,d0 551 lsl.l #4,d1 552 or.l d2,d0 553 or.l d3,d1 554 555 move.l (a0)+,d2 556 move.l (a0)+,d6 557 move.l (a0)+,d3 558 move.l (a0)+,d7 559 move.l d4,(a4)+ 560 561 move.l #$0f0f0f0f,d4 ; Merge 4x1, part 2 562 and.l d4,d2 563 and.l d4,d6 564 and.l d4,d3 565 and.l d4,d7 566 lsl.l #4,d2 567 lsl.l #4,d3 568 or.l d6,d2 569 or.l d7,d3 570 571 move.w d2,d6 ; Swap 16x2 572 move.w d3,d7 573 move.w d0,d2 574 move.w d1,d3 575 swap d2 576 swap d3 577 move.w d2,d0 578 move.w d3,d1 579 move.w d6,d2 580 move.w d7,d3 581 move.l d5,(a5)+ 582 583 move.l #$33333333,d4 584 move.l d2,d6 ; Swap 2x2 585 move.l d3,d7 586 lsr.l #2,d6 587 lsr.l #2,d7 588 eor.l d0,d6 589 eor.l d1,d7 590 and.l d4,d6 591 and.l d4,d7 592 eor.l d6,d0 593 eor.l d7,d1 594 lsl.l #2,d6 595 lsl.l #2,d7 596 eor.l d6,d2 597 eor.l d7,d3 598 599 move.l #$00ff00ff,d4 600 move.l d1,d6 ; Swap 8x1 601 move.l d3,d7 602 lsr.l #8,d6 603 lsr.l #8,d7 604 eor.l d0,d6 605 eor.l d2,d7 606 move.l a1,(a6)+ 607.modx1start 608 and.l d4,d6 609 and.l d4,d7 610 eor.l d6,d0 611 eor.l d7,d2 612 lsl.l #8,d6 613 lsl.l #8,d7 614 eor.l d6,d1 615 eor.l d7,d3 616 617 move.l #$55555555,d4 618 move.l d1,d5 ; Swap 1x1 619 move.l d3,d7 620 lsr.l #1,d5 621 lsr.l #1,d7 622 eor.l d0,d5 623 eor.l d2,d7 624 and.l d4,d5 625 and.l d4,d7 626 eor.l d5,d0 627 eor.l d7,d2 628 add.l d5,d5 629 add.l d7,d7 630 eor.l d1,d5 631 eor.l d3,d7 632 633 move.l d0,a1 634 move.l d2,d4 635 636 cmpa.l a0,a2 637 bne .modx1 638 639 subq.w #1,C2P1X1_8_C5_BM_CHUNKYY+20(sp) 640 bne .modx1y 641 642 movem.l (sp)+,a0-a2/d1/d3 643 644 move.w d1,C2P1X1_8_C5_BM_CHUNKYY(sp) 645 646 movem.l bm_Planes+4*4(a1),a3-a6 ; Setup ptrs to bpl4-7 647 add.l d3,a3 648 add.l d3,a4 649 add.l d3,a5 650 add.l d3,a6 651 652 move.l (a0)+,d0 ; Convert lower 4 bpls 653 move.l (a0)+,d2 654 move.l (a0)+,d1 655 move.l (a0)+,d3 656 657 move.l #$f0f0f0f0,d6 ; Merge 4x1, part 1 658 and.l d6,d0 659 and.l d6,d1 660 and.l d6,d2 661 and.l d6,d3 662 lsr.l #4,d2 663 lsr.l #4,d3 664 or.l d2,d0 665 or.l d3,d1 666 667 move.l (a0)+,d2 668 move.l (a0)+,d6 669 move.l (a0)+,d3 670 move.l (a0)+,d7 671 672 move.l #$f0f0f0f0,d4 ; Merge 4x1, part 2 673 and.l d4,d2 674 and.l d4,d6 675 and.l d4,d3 676 and.l d4,d7 677 lsr.l #4,d6 678 lsr.l #4,d7 679 or.l d6,d2 680 or.l d7,d3 681 682 move.w d2,d6 ; Swap 16x2 683 move.w d3,d7 684 move.w d0,d2 685 move.w d1,d3 686 swap d2 687 swap d3 688 move.w d2,d0 689 move.w d3,d1 690 move.w d6,d2 691 move.w d7,d3 692 693 move.l #$33333333,d4 694 move.l d2,d6 ; Swap 2x2 695 move.l d3,d7 696 lsr.l #2,d6 697 lsr.l #2,d7 698 eor.l d0,d6 699 eor.l d1,d7 700 and.l d4,d6 701 and.l d4,d7 702 eor.l d6,d0 703 eor.l d7,d1 704 lsl.l #2,d6 705 lsl.l #2,d7 706 eor.l d6,d2 707 eor.l d7,d3 708 709 move.l #$00ff00ff,d4 710 move.l d1,d6 ; Swap 8x1 711 move.l d3,d7 712 lsr.l #8,d6 713 lsr.l #8,d7 714 eor.l d0,d6 715 eor.l d2,d7 716 bra .modx2start 717 718.modx2y 719 add.w C2P1X1_8_C5_BM_CHUNKYX(sp),a2 ; Skip to end of next line + 1 720 ; iter 721 move.l C2P1X1_8_C5_BM_ROWMOD(sp),d0 ; Skip to beginning of 722 add.l d0,a3 ; next line 723 add.l d0,a4 724 add.l d0,a5 725 add.l d0,a6 726.modx2 727 move.l (a0)+,d0 728 move.l (a0)+,d2 729 move.l (a0)+,d1 730 move.l (a0)+,d3 731 move.l d7,(a3)+ 732 733 move.l #$f0f0f0f0,d6 ; Merge 4x1, part 1 734 and.l d6,d0 735 and.l d6,d1 736 and.l d6,d2 737 and.l d6,d3 738 lsr.l #4,d2 739 lsr.l #4,d3 740 or.l d2,d0 741 or.l d3,d1 742 743 move.l (a0)+,d2 744 move.l (a0)+,d6 745 move.l (a0)+,d3 746 move.l (a0)+,d7 747 move.l d4,(a4)+ 748 749 move.l #$f0f0f0f0,d4 ; Merge 4x1, part 2 750 and.l d4,d2 751 and.l d4,d6 752 and.l d4,d3 753 and.l d4,d7 754 lsr.l #4,d6 755 lsr.l #4,d7 756 or.l d6,d2 757 or.l d7,d3 758 759 move.w d2,d6 ; Swap 16x2 760 move.w d3,d7 761 move.w d0,d2 762 move.w d1,d3 763 swap d2 764 swap d3 765 move.w d2,d0 766 move.w d3,d1 767 move.w d6,d2 768 move.w d7,d3 769 move.l d5,(a5)+ 770 771 move.l #$33333333,d4 772 move.l d2,d6 ; Swap 2x2 773 move.l d3,d7 774 lsr.l #2,d6 775 lsr.l #2,d7 776 eor.l d0,d6 777 eor.l d1,d7 778 and.l d4,d6 779 and.l d4,d7 780 eor.l d6,d0 781 eor.l d7,d1 782 lsl.l #2,d6 783 lsl.l #2,d7 784 eor.l d6,d2 785 eor.l d7,d3 786 787 move.l #$00ff00ff,d4 788 move.l d1,d6 ; Swap 8x1 789 move.l d3,d7 790 lsr.l #8,d6 791 lsr.l #8,d7 792 eor.l d0,d6 793 eor.l d2,d7 794 move.l a1,(a6)+ 795.modx2start 796 and.l d4,d6 797 and.l d4,d7 798 eor.l d6,d0 799 eor.l d7,d2 800 lsl.l #8,d6 801 lsl.l #8,d7 802 eor.l d6,d1 803 eor.l d7,d3 804 805 move.l #$55555555,d4 806 move.l d1,d5 ; Swap 1x1 807 move.l d3,d7 808 lsr.l #1,d5 809 lsr.l #1,d7 810 eor.l d0,d5 811 eor.l d2,d7 812 and.l d4,d5 813 and.l d4,d7 814 eor.l d5,d0 815 eor.l d7,d2 816 add.l d5,d5 817 add.l d7,d7 818 eor.l d1,d5 819 eor.l d3,d7 820 821 move.l d0,a1 822 move.l d2,d4 823 824 cmpa.l a0,a2 825 bne .modx2 826 827 subq.w #1,C2P1X1_8_C5_BM_CHUNKYY(sp) 828 bne .modx2y 829 830 bra .exit 831 832