?? picnic.asm
字號:
RETURN
;-----------------------------------------------------------------------------------
; BOOTP應(yīng)答
;-----------------------------------------------------------------------------------
bootp_res:
CALL get_remain
MOVLW this_ip
MOVWF FSR
MOVF INDF,W
INCF FSR,F
IORWF INDF,W
INCF FSR,F
IORWF INDF,W
INCF FSR,F
IORWF INDF,W
BTFSS STATUS,Z
GOTO main9
MOVLW HIGH bootp
MOVWF PCLATH
CALL bootp & 0x7ff
MOVLW HIGH $
MOVWF PCLATH
MOVLW 0x35
CALL assert_wr
MOVLW 0x01
CALL assert_wr
MOVLW 0x03 ;request
CALL assert_wr
MOVLW 0x3D
CALL assert_wr
MOVLW 0x07
CALL assert_wr
MOVLW 0x01
CALL assert_wr
MOVLW mymac
MOVWF FSR
MOVLW 0x06
CALL transmit_nbytes ;自己的IP地址
MOVLW 0x36
CALL assert_wr
MOVLW 0x04
CALL assert_wr
MOVLW 0xC0
CALL assert_wr
MOVLW 0xA8
CALL assert_wr
MOVLW 0x00
CALL assert_wr
MOVLW 0x03
CALL assert_wr
MOVLW 0x32
CALL assert_wr
MOVLW 0x04
CALL assert_wr
MOVLW dhcp_user_ip
MOVWF FSR
MOVLW 0x04
CALL transmit_nbytes
MOVLW 0xFF
CALL assert_wr
MOVLW 0x23
MOVWF gcn1
bootp_40:
dw 0x100
CALL assert_wr
DECFSZ gcn1,F
GOTO bootp_40
MOVLW HIGH bootp_tx
MOVWF PCLATH
CALL bootp_tx & 0x7ff
MOVLW HIGH $
MOVWF PCLATH
MOVLW this_ip
MOVWF FSR
MOVF dhcp_user_ip,W
MOVWF INDF
INCF FSR,F
MOVF dhcp_user_ip+1,W
MOVWF INDF
INCF FSR,F
MOVF dhcp_user_ip+2,W
MOVWF INDF
INCF FSR,F
MOVF dhcp_user_ip+3,W
MOVWF INDF
BSF STATUS,RP0
CLRF dhcp_done & 0x7F
BCF STATUS,RP0
;
; 在LCD上顯示取得的IP地址
BCF PORTB,RB2 ;RS
MOVLW 0xC0
MOVWF d4
MOVLW HIGH write_lcd4
MOVWF PCLATH
CALL write_lcd4 & 0x7ff ;移動到第2行
MOVLW HIGH print_ip
MOVWF PCLATH
CALL print_ip & 0x7ff ;顯示
CLRF PORTB
CLRF PCLATH
GOTO main9
;-----------------------------------------------------------------------------------
; TCP
;-----------------------------------------------------------------------------------
tcp:
MOVLW 0x14
MOVWF gcn1 ;讀取20 bytes
CALL copy_toram
MOVLW http_port
MOVWF FSR
MOVF INDF,W
SUBWF tcp_tar_port,W
BTFSS STATUS,Z ; EEPROM中的HTTP Port一致嗎?
GOTO tcp9
INCF FSR,F
MOVF INDF,W
SUBWF tcp_tar_port+1,W
BTFSC STATUS,Z
GOTO tcp_www
tcp9:
GOTO main9
;
; HTTP處理
;
tcp_www:
MOVLW this_ip ;檢查是否自己的IP地址
MOVWF FSR
MOVF INDF,W
INCF FSR,F
IORWF INDF,W
INCF FSR,F
IORWF INDF,W
INCF FSR,F
IORWF INDF,W
BTFSC STATUS,Z
GOTO main9 ;如果是0.0.0.0的話就中止處理
BTFSC TCP_URG ;URG
GOTO main9 ;丟棄
MOVLW HIGH search_socket
MOVWF PCLATH
CALL search_socket & 0x7ff ; Socket檢索
MOVLW HIGH $
MOVWF PCLATH
BTFSC STATUS,C
GOTO state1
CALL no_socket ;Socket作成
GOTO main9
;
; Socket State 1
;
state1:
MOVLW 0x0C
ADDWF FSR,F
MOVF INDF,W
SUBWF tcp_seq_no,W
BTFSS STATUS,Z
GOTO state12
INCF FSR,F
MOVF INDF,W
SUBWF tcp_seq_no+1,W
BTFSS STATUS,Z
GOTO state12
INCF FSR,F
MOVF INDF,W
SUBWF tcp_seq_no+2,W
BTFSS STATUS,Z
GOTO state12
INCF FSR,F
MOVF INDF,W
SUBWF tcp_seq_no+3,W
BTFSS STATUS,Z
GOTO state12
MOVLW 0x0F
SUBWF FSR,F
CALL state2
state12:
CLRF PCLATH
GOTO main9
state2:
MOVLW HIGH state_table
MOVWF PCLATH
MOVF INDF,W
ANDLW 0x7F
ADDWF PCL,F
state_table
GOTO job_SYN_RCVD
GOTO job_ESTAB
GOTO job_CLOSE_WAIT
GOTO main9
GOTO job_FIN_WAIT_1
GOTO job_FIN_WAIT_2
GOTO main9
GOTO main9
GOTO main9 ;ACK,PSH,RST,SYN,FIN
;-----------------------------------------------------------------------------------
; 收到SYN
; 發(fā)送SYN,ACK,等待ACK
;-----------------------------------------------------------------------------------
job_SYN_RCVD:
BTFSC TCP_RST
GOTO recv_rst
BTFSC TCP_FIN
GOTO recv_fin
BTFSS TCP_ACK
RETURN
MOVLW ESTAB
MOVWF INDF
BCF STATUS,IRP
RETURN
recv_rst
CLRF INDF
BCF STATUS,IRP
RETURN
;-----------------------------------------------------------------------------------
;
job_FIN_WAIT_1:
BTFSC TCP_RST
GOTO recv_rst
BTFSS TCP_ACK
RETURN
MOVLW FIN_WAIT_2
MOVWF INDF
BCF STATUS,IRP
RETURN
;-----------------------------------------------------------------------------------
;
job_FIN_WAIT_2:
BTFSC TCP_RST
GOTO recv_rst
BTFSS TCP_FIN
RETURN
CLRF INDF
BCF STATUS,IRP
CALL inc_ack_no
CALL send_ack
RETURN
;-----------------------------------------------------------------------------------
;
NOP
job_ESTAB:
BTFSC TCP_RST
GOTO recv_rst
BTFSC TCP_FIN
GOTO recv_fin
INCF FSR,F
MOVLW HIGH $
MOVWF PCLATH
MOVF INDF,W
ANDLW 0x0F
ADDWF PCL,F
GOTO ESTAB_00
GOTO ESTAB_01
GOTO ESTAB_02
GOTO ESTAB_03
GOTO ESTAB_99
recv_fin:
MOVLW 0x00
MOVWF INDF
BCF STATUS,IRP
CALL inc_ack_no
CALL send_ack
RETURN
;-----------------------------------------------------------------------------------
;
job_CLOSE_WAIT:
MOVLW 0x00
MOVWF INDF
BCF STATUS,IRP
CALL send_fin
RETURN
ESTAB_99
DECF FSR,F
MOVLW FIN_WAIT_1
MOVWF INDF
BCF STATUS,IRP
CALL send_fin
MOVF com_fsr,W
MOVWF FSR
MOVLW 0x08
ADDWF FSR,F
CALL inc_seq_no
RETURN
;-----------------------------------------------------------------------------------
; ESTABLISH
;
ESTAB_00:
INCF INDF,F
BCF STATUS,IRP
estab0
MOVLW HIGH get_nextbyte
MOVWF PCLATH
CALL get_nextbyte ;從buffer取得數(shù)據(jù)
MOVLW HIGH $
MOVWF PCLATH
MOVLW 0x00
SUBWF mdata,W
BTFSC STATUS,Z
GOTO estab1 ;終了?
MOVLW 0x0A
SUBWF mdata,W
BTFSC STATUS,Z
GOTO estab1 ;換行符?
MOVLW '?'
SUBWF mdata,W
BTFSC STATUS,Z
GOTO parse_cgi_tag ;發(fā)現(xiàn)了'?'字符?(=GET命令處理)
GOTO estab0
parse9
;-----------------------------------------------------------------------------------
;
estab1
CALL abort ;中止Buffer傳送
CALL add_ack_no ;增加ACK NO
MOVLW 0x14
MOVWF wk ;Bank Address = 14h
GOTO send_mes ;送信
;
; Bank間跳轉(zhuǎn)用
parse_cgi_tag
MOVLW HIGH parse_cgi
MOVWF PCLATH
GOTO parse_cgi
ESTAB_01
INCF INDF,F
BCF STATUS,IRP
MOVLW 0x17
MOVWF wk
GOTO send_mes ;送信
ESTAB_02
INCF INDF,F
BCF STATUS,IRP
MOVLW 0x1A
MOVWF wk
GOTO send_mes ;送信
ESTAB_03
INCF INDF,F
BCF STATUS,IRP
MOVLW 0x1D
MOVWF wk
GOTO send_mes ;送信
;
; 中止Remote DMA傳送
;
abort:
CLRF PORTC
MOVLW 0x22
CALL assert_wr0 ;回到PAGE0
MOVLW 0x0A
MOVWF PORTC
dw 0x100
CALL assert_wr0
MOVLW 0x0B
MOVWF PORTC
dw 0x100
CALL assert_wr0
RETURN
;-----------------------------------------------------------------------------------
; 發(fā)送RST包
send_rst:
MOVLW b'00000100' ;RST
MOVWF state
GOTO send_common
;-----------------------------------------------------------------------------------
; 發(fā)送FIN包
send_fin
MOVLW b'00010001' ;ACK+FIN
MOVWF state
GOTO send_common
;-----------------------------------------------------------------------------------
; 發(fā)送ACK包
send_ack
MOVLW b'00010000' ;ACK
MOVWF state
send_common:
MOVLW 0x00
MOVWF ip_length
MOVLW IP_SIZE + TCP_SIZE
MOVWF ip_length+1
MOVLW TCP_PROTO
MOVWF proto ;TCP packet
CALL prepare_ip
MOVLW PACKET_SIZE+IP_SIZE
MOVWF remote_adr
MOVLW PAGE_BEGIN
MOVWF remote_adr+1
MOVLW 0x14
MOVWF remote_len
MOVLW 0x00
MOVWF remote_len+1
CALL remote_write
CALL clear_sum
MOVLW http_port
MOVWF FSR
MOVLW 0x02
CALL transmit_nbytes ;自己的Port號
MOVLW tcp_src_port
MOVWF FSR
MOVLW 0x02
CALL transmit_nbytes ;對方的Port號
MOVF com_fsr,W
MOVWF FSR
MOVLW 0x08
ADDWF FSR,F
BSF STATUS,IRP
MOVLW 0x08
CALL transmit_nbytes ;自己的Seq No
BCF STATUS,IRP
MOVLW 0x50 ;20 bytes
CALL assert_wr
MOVF state,W
CALL assert_wr
MOVLW 0x08 ;window(high)
CALL assert_wr
MOVLW 0x00 ;window(low)
CALL assert_wr
CALL assert_wr2times ;tcp sum
CALL assert_wr2times ;緊急point
CALL calc_tcp_sum ;計算tcp sum
MOVLW 0x04
MOVWF PORTC
MOVLW PAGE_BEGIN ;transmit page is start page
CALL assert_wr0
MOVLW 0x05
MOVWF PORTC
MOVLW 0x3C ;送60 bytes
CALL assert_wr0
MOVLW 0x06
MOVWF PORTC
dw 0x100
CALL assert_wr0
CALL transmit ;送信
RETURN
;-----------------------------------------------------------------------------------
;
send_mes:
MOVLW LOW assert_wr2x ;設(shè)置RTL8019的送信任務(wù)
MOVWF dest
MOVLW HIGH assert_wr2x
MOVWF dest+1
send_mes_head
MOVLW PACKET_SIZE+IP_SIZE
MOVWF remote_adr
MOVLW PAGE_BEGIN
MOVWF remote_adr+1
MOVLW 0xFF
MOVWF remote_len
MOVLW 0xFF
MOVWF remote_len+1
CALL remote_write
CLRF remote_len
CLRF remote_len+1
CALL clear_sum
MOVLW http_port
MOVWF FSR
MOVLW 0x02
CALL transmit_nbytes2
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -