dos33fsprogs/games/keen/move_keen.s

511 lines
9.1 KiB
ArmAsm
Raw Normal View History

2024-03-10 05:44:20 +00:00
KEEN_SPEED = $80
YDEFAULT = 20
2024-03-14 05:21:45 +00:00
HARDTOP_TILES = 32 ; start at 32
ALLHARD_TILES = 40 ; start at 40
2024-03-10 05:44:20 +00:00
2024-03-14 04:08:19 +00:00
TILE_COLS = 20
2024-03-10 05:44:20 +00:00
;=========================
; move keen
;=========================
move_keen:
lda #0
sta SUPPRESS_WALK ; ????
2024-03-10 05:44:20 +00:00
jsr keen_get_feet_location ; get location of feet
jsr check_falling ; check for/handle falling
jsr keen_collide ; check for right/left collision
jsr handle_jumping ; handle jumping
lda KEEN_WALKING ; if not walking, we're done
2024-03-10 05:44:20 +00:00
beq done_move_keen
dec KEEN_WALKING ; decrement walk count
lda SUPPRESS_WALK ; why????
2024-03-10 05:44:20 +00:00
bne done_move_keen
lda KEEN_DIRECTION ; check direction
2024-03-10 05:44:20 +00:00
bmi move_left
;==============================
; Move Keen Right
;==============================
; if (keen_x<22) || (tilemap_x>xmax-20) walk
; otherwise, scroll
2024-03-29 05:12:13 +00:00
lda TILEMAP_X
cmp #96 ; 540-80 = 460/4 = 115-20 = 95
bcs keen_walk_right
lda KEEN_X ; if X more than 22
cmp #22 ; scroll screen rather than keen
2024-03-10 05:44:20 +00:00
bcc keen_walk_right
keen_scroll_right:
clc ; location is 8:8 fixed point
2024-03-10 05:44:20 +00:00
lda KEEN_XL
adc #KEEN_SPEED ; add in speed
2024-03-10 05:44:20 +00:00
sta KEEN_XL
bcc skip_keen_scroll_right ; if carry out we scroll
2024-03-10 05:44:20 +00:00
inc TILEMAP_X ; scroll screen to right
2024-03-10 05:44:20 +00:00
jsr copy_tilemap_subset ; update tilemap
2024-03-10 05:44:20 +00:00
skip_keen_scroll_right:
jmp done_move_keen
keen_walk_right:
lda KEEN_XL ; get 8:8 fixed
2024-03-10 05:44:20 +00:00
clc
adc #KEEN_SPEED ; add in speed
2024-03-10 05:44:20 +00:00
sta KEEN_XL
bcc dwr_noflo ; if no overflow
inc KEEN_X ; otherwise update X
2024-03-10 05:44:20 +00:00
dwr_noflo:
jmp done_move_keen
move_left:
;==============================
2024-03-18 05:16:13 +00:00
; Move Keen Left
;==============================
; if (keen_x>=14) || (tilemap_x=0) walk
; otherwise, scroll
lda TILEMAP_X
beq keen_walk_left
lda KEEN_X ; get current X
2024-03-10 05:44:20 +00:00
cmp #14
bcs keen_walk_left ; bge ; if >=14 walk
2024-03-10 05:44:20 +00:00
keen_scroll_left: ; otherwise scroll
2024-03-10 05:44:20 +00:00
sec ; 8.8 fixed point
2024-03-10 05:44:20 +00:00
lda KEEN_XL
sbc #KEEN_SPEED
sta KEEN_XL
bcs skip_keen_scroll_left
dec TILEMAP_X ; scroll left
2024-03-10 05:44:20 +00:00
jsr copy_tilemap_subset
skip_keen_scroll_left:
jmp done_move_keen
keen_walk_left:
lda KEEN_XL
sec
sbc #KEEN_SPEED
sta KEEN_XL
bcs dwl_noflo
dec KEEN_X
dwl_noflo:
jmp done_move_keen
done_move_keen:
rts
;=========================
; keen collide
;=========================
keen_collide:
;==================
; check for item
;==================
2024-03-30 04:55:12 +00:00
keen_check_items:
2024-03-10 05:44:20 +00:00
2024-03-30 04:55:12 +00:00
jsr check_items
2024-03-10 05:44:20 +00:00
;===================
; collide with head
;===================
keen_check_head:
; only check above head if jumping
lda KEEN_JUMPING
beq collide_left_right
2024-03-29 05:12:13 +00:00
; if here we are jumping
2024-03-10 05:44:20 +00:00
2024-03-29 05:12:13 +00:00
; check if left side of head hit hard tile
lda KEEN_HEAD_TILE1
2024-03-29 05:12:13 +00:00
; if tile# < ALLHARD_TILES then we are fine
cmp #ALLHARD_TILES
bcc collide_left_right ; blt
2024-03-10 05:44:20 +00:00
2024-03-29 05:12:13 +00:00
lda KEEN_HEAD_TILE2
2024-03-14 05:21:45 +00:00
; if tile# < ALLHARD_TILES then we are fine
cmp #ALLHARD_TILES
2024-03-10 05:44:20 +00:00
bcc collide_left_right ; blt
2024-03-29 05:12:13 +00:00
; o/~ I hit my head, I heard the phone ring o/~
; o/~ I was distracted by my friend Joe o/~
2024-03-10 05:44:20 +00:00
lda #0
2024-03-29 05:12:13 +00:00
sta KEEN_JUMPING ; no longer jumping
2024-03-10 05:44:20 +00:00
lda #1
2024-03-29 05:12:13 +00:00
sta KEEN_FALLING ; now falling
2024-03-10 05:44:20 +00:00
2024-04-04 05:06:29 +00:00
; jsr head_noise
2024-03-10 05:44:20 +00:00
collide_left_right:
;===================
; collide left/right
;===================
lda KEEN_DIRECTION
2024-03-29 05:12:13 +00:00
beq done_keen_collide ; can this happen?
2024-03-10 05:44:20 +00:00
bmi check_left_collide
check_right_collide:
lda KEEN_WALK_TILE_R
2024-03-14 05:21:45 +00:00
; if tile# < ALLHARD_TILES then we are fine
cmp #ALLHARD_TILES
2024-03-10 05:44:20 +00:00
bcc done_keen_collide ; blt
lda #1 ;
sta SUPPRESS_WALK
jmp done_keen_collide
check_left_collide:
lda KEEN_WALK_TILE_L
2024-03-14 05:21:45 +00:00
; if tile# < ALLHARD_TILES then we are fine
cmp #ALLHARD_TILES
2024-03-10 05:44:20 +00:00
bcc done_keen_collide ; blt
lda #1
sta SUPPRESS_WALK
jmp done_keen_collide
done_keen_collide:
rts
;=========================
2024-03-18 05:16:13 +00:00
; handle_jumping
2024-03-10 05:44:20 +00:00
;=========================
handle_jumping:
lda KEEN_JUMPING
2024-03-18 05:16:13 +00:00
beq done_handle_jumping ; skip if not actually jumping
2024-03-10 05:44:20 +00:00
;===================================================
; scroll but only if KEEN_Y<20 (YDEFAULT)
; and TILEMAP_Y >0
2024-03-10 05:44:20 +00:00
2024-03-29 05:12:13 +00:00
lda TILEMAP_Y ; if tilemap=0, scroll keen
cmp #0 ; instead of scrolling screen
beq keen_rising
2024-03-10 05:44:20 +00:00
2024-03-29 05:12:13 +00:00
; check if hit top of screen
lda KEEN_Y ;
cmp #2 ; if hit top of screen, start falling
bcc start_falling
2024-03-10 05:44:20 +00:00
cmp #YDEFAULT ; compare to middle of screen
bcc scroll_rising ; blt
2024-03-10 05:44:20 +00:00
2024-03-29 05:12:13 +00:00
; move keen
keen_rising:
dec KEEN_Y
dec KEEN_Y
jmp done_check_rising
2024-03-10 05:44:20 +00:00
scroll_rising:
dec TILEMAP_Y
2024-03-10 05:44:20 +00:00
jsr copy_tilemap_subset
jmp done_check_rising
2024-03-10 05:44:20 +00:00
done_check_rising:
2024-03-10 05:44:20 +00:00
dec KEEN_JUMPING ; slow jump
bne done_handle_jumping ; if positive still going up
2024-03-10 05:44:20 +00:00
start_falling:
; otherwise hit peak, start falling
lda #1 ; avoid gap before falling triggered
sta KEEN_FALLING
2024-03-10 05:44:20 +00:00
done_handle_jumping:
rts
2024-03-10 05:44:20 +00:00
;=========================
; check_falling
;=========================
check_falling:
lda KEEN_JUMPING
bne done_check_falling ; don't check falling if jumping
lda KEEN_FOOT_BELOW1
2024-03-10 05:44:20 +00:00
2024-04-01 06:03:48 +00:00
; if tile# > HARDTOP_TILES then we stop falling
cmp #HARDTOP_TILES
bcs feet_on_ground ; bge
lda KEEN_FOOT_BELOW2
2024-03-10 05:44:20 +00:00
2024-04-01 06:03:48 +00:00
; if tile# > HARDTOP_TILES then we stop falling
2024-03-14 05:21:45 +00:00
cmp #HARDTOP_TILES
2024-03-10 05:44:20 +00:00
bcs feet_on_ground ; bge
2024-03-10 05:44:20 +00:00
;=======================
; falling
lda #1
sta KEEN_FALLING
2024-03-18 05:16:13 +00:00
;===================================================
; scroll but only if KEEN_Y>=20 (YDEFAULT)
; and TILEMAP_Y < MAX_TILE_Y
lda TILEMAP_Y
cmp #MAX_TILE_Y
bcs keen_fall ; bge
2024-03-10 05:44:20 +00:00
lda KEEN_Y
cmp #YDEFAULT
bcs scroll_fall ; bge
2024-03-18 05:16:13 +00:00
keen_fall:
2024-04-01 06:03:48 +00:00
inc KEEN_Y ; this must be +2
inc KEEN_Y ; as we only draw sprites on even lines
2024-03-10 05:44:20 +00:00
jmp done_check_falling
scroll_fall:
inc TILEMAP_Y
jsr copy_tilemap_subset
2024-04-01 06:03:48 +00:00
2024-03-10 05:44:20 +00:00
jmp done_check_falling
feet_on_ground:
;===========================
; if had been falling
; make noise
2024-03-10 05:44:20 +00:00
; stop walking?
lda KEEN_FALLING
beq was_not_falling
; clear falling
lda #0
sta KEEN_FALLING
sta KEEN_WALKING
2024-04-04 05:06:29 +00:00
; jsr land_noise
2024-03-10 05:44:20 +00:00
2024-04-01 06:03:48 +00:00
rts
2024-03-10 05:44:20 +00:00
was_not_falling:
; check to see if Y still hi, if so scroll back down
2024-04-01 06:03:48 +00:00
; lda KEEN_Y
; cmp #YDEFAULT
; bcs done_check_falling ; bge
2024-03-10 05:44:20 +00:00
; too high up on screen, adjust down and also adjust tilemap down
2024-04-01 06:03:48 +00:00
; inc KEEN_Y
; inc KEEN_Y
; inc TILEMAP_Y ; share w above?
; jsr copy_tilemap_subset
2024-03-10 05:44:20 +00:00
done_check_falling:
rts
;=======================
; keen_get_feet_location
;=======================
; sets ? values
; they are actually the tile values, not offsets
; KEEN_HEAD_TILE1, KEEN_HEAD_TILE2
; tile values of row containing keen's head
; KEEN_FOOT_TILE1, KEEN_FOOT_TILE2
; tile values of row containing keen's feet
; KEEN_FOOT_BELOW1, KEEN_FOOT_BELOW2
; tile values of row below keen's feet (he can span 2)
; KEEN_WALK_TILE_L,KEEN_WALK_TILE_R
; tile value of what walking into
; keen sprite is 4 wide, but only the "core" is 2 wide
; so in theory 2 possibilities
; EVEN ODD EVEN ODD
; .KK. .KK. .KK. .KK.
; 001122 001122 001122 00112233
;FOOT_BELOW 0/1 1/1 1/2 2/2
;FOOT_WALK(R) 1 2 2 3
;FOOT_WALK(L) 0 0 1 1
; if KEEN_X = even
; KEEN_FOOT_BELOW1 = (KEEN_X>>1)
; KEEN_FOOT_BELOW2 = (KEEN_X>>1)+1)
; KEEN_FOOT_WALK_R = (KEEN_X>>1)+1)
; KEEN_FOOT_WALK_L = (KEEN_X>>1)
; if KEEN_X = odd
; KEEN_FOOT_BELOW1 = ((KEEN_X>>1)+1)
; KEEN_FOOT_BELOW2 = ((KEEN_X>>1)+1)
; KEEN_FOOT_WALK_R = ((KEEN_X>>1)+2)
; KEEN_FOOT_WALK_L = (KEEN_X>>1)
keen_get_feet_location:
lda KEEN_X
lsr
bcs keen_get_feet_odd
keen_get_feet_even:
; carry is clear
ldx KEEN_Y
adc head_lookup,X
tax ; X is now pointer to tile of head
lda tilemap,X ; put tilemap value in place
sta KEEN_HEAD_TILE1
stx KEEN_HEAD_POINTER_L
lda tilemap+1,X
sta KEEN_HEAD_TILE2
txa
inx
stx KEEN_HEAD_POINTER_R
; restore pointer to tile of head
clc
adc #TILE_COLS ; one row down, now at foot
tax
lda tilemap,X ; put tilemap value in place
sta KEEN_FOOT_TILE1
sta KEEN_WALK_TILE_L
stx KEEN_FOOT_POINTER_L
lda tilemap+1,X
sta KEEN_FOOT_TILE2
sta KEEN_WALK_TILE_R
txa
inx
stx KEEN_FOOT_POINTER_R
; restore pointer to tile of foot
clc
adc #TILE_COLS ; one row down
tax
lda tilemap,X
sta KEEN_FOOT_BELOW1
lda tilemap+1,X
sta KEEN_FOOT_BELOW2
rts
keen_get_feet_odd:
; carry is set
clc
ldx KEEN_Y
adc head_lookup,X
tax ; X is now pointer to tilemap of head
lda tilemap+1,X ; put tilemap value in place
sta KEEN_HEAD_TILE1
sta KEEN_HEAD_TILE2
stx KEEN_HEAD_POINTER_L
stx KEEN_HEAD_POINTER_R
txa
clc
adc #TILE_COLS ; one row down
tax ; X is now pointer to tilemap of feet
lda tilemap,X ; put tilemap value in place
sta KEEN_WALK_TILE_L
lda tilemap+1,X
sta KEEN_FOOT_TILE1
sta KEEN_FOOT_TILE2
lda tilemap+2,X
sta KEEN_WALK_TILE_R
stx KEEN_FOOT_POINTER_L
stx KEEN_FOOT_POINTER_R
txa
clc
adc #TILE_COLS ; one row down
tax
lda tilemap+1,X
sta KEEN_FOOT_BELOW1
sta KEEN_FOOT_BELOW2
rts
; xx 0
; xx 1
;------ -----
; xx 0 xx 2
; xx 1 xx 3
; xx 2 xx 4
; xx 3 xx 5
;------ -------
; xx 4 xx 6
; xx 5 xx 7
; xx 6
; xx 7
;-----------------------
; INT((y)/4)*20
head_lookup:
.byte 0,0,0,0
.byte 20,20,20,20 ; 3
.byte 40,40,40,40 ; 7
.byte 60,60,60,60 ; 11
.byte 80,80,80,80 ; 15
.byte 100,100,100,100 ; 19
.byte 120,120,120,120 ; 23
.byte 140,140,140,140 ; 27
.byte 160,160,160,160 ; 31
.byte 180,180,180,180 ; 35
.byte 200,200,200,200 ; 39
.byte 220,220,220,220 ; 43
.byte 240,240,240,240 ; 47