📄 firing.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 + -