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

📄 v12.asm

📁 日本秋月电子采用PIC16F877a单片机的PICNIC以太网适配器程序
💻 ASM
📖 第 1 页 / 共 5 页
字号:
		
		INCF	FSR,1
		MOVLW	HIGH (job_ESTAB)
		MOVWF	PCLATH
		MOVF	INDF,0
		andlw	0fh
		ADDWF	2,1		;jmp	pc+w
		goto	ESTAB_00
		goto	ESTAB_01
		goto	ESTAB_02
		goto	ESTAB_03
		goto	ESTAB_99


recv_fin
		MOVLW	0
		MOVWF	INDF
		bcf	STATUS,IRP
		
		call	inc_ack_no
		call	send_ack
		RETURN

;-----------------------------------------------------------------------------------
;
;
job_CLOSE_WAIT
		MOVLW	0
		MOVWF	INDF
		bcf	STATUS,IRP
		
		call	send_fin
		RETURN
ESTAB_99
		decF	FSR,1
		MOVLW	FIN_WAIT_1
		MOVWF	INDF
		bcf	STATUS,IRP
		
		call	send_fin
		
		MOVF	com_fsr,0
		MOVWF	FSR
		MOVLW	.8
		ADDWF	FSR,1
		call	inc_seq_no
		RETURN

;-----------------------------------------------------------------------------------
;		ESTABLISH
;
ESTAB_00
		incF	INDF,1
		bcf	STATUS,IRP
estab0
		MOVLW	HIGH(get_nextbyte)
		MOVWF	PCLATH

		call	get_nextbyte		; バッファからデータを取得
		MOVLW	HIGH (estab0)
		MOVWF	PCLATH
		
		MOVLW	0			; 終了?
		SUBWF	data0,0
		BTFSC	3,2
		GOTO	estab1
			; 改行文字?
		MOVLW	0AH
		SUBWF	data0,0
		BTFSC	3,2
		GOTO	estab1
			; '?'文字を発見?(=GETコマンドの処理)
		MOVLW	'?'
		SUBWF	data0,0
		BTFSC	3,2
		GOTO	parse_cgi_tag
		goto	estab0
parse9

;-----------------------------------------------------------------------------------
;
;
estab1
		call	abort			; バッファ転送中止
		call	add_ack_no		; ACK NOを加算
;		call	send_ack		; ACKを送信
		
		MOVLW	014H			;バンクアドレス=14h fan
		MOVWF	wk
		goto	send_mes		; メッセージ送信
;
;		バンク間ジャンプ用
parse_cgi_tag
		MOVLW	HIGH(parse_cgi)
		MOVWF	PCLATH

		goto	parse_cgi




ESTAB_01
		incF	INDF,1
		bcf	STATUS,IRP
	;	call	send_ack
	;
		MOVLW	017H	
		MOVWF	wk
		goto	send_mes		; メッセージ送信
ESTAB_02
		incF	INDF,1
		bcf	STATUS,IRP
	;	call	send_ack
		
		;mov	wk,#01Ah		; バンクアドレス=19h
		MOVLW	01AH
		MOVWF	wk
		goto	send_mes		; メッセージ送信
ESTAB_03
		incF	INDF,1
		bcf	STATUS,IRP
	;	call	send_ack
		
		;mov	wk,#01Dh		; バンクアドレス=1bh
		MOVLW	01DH
		MOVWF	wk
		goto	send_mes		; メッセージ送信
;
;		リモートDMA転送中止
abort
		CLRF	PORTC	 
		movlw	22h
		call	assert_wr0		; PAGE0に戻す
		
		MOVLW	0ah
		MOVWF	PORTC
		DB	01,00		;clrw
		call	assert_wr0
		
		MOVLW	0bh
		MOVWF	PORTC
		DB	01,00		;clrw
		call	assert_wr0
		RETURN





;-----------------------------------------------------------------------------------
;		RSTパケットの送信
send_rst
		MOVLW	B'000100'		; RST
		MOVWF	state
		goto	send_common


;-----------------------------------------------------------------------------------
;		FINパケットの送信
send_fin
		MOVLW	B'010001'		; ACK+FIN
		MOVWF	state
		goto	send_common


;-----------------------------------------------------------------------------------
;		ACKパケットの送信
send_ack
		MOVLW	B'010000'		; ACK
		MOVWF	state
;		goto	send_common
send_common
		MOVLW	0		
		MOVWF	ip_length
		;mov	ip_length[1],#IP_SIZE + TCP_SIZE
		MOVLW	IP_SIZE + TCP_SIZE
		MOVWF	ip_length1
		
		MOVLW	TCP_PROTO	
		MOVWF	proto
		call	prepare_ip
		
		MOVLW	PACKET_SIZE + IP_SIZE	
		MOVWF	remote_adr
		;mov	remote_adr[1],#PAGE_BEGIN
		MOVLW	PAGE_BEGIN
		MOVWF	remote_adr1

		;mov	remote_len[0],#20		; 20バイト
		MOVLW	.20
		MOVWF	remote_len
		;mov	remote_len[1],#0
		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			; 相手のポート番号

		MOVF	com_fsr,0
		MOVWF	FSR
		MOVLW	.8
		ADDWF	FSR,1
		bsf	STATUS,IRP
		movlw	4+4
		call	transmit_nbytes			; 自分のSEQNO
		bcf	STATUS,IRP
		
		movlw	50h			; 20bytes
		call	assert_wr
		MOVF	state,0			;mov	w,state
		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			; 緊急ポインタ
		
		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					; 上位転送バイト=0
		call	assert_wr0
		call	transmit			; 送信!!
		RETURN

;-----------------------------------------------------------------------------------
;
;
send_mes
		MOVLW	assert_wr2x & 0ffh	; 送信jobをRTL8019に
		MOVWF	dest
		MOVLW	HIGH (assert_wr2x)	
		MOVWF	dest1		
send_mes_head
				; 仮に65535バイト転送に設定
;-------
		MOVLW	PACKET_SIZE + IP_SIZE
		MOVWF	remote_adr
		MOVLW	PAGE_BEGIN
		MOVWF	remote_adr1

		MOVLW	0FFH
		MOVWF	remote_len
		MOVLW	0FFH
		MOVWF	remote_len1

;-------		

		;mov	remote_len[1],#0ffh		; 
		call	remote_write
		
		;clr	remote_len[0]
		;clr	remote_len[1]
		CLRF	remote_len
		CLRF	remote_len1
		
		call	clear_sum			; チェックサムの値をクリア
		
		MOVLW	http_port & 0ffh
		MOVWF	FSR
		movlw	2
		call	transmit_nbytes2		; 自分のポート番号
		
		MOVLW	tcp_src_port
		MOVWF	FSR
		movlw	2
		call	transmit_nbytes2		; 相手のポート番号

		bsf	STATUS,IRP
		MOVF	com_fsr,0
		MOVWF	FSR
		MOVLW	.8
		ADDWF	FSR,1
		movlw	4
		call	transmit_nbytes2		; 自分のSEQNO
		bcf	STATUS,IRP
	
		MOVLW	tcp_seq_no
		MOVWF	FSR
		movlw	4
		call	transmit_nbytes2		; 相手のSEQNO+1
		
		movlw	50h		; 20bytes
		call	assert_wr2
		movlw	B'011000'
		call	assert_wr2
		
		movlw	08h		; window(high)
		call	assert_wr2
		movlw	00h		; window(low)
		call	assert_wr2
		
		DB	01,00		;clrw
		call	assert_wr2		; tcp sum
		DB	01,00		;clrw
		call	assert_wr2		; tcp sum
		DB	01,00		;clrw
		call	assert_wr2		; 緊急ポインタ
		DB	01,00		;clrw
		call	assert_wr2		; 緊急ポインタ
	
		CLRF	ind
		bsf	STATUS,RP1
		bcf	STATUS,RP0
		MOVF	wk,0		; 読み出すアドレス=[wk:ind]
		MOVWF	EEADRH
send_mes0
		bsf	STATUS,RP1
		bcf	STATUS,RP0
		MOVF	ind,0		
		MOVWF	EEADR
		bsf	STATUS,RP0
		bsf	EECON1,7		;eepgd
		bsf	EECON1,0	;eecon1.0 ; コードエリアからデータを読み出す
		nop				; ダミーサイクル
		nop
		bcf	STATUS,RP0
		MOVF	EEDATH,0		; (読んだデータを)作業領域へ移動
		MOVWF	getmes_wk
		MOVF	EEDATA,0	
		MOVWF	getmes_wk1

		bcf	STATUS,RP1
		
		RLF	getmes_wk1,0		
		RLF	getmes_wk,1		
		MOVF	getmes_wk,0		; 上位7ビットが0か?
		MOVWF	data0
		MOVLW	7FH		
		ANDWF	data0,1
		MOVF	data0,1		
		btfsc	STATUS,Z
		goto	send_mes9		; 上位7ビットが0なら終了
;
;		上位7ビットがメタ文字なら処理を分岐
		MOVLW	'$'  
		SUBWF	data0,0
		BTFSC	3,2
		GOTO	ctrl_code2
 		MOVLW	'@'
		SUBWF	data0,0
		BTFSC	3,2
		GOTO	ctrl_code3
 		MOVLW	'%'
		SUBWF	data0,0
		BTFSC	3,2
		GOTO	ctrl_code4

		MOVLW	'~'
		SUBWF	data0,0
		BTFSC	3,2
		GOTO	ctrl_code5
		
		MOVF	data0,0			;
		call	assert_wr2
		
		MOVF	getmes_wk1,0		; 下位7ビットをRTL8019バッファへ転送
		andlw	7fh
		call	assert_wr2
		
		MOVLW	1					; ind++
		ADDWF	ind,1
		bsf	STATUS,RP1
		bcf	STATUS,RP0
		btfsc	STATUS,C
		INCF	EEADRH,1
		goto	send_mes0
send_mes9

send_mes_foot
		call	abort			; リモートDMA転送の中止
		
	
		MOVF	remote_len,0
		MOVWF	ip_length1
	
		MOVF	remote_len1,0
		MOVWF	ip_length

		call	calc_tcp_sum		; TCP SUMを計算する
		
		MOVLW	.20		;add	ip_length[1],#20; 20を加算
		ADDWF	ip_length1,1
		movlw	1
		btfsc	STATUS,C
		addwf	ip_length,1		;addwf	ip_length[0]
		
		MOVLW	TCP_PROTO	; TCP packet
		MOVWF	proto
		call	prepare_ip		; IPプロトコルの準備
		
		MOVLW	4h
		MOVWF	PORTC
		movlw	PAGE_BEGIN			; transmit page is start page 
		call	assert_wr0
		
		MOVLW	PACKET_SIZE			; パケットサイズ6+6+2を送信バイト数に加算1
		addWF	ip_length1,1
		movlw	1
		btfsc	STATUS,C
		addwf	ip_length,1	
		
		MOVLW	6
		MOVWF	PORTC
		MOVF	ip_length,0		
		call	assert_wr0
		MOVF	ip_length,1		
		btfsc	STATUS,Z
		goto	send_mes_foot1
send_mes_foot2
		MOVLW	5
		MOVWF	PORTC
		MOVF	ip_length1,0	
		call	assert_wr0
		call	transmit			; 送信!!
		
;
;	Additional Code
send_mes_foot3
		MOVLW	PACKET_SIZE+IP_SIZE+TCP_SIZE
		SUBWF	ip_length1,1	
	
		movlw	1
		btfss	STATUS,C
	
		SUBWF	ip_length,1	
		
		MOVF	com_fsr,0
		MOVWF	FSR
		MOVLW	.8
		ADDWF	FSR,1
		call	add_seq_no			; seq noに加算
		RETURN

send_mes_foot1
 		MOVLW	.60
		SUBWF	ip_length1,0
		BTFSC	3,0
		GOTO	send_mes_foot2
		MOVLW	5
		MOVWF	PORTC
		movlw	.60				; MINIMUM 60bytes
		call	assert_wr0
		call	transmit
		goto	send_mes_foot3

;-----------------------------------------------------------------------------------
;		AD変換
;
ad_in
		RLF	getmes_wk1,1	
		RLF	getmes_wk1,1		
		RLF	getmes_wk1,1		
		MOVLW	B'00111000'	 
		ANDWF	getmes_wk1,1
		MOVLW	B'10000001'	
		IORWF	getmes_wk1,1
		MOVF	getmes_wk1,0		; ADCON1に値を設定
		MOVWF	ADCON1
		MOVLW	1	
		MOVWF	wait_cn
		MOVLW	HIGH (wait_ms)
		MOVWF	PCLATH

		call	wait_ms				; サンプリング時間20us待機
		MOVLW	HIGH (ad_in)
		MOVWF	PCLATH
		
		bsf	ADCON1,2		; AD変換開始
		btfsc	ADCON1,2		; AD変換待ち
		goto	$-1
		
		MOVF	ADRESH,0			; 変換結果をval[1]:val[0]へ
		MOVWF	val1
		bsf	STATUS,RP0
		MOVF	ADRESL,0	
		bcf	STATUS,RP0
		movwf	val		
		
		btfss	getmes_wk1,5				; RA5かどうか?
		goto	ad_in1				; RA5以外
	;
	;AD変換結果を5倍する
	;
		BCF	3,0		
		RLF	val,1		
		RLF	val1,1		
		BCF	3,0	
		RLF	val,1		
		RLF	val1,1		
		
		MOVF	ADRESH,0	
		ADDWF	val1,1
		bsf	STATUS,RP0
		MOVF	ADRESL,0
		bcf	STATUS,RP0
		addwf	val,1
		btfsc	STATUS,C
		INCF	val1,1	

		MOVLW	decimal_top & 0ffh	; 格納場所初期値
		MOVWF	FSR
		bsf	STATUS,IRP			; IRP=1
		MOVLW	HIGH (divide16)
		MOVWF	PCLATH

		call	divide16
ad_in1
		MOVLW	HIGH (put_decimal16)
		MOVWF	PCLATH

		call	put_decimal16			; 10進数に変換
		MOVLW	HIGH (ad_in1)
		MOVWF	PCLATH
		goto	ctrl_next



;-----------------------------------------------------------------------------------
;	SOCKET STATUS
ctrl_code5
		MOVLW	7FH		
		ANDWF	getmes_wk1,1
		swapf	getmes_wk1,1	
		movf	getmes_wk1,0	
		movwf	FSR
		bsf	STATUS,IRP
		
;		movlw	put_socket_stat >> 8	
;		MOVWF	PCLATH
;		call	put_socket_stat			; socketステータスを表示
		bcf	STATUS,IRP
		goto	ctrl_next
;--------------------------------------------------------------------------
;	TRIS
;	入力?出力の表示
ctrl_code4
		MOVLW	7FH		
		ANDWF	getmes_wk1,1
		MOVF	getmes_wk1,0
		MOVWF	FSR
		SWAPF	FSR,1		
		MOVLW	0FH		
		ANDWF	FSR,1
		MOVLW	PORTA | 80H	
		ADDWF	FSR,1
		
		MOVF	getmes_wk1,0
		call	getbitpos
		MOVF	INDF,0		
		ANDWF	data0,1
		BTFSC	3,2		
		GOTO	ctrl_out
		goto	ctrl_in
;
;		ビット位置返す
;
getbitpos
		movwf	wk
		MOVLW	1	
		MOVWF	data0
		MOVLW	07H		
		ANDWF	wk,1
		BTFSC	3,2		
		GOTO	getbitpos9
getbitpos0
		BCF	3,0	
		RLF	data0,1	
		DECFSZ	wk,1		
		GOTO	getbitpos0
getbitpos9	RETURN


;-----------------------------------------------------------------------------------
;	PARALLEL
;	現在のHigh/Lowの表示
ctrl_code3
		MOVLW	7FH		
		ANDWF	getmes_wk1,1
		MOVF	getmes_wk1,0
		MOVWF	FSR
		SWAPF	FSR,1		
		MOVLW	0FH		
		ANDWF	FSR,1
		BTFSS	3,2		
		GOTO	ctrl_code31

		MOVLW	80h | PORTA
		ADDWF	FSR,1
		MOVF	getmes_wk1,0
		call	getbitpos
		
		MOVF	INDF,0
		andwf	data0,0				; TRIS_RAのチェック

⌨️ 快捷键说明

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