📄 picnic.asm
字号:
RETURN
;-----------------------------------------------------------------------------------
; BOOTP应答
;-----------------------------------------------------------------------------------
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
; 发送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取得数据
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 ;发现了'?'字符?(=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间跳转用
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
;-----------------------------------------------------------------------------------
; 发送RST包
send_rst:
MOVLW b'00000100' ;RST
MOVWF state
GOTO send_common
;-----------------------------------------------------------------------------------
; 发送FIN包
send_fin
MOVLW b'00010001' ;ACK+FIN
MOVWF state
GOTO send_common
;-----------------------------------------------------------------------------------
; 发送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 ;设置RTL8019的送信任务
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -