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