[A83] Re: A Routine To Display Big Sprites


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

[A83] Re: A Routine To Display Big Sprites




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