[A83] Re: A Routine To Display Big Sprites problem


[Prev][Next][Index][Thread]

[A83] Re: A Routine To Display Big Sprites problem




It all looks great now. But when the sprites has flewn two times across the 
screen and is on the half of the next line, it dissapears and starts at his 
strating coords again. Does somebody know how this comes?

"If I have seen farther than others, it is because I was standing on the 
shoulders of giants." - scientist Sir Isaac Newton, in a letter to his 
colleague Robert Hooke, February 1676.



>From: Tijl Coosemans <tijl.coosemans@mail.be>
>Reply-To: assembly-83@lists.ticalc.org
>To: assembly-83@lists.ticalc.org
>Subject: [A83] Re: A Routine To Display Big Sprites
>Date: Wed, 12 Sep 2001 21:44:03 +0200
>
>
>To have text displayed after you used grbufcpy or fastcopy, you must either 
>draw the text every time you copied the graph buf to the screen, or, you 
>make sure the text is drawn in the graph buf and gets copied to the screen 
>together with all the other stuff you've drawn in it. The latter is of 
>course the best solution. The first one would cause flicker because the 
>text gets removed, redrawn,removed,...
>To have _vputs draw a text string in graph buf instead of on the screen, 
>you set 7,(iy+20). Afterwards you res 7,(iy+20), so that _vputs draws back 
>to the screen. Otherwise the TIOS wouldn't work well.
>
>Next thing I changed in your source code was the way you draw a line. 
>Because it is a horizontal line, it is far more easier and a lot faster to 
>get the address in the graph buf of where the row starts. Each row is 12 
>bytes and thus you just need to multiply the row you want with 12, and add 
>that number to the start address of the graph buffer. Then you just load 12 
>bytes (is a full row) with %11111111, so each pixel in that row is set.
>
>To draw your sprite I took the vnDrawPicture routine (from Venus), which 
>draws a variable size sprite on the screen. It has the following inputs.
>
>   input:	b = height (in pixels)
>	c = width (in bytes)
>	h = x-coordinate
>	l = y-coordinate
>	ix -> picture data
>
>To speed things up, I also included a fastCopy routine. This should be way 
>faster then the _grbufcpy_v routine.
>
>Finally, because there isn't any limit to your shipx value, it will count 
>up until it reaches 0 again. Because a screen is only 96 pixel, an x-value 
>of, let's say 100, will cause your sprite to be drawn on the next line.
>
>--Tijl Coosemans
>
>.NOLIST			;Necessary stuff,
>#define end .end
>#define END .end
>#define equ .equ
>#define EQU .equ
>#include "ti83asm.inc"
>#include "tokens.inc"
>.LIST
>#DEFINE shipy 8265h
>#DEFINE shipx 8266h
>KClear	.equ 191
>
>.org 9327h		; Begin
>
>	call _grbufclr	; clear graph buffer
>	ld hl,256*0+1
>	ld (pencol),hl
>	ld hl,nameandversion
>	set 7,(iy+20)	; text writes to graph buffer
>	call _vputs
>	res 7,(iy+20)	; turn it off again
>
>	ld b,12		; draw 12 bytes = 1 row
>	ld hl,8E29h+(56*12) ; address in graph buffer at row 56
>drawLineLoop:
>	ld (hl),$FF	; fill byte with %11111111
>	inc hl		; next byte
>	djnz drawLineLoop	; repeat 12 times
>
>;	ld b,0
>;	ld c,56
>;	ld d,94
>;	ld e,56
>;	ld h,1
>;	call _Iline
>
>	ld hl,0*256+20	; init shipx and shipy
>	ld (shipy),hl
>
>;	ld a,0
>;	ld (shipx),a
>;	ld a,20
>;	ld (shipy),a
>
>clearloop:
>	ld a,0ffh
>	out (1),a
>	ld a, 0fdh
>	out (1),a
>	in a,(1)
>	cp KClear
>	jp z, startgame
>flyship:
>	call drawship	; draw ship in graph buf
>	call fastCopy	; display screen
>	call drawship	; remove ship in graph buf
>	ld a,(shipx)
>	inc a
>	ld (shipx),a
>	jr clearloop
>drawship:
>	ld hl,(shipy)	; hl = ship coordinates
>	ld bc,4*256+2	; bc = size of sprite
>	ld ix,ship	; Load sprite name to ix
>	call vnDrawPicture
>	ret
>startgame:
>	ret
>ship:
>	.db %01000000,%01000000
>	.db %00111011,%00111011
>	.db %01000100,%01000100
>	.db %01111111,%01111111
>
>vnDrawPicture:
>	ld	a,h
>	ld	h,0
>	ld	d,h
>	ld	e,l
>	add	hl,de
>	add	hl,de
>	add	hl,hl
>	add	hl,hl
>	ld	e,a
>	srl	e
>	srl	e
>	srl	e
>	add	hl,de
>	ld	de,8E29h
>	add	hl,de
>	and	7
>	ld	e,a
>vnDrawPictureLoop1:
>	push	bc
>	push	hl
>	ld	b,c
>vnDrawPictureLoop2:
>	ld	c,(ix)
>	ld	d,0
>	inc	ix
>	ld	a,e
>	or	a
>	jr	z,vnDrawPicture1
>vnDrawPictureLoop3:
>	srl	c
>	rr	d
>	dec	a
>	jr	nz,vnDrawPictureLoop3
>vnDrawPicture1:
>	ld	a,c
>	xor	(hl)
>	ld	(hl),a
>	inc	hl
>	ld	a,d
>	xor	(hl)
>	ld	(hl),a
>	djnz	vnDrawPictureLoop2
>	pop	hl
>	ld	c,12
>	add	hl,bc
>	pop	bc
>	djnz	vnDrawPictureLoop1
>	ret
>
>fastCopy:
>	di
>	ld	a,$80
>	out	($10),a
>	ld	hl,8E29h-12-(-(12*64)+1)
>	ld	a,$20
>	ld	c,a
>	inc	hl
>	dec	hl
>fastCopyAgain:
>	ld	b,64
>	inc	c
>	ld	de,-(12*64)+1
>	out	($10),a
>	add	hl,de
>	ld	de,10
>fastCopyLoop:
>	add	hl,de
>	inc	hl
>	inc	hl
>	inc	de
>	ld	a,(hl)
>	out	($11),a
>	dec	de
>	djnz	fastCopyLoop
>	ld	a,c
>	cp	$2B+1
>	jr	nz,fastCopyAgain
>	ret
>
>nameandversion:
>	.db "Ultimate Bomber v 0.11",0
>.end
>
> > ----------------------------------------
> > From: Maarten Z. <m021085@hotmail.com>
> >
> > Does anybody has a routine to display 16x16 sprites, especially a XOR
> > routine. Movax's routine is only for 8x8. Or do I have to program it for 
>ION
> > using, ION putbigsprite.
> > I have also a problem with text. When I display text on the screen and 
>after
> > that I put a moving 8x8 sprite on the screen, the text dissapears.
> > Also when I displayed an 8x8 moving sprite, using Movax routine, the
> > movement was terribly slow, I could do it faster in basic, I used this
> > code(don't look at the crappy sprite:
> > ..NOLIST			;Necessary stuff,
> > #define end .end
> > #define END .end
> > #define equ .equ
> > #define EQU .equ
> > #include "ti83asm.inc"
> > #include "tokens.inc"
> > ..LIST
> > #DEFINE shipx 8265h
> > #DEFINE shipy 8266h
> >
> > KClear		.equ 191
> > ..org 9327h		; Begin
> > progstart:
> > 	call _clrLCDFull
> > 	ld hl,256*0+1   ; in the routine
> > 	ld (pencol),hl
> > 	ld hl,nameandversion
> > 	call _vputs
> > 	ld b,0
> > 	ld c,56
> > 	ld d,94
> > 	ld e,56
> > 	ld h,1
> > 	call _Iline
> > 	ld a,0
> > 	ld (shipx),a
> > 	ld a,20
> > 	ld (shipy),a
> > clearloop:
> > 	ld a,0ffh
> > 	out (1),a
> > 	ld a, 0fdh
> > 	out (1),a
> > 	in a,(1)
> > 	cp KClear
> > 	jp z, startgame
> > flyship:
> > 	call drawship
> > 	ld a,(shipx)
> > 	inc a
> > 	ld (shipx),a
> > 	call drawship
> > 	jr clearloop
> > drawship:
> > 	ld a,(shipy)
> >         ld e,a
> >         ld a,(shipx)
> >         ld bc,ship 	;Load sprite name to bc
> >         call SPRXOR 	;Call movax' Sprite Routine
> >         call _grbufcpy_v
> >         ret
> >
> >
> > startgame:
> > 	ret
> > ship:
> > 	.db %0000000000000000
> > 	.db %0000000000000000
> > 	.db %0100000001000000
> > 	.db %0011101100111011
> > 	.db %0100010001000100
> > 	.db %0111111101111111
> > 	.db %0000000000000000
> > 	.db %0000000000000000
> > SPRXOR:
> >
> >         push    bc              ; Save sprite address
> >
> > ;====   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,8e29h
> >         add     hl,de           ; Add address to graphbuf
> >
> >         ld      b,00000111b     ; Get the remainder of x/8
> >         and     b
> >         cp      0               ; Is this sprite aligned to 8*n,y?
> >         jp      z,ALIGN
> >
> >
> > ;====   Non aligned sprite blit starts here   ====
> >
> >         pop     ix              ; ix->sprite
> >         ld      d,a             ; d=how many bits to shift each line
> >
> >         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
> >         jp      nz,LILOP        ; Next line
> >
> >         jp      DONE1
> >
> >
> > ;====   Aligned sprite blit starts here   ====
> >
> > ALIGN:                          ; Blit an aligned sprite to graphbuf
> >         pop     de              ; de->sprite
> >
> >         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
> >
> > nameandversion:
> > 	.db "Ultimate Bomber v 0.11",0
> >
> > ..end
> > END
> >
> > ------------------------------------------------
> > "If I have seen farther than others, it is because I was standing on the
> > shoulders of giants." - scientist Sir Isaac Newton, in a letter to his
> > colleague Robert Hooke, February 1676.
> >
> >
> >
> >
> > _________________________________________________________________
> > Get your FREE download of MSN Explorer at 
>http://explorer.msn.com/intl.asp
> >
> >
> >
>
>-----------------------------------------------------
>Mail.be, Free WebMail and Virtual Office
>http://www.mail.be
>
>
>


_________________________________________________________________
Get your FREE download of MSN Explorer at http://explorer.msn.com/intl.asp