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