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

📄 v12.asm

📁 日本秋月电子采用PIC16F877a单片机的PICNIC以太网适配器程序
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	list      p=16f877            ; list directive to define processor

	#include <p16f877.inc>        ; processor specific variable definitions
	
;
;		PICNIC - PIC Network Interface Controller
;		Copyright (c) 2002 SHINSHU UNIVERSITY KISO LAB
;		 All Rights Reserved.
;
;		1-SEP-2002	Version 1.2.0.0
;
;


;-----------------------------------------------------------------------------------
	
	__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _HS_OSC & _LVP_OFF


;-----------------------------------------------------------------------------------
HTTP_PORT		EQU	.80			; HTTPポート番号(80=デフォルト)
LCD_PORT		EQU	.0			; LCDコントロール用ポート番号(0=未使用)
PARALLEL_PORT		EQU	.10001			; パラレル用ポート番号(0=未使用)
SERIAL_PORT		EQU	.10002			; シリアル用ポート番号(0=未使用)

BOOTPC_PORT		EQU	.68			; BOOTPポート番号(クライアント)
BOOTPS_PORT		EQU	.67			; BOOTPポート番号(サーバ)

BAUD_RATE		EQU	.129	;10		; リセット時のRS232Cボーレート
							; 129=9600bps
							; 10=115200bps

PARALLEL_PACKET_SIZE	EQU	.8			; パラレル転送パケットサイズ
SERIAL_PACKET_SIZE	EQU	(.2 + .6 + .4 + .2 + .1 + .1)		; シリアルステータスパケットのサイズ
							; type:mac:ip:port:baud:flow
CH_BACKSPACE		EQU	.8			; バックスペースの文字コード
SOCKETS			EQU	.4			; ソケット総数(変更不可)


;-----------------------------------------------------------------------------------

		ORG	0x2100
		
		DE	.192, .168, 0, .200	; IPアドレス(0.0.0.0=DHCP)
		DE	.255 , .255 , .255 , 0	; ネットマスク
		DE	0,0,0,0		; GateWay
		DE	1,2,0,0		; Farmware Version x,x,x,x
		
		
		DE	HTTP_PORT / .256 , HTTP_PORT & .255				; HTTPポート番号
		DE	LCD_PORT / .256 , LCD_PORT & .255				; LCDポート番号
		DE	PARALLEL_PORT / .256 , PARALLEL_PORT & .255			; PARALLELポート番号
		DE	SERIAL_PORT / .256 , SERIAL_PORT & .255			; SERIALポート番号

;
;-----------------------------------------------------------------------------------

;
;		プロトコル番号など
;
COM_PROTO	EQU	08H			; HIGH BYTE(共通)
IP_PROTO	EQU	00H			; LOW BYTE (0800h means IP packet)
ARP_PROTO	EQU	06H			; LOW BYTE (0806h means ARP packet)


TCP_PROTO	EQU	.6
UDP_PROTO	EQU	.17
ICMP_PROTO	EQU	.1

;
;		RTL8019AS関連設定項目
;
PAGE_BEGIN	EQU	40H			; メモリ先頭アドレス
PAGE_START	EQU	46H			; 受信バッファ先頭アドレス
PAGE_STOP	EQU	80H			; 受信バッファ終端アドレス

DATA_SIZE	EQU	.18

;
;		Ethernet関連設定項目
;
NE_SIZE		EQU	.4			; RTL8019ステータスエリアサイズ
PACKET_SIZE	EQU	.6 + .6 + .2			; Ethernetヘッダサイズ
ARP_SIZE	EQU	.28			; ARPパケットサイズ
IP_SIZE		EQU	.20			; IP(基本)ヘッダサイズ
UDP_SIZE	EQU	.8			; UDPヘッダサイズ
TCP_SIZE	EQU	.20			; TCP(基本)ヘッダサイズ
DHCP_SIZE	EQU	.308
;
;		TCP/IPステート
;
LISTEN		EQU	00			; ひま
SYN_RCVD	EQU	80H			; SYN,ACKを送ってACKを待っている
ESTAB		EQU	81H			; 通信確立
CLOSE_WAIT	EQU	82H
LAST_ACK	EQU	83H
FIN_WAIT_1	EQU	84H
FIN_WAIT_2	EQU	85H
CLOSING		EQU	86H
TIME_WAIT	EQU	87H

;		ソケット構造体
;------------------------------------------
;		org	0
;so_job		ds	2
;so_ip		ds	4
;so_port	ds	2
;so_seq_no	ds	4
;so_ack_no	ds	4
;------------------------------------------



;-----------------------------------------------------------------------------------
;		I/Oポート設定
;-----------------------------------------------------------------------------------
SA		EQU	PORTC			; NE2000 アドレスバス
SA0		EQU	0			;rc.0
SA1		EQU	1
SA2		EQU	2
SA3		EQU	3
SA4		EQU	4			;rc.4

SD		EQU	PORTD
SD0		EQU	0			;rd.0
SD1		EQU	1
SD2		EQU	2
SD3		EQU	3
SD4		EQU	4
SD5		EQU	5
SD6		EQU	6
SD7		EQU	7			;rd.7

RDY		EQU	5			;rc.5		; ~IOCHRDY


CNT		EQU	PORTE
RD		EQU	0			;re.0	; RTL8019AS ~RD
WR		EQU	1			;re.1	; RTL8019AS ~WR


;
;		LCD用I/O設定(オプショナルLCD用)
;
D7		EQU	7			;rb.7			; 液晶用
D6		EQU	6
D5		EQU	5
D4		EQU	4
E		EQU	3			; 液晶イネーブル
RS		EQU	2			;rb.2 ; 液晶RSピン



;-----------------------------------------------------------------------------------
;		グローバル変数
;-----------------------------------------------------------------------------------
;		PAGE 0 
;		org	20h

;	LCD用変数
wait_cn		EQU	20H	
wait_cn2	EQU	21H	
d4		EQU	22H	
d8		EQU	23H	

cd		EQU	24H
tmp		EQU	24H	
use		EQU	25H	
;-----------------------------------------------------------------------------------
gcn1		EQU	26H	
sum		EQU	27H		; check sum for TCP,...
sum1		EQU	28H
bytes		EQU	29H			; current ptr for calculate above
ptr		EQU	2AH	


cn_l		EQU	2BH		; fan free
cn_h		EQU	2CH	

remote_adr	EQU	2DH			; リモート
remote_adr1	EQU	2EH
remote_len	EQU	2FH	
remote_len1	EQU	30H
curr		EQU	31H			; Current page address


val		EQU	32H	
val1		EQU	33H	
val2		EQU	34H	
val3		EQU	35H	
val_m		EQU	36H			; for DECIMAL
val_cn		EQU	37H
proto		EQU	37H			; プロトコル番号
state		EQU	38H			; TCPフラグ

;-----------------------------------------------------------------------------------
;
;		IPプロトコル
;
ip_header	EQU	39H
ip_ver_len	EQU	39H		; VERSION:4,DATA SIZE:5
ip_tos		EQU	3AH		; service type
ip_length	EQU	3BH		; データ長
ip_length1	EQU	3CH
ip_ident	EQU	3DH	
ip_ident1	EQU	3EH
ip_flagment	EQU	3FH		
ip_flagment1	EQU	40H
ip_ttl		EQU	41H		; 生存期間
ip_proto	EQU	42H		; プロトコル 1:ICMP,6:TCP,17:UDP
ip_sum		EQU	43H		; ヘッダチェックサム
ip_sum1		EQU	44H
ip_src		EQU	45H	
ip_src1		EQU	46H
ip_src2		EQU	47H
ip_src3		EQU	48H
ip_dest		EQU	49H	
ip_dest1	EQU	4AH
ip_dest2	EQU	4BH
ip_dest3	EQU	4CH


;-----------------------------------------------------------------------------------
;		TCPプロトコル
;
tcp_header	EQU	4DH	
tcp_src_port	EQU	4DH	
tcp_src_port1	EQU	4EH
tcp_tar_port	EQU	4FH	
tcp_tar_port1	EQU	50H
tcp_seq_no	EQU	51H	
tcp_seq_no1	EQU	52H
tcp_seq_no2	EQU	53H
tcp_seq_no3	EQU	54H
tcp_ack_no	EQU	55H	
tcp_ack_no1	EQU	56H
tcp_ack_no2	EQU	57H
tcp_ack_no3	EQU	58H
tcp_header_size	EQU	59H	
tcp_flags	EQU	5AH	
TCP_URG		EQU	5	
TCP_ACK		EQU	4	
TCP_PSH		EQU	3	
TCP_RST		EQU	2
TCP_SYN		EQU	1	
TCP_FIN		EQU	0	

tcp_window	EQU	5BH	
tcp_window1	EQU	5CH
tcp_sum		EQU	5DH	
tcp_sum1	EQU	5DH
tcp_		EQU	5FH	
tcp_1		EQU	60H	

;-----------------------------------------------------------------------------------
;		UDPプロトコル
;
udp_header	SET	tcp_header
udp_src_port	SET	tcp_header+0
udp_src_port1	SET	tcp_header+1
udp_tar_port	SET	tcp_header+2
udp_tar_port1	SET	tcp_header+3
udp_length	SET	tcp_header+4
udp_length1	SET	tcp_header+5
udp_sum		SET	tcp_header+6
udp_sum1	SET	tcp_header+7
udp_data	SET	tcp_header+8
udp_data1	SET	tcp_header+9
udp_data2	SET	tcp_header + .10
udp_data3	SET	tcp_header + .11
udp_data4	SET	tcp_header + .12
udp_data5	SET	tcp_header + .13
udp_data6	SET	tcp_header + .14
udp_data7	SET	tcp_header + .15


;-----------------------------------------------------------------------------------
;		ARPプロトコル
;
arp_header	SET	ip_header
arp_hard_type	SET	ip_header+0
arp_prot_type	SET	ip_header+2
arp_hard_len	SET	ip_header+4
arp_prot_len	SET	ip_header+5
arp_ope		SET	ip_header+6
arp_ope1	SET	ip_header+7
arp_src_mac	SET	ip_header+8
arp_src_ip	SET	ip_header + .14
arp_dest_mac	SET	ip_header + .18
arp_dest_ip	SET	ip_header + .24
arp_dest_ip1	SET	ip_header + .25
arp_dest_ip2	SET	ip_header + .26
arp_dest_ip3	SET	ip_header + .27
;		=	ip_header + .28


;-----------------------------------------------------------------------------------
;		ICMPプロトコル
;
icmp_header	SET	tcp_header
icmp_type	SET	tcp_header+0
icmp_code	SET	tcp_header+1
icmp_sum	SET	tcp_header+2
icmp_mes	SET	tcp_header+4


;-----------------------------------------------------------------------------------
;		DHCPプロトコル
;
dhcp_header	SET	udp_data
dhcp_ope	SET	udp_data+0
dhcp_type	SET	udp_data+1
dhcp_phylen	SET	udp_data+2
dhcp_hop	SET	udp_data+3
dhcp_trans	SET	udp_data+4
dhcp_sec	SET	udp_data+8
dhcp_dummy	SET	udp_data + .10
dhcp_client_ip	SET	udp_data + .12
dhcp_user_ip	SET	udp_data + .16
dhcp_user_ip1	SET	udp_data + .17
dhcp_user_ip2	SET	udp_data + .18
dhcp_user_ip3	SET	udp_data + .19
dhcp_server_ip	SET	udp_data + .20
dhcp_server_ip1	SET	udp_data + .21
dhcp_server_ip2	SET	udp_data + .22
dhcp_server_ip3	SET	udp_data + .23
dhcp_router_ip	SET	udp_data + .24


;-----------------------------------------------------------------------------------
;		環境設定用変数
;
;		PAGE 1
;		org	0a0h
this_ip		EQU	0A0H		; 自分のIPアドレス
this_ip1	EQU	0A1H		
this_ip2	EQU	0A2H		
this_ip3	EQU	0A3H		
mymac		EQU	0A4H		; 自分のMACアドレス
mymac1		EQU	0A5H
mymac2		EQU	0A6H
mymac3		EQU	0A7H
mymac4		EQU	0A8H
mymac5		EQU	0A9H
seq_no		EQU	0AAH			; 自分のシーケンス番号
seq_no1		EQU	0ABH		
seq_no2		EQU	0ACH		
seq_no3		EQU	0ADH
ident		EQU	0AEH		
ident1		EQU	0AFH
timer		EQU	0B0H		
timer_cn	EQU	0B1H		
dhcp_done	EQU	0B2H		
http_port	EQU	0B3H			; EEPROMからのポート番号のコピー
http_port1	EQU	0B4H
lcd_port	EQU	0B5H		
lcd_port1	EQU	0B6H
para_port	EQU	0B7H		
para_port1	EQU	0B8H
serial_port	EQU	0B9H		
serial_port1	EQU	0BAH

fifo_poi	EQU	0BBH		; ルーチンで使用する(GET)ポインタ
fifo_buff	EQU	0BCH		; 割り込みで使用する(SET)ポインタ
fifo_cn		EQU	0BDH		; 受信バイト数
fifo_top	EQU	0BEH		; バッファ
fifo_bottom	EQU	0DCH

fifo_line	EQU	0DCH		
fifo_line_cn	EQU	0DDH	


;-----------------------------------------------------------------------------------
;		Ethernetヘッダ
;
ne_header	EQU	0DEH		; NE2000 Status
ne_stat		EQU	0DEH		; 受信ステータス(RSR)
ne_next		EQU	0DFH		; 次のバウンダリポインタ(Next Boundary)
ne_cn_l		EQU	0E0H		; データサイズ(L)
ne_cn_h		EQU	0E1H		; データサイズ(H)

eth_header	EQU	0E2H			; Ethernet Header
eth_dest	EQU	0E2H			; 送信先MACアドレス
eth_dest1	EQU	0E3H
eth_dest2	EQU	0E4H
eth_dest3	EQU	0E5H
eth_dest4	EQU	0E6H
eth_dest5	EQU	0E7H
eth_src		EQU	0E8H		; 送信元MACアドレス
eth_src1	EQU	0E9H
eth_src2	EQU	0EAH
eth_src3	EQU	0EBH
eth_src4	EQU	0ECH
eth_src5	EQU	0EDH
eth_type	EQU	0EEH		; パケットタイプ
eth_type1	EQU	0EFH
null		EQU	0F0H


bs_ptr		SET	ne_header
bs_ptr2		SET	ne_header+1
save_line	SET	ne_header+2
save_cn		SET	ne_header+3




;-----------------------------------------------------------------------------------
;		共通変数
;

;		org	70h		; COMMON MEMORY PAGE
; BEGIN -- 割り込み時レジスタ待避用
w_save		EQU	070H	
pclath_save	EQU	071H	
status_save	EQU	072H	
fsr_save	EQU	073H		
save_fsr	EQU	074H		
; END

mul10		EQU	075H
mul101		EQU	076H
getmes_wk	EQU	075H		
getmes_wk1	EQU	076H
com_cn		EQU	077H		
byte_cn		EQU	078H		
com_fsr		EQU	078H		
ind		EQU	079H		
dest		EQU	07AH		
dest1		EQU	07BH
data0		EQU	07CH		; a data for transmit to ethernet chip
wk		EQU	07DH	
wk1		EQU	07EH
wk2		EQU	07FH
common		EQU	07FH	

;-----------------------------------------------------------------------------------
;	10進変換用エリア
;-----------------------------------------------------------------------------------
;		PAGE 2
;		
			; バイナリ→10進数変換用
decimal_top	EQU	120H	


;-----------------------------------------------------------------------------------
;	RS232C送信先データ
;-----------------------------------------------------------------------------------
;		PAGE 3
;		org	190h
on_ether	EQU	190H			; 宛て先Ethernetアドレス
on_ether1	EQU	191H
on_ether2	EQU	192H
on_ether3	EQU	193H
on_ether4	EQU	194H
on_ether5	EQU	195H
on_ip		EQU	196H		; 宛て先IPアドレス
on_ip1		EQU	197H
on_ip2		EQU	198H
on_ip3		EQU	199H
on_port		EQU	19AH				; 宛て先ポート番号
on_port1	EQU	19AH
on_rate		EQU	19CH				; 設定されているボーレート
on_flow		EQU	19DH				; =0
transmitted	EQU	19EH
skb		EQU	1A0H
;-----------------------------------------------------------------------------------
;		プログラムエントリ
;-----------------------------------------------------------------------------------
		ORG	0			; リセットベクタ(=0000h)
		MOVLW	HIGH (start)		; スタートアップルーチンへ

		MOVWF	PCLATH
		GOTO	start

;-----------------------------------------------------------------------------------
;		割り込み処理
;
;		スタック消費を押さえるため、割り込み処理内ではcallしてはいけない。
;-----------------------------------------------------------------------------------

		org	4		; 割り込みベクタ(=0004h)
interrupt
;-----------------------------------------------------------------------------------
;		コンテキスト待避処理
		movwf	w_save		; Wレジスタ保存
		swapf	STATUS, 0	; STATUSレジスタを保存
		clrf	STATUS				; STATUSを0にする
		movwf	status_save
		movf	PCLATH,0		; PCLATHを保存
		movwf	pclath_save
		clrf	PCLATH			; PCLATH=0にする
		bcf	STATUS,IRP	
		movf	FSR, 0		
		movwf	fsr_save	; FSRを保存する
;-------------------------------------------------------------------------------;		RB0割り込み
		btfss	INTCON,INTE
		GOTO	int_next2
		BTFSS	INTCON,INTF
		GOTO	int_next2

		bcf	INTCON,INTF
		BSF	STATUS,RP0
		BSF	STATUS,RP1
		BSF	on_flow,7
		BCF	STATUS,RP1
		BCF	STATUS,RP0
;-------------------------------------------------------------------------------;
int_next2
		BTFSC	PIR1,TMR1IF
		goto	int_tmr1
		goto	int_next1
int_tmr1
		bcf	PIR1,TMR1IF
		BSF	STATUS,RP0
		MOVF	dhcp_done,0
		andlw	7FH
		btfss	STATUS,Z
		DECF	dhcp_done,1
		bcf	STATUS,RP0
int_tmr2
		bsf	STATUS,RP0
		MOVLW	1
		ADDWF	timer,1
		btfsc	STATUS,C
		GOTO	dec_tm
dec_tm9		CLRF	STATUS
;-------------------------------------------------------------------------------
int_next1
		btfss	INTCON, PEIE	
		goto	int2
		btfss	PIR1,RCIF			; RS232C受信?
		goto	int2
;-----------------------------------------------------------------------------------
;		シリアル受信割り込み処理
		bsf	STATUS,RP0	
		
		MOVLW	fifo_bottom - fifo_top
		SUBWF	fifo_cn,0
		BTFSC	3,0
		GOTO	rec_over

		movf	fifo_buff,0		; 現在のリング
		movwf	FSR		;バッファのポインタ取得→fsrへ
		bcf	STATUS,RP0	;
		MOVF	RCREG,0			; リングバッ
		MOVWF	INDF		;ファに受信データを保存
		bsf	STATUS,RP0	
		incF	fifo_buff,1	; 次のアドレスに...
		
		MOVLW	fifo_bottom
		SUBWF	fifo_buff,0
		BTFSS	3,0
		GOTO	int1_1

		MOVLW	fifo_top	
		movwf	fifo_buff
int1_1		incf	fifo_cn,1		; リングバッファにあるデータバイト数++
;-----------------------------------------------------------------------------------
		MOVLW	(fifo_bottom - fifo_top) / 2	; [2004/10/30]
		subwf	fifo_cn,0
		btfss	3,0
		goto	int2
		bsf	STATUS,RP1
		BTFSS	on_flow,0
		GOTO	int2
		CLRF	STATUS
		BSF	PORTB,1
int2
		CLRF	STATUS
;-------------------------------------------------------------------------------;		コンテキスト復帰処理
		MOVF	fsr_save,0			; fsrを復帰
		MOVWF	FSR
		MOVF	pclath_save,0		; pclathを復帰
		MOVWF	PCLATH
		swapf	status_save,0
		movwf	STATUS					; statusを復帰
		swapf	w_save,1
		swapf	w_save,0		; Wを復帰
;	ISR終了
		retfie				; 割り込みルーチンからのリターン


;		RS232C受信バッファオーバーフロー
rec_over
		bcf	STATUS, RP0	
		MOVF	RCREG, 0				; データを読んで捨てる
		bcf	STATUS, RP0	
		goto	int2


;-----------------------------------------------------------------------------------
;		ソケットのタイムアウトチェック
;
dec_tm
		bsf	STATUS, IRP
		MOVLW	SOCKETS
		MOVWF	timer_cn
		MOVLW	(skb + 1) & 0FFH	
		MOVWF	FSR
dec_tm0
		MOVF	INDF,0		
		andlw	0f0h
		btfsc	STATUS, Z	
		goto	dec_tm1
		MOVLW	10H		
		SUBWF	INDF, 1
		movF	INDF, 0		
		andlw	0f0h
		btfss	STATUS, Z	
		goto	dec_tm1
		DECF	FSR, 1		
		CLRF	INDF		
		INCF	FSR,1		
dec_tm1
		MOVLW	10H		
		ADDWF	FSR, 1
		DECFSZ	timer_cn, 1

⌨️ 快捷键说明

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