⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 map2fina.asm

📁 VCP201_CODE is a FPGA source code.
💻 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 + -