SNES first test
[snes_test1] / test.asm
1         .p816
2         .include "hwregs.inc"
3
4         .segment "rodata"
5         .include "data.inc"
6
7         .segment "code"
8
9         vmem_tiles_offs = 4096
10
11         sei
12         clc
13         xce
14
15         rep #$10
16         .i16
17         ldx #$1fff
18         txs
19         sep #$10
20         .i8
21
22         jsr snes_init
23         setreg REG_BGMODE, $02  ; mode 2, 8x8 tiles
24         setreg REG_BG12NBA, $1  ; tiles at offs 4kb
25         setreg REG_TM, $1       ; main screen: BG1
26
27         ldx #0
28 cmap_loop:
29         txa
30         lsr
31         sta REG_CGADD
32         lda logo4bpp_cmap,x
33         inx
34         sta REG_CGDATA
35         lda logo4bpp_cmap,x
36         inx
37         sta REG_CGDATA
38         cpx #32         ; 16 entries 2 bytes each
39         bne cmap_loop
40
41         pea logo4bpp_tiles_width * logo4bpp_tiles_height / 2
42         pea logo4bpp_tiles
43         pea vmem_tiles_offs
44         jsr copy_vmem
45         rep #$20
46         .a16
47         pla
48         pla
49         pla
50         sep #$20
51         .a8
52
53         pea logo4bpp_tilemap_rows * logo4bpp_tilemap_cols * 2
54         pea logo4bpp_tilemap
55         pea 0
56         jsr copy_vmem
57         rep #$20
58         .a16
59         pla
60         pla
61         pla
62         sep #$20
63         .a8
64
65         fblank 0
66
67 halt:
68         jmp halt
69
70         ; copy_vmem(vmem_offset, src, num_words)
71 copy_vmem:
72         rep #$30        ; 16bit accumulator and index registers
73         .a16
74         .i16
75         phd             ; save d
76         tsc             ; and make it point to the stack
77         tcd
78         sep #$20        ; restore 8bit accum
79         .a8
80         ; stack frame
81         ; $1 saved D
82         ; $3 return address
83         ; $5 vmem_offs
84         ; $7 src
85         ; $9 num_words
86
87         lda #$80        ; auto incerment after wiriting high byte
88         sta REG_VMAINC
89         lda $5
90         sta REG_VMADDL
91         lda $6
92         sta REG_VMADDH
93         ldy #0
94 @loop:
95         lda ($7),y
96         sta REG_VMDATAL
97         iny
98         lda ($7),y
99         sta REG_VMDATAH
100         iny
101         cpy $9
102         bne @loop
103         
104         pld
105         sep #$10        ; back to 8bit index registers
106         .i8
107         rts
108
109
110 snes_init:
111         fblank 1
112         stz REG_OBSEL
113         stz REG_OAMADDL
114         stz REG_OAMADDH
115         stz REG_OAMDATA
116         stz REG_OAMDATA
117         stz REG_BGMODE
118         stz REG_MOSAIC
119         stz REG_BG1SC
120         stz REG_BG2SC
121         stz REG_BG3SC
122         stz REG_BG4SC
123         stz REG_BG12NBA
124         stz REG_BG34NBA
125         stz REG_BG1HOFFS
126         stz REG_BG1HOFFS
127         stz REG_BG1VOFFS
128         stz REG_BG1VOFFS
129         stz REG_BG2HOFFS
130         stz REG_BG2HOFFS
131         stz REG_BG2VOFFS
132         stz REG_BG2VOFFS
133         stz REG_BG3HOFFS
134         stz REG_BG3HOFFS
135         stz REG_BG3VOFFS
136         stz REG_BG3VOFFS
137         stz REG_BG4HOFFS
138         stz REG_BG4HOFFS
139         stz REG_BG4VOFFS
140         stz REG_BG4VOFFS
141         setreg REG_VMAINC, $80
142         stz REG_VMADDL
143         stz REG_VMADDH
144         stz REG_VMDATAL
145         stz REG_VMDATAH
146         stz REG_M7SEL
147         stz REG_M7A
148         stz REG_M7A
149         stz REG_M7B
150         stz REG_M7B
151         stz REG_M7C
152         stz REG_M7C
153         stz REG_M7D
154         stz REG_M7D
155         stz REG_M7X
156         stz REG_M7X
157         stz REG_M7Y
158         stz REG_M7Y
159         stz REG_CGADD
160         stz REG_CGDATA
161         stz REG_CGDATA
162         stz REG_W12SEL
163         stz REG_W34SEL
164         stz REG_WH0
165         stz REG_WH1
166         stz REG_WH2
167         stz REG_WH3
168         stz REG_WBGLOG
169         stz REG_WOBJLOG
170         stz REG_TM
171         stz REG_TS
172         stz REG_TMW
173         stz REG_TSW
174         setreg REG_CGWSEL, $30
175         stz REG_CGADSUB
176         setreg REG_COLDATA, $e0
177         stz REG_SETINI
178         stz REG_NMITIMEN
179         setreg REG_WRIO, $ff
180         stz REG_WRMPYA
181         stz REG_WRMPYB
182         stz REG_WRDIVL
183         stz REG_WRDIVH
184         stz REG_WRDIVB
185         stz REG_HTIMEL
186         stz REG_HTIMEH
187         stz REG_VTIMEL
188         stz REG_VTIMEH
189         stz REG_MDMAEN
190         stz REG_HDMAEN
191         stz REG_MEMSEL
192         rts
193
194         ; cartridge header
195         .segment "carthdr"
196         .byte "TEST                 "
197         .byte $20       ; fast ROM, LoROM mapping
198         .byte 0         ; ROM only
199         .byte 1         ; ROM banks 1 = 32k
200         .byte 0         ; RAM size
201         .byte 2         ; country europe/oceania/asia
202         .byte 0         ; developer id: none
203         .byte 0         ; ROM version
204         .word $ffff     ; checksum complement
205         .word 0         ; checksum
206         ; 65816 vectors
207         .word 0, 0
208         .word 0         ; cop
209         .word 0         ; brk
210         .word 0         ; abort
211         .word 0         ; NMI (vblank)
212         .word 0
213         .word 0         ; IRQ
214         ; 6502 vectors
215         .word 0, 0
216         .word 0         ; cop
217         .word 0
218         .word 0         ; abort
219         .word 0         ; NMI (vblank)
220         .word $8000     ; reset
221         .word 0         ; IRQ/BRK
222
223
224         ; vi:ft=asm_ca65: