Re-enable the background, and scroll it.

This commit is contained in:
Colin McMillen 2015-05-24 13:22:42 -04:00
parent dceedf64ba
commit ffd584c19e
2 changed files with 96 additions and 27 deletions

View File

@ -54,12 +54,16 @@ Start:
jsr LoadPaletteAndTileData
jsr InitializeSpriteTables
; Set screen mode: 16x16 tiles for BG2, 8x8 tiles elsewhere, mode 0.
lda #%00100000
sta BGMODE
; Set sprite size to 16x16 (small) and 32x32 (large).
lda #%01100000
sta OAMSIZE
; Main screen: enable sprites.
lda #%00010000
; Main screen: enable sprites & BG2.
lda #%00010010
sta MSENABLE
; Turn on the screen.
@ -125,6 +129,9 @@ LoadPaletteAndTileData:
; Initialize the palette memory in a loop.
; 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. :)
; TODO(mcmillen): do it with a DMA transfer.
; First, sprite palette data:
ldx #0
lda #128 ; Palette entries for sprites start at 128.
sta CGADDR
@ -135,6 +142,22 @@ LoadPaletteAndTileData:
cpx #32 ; 32 bytes of palette data.
bne -
; Now, BG2 palette data:
ldx #0
lda #32 ; Palette entries for BG2 start at 32.
sta CGADDR
-
lda.l TilePalette, X
sta CGDATA
inx
cpx #8 ; 8 bytes of palette data.
bne -
; TODO(mcmillen): make the "DMA stuff into VRAM" a macro or function.
; Set VMADDR to where we want the DMA to start. We'll store sprite data
; at the beginning of VRAM.
ldx #$0000
stx VMADDR
; DMA 0 source address & bank.
ldx #SpriteData
stx DMA0SRC
@ -149,32 +172,58 @@ LoadPaletteAndTileData:
lda #%00000001
sta DMA0CTRL
; DMA 0 destination.
lda #$18 ; Upper-byte is assumed to be $21, so this is $2118 & $2119.
lda #$18 ; The upper byte is assumed to be $21, so this is $2118 & $2119.
sta DMA0DST
; $2116 sets the word address for accessing VRAM.
ldx #$0000
stx VMADDR
; Enable DMA channel 0.
lda #%00000001
sta DMAENABLE
; VRAM writing mode. Increments the address every time we write to $2119.
; Store background tile data at byte $2000 of VRAM.
; (VMADDR is a word address, so multiply by 2 to get the byte address.)
ldx #$1000
stx VMADDR
; DMA 0 source address & bank.
ldx #TileData
stx DMA0SRC
lda #:TileData
sta DMA0SRCBANK
; DMA 0 transfer size.
; See the helpful comment in tiles.asm to find the size of the tile data.
ldx #384
stx DMA0SIZE
; DMA 0 control register.
; Transfer type 001 = 2 addresses, LH.
lda #%00000001
sta DMA0CTRL
; DMA 0 destination.
lda #$18 ; The upper byte is assumed to be $21, so this is $2118 & $2119.
sta DMA0DST
; Enable DMA channel 0.
lda #%00000001
sta DMAENABLE
; Set up the BG2 tilemap.
; VRAM write mode: increments the address every time we write a word.
lda #%10000000
sta VMAIN
; Set word address for accessing VRAM to $6000.
ldx #$6000 ; BG 2 starts here.
; Set word address for accessing VRAM.
ldx #$2000 ; BG 2 tilemap starts here. (Byte address $4000.)
stx VMADDR
ldx #$0004 ; Stick one tile into BG2.
; Now write entries into the tile map.
ldy #0
-
ldx #$0002 ; Write one tile into the map.
stx VMDATA
iny
cpy #1024 ; The tile map is 32x32 (1024 entries).
bne -
; Set up the screen. 16x16 tiles for BG2, 8x8 tiles elsewhere, mode 0.
; The BG2 tilemap starts at $4000.
lda #%00100000
sta BGMODE
; $2108 is the BG2 VRAM location register.
; This tells it that the BG2 data starts at $6000.
lda #%01100000
sta BG2SC
stz BG12NBA
sta BG2TILEMAP
; Background tile data for BG1 & BG2 starts at $2000.
lda #%00010001
sta BG12NBA
rts
@ -206,8 +255,9 @@ InitializeSpriteTables:
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 0,2,4,6 - High bit of the sprite's x-coordinate.
; bits 1,3,5,7 - Toggle Sprite size: 0 - small size 1 - large size
; Setting all the high bits keeps the sprites offscreen.
lda #%0101010101010101
-
sta $0100, X
@ -225,7 +275,7 @@ VBlankHandler:
jsr VBlankCounter ; DEBUG
jsr JoypadHandler
jsr SetBackgroundColor
jsr SetPlayerPosition
jsr UpdateGraphics
jsr DMASpriteTables
rti
@ -411,16 +461,26 @@ SetBackgroundColor:
SetPlayerPosition:
UpdateGraphics:
; Copy player coords into sprite table.
lda $0020
sta $0100
lda $0021
sta $0101
; Set priority bits so that the sprite is drawn in front.
lda #%00110000
sta $0103
; Clear x-MSB so that the sprite is displayed.
lda $0300
and #%11111110
sta $0300
; Make the background scroll.
lda $14
sta BG2HOFS
lda $15
sta BG2HOFS
rts
@ -468,3 +528,11 @@ FillScratch:
.SECTION "SpriteData"
.INCLUDE "sprites.asm"
.ENDS
.BANK 2 SLOT 0
.ORG 0
.SECTION "TileData"
.INCLUDE "tiles.asm"
.ENDS

View File

@ -50,13 +50,13 @@
; f: MODE definition.
.define BGMODE $2105
; $2107-210A: BG1-4 VRAM location registers [BGxSC]
; xxxxxxab x: Base address
; ab: SC size
.define BG1SC $2107
.define BG2SC $2108
.define BG3SC $2109
.define BG4SC $210A
; $2107-210A: BG1-4 tilemap registers [BGxSC]
; xxxxxxab x: Base address (in VRAM, shifted left 11 bits).
; ab: SC size (00=32x32 01=64x32 10=32x64 11=64x64)
.define BG1TILEMAP $2107
.define BG2TILEMAP $2108
.define BG3TILEMAP $2109
.define BG4TILEMAP $210A
; $210B: BG1 & BG2 VRAM location register [BG12NBA]
; $210C: BG3 & BG4 VRAM location register [BG34NBA]
@ -99,6 +99,7 @@
.define VMAIN $2115
; $2116-$2117: Video port address. 2 bytes. [VMADDL/VMADDH]
; Sets the initial address of a VRAM upload or download.
.define VMADDR $2116
; $2118-$2119: Video port data. 2 bytes. [VMDATAL/VMDATAH]