[TI ASM] Sprite Clipping

Got questions? Got answers? Go here for both.

Moderator: MaxCoderz Staff

Post Reply
chickendude
Extreme Poster
Posts: 339
Joined: Fri 07 Jul, 2006 2:39 pm

[TI ASM] Sprite Clipping

Post by chickendude »

Ok, so I've used sprite clipping routines in the past, but I'd like to start making a bunch of my own routines. I've developed a few sprite routines already, and today I added one more to the books. I realize that it's incredibly unoptimized, and that's why I'm coming here. Could you help me find a better way to organize it? Don't give me code or anything, I just want to find a quicker way.
Btw, the code works just fine (except it doesn't clip the bottom, but that's easy enough to add in). I just want to see how badly offtrack I am!
Thanks!

Code: Select all

;##############SPRITE CLIPPING ROUTINE!
;input: spritex = x position on screen, spritey = y position on screen, hl = sprite data pointer
clip: 	   ld ix,gbuf		;graphbuffer!
	   ld d,0
	   ld c,8		;how many bytes to draw to the gbuf
	   ld a,(spritey)
	   cp 64
	   jr c,shiftydown	;0<=y<64 i can't think of a better way! correct y position
cliptop:
	   cpl			;invert bits
	   and $07		;3 LSB
	   inc a		;since $FF is -1, cpl will give us $00. we need to increase a by 1
	   ld b,a
	   dec c		;decrease # bytes to display and move pointer one byte ahead
	   inc hl
	   djnz $-2
returnfromshift:
	   ld a,(spritex)
	   cp 96
	   jr nc,clipleft	;if x coordinate is negative, we don't need to change the gbuf location
	   ld e,a		;x coords/8, save x coord
	   srl e
	   srl e
	   srl e
	   add ix,de		;location on gbuf to draw
	   ld e,12		;de=12, add to ix to move gbuf down one set of pixels
	   cp 89 \ jr c,skipclip	;if x position is between 0 and 88, we don't need to clip
	   jr clipright	;if x position is between 89 and 95, we need to clip on the right

clipleft: cpl
	   and $07
	   inc a
	   ld b,a
	   ld e,12
repeatclip_l:
	   push bc
	   ld a,(hl)
	   sla a
	   djnz $-2
	   ld (ix),a
	   add ix,de
	   pop bc
	   inc hl
	   dec c
	   jr nz,repeatclip_l
	   ret

shiftydown:
	   ld e,a
	   ld b,12
	   add ix,de
	   djnz $-2
	   jr returnfromshift

skipclip: and $07 \ jr z,skipshift		;sprite is aligned
	   xor $07
	   inc a
	   ld b,a
repeatnoclip:
	   push bc
	    ld c,0
	    ld a,(hl)
	    rla
	    rl c
	    djnz $-3
	    ld (ix),c
	    inc ix
	    ld (ix),a
	    add ix,de
	    dec ix
	   pop bc
	   inc hl
	   dec c
	   jr nz,repeatnoclip
	   ret

skipshift:
	   ld a,(hl)
	   ld (ix),a
	   add ix,de
	   inc hl
	   dec c
	   jr nz,skipshift
	   ret

clipright: and $07
	   ld b,a
repeatclip_r:
	   push bc
	   ld a,(hl)
	   and a
	   rr a
	   djnz $-3
	   ld (ix),a
	   add ix,de
	   pop bc
	   inc hl
	   dec c
	   jr nz,repeatclip_r
	   ret
if you need more comments or something (it's very unorganized, I know), I can provide that :)

EDIT: Oh, and eventually, it will be an XOR sprite routine (I'm just too lazy to add the two or three lines right now).
Post Reply