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

📄 sio.asm

📁 VCP201_CODE is a FPGA source code.
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;============================================================
; 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 + -