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