Displaying sprites

From NeoGeo Development Wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

How to display a 64*80 (4*5 tiles) sprite block at x=88, y=36.

Loading palette

At least one palette needs to be loaded. Here SpritePalette is loaded as palette 0 and the backdrop color is set to black.

    lea     SpritePalette,a0
    lea     PALETTES,a1
    moveq.l #16-1,d7
.ldpal
    move.w  (a0)+,(a1)+
    dbra    d7,.ldpal

    move.w  #BLACK,BACKDROPCOLOR

Setting the map

The sprite's map is an array of tile numbers and attributes. Here the 4 sprites are made of tiles 0~4 with no special attributes.

    move.w  #64,d2          ;SCB1, sprite 1
    move.w  #1,VRAM_MOD
    moveq.l #4-1,d6
.sprites:
    move.w  d2,VRAM_ADDR
    clr.w   d1              ;First tile is #0
    moveq.l #5-1,d7
.tiles:
    move.w  d1,VRAM_RW      ;Tile number
    move.w  #0,VRAM_RW      ;No attributes
    addq.b  #1,d1
    dbra    d7,.tiles
    addi.w  #64,d2          ;Next sprite
    dbra    d6,.sprites

Setting the shrinking

No shrinking at all (full size).

    move.w  #SCB2+1,VRAM_ADDR
    moveq.l #4-1,d7
.zset:
    move.w  #$0FFF,VRAM_RW
    dbra    d7,.zset

Setting the size and vertical position

First sprite is the driving one, next are driven.

    move.w  #SCB3+1,VRAM_ADDR
    move.w  #((496-36)<<7)+5,VRAM_RW ;Y position and size for the first sprite
    moveq.l #5-1-1,d7
.yset:
    move.w  #64,VRAM_RW   ;Sticky bit only for the 3 others
    dbra    d7,.yset

Setting the horizontal position

    move.w  #SCB4+1,VRAM_ADDR
    move.w  #88<<7,VRAM_RW