#define spritetmp 8000h #define sprite_mask0 spritetmp+6 #define sprite_mask1 spritetmp+7 sprite: ;Inputs: ; A is the method: ; 0=Overwrite ; 1=AND ; 2=XOR ; 3=OR ; 4=DataSwap.......Does nothing ; 5=Erase ; B is the X-coordinate ; C is the Y-Coordinate ; DE points to the sprite ; H is the height ; L is the width ;not added yet ; (gbuf_temp) is the buffer to which to draw ld l,a ;First check if the sprite is on-screen in the horizontal direction ld a,c cp 64 jr c,+_ add a,h ret nc ld h,a xor a sub c add a,e ld e,a jr nc,$+3 inc d xor a ld c,a _: ;Next check h+c<=64 ld a,64 sub c cp h jr nc,+_ ld h,a _: ;Next check if the sprite is on-screen in the vertical direction ld a,b cp 96 jr c,+_ add a,8 ret nc ld a,b _: ;Now we need to get the left part of the mask ld a,h or a ret z ld (spritetmp),hl ;height ld (spritetmp+2),de ;sprite pointer ld (spritetmp+4),bc ;x,y ld a,b and 7 ld de,spritemask add a,e ld e,a #if spritemask&255>248 jr nc,$+3 inc d #endif ld a,(de) ld (sprite_mask0),a cpl ld (sprite_mask1),a ; ; ld a,c add a,a sbc a,a ld h,a ld a,b ld b,h ld l,c add hl,hl add hl,bc add hl,hl add hl,hl ld c,a add a,a sbc a,a ld b,a ld a,c sra c sra c sra c add hl,bc ld bc,(gbuf_temp) add hl,bc ; ; and 7 ld a,(spritetmp+1) ld b,a ;B is height ld de,(spritetmp+2) ld a,(spritetmp) dec a jp z,spriteloop_AND dec a jp z,spriteloop_XOR dec a jp z,spriteloop_OR sub 2 jp z,spriteloop_Erase spriteloop_Overwrite: push bc push de ld a,(de) ld d,a ld e,0 ld a,(spritetmp+5) ld c,a and 7 jr z,+_ ld b,a ld a,e srl d \ rra \ djnz $-3 ld e,a _: ld a,c add a,8 jr c,+_ ld c,a ld a,(sprite_mask0) and (hl) or d ld (hl),a ld a,c _: inc hl cp 96 jr nc,+_ ld a,(sprite_mask1) and (hl) or e ld (hl),a _: ld de,11 add hl,de pop de inc de pop bc djnz spriteloop_Overwrite ret spriteloop_OR: push bc push de ld a,(de) ld d,a ld e,0 ld a,(spritetmp+5) ld c,a and 7 jr z,+_ ld b,a ld a,e srl d \ rra \ djnz $-3 ld e,a _: ld a,c add a,8 jr c,+_ ld c,a ld a,(hl) or d ld (hl),a ld a,c _: inc hl cp 96 jr nc,+_ ld a,(sprite_mask1) ld a,(hl) or e ld (hl),a _: ld de,11 add hl,de pop de inc de pop bc djnz spriteloop_OR ret spriteloop_XOR: push bc push de ld a,(de) ld d,a ld e,0 ld a,(spritetmp+5) ld c,a and 7 jr z,+_ ld b,a ld a,e srl d \ rra \ djnz $-3 ld e,a _: ld a,c add a,8 jr c,+_ ld c,a ld a,(hl) xor d ld (hl),a ld a,c _: inc hl cp 96 jr nc,+_ ld a,(sprite_mask1) ld a,(hl) xor e ld (hl),a _: ld de,11 add hl,de pop de inc de pop bc djnz spriteloop_XOR ret spriteloop_AND: push bc push de ld a,(de) ld d,a ld e,-1 ld a,(spritetmp+5) ld c,a and 7 jr z,+_ ld b,a ld a,e scf rr d \ rra \ djnz $-3 ld e,a _: ld a,c add a,8 jr c,+_ ld c,a ld a,(hl) and d ld (hl),a ld a,c _: inc hl cp 96 jr nc,+_ ld a,(sprite_mask1) ld a,(hl) and e ld (hl),a _: ld de,11 add hl,de pop de inc de pop bc djnz spriteloop_AND ret spriteloop_Erase: push bc push de ld a,(de) cpl ld d,a ld e,-1 ld a,(spritetmp+5) ld c,a and 7 jr z,+_ ld b,a ld a,e scf rr d \ rra \ djnz $-3 ld e,a _: ld a,c add a,8 jr c,+_ ld c,a ld a,(hl) and d ld (hl),a ld a,c _: inc hl cp 96 jr nc,+_ ld a,(hl) and e ld (hl),a _: ld de,11 add hl,de pop de inc de pop bc djnz spriteloop_Erase ret spritemask: .db $00,$80,$C0,$E0,$F0,$F8,$FC,$FE #undefine spritetmp #undefine sprite_mask0 #undefine sprite_mask1