junglejourney

view romloader.oph @ 217:59f37c9e74e4

Finished ROM loader and main code programs.
author David Boddie <david@boddie.org.uk>
date Sun Oct 16 21:36:30 2011 +0200
parents cdceac4f5ea8
children 958f6c30e575
line source
1 ; Copyright (C) 2011 David Boddie <david@boddie.org.uk>
2 ;
3 ; This program is free software: you can redistribute it and/or modify
4 ; it under the terms of the GNU General Public License as published by
5 ; the Free Software Foundation, either version 3 of the License, or
6 ; (at your option) any later version.
7 ;
8 ; This program is distributed in the hope that it will be useful,
9 ; but WITHOUT ANY WARRANTY; without even the implied warranty of
10 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 ; GNU General Public License for more details.
12 ;
13 ; You should have received a copy of the GNU General Public License
14 ; along with this program. If not, see <http://www.gnu.org/licenses/>.
16 .org $8000
17 rom_start:
18 jmp language_entry
19 jmp service_entry
21 ; ROM type
22 .byte $c2 ; 6502 code (2), language ($40), service ($80)
24 copyright_offset:
25 .byte [copyright_string - rom_start - 1]
27 ; Version
28 .byte 1
30 ; Title string
31 .byte "Jungle Journey (loader)", 0
33 ; Version string
34 .byte "1.0", 0
36 copyright_string:
37 .byte "(C) 2011 David Boddie", 0
39 ; Second processor relocation address
40 .byte 0, $80, 0, 0
42 language_entry:
44 jmp jungle_code
46 service_entry:
48 cmp #4
49 beq service_command
51 service_entry_exit:
52 rts
54 rom_name: .byte "JUNGLE", 13
56 service_command:
58 tya ; push Y and X registers onto the stack
59 pha
60 txa
61 pha
63 ldx #0
64 service_command_loop:
66 lda ($f2),y
67 cmp rom_name,x
68 bne service_command_exit
69 inx
70 iny
71 cpx #7
72 bne service_command_loop
74 jsr jungle_code
75 lda #0
76 rts
78 service_command_exit:
79 pla ; pop Y and X registers off the stack
80 tax
81 pla
82 tay
83 lda #4 ; restore A
84 rts
86 jungle_code:
88 lda #22 ; MODE 5
89 jsr $ffee
90 lda #5
91 jsr $ffee
93 lda #23 ; disable flashing cursor
94 jsr $ffee
95 lda #1
96 jsr $ffee
97 ldx #7
98 cursor_loop:
99 lda #0
100 jsr $ffee
101 dex
102 bpl cursor_loop
104 jsr set_hidden_palette
106 ; Define ENVELOPEs.
107 lda #0
108 sta $70
109 define_envelopes_loop:
111 ldx $70
112 lda envelopes_high,x
113 tay
114 lda envelopes_low,x
115 tax
116 lda #8
117 jsr $fff1
119 inc $70
120 lda $70
121 cmp #4
122 bne define_envelopes_loop
124 jsr copy_title_from_rom
126 lda #140
127 jsr $fff4 ; *TAPE
129 jsr copy_title_down
131 ldx #0
132 show_input_message_loop:
134 lda input_message,x
135 jsr $ffee
136 inx
137 cpx #21
138 bne show_input_message_loop
140 wait_loop:
142 lda #128
143 ldx #0
144 jsr $fff4
145 cpx #0 ; fire button pressed?
146 beq wait_no_joystick
147 jmp continue
149 wait_no_joystick:
151 lda #129 ; returns y=255 or 0
152 ldx #157 ; SPACE
153 ldy #255
154 jsr $fff4
155 cpy #255
156 bne wait_loop
158 continue:
159 clc
161 jsr move_completed_screen_down
162 jsr copy_sprites_from_rom
163 jsr copy_chars_from_rom
164 jsr copy_launch_code
166 jmp $1e00
168 input_message: .byte 17,3, 31,2,28, "Press SPACE/FIRE"
170 set_hidden_palette:
172 lda #1
173 sta $70
174 lda #0
175 sta $71
176 jsr set_palette
178 ; Run on into the next routine.
180 set_core_palette:
182 lda #2
183 sta $70
184 lda #2
185 sta $71
186 jsr set_palette
188 lda #3
189 sta $70
190 lda #3
191 sta $71
192 jsr set_palette
194 rts
196 set_palette:
197 ; $70=logical colour
198 ; $71=physical colour
199 lda $70
200 sta $3dfb
201 lda $71
202 sta $3dfc
203 lda #0
204 sta $3dfd
205 sta $3dfe
206 sta $3dff
208 lda #$c
209 ldx #$fb
210 ldy #$3d
211 jsr $fff1
212 rts
214 envelopes_low: .byte <explosion_envelope, <damage_envelope, <item_envelope, <key_envelope
215 envelopes_high: .byte >explosion_envelope, >damage_envelope, >item_envelope, >key_envelope
217 explosion_envelope: .byte 1,1,252,0,0,10,0,0,126,0,0,130,126,126
218 damage_envelope: .byte 2,4,8,0,248,2,0,2,126,0,0,130,126,126
219 item_envelope: .byte 3,2,8,4,2,10,10,10,126,0,0,130,126,126
220 key_envelope: .byte 4,2,4,40,0,8,1,3,126,0,0,130,126,126
222 copy_title_from_rom:
224 lda #$00
225 sta $70
226 lda #$84
227 sta $71
229 lda #$a0
230 sta $72
231 lda #$5a
232 sta $73
234 ldx #$17
236 copy_title_from_rom_loop1:
238 ldy #0
239 copy_title_from_rom_loop2:
241 lda ($70),y
242 sta ($72),y
243 iny
244 cpy #0
245 bne copy_title_from_rom_loop2
247 clc
248 lda $72
249 adc #$40
250 sta $72
251 lda $73
252 adc #$01
253 sta $73
254 clc
256 lda $71
257 adc #$01
258 sta $71
260 dex
261 bpl copy_title_from_rom_loop1
263 clc
264 rts
266 copy_title_down:
268 lda #$a0
269 sta $70
270 lda #$5a
271 sta $71
273 lda #$00
274 sta $72
275 lda #$18
276 sta $73
278 ldx #$05
280 copy_title_down_loop1:
282 ldy #0
283 copy_title_down_loop2:
285 lda ($70),y
286 sta ($72),y
287 iny
288 cpy #0
289 bne copy_title_down_loop2
291 clc
292 lda $70
293 adc #$40
294 sta $70
295 lda $71
296 adc #$01
297 sta $71
298 clc
300 lda $73
301 adc #$01
302 sta $73
304 dex
305 bpl copy_title_down_loop1
307 clc
308 rts
310 move_completed_screen_down:
312 lda #$20
313 sta $70
314 lda #$62
315 sta $71
317 lda #$00
318 sta $72
319 lda #$0f
320 sta $73
322 ldx #128
324 move_completed_screen_loop:
326 ldy #1
327 lda ($70),y
328 and #$0f
329 asl
330 asl
331 asl
332 asl
333 sta $80
334 dey
335 lda ($70),y
336 and #$0f
337 ora $80
338 sta ($72),y
340 lda #0
341 sta ($70),y
342 iny
343 sta ($70),y
345 clc
346 lda $70
347 adc #2
348 sta $70
349 lda $71
350 adc #0
351 sta $71
352 clc
354 lda $72
355 adc #1
356 sta $72
357 lda $73
358 adc #0
359 sta $73
360 clc
362 dex
363 cpx #0
364 bne move_completed_screen_next
366 ldx #128
368 clc
369 lda $70
370 adc #$40
371 sta $70
372 lda $71
373 adc #$00
374 sta $71
375 clc
377 move_completed_screen_next:
378 clc
380 lda $72
381 cmp #$00
382 bne move_completed_screen_loop
384 lda $73
385 cmp #$18
386 bne move_completed_screen_loop
388 clc
389 rts
391 copy_sprites_from_rom:
393 lda #$80
394 sta $70
395 lda #$ae
396 sta $71
398 lda #$00
399 sta $72
400 lda #$54
401 sta $73
403 ldx #$35
405 copy_sprites_from_rom_loop1:
407 ldy #0
408 copy_sprites_from_rom_loop2:
410 lda ($70),y
411 sta ($72),y
412 iny
413 cpy #16
414 bne copy_sprites_from_rom_loop2
416 clc
417 lda $70
418 adc #$10
419 sta $70
420 lda $71
421 adc #$00
422 sta $71
423 clc
425 lda $72
426 adc #$10
427 sta $72
428 lda $73
429 adc #$00
430 sta $73
431 clc
433 dex
434 bpl copy_sprites_from_rom_loop1
436 clc
437 rts
439 copy_chars_from_rom:
441 lda #$00
442 sta $70
443 lda #$9c
444 sta $71
446 lda #$00
447 sta $72
448 lda #$3f
449 sta $73
451 copy_chars_from_rom_loop1:
453 ldy #0
454 copy_chars_from_rom_loop2:
456 lda ($70),y
457 sta ($72),y
458 iny
459 cpy #$80
460 bne copy_chars_from_rom_loop2
462 clc
463 lda $70
464 adc #$80
465 sta $70
466 lda $71
467 adc #$00
468 sta $71
469 clc
471 lda $72
472 adc #$80
473 sta $72
474 lda $73
475 adc #$00
476 sta $73
477 clc
479 cmp #$51
480 bne copy_chars_from_rom_loop1
481 lda $72
482 cmp #$80
483 bne copy_chars_from_rom_loop1
485 clc
486 rts
488 launch_code:
490 ldx #[start_game - launch_code]
491 ldy #$1e
492 jsr $fff7
494 start_game: .byte "*JUNGLECODE", 13, 0
496 copy_launch_code: ; copy the launch code to $1e00
498 lda #<launch_code
499 sta $70
500 lda #>launch_code
501 sta $71
503 lda #$00
504 sta $72
505 lda #$1e
506 sta $73
508 ldy #[copy_launch_code - launch_code - 1]
510 copy_launch_code_loop:
512 lda ($70),y
513 sta ($72),y
514 dey
515 bpl copy_launch_code_loop
517 clc
518 rts