; Z80 Sprite83 Movax ; Sprite xor routine v1.0 ; Coded by Hannes Edfeldt in 1997 ; This routine has been modified by pacHa. ; Comments, bugs, e-mail me at pacHa-@wanadoo.fr ; Feel free to use this routine in your own productions ; as long as you give me some credit (and to movax also). ; This routine uses xor to draw the sprite, therefore ; you can erase the sprite by just drawing it again at ; the same x and y coordinates. See xordemo.z80 for an ; example of how to use this routine. ; Feel free to use this routine in your own productions ; as long as you give me some credit. ; This file should of course be viewed in a DOS texteditor ;) ; Hannes Edfeldt -+- movax@algonet.se -+- http://www.algonet.se/~movax ; SPRXOR ; Xor 8x8 sprite þ a=x, e=y, bc=sprite address, d=length of the sprite SPRXOR: push bc ; Save sprite address push af ld a,d ld (modif),a ld (modif1),a pop af ;==== Calculate the address in graphbuf ==== ld hl,0 ; Do y*12 ld d,0 add hl,de add hl,de add hl,de add hl,hl add hl,hl ld d,0 ; Do x/8 ld e,a srl e srl e srl e add hl,de ld de,GRAPH_MEM add hl,de ; Add address to graphbuf ;ld b,00000111b ; Get the remainder of x/8 ;and b and %00000111 ;cp 0 ; Is this sprite aligned to 8*n,y? jr z,ALIGN ;==== Non aligned sprite blit starts here ==== pop ix ; ix->sprite ld d,a ; d=how many bits to shift each line modif = $+1 ld e,8 ; Line loop LILOP: ld b,(ix+0) ; Get sprite data ld c,0 ; Shift loop push de SHLOP: srl b rr c dec d jp nz,SHLOP pop de ld a,b ; Write line to graphbuf xor (hl) ld (hl),a inc hl ld a,c xor (hl) ld (hl),a ld bc,11 ; Calculate next line address add hl,bc inc ix ; Inc spritepointer dec e jr nz,LILOP ; Next line ret ;==== Aligned sprite blit starts here ==== ALIGN: ; Blit an aligned sprite to graphbuf pop de ; de->sprite modif1 = $+1 ld b,8 ALOP1: ld a,(de) xor (hl) ld (hl),a inc de push bc ld bc,12 add hl,bc pop bc djnz ALOP1 DONE1: ret ; SPRXOR ; Z80 Sprite83 movax - modified by pacHa