Mercurial > repos > ghero
view sprites.s68 @ 14:166d58b234c3
Added my old sprite library I forgot to add earlier
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 08 Sep 2013 12:17:02 -0700 |
parents | |
children |
line wrap: on
line source
;Sprite Management Library ;Copyright 2003 by Mike Pavone a.k.a. Mask of Destiny ; ;This library manages the allocation and deallocation of sprites for use with the Genesis VDP ;Keep in mind that you shouldn't play with the link field of your sprites when using this library ; SpriteTable equ $FFFFF000 SpriteTable4 equ SpriteTable+4 SpriteLink equ SpriteTable+3 ;InitSprites - This initializes the library, call it once before using the any of the other functions ;Doesn't effect any registers InitSprites: move.l #0,(SpriteTable).w move.l #0,(SpriteTable4).w rts ;AddSprites - Adds a sprite to the sprite list and initializes it's entry. Returns pointer to sprite list ;entry in A0, destroys data in a0, d2, d1 and d0 AddSprite: lea (SpriteLink).w,a0 moveq #0,d2 moveq #0,d0 tst.b (FirstSprite) beq FoundFirst moveq #78,d1 FindEmpty: move.b (a0),d0 tst.b d0 beq FoundEmpty sub.b d2,d0 cmp.b #1,d0 bne FoundEmpty add.b #1,d2 add.l #8,a0 dbra d1,FindEmpty move.l #0,a0 rts FoundFirst: sub.l #3,a0 move.b #1,(FirstSprite) bra CopyDefaultSprite FoundEmpty: move.b (a0),d0 add.b #1,d2 move.b d2,(a0) add.l #5,a0 CopyDefaultSprite: move.w #144,(a0)+ move.b $0,(a0)+ move.b d0,(a0)+ move.l #144,(a0) sub.l #4,a0 rts DefaultSprite: ;not actually used, just there for reference dc.b $0, $20, $0, $0, $0, $0, $0, $20 FirstSprite dc.w $0 ;FreeSprite - Deletes a sprite from the sprite table. Takes a pointer to the sprite table entry to be removed in a0 FreeSprite: move.l a0,d0 move.b 3(a0),d2 sub.w #SpriteTable,d0 lsr.w #3,d0 lea (SpriteLink).w,a0 FindPrecedingSprite: move.b (a0),d1 beq PrecedingSpriteNotFound cmp.b d1,d0 beq FoundPrecedingSprite add.l #8,a0 bra FindPrecedingSprite FoundPrecedingSprite: move.b d2,(a0) PrecedingSpriteNotFound: rts ;SpriteCopyVRAM - Copies the sprite table from RAM to VRAM. Should be called once every frame during VBLANK. Expects addresses for VDP to ;be in A4 and A5 and that auto-increment is set appropriately SpriteCopyVRAM: move.l #$95009678,(a5) ;setup DMA source move.w #$977F,(a5) move.l #$93409401,(a5) ;set DMA length move.l #$78000083,(a5) ;Do DMA to sprite table rts lea (SpriteTable).w,a0 move.l #$78000003,(a5) ;VDP command word for sprite table moveq #39,d0 SpriteCopyLoop: move.l (a0)+,(a4) move.l (a0)+,(a4) move.l (a0)+,(a4) move.l (a0)+,(a4) dbra d0,SpriteCopyLoop rts Stuff: dc.b 0 Stuffb: dc.b 0 dc.w 0 AddBigSprite: move.w (a1)+,d3 lea BigSpritePointerTable(pc),a2 subq #1,d3 ;change back to a sub 1 BigSpriteMapLoop: bsr AddSprite move.w #$265D,d1 move.b (a1)+,2(a0) add.b (a1)+,d1 move.w d1,4(a0) move.b (a1)+,d1 add.b d1,7(a0) move.b (a1)+,d1 add.b d1,1(a0) move.l a0,(a2)+ dbra d3,BigSpriteMapLoop move.l #0,(a2) move.w (a1)+,d0 move.w #$9360,(a5) move.w #$9404,(a5) move.l a1,d7 move.w #$9500,d6 ror.l #1,d7 move.b d7,d6 move.w d6,(a5) ror.l #8,d7 move.b d7,d6 add.w #$100,d6 move.w d6,(a5) ror.l #8,d7 move.b d7,d6 add.w #$100,d6 and.b #$7F,d6 move.w d6,(a5) move.l #$4BA00083,(a5) ;SpriteLoop: ; move.w (a1)+,(a4) ; dbra d0,SpriteLoop ; move.l (BigSpriteXPos),(BigSpriteXPosOld) ; move.l #$00900090,(BigSpriteXPos) rts FreeBigSprite: lea BigSpritePointerTable(pc),a1 BigSpriteFreeLoop: move.l (a1)+,d0 beq BigspriteFreeDone move.l d0,a0 bsr FreeSprite bra BigSpriteFreeLoop BigspriteFreeDone: rts ChangeFrameBigSprite: lea BigSpriteFrameTable(pc),a2 ; move.l (a2),d0 ; beq OldFreeBigSprite bsr FreeBigSprite OldFreeBigSprite: add.l d3,d3 add.l d3,d3 add.l d3,a2 move.l (a2),a1 bsr AddBigSprite move.w (BigSpriteXPos),d0 move.w (BigSpriteYPos),d1 bsr MoveBigSprite move.w d0,(BigSpriteXPos) move.w d1,(BigSpriteYPos) rts InitFrameBigSprite: lea BigSpriteFrameTable(pc),a1 InitFrameBigSpriteLoop: move.l (a0)+,d0 beq DoneInitBigSprite move.l a0,(a1)+ add.l d0,a0 bra InitFrameBigSpriteLoop DoneInitBigSprite: move.l a0,(a1)+ move.l #0,(a1) move.l a0,a1 bsr AddBigSprite rts MoveBigSprite: lea BigSpritePointerTable(pc),a0 BigSpriteMoveLoop: move.l (a0)+,a1 move.l a1,d2 beq BigSpriteMoveDone add.w d1,(a1) add.w d0,6(a1) bra BigSpriteMoveLoop BigSpriteMoveDone: add.w d1,(BigSpriteYPos) add.w d0,(BigSpriteXPos) rts ; include sendrecv.asm BigSpritePointerTable: dc.l 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 BigSpriteFrameTable: dc.l 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 BigSpriteXPos: dc.w 0 BigSpriteYPos: dc.w 0 BigSpriteXPosOld: dc.w 0 BigSpriteYPosOld: dc.w $0