dos33fsprogs/mist/draw_pointer.s

217 lines
3.4 KiB
ArmAsm
Raw Normal View History

2020-03-08 04:11:08 +00:00
;====================================
; draw pointer
;====================================
draw_pointer:
; point sprite to right location (X,Y)
2020-03-08 04:11:08 +00:00
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
2020-03-14 15:57:09 +00:00
lda DIRECTION
and #$f
cmp (LOCATION_STRUCT_L),Y
2020-03-08 04:11:08 +00:00
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 CURSOR_VISIBLE ; if not visible skip
bne really_draw_grab
rts
really_draw_grab:
lda DIRECTION
and #DIRECTION_ONLY_POINT
bne special_but_point
2020-03-08 04:11:08 +00:00
lda #<finger_grab_sprite
sta INL
lda #>finger_grab_sprite
jmp finger_draw
special_but_point:
jmp finger_point
2020-03-08 04:11:08 +00:00
finger_not_special:
lda CURSOR_VISIBLE ; if not visible skip
bne really_not_special
rts
really_not_special:
2020-03-08 04:11:08 +00:00
; 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 HOLDING_PAGE
beq real_finger_point
cmp #HOLDING_BLUE_PAGE
beq blue_finger
cmp #HOLDING_WHITE_PAGE
beq white_finger
red_finger:
lda #<finger_red_page_sprite
sta INL
lda #>finger_red_page_sprite
jmp finger_draw
blue_finger:
lda #<finger_blue_page_sprite
sta INL
lda #>finger_blue_page_sprite
jmp finger_draw
white_finger:
lda #<finger_white_page_sprite
sta INL
lda #>finger_white_page_sprite
jmp finger_draw
real_finger_point:
2020-03-08 04:11:08 +00:00
lda #<finger_point_sprite
sta INL
lda #>finger_point_sprite
jmp finger_draw
check_cursor_left:
jsr lookup_direction
2020-03-08 04:11:08 +00:00
and #$f
2020-03-08 04:11:08 +00:00
beq finger_point
cmp #$1
beq finger_left
bne finger_uturn_left
2020-03-08 04:11:08 +00:00
check_cursor_right:
jsr lookup_direction
and #$f0
beq finger_point
cmp #$10
beq finger_right
bne finger_uturn_right
lookup_direction:
lda DIRECTION
and #$f
asl
asl
asl
asl
clc
ldy #LOCATION_BGS
adc (LOCATION_STRUCT_L),Y
tay
2020-03-08 04:11:08 +00:00
lda direction_lookup,Y
2020-03-08 04:11:08 +00:00
rts
2020-03-08 04:11:08 +00:00
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_uturn_left:
2020-03-08 04:11:08 +00:00
lda #2
sta IN_LEFT
lda #<finger_turn_left_sprite
sta INL
lda #>finger_turn_left_sprite
jmp finger_draw
finger_uturn_right:
lda #2
sta IN_RIGHT
lda #<finger_turn_right_sprite
sta INL
lda #>finger_turn_right_sprite
jmp finger_draw
2020-03-08 04:11:08 +00:00
finger_draw:
sta INH
jsr put_sprite_crop
no_draw_pointer:
rts
; 0 = point
; 1 = left
; 2 = left u-turn
direction_lookup:
direction_lookup_n:
.byte $00,$00,$22,$22,$01,$01,$21,$21,$10,$10,$12,$12,$11,$11,$11,$11
direction_lookup_s:
.byte $00,$02,$20,$22,$10,$12,$10,$12,$01,$01,$21,$21,$11,$11,$11,$11
direction_lookup_e:
.byte $00,$01,$10,$11,$22,$21,$12,$11,$00,$01,$10,$11,$22,$21,$12,$11
direction_lookup_w:
.byte $00,$10,$01,$11,$00,$10,$01,$11,$22,$12,$21,$11,$22,$12,$21,$11