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

📄 firing.asm

📁 VCP201_CODE is a FPGA source code.
💻 ASM
字号:
;****************************************************************************
;FUNCTION: THIS SUBROUTINE IS TO MASK THE PB_RAW BUFFER TO IMPLEMENT AUTO
;          FIRE FUNCTION WHEN AUTO FIRE IS ACTIVATED, PRESSING THAT BUTTON 
;          WILL ALSO SET THE AUTO LED TO BLINK.
;FILENAME: C:\PROJECTS\SV363\FIRING.ASM
;ROUTINE NAME: PRE_KEY
;INPUT: NIL
;OUTPUT: MASK PB_RAW BUFFERS AND PB_OLD BUFFERS TO ALLOW AUTO FIRING
;        BLINK AUTO LED IF PRESSED BUTTON IS SET TO AUTO FIRE.
;RAM AFFECTED:
;SUBROUTINE CALL: NIL
;****************************************************************************
;
pre_key:
        btfss   f_autled1       ;CHECK TO SEE IF ANY AUTO FIRE SELECTED
        goto    pk_1            ;IF SELECTED, TURN LED TO BLINK
        comf    pb_raw0,W       ;USE (PB_RAW OR PB_AUTO) = O -> NO AUTO
        andwf	pb_auto0_mask,W ;BUTTON PRESSED
	btfss	STATUS,Z	;skpz                    
        goto    pk_blink        
        bcf     f_autled2       ;DO NOT BLINK LED IF ZERO
        comf    pb_raw1,W       ;USE (PB_RAW OR PB_AUTO) = O -> NO AUTO
	andwf   pb_auto1_mask,W ;BUTTON PRESSED
	btfsc	STATUS,Z	;        skpnz
        goto    pk_1            ;DO NOT BLINK LED IF NOT ZERO
pk_blink:        
        bsf     f_autled2      
pk_1:
        btfsc   f_fire          ;SEE IF NOW IS FIRING PERIOD
        goto    pk_fire_on

	movf	pb_auto1_mask,W
       	iorwf   pb_raw1,F
        movf	pb_auto0_mask,W
        iorwf   pb_raw0,F       ;AUTO FIRE BUTTON TO GENERATE AUTO FIRE

pk_fire_on:
        movf   pb_raw0,W         ;USE PB_OLD = (PB_RAW OR PB_OLD) TO MARK
        iorwf   pb_old0,F       ;THE BUTTON WHICH HAS BEEN PROCESSED BY
        movf   pb_raw1,W         ;THE SCANKEY ROUTINE
        iorwf   pb_old1,F

        return

;
;
;****************************************************************************
;FUNCTION: THIS SUBROUTINE IS TO SCAN THE ASSERTED BIT AND CONVERT IT INTO
;          BUTTON PATTERN.  IT SCANS THE ASSERTED BIT IN THE PB_RAW BUFFERS.
;          IT CHECKS TO SEE IF THE ASSERTED BIT REPRESENTS A MULTI-STEP OR
;          A SINGLE STEP BUTTON.  IF IT IS A MULTI-STEP BUTTON, IT USES THE
;          PB_OLD BUFFERS TO MARK THE PROCESSED BUTTON AND SET THE F_EOB FLAG
;          FOR THE FIRESTEP TO PROCESS. IF IT IS A SINGLE STEP, IT WILL COPY 
;          THE BUTTON PATTERN TO THE PB_OUT BUFFERS.
;FILENAME: C:\PROJECTS\SV363\FIRING.ASM
;ROUTINE NAME: SCANKEY
;INPUT: PB_RAW0, PB_RAW1
;OUTPUT: CLEAR BITS IN PB_OUT0 & PB_OUT1, AND SET F_EOB FLAG FOR SINGLE STEP
;        MARKS PROCESSED BITS IN PB_OLD0 & PB_OLD1, AND CLEAR F_EOB FOR 
;        MULTI-STEP
;RAM AFFECTED: 6AH
;SUBROUTINE CALL: A_NDX, NEXTKEY, DECODE, UPD_EOB, 
;****************************************************************************
;
#define         sk_buf0         data_length     ;LOCATION 6A
;
scankey:
        movlw   0xff            ;RESET OUTPUT BUFFERS
        movwf    pb_out0
        movwf    pb_out1
        bsf     f_eob           ;PRESET TO SINGLE STEP IN CASE NO BUTTON
        movlw   0x0f            ;SCAN WHICH BIT ASSERTED FROM THE BEGINNING
        call    nextkey         ;CARRY SET IF NO ASSERTED BIT FOUND
				;at prockey.asm        				
	btfsc	STATUS,C	;        skpnc
        goto    skeyend         ;DO NOTHING IF NO ASSERTED BIT FOUND

skeyloop:
        bsf     f_pbpress       ;SET BUTTON PRESSED FLAG
        movwf    pbid            ;STORE THE ASSERTED BIT LOCATION TO PBID
        call    a_ndx           ;LOCATION THE CORRESPONDING DATA POINTER
				;at prockey.asm
	btfsc	STATUS,C	;skpnc      ;CARRY SET IF DATA AREA ERROR DETECTED
        goto    skeyerr
        movwf    ptr_nxt         ;STORE THE VALID DATA POINTER TO PTR_NXT
        incf    pbid,W          ;FIND THE NEXT DATA POINTER TO LOCATE THE
        call    a_ndx           ;END POINTER
	btfsc	STATUS,C	;skpnc
        goto    skeyerr
        movwf    ptr_end
        call    decode          ;DECODE THE STEP INFO TO BUTTON PATTERN AND
                                ;UPDATE THE NEXT POINTER VALUE
        call    upd_eob         ;CHECK TO SEE IF SINGLE STEP OR LAST BUTTON
                                ;BUTTON DATA REACHED ==> SET F_EOB
        btfsc   f_eob           ;SKIP IF MULTI STEP FOUND
        goto    skeyovry        ;GOTO SINGLE STEP PROCESSING

        movf   pbid,W            ;USE THE SK_BUF0 AS BIT COUNTER
        movwf    sk_buf0
	bcf	STATUS,C	;        clrc
        sublw   d'7'            ;SEE IF PBID > 7 --> USE PB_OLD1,ELSE PB_OLD0
	btfsc	STATUS,C	;        skpnc
        goto    sc_key1         ;USE PB_OLD0 IF BIT COUNTER < OR = 7
        movlw   d'8'            ;ADJUST THE BIT COUNTER
        subwf   sk_buf0,F
	btfss	STATUS,Z	;        skpz
        goto    sc_chk9
        btfss   pb_old1,0       ;SEE IF THAT BIT MARKED
        goto    skeynext        ;IF MARKED, SCAN NEXT ASSERTED BUTTON BIT
        bcf     pb_old1,0       ;IF NOT, MARK IT AND THEN EXIT THIS ROUTINE
        movlw   0x01
        movwf   tmr_step        ;RESET STEP COUNTER TO ENABLE IMMEDIATE ACTION
        goto    skeydone
sc_chk9:
	movlw	b'11111101'
	movwf	temp_buf1
	movlw	d'5'
	movwf	temp_buf2
	
sc_chk9_lp:
        decfsz  sk_buf0,F       ;SEE IF PROCESS THIS BIT
        goto    sc_chk9_next    ;IF NOT CHECK NEXT BIT
	comf	temp_buf1,W
	andwf	pb_old1,W	;see if that bit MARKED
        btfsc   STATUS,Z       	;SEE IF THAT BIT MARKED
        goto    skeynext        ;IF MARKED, SCAN NEXT ASSERTED BUTTON BIT
	movf	temp_buf1,W
	andwf	pb_old1,F
        goto    skeydone

sc_chk9_next:
	bsf	STATUS,C
	rlf	temp_buf1,F
	decfsz	temp_buf2,F
	goto	sc_chk9_lp
	goto	skeyerr		;IF NOT, THERE MUST BE ERROR

sc_key1:                        ;PROCESS PB_OLD0
      	movf	sk_buf0,W	;  tstf    sk_buf0
	btfss	STATUS,Z	;        skpz
        goto    sc_chk1
        btfss   pb_old0,0       ;SEE IF THAT BIT MARKED
        goto    skeynext        ;IF MARKED, SCAN NEXT ASSERTED BUTTON BIT
        bcf     pb_old0,0       ;IF NOT, MARK IT AND THEN EXIT THIS ROUTINE
        goto    skeydone

sc_chk1:
	movlw	b'11111101'
	movwf	temp_buf1
	movlw	d'7'
	movwf	temp_buf2
	
sc_chk1_lp:
        decfsz  sk_buf0,F       ;SEE IF PROCESS THIS BIT
        goto    sc_chk1_next    ;IF NOT CHECK NEXT BIT
	comf	temp_buf1,W
	andwf	pb_old0,W	;see if that bit MARKED
        btfsc   STATUS,Z       	;SEE IF THAT BIT MARKED
        goto    skeynext        ;IF MARKED, SCAN NEXT ASSERTED BUTTON BIT
	movf	temp_buf1,W
	andwf	pb_old0,F
        goto    skeydone

sc_chk1_next:
	bsf	STATUS,C
	rlf	temp_buf1,F
	decfsz	temp_buf2,F
	goto	sc_chk1_lp
	goto	skeyerr		;IF NOT, THERE MUST BE ERROR

skeyovry:
        movf   dcode_pb1,W     	;OVERLAY THE DECODED BIT PATTERN ONTO THE
        andwf   pb_out1,F       ;OUTPUT BUFFERS
        andlw   0x0f
        xorlw   0x0f
        btfsc   STATUS,Z
        goto    skey_no_dir
       	movf    pbid,W
        movwf   temp_buf1
        call    auto_chk_dir

skey_no_dir:
        movf   dcode_pb0,W
        andwf   pb_out0,F

skeynext:                       ;SCAN NEXT ASSERTED BUTTON BIT
        bsf     f_eob           ;ASSUME SINGLE STEP FIRST
        movfw   pbid
        call    nextkey		;at prockey.asm        				
	btfss	STATUS,C	;skpc ;EXIT IF NO MORE BUTTON BIT SET
        goto    skeyloop        ;LOOP AGAIN IF NEXT BUTTON BIT ASSERTED

skeydone:                       ;SET START BIT AFTER ALL BITS SCANNED
        movf   pbid,W            ;IN CASE MULTI-STEP, RESET PTR_NXT
        call    a_ndx
        movwf    ptr_nxt
        btfss   r_st_bit
        bcf     t_st_bit
skeyend:
        btfss   r_st_bit
        bcf     t_st_bit
        btfss	pb_raw1,BIT_SEL
        bcf	pb_out1,BIT_SEL
        bsf     f_newdat        ;SET F_NEWDAT TO INDICATE NEW DATA AVAILABLE
skeyerr:        
        return

;
;****************************************************************************
;FUNCTION: THIS SUBROUTINE IS TO PROCESS MULTI-STEP FIRE BUTTONS.  WHEN THE 
;          FIRE BUTTON IS FOUND TO BE MULTI-STEP, THIS ROUTINE WILL BE CALLED
;          IT WILL DECODE AND FIRE EACH STEP OF THE BUTTON UNTIL FINISHED.
;          AFTER THE LAST STEP FINISHED, IT WILL ALSO FIRE AN IDLE CODE.  
;          THE WILL ENABLE AUTO FIRE FUNCTION TO BE ACHIEVED FOR MULTI-STEP
;          BUTTONS.  CURRENT STEP POINTER IS OBTAINED FROM THE PTR_NXT AND ON
;          EXIT, THE NEXT STEP POINTER WILL BE OVERWRITTEN ONTO THE PTR_NXT
;          AND THE DECODED STEP WILL BE PLACED ONTO OUTPUT BUFFERS. WHEN THE
;          LAST STEP HAS BEEN DONE THE END OF BUTTON FLAG, F_EOB, WILL ALSO
;          BE SET TO INDICATE FIRING OF THAT MULTI-STEP BUTTON FINISHED.
;FILENAME: C:\PROJECTS\SV363\FIRING.ASM
;ROUTINE NAME: FIRESTEP
;INPUT: PTR_NXT
;OUTPUT: DECODED PATTERN LOADED TO PB_OUT BUFFERS
;        POINTER NOW POINTS AT NEXT STEP. IF LAST STEP DONE, F_EOB SET.
;RAM AFFECTED:
;SUBROUTINE CALL: UPD_EOB, DECODE
;****************************************************************************
;
firestep:
        tstf    tmr_step        ;PROCESS ONLY AFTER STEP DURATION EXHAUSTED
;	movf	tmr_step,W
	btfss	STATUS,Z	;skpz
        goto    fstepend

        btfsc   f_space         ;SEE IF AN IDLE PERIOD ISSUED
        goto    fst_end2        ;FINISHED A MULTI-STEP IF IDLE PERIOD ISSUED
        btfsc   f_eob           ;SEE IF LAST STEP DONE ==> F_EOB = 1
        goto    fstepend

        call    upd_eob         ;CHECK AND UPDATE END OF BUTTON FLAG        
        btfss   f_eob
        goto    fst_pb          ;OUTPUT DECODED DATA IF NOT END OF BUTTON

        bcf     f_eob           ;MASK END OF BUTTON FLAG TO ENABLE IDLE ISSUED
        movlw   0xff            ;FIRE AN IDLE PERIOD
        movwf    pb_out0
        movwf    pb_out1
        bsf     f_newdat        ;SET FLAG TO INDICATE NEW DATA FOR FIRE
        bsf     f_space         ;SET FLAG TO INDICATE IDLE PERIOD ISSUED
        goto    fstepend
fst_pb:
        call    decode          ;DECODE STEP INFO INTO FIRE BIT PATTERN
        movf   	dcode_pb0,W
        movwf    pb_out0
        movf   	dcode_pb1,W
        movwf    pb_out1
        bsf     f_newdat
        movf   	dur_step,W        ;RELOAD STEP COUNTER
        movwf    tmr_step
        goto    fstepend
fst_end2:
        bcf     f_space         ;RESET FIRE A SPACE FLAG
        bsf     f_eob           ;SET END OF BUTTON FLAG
fstepend:
        return

;
;****************************************************************************
;FUNCTION: THIS SUBROUTINE IS TO MASK THE UP AND DOWN BIT AND THE LEFT AND
;          RIGHT BIT TO PREVENT THE TWO BITS TO BE FIRE AT THE SAME TIME.
;          WHEN UP AND DOWN IS TO BE FIRED ONLY DOWN WILL BE FIRED. WHEN LEFT
;          AND RIGHT IS TO BE FIRED, ONLY LEFT WILL BE FIRED. THIS ROUTINE 
;          WILL ALSO TOGGLE START BIT IF SLOW FUNCTION IS ACTIVATED.
;FILENAME: C:\PROJECTS\SV363\FIRING.ASM
;ROUTINE NAME: POST_KEY
;INPUT: PB_OUT0 & PB_OUT1
;OUTPUT: IF UP & DOWN ASSERTED, ONLY DOWN WILL BE ASSERTED
;        IF LEFT & RIGHT ASSERTED, ONLY LEFT WILL BE ASSERTED
;        ASSERT START BIT WHEN THE PAUSE FLAG IS SET.
;RAM AFFECTED:
;SUBROUTINE CALL: NIL
;****************************************************************************
post_key:
        btfss   t_up_bit        ;CHECK UP AND DOWN BIT, IF BOTH ASSERTED
        btfsc   t_dn_bit        ;ONLY ASSERT DOWN BIT
        goto    postkey1
        bsf     t_up_bit
postkey1:
        btfss   t_rt_bit        ;CHECK RIGHT AND LEFT BITS, IF BOTH ASSERTED
        btfsc   t_lt_bit        ;ONLY ASSERT LEFT BIT
        goto    postkey2
        bsf     t_rt_bit
postkey2:
        return


;****************************************************************************
;FUNCTION: THIS ROUTINE IS TO UPDATE THE END_OF_BUTTON FLAGE, F_EOB. THE
;          INPUT IS CURRENT STEP POINTER.  IF THE CURRENT STEP POINTER IS
;          EQUAL TO THE END POINTER, F_EOB WILL BE SET.  THIS ROUTINE WILL
;          DETECT THE BUTTON DATA IS CORRUPTED AND SET F_MAPBAD AS NEEDED.
;FILENAME: C:\PROJECTS\SV363\FIRING.ASM
;ROUTINE NAME: UPD_EOB
;INPUT: PTR_NXT = CURRENT STEP POINTER
;OUTPUT: F_EOB = 1, IF CURRENT STEP POINTER = END_POINTER
;        F_EOB = 0, IF CURRENT STEP POINTER < END_POINTER
;        F_MAPBAD = 1, IF CURRENT STEP POINTER > END_POINTER
;                  OR, IF END_POINTER > DATA MEMORY TOP
;RAM AFFECTED: PRT_STEP
;SUBROUTINE CALL: NIL
;****************************************************************************
;
upd_eob:
        bcf     f_eob           ;DEFAULT CLEAR F_EOB FLAG
        movlw   DATA_POINTER    ;SEE IF CURRENT STEP POINTER OUT OF DATA AREA
	bcf	STATUS,C	;clrc
        subwf   ptr_nxt,W
	btfss	STATUS,C	;skpc
        goto    upd_err         ;SET F_MAPBAD IF OUT OF RANGE
        
        movf   	ptr_nxt,W
	bcf	STATUS,C	;clrc
        subwf   ptr_end,W       ;CHECK WITH END POINTER
	btfss	STATUS,Z	;skpz
        goto    upd_1           ;PROCEED IF NOT EQUAL
        bsf     f_eob           ;SET F_EOB FLAG IF EQUAL
        return
upd_1:
	btfsc	STATUS,C	;skpnc
        return
upd_err:
        bsf     f_mapbad        ;IF END POINTER NOT IN DATA AREA SET F_MAPBAD
        bsf     f_eob           ;AND ALSO SET F_EOB.
        return

⌨️ 快捷键说明

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