Use proper sprites.
This commit is contained in:
parent
77ee989fb0
commit
dceedf64ba
@ -1,4 +1,5 @@
|
|||||||
@echo off
|
@echo off
|
||||||
|
pcx2snes sprites.pcx -osprites.asm -b4 -nSprite -d
|
||||||
pcx2snes tiles.pcx -otiles.asm -b2 -nTile -d
|
pcx2snes tiles.pcx -otiles.asm -b2 -nTile -d
|
||||||
wla-65816 -o pewpew.asm pewpew.o
|
wla-65816 -o pewpew.asm pewpew.o
|
||||||
wlalink -vr wlalink.cfg pewpew.smc
|
wlalink -vr wlalink.cfg pewpew.smc
|
||||||
|
147
pewpew.asm
147
pewpew.asm
@ -36,18 +36,31 @@ sep #%00100000 ; 8-bit A
|
|||||||
|
|
||||||
|
|
||||||
; Memory layout:
|
; Memory layout:
|
||||||
; 00-0F: scratch space for functions.
|
; 0000-000F: scratch space for functions.
|
||||||
; 10-11: controller state of joypad #1.
|
; 0010-0011: controller state of joypad #1.
|
||||||
; 12-13: controller state of joypad #2.
|
; 0012-0013: controller state of joypad #2.
|
||||||
; 14-17: 32-bit counter of vblanks.
|
; 0014-0017: 32-bit counter of vblanks.
|
||||||
; 20-21: (x, y) coordinates of player.
|
; 0020-0021: (x, y) coordinates of player.
|
||||||
; 22-24: RGB color values to use for background color, from [0-31].
|
; 0022-0024: RGB color values to use for background color, from [0-31].
|
||||||
|
;
|
||||||
|
; Sprite table buffers -- copied each frame to OAM during VBlank, using DMA.
|
||||||
|
; 0100-02FF: table 1 (4 bytes each: x/y coord, tile #, flip/priority/palette)
|
||||||
|
; 0300-031F: table 2 (2 bits each: high x-coord bit, size)
|
||||||
|
|
||||||
|
|
||||||
Start:
|
Start:
|
||||||
InitializeSNES
|
InitializeSNES
|
||||||
|
|
||||||
jsr LoadPaletteAndTileData
|
jsr LoadPaletteAndTileData
|
||||||
|
jsr InitializeSpriteTables
|
||||||
|
|
||||||
|
; Set sprite size to 16x16 (small) and 32x32 (large).
|
||||||
|
lda #%01100000
|
||||||
|
sta OAMSIZE
|
||||||
|
|
||||||
|
; Main screen: enable sprites.
|
||||||
|
lda #%00010000
|
||||||
|
sta MSENABLE
|
||||||
|
|
||||||
; Turn on the screen.
|
; Turn on the screen.
|
||||||
; Format: x000bbbb
|
; Format: x000bbbb
|
||||||
@ -113,24 +126,24 @@ LoadPaletteAndTileData:
|
|||||||
; We could also do this with a DMA transfer (like we do with the tile data
|
; We could also do this with a DMA transfer (like we do with the tile data
|
||||||
; below), but it seems overkill for just a few bytes. :)
|
; below), but it seems overkill for just a few bytes. :)
|
||||||
ldx #0
|
ldx #0
|
||||||
lda #32 ; Palette entries for BG2 start at 32.
|
lda #128 ; Palette entries for sprites start at 128.
|
||||||
sta CGADDR
|
sta CGADDR
|
||||||
-
|
-
|
||||||
lda.l TilePalette, x
|
lda.l SpritePalette, X
|
||||||
sta CGDATA
|
sta CGDATA
|
||||||
inx
|
inx
|
||||||
cpx #8 ; 8 bytes of palette data.
|
cpx #32 ; 32 bytes of palette data.
|
||||||
bne -
|
bne -
|
||||||
|
|
||||||
; DMA 0 source address & bank.
|
; DMA 0 source address & bank.
|
||||||
ldx #TileData
|
ldx #SpriteData
|
||||||
stx DMA0SRC
|
stx DMA0SRC
|
||||||
lda #:TileData
|
lda #:SpriteData
|
||||||
sta DMA0SRCBANK
|
sta DMA0SRCBANK
|
||||||
; DMA 0 transfer size.
|
; DMA 0 transfer size.
|
||||||
; See the helpful comment in tiles.asm to find the size of the tile data.
|
; See the helpful comment in sprites.asm to find the size of the tile data.
|
||||||
ldy #384
|
ldx #576
|
||||||
sty DMA0SIZE
|
stx DMA0SIZE
|
||||||
; DMA 0 control register.
|
; DMA 0 control register.
|
||||||
; Transfer type 001 = 2 addresses, LH.
|
; Transfer type 001 = 2 addresses, LH.
|
||||||
lda #%00000001
|
lda #%00000001
|
||||||
@ -139,8 +152,8 @@ LoadPaletteAndTileData:
|
|||||||
lda #$18 ; Upper-byte is assumed to be $21, so this is $2118 & $2119.
|
lda #$18 ; Upper-byte is assumed to be $21, so this is $2118 & $2119.
|
||||||
sta DMA0DST
|
sta DMA0DST
|
||||||
; $2116 sets the word address for accessing VRAM.
|
; $2116 sets the word address for accessing VRAM.
|
||||||
ldy #$0000
|
ldx #$0000
|
||||||
sty VMADDR
|
stx VMADDR
|
||||||
; Enable DMA channel 0.
|
; Enable DMA channel 0.
|
||||||
lda #%00000001
|
lda #%00000001
|
||||||
sta DMAENABLE
|
sta DMAENABLE
|
||||||
@ -163,10 +176,47 @@ LoadPaletteAndTileData:
|
|||||||
sta BG2SC
|
sta BG2SC
|
||||||
stz BG12NBA
|
stz BG12NBA
|
||||||
|
|
||||||
; Main screen: enable BG2.
|
rts
|
||||||
lda #%00000010
|
|
||||||
sta MSENABLE
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
InitializeSpriteTables:
|
||||||
|
; This page is a good reference on SNES sprite formats:
|
||||||
|
; http://wiki.superfamicom.org/snes/show/SNES+Sprites
|
||||||
|
; It uses the same approach we're using, in which we keep a buffer of the
|
||||||
|
; sprite tables in RAM, and DMA the sprite tables to the system's OAM
|
||||||
|
; during VBlank.
|
||||||
|
rep #%00110000 ; 16-bit A/X/Y.
|
||||||
|
|
||||||
|
ldx #$0000
|
||||||
|
; Fill sprite table 1. 4 bytes per sprite, laid out as follows:
|
||||||
|
; Byte 1: xxxxxxxx x: X coordinate
|
||||||
|
; Byte 2: yyyyyyyy y: Y coordinate
|
||||||
|
; Byte 3: cccccccc c: Starting tile #
|
||||||
|
; Byte 4: vhoopppc v: vertical flip h: horizontal flip o: priority bits
|
||||||
|
; p: palette #
|
||||||
|
lda #$01
|
||||||
|
-
|
||||||
|
sta $0100, X ; We keep our sprite table at $0100 and DMA it to OAM later.
|
||||||
|
inx
|
||||||
|
inx
|
||||||
|
inx
|
||||||
|
inx
|
||||||
|
cpx #$0200
|
||||||
|
bne -
|
||||||
|
|
||||||
|
; Fill sprite table 2. 2 bits per sprite, like so:
|
||||||
|
; bits 0,2,4,6 - Enable or disable the X coordinate's 9th bit.
|
||||||
|
; bits 1,3,5,7 - Toggle Sprite size: 0 - small size 1 - large size
|
||||||
|
lda #%0101010101010101
|
||||||
|
-
|
||||||
|
sta $0100, X
|
||||||
|
inx
|
||||||
|
inx
|
||||||
|
cpx #$0220
|
||||||
|
bne -
|
||||||
|
|
||||||
|
sep #%00100000 ; 8-bit A.
|
||||||
rts
|
rts
|
||||||
|
|
||||||
|
|
||||||
@ -176,6 +226,7 @@ VBlankHandler:
|
|||||||
jsr JoypadHandler
|
jsr JoypadHandler
|
||||||
jsr SetBackgroundColor
|
jsr SetBackgroundColor
|
||||||
jsr SetPlayerPosition
|
jsr SetPlayerPosition
|
||||||
|
jsr DMASpriteTables
|
||||||
rti
|
rti
|
||||||
|
|
||||||
|
|
||||||
@ -361,45 +412,59 @@ SetBackgroundColor:
|
|||||||
|
|
||||||
|
|
||||||
SetPlayerPosition:
|
SetPlayerPosition:
|
||||||
; Make sure the high byte of A is zeroed out.
|
; Copy player coords into sprite table.
|
||||||
lda #$00
|
|
||||||
xba
|
|
||||||
; Get player x and convert it to a scroll offset.
|
|
||||||
lda $0020
|
lda $0020
|
||||||
ConvertXCoordinate
|
sta $0100
|
||||||
sta BG2HOFS
|
|
||||||
xba
|
|
||||||
sta BG2HOFS
|
|
||||||
|
|
||||||
; Make sure the high byte of A is zeroed out.
|
|
||||||
lda #$00
|
|
||||||
xba
|
|
||||||
; Get player y and convert it to a scroll offset.
|
|
||||||
lda $0021
|
lda $0021
|
||||||
ConvertYCoordinate
|
sta $0101
|
||||||
sta BG2VOFS
|
; Clear x-MSB so that the sprite is displayed.
|
||||||
xba
|
lda $0300
|
||||||
sta BG2VOFS
|
and #%11111110
|
||||||
|
sta $0300
|
||||||
|
rts
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
DMASpriteTables:
|
||||||
|
rep #%00010000 ; 16-bit X/Y.
|
||||||
|
sep #%00100000 ; 8-bit A.
|
||||||
|
; Store at the base OAM address.
|
||||||
|
ldx #$0000
|
||||||
|
stx OAMADDR
|
||||||
|
; Default DMA control; destination $2104 (OAM data register).
|
||||||
|
stz DMA0CTRL
|
||||||
|
lda #$04
|
||||||
|
sta DMA0DST
|
||||||
|
; Our sprites start at $0100 in bank 0 and are #$220 bytes long.
|
||||||
|
ldx #$0100
|
||||||
|
stx DMA0SRC
|
||||||
|
stz DMA0SRCBANK
|
||||||
|
ldx #$0220
|
||||||
|
stx DMA0SIZE
|
||||||
|
; Kick off the DMA transfer.
|
||||||
|
lda #%00000001
|
||||||
|
sta DMAENABLE
|
||||||
rts
|
rts
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
FillScratch:
|
FillScratch:
|
||||||
lda #$42 ; B
|
lda #$42 ; ASCII "B"
|
||||||
ldx #0
|
ldx #0
|
||||||
FillScratchLoop:
|
-
|
||||||
sta $00, X
|
sta $00, X
|
||||||
inx
|
inx
|
||||||
cpx #$10
|
cpx #$10
|
||||||
bne FillScratchLoop
|
bne -
|
||||||
rts
|
rts
|
||||||
|
|
||||||
|
|
||||||
.ENDS
|
.ENDS
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.BANK 1 SLOT 0
|
.BANK 1 SLOT 0
|
||||||
.ORG 0
|
.ORG 0
|
||||||
.SECTION "TileData"
|
.SECTION "SpriteData"
|
||||||
.INCLUDE "tiles.asm"
|
.INCLUDE "sprites.asm"
|
||||||
.ENDS
|
.ENDS
|
||||||
|
@ -24,6 +24,23 @@
|
|||||||
; x: 0 = screen on, 1 = screen off, bbbb: Brightness ($0-$F)
|
; x: 0 = screen on, 1 = screen off, bbbb: Brightness ($0-$F)
|
||||||
.define INIDISP $2100
|
.define INIDISP $2100
|
||||||
|
|
||||||
|
; $2101: OAM size [OBSEL]
|
||||||
|
; sssnnbbb s: 000 = 8x8 or 16x16.
|
||||||
|
; 001 = 8x8 or 32x32.
|
||||||
|
; 010 = 8x8 or 64x64.
|
||||||
|
; 011 = 16x16 or 32x32.
|
||||||
|
; 100 = 16x16 or 64x64.
|
||||||
|
; 101 = 32x32 or 64x64.
|
||||||
|
; n: Name selection (upper 4k word addr).
|
||||||
|
; b: Base selection (8k word seg. addr).
|
||||||
|
.define OAMSIZE $2101
|
||||||
|
|
||||||
|
; $2102-$2103: OAM address register [OAMADDL/OAMADDH]
|
||||||
|
; aaaaaaaa r000000m a: OAM address.
|
||||||
|
; r: OAM priority rotation.
|
||||||
|
; m: OAM address MSB.
|
||||||
|
.define OAMADDR $2102
|
||||||
|
|
||||||
; $2105: Screen mode register [BGMODE]
|
; $2105: Screen mode register [BGMODE]
|
||||||
; abcdefff a: BG4 tile size (0=8x8, 1=16x16).
|
; abcdefff a: BG4 tile size (0=8x8, 1=16x16).
|
||||||
; b: BG3 tile size (0=8x8, 1=16x16).
|
; b: BG3 tile size (0=8x8, 1=16x16).
|
||||||
|
28
sprites.asm
Normal file
28
sprites.asm
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
; Created with eKid's pcx2snes converter ;
|
||||||
|
|
||||||
|
SpriteData:
|
||||||
|
.db $10, $00, $28, $10, $A8, $90, $64, $58, $E3, $DC, $30, $0F, $AC, $93, $60, $5F$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
|
||||||
|
.db $00, $00, $00, $00, $00, $00, $F8, $00, $80, $00, $70, $80, $0E, $F0, $01, $FE$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
|
||||||
|
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
|
||||||
|
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
|
||||||
|
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
|
||||||
|
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
|
||||||
|
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
|
||||||
|
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
|
||||||
|
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
|
||||||
|
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
|
||||||
|
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
|
||||||
|
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
|
||||||
|
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
|
||||||
|
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
|
||||||
|
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
|
||||||
|
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
|
||||||
|
.db $60, $5F, $AC, $93, $30, $0F, $E3, $DC, $64, $58, $A8, $90, $28, $10, $10, $00$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
|
||||||
|
.db $01, $FE, $0E, $F0, $70, $80, $80, $00, $F8, $00, $00, $00, $00, $00, $00, $00$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
|
||||||
|
|
||||||
|
SpritePalette:
|
||||||
|
.db $1F, $7C, $00, $00, $FF, $7F, $1F, $02, $00, $00, $00, $00, $00, $00, $00, $00
|
||||||
|
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
|
||||||
|
|
||||||
|
; 18 tiles (14 spaces)
|
||||||
|
; 576 bytes
|
BIN
sprites.pcx
Normal file
BIN
sprites.pcx
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user