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

📄 firing.asm

📁 VCP201_CODE is a FPGA source code.
💻 ASM
📖 第 1 页 / 共 2 页
字号:
        decfsz  sk_buf0,F       ;SEE IF PROCESS THIS BIT
        goto    skeyerr         ;THERE MUST BE ERROR IN THE MAP
        btfss   pb_old0,7       ;SEE IF THAT BIT MARKED
        goto    skeynext        ;IF MARKED, SCAN NEXT ASSERTED BUTTON BIT
        bcf     pb_old0,7       ;IF NOT, MARK IT AND THEN EXIT THIS ROUTINE
        goto    skeydone
;
skeyovry:
        movfw   dcode_pb1      	;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:
        movfw   dcode_pb0
        andwf   pb_out0,F

skeynext:                       ;SCAN NEXT ASSERTED BUTTON BIT
        bsf     f_eob           ;ASSUME SINGLE STEP FIRST
        movfw   pbid
        call    nextkey
        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
        movfw   pbid            ;IN CASE MULTI-STEP, RESET PTR_NXT
        call    a_ndx
        movw    ptr_nxt
        btfss   r_st_bit
        bcf     t_st_bit
skeyend:
;        btfss   r_rst_bit
;        bcf     t_rst_bit
        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
        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
        movw    pb_out0
        movw    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
        movfw   dcode_pb0
        movw    pb_out0
        movfw   dcode_pb1
        movw    pb_out1
        bsf     f_newdat
        movfw   dur_step        ;RELOAD STEP COUNTER
        movw    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:
;        btfsc   f_pause         ;ASSERT START IF PAUSE FLAG IS SET
;        bcf     t_st_bit
        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
        clrc
        subwf   ptr_nxt,W
        skpc
        goto    upd_err         ;SET F_MAPBAD IF OUT OF RANGE
;        
        movfw   ptr_nxt
        clrc
        subwf   ptr_end,W       ;CHECK WITH END POINTER
        skpz
        goto    upd_1           ;PROCEED IF NOT EQUAL
        bsf     f_eob           ;SET F_EOB FLAG IF EQUAL
        return
upd_1:
        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 + -