;============================== ; Handle Keypress ;============================== handle_keypress: lda KEYPRESS bmi keypress jmp no_keypress keypress: and #$7f ; clear high bit check_left: cmp #'A' beq left_pressed cmp #8 ; left key bne check_right left_pressed: dec CURSOR_X jmp done_keypress check_right: cmp #'D' beq right_pressed cmp #$15 ; right key bne check_up right_pressed: inc CURSOR_X jmp done_keypress check_up: cmp #'W' beq up_pressed cmp #$0B ; up key bne check_down up_pressed: dec CURSOR_Y dec CURSOR_Y jmp done_keypress check_down: cmp #'S' beq down_pressed cmp #$0A bne check_return down_pressed: inc CURSOR_Y inc CURSOR_Y jmp done_keypress check_return: cmp #' ' beq return_pressed cmp #13 bne done_keypress return_pressed: lda IN_SPECIAL beq not_special_return special_return: jsr handle_special ; special case, don't make cursor visible jmp no_keypress not_special_return: lda IN_RIGHT beq not_right_return right_return: jsr turn_right jmp no_keypress not_right_return: lda IN_LEFT beq not_left_return left_return: jsr turn_left jmp no_keypress not_left_return: jsr go_forward jmp no_keypress done_keypress: lda #1 ; make cursor visible sta CURSOR_VISIBLE no_keypress: bit KEYRESET rts ;============================ ; handle_special ;=========================== ; set up jump table fakery handle_special: ldy #LOCATION_SPECIAL_FUNC+1 lda (LOCATION_STRUCT_L),Y pha dey lda (LOCATION_STRUCT_L),Y pha rts ;============================= ; change direction ;============================= change_direction: ; load background lda DIRECTION asl clc adc #LOCATION_NORTH_BG tay lda (LOCATION_STRUCT_L),Y sta LZSA_SRC_LO iny lda (LOCATION_STRUCT_L),Y sta LZSA_SRC_HI lda #$c ; load to page $c00 jsr decompress_lzsa2_fast rts ;============================= ; change location ;============================= change_location: ; reset pointer to not visible, centered lda #0 sta CURSOR_VISIBLE lda #20 sta CURSOR_X sta CURSOR_Y lda LOCATION asl tay lda locations,Y sta LOCATION_STRUCT_L lda locations+1,Y sta LOCATION_STRUCT_H jsr change_direction rts ;========================== ; go forward ;=========================== go_forward: ; update new location lda DIRECTION clc adc #LOCATION_NORTH_EXIT tay lda (LOCATION_STRUCT_L),Y cmp #$ff beq cant_go_forward sta LOCATION ; update new direction lda DIRECTION clc adc #LOCATION_NORTH_EXIT_DIR tay lda (LOCATION_STRUCT_L),Y sta DIRECTION jsr change_location cant_go_forward: rts ;========================== ; turn left ;=========================== turn_left: lda DIRECTION cmp #DIRECTION_N beq go_west cmp #DIRECTION_W beq go_south cmp #DIRECTION_S beq go_east bne go_north ;========================== ; turn right ;=========================== turn_right: lda DIRECTION cmp #DIRECTION_N beq go_east cmp #DIRECTION_E beq go_south cmp #DIRECTION_S beq go_west bne go_north go_north: lda #DIRECTION_N jmp done_turning go_east: lda #DIRECTION_E jmp done_turning go_south: lda #DIRECTION_S jmp done_turning go_west: lda #DIRECTION_W jmp done_turning done_turning: sta DIRECTION jsr change_direction rts