[A83] Re: A Routine To Display Big Sprites problem
[Prev][Next][Index][Thread]
[A83] Re: A Routine To Display Big Sprites problem
Sounds like the x coordinate keeps increasing and increasing (past 96-8 or
whatever) until it hits 255, when it causes a carry and resets to zero.
----------------------------------------------
Original Message
From: "Maarten Z."<m021085@hotmail.com>
Subject: [A83] Re: A Routine To Display Big Sprites problem
Date: Thu, 13 Sep 2001 15:01:02 +0000
>
>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
>
>
>
>
_____________________________________________
Free email with personality! Over 200 domains!
http://www.MyOwnEmail.com