dos33fsprogs/interlace_demo/sprites.s

1314 lines
19 KiB
ArmAsm
Raw Normal View History

2019-06-12 21:09:37 +00:00
; TODO
; + merge with spacebars code
; + make flame move (write to the sprite table directly) frame count+xor?
2019-06-12 21:09:37 +00:00
; + end of game, fly to the right
; + implement both blasts
2019-06-12 21:09:37 +00:00
; 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>
; Zero Page
FRAMEBUFFER = $00 ; $00 - $0F
CH = $24
CV = $25
GBASL = $26
GBASH = $27
BASL = $28
BASH = $29
FRAME = $60
BLARGH = $69
SPRITE_XPOS = $E0
SPRITE_YPOS = $E1
2019-06-13 16:35:51 +00:00
RANDOM_PTR = $E2
ASTEROID_X = $E3
ASTEROID_Y = $E4
2019-06-13 16:52:57 +00:00
ASTEROID_SUBX = $E5
2019-06-13 17:52:24 +00:00
ASTEROID_EXPLODE= $E6
DRAW_PAGE = $EE
2019-06-12 21:09:37 +00:00
2019-06-12 21:09:37 +00:00
FIRE_X = $F0
FIRE_Y = $F1
YPOS = $F2
YADD = $F3
BLAST1 = $F4
BLAST2 = $F5
FIRE = $F6
TEMP = $F7
WHICH = $F8
TEMPY = $F9
LEVEL_DONE = $FA
2019-06-13 16:52:57 +00:00
ASTEROID_SPEED = $FB
INL = $FC
INH = $FD
OUTL = $FE
OUTH = $FF
GREEN0 = $80
GREEN1 = $81
GREEN2 = $82
GREEN3 = $83
GREEN4 = $84
ZERO = $85
2019-06-13 17:52:24 +00:00
; Soft Switches
KEYPRESS= $C000
KEYRESET= $C010
SET_GR = $C050 ; Enable graphics
FULLGR = $C052 ; Full screen, no text
PAGE0 = $C054 ; Page0
PAGE1 = $C055 ; Page1
LORES = $C056 ; Enable LORES graphics
PADDLE_BUTTON0 = $C061
PADDL0 = $C064
PTRIG = $C070
; ROM routines
TEXT = $FB36 ;; Set text mode
HOME = $FC58 ;; Clear the text screen
WAIT = $FCA8 ;; delay 1/2(26+27A+5A^2) us
start_sprites:
;===================
; init screen
jsr TEXT
jsr HOME
bit KEYRESET
;===================
; init vars
lda #0
sta DRAW_PAGE
sta WHICH
2019-06-12 18:47:43 +00:00
sta ZERO
sta YADD
sta LEVEL_DONE
2019-06-12 21:09:37 +00:00
sta FIRE_X
2019-06-13 16:52:57 +00:00
sta ASTEROID_SUBX
2019-06-13 17:52:24 +00:00
sta ASTEROID_EXPLODE
2019-06-12 18:47:43 +00:00
lda #$44
sta GREEN0
sta GREEN4
lda #$cc
sta GREEN1
sta GREEN3
lda #$ff
sta GREEN2
2019-06-13 17:42:52 +00:00
lda #36
2019-06-13 16:35:51 +00:00
sta ASTEROID_X
2019-06-13 17:42:52 +00:00
lda #12
2019-06-13 16:35:51 +00:00
sta ASTEROID_Y
2019-06-12 18:47:43 +00:00
lda #64
sta YPOS
2019-06-13 16:52:57 +00:00
lda #1
sta ASTEROID_SPEED
;=============================
; 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
; jsr wait_until_keypressed
;=============================
; 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
; ; GR part
bit PAGE0
; jsr wait_until_keypressed
;==============================
; 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
loopA: ldx #9 ; 2
loopB: dex ; 2
bne loopB ; 2nt/3
dey ; 2
bne loopA ; 2nt/3
jmp 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
display_loop:
.include "sprites_screen.s"
;======================================================
; We have 4550 cycles in the vblank, use them wisely
;======================================================
; 4550 -- VBLANK
2019-06-13 03:49:02 +00:00
;-1821 -- draw ship (130*14)+1
; -829 -- erase ship (100*8)+(14*2)+1
; -167 -- erase fire
2019-06-13 17:52:24 +00:00
; -348 -- erase asteroid
2019-06-12 18:47:43 +00:00
; -31 -- move ship
2019-06-12 21:09:37 +00:00
; -17 -- move fire
2019-06-13 17:42:52 +00:00
; -51 -- collide asteroid/fire
; -35 -- move asteroid
; -436 -- draw fire
2019-06-13 16:35:51 +00:00
; -337 -- draw asteroid
; -61 -- keypress
; -33 -- handle fire press
; -51 -- exploding asteroid
; -8 -- loop
;=======
; 325
; -40 nop sled
2019-06-13 16:52:57 +00:00
;================
; 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
2019-06-12 21:09:37 +00:00
; 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
2019-06-12 21:09:37 +00:00
;==========================
; erase the fire
;==========================
2019-06-13 05:04:26 +00:00
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
2019-06-13 05:04:26 +00:00
;====
; 388
2019-06-13 05:04:26 +00:00
2019-06-12 21:09:37 +00:00
2019-06-13 16:38:04 +00:00
;=====================
; 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 ; 6+304
;======
; 337
2019-06-13 16:35:51 +00:00
;==========================
2019-06-13 16:52:57 +00:00
; move the asteroid
2019-06-13 16:35:51 +00:00
;==========================
; move none: 16 [12+7] = 35
; move ok: 16+12 [7] = 35
; move off screen: 16+12+7 = 35
2019-06-13 16:35:51 +00:00
; game over: who cares
2019-06-13 16:52:57 +00:00
move_asteroid:
clc ; 2
lda ASTEROID_SUBX ; 3
adc ASTEROID_SPEED ; 3
sta ASTEROID_SUBX ; 3
cmp #$8 ; 2
bcc no_new_asteroid2; 3 blt
;========
; 16
2019-06-13 16:35:51 +00:00
2019-06-13 16:52:57 +00:00
; -1
lda #0 ; 2
sta ASTEROID_SUBX ; 3
2019-06-13 16:35:51 +00:00
dec ASTEROID_X ; 5
bne no_new_asteroid ; 3
2019-06-13 16:52:57 +00:00
;=====
; 12
2019-06-13 16:35:51 +00:00
new_asteroid:
; -1
lda #7 ; 2
sta ASTEROID_EXPLODE ; 3
2019-06-13 16:35:51 +00:00
jmp done_move_asteroid ; 3
;===========
; 7
2019-06-13 16:35:51 +00:00
2019-06-13 16:52:57 +00:00
no_new_asteroid2:
inc TEMP ; 5
inc TEMP ; 5
nop ; 2
2019-06-13 16:35:51 +00:00
no_new_asteroid:
nop ; 2
nop ; 2
2019-06-13 16:35:51 +00:00
lda TEMP ; 3
2019-06-13 16:52:57 +00:00
;====
; 7
2019-06-13 16:35:51 +00:00
done_move_asteroid:
2019-06-12 21:09:37 +00:00
;==========================
; 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
2019-06-13 03:52:22 +00:00
cmp #39 ; 2
2019-06-12 21:09:37 +00:00
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:
2019-06-12 18:47:43 +00:00
;==========================
; 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
2019-06-12 18:47:43 +00:00
bcc done_move_delay_12 ; blt ; 3
; -1
lda #$0 ; 2
sta YADD ; 3
lda #103 ; 2
2019-06-12 18:47:43 +00:00
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
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
2019-06-12 18:47:43 +00:00
2019-06-12 17:13:57 +00:00
2019-06-13 17:42:52 +00:00
;==========================
; collision (fire/asteroid)
;==========================
; none: 13 [20+18]
; xmatch not y: 13+20 [18]
; explosion: 13+20+18 = 51
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
2019-06-13 17:42:52 +00:00
lda #0 ; 2
sta FIRE_X ; 3
inc $408 ; 6
jmp collision_done ; 3
;====
; 18
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
lda TEMP ; 3
collision_done:
2019-06-12 17:13:57 +00:00
;==========================
; draw the ship
2019-06-12 18:33:02 +00:00
2019-06-12 18:47:43 +00:00
ldy YPOS ; 3
2019-06-12 18:33:02 +00:00
; line 0
ldx #0 ; 2
jsr sprite_line ; 6+120
;====
; 128
; line 1
iny ; 2
ldx #7 ; 2
jsr sprite_line ; 6+120
;====
; 130
; line 2
iny ; 2
ldx #14 ; 2
jsr sprite_line ; 6+120
;====
; 130
; line 3
iny ; 2
ldx #21 ; 2
jsr sprite_line ; 6+120
;====
; 130
; line 4
iny ; 2
ldx #28 ; 2
jsr sprite_line ; 6+120
;====
; 130
; line 5
iny ; 2
ldx #35 ; 2
jsr sprite_line ; 6+120
;====
; 130
; line 6
iny ; 2
ldx #42 ; 2
jsr sprite_line ; 6+120
;====
; 130
; line 7
iny ; 2
ldx #49 ; 2
jsr sprite_line ; 6+120
;====
; 130
; line 8
iny ; 2
ldx #56 ; 2
jsr sprite_line ; 6+120
;====
; 130
; line 9
iny ; 2
ldx #63 ; 2
jsr sprite_line ; 6+120
;====
; 130
; line 10
iny ; 2
ldx #70 ; 2
jsr sprite_line ; 6+120
2019-06-12 17:13:57 +00:00
;====
2019-06-12 18:33:02 +00:00
; 130
2019-06-12 17:13:57 +00:00
2019-06-12 18:33:02 +00:00
; line 11
iny ; 2
ldx #77 ; 2
jsr sprite_line ; 6+120
;====
; 130
; line 12
iny ; 2
ldx #84 ; 2
jsr sprite_line ; 6+120
;====
; 130
; line 13
iny ; 2
ldx #91 ; 2
jsr sprite_line ; 6+120
;====
; 130
;==========================
; draw the fire
2019-06-13 05:04:26 +00:00
;==========================
; 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:
2019-06-13 15:36:26 +00:00
; want 436, have 6+1+(61*7)=434
nop ; 2
2019-06-13 15:36:26 +00:00
ldy FIRE_Y ; 3
2019-06-13 15:36:26 +00:00
; 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:
2019-06-13 16:12:36 +00:00
;=====================
; draw the asteroid
2019-06-13 17:52:24 +00:00
draw_asteroid:
2019-06-13 16:12:36 +00:00
lda #$0 ; 2
sta DRAW_PAGE ; 3
2019-06-13 17:52:24 +00:00
lda ASTEROID_EXPLODE ; 3
and #$fe ; 2
2019-06-13 17:52:24 +00:00
tax ; 2
lda asteroid_lookup,X ; 4
2019-06-13 16:12:36 +00:00
sta INL ; 3
2019-06-13 17:52:24 +00:00
lda asteroid_lookup+1,X ; 4
2019-06-13 16:12:36 +00:00
sta INH ; 3
2019-06-13 16:35:51 +00:00
lda ASTEROID_X ; 3
2019-06-13 16:12:36 +00:00
sta SPRITE_XPOS ; 3
2019-06-13 16:35:51 +00:00
lda ASTEROID_Y ; 3
2019-06-13 16:12:36 +00:00
sta SPRITE_YPOS ; 3
jsr put_sprite ; 6+304
;======
2019-06-13 17:52:24 +00:00
; 348
2019-06-13 16:12:36 +00:00
pad_time:
;============================
; WAIT for VBLANK to finish
;============================
2019-06-13 17:52:24 +00:00
; nop
; nop
; nop
; nop
; nop
; nop
; nop
; nop
; nop
; nop
2019-06-12 21:09:37 +00:00
wait_loop:
; Try X=27 Y=2 cycles=283R2
2019-06-13 17:52:24 +00:00
nop
ldy #2 ; 2
loop1: ldx #27 ; 2
loop2: dex ; 2
bne loop2 ; 2nt/3
dey ; 2
bne loop1 ; 2nt/3
wait_loop_end:
;===============
; check keypress
jsr handle_keypress ; 6+55
;=================================
2019-06-13 03:49:02 +00:00
; 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
2019-06-13 03:49:02 +00:00
lda FIRE ; 3
beq no_firing2 ; 3
; -1
lda FIRE_X ; 3
bne no_firing ; 3
2019-06-13 03:49:02 +00:00
; -1
2019-06-13 03:52:22 +00:00
clc ; 2
2019-06-13 03:49:02 +00:00
lda YPOS ; 3
2019-06-13 05:04:26 +00:00
adc #10 ; 2
2019-06-13 03:49:02 +00:00
sta FIRE_Y ; 3
lda #7 ; 2
sta FIRE_X ; 3
jmp really_no_firing ; 3
no_firing2:
inc TEMP ; 5
2019-06-13 03:49:02 +00:00
no_firing:
inc TEMP ; 5
inc TEMP ; 5
inc TEMP ; 5
2019-06-13 03:52:22 +00:00
nop ; 2
2019-06-13 03:49:02 +00:00
really_no_firing:
lda #0 ; 2
sta FIRE ; 3
2019-06-13 03:49:02 +00:00
;=================================
; 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
;=========================
lda LEVEL_DONE ; 3
bne done_level ; 2
jmp display_loop ; 3
done_level:
rts
2019-06-13 03:49:02 +00:00
.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 #1
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
2019-06-12 18:33:02 +00:00
;========================
; Draw a line of a sprite
;========================
; Y = y value
; x = location in sprite
; 17+10+(7*12)+3+6 = 120
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 #1 ; xpos=1 ; 2
ldy #0 ; 2
sta (OUTL),Y ; 6
;=======
; 10
; COL0
ldy #2 ; 2
lda ship_sprite+0,X ; 4
sta (OUTL),Y ; 6
;=======
; 12
2019-06-12 18:33:02 +00:00
; COL1
ldy #7 ; 2
lda ship_sprite+1,X ; 4
sta (OUTL),Y ; 6
;=======
; 12
2019-06-12 18:33:02 +00:00
; COL2
ldy #12 ; 2
lda ship_sprite+2,X ; 4
sta (OUTL),Y ; 6
;=======
; 12
2019-06-12 18:33:02 +00:00
; COL3
ldy #17 ; 2
lda ship_sprite+3,X ; 4
sta (OUTL),Y ; 6
;=======
; 12
2019-06-12 18:33:02 +00:00
; COL4
ldy #22 ; 2
lda ship_sprite+4,X ; 4
sta (OUTL),Y ; 6
;=======
; 12
2019-06-12 18:33:02 +00:00
; COL5
ldy #27 ; 2
lda ship_sprite+5,X ; 4
sta (OUTL),Y ; 6
;=======
; 12
2019-06-12 18:33:02 +00:00
; COL6
ldy #32 ; 2
lda ship_sprite+6,X ; 4
sta (OUTL),Y ; 6
;=======
; 12
ldy TEMPY ; 3
rts ; 6
2019-06-13 17:42:52 +00:00
;========================
; 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
2019-06-12 18:33:02 +00:00
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
2019-06-13 05:04:26 +00:00
;========================
; Erase a line of a fire
;========================
; Y = y value
; 31+29+11 = 71
2019-06-13 05:04:26 +00:00
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
2019-06-13 05:04:26 +00:00
sta OUTL ; 3
lda gr_offsets+1,Y ; 4
2019-06-13 05:04:26 +00:00
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
2019-06-13 05:04:26 +00:00
; 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
2019-06-13 05:04:26 +00:00
;=======
; 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
2019-06-13 16:35:51 +00:00
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.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:
2019-06-12 17:43:56 +00:00
.word earth_low,earth_high
2019-06-12 17:43:56 +00:00
.include "earth.inc"
2019-06-12 18:33:02 +00:00
.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:
.byte $dd,$99,$22,$44,$44,$22,$22
; l9:
.byte $99,$11,$66,$ff,$ff,$22,$22
; 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
2019-06-13 16:12:36 +00:00
.include "asteroid.inc"