📄 map2fina.asm
字号:
;==========================================================================
; File Name :
;
; Rev: Date: Author: Reason:
; 1.00 dd-mm-yy nnnnnnnnnnn rrrrrrrrrrrrrrrrrr
;==========================================================================
;------------------------------------------------------------
; Name :
; Parm :
; Retn :
; Desc : $$$$$$$$
;------------------------------------------------------------
outport:
movlw 0xff
movwf temp_buf1
btfss pb_out1,BIT_SEL
bcf temp_buf1,CONT_BIT_SEL
btfss pb_out1,BIT_L3
bcf temp_buf1,CONT_BIT_L3
btfss pb_out1,BIT_R3
bcf temp_buf1,CONT_BIT_R3
btfss pb_out1,BIT_ST
bcf temp_buf1,CONT_BIT_ST
btfss pb_out1,BIT_UP
bcf temp_buf1,CONT_BIT_UP
btfss pb_out1,BIT_RT
bcf temp_buf1,CONT_BIT_RT
btfss pb_out1,BIT_DN
bcf temp_buf1,CONT_BIT_DN
btfss pb_out1,BIT_LT
bcf temp_buf1,CONT_BIT_LT
movlw 0xff
movwf temp_buf2
btfss pb_out0,BIT_L2
bcf temp_buf2,CONT_BIT_L2
btfss pb_out0,BIT_R2
bcf temp_buf2,CONT_BIT_R2
btfss pb_out0,BIT_L1
bcf temp_buf2,CONT_BIT_L1
btfss pb_out0,BIT_R1
bcf temp_buf2,CONT_BIT_R1
btfss pb_out0,BIT_TRI
bcf temp_buf2,CONT_BIT_TRI
btfss pb_out0,BIT_CIR
bcf temp_buf2,CONT_BIT_CIR
btfss pb_out0,BIT_CRO
bcf temp_buf2,CONT_BIT_CRO
btfss pb_out0,BIT_SQU
bcf temp_buf2,CONT_BIT_SQU
btfsc D_A_mode
goto out_pb_analog
movf temp_buf1,W
bsf STATUS,RP0
movwf finadata1
bcf STATUS,RP0
movf temp_buf2,W
bsf STATUS,RP0
movwf finadata2
bcf STATUS,RP0
goto end_mapkey
;----------------------------------
out_pb_analog: ; 1st
bsf STATUS,RP0
clrf fina_index
chk_rx0_4f:
btfss rx0_4f
goto chk_rx1_4f
bcf STATUS,RP0
movf temp_buf1,W
call place_to_finadata
;-----------------------------------
chk_rx1_4f: ; 2nd
bsf STATUS,RP0
btfss rx1_4f
goto chk_RX_4f
bcf STATUS,RP0
movf temp_buf2,W
call place_to_finadata
;-----------------------------------
chk_RX_4f:
bsf STATUS,RP0
btfss RX_4f
goto chk_RY_4f
bcf STATUS,RP0
movlw DEFAULT_AXES
call place_to_finadata
;-----------------------------------
chk_RY_4f:
bsf STATUS,RP0
btfss RY_4f
goto chk_LX_4f
bcf STATUS,RP0
movlw DEFAULT_AXES
call place_to_finadata
;-----------------------------------
chk_LX_4f:
bsf STATUS,RP0
btfss LX_4f
goto chk_RY_4f
bcf STATUS,RP0
movlw DEFAULT_AXES
call place_to_finadata
;-----------------------------------
chk_LY_4f:
bsf STATUS,RP0
btfss LY_4f
goto chk_right_4f
bcf STATUS,RP0
movlw DEFAULT_AXES
call place_to_finadata
;-----------------------------------
chk_right_4f:
bsf STATUS,RP0
btfss right_4f
goto chk_left_4f
bcf STATUS,RP0
movlw pb_right
movwf pb_check
btfsc f_eob
goto chk_right_single
clrw
btfss pb_out1,BIT_RT
movlw 0xff
goto chk_right_final
chk_right_single:
call pb_check_map
chk_right_final:
call place_to_finadata
;-----------------------------------
chk_left_4f:
bsf STATUS,RP0
btfss left_4f
goto chk_up_4f
bcf STATUS,RP0
movlw pb_left
movwf pb_check
btfsc f_eob
goto chk_left_single
clrw
btfss pb_out1,BIT_LT
movlw 0xff
goto chk_left_final
chk_left_single:
call pb_check_map
chk_left_final:
call place_to_finadata
;-----------------------------------
chk_up_4f:
bcf STATUS,RP0
movlw 0x80
movwf sc_tmp1
movlw d'8'
movwf sc_tmp2
chk_value_lp:
movf sc_tmp1,W
bsf STATUS,RP0 ; 9th ~ 16th
andwf data2_4f,W
btfsc STATUS,Z
goto chk_next_4f
bcf STATUS,RP0
movlw HIGH map_4f_table
movwf PCLATH
movf sc_tmp2,W
sublw d'8'
call map_4f_table
movwf pb_check ; W from map_4f_table
btfsc f_eob
goto chk_value_single
clrf temp_buf1
btfss pb_out1,BIT_UP
bsf temp_buf1,7
btfss pb_out1,BIT_DN
bsf temp_buf1,6
btfss pb_out0,BIT_TRI
bsf temp_buf1,5
btfss pb_out0,BIT_CIR
bsf temp_buf1,4
btfss pb_out0,BIT_CRO
bsf temp_buf1,3
btfss pb_out0,BIT_SQU
bsf temp_buf1,2
btfss pb_out0,BIT_L1
bsf temp_buf1,1
btfss pb_out0,BIT_R1
bsf temp_buf1,0
movf temp_buf1,W
andwf sc_tmp1,W
btfss STATUS,Z
movlw 0xff
goto chk_value_final
chk_value_single:
call pb_check_map
chk_value_final:
call place_to_finadata
chk_next_4f:
bcf STATUS,RP0
bcf STATUS,C
rrf sc_tmp1,F
decfsz sc_tmp2,F
goto chk_value_lp
;-----------------------------------
chk_L2_4f:
bsf STATUS,RP0
btfss L2_4f
goto chk_R2_4f
bcf STATUS,RP0
movlw pb_L2
movwf pb_check
btfsc f_eob
goto chk_L2_single
clrw
btfss pb_out0,BIT_L2
movlw 0xff
goto chk_L2_final
chk_L2_single:
call pb_check_map
chk_L2_final:
call place_to_finadata
;-----------------------------------
chk_R2_4f:
bsf STATUS,RP0
btfss R2_4f
goto pb_out_fill_zero
bcf STATUS,RP0
movlw pb_R2
movwf pb_check
btfsc f_eob
goto chk_R2_single
clrw
btfss pb_out0,BIT_R2
movlw 0xff
goto chk_R2_final
chk_R2_single:
call pb_check_map
chk_R2_final:
call place_to_finadata
;-----------------------------------
pb_out_fill_zero:
movlw d'18'
bsf STATUS,RP0
xorwf fina_index,W
bcf STATUS,RP0
btfsc STATUS,Z
goto end_mapkey
clrw
call place_to_finadata
goto pb_out_fill_zero
;-----------------------------------
end_mapkey:
return
;-----------------------------------
map_4f_table:
addwf PCL,F
retlw pb_up
retlw pb_down
retlw pb_triangle
retlw pb_circle
retlw pb_cross
retlw pb_square
retlw pb_L1
retlw pb_R1
retlw pb_R1 ; dummy
;-----------------------------------
; place_to_finadata:
; put the W value to finadata list
; variables used :
;-----------------------------------
place_to_finadata:
movwf temp_buf1
movlw finadata1
movwf FSR
bsf STATUS,RP0
movf fina_index,W
bcf STATUS,RP0
addwf FSR,F
movf temp_buf1,W
movwf INDF
bsf STATUS,RP0
incf fina_index,F
bcf STATUS,RP0
return
;---------------------------------------------
; pb_check_map:
; find out the max value of a designated key's
; analog value.
;---------------------------------------------
pb_check_map:
movlw square_val
movwf temp_buf1
movlw CNTL_POINTER ; pbid_0
movwf temp_buf2
movwf FSR
movlw DATA_POINTER ; E0
movwf temp_buf3
movlw d'12'
movwf byte_count
clrf button_max
pb_map_chk_loop:
movf INDF,W
xorlw 0x01
btfsc STATUS,Z
goto pb_steplength_1
movf INDF,W
xorlw 0x02
btfsc STATUS,Z
goto pb_steplength_2
movf INDF,W
xorlw 0x03
btfsc STATUS,Z
goto pb_steplength_3
goto pb_map_chk_next
pb_steplength_3: ; encode size = 3
movf temp_buf3,W
movwf FSR
movf INDF,W
xorlw 0xff
btfss STATUS,Z
goto pb_map_chk_next
movlw d'8'
movwf sc_byte_count
movlw b'00000001'
movwf sc_shift_byte
pb_steplen_3_lp1:
movf temp_buf3,W
movwf FSR
incf FSR,F
movf INDF,W
andwf sc_shift_byte,W
btfss STATUS,Z
goto step_len_not_max
movf sc_byte_count,W
subwf pb_check,W
btfsc STATUS,Z
call chk_pb_max_value
step_len_not_max:
bcf STATUS,C
rlf sc_shift_byte,F
incf sc_byte_count,F
movlw d'12'
xorwf sc_byte_count,W
btfss STATUS,Z
goto pb_steplen_3_lp1
clrf sc_byte_count
movlw b'00000001'
movwf sc_shift_byte
pb_steplen_3_lp2:
movf temp_buf3,W
addlw d'2'
movwf FSR
movf INDF,W
andwf sc_shift_byte,W
btfss STATUS,Z
goto step_len_not_max2
movf sc_byte_count,W
subwf pb_check,W
btfsc STATUS,Z
call chk_pb_max_value
step_len_not_max2:
bcf STATUS,C
rlf sc_shift_byte
incf sc_byte_count,F
movlw d'8'
xorwf sc_byte_count,W
btfss STATUS,Z
goto pb_steplen_3_lp2
goto pb_map_chk_next
pb_steplength_2: ; encode size = 2
movf temp_buf3,W
movwf FSR
movf INDF,W
andlw 0xf0
xorlw 0xf0
btfss STATUS,Z
goto pb_map_chk_next
movf INDF,W
andlw 0x0f
subwf pb_check,W
btfsc STATUS,Z
call chk_pb_max_value
movf temp_buf3,W
movwf FSR
incf FSR,F
movf INDF,W
andlw 0x0f
subwf pb_check,W
btfsc STATUS,Z
goto chk_pb_max
swapf INDF,W
andlw 0x0f
subwf pb_check,W
btfsc STATUS,Z
call chk_pb_max_value
goto pb_map_chk_next
pb_steplength_1: ; encode size = 1
movf temp_buf3,W
movwf FSR
pb_2_in_1:
movf INDF,W
andlw 0x0f
subwf pb_check,W
btfsc STATUS,Z
goto chk_pb_max
swapf INDF,W
andlw 0x0f
subwf pb_check,W
btfss STATUS,Z
goto pb_map_chk_next
chk_pb_max:
swapf INDF,W ; for force
xorwf INDF,W
btfss STATUS,Z
goto chk_max_val
movlw CNTL_POINTER
subwf temp_buf2,W
bsf STATUS,RP0
movwf force_id
call check_f_id
movf temp_buf1,W ; button pressed ?
movwf FSR
movf INDF,W
btfsc STATUS,Z
goto pb_map_chk_next ; no
movf pforce_0,F
btfsc STATUS,Z
goto chk_max_val ; if force-none preset
btfss pforce_0,1 ; if force-max preset
goto chk_medium_force
movlw 0xff
movwf button_max
goto pb_map_chk_next
chk_medium_force:
btfss pforce_0,0 ; if force-medium
goto chk_max_val
bcf STATUS,C
rrf INDF,W ; FSR still pt to temp_buf1
addlw 0x80 ; x/2 + 7f
movwf f_max_tmp1 ; save data
subwf button_max,W ; if is max ?
btfsc STATUS,C
goto pb_map_chk_next
movf f_max_tmp1,W
movwf button_max
goto pb_map_chk_next
chk_max_val:
call chk_pb_max_value
pb_map_chk_next:
movf temp_buf2,W
movwf FSR
movf INDF,W
addwf temp_buf3,F
incf temp_buf1,F
incf temp_buf2,F
incf FSR,F
decfsz byte_count,F
goto pb_map_chk_loop
movf pb_check,W
sublw 0x07
btfss STATUS,C
goto map_no_autofire
clrw
btfsc f_fire ; if OFF fire period
map_no_autofire:
movf button_max,W
bcf PCLATH,3
call rev_data
bsf PCLATH,3
return
;-----------------------------------
; chk_pb_max_value:
;-----------------------------------
chk_pb_max_value:
movf temp_buf1,W
movwf FSR
movf INDF,W
subwf button_max,W ; re-use delay0 location
btfsc STATUS,C
goto end_chk_pb_max
movf INDF,W
movwf button_max
goto end_chk_pb_max
end_chk_pb_max:
return
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -