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

📄 picnic.asm

📁 PIC单片机实现的一种网络单片机
💻 ASM
📖 第 1 页 / 共 5 页
字号:
        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 + -