[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