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