mirror of
https://github.com/deater/dos33fsprogs.git
synced 2024-11-18 21:06:31 +00:00
1451 lines
21 KiB
ArmAsm
1451 lines
21 KiB
ArmAsm
; Uses the 40x48d page1/page2 every-1-scanline pageflip mode
|
|
|
|
; self modifying code to get some extra colors (pseudo 40x192 mode)
|
|
|
|
; by deater (Vince Weaver) <vince@deater.net>
|
|
|
|
|
|
; TODO:
|
|
; end level after a certain number of points
|
|
; track score properly
|
|
|
|
|
|
level3_earth:
|
|
|
|
;===================
|
|
; init screen
|
|
jsr TEXT
|
|
jsr HOME
|
|
bit KEYRESET
|
|
|
|
;===================
|
|
; init vars
|
|
|
|
lda #0
|
|
sta DRAW_PAGE
|
|
sta WHICH
|
|
sta ZERO
|
|
sta YADD
|
|
sta LEVEL_DONE
|
|
sta FIRE_X
|
|
sta ASTEROID_SUBX
|
|
sta ASTEROID_EXPLODE
|
|
sta GAME_OVER
|
|
sta FIRE
|
|
sta BLAST1
|
|
sta BLAST2
|
|
sta SPRITE_XPOS
|
|
sta SPRITE_YPOS
|
|
sta FIRE_Y
|
|
|
|
lda #$44
|
|
sta GREEN0
|
|
sta GREEN4
|
|
lda #$cc
|
|
sta GREEN1
|
|
sta GREEN3
|
|
lda #$ff
|
|
sta GREEN2
|
|
|
|
lda #36
|
|
sta ASTEROID_X
|
|
|
|
lda #12
|
|
sta ASTEROID_Y
|
|
|
|
lda #64
|
|
sta YPOS
|
|
|
|
lda #1
|
|
sta ASTEROID_SPEED
|
|
sta XPOS
|
|
|
|
;=============================
|
|
; Load graphic page0
|
|
|
|
lda #$0c
|
|
sta BASH
|
|
lda #$00
|
|
sta BASL ; load image to $c00
|
|
|
|
lda WHICH
|
|
asl
|
|
asl ; which*4
|
|
tay
|
|
|
|
lda pictures,Y
|
|
sta GBASL
|
|
lda pictures+1,Y
|
|
sta GBASH
|
|
jsr load_rle_gr
|
|
|
|
lda #4
|
|
sta DRAW_PAGE
|
|
|
|
jsr gr_copy_to_current ; copy to page1
|
|
|
|
; GR part
|
|
bit PAGE1
|
|
bit LORES ; 4
|
|
bit SET_GR ; 4
|
|
bit FULLGR ; 4
|
|
|
|
;=============================
|
|
; Load graphic page1
|
|
|
|
lda #$0c
|
|
sta BASH
|
|
lda #$00
|
|
sta BASL ; load image to $c00
|
|
|
|
lda WHICH
|
|
asl
|
|
asl ; which*4
|
|
tay
|
|
|
|
lda pictures+2,Y
|
|
sta GBASL
|
|
lda pictures+3,Y
|
|
sta GBASH
|
|
jsr load_rle_gr
|
|
|
|
lda #0
|
|
sta DRAW_PAGE
|
|
|
|
jsr gr_copy_to_current
|
|
|
|
lda #8
|
|
sta DRAW_PAGE
|
|
|
|
lda #<score_text2
|
|
sta OUTL
|
|
lda #>score_text2
|
|
sta OUTH
|
|
|
|
jsr move_and_print
|
|
|
|
|
|
; ; GR part
|
|
bit PAGE0
|
|
|
|
;==============================
|
|
; setup graphics for vapor lock
|
|
;==============================
|
|
|
|
jsr vapor_lock
|
|
|
|
; vapor lock returns with us at beginning of hsync in line
|
|
; 114 (7410 cycles), so with 5070 lines to go
|
|
|
|
; GR part
|
|
bit LORES ; 4
|
|
bit SET_GR ; 4
|
|
bit FULLGR ; 4
|
|
|
|
jsr gr_copy_to_current ; 6+ 9292
|
|
|
|
; 5070 + 4550 = 9620
|
|
; 9292
|
|
; 12
|
|
; 6
|
|
; ====
|
|
; 310
|
|
|
|
; - 3 for jmp
|
|
; 307
|
|
|
|
; Try X=9 Y=6 cycles=307
|
|
|
|
ldy #6 ; 2
|
|
loopQ: ldx #9 ; 2
|
|
loopR: dex ; 2
|
|
bne loopR ; 2nt/3
|
|
dey ; 2
|
|
bne loopQ ; 2nt/3
|
|
|
|
jmp sprites_display_loop ; 3
|
|
|
|
.align $100
|
|
|
|
;================================================
|
|
; Display Loop
|
|
;================================================
|
|
; each scan line 65 cycles
|
|
; 1 cycle each byte (40cycles) + 25 for horizontal
|
|
; Total of 12480 cycles to draw screen
|
|
; Vertical blank = 4550 cycles (70 scan lines)
|
|
; Total of 17030 cycles to get back to where was
|
|
|
|
; We want to alternate between page1 and page2 every 65 cycles
|
|
; vblank = 4550 cycles to do scrolling
|
|
|
|
|
|
sprites_display_loop:
|
|
|
|
.include "sprites_screen.s"
|
|
|
|
;======================================================
|
|
; We have 4550 cycles in the vblank, use them wisely
|
|
;======================================================
|
|
|
|
; 4550 -- VBLANK
|
|
;-1835 -- draw ship (131*14)+1
|
|
; -829 -- erase ship (100*8)+(14*2)+1
|
|
; -167 -- erase fire
|
|
; -348 -- erase asteroid
|
|
; -31 -- move ship
|
|
; -17 -- move fire
|
|
; -56 -- collide asteroid/fire
|
|
; -40 -- collide ship
|
|
; -35 -- move asteroid
|
|
; -436 -- draw fire
|
|
; -337 -- draw asteroid
|
|
; -61 -- keypress
|
|
; -33 -- handle fire press
|
|
; -51 -- exploding asteroid
|
|
; -47 -- sparkle
|
|
; -36 -- blast (18+18)
|
|
; -25 -- loop
|
|
; -3 -- alignment
|
|
;=======
|
|
; 163
|
|
; -40 nop sled
|
|
|
|
|
|
;================
|
|
; erase old ship
|
|
|
|
ldy YPOS ; 3 ; 0
|
|
jsr erase_line ; 6+94
|
|
|
|
iny ; 2 ; 1
|
|
jsr erase_line ; 6+94
|
|
|
|
iny ; 2 ; 2
|
|
jsr erase_line ; 6+94
|
|
|
|
iny ; 2 ; 3
|
|
jsr erase_line ; 6+94
|
|
|
|
; note, to be complete should erase all these
|
|
; only an issue if moving up/down really fast
|
|
|
|
iny ; 2 ; 4
|
|
; jsr erase_line ; 6+94
|
|
iny ; 2 ; 5
|
|
; jsr erase_line ; 6+94
|
|
iny ; 2 ; 6
|
|
; jsr erase_line ; 6+94
|
|
iny ; 2 ; 7
|
|
; jsr erase_line ; 6+94
|
|
iny ; 2 ; 8
|
|
; jsr erase_line ; 6+94
|
|
iny ; 2 ; 9
|
|
; jsr erase_line ; 6+94
|
|
iny ; 2 ; 10
|
|
jsr erase_line ; 6+94
|
|
iny ; 2 ; 11
|
|
jsr erase_line ; 6+94
|
|
iny ; 2 ; 12
|
|
jsr erase_line ; 6+94
|
|
iny ; 2 ; 13
|
|
jsr erase_line ; 6+94
|
|
|
|
;==========================
|
|
; erase the fire
|
|
;==========================
|
|
|
|
ldy FIRE_Y ; 3
|
|
iny ; 2
|
|
jsr erase_fire ; 6+71
|
|
iny ; 2
|
|
iny ; 2
|
|
iny ; 2
|
|
iny ; 2
|
|
jsr erase_fire ; 6+71
|
|
;========
|
|
; 167
|
|
|
|
; jsr erase_fire ; 6+71
|
|
; jsr erase_fire ; 6+71
|
|
; jsr erase_fire ; 6+71
|
|
;====
|
|
; 388
|
|
|
|
|
|
|
|
|
|
;=====================
|
|
; erase the asteroid
|
|
|
|
lda #$0 ; 2
|
|
sta DRAW_PAGE ; 3
|
|
|
|
lda #<void_p1 ; 2
|
|
sta INL ; 3
|
|
lda #>void_p1 ; 2
|
|
sta INH ; 3
|
|
lda ASTEROID_X ; 3
|
|
sta SPRITE_XPOS ; 3
|
|
lda ASTEROID_Y ; 3
|
|
sta SPRITE_YPOS ; 3
|
|
jsr put_sprite_fast ; 6+304
|
|
;======
|
|
; 337
|
|
|
|
|
|
;==========================
|
|
; move the asteroid
|
|
;==========================
|
|
; move none: 16 [12+7] = 35
|
|
; move ok: 16+12 [7] = 35
|
|
; move off screen: 16+12+7 = 35
|
|
; game over: who cares
|
|
move_asteroid:
|
|
clc ; 2
|
|
lda ASTEROID_SUBX ; 3
|
|
adc ASTEROID_SPEED ; 3
|
|
sta ASTEROID_SUBX ; 3
|
|
cmp #$12 ; 2
|
|
bcc no_new_asteroid2; 3 blt
|
|
;========
|
|
; 16
|
|
|
|
; -1
|
|
lda #0 ; 2
|
|
sta ASTEROID_SUBX ; 3
|
|
dec ASTEROID_X ; 5
|
|
bne no_new_asteroid ; 3
|
|
;=====
|
|
; 12
|
|
new_asteroid:
|
|
; -1
|
|
lda #7 ; 2
|
|
sta ASTEROID_EXPLODE ; 3
|
|
jmp done_move_asteroid ; 3
|
|
;===========
|
|
; 7
|
|
|
|
no_new_asteroid2:
|
|
inc TEMP ; 5
|
|
inc TEMP ; 5
|
|
nop ; 2
|
|
|
|
no_new_asteroid:
|
|
nop ; 2
|
|
nop ; 2
|
|
lda TEMP ; 3
|
|
;====
|
|
; 7
|
|
|
|
done_move_asteroid:
|
|
|
|
|
|
|
|
;==========================
|
|
; move the fire
|
|
;==========================
|
|
; no-fire: 6+7 = 13 [4]
|
|
; too-far: 6+4+7 = 17
|
|
; moving: 6+4+7 = 17
|
|
|
|
|
|
lda FIRE_X ; 3
|
|
beq no_fire ; 3
|
|
; -1
|
|
cmp #39 ; 2
|
|
bcs kill_fire ; bge 3
|
|
; -1
|
|
inc FIRE_X ; 5
|
|
jmp done_move_fire ; 3
|
|
no_fire:
|
|
nop
|
|
nop
|
|
kill_fire:
|
|
nop ; 2
|
|
lda #0 ; 2
|
|
sta FIRE_X ; 3
|
|
done_move_fire:
|
|
|
|
|
|
;==========================
|
|
; move the ship
|
|
; in bounds: 14+5 = 19 [12]
|
|
; too small: 14+10 = 24 [7]
|
|
; too big: 14+5+12 = 31
|
|
|
|
clc ; 2
|
|
lda YPOS ; 3
|
|
adc YADD ; 3
|
|
sta YPOS ; 3
|
|
bpl not_minus ; 3
|
|
|
|
minus:
|
|
; -1
|
|
lda #$0 ; 2
|
|
sta YPOS ; 3
|
|
sta YADD ; 3
|
|
jmp done_move_delay_7 ; 3
|
|
not_minus:
|
|
cmp #104 ; 2
|
|
bcc done_move_delay_12 ; blt ; 3
|
|
; -1
|
|
lda #$0 ; 2
|
|
sta YADD ; 3
|
|
lda #103 ; 2
|
|
sta YPOS ; 3
|
|
jmp done_move ; 3
|
|
done_move_delay_12:
|
|
lda TEMP ; 3
|
|
nop ; 2
|
|
done_move_delay_7:
|
|
lda TEMP ; 3
|
|
nop ; 2
|
|
nop ; 2
|
|
|
|
done_move:
|
|
|
|
|
|
nop_sled:
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
|
|
|
|
|
|
;==========================
|
|
; collision (fire/asteroid)
|
|
;==========================
|
|
; none: 13 [20+23]
|
|
; xmatch not y: 13+20 [23]
|
|
; explosion: 13+20+23 = 56
|
|
|
|
sec ; 2
|
|
lda ASTEROID_X ; 3
|
|
sbc FIRE_X ; 3
|
|
cmp #252 ; 2
|
|
bcc no_collide_x ; 3 ; blt
|
|
;===
|
|
; 13
|
|
|
|
; -1
|
|
lda FIRE_Y ; 3
|
|
lsr ; 2
|
|
lsr ; 2
|
|
clc ; 2
|
|
adc #$9 ; 2
|
|
sec ; 2
|
|
sbc ASTEROID_Y ; 3
|
|
cmp #4 ; 2
|
|
bcs no_collide_y ; 3 ; bge
|
|
;===
|
|
; 20
|
|
|
|
; -1
|
|
lda #1 ; 2
|
|
sta ASTEROID_EXPLODE ; 3
|
|
|
|
inc ASTEROID_SPEED ; 5
|
|
|
|
lda #0 ; 2
|
|
sta FIRE_X ; 3
|
|
|
|
inc $41D ; 6
|
|
|
|
jmp collision_done ; 3
|
|
;====
|
|
; 23
|
|
no_collide_x:
|
|
inc TEMP ; 5
|
|
inc TEMP ; 5
|
|
inc TEMP ; 5
|
|
inc TEMP ; 5
|
|
|
|
no_collide_y:
|
|
inc TEMP ; 5
|
|
inc TEMP ; 5
|
|
inc TEMP ; 5
|
|
inc TEMP ; 5
|
|
lda TEMP ; 3
|
|
|
|
collision_done:
|
|
|
|
|
|
;==========================
|
|
; collision (ship/asteroid)
|
|
;==========================
|
|
; none: 8 [20+12]
|
|
; xmatch not y: 8+20 [12]
|
|
; explosion: 8+20+12 = 40
|
|
ship_collision:
|
|
|
|
lda ASTEROID_X ; 3
|
|
cmp #$8 ; 2
|
|
bcs no_ship_collide_x ; 3 ; blt
|
|
;===
|
|
; 8
|
|
|
|
; -1
|
|
lda YPOS ; 3
|
|
lsr ; 2
|
|
lsr ; 2
|
|
clc ; 2
|
|
adc #10 ; 2
|
|
sec ; 2
|
|
sbc ASTEROID_Y ; 3
|
|
cmp #6 ; 2
|
|
bcs no_ship_collide_y ; 3 ; bge
|
|
;===
|
|
; 20
|
|
|
|
; -1
|
|
lda #1 ; 2
|
|
sta ASTEROID_EXPLODE ; 3
|
|
|
|
lda #1 ; 2
|
|
sta LEVEL_DONE ; 3
|
|
|
|
lda #1
|
|
sta GAME_OVER
|
|
|
|
jmp ship_collision_done ; 3
|
|
;====
|
|
; 12
|
|
no_ship_collide_x:
|
|
inc TEMP ; 5
|
|
inc TEMP ; 5
|
|
inc TEMP ; 5
|
|
inc TEMP ; 5
|
|
|
|
no_ship_collide_y:
|
|
lda TEMP ; 3
|
|
lda TEMP ; 3
|
|
lda TEMP ; 3
|
|
lda TEMP ; 3
|
|
|
|
ship_collision_done:
|
|
|
|
|
|
|
|
|
|
;==========================
|
|
; draw the ship
|
|
|
|
ldy YPOS ; 3
|
|
|
|
; line 0
|
|
ldx #0 ; 2
|
|
jsr sprite_line ; 6+121
|
|
;====
|
|
; 129
|
|
|
|
; line 1
|
|
iny ; 2
|
|
ldx #7 ; 2
|
|
jsr sprite_line ; 6+121
|
|
;====
|
|
; 131
|
|
|
|
; line 2
|
|
iny ; 2
|
|
ldx #14 ; 2
|
|
jsr sprite_line ; 6+121
|
|
;====
|
|
; 131
|
|
|
|
; line 3
|
|
iny ; 2
|
|
ldx #21 ; 2
|
|
jsr sprite_line ; 6+121
|
|
;====
|
|
; 131
|
|
|
|
; line 4
|
|
iny ; 2
|
|
ldx #28 ; 2
|
|
jsr sprite_line ; 6+121
|
|
;====
|
|
; 131
|
|
|
|
; line 5
|
|
iny ; 2
|
|
ldx #35 ; 2
|
|
jsr sprite_line ; 6+121
|
|
;====
|
|
; 131
|
|
|
|
; line 6
|
|
iny ; 2
|
|
ldx #42 ; 2
|
|
jsr sprite_line ; 6+121
|
|
;====
|
|
; 131
|
|
|
|
; line 7
|
|
iny ; 2
|
|
ldx #49 ; 2
|
|
jsr sprite_line ; 6+121
|
|
;====
|
|
; 131
|
|
|
|
; line 8
|
|
iny ; 2
|
|
ldx #56 ; 2
|
|
jsr sprite_line ; 6+121
|
|
;====
|
|
; 131
|
|
|
|
; line 9
|
|
iny ; 2
|
|
ldx #63 ; 2
|
|
jsr sprite_line ; 6+121
|
|
;====
|
|
; 131
|
|
|
|
; line 10
|
|
iny ; 2
|
|
ldx #70 ; 2
|
|
jsr sprite_line ; 6+121
|
|
;====
|
|
; 131
|
|
|
|
; line 11
|
|
iny ; 2
|
|
ldx #77 ; 2
|
|
jsr sprite_line ; 6+121
|
|
;====
|
|
; 131
|
|
|
|
; line 12
|
|
iny ; 2
|
|
ldx #84 ; 2
|
|
jsr sprite_line ; 6+121
|
|
;====
|
|
; 131
|
|
|
|
; line 13
|
|
iny ; 2
|
|
ldx #91 ; 2
|
|
jsr sprite_line ; 6+121
|
|
;====
|
|
; 131
|
|
|
|
|
|
|
|
|
|
;==========================
|
|
; draw the fire
|
|
;==========================
|
|
; 6+(61*7)+3 = 436
|
|
|
|
lda FIRE_X ; 3
|
|
beq no_draw_fire ; 3
|
|
; -1
|
|
ldy FIRE_Y ; 3
|
|
|
|
; line 0
|
|
ldx #0 ; 2
|
|
jsr fire_line ; 6+51
|
|
;====
|
|
; 61
|
|
|
|
; line 1
|
|
iny ; 2
|
|
ldx #1 ; 2
|
|
jsr fire_line ; 6+51
|
|
;====
|
|
; 61
|
|
|
|
; line 2
|
|
iny ; 2
|
|
ldx #2 ; 2
|
|
jsr fire_line ; 6+51
|
|
;====
|
|
; 61
|
|
|
|
; line 3
|
|
iny ; 2
|
|
ldx #3 ; 2
|
|
jsr fire_line ; 6+51
|
|
;====
|
|
; 61
|
|
|
|
; line 4
|
|
iny ; 2
|
|
ldx #4 ; 2
|
|
jsr fire_line ; 6+51
|
|
;====
|
|
; 61
|
|
|
|
; line 5
|
|
iny ; 2
|
|
ldx #5 ; 2
|
|
jsr fire_line ; 6+51
|
|
;====
|
|
; 61
|
|
|
|
; line 6
|
|
iny ; 2
|
|
ldx #5 ; zero again ; 2
|
|
jsr fire_line ; 6+51
|
|
;====
|
|
; 61
|
|
|
|
jmp done_draw_fire ; 3
|
|
|
|
no_draw_fire:
|
|
|
|
; want 436, have 6+1+(61*7)=434
|
|
|
|
nop ; 2
|
|
|
|
ldy FIRE_Y ; 3
|
|
|
|
; line 0
|
|
ldx #5 ; 2
|
|
jsr fire_line ; 6+51
|
|
;====
|
|
; 61+1
|
|
|
|
; line 1
|
|
iny ; 2
|
|
ldx #5 ; 2
|
|
jsr fire_line ; 6+51
|
|
;====
|
|
; 61
|
|
|
|
; line 2
|
|
iny ; 2
|
|
ldx #5 ; 2
|
|
jsr fire_line ; 6+51
|
|
;====
|
|
; 61
|
|
|
|
; line 3
|
|
iny ; 2
|
|
ldx #5 ; 2
|
|
jsr fire_line ; 6+51
|
|
;====
|
|
; 61
|
|
|
|
; line 4
|
|
iny ; 2
|
|
ldx #5 ; 2
|
|
jsr fire_line ; 6+51
|
|
;====
|
|
; 61
|
|
|
|
; line 5
|
|
iny ; 2
|
|
ldx #5 ; 2
|
|
jsr fire_line ; 6+51
|
|
;====
|
|
; 61
|
|
|
|
; line 6
|
|
iny ; 2
|
|
ldx #5 ; zero again ; 2
|
|
jsr fire_line ; 6+51
|
|
;====
|
|
; 61
|
|
|
|
done_draw_fire:
|
|
|
|
|
|
;=====================
|
|
; draw the asteroid
|
|
draw_asteroid:
|
|
lda #$0 ; 2
|
|
sta DRAW_PAGE ; 3
|
|
|
|
lda ASTEROID_EXPLODE ; 3
|
|
and #$fe ; 2
|
|
tax ; 2
|
|
lda asteroid_lookup,X ; 4
|
|
sta INL ; 3
|
|
lda asteroid_lookup+1,X ; 4
|
|
sta INH ; 3
|
|
lda ASTEROID_X ; 3
|
|
sta SPRITE_XPOS ; 3
|
|
lda ASTEROID_Y ; 3
|
|
sta SPRITE_YPOS ; 3
|
|
jsr put_sprite_fast ; 6+304
|
|
;======
|
|
; 348
|
|
|
|
|
|
;=================
|
|
; BLAST1
|
|
;=================
|
|
; blast1: 6+7+5 = 18
|
|
; noblast1: 6+5+[7]
|
|
|
|
lda BLAST1 ; 3
|
|
beq no_blast1d ; 3
|
|
blast1:
|
|
; -1
|
|
inc ZERO ; 5
|
|
jmp no_blast1 ; 3
|
|
no_blast1d:
|
|
lda TEMP ; 3
|
|
nop ; 2
|
|
nop ; 2
|
|
|
|
no_blast1:
|
|
lda #0 ; 2
|
|
sta BLAST1 ; 3
|
|
|
|
|
|
;=================
|
|
; BLAST2
|
|
;=================
|
|
; blast2: 6+7+5 = 18
|
|
; noblast1: 6+5+[7]
|
|
|
|
lda BLAST2 ; 3
|
|
beq no_blast2d ; 3
|
|
blast2:
|
|
; -1
|
|
lda #0 ; 2
|
|
sta ZERO ; 3
|
|
jmp no_blast2 ; 3
|
|
no_blast2d:
|
|
lda TEMP
|
|
nop
|
|
nop
|
|
no_blast2:
|
|
lda #0 ; 2
|
|
sta BLAST2 ; 3
|
|
|
|
|
|
|
|
|
|
;==================
|
|
; sparkle flame
|
|
;==================
|
|
; 14+20+13 = 47
|
|
|
|
sparkle_flame:
|
|
inc FRAME ; 5
|
|
lda FRAME ; 3
|
|
and #$7 ; 2
|
|
asl ; 2
|
|
tay ; 2
|
|
|
|
; Set up jump table that runs same speed on 6502 and 65c02
|
|
lda jump_table+1,y ; 4
|
|
pha ; 3
|
|
lda jump_table,y ; 4
|
|
pha ; 3
|
|
rts ; 6
|
|
;=============
|
|
; 20
|
|
jump_table:
|
|
.word (sparkle1-1),(sparkle_motion-1),(sparkle2-1),(sparkle_motion-1)
|
|
.word (sparkle3-1),(sparkle_motion-1),(sparkle4-1),(sparkle_motion-1)
|
|
|
|
sparkle1:
|
|
lda ship_sprite_l9+0 ; 4
|
|
eor #$88 ; 2
|
|
sta ship_sprite_l9+0 ; 4
|
|
jmp done_sparkle ; 3
|
|
|
|
sparkle2:
|
|
lda ship_sprite_l9+1 ; 4
|
|
eor #$88 ; 2
|
|
sta ship_sprite_l9+1 ; 4
|
|
jmp done_sparkle ; 3
|
|
|
|
sparkle3:
|
|
lda ship_sprite_l8+0 ; 4
|
|
eor #$44 ; 2
|
|
sta ship_sprite_l8+0 ; 4
|
|
jmp done_sparkle ; 3
|
|
|
|
sparkle4:
|
|
lda ship_sprite_l10+0 ; 4
|
|
eor #$44 ; 2
|
|
sta ship_sprite_l10+0 ; 4
|
|
jmp done_sparkle ; 3
|
|
|
|
sparkle_motion:
|
|
lda TEMP ; 3
|
|
lda TEMP ; 3
|
|
nop
|
|
nop
|
|
jmp done_sparkle ; 3
|
|
|
|
done_sparkle:
|
|
|
|
|
|
|
|
|
|
pad_time:
|
|
|
|
|
|
;============================
|
|
; WAIT for VBLANK to finish
|
|
;============================
|
|
|
|
wait_loop:
|
|
|
|
; Try X=11 Y=2 cycles=123
|
|
|
|
ldy #2 ; 2
|
|
loopY: ldx #11 ; 2
|
|
loopZ: dex ; 2
|
|
bne loopZ ; 2nt/3
|
|
dey ; 2
|
|
bne loopY ; 2nt/3
|
|
wait_loop_end:
|
|
|
|
;===============
|
|
; check keypress
|
|
|
|
jsr handle_keypress ; 6+55
|
|
|
|
;=================================
|
|
; handle fire
|
|
;=================================
|
|
; FIRE: 6+5+17+5 = 33
|
|
; FIRE but OUT: 6+5+5 = 16 [17]
|
|
; no FIRE: 6+5 = 11 [22]
|
|
; urgh pain to make this invariant
|
|
|
|
lda FIRE ; 3
|
|
beq no_firing2 ; 3
|
|
; -1
|
|
|
|
lda FIRE_X ; 3
|
|
bne no_firing ; 3
|
|
; -1
|
|
|
|
clc ; 2
|
|
lda YPOS ; 3
|
|
adc #10 ; 2
|
|
sta FIRE_Y ; 3
|
|
|
|
lda #7 ; 2
|
|
sta FIRE_X ; 3
|
|
|
|
jmp really_no_firing ; 3
|
|
|
|
no_firing2:
|
|
inc TEMP ; 5
|
|
no_firing:
|
|
inc TEMP ; 5
|
|
inc TEMP ; 5
|
|
inc TEMP ; 5
|
|
nop ; 2
|
|
|
|
really_no_firing:
|
|
lda #0 ; 2
|
|
sta FIRE ; 3
|
|
|
|
|
|
alignment:
|
|
jmp blah ; 3
|
|
.align $100
|
|
|
|
blah:
|
|
;=================================
|
|
; handle exploding asteroid
|
|
;=================================
|
|
; none: 6 [12+33]
|
|
; exploding: 6+12 [33]
|
|
; done: 6+12+33 = 51
|
|
|
|
lda ASTEROID_EXPLODE ; 3
|
|
beq asteroid_no_explode ; 3
|
|
;==
|
|
; 6
|
|
|
|
; -1
|
|
inc ASTEROID_EXPLODE ; 5
|
|
lda ASTEROID_EXPLODE ; 3
|
|
cmp #9 ; 2
|
|
bne asteroid_not_done ; 3
|
|
;===
|
|
; 12
|
|
asteroid_done:
|
|
; -1
|
|
lda #0 ; 2
|
|
sta ASTEROID_EXPLODE ; 3
|
|
inc RANDOM_PTR ; 5
|
|
ldy RANDOM_PTR ; 3
|
|
lda random_values,Y ; 4
|
|
and #$1e ; 2
|
|
clc ; 2
|
|
adc #$4 ; 2
|
|
sta ASTEROID_Y ; 3
|
|
lda #36 ; 2
|
|
sta ASTEROID_X ; 3
|
|
jmp asteroid_done_done ; 3
|
|
;====
|
|
;33
|
|
asteroid_no_explode:
|
|
inc TEMP ; 5
|
|
inc TEMP ; 5
|
|
nop ; 2
|
|
asteroid_not_done:
|
|
inc TEMP ; 5
|
|
inc TEMP ; 5
|
|
inc TEMP ; 5
|
|
inc TEMP ; 5
|
|
inc TEMP ; 5
|
|
inc TEMP ; 5
|
|
lda TEMP ; 3
|
|
asteroid_done_done:
|
|
|
|
|
|
;=========================
|
|
; check for end
|
|
;=========================
|
|
; not done = 6+3 = 9 + [16] = 25
|
|
; done = who cares
|
|
; dying = 6+4+12+3 = 25
|
|
|
|
lda LEVEL_DONE ; 3
|
|
beq final_loop_short ; 3
|
|
|
|
;-1
|
|
cmp #1 ;2
|
|
beq done_level ;3
|
|
|
|
;-1
|
|
dec LEVEL_DONE ; 5
|
|
inc XPOS ; 5
|
|
jmp final_loop ; 3
|
|
;=====
|
|
; 12
|
|
|
|
final_loop_short:
|
|
inc TEMP
|
|
inc TEMP
|
|
lda TEMP
|
|
lda TEMP
|
|
final_loop:
|
|
|
|
jmp sprites_display_loop ; 3
|
|
|
|
done_level:
|
|
rts
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.align $100
|
|
;=======================
|
|
; handle keypress
|
|
;=======================
|
|
; separate function so we an align to avoid branches
|
|
; crossing page boundaries
|
|
;
|
|
; NONE = 6+7 = 13 [42]
|
|
; ESC = doesn't matter
|
|
; ' ' = 6+6+9+5+7 = 33 [22] [[20]]
|
|
; '.' = 6+6+9+5+5+7 = 48 [17] [[5]]
|
|
; ',' = 6+6+9+5+5+5+7 = 43 [12] [[5]]
|
|
; 'A' = 6+6+9+5+5+5+7+7 = 50 [5] [[7]]
|
|
; 'Z' = 6+6+9+5+5+5+7+5+7 = 55 [0] [[5]]
|
|
; unkno= 6+6+9+5+5+5+7+5+3+[4] = 55 [0]
|
|
handle_keypress:
|
|
lda KEYPRESS ; 4
|
|
bpl key_delay_42 ; 3
|
|
; -1
|
|
|
|
bit KEYRESET ; clear strobe ; 4
|
|
|
|
cmp #27+$80 ; 2
|
|
bne key_not_escape ; 3
|
|
|
|
lda #32
|
|
sta LEVEL_DONE
|
|
|
|
rts
|
|
|
|
key_not_escape:
|
|
|
|
cmp #' '+$80 ; 2
|
|
bne key_not_space ; 3
|
|
; -1
|
|
lda #$ff ; 2
|
|
sta FIRE ; 3
|
|
jmp key_delay_22 ; 3
|
|
|
|
key_not_space:
|
|
cmp #'.'+$80 ; 2
|
|
bne key_not_period ; 3
|
|
; -1
|
|
lda #1 ; 2
|
|
sta BLAST1 ; 3
|
|
jmp key_delay_17 ; 3
|
|
|
|
key_not_period:
|
|
cmp #','+$80 ; 2
|
|
bne key_not_comma ; 3
|
|
; -1
|
|
lda #1 ; 2
|
|
sta BLAST2 ; 3
|
|
jmp key_delay_12 ; 3
|
|
|
|
key_not_comma:
|
|
and #$5f ; make uppercase ; 2
|
|
|
|
cmp #'A' ; 2
|
|
bne key_not_a ; 3
|
|
; -1
|
|
dec YADD ; 5
|
|
jmp key_delay_5 ; 3
|
|
|
|
key_not_a:
|
|
cmp #'Z' ; 2
|
|
bne key_not_z ; 3
|
|
; -1
|
|
inc YADD ; 5
|
|
jmp keypress_done ; 3
|
|
|
|
key_not_z:
|
|
nop ; 2
|
|
nop ; 2
|
|
jmp keypress_done ; 3
|
|
|
|
key_delay_42:
|
|
inc TEMP ; 5
|
|
dec TEMP ; 5
|
|
inc TEMP ; 5
|
|
dec TEMP ; 5
|
|
|
|
key_delay_22:
|
|
nop ; 2
|
|
lda TEMP ; 3
|
|
key_delay_17:
|
|
nop ; 2
|
|
lda TEMP ; 3
|
|
key_delay_12:
|
|
nop ; 2
|
|
nop ; 2
|
|
lda TEMP ; 3
|
|
|
|
key_delay_5:
|
|
nop ; 2
|
|
lda TEMP ; 3
|
|
|
|
keypress_done:
|
|
rts ; 6
|
|
|
|
|
|
|
|
;========================
|
|
; Draw a line of a sprite
|
|
;========================
|
|
; Y = y value
|
|
; x = location in sprite
|
|
; 17+11+(7*12)+3+6 = 121
|
|
sprite_line:
|
|
sty TEMPY ; 3
|
|
|
|
lda y_lookup_l,Y ; 4
|
|
sta OUTL ; 3
|
|
lda y_lookup_h,Y ; 4
|
|
sta OUTH ; 3
|
|
;=======
|
|
; 17
|
|
|
|
; XPOS
|
|
lda XPOS ; 3
|
|
ldy #0 ; 2
|
|
sta (OUTL),Y ; 6
|
|
;=======
|
|
; 11
|
|
; COL0
|
|
ldy #2 ; 2
|
|
lda ship_sprite+0,X ; 4
|
|
sta (OUTL),Y ; 6
|
|
;=======
|
|
; 12
|
|
|
|
; COL1
|
|
ldy #7 ; 2
|
|
lda ship_sprite+1,X ; 4
|
|
sta (OUTL),Y ; 6
|
|
;=======
|
|
; 12
|
|
|
|
; COL2
|
|
ldy #12 ; 2
|
|
lda ship_sprite+2,X ; 4
|
|
sta (OUTL),Y ; 6
|
|
;=======
|
|
; 12
|
|
|
|
; COL3
|
|
ldy #17 ; 2
|
|
lda ship_sprite+3,X ; 4
|
|
sta (OUTL),Y ; 6
|
|
;=======
|
|
; 12
|
|
|
|
; COL4
|
|
ldy #22 ; 2
|
|
lda ship_sprite+4,X ; 4
|
|
sta (OUTL),Y ; 6
|
|
;=======
|
|
; 12
|
|
|
|
; COL5
|
|
ldy #27 ; 2
|
|
lda ship_sprite+5,X ; 4
|
|
sta (OUTL),Y ; 6
|
|
;=======
|
|
; 12
|
|
|
|
; COL6
|
|
ldy #32 ; 2
|
|
lda ship_sprite+6,X ; 4
|
|
sta (OUTL),Y ; 6
|
|
;=======
|
|
; 12
|
|
|
|
ldy TEMPY ; 3
|
|
rts ; 6
|
|
|
|
|
|
;========================
|
|
; Erase a line of a sprite
|
|
;========================
|
|
; Y = y value
|
|
; 17+10+2+(7*8)+3+6 = 94
|
|
erase_line:
|
|
sty TEMPY ; 3
|
|
|
|
lda y_lookup_l,Y ; 4
|
|
sta OUTL ; 3
|
|
lda y_lookup_h,Y ; 4
|
|
sta OUTH ; 3
|
|
;=======
|
|
; 17
|
|
|
|
; XPOS
|
|
lda #1 ; xpos=1 ; 2
|
|
ldy #0 ; 2
|
|
sta (OUTL),Y ; 6
|
|
;=======
|
|
; 10
|
|
|
|
lda #0 ; 2
|
|
|
|
; COL0
|
|
ldy #2 ; 2
|
|
sta (OUTL),Y ; 6
|
|
; COL1
|
|
ldy #7 ; 2
|
|
sta (OUTL),Y ; 6
|
|
; COL2
|
|
ldy #12 ; 2
|
|
sta (OUTL),Y ; 6
|
|
; COL3
|
|
ldy #17 ; 2
|
|
sta (OUTL),Y ; 6
|
|
; COL4
|
|
ldy #22 ; 2
|
|
sta (OUTL),Y ; 6
|
|
; COL5
|
|
ldy #27 ; 2
|
|
sta (OUTL),Y ; 6
|
|
; COL6
|
|
ldy #32 ; 2
|
|
sta (OUTL),Y ; 6
|
|
|
|
ldy TEMPY ; 3
|
|
rts ; 6
|
|
|
|
;========================
|
|
; Draw a line of a fire
|
|
;========================
|
|
; Y = y value
|
|
; x = location in sprite
|
|
; 17+11+14+9 = 51
|
|
fire_line:
|
|
sty TEMPY ; 3
|
|
|
|
lda y_lookup_l,Y ; 4
|
|
sta OUTL ; 3
|
|
lda y_lookup_h,Y ; 4
|
|
sta OUTH ; 3
|
|
;=======
|
|
; 17
|
|
|
|
; 38/40
|
|
; XPOS
|
|
lda FIRE_X ; 3
|
|
ldy #37 ; 2
|
|
sta (OUTL),Y ; 6
|
|
;=======
|
|
; 11
|
|
; COL0
|
|
ldy #39 ; 2
|
|
txa ; 2
|
|
ora #$80 ; 2
|
|
tax ; 2
|
|
sta (OUTL),Y ; 6
|
|
;=======
|
|
; 14
|
|
|
|
ldy TEMPY ; 3
|
|
rts ; 6
|
|
;=======
|
|
; 9
|
|
|
|
|
|
;========================
|
|
; Erase a line of a fire
|
|
;========================
|
|
; Y = y value
|
|
; 31+29+11 = 71
|
|
erase_fire:
|
|
sty TEMPY ; 3
|
|
|
|
tya ; 2
|
|
lsr ; 2
|
|
lsr ; 2
|
|
and #$fe ; 2
|
|
clc ; 2
|
|
adc #$8 ; 2
|
|
|
|
tay ; 2
|
|
|
|
lda gr_offsets,Y ; 4
|
|
sta OUTL ; 3
|
|
lda gr_offsets+1,Y ; 4
|
|
sta OUTH ; 3
|
|
;=======
|
|
; 31
|
|
|
|
ldy FIRE_X ; 3
|
|
lda #0 ; 2
|
|
sta (OUTL),Y ; 6
|
|
lda #$4 ; 2
|
|
clc ; 2
|
|
adc OUTH ; 3
|
|
sta OUTH ; 3
|
|
lda #0 ; 2
|
|
sta (OUTL),Y ; 6
|
|
;======
|
|
; 29
|
|
|
|
; ldx in smc should already be
|
|
; set to value from last draw?
|
|
|
|
; COL0
|
|
; ldy #6 ; 2
|
|
; lda (OUTL),Y ; 5+
|
|
; sta fz_smc+1 ; 5
|
|
; iny ; 2
|
|
; lda (OUTL),Y ; 5+
|
|
; sta fz_smc+2 ; 5
|
|
; lda #0 ; 2
|
|
;fz_smc:
|
|
; sta $c00,Y ; 5
|
|
;=======
|
|
; 31
|
|
|
|
ldy TEMPY ; 3
|
|
iny ; 2
|
|
rts ; 6
|
|
;=======
|
|
; 11
|
|
|
|
|
|
;.include "gr_simple_clear.s"
|
|
|
|
|
|
;.include "../asm_routines/gr_unrle.s"
|
|
;.include "../asm_routines/keypress.s"
|
|
.align $100
|
|
random_values:
|
|
.incbin "random.data"
|
|
.include "sprites_table.s"
|
|
;.include "gr_offsets.s"
|
|
|
|
;.include "movement_table.s"
|
|
;.include "gr_copy.s"
|
|
;.include "vapor_lock.s"
|
|
;.include "delay_a.s"
|
|
.align $100
|
|
.include "gr_putsprite_fast.s"
|
|
|
|
.assert >gr_offsets = >gr_offsets_done, error, "gr_offsets crosses page"
|
|
.assert >wait_loop = >(wait_loop_end-1), error, "wait_loop crosses page"
|
|
|
|
pictures:
|
|
.word earth_low,earth_high
|
|
|
|
.include "earth.inc"
|
|
|
|
.align $100
|
|
|
|
ship_sprite:
|
|
; l0: 0 1 2 3 4 5 6
|
|
.byte $00,$00,$00,$ff,$00,$00,$00
|
|
; l1:
|
|
.byte $00,$00,$00,$ff,$00,$00,$00
|
|
; l2:
|
|
.byte $00,$00,$00,$ff,$00,$00,$00
|
|
; l3:
|
|
.byte $00,$00,$00,$ff,$00,$00,$00
|
|
; l4:
|
|
.byte $00,$00,$00,$77,$00,$00,$00
|
|
; l5:
|
|
.byte $00,$00,$00,$ff,$ff,$22,$00
|
|
; l6:
|
|
.byte $00,$00,$22,$ff,$ff,$22,$00
|
|
; l7:
|
|
.byte $00,$dd,$66,$11,$22,$22,$00
|
|
; l8:
|
|
ship_sprite_l8:
|
|
.byte $dd,$99,$22,$44,$44,$22,$22
|
|
; l9:
|
|
ship_sprite_l9:
|
|
.byte $99,$11,$66,$ff,$ff,$22,$22
|
|
; l10:
|
|
ship_sprite_l10:
|
|
.byte $dd,$99,$22,$ff,$ff,$22,$22
|
|
; l11:
|
|
.byte $00,$dd,$66,$77,$77,$77,$ff
|
|
; l12:
|
|
.byte $00,$00,$22,$ff,$ff,$77,$ff
|
|
; l13:
|
|
.byte $00,$00,$00,$ff,$ff,$77,$ff
|
|
|
|
|
|
.include "asteroid.inc"
|
|
|
|
|
|
score_text2:
|
|
.byte 0,0
|
|
.asciiz "LEVEL:3 LIVES:1 SCORE:000000 HI:001978"
|
|
|