📄 firing.asm
字号:
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 + -