mirror of
https://github.com/deater/dos33fsprogs.git
synced 2024-11-19 12:32:35 +00:00
189 lines
2.9 KiB
ArmAsm
189 lines
2.9 KiB
ArmAsm
;====================================
|
|
; draw pointer
|
|
;====================================
|
|
|
|
lda CURSOR_VISIBLE
|
|
bne draw_pointer
|
|
jmp no_draw_pointer
|
|
|
|
draw_pointer:
|
|
|
|
|
|
lda CURSOR_X
|
|
sta XPOS
|
|
lda CURSOR_Y
|
|
sta YPOS
|
|
|
|
; see if inside special region
|
|
ldy #LOCATION_SPECIAL_EXIT
|
|
lda (LOCATION_STRUCT_L),Y
|
|
cmp #$ff
|
|
beq finger_not_special ; if $ff not special
|
|
cmp DIRECTION
|
|
bne finger_not_special ; only special if facing right way
|
|
|
|
; see if X1 < X < X2
|
|
lda CURSOR_X
|
|
ldy #LOCATION_SPECIAL_X1
|
|
cmp (LOCATION_STRUCT_L),Y
|
|
bcc finger_not_special ; blt
|
|
|
|
ldy #LOCATION_SPECIAL_X2
|
|
cmp (LOCATION_STRUCT_L),Y
|
|
bcs finger_not_special ; bge
|
|
|
|
; see if Y1 < Y < Y2
|
|
lda CURSOR_Y
|
|
ldy #LOCATION_SPECIAL_Y1
|
|
cmp (LOCATION_STRUCT_L),Y
|
|
bcc finger_not_special ; blt
|
|
|
|
ldy #LOCATION_SPECIAL_Y2
|
|
cmp (LOCATION_STRUCT_L),Y
|
|
bcs finger_not_special ; bge
|
|
|
|
; we made it this far, we are special
|
|
|
|
finger_grab:
|
|
lda #1
|
|
sta IN_SPECIAL
|
|
|
|
lda #<finger_grab_sprite
|
|
sta INL
|
|
lda #>finger_grab_sprite
|
|
jmp finger_draw
|
|
|
|
finger_not_special:
|
|
|
|
; check for left/right
|
|
|
|
lda CURSOR_X
|
|
cmp #7
|
|
bcc check_cursor_left ; blt
|
|
|
|
cmp #33
|
|
bcs check_cursor_right ; bge
|
|
|
|
; otherwise, finger_point
|
|
|
|
finger_point:
|
|
lda #<finger_point_sprite
|
|
sta INL
|
|
lda #>finger_point_sprite
|
|
jmp finger_draw
|
|
|
|
check_cursor_left:
|
|
ldy #LOCATION_BGS
|
|
lda (LOCATION_STRUCT_L),Y
|
|
|
|
check_left_north:
|
|
ldy DIRECTION
|
|
cpy #DIRECTION_N
|
|
bne check_left_south
|
|
|
|
handle_left_north:
|
|
; check if west exists
|
|
and #BG_WEST
|
|
beq finger_point
|
|
bne finger_left
|
|
|
|
check_left_south:
|
|
cpy #DIRECTION_S
|
|
bne check_left_east
|
|
|
|
handle_left_south:
|
|
; check if east exists
|
|
and #BG_EAST
|
|
beq finger_point
|
|
bne finger_left
|
|
|
|
check_left_east:
|
|
cpy #DIRECTION_E
|
|
bne check_left_west
|
|
handle_left_east:
|
|
; check if north exists
|
|
and #BG_NORTH
|
|
beq finger_point
|
|
bne finger_left
|
|
|
|
check_left_west:
|
|
; we should be only option left
|
|
handle_left_west:
|
|
; check if south exists
|
|
and #BG_SOUTH
|
|
beq finger_point
|
|
bne finger_left
|
|
|
|
|
|
check_cursor_right:
|
|
|
|
ldy #LOCATION_BGS
|
|
lda (LOCATION_STRUCT_L),Y
|
|
|
|
check_right_north:
|
|
ldy DIRECTION
|
|
cpy #DIRECTION_N
|
|
bne check_right_south
|
|
|
|
handle_right_north:
|
|
; check if east exists
|
|
and #BG_EAST
|
|
beq finger_point
|
|
bne finger_right
|
|
|
|
check_right_south:
|
|
cpy #DIRECTION_S
|
|
bne check_right_east
|
|
|
|
handle_right_south:
|
|
; check if west exists
|
|
and #BG_WEST
|
|
beq finger_point
|
|
bne finger_right
|
|
|
|
check_right_east:
|
|
cpy #DIRECTION_E
|
|
bne check_right_west
|
|
handle_right_east:
|
|
; check if south exists
|
|
and #BG_SOUTH
|
|
beq finger_point
|
|
bne finger_right
|
|
|
|
check_right_west:
|
|
; we should be only option left
|
|
handle_right_west:
|
|
; check if north exists
|
|
and #BG_NORTH
|
|
beq finger_point
|
|
bne finger_right
|
|
|
|
|
|
|
|
finger_left:
|
|
lda #1
|
|
sta IN_LEFT
|
|
|
|
lda #<finger_left_sprite
|
|
sta INL
|
|
lda #>finger_left_sprite
|
|
jmp finger_draw
|
|
|
|
finger_right:
|
|
lda #1
|
|
sta IN_RIGHT
|
|
lda #<finger_right_sprite
|
|
sta INL
|
|
lda #>finger_right_sprite
|
|
jmp finger_draw
|
|
|
|
|
|
|
|
finger_draw:
|
|
sta INH
|
|
jsr put_sprite_crop
|
|
|
|
no_draw_pointer:
|
|
rts
|
|
|