123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313 |
- #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
|