Z80 Routines:Graphic:put16xBsprite

From WikiTI
Jump to: navigation, search


The put16xBsprite routine is used to plot a 16xB sized sprite.

Code

Basic Version

;2-byte (across) sprite xor routine by Jon Martin
;optimized to be faster than Joe Wingbermeuhle's largesprite routine
;based on the 1-byte xor routine from "learn ti 83+ asm in 28 days"
;inputs:
;a=xc
;e=yc
;b=height
;IX=sprite pointer
;destroys all except shadow registers
DoubleSprite:				
 ld h,0	 		;7		
 ld l,e			;4		
 ld d,h 		;4
 add hl,hl		;11
 add hl,de		;11
 add hl,hl		;11
 add hl,hl		;11
 ld de,plotsscreen	;10
 add hl,de		;11
 ld e,a			;4
 srl e			;8
 srl e			;8
 srl e			;8
 ld d,0			;7
 add hl,de		;11
 ld d,h			;4
 ld e,l			;4
 and 7			;4
 jp z,aligned		;10
 ld c,a			;4
 ld de,12		;10
rowloop:		;total: 194
 push bc		;11
 ld b,c 		;4
 xor a			;4
 ld d,(ix)		;19
 ld e,(ix+1)		;19
shiftloop:		;60 per loop
 srl d			;8
 rr e			;8
 rra			;4
 djnz shiftloop		;13/8,37 per loop
 inc hl
 inc hl
 xor (hl)
 ld (hl),a
 ld a,e
 dec hl
 xor (hl)
 ld (hl),a
 ld a,d
 dec hl
 xor (hl)
 ld (hl),a	
 pop bc			;10
 ld de,12		;10
 add hl,de		;11
 inc ix			;10
 inc ix			;10
 djnz rowloop		;13/8
 ret			;10
aligned:
 ld de,11 
alignedloop:
 ld a,(ix)
 xor (hl)
 ld (hl),a
 ld a,(ix+1)
 inc hl
 xor (hl)
 ld (hl),a
 add hl,de
 inc ix
 inc ix
 djnz alignedloop
 ret
 

Masked Version

;Double Masked Sprite Routine by Jon Martin
;for placing a 16xn sprite with a mask on plotsscreen
;ANDs a sprite mask,1's are transperent, 0's are blank
;ORs a sprite where the mask was placed (all black parts of sprite must match 0's on the mask)
;inputs:
;a=column
;b=number of rows of sprite
;e=row
;ix=sprite pointer
;iy=sprite mask pointer
;outputs:
;sprite copied to plotsscreen
;destroys:
;all (including IY) except shadows
doublemaskedsprite:
	ld 		h,0	 		;multiply e by 12		
 	ld 		l,e					
 	ld 		d,h 		
 	add 		hl,hl		
 	add 		hl,de		
 	add 		hl,hl		
 	add 		hl,hl		 	;e*12=hl
 	ld 		de,plotsscreen		
 	add 		hl,de			;now hl is on correct row of plotsscreen
 	ld 		e,a			
 	srl		e			;divide e by8
 	srl 		e			
 	srl 		e			
 	ld 		d,0			
 	add 		hl,de			;now hl is at top-left byte of where sprite goes
 	and 		7			;check if row is multiple of 8, if it is not then a=bitmask
 	jp 		z,daligned		;if it is, then the sprite is aligned
 	ld 		c,a			;now c contains bitmask
drowloop:					;this loop will be done b times
 	push 		bc			;save bc for later
 	ld 		b,c			;b has bitmask
 	ld 		d,(ix)			;d is first byte of sprite
 	ld 		e,(ix+1)		;e is second
 	xor 		a			;a is 0
dshiftloop1:		
 	srl 		d			;rotate d into e, e into a
 	rr 		e
 	rra
 	djnz 		dshiftloop1		;do this as many times as bitmask says
 	push 		de			;now save sprite data
 	push 		af			
 	ld		b,c			;now b has bitmask again
 	ld 		d,(iy)			;d is first byte of sprite mask
 	ld 		e,(iy+1)		;e is second
	xor		a			;a is 0
dshiftloop2:					
 	srl 		d			;rotate d into e, e into a
 	rr 		e 
 	rra
 	djnz 		dshiftloop2
 	inc 		hl			;move hl to byte for a
 	inc 		hl
 	and 		(hl)			;and logic a with that location
 	ld 		(hl),a			;now the byte is masked
 	pop 		af			;now use old a
 	or 		(hl)			;use or logic
 	ld 		(hl),a			;now the byte has been properly written
 	ld 		a,e			;go to e, 1 left of a
 	dec 		hl
 	and 		(hl)
 	ld 		(hl),a
 	dec 		hl
 	ld 		a,d
 	and 		(hl)
 	ld 		(hl),a
 	pop 		de
 	ld 		a,d
 	or 		(hl)
 	ld 		(hl),a
 	inc 		hl
 	ld 		a,e
 	or 		(hl)
 	ld 		(hl),a
 	pop		bc
 	ld 		de,11
 	add 		hl,de
 	inc 		ix
 	inc 		ix
 	inc 		iy
 	inc 		iy
 	djnz 		drowloop
 	ld 		iy,flags		
 	ret			
daligned:
  	ld 		de,11
dalignedloop:
 	ld 		a,(iy)
 	and 		(hl)
 	ld 		(hl),a
 	ld 		a,(ix)
 	or 		(hl)
 	ld 		(hl),a
 	inc 		hl
 	ld		a,(iy+1)
 	and 		(hl)
 	ld 		(hl),a
 	ld 		a,(ix+1)
 	or 		(hl)
 	ld 		(hl),a
 	inc 		ix
 	inc 		ix
 	inc 		iy
 	inc 		iy
 	add 		hl,de
 	djnz 		dalignedloop
 	ld 		iy,flags
 	ret
 


Customization

Example

A example using the basic version of PutSprite16.

   ;...
   ld   e,8   ;y
   ld   a,16  ;x
   ld   b,8   ;height
   ld   ix,sprite
   call putsprite
   call fastcopy
   ;...
sprite:
   .db %11111111,%11111111
   .db %10000001,%10000001
   .db %10000001,%10000001
   .db %10000001,%10000001
   .db %10000001,%10000001
   .db %10000001,%10000001
   .db %10000001,%10000001
   .db %11111111,%11111111