fixed comment
[snes_test1] / test.asm
index eff673c..15d23a3 100644 (file)
--- a/test.asm
+++ b/test.asm
@@ -1,4 +1,5 @@
        .p816
+       .include "65816.inc"
        .include "hwregs.inc"
 
        .segment "rodata"
@@ -7,17 +8,8 @@
 
        .segment "code"
 
-       .macro A16
-       rep #$20
-       .a16
-       .endmacro
-       .macro A8
-       sep #$20
-       .a8
-       .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
        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
@@ -82,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
@@ -97,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
@@ -110,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
@@ -142,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
@@ -169,8 +181,7 @@ copy_vmem:
        bne @loop
        
        pld
-       sep #$10        ; back to 8bit index registers
-       .i8
+       I8              ; back to 8bit index registers
        rts
 
 
@@ -189,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
@@ -256,6 +267,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