21968ae8ef
DMA write was always working, I just had the wrong tile data format Tile data is two bytes, not wrong Also keep around previously-working tile-load loop for prosterity
178 lines
3.4 KiB
NASM
178 lines
3.4 KiB
NASM
.include "header.inc"
|
|
.include "snes_init.asm"
|
|
.include "my_custom.asm"
|
|
|
|
.BANK 0 SLOT 0
|
|
.org 0
|
|
.section "Vblank"
|
|
|
|
VBlank:
|
|
rti
|
|
|
|
.ENDS
|
|
|
|
.BANK 0 SLOT 0
|
|
.ORG 0
|
|
.section "Main"
|
|
|
|
.MACRO Video_Port_Control
|
|
;VRAM transfer, word-access, increment by 1
|
|
lda #%10000000
|
|
sta $2115
|
|
.ENDM
|
|
|
|
;assumes 8-bit a, 16-bit xy
|
|
.MACRO Load_Block_to_VRAM ARGS SOURCE DEST SIZE
|
|
Video_Port_Control
|
|
|
|
ldx #DEST
|
|
stx $2116 ; $2116/2117 is 2byte address for VRAM upload/download. most significant bit must be 0
|
|
|
|
lda #:SOURCE ; source bank
|
|
ldx #SOURCE ; source offset
|
|
ldy #SIZE
|
|
|
|
stx $4302 ; store data offset into DMA control register
|
|
sta $4304 ; store bank into DMA source bank
|
|
sty $4305 ; store size of block
|
|
|
|
lda #$01
|
|
sta $4300 ; set DMA mode (word, normal increment)
|
|
|
|
lda #$18
|
|
sta $4301 ; set destination register (VRAM write register) - add value to $2100 to get destination address
|
|
; i.e. this is writing to $2118, which when written writes a byte to VRAM
|
|
|
|
lda #$01
|
|
sta $420b ; and start the transfer
|
|
.ENDM
|
|
|
|
Start:
|
|
Snes_Init
|
|
|
|
Set_A_8_XY_16
|
|
|
|
Load_Palette_Color $00, $00
|
|
Load_Palette_Color $00, $00
|
|
Load_Palette_Color $00, $00
|
|
Load_Palette_Color $ff, $0a
|
|
|
|
Set_Screen_Brightness %00001111
|
|
|
|
lda #%00000000 ; 8x8 for all 4 backgrounds, no priority flip, Mode: 4 colors/tile w/ 32 palettes
|
|
sta $2105 ; store to screen mode register
|
|
|
|
; size (last argument) depends on color mode
|
|
; location is beginning of VRAM
|
|
|
|
; put character data at VRAM $0000, tile data at $0400
|
|
lda #$04
|
|
sta $2107 ; BG1 tile map location (upper 6 bits)
|
|
lda #$00
|
|
sta $210b ; BG1 character location ($1000 word intervals - can't go over $8000 b/c size of VRAM)
|
|
|
|
stz $1337
|
|
|
|
; main screen designation
|
|
lda #%00000001
|
|
sta $212c ; enable bkg 1,
|
|
|
|
Load_Block_to_VRAM Tiles, $0000, (8*2*3),
|
|
|
|
Load_Block_to_VRAM TileMap, $0400, 4
|
|
|
|
lda #%10000001 ; enable NMI and joypads
|
|
sta $4200
|
|
|
|
mainloop:
|
|
Spin_Loop $02
|
|
|
|
Reset_Palette_Offset
|
|
Load_Palette_Color $00, $00
|
|
Load_Palette_Color $00, $00
|
|
Load_Palette_Color $00, $00
|
|
Load_Palette_Color $ff, $0a
|
|
|
|
Spin_Loop $02
|
|
|
|
Reset_Palette_Offset
|
|
Load_Palette_Color $ff, $a0
|
|
Load_Palette_Color $00, $00
|
|
Load_Palette_Color $00, $00
|
|
Load_Palette_Color $ff, $0a
|
|
|
|
jmp mainloop
|
|
|
|
.ENDS
|
|
|
|
|
|
.BANK 1 SLOT 0
|
|
.org 0
|
|
.section "TileData"
|
|
|
|
Tiles:
|
|
|
|
;blank tile
|
|
.db $00, $00, $00, $00, $00, $00, $00, $00
|
|
.db $00, $00, $00, $00, $00, $00, $00, $00
|
|
|
|
;face
|
|
.db %00000000
|
|
.db %00000000
|
|
|
|
.db %11000011
|
|
.db %11000011
|
|
|
|
.db %11000011
|
|
.db %11000011
|
|
|
|
.db %00111000
|
|
.db %00111000
|
|
|
|
.db %00111000
|
|
.db %00111000
|
|
|
|
.db %10000001
|
|
.db %10000001
|
|
|
|
.db %01000010
|
|
.db %01000010
|
|
|
|
.db %00111100
|
|
.db %00111100
|
|
|
|
; different face
|
|
.db %11111111
|
|
.db %00000000
|
|
|
|
.db %11111111
|
|
.db %00000000
|
|
|
|
.db %11000011
|
|
.db %00000000
|
|
|
|
.db %00111000
|
|
.db %00111000
|
|
|
|
.db %00111000
|
|
.db %00111000
|
|
|
|
.db %10000001
|
|
.db %10000001
|
|
|
|
.db %01000010
|
|
.db %01000010
|
|
|
|
.db %00111100
|
|
.db %00111100
|
|
|
|
|
|
; each entry in the tile map is two bytes long
|
|
; here is the format:
|
|
;High Low v: vertical flip h: horizontal flip
|
|
;vhopppcc cccccccc o: priority bit p: palette number
|
|
; c: Starting character (tile) number
|
|
TileMap:
|
|
.db $02, $00, $02, $00
|
|
.ENDS
|