📄 sio.asm
字号:
;============================================================
; File Name : sio.asm
;
;Rev.: Date: Author: Reason:
;1.00 18-06-96 C.H.Lai First Version
;============================================================
ORG 0x04
;------------------------------------------------------------
; Name :
; Parm :
; Retn :
; Desc :
;------------------------------------------------------------
si:
movwf w_save ; save W
swapf STATUS,W
clrf STATUS ; to bank 0
movwf status_save ; save STATUS
movf FSR,W ; save FSR
movwf fsr_save
movf PCLATH,W
movwf pclath_save ; save PCLATH
clrf PCLATH
bcf INTCON,INTF ; clear INT
bcf SSPCON,WCOL ;
bsf SSPCON,SSPEN ; enable SPI
movwf SSPBUF
bcf PIR1,SSPIF
call wait_spi_data
btfsc STATUS,C
goto end_SPI
xorlw 0080h ; 01h ?
btfss STATUS,Z
goto end_SPI ; No
bsf STATUS,RP0 ; to bank 1
bcf TRIS_SDO ; SDO -> output
bcf TRIS_DSR ; DSR -> output
bcf STATUS,RP0 ; to bank 0
bcf SSPCON,WCOL
btfss f_nmode
goto button_report_mode
btfsc f_setting_mode
goto parameter_setting_mode
;---------------------------
; button report mode
;---------------------------
button_report_mode:
movf pad_id,W ; Controller ID
spi_transmit
movwf last_command ; save data
xorlw 0042h ; 42h ?
btfss STATUS,Z
goto command_43 ; No
movlw 005ah ; ack
btfss f_nmode ; old mode ?
goto report_42_send_ack ; Yes
btfsc mode_ch ; mode change ?
clrw ; Yes
report_42_send_ack:
spi_transmit
call ADD_nop6
bsf STATUS,RP0
movf finadata1,W ; 1st Pad data
bcf STATUS,RP0
spi_transmit
; movwf sonycmd0 ; save sonycmd0
bsf STATUS,RP0
movf pre_data1,W
bcf STATUS,RP0
call save_motor_data
bsf STATUS,RP0
movf finadata2,W ; 2nd Pad data
bcf STATUS,RP0
spi_transmit
; movwf sonycmd1
bsf STATUS,RP0
movf pre_data2,W
bcf STATUS,RP0
call save_motor_data
movf pad_id,W
andlw 0xf0
xorlw 0x80
btfsc STATUS,Z
goto end_SPI ; = x1 mode
bsf STATUS,RP0
movf finadata3,W ; 3rd Pad data
bcf STATUS,RP0
spi_transmit
bsf STATUS,RP0
movf pre_data3,W
bcf STATUS,RP0
call save_motor_data
bsf STATUS,RP0
movf finadata4,W ; 4th Pad data
bcf STATUS,RP0
spi_transmit
bsf STATUS,RP0
movf pre_data4,W
bcf STATUS,RP0
call save_motor_data
movf pad_id,W
andlw 0xf0
xorlw 0x40
btfsc STATUS,Z
goto end_SPI ; = x2 mode
bsf STATUS,RP0
movf finadata5,W ; 5th Pad data
bcf STATUS,RP0
spi_transmit
bsf STATUS,RP0
movf pre_data5,W
bcf STATUS,RP0
call save_motor_data
bsf STATUS,RP0
movf finadata6,W ; 6th Pad data
bcf STATUS,RP0
spi_transmit
bsf STATUS,RP0
movf pre_data6,W
bcf STATUS,RP0
call save_motor_data
movf pad_id,W
andlw 0xf0
xorlw 0xc0
btfsc STATUS,Z
goto end_SPI ; = x3 mode
com_42_data7:
bsf STATUS,RP0
movf finadata7,W ; 7th Pad data
bcf STATUS,RP0
spi_transmit
call ADD_nop6
bsf STATUS,RP0
movf finadata8,W ; 8th Pad data
bcf STATUS,RP0
spi_transmit
movf pad_id,W
andlw 0xf0
xorlw 0x20
btfsc STATUS,Z
goto end_SPI ; = x4 mode
bsf STATUS,RP0
movf finadata9,W ; 9th Pad data
bcf STATUS,RP0
spi_transmit
call ADD_nop6
bsf STATUS,RP0
movf finadata10,W ; 10th Pad data
bcf STATUS,RP0
spi_transmit
movf pad_id,W
andlw 0xf0
xorlw 0xa0
btfsc STATUS,Z
goto end_SPI ; = x5 mode
bsf STATUS,RP0
movf finadata11,W ; 11th Pad data
bcf STATUS,RP0
spi_transmit
call ADD_nop6
bsf STATUS,RP0
movf finadata12,W ; 12th Pad data
bcf STATUS,RP0
spi_transmit
movf pad_id,W
andlw 0xf0
xorlw 0x60
btfsc STATUS,Z
goto end_SPI ; = x6 mode
bsf STATUS,RP0
movf finadata13,W ; 13th Pad data
bcf STATUS,RP0
spi_transmit
call ADD_nop6
bsf STATUS,RP0
movf finadata14,W ; 14th Pad data
bcf STATUS,RP0
spi_transmit
movf pad_id,W
andlw 0xf0
xorlw 0xe0
btfsc STATUS,Z
goto end_SPI ; = x7 mode
bsf STATUS,RP0
movf finadata15,W ; 15th Pad data
bcf STATUS,RP0
spi_transmit
call ADD_nop6
bsf STATUS,RP0
movf finadata16,W ; 16th Pad data
bcf STATUS,RP0
spi_transmit
movf pad_id,W
andlw 0xf0
xorlw 0x10
btfsc STATUS,Z
goto end_SPI ; = x8 mode
bsf STATUS,RP0
movf finadata17,W ; 17th Pad data
bcf STATUS,RP0
spi_transmit
call ADD_nop6
bsf STATUS,RP0
movf finadata18,W ; 18th Pad data
bcf STATUS,RP0
spi_transmit
goto end_SPI
;-----------------------
command_43:
movf last_command,W ; get saved data
xorlw 00c2h ; 43h ?
btfss STATUS,Z
goto end_SPI ; No
movlw 005ah ; ack
btfss mode_ch
goto report_43_send_ack
btfsc f_nmode ; old mode ?
clrw ; No
bcf mode_ch
report_43_send_ack:
spi_transmit
call ADD_nop6
bsf STATUS,RP0
movf finadata1,W ; 1st Pad data
bcf STATUS,RP0
spi_transmit
bcf f_setting_mode
xorlw 0080h ; 01h ?
btfss STATUS,Z
goto report_43_send_2nd
bsf f_nmode ; psx mode 2.0
bsf f_setting_mode ; parameter setting mode
report_43_send_2nd:
call ADD_nop6
bsf STATUS,RP0
movf finadata2,W ; 2nd Pad data
bcf STATUS,RP0
spi_transmit
movf pad_id,W
andlw 0xf0
xorlw 0x80
btfsc STATUS,Z
goto end_SPI ; = x1 mode
bsf STATUS,RP0
movf finadata3,W ; 3rd Pad data
bcf STATUS,RP0
spi_transmit
bsf STATUS,RP0
movf finadata4,W ; 4th Pad data
bcf STATUS,RP0
spi_transmit
movf pad_id,W
andlw 0xf0
xorlw 0x40
btfsc STATUS,Z
goto end_SPI ; = x2 mode
bsf STATUS,RP0
movf finadata5,W ; 5th Pad data
bcf STATUS,RP0
spi_transmit
bsf STATUS,RP0
movf finadata6,W ; 6th Pad data
bcf STATUS,RP0
spi_transmit
movf pad_id,W
andlw 0xf0
xorlw 0xc0
btfsc STATUS,Z
goto end_SPI ; = x3 mode
goto com_42_data7
; bsf STATUS,RP0
; movf finadata7,W ; 7th Pad data
; bcf STATUS,RP0
; spi_transmit
;
; bsf STATUS,RP0
; movf finadata8,W ; 8th Pad data
; bcf STATUS,RP0
; spi_transmit
;
; movf pad_id,W
; andlw 0xf0
; xorlw 0x20
; btfsc STATUS,Z
; goto end_SPI ; = x4 mode
;
; bsf STATUS,RP0
; movf finadata9,W ; 9th Pad data
; bcf STATUS,RP0
; spi_transmit
;
; bsf STATUS,RP0
; movf finadata10,W ; 10th Pad data
; bcf STATUS,RP0
; spi_transmit
;
; movf pad_id,W
; andlw 0xf0
; xorlw 0xa0
; btfsc STATUS,Z
; goto end_SPI ; = x5 mode
;
; bsf STATUS,RP0
; movf finadata11,W ; 11th Pad data
; bcf STATUS,RP0
; spi_transmit
;
; bsf STATUS,RP0
; movf finadata12,W ; 12th Pad data
; bcf STATUS,RP0
; spi_transmit
;
; movf pad_id,W
; andlw 0xf0
; xorlw 0x60
; btfsc STATUS,Z
; goto end_SPI ; = x6 mode
;
; bsf STATUS,RP0
; movf finadata13,W ; 13th Pad data
; bcf STATUS,RP0
; spi_transmit
;
; bsf STATUS,RP0
; movf finadata14,W ; 14th Pad data
; bcf STATUS,RP0
; spi_transmit
;
; movf pad_id,W
; andlw 0xf0
; xorlw 0xe0
; btfsc STATUS,Z
; goto end_SPI ; = x7 mode
;
; bsf STATUS,RP0
; movf finadata15,W ; 15th Pad data
; bcf STATUS,RP0
; spi_transmit
;
; bsf STATUS,RP0
; movf finadata16,W ; 16th Pad data
; bcf STATUS,RP0
; spi_transmit
;
; movf pad_id,W
; andlw 0xf0
; xorlw 0x10
; btfsc STATUS,Z
; goto end_SPI ; = x8 mode
;
; bsf STATUS,RP0
; movf finadata17,W ; 17th Pad data
; bcf STATUS,RP0
; spi_transmit
;
; bsf STATUS,RP0
; movf finadata18,W ; 18th Pad data
; bcf STATUS,RP0
; spi_transmit
;
;
; goto end_SPI
;------------------------------------------
;psx mode 2.0
;parameter setting mode
;------------------------------------------
parameter_setting_mode: ;
movlw 00cfh ; f3
spi_transmit
movwf last_command
andlw 0x0f
xorlw 0x02
btfss STATUS,Z
goto end_SPI
movlw HIGH command_table
movwf PCLATH
swapf last_command,W
andlw 0x0f
command_table:
addwf PCL,F
goto ps2_command_40
goto ps2_command_48
goto ps2_command_44
goto ps2_command_4c
goto ps2_command_42
goto ps2_command_4a
goto ps2_command_46
goto ps2_command_4e
goto ps2_command_41
goto ps2_command_49
goto ps2_command_45
goto ps2_command_4d
goto ps2_command_43
goto ps2_command_4b
goto ps2_command_47
goto ps2_command_4f
;----------------------------------
; command = 40
; Reserved
;----------------------------------
ps2_command_40:
movlw 005ah ; ack
spi_transmit
bsf f_sio_ack
movlw ana_sen_1
movwf FSR
clrw ; 1st data
spi_transmit
bsf STATUS,RP0
movwf sio_tmp1
movlw 0x08
movwf sio_tmp2
bcf STATUS,C
sio_40_reverse:
rrf sio_tmp1,F
rlf sio_tmp3,F
decfsz sio_tmp2,F
goto sio_40_reverse
bcf STATUS,RP0
com_40_2nd_data:
clrw ; 2nd data
spi_transmit
bsf STATUS,RP0
movwf sio_tmp1
movf sio_tmp3,W
sublw d'11' ; if > 11 ?
bcf STATUS,RP0
btfss STATUS,C
goto com_40_3rd_data
bcf f_sio_ack
bsf STATUS,RP0
movf sio_tmp3,W
addwf FSR,F
bcf STATUS,RP0
com_40_3rd_data:
movlw 0xff
btfss f_sio_ack
movf INDF,W ; 3rd data
spi_transmit
bsf STATUS,RP0
movf sio_tmp1,W
xorlw 0xff
btfsc STATUS,Z
goto com_40_4th_data
movf sio_tmp1,W
bcf STATUS,RP0
andlw 0x3f
btfss STATUS,Z
bsf f_sio_ack
com_40_4th_data:
bcf STATUS,RP0
clrw
spi_transmit ; 4th data
btfsc f_sio_ack
goto com_40_5th_data
bsf STATUS,RP0
movf sio_tmp1,W
xorlw 0xff
btfsc STATUS,Z
goto com_40_5th_data
movf sio_tmp1,W
movwf INDF
com_40_5th_data:
bcf STATUS,RP0
movf SSPBUF,W
btfss STATUS,Z
bsf f_sio_ack
clrw ; 5th data
spi_transmit
btfss STATUS,Z
bsf f_sio_ack
clrw ; 6th data
btfss D_A_mode
goto com_40_6th_data
movlw 0x5a
btfsc f_sio_ack
movlw 0xff
com_40_6th_data:
spi_transmit
goto end_SPI
;----------------------------------
; command = 41
; Reserved
;----------------------------------
ps2_command_41:
movlw 005ah ; ack
spi_transmit
call ADD_nop6
clrw ; 1st data
btfsc D_A_mode
movlw 0xff
spi_transmit
call ADD_nop6
clrw ; 2nd data
btfsc D_A_mode
movlw 0xff
spi_transmit
call ADD_nop6
clrw ; 3rd data
btfsc D_A_mode
movlw 0xc0 ; 03
spi_transmit
call ADD_nop6
clrw ; 4th data
spi_transmit
call ADD_nop6
clrw ; 5th data
spi_transmit
call ADD_nop6
clrw ; 6th data
btfsc D_A_mode
movlw 0x5a
spi_transmit
goto end_SPI
;------------------------------------
; command = 42
; Button and analog level acquisition
; and actuator parameter setting.
;------------------------------------
ps2_command_42:
movlw 005ah ; ack
spi_transmit
call ADD_nop6
bsf STATUS,RP0
movf finadata1,W ; 1st data
bcf STATUS,RP0
spi_transmit
call ADD_nop6
bsf STATUS,RP0
movf finadata2,W ; 2nd data
bcf STATUS,RP0
spi_transmit
call ADD_nop6
bsf STATUS,RP0
movf finadata3,W ; 3rd data
bcf STATUS,RP0
spi_transmit
call ADD_nop6
bsf STATUS,RP0
movf finadata4,W ; 4th data
bcf STATUS,RP0
spi_transmit
call ADD_nop6
bsf STATUS,RP0
movf finadata5,W ; 5th data
bcf STATUS,RP0
spi_transmit
call ADD_nop6
bsf STATUS,RP0
movf finadata6,W ; 6th data
bcf STATUS,RP0
spi_transmit
goto end_SPI
;------------------------------------------
; command = 43
; Controller parameter setting mode ON/OFF,
; the uninitialized state resetting.
;------------------------------------------
ps2_command_43:
movlw 005ah ; ack
spi_transmit
call ADD_nop6
clrw ; 1st data
spi_transmit
bcf f_setting_mode
xorlw 0080h ; 01h ?
btfss STATUS,Z
goto ps2_43_0
bsf f_nmode ; psx mode 2.0
bsf f_setting_mode ; parameter setting mode
ps2_43_0:
call ADD_nop6
clrw ; 2nd data
spi_transmit
call ADD_nop6
clrw ; 3rd data
spi_transmit
call ADD_nop6
clrw ; 4th data
spi_transmit
call ADD_nop6
clrw ; 5th data
spi_transmit
call ADD_nop6
clrw ; 6th data
spi_transmit
goto end_SPI
;----------------------------------
; command = 44
; Controller mode setup
;----------------------------------
ps2_command_44:
movlw 005ah ; ack
spi_transmit
call ADD_nop6
clrw ; 1st byte : must be 0
spi_transmit
ifndef SLIDE_SW
btfss STATUS,Z
goto command_44_not_digital
bcf D_A_mode ; set to 4x mode
bsf f_44_chmode
goto send_44_2nd_byte
command_44_not_digital:
xorlw 0x80
btfss STATUS,Z
goto send_44_2nd_byte
bsf D_A_mode ; set to 7x mode
bsf f_44_chmode
else
call ADD_nop6
endif
send_44_2nd_byte:
clrw ; 2nd byte : must be 0
spi_transmit
ifndef SLIDE_SW
btfss SSPBUF,6
goto send_44_3rd_byte ; lock unchange
bsf f_44_lock
btfss SSPBUF,7
bcf f_44_lock ; unlock
else
call ADD_nop6
endif
send_44_3rd_byte:
clrw ; 3rd byte : must be 0
spi_transmit
call ADD_nop6
clrw ; 4th byte : must be 0
spi_transmit
call ADD_nop6
clrw ; 5th byte : must be 0
spi_transmit
call ADD_nop6
clrw ; 6th byte : must be 0
spi_transmit
goto end_SPI
;-----------------------------------
; command = 45
; Controller information acquisition
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -