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

📄 v12.asm

📁 日本秋月电子采用PIC16F877a单片机的PICNIC以太网适配器程序
💻 ASM
📖 第 1 页 / 共 5 页
字号:
		BTFSC	3,2			; 出力ピン?
		GOTO	ctrl_code32

		MOVLW	1FH		
		MOVWF	PCLATH
		call	getadtable
		MOVWF	wk	
		MOVLW	HIGH (ctrl_code3)
		MOVWF	PCLATH
		
		MOVF	wk,0		
		ANDWF	data0,1
		BTFSS	3,2		; 1ならアナログ入力
		GOTO	ad_in
;
;
ctrl_code32
		CLRF	FSR		
ctrl_code31	MOVLW	PORTA				; + 05h
		ADDWF	FSR,1

		MOVF	getmes_wk1,0
		call	getbitpos
		MOVF	INDF,0		
		ANDWF	data0,1
		BTFSC	3,2		
		GOTO	ctrl_low
		goto	ctrl_high

;-----------------------------------------------------------------------------------
;	ショートメッセージの取得
get_short_mes
		MOVLW	1FH		; バンク=1h
		MOVWF	PCLATH
		MOVF	wk,0			
		MOVWF	PCL
ctrl_out
		movlw	mes_out & .255	; 'OUT'
		goto	put_short_mes10
ctrl_in
		movlw	mes_in & .255	; 'IN'
		goto	put_short_mes10
ctrl_high
		movlw	mes_high & .255	; 'HIGH'
		goto	put_short_mes10
ctrl_low
		movlw	mes_low & .255	; 'LOW'
		goto	put_short_mes10
put_short_mes10
		MOVWF	wk		
put_short_mes0
		call	get_short_mes
		MOVWF	data0		
		MOVLW	HIGH (put_short_mes0)
		MOVWF	PCLATH		; PCLATHの修正
		
		MOVLW	0			; NULL?
		SUBWF	data0,0
		BTFSC	3,2
		GOTO	ctrl_next
		MOVF	data0,0
		call	assert_wr2		; RTL8019へ転送
		
		INCF	wk,1		;			; wk++
		goto	put_short_mes0
;
;		META CHARACTER
ctrl_code2
		MOVLW	HIGH (ctrl_code1)
		MOVWF	PCLATH

		MOVF	getmes_wk1,0
		andlw	7fh
		addlw	-'0'			;不明
		
		call	ctrl_code1			; コントロール文字出力ルーチンへ
		MOVLW	HIGH (ctrl_code2)
		MOVWF	PCLATH
ctrl_next
		MOVLW	1			; ind++
		ADDWF	ind,1
		bsf	STATUS,RP1
		bcf	STATUS,RP0
		btfsc	STATUS,C
		INCF	EEADRH,1
		goto	send_mes0

;-----------------------------------------------------------------------------------
;		ソケットの作成
;
no_socket
		btfss	tcp_flags,TCP_SYN
		RETURN
;
;	SYNパケットの受信→SYN+ACKの送信
;
recv_syn
		MOVLW	HIGH (socket_entry)
		MOVWF	PCLATH

		call	socket_entry			; ソケットのエントリーを検索
		MOVLW	HIGH (recv_syn)
		MOVWF	PCLATH
		btfsc	STATUS,C
		goto	send_rst			; ソケットの空きなし
		
				;
		MOVLW	0
		MOVWF	ip_length
				; IPヘッダ=20+24
		MOVLW	.20 + .24
		MOVWF	ip_length1
		
		MOVLW	TCP_PROTO		; TCP packet
		MOVWF	proto
		call	prepare_ip
;
	
;-------
		MOVLW	PACKET_SIZE + IP_SIZE	;mov	remote_adr[0],#PACKET_SIZE + IP_SIZE
		MOVWF	remote_adr
		MOVLW	PAGE_BEGIN
		MOVWF	remote_adr1

		MOVLW	.20 + .4
		MOVWF	remote_len
		MOVLW	0
		MOVWF	remote_len1

;-------		
		
		call	remote_write
		
		call	clear_sum			; チェックサムの値をクリア
		
		MOVLW	http_port & 0ffh
		MOVWF	FSR
		movlw	2
		call	transmit_nbytes			; 自分のポート番号
		
		MOVLW	tcp_src_port
		MOVWF	FSR
		movlw	2
		call	transmit_nbytes			; 相手のポート番号

		MOVLW	seq_no
		MOVWF	FSR
		movlw	4
		call	transmit_nbytes			; 自分のSEQNO
		
		
		call	inc_ack_no		; tcp_seq_no++;
		
		MOVF	com_fsr,0
		MOVWF	FSR
		MOVLW	.8
		ADDWF	FSR,1

		bsf	STATUS,IRP
		bsf	STATUS,RP0
		MOVF	seq_no,0	; 自分のSEQ NOを自分のソケット+8に
		MOVWF	INDF
		INCF	FSR,1
		MOVF	seq_no1,0
		MOVWF	INDF
		INCF	FSR,1
		MOVF	seq_no2,0
		MOVWF	INDF
		INCF	FSR,1
		MOVF	seq_no3,0	
		MOVWF	INDF
		INCF	FSR,1
		bcf	STATUS,RP0
		
		MOVF	tcp_seq_no,0	
		MOVWF	INDF
		INCF	FSR,1
		MOVF	tcp_seq_no1,0
		MOVWF	INDF
		INCF	FSR,1
		MOVF	tcp_seq_no2,0
		MOVWF	INDF
		INCF	FSR,1
		;mov	INDF,tcp_seq_no[3]
		MOVF	tcp_seq_no3,0
		MOVWF	INDF
		bcf	STATUS,IRP
	
		MOVF	com_fsr,0
		MOVWF	FSR
		MOVLW	.8
		ADDWF	FSR,1
		call	inc_seq_no
		
		MOVLW	tcp_seq_no
		MOVWF	FSR
		movlw	4
		call	transmit_nbytes		; 相手のSEQNO+1
		
		movlw	60h			; オプション有り
		call	assert_wr
		movlw	B'010010'			; ACK+SYN
		call	assert_wr
		
		movlw	08h			; window(high)
		call	assert_wr
		movlw	00h			; window(low)
		call	assert_wr
		
		call	assert_wr2times		; tcp sum
		call	assert_wr2times		; 緊急ポインタ
		
		movlw	2h
		call	assert_wr		
		movlw	4h
		call	assert_wr		
		movlw	5h
		call	assert_wr		
		movlw	0b4h
		call	assert_wr		
		
		call	calc_tcp_sum		; TCP SUMの計算
		
		MOVLW	4h
		MOVWF	PORTC
		movlw	PAGE_BEGIN		; transmit page is start page 
		call	assert_wr0
		
		MOVLW	5
		MOVWF	PORTC
		movlw	.60			; 60バイト送信
		call	assert_wr0
		
		MOVLW	6
		MOVWF	PORTC
		DB	01,00		;clrw
		call	assert_wr0
		call	transmit		; 送信!

		call	next_seq_no		; seq_no++
		RETURN

;-----------------------------------------------------------------------------------
;		チェックサム計算
calc_tcp_sum
		CLRF	bytes		;clr	bytes	;2バイトアラインの調整
		
		MOVLW	this_ip		;mov	fsr,#this_ip; 自分のIPアドレスを加算
		
		MOVWF	FSR
		MOVF	INDF,0
		call	calc_sum
		INCF	FSR,1
		MOVF	INDF,0
		call	calc_sum
		INCF	FSR,1
		MOVF	INDF,0
		call	calc_sum
		INCF	FSR,1
		MOVF	INDF,0
		call	calc_sum
	
		MOVF	ip_src,0		; 相手のIPアドレスを加算
		call	calc_sum
		MOVF	ip_src1,0
		call	calc_sum
		MOVF	ip_src2,0
		call	calc_sum
		MOVF	ip_src3,0
		call	calc_sum
		
		DB	01,00		;clrw				; プロトコル番号を加算
		call	calc_sum
		MOVLW	TCP_PROTO
		call	calc_sum
		
		MOVF	remote_len1,0	; バイト数を加算
		call	calc_sum
		MOVF	remote_len,0
		call	calc_sum
		
	
;-------
		MOVLW	PACKET_SIZE + IP_SIZE + .16
		MOVWF	remote_adr
		MOVLW	PAGE_BEGIN
		MOVWF	remote_adr1

;-------		
		
		call	set_checksum		; RTL8019バッファに設定
		RETURN



;===================================================================================
;		NICの初期化ルーチン
;===================================================================================
initialize
		call	init_nic			; NICリセット
		call	getmac				; MACアドレス取得
		call	setmac				; MACアドレスセット
				; リングバッファ初期化 [2004/10/30]
		bsf	STATUS,RP0
		MOVLW	fifo_top		
		MOVWF	fifo_buff
		MOVWF	fifo_poi			
		MOVWF	fifo_line		 
		
		clrF	fifo_cn
		clrF	fifo_line_cn
		bcf	STATUS,RP0
		
		RETURN



;-----------------------------------------------------------------------------------
;		RTL8019のリセット
;-----------------------------------------------------------------------------------
reset_nic
		clrF	PORTC
		movlw	21h
		call	assert_wr0		; STOP OPERATION
		
		MOVLW	1Fh
		MOVWF	PORTC
		call	assert_rd		; 1ehを読む
		
		MOVLW	1Fh
		MOVWF	PORTC
		MOVF	data0,0
		call	assert_wr0		; それを書き戻す(RESET)
reset_nic0
		MOVLW	07h
		MOVWF	PORTC
		call	assert_rd		; ステータスを読む
		
		btfss	data0,7			;data.7	; RESET 終了チェック
		goto	reset_nic0
		RETURN


;-----------------------------------------------------------------------------------
;		RTL8019の初期化
;-----------------------------------------------------------------------------------
init_nic
		call	reset_nic
		
		MOVLW	0eh			; DCR(Data Conifguration Register)
		MOVWF	PORTC
		movlw	68h
		call	assert_wr0
		
		MOVLW	0ah
		MOVWF	PORTC
		DB	01,00		;clrw
		call	assert_wr0		; for over flow
		
		MOVLW	0bh
		MOVWF	PORTC
		DB	01,00		;clrw
		call	assert_wr0		; for over flow
		
		MOVLW	01h
		MOVWF	PORTC
		movlw	PAGE_START		; PAGE START
		call	assert_wr0
		
		MOVLW	02h
		MOVWF	PORTC
		movlw	PAGE_STOP		; PAGE STOP
		call	assert_wr0
		
		MOVLW	03h
		MOVWF	PORTC
		movlw	PAGE_START		; BDRY
		call	assert_wr0
		
		MOVLW	0ch			; RCR
		MOVWF	PORTC
		movlw	0h	;	20h
		call	assert_wr0
		
		MOVLW	0dh			; TCR
		MOVWF	PORTC
		movlw	2			; LOOPBACK
		call	assert_wr0

		MOVLW	0fh			; IMR
		MOVWF	PORTC
		movlw	B'11111'
		call	assert_wr0
		
		MOVLW	7			; ISR
		MOVWF	PORTC
		movlw	0ffh
		call	assert_wr0

		clrF	PORTC			; CR(Command Regster)
		movlw	22h			; START OPERATION with L/B
		call	assert_wr0
		RETURN

;-----------------------------------------------------------------------------------
;		MACアドレス取得
;-----------------------------------------------------------------------------------
getmac
		clrF	PORTC
		movlw	22h
		call	assert_wr0
		
		CLRF	remote_adr 
		CLRF	remote_adr1	 
		MOVLW	.12	 	;12bytes転送
		MOVWF	remote_len
		clrF	remote_len1	 
		call	remote_read

		MOVLW	6			; MACアドレスは6バイト
		MOVWF	gcn1
		MOVLW	mymac		; アドレスにmymacに設定
		MOVWF	FSR
get_mac0
		MOVLW	10h
		MOVWF	PORTC
		call	assert_rd		; から読み
		call	assert_rd		; 
		
		MOVF	data0,0	;mov	INDF,data		; MACアドレスをPICに読み込む
		MOVWF	INDF
		INCF	FSR,1
		DECFSZ	gcn1,1	 
		GOTO	get_mac0
		RETURN



;-----------------------------------------------------------------------------------
;		MACアドレス設定
;-----------------------------------------------------------------------------------
setmac
;	PAGE 1
		clrF	PORTC
		movlw	B'01100010'
		call	assert_wr0
;
		MOVLW	01h
		MOVWF	PORTC
		MOVLW	mymac
		MOVWF	FSR
		MOVLW	6			; MACアドレスは6バイト
		MOVWF	gcn1
setmac0
		MOVF	INDF,0
		call	assert_wr0		; MACアドレスの設定
		INCF	FSR,1
		INCF	PORTC,1
		DECFSZ	gcn1,1	 
		GOTO	setmac0
		MOVLW	7
		MOVWF	PORTC
		movlw	PAGE_START + 1		; ついでに
		call	assert_wr0		; カレントページのセット
		
		MOVLW	8
		MOVWF	PORTC
		DB	01,00		;clrw
		call	assert_wr0
		INCF	PORTC,1	 
		DB	01,00		;clrw
		call	assert_wr0
		INCF	PORTC,1	 
		DB	01,00		;clrw
		call	assert_wr0
		INCF	PORTC,1	 
		DB	01,00		;clrw
		call	assert_wr0
		INCF	PORTC,1	 
		DB	01,00		;clrw
		call	assert_wr0
		INCF	PORTC,1	 
		DB	01,00		;clrw
		call	assert_wr0
		INCF	PORTC,1	 
		DB	01,00		;clrw
		call	assert_wr0
		INCF	PORTC,1	 
		DB	01,00		;clrw
		call	assert_wr0
		
		clrF	PORTC
		movlw	22h
		call	assert_wr0
		RETURN



;-----------------------------------------------------------------------------------
;		リモートDMA書き込み準備
;-----------------------------------------------------------------------------------
remote_write
		MOVLW	8
		MOVWF	PORTC
		MOVF	remote_adr,0
		call	assert_wr0
		
		MOVLW	9
		MOVWF	PORTC
		MOVF	remote_adr1,0
		call	assert_wr0
		
		MOVLW	0ah
		MOVWF	PORTC
		MOVF	remote_len,0
		call	assert_wr0
		
		MOVLW	0bh
		MOVWF	PORTC
		MOVF	remote_len1,0
		call	assert_wr0
		
		clrF	PORTC
		movlw	B'00010010'
		call	assert_wr0		; write now!
		MOVLW	10h
		MOVWF	PORTC
		RETURN


;-----------------------------------------------------------------------------------
;		リモートDMA読み込み準備
;-----------------------------------------------------------------------------------
remote_read
		MOVLW	8
		MOVWF	PORTC
		MOVF	remote_adr,0
		call	assert_wr0
		
		MOVLW	9
		MOVWF	PORTC
		MOVF	remote_adr1,0
		call	assert_wr0
		
		MOVLW	0ah
		MOVWF	PORTC
		MOVF	remote_len,0
		call	assert_wr0
		
		MOVLW	0bh
		MOVWF	PORTC
		MOVF	remote_len1,0
		call	assert_wr0
		
		clrF	PORTC
		movlw	B'00001010'
		call	assert_wr0		; read now!
		MOVLW	10h
		MOVWF	PORTC
		RETURN

;-----------------------------------------------------------------------------------
;		チェックサムの計算
;-----------------------------------------------------------------------------------
calc_sum
		BTFSS	bytes,0		;btfss	bytes.0	;アラインメントチェック
		goto	calc_sum_high
;	LOWバイト
		ADDWF	sum,1	 ;データを(sum[1],sum[0])に加算
		movlw	1
		btfsc	STATUS,C
		addwf	sum1,1		 

		btfsc	STATUS,C			; 1の補数の計算
		addwf	sum,1	 
		btfsc	STATUS,C
		addwf	sum1,1	 
		INCF	bytes,1	 	; アラインを次に
		RETURN
;	HIGHバイト
calc_sum_high
		ADDWF	sum1,1		  ; データを(sum[1],sum[0])に加算
		movlw	1
		
		btfsc	STATUS,C			; 1の補数の計算
		ADDWF	sum,1		 
		btfsc	STATUS,C
		ADDWF	sum1,1		 
	
		INCF	bytes,1	 			; アラインを次に
		RETURN



assert_wr2times
		DB	01,00		;clrw
		call	assert_wr
		DB	01,00		;clrw
		goto	assert_wr
;-----------------------------------------------------------------------------------
;	送信データ=data
assert_wr2x
		MOVLW	1	 	; remote_len++
		ADDWF	remote_len,1
		btfsc	STATUS,C
		INCF	remote_len1,1	 
		MOVF	data0,0			; data変数を媒介
		goto	assert_wr
;	送信データ=W
assert_wr2	movwf	data0		; 一度しまう
		MOVLW	1	 	; remote_len++
		ADDWF	remote_len,1
		btfsc	STATUS,C
		INCF	remote_len1,1	 
		MOVF	data0,0
;----------------------------------------------------------------------------------

⌨️ 快捷键说明

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