DMA version of the waving logo
[snes_test1] / test.asm
1         .p816
2         .include "65816.inc"
3         .include "hwregs.inc"
4
5         .segment "rodata"
6         .include "data.inc"
7         .include "sintab.inc"
8
9         .segment "code"
10
11         ; VMEM map
12         ; 0000: tilemap for BG1 (32x32 4bpp: 512b)
13         ; 2048: BG3-base (h/v offsets)
14         ; 8192: tile data (16k)
15         vmem_tiles_offs = 4096  ; 4k words
16         vmem_hoffs_offs = 1024  ; 2k words
17         vmem_voffs_offs = vmem_hoffs_offs + 32
18
19         sei
20         clc
21         xce
22
23         I16
24         ldx #$1fff
25         txs
26         I8
27
28         jsr snes_init
29         setreg REG_SETINI, $4   ; 239 lines
30         setreg REG_BGMODE, $02  ; mode 2, 8x8 tiles
31         setreg REG_BG12NBA, $1  ; tiles at offs 8kb
32         setreg REG_TM, $1       ; main screen: BG1
33         setreg REG_BG3SC, (vmem_hoffs_offs / 1024) << 2
34
35         ldx #0
36 cmap_loop:
37         txa
38         lsr
39         sta REG_CGADD
40         lda logo4bpp_cmap,x
41         inx
42         sta REG_CGDATA
43         lda logo4bpp_cmap,x
44         inx
45         sta REG_CGDATA
46         cpx #32         ; 16 entries 2 bytes each
47         bne cmap_loop
48
49         pea logo4bpp_tiles_width * logo4bpp_tiles_height / 2
50         pea logo4bpp_tiles
51         pea vmem_tiles_offs
52         jsr copy_vmem
53         A16
54         pla
55         pla
56         pla
57         A8
58
59         pea logo4bpp_tilemap_rows * logo4bpp_tilemap_cols * 2
60         pea logo4bpp_tilemap
61         pea 0
62         jsr copy_vmem
63         A16
64         pla
65         pla
66         pla
67         A8
68
69         fblank 0
70
71         ; main loop
72         nframe = 0
73         ncol = 2
74         anim = 4
75         vscroll = 8
76         shadow_voffs = 32
77
78         A16
79         stz nframe
80 mainloop:
81         lda nframe
82         lsr
83         lsr
84         sta anim
85         inc nframe
86         A8
87
88         stz ncol
89 @cloop:
90         lda anim
91         clc
92         adc ncol
93         asl
94         tax
95         lda sintab,x
96         sec
97         sbc #128
98         asr
99         asr
100         asr
101
102         ldx ncol
103         bne @per_tile_offs
104         ; global scroll for the first column
105         ;sta REG_BG1VOFS
106         sta vscroll
107         ;stz REG_BG1VOFS
108         bra @end
109
110 @per_tile_offs:
111         pha
112         lda ncol
113         asl
114         tax     ; x = ncol << 1
115         pla
116         ;sta REG_VMDATAL
117         ;lda #$20       ; enable for BG1
118         ;sta REG_VMDATAH
119         sta shadow_voffs,x
120         inx
121         lda #$20
122         sta shadow_voffs,x
123 @end:
124         inc ncol
125         lda ncol
126         and #$1f
127         bne @cloop
128
129         ; wait for vblank, and DMA the table to vmem
130         wait_vblank
131         fblank 1
132         lda vscroll
133         sta REG_BG1VOFS
134         stz REG_BG1VOFS
135         lda #(vmem_voffs_offs & $ff)
136         sta REG_VMADDL
137         lda #(vmem_voffs_offs >> 8)
138         sta REG_VMADDH
139         setreg REG_MDMAEN, 0
140         setreg REG_DMAP(0), $01                 ; A->B words at X,X+1, A inc
141         setreg REG_BBAD(0), REG_VMDATAL & $ff   ; write to VMDATAL,VMDATAH
142         setreg REG_A1TL(0), shadow_voffs
143         setreg REG_A1TH(0), 0
144         setreg REG_A1B(0), 0
145         setreg REG_DASL(0), 64
146         setreg REG_DASH(0), 0
147         setreg REG_DASB(0), 0
148         setreg REG_MDMAEN, 1                    ; enable DMA channel 0
149         fblank 0
150         A16
151         jmp mainloop
152
153         ; copy_vmem(vmem_offset, src, num_words)
154 copy_vmem:
155         rep #$30        ; 16bit accumulator and index registers
156         .a16
157         .i16
158         phd             ; save d
159         tsc             ; and make it point to the stack
160         tcd
161         A8      ; restore 8bit accum
162         ; stack frame
163         ; $1 saved D
164         ; $3 return address
165         ; $5 vmem_offs
166         ; $7 src
167         ; $9 num_words
168
169         lda #$80        ; auto incerment after wiriting high byte
170         sta REG_VMAINC
171         lda $5
172         sta REG_VMADDL
173         lda $6
174         sta REG_VMADDH
175         ldy #0
176 @loop:
177         lda ($7),y
178         sta REG_VMDATAL
179         iny
180         lda ($7),y
181         sta REG_VMDATAH
182         iny
183         cpy $9
184         bne @loop
185         
186         pld
187         I8              ; back to 8bit index registers
188         rts
189
190
191 snes_init:
192         fblank 1
193         stz REG_OBSEL
194         stz REG_OAMADDL
195         stz REG_OAMADDH
196         stz REG_OAMDATA
197         stz REG_OAMDATA
198         stz REG_BGMODE
199         stz REG_MOSAIC
200         stz REG_BG1SC
201         stz REG_BG2SC
202         stz REG_BG3SC
203         stz REG_BG4SC
204         stz REG_BG12NBA
205         stz REG_BG34NBA
206         stz REG_BG1HOFS
207         stz REG_BG1HOFS
208         stz REG_BG1VOFS
209         stz REG_BG1VOFS
210         stz REG_BG2HOFS
211         stz REG_BG2HOFS
212         stz REG_BG2VOFS
213         stz REG_BG2VOFS
214         stz REG_BG3HOFS
215         stz REG_BG3HOFS
216         stz REG_BG3VOFS
217         stz REG_BG3VOFS
218         stz REG_BG4HOFS
219         stz REG_BG4HOFS
220         stz REG_BG4VOFS
221         stz REG_BG4VOFS
222         setreg REG_VMAINC, $80
223         stz REG_VMADDL
224         stz REG_VMADDH
225         stz REG_VMDATAL
226         stz REG_VMDATAH
227         stz REG_M7SEL
228         stz REG_M7A
229         stz REG_M7A
230         stz REG_M7B
231         stz REG_M7B
232         stz REG_M7C
233         stz REG_M7C
234         stz REG_M7D
235         stz REG_M7D
236         stz REG_M7X
237         stz REG_M7X
238         stz REG_M7Y
239         stz REG_M7Y
240         stz REG_CGADD
241         stz REG_CGDATA
242         stz REG_CGDATA
243         stz REG_W12SEL
244         stz REG_W34SEL
245         stz REG_WH0
246         stz REG_WH1
247         stz REG_WH2
248         stz REG_WH3
249         stz REG_WBGLOG
250         stz REG_WOBJLOG
251         stz REG_TM
252         stz REG_TS
253         stz REG_TMW
254         stz REG_TSW
255         setreg REG_CGWSEL, $30
256         stz REG_CGADSUB
257         setreg REG_COLDATA, $e0
258         stz REG_SETINI
259         stz REG_NMITIMEN
260         setreg REG_WRIO, $ff
261         stz REG_WRMPYA
262         stz REG_WRMPYB
263         stz REG_WRDIVL
264         stz REG_WRDIVH
265         stz REG_WRDIVB
266         stz REG_HTIMEL
267         stz REG_HTIMEH
268         stz REG_VTIMEL
269         stz REG_VTIMEH
270         stz REG_MDMAEN
271         stz REG_HDMAEN
272         stz REG_MEMSEL
273
274         ; clear vmem
275         I16
276         setreg REG_VMAINC, $80
277         ldx $4000
278 @clear: stz REG_VMDATAL
279         stz REG_VMDATAH
280         dex
281         bne @clear
282         I8
283         rts
284
285         ; cartridge header
286         .segment "carthdr"
287         .byte "TEST                 "
288         .byte $20       ; fast ROM, LoROM mapping
289         .byte 0         ; ROM only
290         .byte 1         ; ROM banks 1 = 32k
291         .byte 0         ; RAM size
292         .byte 2         ; country europe/oceania/asia
293         .byte 0         ; developer id: none
294         .byte 0         ; ROM version
295         .word $ffff     ; checksum complement
296         .word 0         ; checksum
297         ; 65816 vectors
298         .word 0, 0
299         .word 0         ; cop
300         .word 0         ; brk
301         .word 0         ; abort
302         .word 0         ; NMI (vblank)
303         .word 0
304         .word 0         ; IRQ
305         ; 6502 vectors
306         .word 0, 0
307         .word 0         ; cop
308         .word 0
309         .word 0         ; abort
310         .word 0         ; NMI (vblank)
311         .word $8000     ; reset
312         .word 0         ; IRQ/BRK
313
314
315         ; vi:ft=asm_ca65: