dos33fsprogs/games/tfv/keyboard.s
2021-01-05 23:59:08 -05:00

184 lines
2.8 KiB
ArmAsm

;==============================
; Get Keypress
;==============================
; returns 0 if nothing pressed
; maps joystick to wasd and ' ' and return
; maps arrow keys to wasd
; handles sound enable and joystick enable
JS_BUTTON0 = 1
JS_BUTTON1 = 2
get_keypress:
; first handle joystick
lda JOYSTICK_ENABLED
beq actually_handle_keypress
; only check joystick every-other frame
lda FRAMEL
and #$1
beq actually_handle_keypress
check_button0:
lda PADDLE_BUTTON0
bpl button0_clear
lda JS_BUTTON_STATE
and #JS_BUTTON0
bne check_button1
lda #JS_BUTTON0 ; only register on release
ora JS_BUTTON_STATE
sta JS_BUTTON_STATE
lda #' '
jmp done_keypress
button0_clear:
lda JS_BUTTON_STATE
and #<(~JS_BUTTON0) ; hack
sta JS_BUTTON_STATE
jmp js_check
check_button1:
lda PADDLE_BUTTON1
bpl button1_clear
lda JS_BUTTON_STATE
and #JS_BUTTON1
bne js_check
lda #JS_BUTTON1 ; only register on release
ora JS_BUTTON_STATE
sta JS_BUTTON_STATE
lda #13
jmp done_keypress
button1_clear:
lda JS_BUTTON_STATE
and #<(~JS_BUTTON1)
sta JS_BUTTON_STATE
; jmp js_check
js_check:
jsr handle_joystick
js_check_left:
lda value0
cmp #$20
bcs js_check_right ; if less than 32, left
lda #'A'
jmp done_keypress
js_check_right:
cmp #$40
bcc js_check_up
lda #'D'
jmp done_keypress
js_check_up:
lda value1
cmp #$20
bcs js_check_down
lda #'W'
jmp done_keypress
js_check_down:
cmp #$40
bcc done_joystick
lda #'S'
jmp done_keypress
done_joystick:
actually_handle_keypress:
lda KEYPRESS
bmi keypress
jmp no_keypress
keypress:
and #$7f ; clear high bit
cmp #'A'
bcc check_sound ; make sure not to lose space/ctrl
and #$df ; convert lowercase to uppercase
check_sound:
cmp #$14 ; control-T
bne check_joystick
lda SOUND_STATUS
eor #SOUND_DISABLED
sta SOUND_STATUS
jmp no_keypress
; can't be ^J as that's the same as down
check_joystick:
cmp #'J' ; J
bne check_load
lda JOYSTICK_ENABLED
eor #1
sta JOYSTICK_ENABLED
jmp no_keypress
check_load:
; cmp #$C ; control-L
; bne check_save
; jsr load_game
; jmp done_keypress
check_save:
; cmp #$13 ; control-S
; bne check_left
; jsr save_game
; jmp done_keypress
check_left:
cmp #8 ; left key
bne check_right
left_pressed:
lda #'A'
bne done_keypress
check_right:
cmp #$15 ; right key
bne check_up
right_pressed:
lda #'D'
bne done_keypress
check_up:
cmp #$0B ; up key
bne check_down
up_pressed:
lda #'W'
bne done_keypress
check_down:
cmp #$0A ; down key
bne check_return
down_pressed:
lda #'S'
bne done_keypress
check_return:
jmp done_keypress
no_keypress:
lda #0
done_keypress:
bit KEYRESET
rts