diff --git a/homebrew-tutorial/charset.asm b/homebrew-tutorial/charset.asm index c60aa7b..51320ab 100644 --- a/homebrew-tutorial/charset.asm +++ b/homebrew-tutorial/charset.asm @@ -54,6 +54,148 @@ charset: .byte %00000000 .byte %11111111 + ; This is tile 0x02 in 2bpp mode (what the background uses), but tile + ; 0x01 in 4bpp mode (what the sprites use). It's very strange to mix + ; these, but my assumption is that by this point you've already got + ; your own graphics pipeline of some sort and probably aren't using + ; 2bpp graphics at all any more, so I'm sure you can figure out what'll + ; work best for you on your own :) + .byte %11111111 + .byte %00000000 + .byte %11111111 + .byte %00000000 + .byte %11111111 + .byte %00000000 + .byte %11100000 + .byte %00000000 + .byte %11100000 + .byte %00000000 + .byte %11100000 + .byte %00000000 + .byte %11100000 + .byte %00000000 + .byte %11100000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %11111111 + .byte %00000000 + .byte %11111111 + .byte %00000000 + .byte %11111111 + .byte %00000000 + .byte %00000111 + .byte %00000000 + .byte %00000111 + .byte %00000000 + .byte %00000111 + .byte %00000000 + .byte %00000111 + .byte %00000000 + .byte %00000111 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + + ; normally you would put 14 other 8x8 tiles here, but we don't have + ; any, so just fill it with zeros. + .repeat 14 * 32 + .byte 0 + .endrepeat + + .byte %11100000 + .byte %00000000 + .byte %11100000 + .byte %00000000 + .byte %11100000 + .byte %00000000 + .byte %11100000 + .byte %00000000 + .byte %11100000 + .byte %00000000 + .byte %11111111 + .byte %00000000 + .byte %11111111 + .byte %00000000 + .byte %11111111 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + + .byte %00000111 + .byte %00000000 + .byte %00000111 + .byte %00000000 + .byte %00000111 + .byte %00000000 + .byte %00000111 + .byte %00000000 + .byte %00000111 + .byte %00000000 + .byte %11111111 + .byte %00000000 + .byte %11111111 + .byte %00000000 + .byte %11111111 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 charset_end: diff --git a/homebrew-tutorial/main.asm b/homebrew-tutorial/main.asm index 810504e..edb6672 100644 --- a/homebrew-tutorial/main.asm +++ b/homebrew-tutorial/main.asm @@ -11,6 +11,12 @@ nmi_count: .res 2 +.segment "BSS" + +oam_lo_buffer: .res 512 +oam_hi_buffer: .res 32 +oam_buffer_end: + .segment "CODE" VRAM_CHARS = $0000 @@ -46,6 +52,16 @@ start: lda #$7c sta CGDATA + ; Set up sprite palette + lda #128 ;sprite palettes begin at cgdata index 128 + sta CGADD + stz CGDATA + stz CGDATA + + lda #$1f + sta CGDATA + stz CGDATA + ; Graphics mode 0, 8x8 tiles stz BGMODE @@ -115,13 +131,23 @@ start: sta VMDATAL stz VMDATAH - ; Show bg1 - lda #%00000001 + ; Show bg1 + sprites + lda #%00010001 sta TM lda #$0f sta INIDISP + lda #$0 + sta OBSEL + + ldx #0 +@zero_oam: + stz oam_lo_buffer, x + inx + cpx #(oam_buffer_end - oam_lo_buffer) + bne @zero_oam + lda #%10000001 sta NMITIMEN @@ -133,6 +159,35 @@ mainloop: cmp nmi_count beq nmi_check + ; set sprite 0 X position + ldx #$42 + stx oam_lo_buffer + + ; set sprite 0 Y position + ldx #$69 + stx oam_lo_buffer + 1 + ; Set sprite 0 to priority 3 and tile 0x01 + ldx #((%00110000 << 8) | $0001) + stx oam_lo_buffer + 2 + + ; Set sprite 0 to be large (16x16) + lda #%00000010 + sta oam_hi_buffer + + ; Copy OAM data via DMA + stz OAMADDL + lda #$0 + sta DMAP1 + lda #