.p816
+ .include "65816.inc"
.include "hwregs.inc"
.segment "rodata"
.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
nframe = 0
ncol = 2
anim = 4
+ vscroll = 8
+ shadow_voffs = 32
A16
stz nframe
- A8
mainloop:
- wait_vblank
-
- A16
lda nframe
lsr
lsr
inc nframe
A8
- lda #(vmem_voffs_offs & $ff)
- sta REG_VMADDL
- lda #(vmem_voffs_offs >> 8)
- sta REG_VMADDH
-
stz ncol
@cloop:
lda anim
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
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
bne @loop
pld
- sep #$10 ; back to 8bit index registers
- .i8
+ I8 ; back to 8bit index registers
rts
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
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