X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=snes_test1;a=blobdiff_plain;f=test.asm;h=15d23a3c0d0adcb3a92987a7b737303ba350787e;hp=4c51874f0642156d0f756809b7c5a97d62463c97;hb=HEAD;hpb=d056c4cbe305565a50a4ee9d60906d78fb119b4d diff --git a/test.asm b/test.asm index 4c51874..15d23a3 100644 --- a/test.asm +++ b/test.asm @@ -1,4 +1,5 @@ .p816 + .include "65816.inc" .include "hwregs.inc" .segment "rodata" @@ -7,25 +8,8 @@ .segment "code" - .macro A16 - rep #$20 - .a16 - .endmacro - .macro A8 - sep #$20 - .a8 - .endmacro - .macro I16 - rep #$10 - .i16 - .endmacro - .macro I8 - sep #$10 - .i8 - .endmacro - ; VMEM map - ; 0000: tilemap for BG1 (32x32 4bpp: 512b) + ; 0000: tilemap for BG1 (32x32 word tile refs, 2kb) ; 2048: BG3-base (h/v offsets) ; 8192: tile data (16k) vmem_tiles_offs = 4096 ; 4k words @@ -33,15 +17,15 @@ vmem_voffs_offs = vmem_hoffs_offs + 32 sei + ; get out of 6502 emulation mode clc xce - rep #$10 - .i16 + ; initialize stack + I16 ldx #$1fff txs - sep #$10 - .i8 + I8 jsr snes_init setreg REG_SETINI, $4 ; 239 lines @@ -90,14 +74,12 @@ cmap_loop: nframe = 0 ncol = 2 anim = 4 + vscroll = 8 + shadow_voffs = 32 A16 stz nframe - A8 mainloop: - wait_vblank - - A16 lda nframe lsr lsr @@ -105,11 +87,6 @@ mainloop: inc nframe A8 - lda #(vmem_voffs_offs & $ff) - sta REG_VMADDL - lda #(vmem_voffs_offs >> 8) - sta REG_VMADDH - stz ncol @cloop: lda anim @@ -118,31 +95,59 @@ mainloop: asl tax lda sintab,x - lsr - lsr - lsr + sec + sbc #128 + asr + asr + asr ldx ncol bne @per_tile_offs ; global scroll for the first column - sta REG_BG1VOFFS - stz REG_BG1VOFFS + sta vscroll bra @end @per_tile_offs: - sta REG_VMDATAL - lda #$20 ; enable for BG1 - sta REG_VMDATAH + pha + lda ncol + asl + tax ; x = ncol << 1 + pla + sta shadow_voffs,x + inx + lda #$20 + sta shadow_voffs,x @end: - inc ncol lda ncol and #$1f bne @cloop - bra mainloop + ; 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(vmem_offset, src, num_bytes) copy_vmem: rep #$30 ; 16bit accumulator and index registers .a16 @@ -150,14 +155,13 @@ 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 ; $5 vmem_offs ; $7 src - ; $9 num_words + ; $9 num_bytes lda #$80 ; auto incerment after wiriting high byte sta REG_VMAINC @@ -177,8 +181,7 @@ copy_vmem: bne @loop pld - sep #$10 ; back to 8bit index registers - .i8 + I8 ; back to 8bit index registers rts @@ -197,22 +200,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