?? scaleste.asm
字號:
;=================================================
; File name : ScaleSen.asm
; For PSX2 PF113X GamePad
; Input Data :
; Return :
;=================================================
scalesen:
movf FSR,W ; save FSR
movwf sc_tmp3
movlw d'14' ;d'14'
movwf byte_count
bsf STATUS,RP0
movf sen_null,W
bcf STATUS,RP0
movwf vr_null
; movlw square_val
; movwf FSR
scalesen_lp1:
movlw HIGH fsr_in
movwf PCLATH
movf byte_count,W
sublw d'14'
movwf sc_tmp1 ;X2
addwf sc_tmp1,W
call fsr_in
; movf INDF,W
bcf STATUS,RP0
movwf vr_value
call adj_sen
sublw 0xff
movwf vr_value
movlw HIGH fsr_out
movwf PCLATH
movf byte_count,W
sublw d'14'
movwf sc_tmp1
addwf sc_tmp1,F
addwf sc_tmp1,W
call fsr_out
bcf STATUS,RP0
decfsz byte_count,F
goto scalesen_lp1
return
; goto convert_key
;right_data ----------------------------------------
; bsf STATUS,RP0
; movf right_val,W
; bcf STATUS,RP0
; movwf vr_value
;
; call adj_sen
; sublw 0xff
;
; bsf STATUS,RP0
;
; movwf right_val
;
;left_data ----------------------------------------
; movf left_val,W
; bcf STATUS,RP0
; movwf vr_value
;
; call adj_sen
; sublw 0xff
;
; bsf STATUS,RP0
; movwf left_val
;up_data -----------------------------------------
; movf up_val,W
; bcf STATUS,RP0
; movwf vr_value ;up_val -> vr_value
;
;; call adj_sen
; sublw 0xff
;
; bsf STATUS,RP0
; movwf up_val
;
;down_data -----------------------------------------
; movf down_val,W
; bcf STATUS,RP0
; movwf vr_value ;down_val -> vr_value
;
; call adj_sen
; sublw 0xff
;
; bsf STATUS,RP0
; movwf down_val
;TRI_data -------------------------------------------
; movf tri_val,W
; bcf STATUS,RP0
; movwf vr_value
;
; call adj_sen
; sublw 0xff
;
; bsf STATUS,RP0
; movwf tri_val
;O_data ----------------------------------------------
; movf O_val,W
; bcf STATUS,RP0
; movwf vr_value ;down_val -> vr_value
;
; call adj_sen
; sublw 0xff
;
; bsf STATUS,RP0
; movwf O_val
;
;X_data ------------------------------------------
; movf X_val,W
; bcf STATUS,RP0
; movwf vr_value
;;
; call adj_sen
; sublw 0xff
;
; bsf STATUS,RP0
; movwf X_val
;SQUARE_data ----------------------------------------
; movf square_val,W
; bcf STATUS,RP0
; movwf vr_value
;
; call adj_sen
; sublw 0xff
;
; bsf STATUS,RP0
; movwf square_val
;L1_data ------------------------------------------
; movf L1_val,W
; bcf STATUS,RP0
; movwf vr_value
;
; call adj_sen
; sublw 0xff
;
; bsf STATUS,RP0
;; movwf L1_val
;R1_data -------------------------------------------
; movf R1_val,W
; bcf STATUS,RP0
; movwf vr_value
;;
; call adj_sen
; sublw 0xff
;
; bsf STATUS,RP0
; movwf R1_val
;L2_data --------------------------------------------
; movf L2_val,W
; bcf STATUS,RP0
; movwf vr_value
;
; call adj_sen
; sublw 0xff
;
; bsf STATUS,RP0
; movwf L2_val
;R2_data -------------------------------------------
; movf R2_val,W
; bcf STATUS,RP0
; movwf vr_value
;
; call adj_sen
; sublw 0xff
;
; bsf STATUS,RP0
; movwf R2_val
;E1_data -------------------------------------------
; movf E1_val,W
; bcf STATUS,RP0
; movwf vr_value
;
; call adj_sen
; sublw 0xff
;
; bsf STATUS,RP0
;; movwf E1_val
;E2_data -------------------------------------------
; movf E2_val,W
; bcf STATUS,RP0
; movwf vr_value
;
; call adj_sen
; sublw 0xff
;
; bsf STATUS,RP0
; movwf E2_val
; bcf STATUS,RP0
;
; bcf auto_led
;
; return
;====================================
convert_key:
movlw 0x3f
iorwf pb_raw1,F
movlw 0xff
movwf pb_raw0 ; clr up,dn,rt,lf
left_to_E2_bit:
movlw b'11111110'
movwf sc_tmp1
movlw d'6'
movwf sc_tmp2
bsf STATUS,RP0
movlw left_val
movwf FSR
bcf STATUS,RP0
pb_button_lp1:
movf INDF,W
btfsc STATUS,Z
goto pb_button_next1
movf sc_tmp1,W
andwf pb_raw1,F
pb_button_next1:
incf FSR,F
bsf STATUS,C
rlf sc_tmp1,F
decfsz sc_tmp2,F
goto pb_button_lp1
square_to_L2_bit:
movlw b'11111110'
movwf sc_tmp1
bsf STATUS,RP0
movlw square_val
movwf FSR
bcf STATUS,RP0
pb_button_lp2:
movf INDF,W
btfsc STATUS,Z
goto pb_button_next2
movf sc_tmp1,W
andwf pb_raw0,F
pb_button_next2:
incf FSR,F
bsf STATUS,C
rlf sc_tmp1,F
btfsc STATUS,C
goto pb_button_lp2
end_convert_key:
bcf STATUS,RP0
movf sc_tmp3,W ;restore FSR
movwf FSR
return
;===============================================
; Adject Senser value
; (Value - min x FF)/(null-min)=new value
; 0-----min--------value--------null----FF
; range:max_sen----------------null
;==============================================
adj_sen:
subwf vr_null,W ;Value > Null ?
btfsc STATUS,C ;-ve ?
goto adj_senser1 ;No
movlw 0xff ;Yes. Out FF
return
adj_senser1:
btfss STATUS,Z ;Value=Null?
goto adj_senser2 ;No
movlw 0xff ;Yes. Out FF
return
adj_senser2:
movlw 0x50 ;MAX_SEN ;Value < min?
subwf vr_value,W
btfsc STATUS,C ;-ve?
goto adj_senser3 ;No
movlw 0x00 ;Yes. return min 00
return
adj_senser3:
btfss STATUS,Z ;Value=min 0?
goto adj_senser4
movlw 0x00 ;Yes, Out 00
return
adj_senser4:
movlw 0xff
movwf lo_byte
movlw 0x50 ; MAX_SEN
subwf vr_value,W
movwf hi_byte
call umul
movlw 0x50 ;MAX_SEN
subwf vr_null,W
bsf STATUS,RP0
movwf divisor
bcf STATUS,RP0
call udiv
movf lo_byte,W
return
;----------------------------------------
;set_sen_null
; reset the null value
; find the min value and save to sen_null
; if < 0x80, then preset to 0x80
;----------------------------------------
set_sen_null:
call read_sen
movlw 0xff ; place max value to null
movwf vr_null
movlw square_val
movwf FSR
movlw PBMAX ;max no of key =14 count
movwf byte_count
sen_null_lp:
movf INDF,W
subwf vr_null,W ; compare with sen_null
btfss STATUS,C
goto sen_null_next
movf INDF,W
movwf vr_null ; > sen_null, place to sen_null
sen_null_next:
incf FSR,F
decfsz byte_count,F
goto sen_null_lp
movlw MIN_OFFSET
btfss vr_null,7
goto null_too_small
movlw NULL_OFFSET ; OFFSET
subwf vr_null,W
null_too_small:
bsf STATUS,RP0
movwf sen_null
bcf STATUS,RP0
return
;---------------------------------
;adj_40_sen:
;adjust the scale from command 40
;usage : 0 : x1.5, 1 : x1.25
; 2 : x1.125, 3 : x1
;---------------------------------
adj_40_sen:
movlw square_val
movwf sc_tmp1
movlw ana_sen_1
movwf FSR
; movlw PBMAX ;14h count
movlw d'12'
movwf byte_count
adj_sen_lp1:
movf INDF,W
movwf sc_tmp3 ; scale value
btfsc byte_count,0
swapf sc_tmp3,F
movlw 0x0f
andwf sc_tmp3,F
movf FSR,W ; save FSR (scale val pointer)
movwf sc_tmp2
movlw HIGH map_sc_table
movwf PCLATH
movf byte_count,W
sublw d'12' ;PBMAX
call map_sc_table
addwf sc_tmp1,W
movwf FSR
movf INDF,W
movwf lo_byte ; vr_value
movf sc_tmp3,W
btfss STATUS,Z
goto chk_scale_1
movlw d'150'
goto scale_40_exe
chk_scale_1:
movlw 0x01 ; 01
xorwf sc_tmp3,W
btfss STATUS,Z
goto chk_scale_2
movlw d'125'
goto scale_40_exe
chk_scale_2:
movlw 0x02 ; 02
xorwf sc_tmp3,W
btfss STATUS,Z
goto chk_scale_3
movlw d'113'
goto scale_40_exe
chk_scale_3:
movlw d'100'
scale_40_exe:
movwf hi_byte
call umul
bsf STATUS,RP0
movlw d'100'
movwf divisor
bcf STATUS,RP0
call udiv
movf hi_byte,W
movlw 0xff ; not affect Z
btfsc STATUS,Z
movf lo_byte,W
movwf INDF
scale_40_exe_done:
movf sc_tmp2,W ; restore FSR
movwf FSR
btfsc byte_count,0 ; inc scale-val ptr
incf FSR,F ; every two lp
test:
decfsz byte_count,F
goto adj_sen_lp1
return
map_sc_table:
addwf PCL,F
retlw d'10' ; right
retlw d'8' ; left
retlw d'11' ; up
retlw d'9' ; down
retlw d'3' ; triangle
retlw d'2' ; O
retlw d'1' ; X
retlw d'0' ; square
retlw d'5' ; L1
retlw d'4' ; R1
retlw d'6' ; R2
retlw d'7' ; L2
retlw d'0' ; dummy
return
;--------------------------------------
fsr_in:
addwf PCL,F
bsf STATUS,RP0
movf square_val,W
return
movf X_val,W
return
movf O_val,W
return
movf tri_val,W
return
movf R1_val,W
return
movf L1_val,W
return
movf R2_val,W
return
movf L2_val,W
return
movf left_val,W
return
movf down_val,W
return
movf right_val,W
return
movf up_val,W
return
movf E1_val,W
return
movf E2_val,W
return
;-------------
fsr_out:
addwf PCL,F
bsf STATUS,RP0
movf vr_value,W
movwf square_val
return
movf vr_value,W
movwf X_val
return
movf vr_value,W
movwf O_val
return
movf vr_value,W
movwf tri_val
return
movf vr_value,W
movwf R1_val
return
movf vr_value,W
movwf L1_val
return
movf vr_value,W
movwf R2_val
return
movf vr_value,W
movwf L2_val
return
movf vr_value,W
movwf left_val
return
movf vr_value,W
movwf down_val
return
movf vr_value,W
movwf right_val
return
movf vr_value,W
movwf up_val
return
movf vr_value,W
movwf E1_val
return
movf vr_value,W
movwf E2_val
return
;---------------------
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -