;============================== ; 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