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

📄 map2fina.asm

📁 VCP201_CODE is a FPGA source code.
💻 ASM
字号:
;==========================================================================
; File Name : MAP2FINA.ASM
;
; Rev:   Date:    Author:     Reason:
; 1.00   dd-mm-yy nnnnnnnnnnn rrrrrrrrrrrrrrrrrr
;==========================================================================
outport:
        movlw   0xff
        movwf   temp_buf1
        
        btfss   pb_out1,BIT_SEL
        bcf     temp_buf1,CONT_BIT_SEL
        btfss	D_A_mode
        goto	outport_no_l3_r3
        btfsc	f_alt_vr
        goto	outport_alt_vr
        btfss   r_L3_bit
        bcf     temp_buf1,CONT_BIT_L3
        btfss   r_R3_bit
        bcf     temp_buf1,CONT_BIT_R3
        goto	outport_no_l3_r3
outport_alt_vr:
        btfss   r_R3_bit
        bcf     temp_buf1,CONT_BIT_L3
        btfss   r_L3_bit
        bcf     temp_buf1,CONT_BIT_R3        
outport_no_l3_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 
	btfss	f_arcade		;check aracde stick mode?
	goto	out_pb_analog1		;No

	movlw	0x7f			;For arcade stick mode only
        movwf	xaxis_val	
        movwf	yaxis_val	
        movwf	zaxis_val	
        movwf	raxis_val	

out_pb_analog1:
	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
	movf	zaxis_val,W
	btfsc	f_alt_vr
	movf	xaxis_val,W
	
	call	place_to_finadata
;-----------------------------------	
chk_RY_4f:
	bsf	STATUS,RP0
	btfss	RY_4f
	goto	chk_LX_4f
	bcf	STATUS,RP0
	movf	raxis_val,W
	btfsc	f_alt_vr
	movf	yaxis_val,W

	call	place_to_finadata
;-----------------------------------	
chk_LX_4f:
	bsf	STATUS,RP0
	btfss	LX_4f
	goto	chk_LY_4f
	bcf	STATUS,RP0
	movf	xaxis_val,W
	btfsc	f_alt_vr
	movf	zaxis_val,W
	
	call	place_to_finadata
;-----------------------------------		
chk_LY_4f:
	bsf	STATUS,RP0
	btfss	LY_4f
	goto	chk_right_4f
	bcf	STATUS,RP0
	movf	yaxis_val,W
	btfsc	f_alt_vr
	movf	raxis_val,W

	call	place_to_finadata

;--------------------RIGHT DATA
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:
	clrw
	btfsc	pb_out1,BIT_LT		; if LT is out,
	call	pb_check_map		; then no RT
chk_right_final:	
	call	place_to_finadata

;----------------------LEFT DATA
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

;------------------------UP DATA
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

	call	chk_digital_on
	
	btfss	STATUS,Z
	movlw	0xff

	goto	chk_value_final
	
chk_value_single:
	call	chk_digital_on
	
	btfsc	STATUS,Z
	goto	chk_value_final
	
	movlw	pb_up		; if pb_check = up
	xorwf	pb_check,W
	btfss	STATUS,Z		
	goto	chk_pb_map
	clrw
	btfsc	pb_out1,BIT_DN	; if DN is out,
				; then no UP
chk_pb_map:
	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

;------------------------DOWN DATA
chk_L2_4f:
	bsf	STATUS,RP0
	btfss	L2_4f
	goto	chk_R2_4f
	bcf	STATUS,RP0
	
	movlw	pb_L2
	movwf	pb_check

	clrw	
	btfsc	f_eob
	goto	chk_L2_single
	btfss	pb_out0,BIT_L2
	movlw	0xff
	goto	chk_L2_final
chk_L2_single:
	btfss	pb_out0,BIT_L2		
	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
	
	clrw
	btfsc	f_eob
	goto	chk_R2_single
	btfss	pb_out0,BIT_R2
	movlw	0xff
	goto	chk_R2_final
chk_R2_single:		
	btfss	pb_out0,BIT_R2
	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
;-----------------------------------
	org	0xe00
map_4f_table:
	addwf	PCL,F
        nop
	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

;-----------------------------------
; chk_digital_on:
; check if digital button is on
;-----------------------------------
chk_digital_on:	
	clrf	temp_buf1		; if multi-step,
	btfss	pb_out1,BIT_UP		; set to max
	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
	
	return
	
;-----------------------------------
; 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	PBMAX
	movwf	byte_count
	
	clrf	button_max
	
pb_map_chk_loop:		; check the step length
	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,F
	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
	
	return

;------------------------------------------
; chk_pb_max_value:
; if > button_max, place to button_max
;------------------------------------------
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 + -