dos33fsprogs/joystick/keyboard.s

394 lines
5.2 KiB
ArmAsm

JS_BUTTON_STATE = $01
;==============================
; Handle Keypress
;==============================
handle_keypress:
handle_joystick_first:
check_button:
lda PADDLE_BUTTON0
bpl button_clear
lda JS_BUTTON_STATE
bne js_check
lda #1
sta JS_BUTTON_STATE
lda #' '
jmp check_sound
button_clear:
lda #0
sta JS_BUTTON_STATE
js_check:
jsr handle_joystick
js_check_left:
lda value0
cmp #$20
bcs js_check_right ; if less than 32, left
lda #'A'
bne check_sound
js_check_right:
cmp #$40
bcc js_check_up
lda #'D'
bne check_sound
js_check_up:
lda value1
cmp #$20
bcs js_check_down
lda #'W'
bne check_sound
js_check_down:
cmp #$40
bcc done_joystick
lda #'S'
bne check_sound
done_joystick:
lda KEYPRESS
bmi keypress
jmp no_keypress
keypress:
and #$7f ; clear high bit
cmp #' '
beq check_sound
and #$df ; convert uppercase to lower case
check_sound:
cmp #$14 ; control-T
bne check_joystick
lda SOUND_STATUS
eor #SOUND_DISABLED
sta SOUND_STATUS
jmp done_keypress
; can't be ^J as that's the same as down
check_joystick:
cmp #$10 ; control-P
bne check_load
lda JOYSTICK_ENABLED
eor #1
sta JOYSTICK_ENABLED
jmp done_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 #'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:
inc $c00
; 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
cmp #1
beq right_return
right_uturn:
jsr uturn
jmp no_keypress
right_return:
jsr turn_right
jmp no_keypress
not_right_return:
lda IN_LEFT
beq not_left_return
cmp #1
beq left_return
left_uturn:
jsr uturn
jmp no_keypress
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
; bpl no_split
; split text/graphics
; bit TEXTGR
; also change sprite cutoff
; ldx #40
; stx psc_smc1+1
; stx psc_smc2+1
; jmp done_split
no_split:
; bit FULLGR
; also change sprite cutoff
; ldx #48
; stx psc_smc1+1
; stx psc_smc2+1
done_split:
; and #$f ; mask off special flags
; tay
; lda log2_table,Y
; 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 graphics
bit SET_GR
; reset pointer to not visible, centered
lda #0
sta ANIMATE_FRAME
sta CURSOR_VISIBLE
lda #20
sta CURSOR_X
sta CURSOR_Y
; lda LOCATION
; asl
; tay
; lda (LOCATIONS_L),Y
; sta LOCATION_STRUCT_L
; iny
; lda (LOCATIONS_L),Y
; sta LOCATION_STRUCT_H
jsr change_direction
rts
;==========================
; go forward
;===========================
go_forward:
; update new location
; lda DIRECTION
; and #$f
; tay
; lda log2_table,Y
; clc
; adc #LOCATION_NORTH_EXIT
; tay
; lda (LOCATION_STRUCT_L),Y
; cmp #$ff
; beq cant_go_forward
; sta LOCATION
; update new direction
; lda DIRECTION
; and #$f
; tay
; lda log2_table,Y
; 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
and #$f
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
and #$f
cmp #DIRECTION_N
beq go_east
cmp #DIRECTION_E
beq go_south
cmp #DIRECTION_S
beq go_west
bne go_north
;==========================
; uturn
;===========================
uturn:
lda DIRECTION
and #$f
cmp #DIRECTION_N
beq go_south
cmp #DIRECTION_W
beq go_east
cmp #DIRECTION_S
beq go_north
bne go_west
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