SHOW:
|
|
- or go back to the newest paste.
1 | .inesprg 1 ; 1x 16KB PRG code | |
2 | .ineschr 1 ; 1x 8KB CHR data | |
3 | .inesmap 0 ; mapper 0 = NROM, no bank swapping | |
4 | .inesmir 1 ; background mirroring | |
5 | ||
6 | ||
7 | ;;;;;;;;;;;;;;; | |
8 | ||
9 | ||
10 | .bank 0 | |
11 | .org $C000 | |
12 | RESET: | |
13 | SEI ; disable IRQs | |
14 | CLD ; disable decimal mode | |
15 | LDX #$40 | |
16 | STX $4017 ; disable APU frame IRQ | |
17 | LDX #$FF | |
18 | TXS ; Set up stack | |
19 | INX ; now X = 0 | |
20 | STX $2000 ; disable NMI | |
21 | STX $2001 ; disable rendering | |
22 | STX $4010 ; disable DMC IRQs | |
23 | ||
24 | vblankwait1: ; First wait for vblank to make sure PPU is ready | |
25 | BIT $2002 | |
26 | BPL vblankwait1 | |
27 | ||
28 | clrmem: | |
29 | LDA #$00 | |
30 | STA $0000, x | |
31 | STA $0100, x | |
32 | STA $0300, x | |
33 | STA $0400, x | |
34 | STA $0500, x | |
35 | STA $0600, x | |
36 | STA $0700, x | |
37 | LDA #$FE | |
38 | STA $0200, x | |
39 | INX | |
40 | BNE clrmem | |
41 | ||
42 | vblankwait2: ; Second wait for vblank, PPU is ready after this | |
43 | BIT $2002 | |
44 | BPL vblankwait2 | |
45 | ||
46 | ||
47 | LoadPalettes: | |
48 | LDA $2002 ; read PPU status to reset the high/low latch | |
49 | LDA #$3F | |
50 | STA $2006 ; write the high byte of $3F00 address | |
51 | LDA #$00 | |
52 | STA $2006 ; write the low byte of $3F00 address | |
53 | LDX #$00 ; start out at 0 | |
54 | LoadPalettesLoop: | |
55 | LDA palette, x ; load data from address (palette + the value in x) | |
56 | ; 1st time through loop it will load palette+0 | |
57 | ; 2nd time through loop it will load palette+1 | |
58 | ; 3rd time through loop it will load palette+2 | |
59 | ; etc | |
60 | STA $2007 ; write to PPU | |
61 | INX ; X = X + 1 | |
62 | CPX #$20 ; Compare X to hex $10, decimal 16 - copying 16 bytes = 4 sprites | |
63 | BNE LoadPalettesLoop ; Branch to LoadPalettesLoop if compare was Not Equal to zero | |
64 | ; if compare was equal to 32, keep going down | |
65 | ||
66 | ||
67 | ||
68 | LoadSprites: | |
69 | LDX #$00 ; start at 0 | |
70 | LoadSpritesLoop: | |
71 | LDA sprites, x ; load data from address (sprites + x) | |
72 | STA $0200, x ; store into RAM address ($0200 + x) | |
73 | INX ; X = X + 1 | |
74 | CPX #$20 ; Compare X to hex $10, decimal 16 | |
75 | BNE LoadSpritesLoop ; Branch to LoadSpritesLoop if compare was Not Equal to zero | |
76 | ; if compare was equal to 16, keep going down | |
77 | ||
78 | ||
79 | ||
80 | LoadBackground: | |
81 | LDA $2002 ; read PPU status to reset the high/low latch | |
82 | LDA #$20 | |
83 | STA $2006 ; write the high byte of $2000 address | |
84 | LDA #$00 | |
85 | STA $2006 ; write the low byte of $2000 address | |
86 | LDX #$00 ; start out at 0 | |
87 | LoadBackgroundLoop: | |
88 | LDA background, x ; load data from address (background + the value in x) | |
89 | STA $2007 ; write to PPU | |
90 | INX ; X = X + 1 | |
91 | CPX #$FF ; Compare X to hex $80, decimal 128 - copying 128 bytes | |
92 | BNE LoadBackgroundLoop ; Branch to LoadBackgroundLoop if compare was Not Equal to zero | |
93 | ; if compare was equal to 128, keep going down | |
94 | ||
95 | ||
96 | LoadAttribute: | |
97 | LDA $2002 ; read PPU status to reset the high/low latch | |
98 | LDA #$23 | |
99 | STA $2006 ; write the high byte of $23C0 address | |
100 | LDA #$C0 | |
101 | STA $2006 ; write the low byte of $23C0 address | |
102 | LDX #$00 ; start out at 0 | |
103 | LoadAttributeLoop: | |
104 | LDA attribute, x ; load data from address (attribute + the value in x) | |
105 | STA $2007 ; write to PPU | |
106 | INX ; X = X + 1 | |
107 | CPX #$08 ; Compare X to hex $08, decimal 8 - copying 8 bytes | |
108 | BNE LoadAttributeLoop ; Branch to LoadAttributeLoop if compare was Not Equal to zero | |
109 | ; if compare was equal to 128, keep going down | |
110 | ||
111 | ||
112 | ||
113 | ||
114 | ||
115 | LDA #%10010000 ; enable NMI, sprites from Pattern Table 0, background from Pattern Table 1 | |
116 | STA $2000 | |
117 | ||
118 | LDA #%00011110 ; enable sprites, enable background, no clipping on left side | |
119 | STA $2001 | |
120 | ||
121 | Forever: | |
122 | JMP Forever ;jump back to Forever, infinite loop | |
123 | ||
124 | ||
125 | ||
126 | NMI: | |
127 | LDA #$00 | |
128 | STA $2003 ; set the low byte (00) of the RAM address | |
129 | LDA #$02 | |
130 | STA $4014 ; set the high byte (02) of the RAM address, start the transfer | |
131 | ||
132 | ||
133 | LatchController: | |
134 | LDA #$01 | |
135 | STA $4016 | |
136 | LDA #$00 | |
137 | STA $4016 ; tell both the controllers to latch buttons | |
138 | ||
139 | ButtonA: | |
140 | LDA $4016 ; player 1 - A | |
141 | AND #%00000001 ; look only at bit 0 | |
142 | BNE ButtonB | |
143 | ||
144 | ; Button stuff here | |
145 | ||
146 | ButtonB: | |
147 | LDA $4016 ; player 1 - B | |
148 | AND #%00000001 ; look only at bit 0 | |
149 | BNE SelectButton | |
150 | - | .db $98, $31, $00, $88 ;sprite 7 |
150 | + | |
151 | ; Button stuff here | |
152 | ||
153 | SelectButton: | |
154 | LDA $4016 ; player 1 - Select | |
155 | AND #%00000001 ; look only at bit 0 | |
156 | BNE StartButton | |
157 | ||
158 | ; Button stuff here | |
159 | ||
160 | StartButton: | |
161 | LDA $4016 ; player 1 - Start | |
162 | AND #%00000001 ; look only at bit 0 | |
163 | BNE UpButton | |
164 | ||
165 | ; Button stuff here | |
166 | ||
167 | UpButton: | |
168 | LDA $4016 ; player 1 - Up | |
169 | AND #%00000001 ; look only at bit 0 | |
170 | BNE DownButton | |
171 | ||
172 | ; Button stuff here | |
173 | ||
174 | DownButton: | |
175 | LDA $4016 ; player 1 - Down | |
176 | AND #%00000001 ; look only at bit 0 | |
177 | BNE LeftButton | |
178 | ||
179 | ; Button stuff here | |
180 | ||
181 | LeftButton: | |
182 | LDA $4016 ; player 1 - Left | |
183 | AND #%00000001 ; look only at bit 0 | |
184 | BNE RightButton | |
185 | LDA $0203 ; load sprite X position | |
186 | CLC ; make sure the carry flag is clear | |
187 | ADC #$01 ; A = A + 1 | |
188 | STA $0203 ; save sprite X position | |
189 | LDA $0207 ; load sprite X position | |
190 | CLC ; make sure the carry flag is clear | |
191 | ADC #$01 ; A = A + 1 | |
192 | STA $0207 ; save sprite X position | |
193 | LDA $020B ; load sprite X position | |
194 | CLC ; make sure the carry flag is clear | |
195 | ADC #$01 ; A = A + 1 | |
196 | STA $020B ; save sprite X position | |
197 | LDA $020F ; load sprite X position | |
198 | CLC ; make sure the carry flag is clear | |
199 | ADC #$01 ; A = A + 1 | |
200 | STA $020F ; save sprite X position | |
201 | LDA $0213 | |
202 | CLC | |
203 | ADC #$01 | |
204 | STA $0213 | |
205 | LDA $0217 | |
206 | CLC | |
207 | ADC #$01 | |
208 | STA $0217 | |
209 | LDA $021B | |
210 | CLC | |
211 | ADC #$01 | |
212 | STA $021B | |
213 | LDA $021F | |
214 | CLC | |
215 | ADC #$01 | |
216 | STA $021F | |
217 | ||
218 | RightButton: | |
219 | LDA $4016 ; player 1 - Right | |
220 | AND #%00000001 ; look only at bit 0 | |
221 | BNE NotRightButton | |
222 | LDA $0203 ; load sprite X position | |
223 | SEC ; make sure carry flag is set | |
224 | SBC #$01 ; A = A - 1 | |
225 | STA $0203 ; save sprite X position | |
226 | LDA $0207 ; load sprite X position | |
227 | SEC ; make sure carry flag is set | |
228 | SBC #$01 ; A = A - 1 | |
229 | STA $0207 ; save sprite X position | |
230 | LDA $020B ; load sprite X position | |
231 | SEC ; make sure carry flag is set | |
232 | SBC #$01 ; A = A - 1 | |
233 | STA $020B ; save sprite X position | |
234 | LDA $020F ; load sprite X position | |
235 | SEC ; make sure carry flag is set | |
236 | SBC #$01 ; A = A - 1 | |
237 | STA $020F ; save sprite X position | |
238 | LDA $0213 | |
239 | CLC | |
240 | ADC #$01 | |
241 | STA $0213 | |
242 | LDA $0217 | |
243 | CLC | |
244 | ADC #$01 | |
245 | STA $0217 | |
246 | LDA $021B | |
247 | CLC | |
248 | ADC #$01 | |
249 | STA $021B | |
250 | LDA $021F | |
251 | CLC | |
252 | ADC #$01 | |
253 | STA $021F | |
254 | ||
255 | NotRightButton: | |
256 | JMP ButtonA | |
257 | ||
258 | RTI ; return from interrupt | |
259 | ||
260 | ;;;;;;;;;;;;;; | |
261 | ||
262 | ||
263 | ;;;;;;;;;;;;;; | |
264 | ||
265 | ||
266 | ||
267 | .bank 1 | |
268 | .org $E000 | |
269 | palette: | |
270 | .db $22,$0F,$27,$26, $22,$0F,$16,$26, $22,$30,$21,$0F, $22,$27,$17,$0F ;;background palette | |
271 | .db $22,$0F,$27,$1A, $22,$0F,$27,$26, $22,$1C,$15,$14, $22,$02,$38,$3C ;;sprite palette | |
272 | ||
273 | sprites: | |
274 | ;vert tile attr horiz | |
275 | .db $80, $00, $00, $80 ;sprite 0 | |
276 | .db $80, $01, $00, $88 ;sprite 1 | |
277 | .db $88, $10, $00, $80 ;sprite 2 | |
278 | .db $88, $11, $00, $88 ;sprite 3 | |
279 | .db $90, $20, $00, $80 ;sprite 4 | |
280 | .db $90, $21, $00, $88 ;sprite 5 | |
281 | .db $98, $30, $00, $80 ;sprite 6 | |
282 | .db $98, $31, $00, $88 ;sprite 7 | |
283 | ||
284 | ||
285 | background: | |
286 | .db $24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24 ;;row 1 | |
287 | .db $24,$24,$24,$24,$24,$24,$24,$24,$08,$09,$0A,$0B,$24,$24,$24,$24 ;;first tile of sun | |
288 | ||
289 | .db $24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24 ;;row 2 | |
290 | .db $24,$24,$24,$24,$24,$24,$24,$24,$18,$19,$1A,$1B,$24,$24,$24,$24 ;;second tile of sun | |
291 | ||
292 | .db $24,$24,$24,$24,$24,$24,$01,$02,$01,$02,$24,$24,$01,$02,$01,$02 ;;row 3 | |
293 | .db $24,$24,$01,$02,$01,$02,$24,$24,$28,$29,$2A,$2B,$24,$24,$24,$24 ;;third tile of sun with first tile of block | |
294 | ||
295 | .db $24,$24,$24,$24,$24,$24,$11,$12,$11,$12,$24,$24,$11,$12,$11,$12 ;;row 4 | |
296 | .db $24,$24,$11,$12,$11,$12,$24,$24,$38,$39,$3A,$3B,$24,$24,$24,$24 ;;forth and last tile of sun with the second and last tile of block | |
297 | ||
298 | .db $24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24 ;;row 5 | |
299 | .db $24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24 ;;all sky | |
300 | ||
301 | .db $24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24 ;;row 6 | |
302 | .db $24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24 ;;all sky | |
303 | ||
304 | .db $24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24 ;;row 7 | |
305 | .db $24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24 ;;all sky | |
306 | ||
307 | .db $24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24 ;;row 8 | |
308 | .db $24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24 ;;all sky | |
309 | ||
310 | attribute: | |
311 | .db %00000000, %00010000, %01010000, %00010000, %00000000, %00000000, %00000000, %00110000 | |
312 | ||
313 | .db $24,$24,$24,$24, $47,$47,$24,$24 ,$47,$47,$47,$47, $47,$47,$24,$24 ,$24,$24,$24,$24 ,$24,$24,$24,$24, $24,$24,$24,$24, $55,$56,$24,$24 ;;brick bottoms | |
314 | ||
315 | ||
316 | ||
317 | .org $FFFA ;first of the three vectors starts here | |
318 | .dw NMI ;when an NMI happens (once per frame if enabled) the | |
319 | ;processor will jump to the label NMI: | |
320 | .dw RESET ;when the processor first turns on or is reset, it will jump | |
321 | ;to the label RESET: | |
322 | .dw 0 ;external interrupt IRQ is not used in this tutorial | |
323 | ||
324 | ||
325 | ;;;;;;;;;;;;;; | |
326 | ||
327 | ||
328 | .bank 2 | |
329 | .org $0000 | |
330 | .incbin "eddinlevel.chr" ;includes 8KB graphics file from SMB1 |