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

📄 pgm.asm

📁 VCP201_CODE is a FPGA source code.
💻 ASM
字号:
;----------------------------
;	PROGRAM FIRE PERIOD
;-----------------------------
pgm_fire:
	movf	key_raw1,W
        bsf	STATUS,RP0
        movwf	pgm_temp1
        bcf	STATUS,RP0

	movf	key_raw0,W
        bsf	STATUS,RP0
        movwf	pgm_temp0
        bcf	STATUS,RP0


	bsf	STATUS,RP0
	movlw	0xff
        xorwf	pgm_raw1,W
        btfss	STATUS,Z
        goto	pgm_main

	movlw	0xff
        xorwf	pgm_raw0,W
       	btfss	STATUS,Z
        goto	pgm_main
        bcf	STATUS,RP0
        return

;loop which key pressed and call out key function
pgm_main:

;	bcf	PCLATH,3
;        call	conver_raw_to_out
;        bsf	PCLATH,3


	bsf	STATUS,RP0	;All in RAM page 1
	movlw	0x08
	movwf	pgm_lp_count        
        clrf	pgm_stage	;key stage value
	clrf	pgm_steps   	;No. of steps for each 
        movlw	0x01
        movwf	pgm_lp_temp	;temp data for loop count

	movlw	0x08		;0108h
        movwf	pgm_N_step	;start address for Digital mode (EEPROM)
	btfss	D_A_mode	;L=digital mode
	goto	pgm_lp1 	;set=analogy mode
        movlw	0x50		;0150h
        movwf	pgm_N_step	;start address for Analog mode (EEPROM)

	movlw	pgm_stage_1st	;start address of pgm_stage
        movwf	FSR

pgm_lp1:
	movf	indf,W
        movwf	temp_stage

	clrf	pgm_force	;----------------
	btfss	temp_stage,7    ;;Force Factor Setting
        goto 	check_force1    ;
    	movlw	0xff            ;
        movwf	pgm_force       ;
        goto	check_pgm_step  ;
                                ;
check_force1:                   ;
	btfss	temp_stage,6    ;
        goto	check_pgm_step  ;
        movlw	0x7f            ;
        movwf	pgm_force       ;
                                ;
check_pgm_step:          	;-----------------
	bcf	temp_stage,7  	;Mask start and select key
        bcf	temp_stage,6	;----------------

				;--------------------		
	movf	temp_stage,W	; Store PGM_steps    
        movwf	pgm_steps  	;no. of step for each
				;----------------

pgm_lp_first:
	movf	pgm_lp_temp,W
        bcf	STATUS,RP0
        andwf	key_raw1,W
        bsf	STATUS,RP0

	;with force and no. of step

        btfsc	STATUS,Z
        call	pgm_key_out	;have pgm key pressed, call out key routine

        bcf	STATUS,C	;Clear Carry flag for loop count
	rlf	pgm_lp_temp,F

	movf	pgm_steps,W
	addwf	pgm_steps,F	;X2
	movf	pgm_steps,W
        addwf	pgm_N_step,F	;next Starting Address

	incf	fsr,f		;key no pressed, increase fsr point	
	decfsz	pgm_lp_count,f
        goto	pgm_lp1

;2nd pgm loop
	movlw	0x06
        movwf	pgm_lp_count
        movlw	0x01
        movwf	pgm_lp_temp   	;temp 0x01 for loop count
	movlw	pgm_stage_2nd	;start address of pgm_stage
        movwf	FSR

pgm_lp2:
	movf	indf,W
	movwf	temp_stage

	clrf	pgm_force	;------------------
                              	;check Force Factor
	btfss	temp_stage,7   	;
	goto	check_force2  	;
	movlw	0xff         	;
	movwf	pgm_force    	;
	goto	check_pgm_step2	;
                             	;
check_force2:               	;
	btfss	temp_stage,6 	;
        goto	check_pgm_step2	;
        movlw	0x7f        	;
	movwf	pgm_force     	;
                           	;-----------------
check_pgm_step2:
	bcf	temp_stage,7  	;Mask Data
        bcf	temp_stage,6  	;Mask Data

	movf	temp_stage,W   	;Store pgm_steps
        movwf	pgm_steps

pgm_lp_second:
	movf	pgm_lp_temp,W
        bcf	STATUS,RP0
     	andwf	key_raw0,W
        bsf	STATUS,RP0

        btfsc	STATUS,C      	;key pressed?  	
        call	pgm_key_out   	;Yes. Call pgm_key_out

        bcf	STATUS,C	;Clear Carry flag for loop count
	rlf	pgm_lp_temp,F

	movf	pgm_steps,W
        addwf	pgm_steps,F	;X2
        movf	pgm_steps,W
        addwf	pgm_N_step,F

        incf	fsr,f		;Increase FSR
        decfsz	pgm_lp_count,F 	;check finished 6?
        goto	pgm_lp2

	clrf	pgm_N_step
	clrf	pgm_steps   	;No. of steps for each 
	bcf	STATUS,RP0
	return

pgm_exit:
	bcf	STATUS,RP0
	return	


;===================================================	
pgm_key_out: 
;pgm_N_step = Starting address of pgm key out
;pgm_steps = no. of steps need to send out
;pgm_force = force factor for keys
;key_out0 = what key out	
;key_out1 = what key out

	movf	fsr,W  		;save FSR for temp
        movwf	pgm_fsr

	movf	pgm_steps,W
	btfsc	STATUS,Z	;check pgm_steps, 0?	
        goto	pgm_no_steps	;Yes, goto
	
;check pgm_steps = 1?
	movlw	0x01
	subwf	pgm_steps,W
	btfsc	STATUS,Z
	goto	pgm_1_steps

;pgm_steps = 2 or more. Send out pgm data to SIO?

pgm_out_lp:
	;Read EEPROM DATA for PGM OUT
	movf	pgm_N_step,W	;Starting address	
	change_to_page2    	;marco for change RAM page
	movwf	FSR
	movf	indf,W
        change_back_page1	;marco for change RAM page
        movwf	pgm_out0	;low byte for pgm_out data from EEPROM

	incf	fsr,F		;increase FSR +1
	change_to_page2		;marco for change RAM page
	movf	indf,W
        change_back_page1
        movwf	pgm_out1

;check pgm data is space
	btfsc	pgm_start_out
	goto	pgm_copy_data
	movlw	0xff
        movwf	pgm_out0
        movwf	pgm_out1

pgm_copy_data:
	movf	pgm_out0,W	;copy to key_out for SIO
	movwf	pgm_out_old0	;store data for next time
        bcf	STATUS,RP0
        movwf	key_out0
        bsf	STATUS,RP0

	movf	pgm_out1,W	;copy to key_out for SIO
	movwf	pgm_out_old1	;store data for next time
      	bcf	STATUS,RP0
        movwf	key_out1
	bsf	STATUS,RP0	

	bcf	STATUS,RP0
	bsf	pgm_led		;call mapkey
        bsf	STATUS,RP0

	bcf	PCLATH,3	;for update SIO data
	call	mapkey
        bsf	PCLATH,3

	bcf	tmrctrl,tmr_en	;Stop timer
        bsf	tmrctrl,tmr_en	;Start again timer

pgm_count_lp:
	btfss	tmrcnt,3	;to count 64ms for next data out
        goto	pgm_count_lp

	nop
        nop

	bcf	STATUS,RP0
	bcf	pgm_led
	bsf	STATUS,RP0

	incf	fsr,F		;increase FSR +1
	decfsz	pgm_N_step,F
        goto	pgm_out_lp

pgm_out_exit:
	movf	pgm_fsr,W
        movwf	fsr

        return
;===================================================
	      
;--------------------------------------
;	No pgm data, out same key_out
;--------------------------------------
pgm_no_steps:

	movf	pgm_fsr,W 
        movwf	fsr

	return

;-----------------------------------------
; pgm data = 1. Means relocte to other key
; need change force factor 
;-----------------------------------------
pgm_1_steps:

	movf	pgm_N_step,W	;Starting address	
	change_to_page2    	;marco for change RAM page
	movwf	FSR
	movf	indf,W
        change_back_page1	;marco for change RAM page
        movwf	pgm_out0	;low byte for pgm_out data from EEPROM

	incf	fsr,F		;increase FSR +1
	change_to_page2		;marco for change RAM page
	movf	indf,W
        change_back_page1
        movwf	pgm_out1

	movf	pgm_out0,W	;copy to key_out for SIO
        bcf	STATUS,RP0
        movwf	key_out0
        bsf	STATUS,RP0
	movf	pgm_out1,W	;copy to key_out for SIO
      	bcf	STATUS,RP0
        movwf	key_out1
	bsf	STATUS,RP0	


	call	pgm_map_force	


	movf	pgm_fsr,W
        movwf	fsr

	return



;-------------------------------------------
;	Force Factor out
;-------------------------------------------
pgm_map_force:
pgm_map_square:
	btfsc	pgm_square_out
	goto	pgm_map_X

	btfsc	pgm_force,7
	goto	pgm_map_square2
	btfss	pgm_force,0
	goto	pgm_map_X

pgm_map_square1:
	movlw	0x7F
	subwf	square_val,W
	btfss	STATUS,C
	goto	pgm_map_X	
	movlw	0x7F
	movwf	square_val
	goto 	pgm_map_X  	  
	
pgm_map_square2:
	movlw	0xff
        movwf	square_val

;-----------------
pgm_map_X:
	btfsc	pgm_X_out
	goto	pgm_map_O

	btfsc	pgm_force,7
	goto	pgm_map_X2
	btfss	pgm_force,0
	goto	pgm_map_O

pgm_map_X1:
	movlw	0x7F
	subwf	X_val,W
	btfss	STATUS,C
	goto	pgm_map_O	
	movlw	0x7F
	movwf	X_val
	goto 	pgm_map_O  	  
	
pgm_map_X2:
	movlw	0xff
        movwf	X_val

;-------------------
pgm_map_O:
	btfsc	pgm_O_out
	goto	pgm_map_tri

	btfsc	pgm_force,7
	goto	pgm_map_O2
	btfss	pgm_force,0
	goto	pgm_map_tri

pgm_map_O1:
	movlw	0x7F
	subwf	O_val,W
	btfss	STATUS,C
	goto	pgm_map_tri	
	movlw	0x7F
	movwf	O_val
	goto 	pgm_map_tri  	  
	
pgm_map_O2:
	movlw	0xff
        movwf	O_val

;-------------------
pgm_map_tri:
	btfsc	pgm_tri_out
	goto	pgm_map_R1

	btfsc	pgm_force,7
	goto	pgm_map_tri2
	btfss	pgm_force,0
	goto	pgm_map_R1

pgm_map_tri1:
	movlw	0x7F
	subwf	tri_val,W
	btfss	STATUS,C
	goto	pgm_map_R1	
	movlw	0x7F
	movwf	tri_val
	goto 	pgm_map_R1  	  
	
pgm_map_tri2:
	movlw	0xff
        movwf	tri_val

;-------------------
pgm_map_R1:
	btfsc	pgm_R1_out
	goto	pgm_map_L1

	btfsc	pgm_force,7
	goto	pgm_map_R12
	btfss	pgm_force,0
	goto	pgm_map_L1

pgm_map_R11:
	movlw	0x7F
	subwf	R1_val,W
	btfss	STATUS,C
	goto	pgm_map_L1	
	movlw	0x7F
	movwf	R1_val
	goto 	pgm_map_L1  	  
	
pgm_map_R12:
	movlw	0xff
        movwf	R1_val

;-------------------
pgm_map_L1:
	btfsc	pgm_L1_out
	goto	pgm_map_R2

	btfsc	pgm_force,7
	goto	pgm_map_L12
	btfss	pgm_force,0
	goto	pgm_map_R2

pgm_map_L11:
	movlw	0x7F
	subwf	L1_val,W
	btfss	STATUS,C
	goto	pgm_map_R2	
	movlw	0x7F
	movwf	L1_val
	goto 	pgm_map_R2  	  
	
pgm_map_L12:
	movlw	0xff
        movwf	L1_val

;-------------------
pgm_map_R2:
	btfsc	pgm_R2_out
	goto	pgm_map_L2

	btfsc	pgm_force,7
	goto	pgm_map_R22
	btfss	pgm_force,0
	goto	pgm_map_L2

pgm_map_R21:
	movlw	0x7F
	subwf	R2_val,W
	btfss	STATUS,C
	goto	pgm_map_L2	
	movlw	0x7F
	movwf	R2_val
	goto 	pgm_map_L2  	  
	
pgm_map_R22:
	movlw	0xff
        movwf	R2_val

;-------------------
pgm_map_L2:
	btfsc	pgm_L2_out
	goto	pgm_map_left

	btfsc	pgm_force,7
	goto	pgm_map_L22
	btfss	pgm_force,0
	goto	pgm_map_left

pgm_map_L21:
	movlw	0x7F
	subwf	L2_val,W
	btfss	STATUS,C
	goto	pgm_map_left	
	movlw	0x7F
	movwf	L2_val
	goto 	pgm_map_left  	  
	
pgm_map_L22:
	movlw	0xff
        movwf	L2_val

;-------------------
pgm_map_Left:
	btfsc	pgm_left_out
	goto	pgm_map_down

	btfsc	pgm_force,7
	goto	pgm_map_left2
	btfss	pgm_force,0
	goto	pgm_map_down

pgm_map_left1:
	movlw	0x7F
	subwf	left_val,W
	btfss	STATUS,C
	goto	pgm_map_down	
	movlw	0x7F
	movwf	left_val
	goto 	pgm_map_down  	  
	
pgm_map_Left2:
	movlw	0xff
        movwf	left_val

;-------------------
pgm_map_down:
	btfsc	pgm_down_out
	goto	pgm_map_right

	btfsc	pgm_force,7
	goto	pgm_map_down2
	btfss	pgm_force,0
	goto	pgm_map_right

pgm_map_down1:
	movlw	0x7F
	subwf	down_val,W
	btfss	STATUS,C
	goto	pgm_map_right	
	movlw	0x7F
	movwf	down_val
	goto 	pgm_map_right  	  
	
pgm_map_down2:
	movlw	0xff
        movwf	down_val

;-------------------
pgm_map_right:
	btfsc	pgm_right_out
	goto	pgm_map_up

	btfsc	pgm_force,7
	goto	pgm_map_right2
	btfss	pgm_force,0
	goto	pgm_map_up

pgm_map_right1:
	movlw	0x7F
	subwf	right_val,W
	btfss	STATUS,C
	goto	pgm_map_up	
	movlw	0x7F
	movwf	right_val
	goto 	pgm_map_up  	  
	
pgm_map_right2:
	movlw	0xff
        movwf	down_val

;-------------------
pgm_map_up:
	btfsc	pgm_up_out
	return

	btfsc	pgm_force,7
	goto	pgm_map_up2
	btfss	pgm_force,0
	return

pgm_map_up1:
	movlw	0x7F
	subwf	up_val,W
	btfss	STATUS,C
	return	
	movlw	0x7F
	movwf	up_val
	return  	  
	
pgm_map_up2:
	movlw	0xff
        movwf	up_val
	
        return

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -