X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=test.asm;h=da5f5ec5a91f6bf1f016b2da1c81b89710dca0fb;hb=6b4a9266e17c7fa3f54d0492c4a01b44fc5d3fe0;hp=991930826efb80d86cc555f01016c2df2e1a1871;hpb=4b093322cbd6142997aa4f5c34b63f4c68a4cfdb;p=snes_test1 diff --git a/test.asm b/test.asm index 9919308..da5f5ec 100644 --- a/test.asm +++ b/test.asm @@ -1,28 +1,36 @@ .p816 + .include "65816.inc" .include "hwregs.inc" .segment "rodata" .include "data.inc" + .include "sintab.inc" .segment "code" - vmem_tiles_offs = 4096 + ; VMEM map + ; 0000: tilemap for BG1 (32x32 4bpp: 512b) + ; 2048: BG3-base (h/v offsets) + ; 8192: tile data (16k) + vmem_tiles_offs = 4096 ; 4k words + vmem_hoffs_offs = 1024 ; 2k words + vmem_voffs_offs = vmem_hoffs_offs + 32 sei clc xce - rep #$10 - .i16 + I16 ldx #$1fff txs - sep #$10 - .i8 + I8 jsr snes_init + setreg REG_SETINI, $4 ; 239 lines setreg REG_BGMODE, $02 ; mode 2, 8x8 tiles - setreg REG_BG12NBA, $1 ; tiles at offs 4kb + setreg REG_BG12NBA, $1 ; tiles at offs 8kb setreg REG_TM, $1 ; main screen: BG1 + setreg REG_BG3SC, (vmem_hoffs_offs / 1024) << 2 ldx #0 cmap_loop: @@ -42,30 +50,105 @@ cmap_loop: pea logo4bpp_tiles pea vmem_tiles_offs jsr copy_vmem - rep #$20 - .a16 + A16 pla pla pla - sep #$20 - .a8 + A8 pea logo4bpp_tilemap_rows * logo4bpp_tilemap_cols * 2 pea logo4bpp_tilemap pea 0 jsr copy_vmem - rep #$20 - .a16 + A16 pla pla pla - sep #$20 - .a8 + A8 fblank 0 -halt: - jmp halt + ; main loop + nframe = 0 + ncol = 2 + anim = 4 + vscroll = 8 + shadow_voffs = 32 + + A16 + stz nframe +mainloop: + lda nframe + lsr + lsr + sta anim + inc nframe + A8 + + stz ncol +@cloop: + lda anim + clc + adc ncol + asl + tax + lda sintab,x + sec + sbc #128 + asr + asr + asr + + ldx ncol + bne @per_tile_offs + ; global scroll for the first column + ;sta REG_BG1VOFS + sta vscroll + ;stz REG_BG1VOFS + bra @end + +@per_tile_offs: + pha + lda ncol + asl + tax ; x = ncol << 1 + pla + ;sta REG_VMDATAL + ;lda #$20 ; enable for BG1 + ;sta REG_VMDATAH + sta shadow_voffs,x + inx + lda #$20 + sta shadow_voffs,x +@end: + inc ncol + lda ncol + and #$1f + bne @cloop + + ; wait for vblank, and DMA the table to vmem + wait_vblank + fblank 1 + lda vscroll + sta REG_BG1VOFS + stz REG_BG1VOFS + lda #(vmem_voffs_offs & $ff) + sta REG_VMADDL + lda #(vmem_voffs_offs >> 8) + sta REG_VMADDH + setreg REG_MDMAEN, 0 + setreg REG_DMAP(0), $01 ; A->B words at X,X+1, A inc + setreg REG_BBAD(0), REG_VMDATAL & $ff ; write to VMDATAL,VMDATAH + setreg REG_A1TL(0), shadow_voffs + setreg REG_A1TH(0), 0 + setreg REG_A1B(0), 0 + setreg REG_DASL(0), 64 + setreg REG_DASH(0), 0 + setreg REG_DASB(0), 0 + setreg REG_MDMAEN, 1 ; enable DMA channel 0 + fblank 0 + A16 + jmp mainloop ; copy_vmem(vmem_offset, src, num_words) copy_vmem: @@ -75,8 +158,7 @@ copy_vmem: phd ; save d tsc ; and make it point to the stack tcd - sep #$20 ; restore 8bit accum - .a8 + A8 ; restore 8bit accum ; stack frame ; $1 saved D ; $3 return address @@ -102,8 +184,7 @@ copy_vmem: bne @loop pld - sep #$10 ; back to 8bit index registers - .i8 + I8 ; back to 8bit index registers rts @@ -122,22 +203,22 @@ snes_init: stz REG_BG4SC stz REG_BG12NBA stz REG_BG34NBA - stz REG_BG1HOFFS - stz REG_BG1HOFFS - stz REG_BG1VOFFS - stz REG_BG1VOFFS - stz REG_BG2HOFFS - stz REG_BG2HOFFS - stz REG_BG2VOFFS - stz REG_BG2VOFFS - stz REG_BG3HOFFS - stz REG_BG3HOFFS - stz REG_BG3VOFFS - stz REG_BG3VOFFS - stz REG_BG4HOFFS - stz REG_BG4HOFFS - stz REG_BG4VOFFS - stz REG_BG4VOFFS + stz REG_BG1HOFS + stz REG_BG1HOFS + stz REG_BG1VOFS + stz REG_BG1VOFS + stz REG_BG2HOFS + stz REG_BG2HOFS + stz REG_BG2VOFS + stz REG_BG2VOFS + stz REG_BG3HOFS + stz REG_BG3HOFS + stz REG_BG3VOFS + stz REG_BG3VOFS + stz REG_BG4HOFS + stz REG_BG4HOFS + stz REG_BG4VOFS + stz REG_BG4VOFS setreg REG_VMAINC, $80 stz REG_VMADDL stz REG_VMADDH @@ -189,6 +270,16 @@ snes_init: stz REG_MDMAEN stz REG_HDMAEN stz REG_MEMSEL + + ; clear vmem + I16 + setreg REG_VMAINC, $80 + ldx $4000 +@clear: stz REG_VMDATAL + stz REG_VMDATAH + dex + bne @clear + I8 rts ; cartridge header