A85: Sprite help...


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

A85: Sprite help...




Im trying DEPSERATELY to learn to use sprites in my progs. Ive learned to
move sprites on the screen byte by byte, that is, I can move a sprite over 8
pixels at a time, and up and down any number or pixels i want, but I wanna
know how to
move them left and right a single pixel at a time.


Ive tried several routines, checked my code and quadruple checked it, but
cant get any routines to work right.  Here is my code, using the newest
routine(i think) SDR by Jay L of Macross Software:


#include "usgard.h"

        .org 0
        .db "Test", 0

        call CLEARLCD


        jr Draw



Wait:

        call GET_KEY
        cp K_EXIT
        jr nz, Wait
        ret



Draw:
        ld hl, &Sprite
        ld b, 9
        ld c, 9





;***this is the routine here:***
;Sprite Drawing Routine (SDR): 8 Bit Normal Version
;by JL
;<JayEll64@aol.com>
;
;Inputs:
; b=x coordinate
; c=y coordinate
; hl=pointer to sprite data
;Outputs:
; af=destroyed
; bc=destroyed
; de=destroyed
; hl=pointer to byte after sprite
; no other registers are changed
;If you want to save those registers that are destroyed, push/pop them!
;
;Sprite data should be stored as follows:
;.db (# rows/bytes/height of sprite)
;.db (bitmap of sprite)
;



PutSprite:
   push ix
   push bc
   push de
   ld a,63              ;\
   sub c                ; |63-y, so the drawing starts at the top
   ld c,a               ;/
   push hl
   push hl
   call FIND_PIXEL      ;hl has offset in viedo mem; a has bit^2
   ld de,GRAPH_MEM      ;store into graph mem for virtual screen
   add hl,de
   ex de,hl             ;de physical address in vid mem
   pop hl               ;hl has sprite's beginning address again
   ld b,8               ;ld b with width
   ld c,8               ;ld c with height
   push hl              ;(hl) has the graphics of the sprite
   pop ix               ;(ix) has the graphics of the sprite
   ex de,hl             ;\(de) has gfx of sprite
                        ;/hl has addr. in video mem
PS_NewRow:
   push bc
   ld d,(ix)            ;d has graphics for one row of sprite
   inc ix               ;point to next row of sprite
   push af
   push hl
PS_NewCol:
   rl d
   ld e,a
   jr nc,PS_NoPixel
   or (hl)
;   ld (hl),a           ;Michael Optimization
   jr PS_NextPixel
PS_NoPixel:
   cpl                  ;complement of a, ~a
   and (hl)             ;\ a = what's in video mem AND ~bit^2
                        ; |only bit^2 is affected (erased)
                        ;/ all others AND'ed w/1, which has no affect
;   ld (hl),a           ;Michael Optimization
PS_NextPixel:
   ld (hl),a            ;ld a back into video mem (where it should be)
   ld a,e               ;restore bit^2 into a
   rrca                 ;\circular rotation of a, so a affects next bit
   jr nc,PS_SameByte    ;C flag set when the 1 in a is shifted out of a
   inc hl               ;next byte in video memory
PS_SameByte:
   djnz PS_NewCol       ;go to the next column if b not = 0
   pop hl               ;restore the video mem address
   pop af               ;restore the byte from FIND_PIXEL
   ld de,16             ;\move down a row (which is 16 bytes)
   add hl,de            ;/
   pop bc               ;bc again contains the width and height
   dec c                ;one less row to draw
   jr nz,PS_NewRow      ;when c=0, don't draw anymore rows
   pop hl               ;\
   pop de               ; |pixel plotted so restore the registers
   pop bc               ; |
   pop ix               ;/

;***End Routine***






jr Wait    ;return to main program


;End:
;        ret

Sprite:

.db %00001000, %00001000

.db %00111100
.db %01100110
.db %11000011
.db %11000011
.db %11000011
.db %11000011
.db %01100110
.db %00111100

        .end

Any help would be GREATLY appreciated.

THanks

Stu