/* PLEASE NOTE: This file and the routines it contains were written by David Randall. e-mail: drandall99@charter.net Some routines were modified by myself. */ | C prototype: |void GraySingleSprite8_XOR_R( | register short x asm("%d0"), | register short y asm("%d1"), | register short h asm("%d2"), | unsigned char *sprt, // a2 | register void *dest0 asm("%a0"), | register void *dest1 asm("%a1")) | __attribute__((__stkparm__)); .data .globl GraySingleSprite8_XOR_R .even GraySingleSprite8_XOR_R: dbf %d2,__Rest_of_GraySingleSprite8_XOR_R rts __Rest_of_GraySingleSprite8_XOR_R: movem.l %d3/%a2,-(%sp) move.l 12(%sp),%a2 move.w %d1,%d3 | d3 = y lsl.w #4,%d1 | d1 = 16*y sub.w %d3,%d1 | d1 = 15*y move.w %d0,%d3 | d3 = x lsr.w #4,%d3 | d3 = x/16 add.w %d3,%d1 | d1 = 15*y + x/16 add.w %d1,%d1 | d1 = 30*y + x/8 adda.w %d1,%a0 | a0 += offset adda.w %d1,%a1 | a1 += offset and.w #0xF,%d0 moveq #8,%d1 sub.w %d0,%d1 bge.s _loop_GraySingleSprite8_XOR_R_2 neg.w %d1 | White on Black and | Black on White and | Dk Gray on Lt Gray and | Lt Gray on Dk Gray _loop_GraySingleSprite8_XOR_R_1: moveq #0,%d0 move.b (%a2)+,%d0 swap.w %d0 lsr.l %d1,%d0 eor.l %d0,(%a0) eor.l %d0,(%a1) lea.l 30(%a0),%a0 lea.l 30(%a1),%a1 dbf %d2,_loop_GraySingleSprite8_XOR_R_1 movem.l (%sp)+,%d3/%a2 rts _loop_GraySingleSprite8_XOR_R_2: moveq #0,%d0 move.b (%a2)+,%d0 lsl.w %d1,%d0 eor.w %d0,(%a0) eor.w %d0,(%a1) lea.l 30(%a0),%a0 lea.l 30(%a1),%a1 dbf %d2,_loop_GraySingleSprite8_XOR_R_2 movem.l (%sp)+,%d3/%a2 rts