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

📄 v12.asm

📁 日本秋月电子采用PIC16F877a单片机的PICNIC以太网适配器程序
💻 ASM
📖 第 1 页 / 共 5 页
字号:
		BTFSC	3,2
		GOTO	icmp
ip_get_packet9
		call	abort				; リモートDMA中止
		goto	main9

;-----------------------------------------------------------------------------------
;		gcn1のバイト数分データを読み込む
;-----------------------------------------------------------------------------------
copy_toram
		bcf	PORTE,0		
		btfss	PORTC,5					; ~Wait
		goto	$-1
		MOVF	PORTD,0		
		bsf	PORTE,0		
		movwf	INDF				; *INDF = data
		INCF	FSR,1					; fsr++
		
		movlw	1		
		subwf	remote_len,1	
		btfss	STATUS,C	
		subwf	remote_len1,1	
		
		DECFSZ	gcn1,1		
		GOTO	copy_toram
		retURN



;-----------------------------------------------------------------------------------
;		パケットの残りをバッファRAMへ
;-----------------------------------------------------------------------------------
get_remain
get_remain0
		movf	remote_len,0	
		iorwf	remote_len1,0	
		btfsc	STATUS,Z	
		goto	get_remain9	
		
		bcf	PORTE,0		
		btfss	PORTC,5					; ~Wait
		goto	$-1
		MOVF	PORTD,0		
		bsf	PORTE,0		
		movwf	INDF				; 表にセット
		INCF	FSR,1		
		
		movlw	1		
		subwf	remote_len,1	
		btfss	STATUS,C	
		subwf	remote_len1,1	
		
		movlw	.16+.128
		addwf	FSR,0		
		btfss	STATUS,C	
		goto	get_remain0

		MOVLW	20H				; バンクを変えて更に読み込み
		MOVWF	FSR
		bsf	STATUS,IRP	
get_remain20
		movf	remote_len,0	
		iorwf	remote_len1,0	
		btfsc	STATUS,Z	
		goto	get_remain9		; 読み込み終了
		
		bcf	PORTE,0		
		btfss	PORTC,5					; ~Wait
		goto	$-1
		MOVF	PORTD,0		
		bsf	PORTE,0		
		movwf	INDF				; 裏にセット
		INCF	FSR,1		
		
		movlw	1
		subwf	remote_len,1	
		btfss	STATUS,C	
		subwf	remote_len1,1	
		
		movlw	.16+.128
		addwf	FSR,0		
		btfss	STATUS,C	
		goto	get_remain20

get_remain30
		call	abort
		
;		movf	remote_len,0	
;		iorwf	remote_len[1],0
;		btfsc	z
;		goto	get_remain9		; 読み込み終了
;		
;		bcf	RD
;		btfss	RDY			; ~Wait
;		goto	$-1
;		bsf	RD
;
;		movlw	1
;		subwf	remote_len[0],1
;		btfss	STATUS,C
;		subwf	remote_len[1],1
;		goto	get_remain30
get_remain9
		bcf	STATUS,IRP	
		retURN




;-----------------------------------------------------------------------------------
;		ICMPプロトコル処理
;-----------------------------------------------------------------------------------
icmp
		call	get_remain			; RTL8019からデータを転送
		MOVLW	.8			; typeが08h以外は捨てる
		SUBWF	icmp_type,0
		BTFSS	3,2
		GOTO	main9
		MOVLW	0				; codeが08h以外は捨てる
		SUBWF	icmp_code,0
		BTFSS	3,2
		GOTO	main9
ping
		MOVLW	ICMP_PROTO			; プロトコル=ICMP
		MOVWF	proto
		call	prepare_ip			; IPパケットの準備
;
		MOVLW	PACKET_SIZE + IP_SIZE	
		MOVWF	remote_adr
		MOVLW	PAGE_BEGIN		
		MOVWF	remote_adr1
		MOVF	ip_length1,0				;ne_cn_l
		MOVWF	remote_len
		MOVLW	IP_SIZE - 1		
		SUBWF	remote_len,1
		CLRF	remote_len1		
		call	remote_write
		
		call	clear_sum			; チェックサムの値をクリア
		
		MOVLW	10H			
		MOVWF	PORTC
		call	assert_wr2times			; type : code
		call	assert_wr2times			; sum High : Low
		
		MOVF	ip_length1,0				;ne_cn_l
		MOVWF	gcn1
		MOVLW	IP_SIZE + 4		;sub	gcn1,#IP_SIZE + 4
		SUBWF	gcn1,1
		MOVLW	icmp_header + 4		
		MOVWF	FSR
icmp10
		MOVF	INDF,0			
		INCF	FSR,1			
		call	assert_wr
		
		movlw	.16 + .128
		addwf	FSR,0			
		btfsc	STATUS,C		
		goto	icmp20
icmp19		DECFSZ	gcn1,1			
		GOTO	icmp10
		bcf	STATUS,IRP		

		DB	01,00		;clrw
		call	assert_wr

		MOVLW	PACKET_SIZE + IP_SIZE + 2	
		MOVWF	remote_adr
		MOVLW	PAGE_BEGIN		
		MOVWF	remote_adr1
		call	set_checksum
		
		MOVLW	4H			
		MOVWF	PORTC
		movlw	PAGE_BEGIN			; transmit page is start page 
		call	assert_wr0
		
		MOVLW	.5			
		MOVWF	PORTC
		MOVLW	ne_cn_l			
		MOVWF	FSR
		MOVF	INDF,0			
		call	assert_wr0
		
		MOVLW	.6			
		MOVWF	PORTC
		INCF	FSR,1			
		MOVF	INDF,0			
		call	assert_wr0
		
		call	transmit			; PINGの応答を送信
		goto	main9
icmp20
		MOVLW	20H			
		MOVWF	FSR
		bsf	STATUS,IRP		
		goto	icmp19



;-----------------------------------------------------------------------------------
;		UDP
;-----------------------------------------------------------------------------------
udp
		MOVLW	.8			
		MOVWF	gcn1
		call	copy_toram
		
;	BOOTPポートのチェック
		MOVLW	BOOTPC_PORT / .256	
		SUBWF	udp_tar_port,0
		BTFSS	3,2
		GOTO	udp_1
		MOVLW	BOOTPC_PORT & 0FFH		; BOOTP処理へ
		SUBWF	udp_tar_port1,0
		BTFSC	3,2
		GOTO	bootp_res

		MOVLW	this_ip			
		MOVWF	FSR
		MOVF	INDF,0				; 自分への送信データか?
		SUBWF	ip_dest,0
		BTFSS	3,2
		GOTO	main9

		INCF	FSR,1			
		MOVF	INDF,0			
		SUBWF	ip_dest1,0
		BTFSS	3,2
		GOTO	main9

		INCF	FSR,1			
		MOVF	INDF,0			
		SUBWF	ip_dest2,0
		BTFSS	3,2
		GOTO	main9
		INCF	FSR,1			
		MOVF	INDF,0			
		SUBWF	ip_dest3,0
		BTFSS	3,2
		GOTO	main9

;	LCDポートのチェック
udp_1
		MOVLW	lcd_port & 0FFH		
		MOVWF	FSR
		MOVF	INDF,0			
		SUBWF	udp_tar_port,0
		BTFSS	3,2
		GOTO	udp_2
		INCF	FSR,1			
		MOVF	INDF,0			
		SUBWF	udp_tar_port1,0
		BTFSC	3,2
		GOTO	udp_lcd_tag
udp_2
		MOVLW	para_port & 0FFH	
		MOVWF	FSR
		MOVF	INDF,0			
		SUBWF	udp_tar_port,0
		BTFSS	3,2
		GOTO	udp_3

		INCF	FSR,1			
		MOVF	INDF,0			
		SUBWF	udp_tar_port1,0
		BTFSC	3,2
		GOTO	udp_parallel_tag
udp_3
		MOVLW	serial_port & 0FFH	
		MOVWF	FSR
		MOVF	INDF,0			
		SUBWF	udp_tar_port,0
		BTFSS	3,2
		GOTO	udp_4
		INCF	FSR,1			
		MOVF	INDF,0			
		SUBWF	udp_tar_port1,0
		BTFSC	3,2
		GOTO	udp_serial_tag
udp_4
;
;		add new funciton this
;
		goto	main9
udp_lcd_tag
		movlw	udp_lcd >> 8
		movwf	PCLATH
		GOTO	udp_lcd
;
;		パラレルI/Oの処理(UDP)
;
udp_parallel_tag
		MOVLW	udp_data		
		MOVWF	FSR
		call	get_remain
		MOVLW	HIGH (udp_parallel)	
		MOVWF	PCLATH
		goto	udp_parallel
udp_serial_tag
		MOVLW	HIGH (udp_serial)	
		MOVWF	PCLATH
		goto	udp_serial

;-----------------------------------------------------------------------------------
get_dgram
		movf	remote_len,0		
		iorwf	remote_len1,0		
		btfsc	STATUS,Z		
		goto	get_dgram9
		
		bcf	PORTE,0			
		btfss	PORTC,5						; ~Wait
		goto	$-1
		MOVF	PORTD,0			
		bsf	PORTE,0			
		movwf	data0
		
		movlw	1
		subwf	remote_len,1		
		btfss	STATUS,C		
		subwf	remote_len1,1		
		
		BCF	3,0							; OK
		retURN
get_dgram9
		BSF	3,0							; EOT
		RETURN


;-----------------------------------------------------------------------------------
;		BOOTP応答
;-----------------------------------------------------------------------------------
bootp_res
		call	get_remain

		MOVLW	this_ip		
		MOVWF	FSR
		MOVF	INDF,0		
		INCF	FSR,1
		iorwf	INDF,0
		INCF	FSR,1
		iorwf	INDF,0
		INCF	FSR,1
		iorwf	INDF,0
		btfss	STATUS,Z
		goto	main9
		
		MOVLW	HIGH (bootp)	
		MOVWF	PCLATH
		call	bootp
		MOVLW	HIGH (bootp_res)
		MOVWF	PCLATH
		
		movlw	35h	; 
		call	assert_wr
		movlw	01h
		call	assert_wr
		movlw	3		; request
		call	assert_wr
		
		movlw	3dh	; 
		call	assert_wr
		movlw	07h
		call	assert_wr
		movlw	01h
		call	assert_wr
		MOVLW	mymac		
		MOVWF	FSR
		movlw	6
		call	transmit_nbytes			; 自分のMAC
		
		movlw	.54	; 
		call	assert_wr
		movlw	04h
		call	assert_wr
		movlw	0c0h
		call	assert_wr
		movlw	0a8h
		call	assert_wr
		movlw	0h
		call	assert_wr
		movlw	3h
		call	assert_wr

		movlw	.50	; 
		call	assert_wr
		movlw	4
		call	assert_wr
		
		MOVLW	dhcp_user_ip		
		MOVWF	FSR
		movlw	4
		call	transmit_nbytes
		
		
		movlw	0ffh
		call	assert_wr
		
		MOVLW	.64 - .7 - .9 - .1 - .6 - .6
		MOVWF	gcn1
bootp_40
		DB	01,00		;clrw
		call	assert_wr
		DECFSZ	gcn1,1		
		GOTO	bootp_40
		MOVLW	HIGH (bootp_tx)
		MOVWF	PCLATH
		call	bootp_tx
		MOVLW	HIGH (bootp_40)
		MOVWF	PCLATH
;
;	ここでDHCPサーバからもらったIP?????を自分の?????として登録
		MOVLW	this_ip		
		MOVWF	FSR
		MOVF	dhcp_user_ip,0	
		MOVWF	INDF
		INCF	FSR,1
		MOVF	dhcp_user_ip1,0	
		MOVWF	INDF
		INCF	FSR,1
		MOVF	dhcp_user_ip2,0	
		MOVWF	INDF
		INCF	FSR,1
		MOVF	dhcp_user_ip3,0	
		MOVWF	INDF
		bsf	STATUS,RP0
		CLRF	dhcp_done
		BCF	STATUS,RP0

;
;	もらったIPアドレスを液晶に表示
		bcf	PORTB,2
		MOVLW	0C0H		
		MOVWF	d4
		MOVLW	HIGH (write_lcd4)
		MOVWF	PCLATH
		call	write_lcd4			; 2行目に移動
		
		MOVLW	HIGH(print_ip)
		MOVWF	PCLATH
		call	print_ip			; 表示!
		CLRF	PORTB
		CLRF	PCLATH
		goto	main9




;-----------------------------------------------------------------------------------
;		TCP
;-----------------------------------------------------------------------------------
tcp
		MOVLW	.20			; 20バイトを読み込む
		MOVWF	gcn1
		call	copy_toram
		
		MOVLW	http_port & 0ffh		
		MOVWF	FSR
		MOVF	INDF,0		; EEPROMのhttpポートと一致するか?
		SUBWF	tcp_tar_port,0
		BTFSS	3,2
		GOTO	tcp9

		INCF	FSR,1
				
		MOVF	INDF,0
		SUBWF	tcp_tar_port1,0
		BTFSC	3,2
		GOTO	tcp_www

tcp9		goto	main9				; http以外でTCPに応答するものはない
;
;	http処理
tcp_www
		MOVLW	this_ip		
		MOVWF	FSR
		MOVF	INDF,0
		INCF	FSR,1
		iorwf	INDF,0
		INCF	FSR,1
		iorwf	INDF,0
		INCF	FSR,1
		iorwf	INDF,0
		btfsc	STATUS,Z
		goto	main9			; IPアドレスが0.0.0.0なら処理中止
		
		btfsc	tcp_flags,5	;TCP_URG			; URG
		goto	main9			; 廃棄
		
		MOVLW	HIGH(search_socket)
		MOVWF	PCLATH
		call	search_socket		; ソケットを検索
		MOVLW	HIGH (tcp_www)
		MOVWF	PCLATH
		btfsc	STATUS,C
		goto	state1			; ステート存在あり?
		
		call	no_socket		; ソケット作成
		goto	main9
;
;	socket state1
state1
		MOVLW	.12		;add	FSR,#12
		ADDWF	FSR,1
	;	mov	pclath,#print_hex>>8
	;	mov	pclath,#$>>8
;
		MOVF	INDF,0		
		SUBWF	tcp_seq_no,0
		BTFSS	3,2
		GOTO	state12
		INCF	FSR,1
		MOVF	INDF,0		
		SUBWF	tcp_seq_no1,0
		BTFSS	3,2
		GOTO	state12
		INCF	FSR,1
		MOVF	INDF,0		
		SUBWF	tcp_seq_no2,0
		BTFSS	3,2
		GOTO	state12
		INCF	FSR,1
		MOVF	INDF,0		
		SUBWF	tcp_seq_no3,0
		BTFSS	3,2
		GOTO	state12
		MOVLW	.15		
		SUBWF	FSR,1
		call	state2
state12		CLRF	PCLATH
		goto	main9
		
state2
		MOVLW	HIGH(state_table)
		MOVWF	PCLATH

		MOVF	INDF,0
		andlw	7fh
		ADDWF	2,1		
state_table
		goto	job_SYN_RCVD		;
		goto	job_ESTAB		;
		goto	job_CLOSE_WAIT		;
	;	nop	;goto	job_LAST_ACK	;
		goto	main9
		goto	job_FIN_WAIT_1		;
		goto	job_FIN_WAIT_2		;
	;	nop	;goto	job_CLOSING	;
		goto	main9
	;	nop	;goto	job_TIME_WAIT	;
		goto	main9
		goto	main9		;ACK,PSH,RST,SYN,FIN





;-----------------------------------------------------------------------------------
;		SYNを受け取り,
;		SYN,ACKを送ってACK待ち
job_SYN_RCVD
		btfsc	tcp_flags,TCP_RST
		goto	recv_rst
		btfsc	tcp_flags,TCP_FIN
		goto	recv_fin
		btfss	tcp_flags,TCP_ACK
		RETURN

		MOVLW	ESTAB	;mov	INDF,#ESTAB
		MOVWF	INDF
		bcf	STATUS,IRP
		RETURN
recv_rst
		clrF	INDF
		bcf	STATUS,IRP
		RETURN

;-----------------------------------------------------------------------------------
;
;
job_FIN_WAIT_1
		btfsc	tcp_flags,TCP_RST
		goto	recv_rst
		btfss	tcp_flags,TCP_ACK
		RETURN
		
		MOVLW	FIN_WAIT_2
		MOVWF	INDF
		bcf	STATUS,IRP
		RETURN

;-----------------------------------------------------------------------------------
;
;
job_FIN_WAIT_2
		btfsc	tcp_flags,TCP_RST
		goto	recv_rst
		btfss	tcp_flags,TCP_FIN
		RETURN
		
		clrF	INDF
		bcf	STATUS,IRP

		call	inc_ack_no
		call	send_ack
		RETURN

;-----------------------------------------------------------------------------------
;
;
		nop
job_ESTAB
		btfsc	tcp_flags,TCP_RST
		goto	recv_rst
		btfsc	tcp_flags,TCP_FIN
		goto	recv_fin

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -