MaxCoderz

for your 1 bit pleasure!

All times are UTC




Post new topic Reply to topic  [ 1 post ] 
Author Message
 Post subject: [TI ASM] Sprite Clipping
PostPosted: Thu 14 Sep, 2006 5:20 am 
Offline
Extreme Poster

Joined: Fri 07 Jul, 2006 2:39 pm
Posts: 336
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:
;##############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).


Top
 Profile  
Reply with quote  
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 1 post ] 

All times are UTC


Who is online

Users browsing this forum: No registered users and 6 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB ® Forum Software © phpBB Group | DVGFX2 by: Matt