dos33fsprogs/duke/draw_duke.s

344 lines
4.6 KiB
ArmAsm
Raw Normal View History

2020-12-11 00:24:05 +00:00
2020-12-14 00:25:30 +00:00
DUKE_SPEED = $80
2020-12-11 00:24:05 +00:00
;=========================
; move duke
;=========================
2020-11-28 05:51:57 +00:00
move_duke:
2020-12-13 03:43:52 +00:00
jsr duke_get_feet_location ; get location of feet
2020-12-14 16:49:35 +00:00
jsr check_falling ; check for/handle falling
2020-12-11 00:59:34 +00:00
2020-12-14 16:49:35 +00:00
jsr duke_collide ; check for right/left collision
2020-12-14 00:25:30 +00:00
2020-12-14 16:49:35 +00:00
jsr handle_jumping ; handle jumping
2020-12-11 05:44:55 +00:00
2020-12-11 00:24:05 +00:00
lda DUKE_WALKING
beq done_move_duke
2020-11-28 05:51:57 +00:00
2020-12-11 00:24:05 +00:00
lda DUKE_DIRECTION
bmi move_left
lda DUKE_X
cmp #22
bcc duke_walk_right
duke_scroll_right:
2020-12-13 06:27:21 +00:00
clc
lda DUKE_XL
2020-12-14 00:25:30 +00:00
adc #DUKE_SPEED
2020-12-13 06:27:21 +00:00
sta DUKE_XL
bcc skip_duke_scroll_right
2020-12-11 00:24:05 +00:00
inc TILEMAP_X
jsr copy_tilemap_subset
2020-12-13 06:27:21 +00:00
skip_duke_scroll_right:
2020-12-11 00:24:05 +00:00
jmp done_move_duke
duke_walk_right:
2020-12-13 06:27:21 +00:00
lda DUKE_XL
clc
2020-12-14 00:25:30 +00:00
adc #DUKE_SPEED
2020-12-13 06:27:21 +00:00
sta DUKE_XL
bcc dwr_noflo
2020-12-11 00:24:05 +00:00
inc DUKE_X
2020-12-13 06:27:21 +00:00
dwr_noflo:
2020-12-11 00:24:05 +00:00
jmp done_move_duke
move_left:
2020-11-28 05:51:57 +00:00
2020-12-11 00:24:05 +00:00
lda DUKE_X
cmp #14
bcs duke_walk_left
duke_scroll_left:
2020-12-13 06:27:21 +00:00
sec
lda DUKE_XL
2020-12-14 00:25:30 +00:00
sbc #DUKE_SPEED
2020-12-13 06:27:21 +00:00
sta DUKE_XL
bcs skip_duke_scroll_left
2020-12-11 00:24:05 +00:00
dec TILEMAP_X
jsr copy_tilemap_subset
2020-12-13 06:27:21 +00:00
skip_duke_scroll_left:
2020-12-11 00:24:05 +00:00
jmp done_move_duke
duke_walk_left:
2020-12-13 06:27:21 +00:00
lda DUKE_XL
sec
2020-12-14 00:25:30 +00:00
sbc #DUKE_SPEED
2020-12-13 06:27:21 +00:00
sta DUKE_XL
bcs dwl_noflo
dec DUKE_X
dwl_noflo:
2020-12-11 00:24:05 +00:00
jmp done_move_duke
done_move_duke:
rts
2020-12-11 00:59:34 +00:00
;=========================
; duke collide
;=========================
; only check above head if jumping
duke_collide:
2020-12-14 00:25:30 +00:00
lda DUKE_DIRECTION
beq done_duke_collide
bmi check_left_collide
check_right_collide:
lda DUKE_FOOT_OFFSET
clc
adc #1 ; underfoot is on next row (+16)
tax
lda TILEMAP,X
; if tile# < 32 then we are fine
cmp #32
bcc done_duke_collide ; blt
lda #0 ;
sta DUKE_WALKING
jmp done_duke_collide
check_left_collide:
lda DUKE_FOOT_OFFSET
sec
sbc #1 ; underfoot is on next row (+16)
tax
lda TILEMAP,X
; if tile# < 32 then we are fine
cmp #32
bcc done_duke_collide ; blt
lda #0 ;
sta DUKE_WALKING
jmp done_duke_collide
done_duke_collide:
2020-12-11 00:59:34 +00:00
rts
2020-12-11 05:44:55 +00:00
2020-12-14 00:25:30 +00:00
2020-12-11 05:44:55 +00:00
;=========================
; check_jumping
;=========================
handle_jumping:
lda DUKE_JUMPING
beq done_handle_jumping
dec DUKE_Y
dec DUKE_Y
dec DUKE_JUMPING
2020-12-14 16:49:35 +00:00
bne done_handle_jumping
lda #1 ; avoid gap before falling triggered
sta DUKE_FALLING
2020-12-11 05:44:55 +00:00
done_handle_jumping:
rts
2020-12-11 00:59:34 +00:00
2020-12-11 05:44:55 +00:00
2020-12-11 00:59:34 +00:00
2020-12-13 03:43:52 +00:00
;=======================
; duke_get_feet_location
;=======================
; 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 8
; xx 7 xx 9
; xx 8
; xx 9
;-----------------------
duke_get_feet_location:
; this is tricky as we are 10 tall but tiles are 4 tall
; + 1 is because sprite is 4 pixels wide?
; screen is 16 wide, but ofsset 4 in
; block index of foot is (feet approximately 8 lower than Y)
; INT((y+8)/4)*16 + (x-4+1/2)
; if 18,18 -> INT(26/4)*16 = 96 + 7 = 103 = 6R7
; 0 = 32 (2)
; 1 = 32 (2)
; 2 = 32 (2)
; 3 = 32 (2)
; 4 = 48 (3)
; 5 = 48 (3)
; 6 = 48 (3)
; 7 = 48 (3)
2020-12-11 00:59:34 +00:00
lda DUKE_Y
2020-12-13 06:54:59 +00:00
2020-12-11 00:59:34 +00:00
clc
2020-12-13 06:54:59 +00:00
adc #6 ; +8
2020-12-13 03:43:52 +00:00
lsr ; / 4 (INT)
lsr
asl ; *4
2020-12-11 00:59:34 +00:00
asl
asl
asl
2020-12-13 03:43:52 +00:00
sta DUKE_FOOT_OFFSET
sec
lda DUKE_X
sbc #3
lsr ; (x-3)/2
2020-12-11 00:59:34 +00:00
clc
2020-12-13 03:43:52 +00:00
adc DUKE_FOOT_OFFSET
sta DUKE_FOOT_OFFSET
rts
2020-12-11 00:59:34 +00:00
2020-12-13 03:43:52 +00:00
;=========================
; check_falling
;=========================
check_falling:
lda DUKE_JUMPING
bne done_check_falling ; don't check falling if jumping
lda DUKE_FOOT_OFFSET
clc
2020-12-13 06:27:21 +00:00
adc #16 ; underfoot is on next row (+16)
2020-12-11 00:59:34 +00:00
tax
lda TILEMAP,X
2020-12-11 06:24:47 +00:00
; if tile# < 32 then we fall
2020-12-11 00:59:34 +00:00
cmp #32
2020-12-11 06:24:47 +00:00
bcs feet_on_ground ; bge
;=======================
; falling
2020-12-14 16:49:35 +00:00
lda #1
sta DUKE_FALLING
2020-12-13 06:27:21 +00:00
; scroll but only if Y>=18
2020-12-11 06:24:47 +00:00
lda DUKE_Y
cmp #18
2020-12-13 06:27:21 +00:00
bcs scroll_fall ; bge
2020-12-11 06:24:47 +00:00
inc DUKE_Y
inc DUKE_Y
jmp done_check_falling
2020-12-11 00:59:34 +00:00
2020-12-11 06:24:47 +00:00
scroll_fall:
2020-12-11 00:59:34 +00:00
inc TILEMAP_Y
jsr copy_tilemap_subset
2020-12-11 06:24:47 +00:00
jmp done_check_falling
feet_on_ground:
2020-12-14 16:49:35 +00:00
; clear falling
lda #0
sta DUKE_FALLING
2020-12-11 06:24:47 +00:00
; check to see if Y still hi, if so scroll back down
lda DUKE_Y
cmp #18
2020-12-13 03:43:52 +00:00
bcs done_check_falling ; bge
2020-12-13 06:27:21 +00:00
; too high up on screen, adjust down and also adjust tilemap down
2020-12-11 06:24:47 +00:00
inc DUKE_Y
inc DUKE_Y
dec TILEMAP_Y ; share w above?
jsr copy_tilemap_subset
2020-12-11 00:59:34 +00:00
2020-12-11 05:44:55 +00:00
done_check_falling:
2020-12-11 00:59:34 +00:00
rts
2020-12-11 00:24:05 +00:00
;=========================
; draw duke
;=========================
2020-11-28 05:51:57 +00:00
draw_duke:
lda DUKE_X
sta XPOS
lda DUKE_Y
sta YPOS
lda DUKE_DIRECTION
bmi duke_facing_left
lda #<duke_sprite_stand_right
sta INL
lda #>duke_sprite_stand_right
jmp actually_draw_duke
duke_facing_left:
lda #<duke_sprite_stand_left
sta INL
lda #>duke_sprite_stand_left
actually_draw_duke:
sta INH
jsr put_sprite_crop
rts
duke_sprite_stand_right:
.byte 4,5
.byte $AA,$dA,$dA,$AA
.byte $AA,$dd,$bb,$AA
.byte $AA,$b3,$7A,$7A
.byte $AA,$66,$6b,$AA
.byte $AA,$56,$65,$AA
duke_sprite_stand_left:
.byte 4,5
.byte $AA,$dA,$dA,$AA
.byte $AA,$bb,$dd,$AA
.byte $7A,$7A,$b3,$AA
.byte $AA,$6b,$66,$AA
.byte $AA,$65,$56,$AA