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