📄 v12.asm
字号:
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 + -