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

📄 picnic.asm.icd

📁 PIC单片机实现的一种网络单片机
💻 ICD
📖 第 1 页 / 共 5 页
字号:

        MOVLW   tcp_src_port
        MOVWF   FSR
        MOVLW   0x02
        CALL    transmit_nbytes2

        BSF     STATUS,IRP
        MOVF    com_fsr,W
        MOVWF   FSR
        MOVLW   0x08
        ADDWF   FSR,F
        MOVLW   0x04
        CALL    transmit_nbytes2
        BCF     STATUS,IRP

        MOVLW   tcp_seq_no
        MOVWF   FSR
        MOVLW   0x04
        CALL    transmit_nbytes2

        MOVLW   0x50
        CALL    assert_wr2
        MOVLW   0x18
        CALL    assert_wr2

        MOVLW   0x08
        CALL    assert_wr2
        MOVLW   0x00
        CALL    assert_wr2

        CLRW
        CALL    assert_wr2
        CLRW
        CALL    assert_wr2
        CLRW
        CALL    assert_wr2
        CLRW
        CALL    assert_wr2

        CLRF    ind
        BSF     STATUS,RP1
        BCF     STATUS,RP0
        MOVF    wk,W
        MOVWF   EEADRH
send_mes0
        BSF     STATUS,RP1
        BCF     STATUS,RP0
        MOVF    ind,W
        MOVWF   EEADR
        BSF     STATUS,RP0
        BSF     EECON1,EEPGD
        BSF     EECON1,RD			;从Code Area读出数据
        NOP
        NOP
        BCF     STATUS,RP0
        MOVF    EEDATH,W
        MOVWF   getmes_wk			;将读出的数据移动到作业区
        MOVF    EEDATA,W
        MOVWF   getmes_wk+1
        BCF     STATUS,RP1

        RLF     getmes_wk+1,W
        RLF     getmes_wk,F
        MOVF    getmes_wk,W
        MOVWF   mdata
        MOVLW   0x7F
        ANDWF   mdata,F
        MOVF    mdata,F
        BTFSC   STATUS,Z
        GOTO    send_mes9			;如果高位为0就终了
;
;
        MOVLW   '$'
        SUBWF   mdata,W
        BTFSC   STATUS,Z
        GOTO    ctrl_code2
        MOVLW   '@'
        SUBWF   mdata,W
        BTFSC   STATUS,Z
        GOTO    ctrl_code3
        MOVLW   '%'
        SUBWF   mdata,W
        BTFSC   STATUS,Z
        GOTO    ctrl_code4
        MOVLW   '~'
        SUBWF   mdata,W
        BTFSC   STATUS,Z
        GOTO    ctrl_code5			;Socket Status
        MOVF    mdata,W
        CALL    assert_wr2

        MOVF    getmes_wk+1,W
        ANDLW   0x7F
        CALL    assert_wr2

        MOVLW   0x01
        ADDWF   ind,F
        BSF     STATUS,RP1
        BCF     STATUS,RP0
        BTFSC   STATUS,C
        INCF    EEADRH,F
        GOTO    send_mes0
send_mes9

send_mes_foot
        CALL    abort				;停止Remote DMA

        MOVF    remote_len,W
        MOVWF   ip_length+1
        MOVF    remote_len+1,W
        MOVWF   ip_length

        CALL    calc_tcp_sum

        MOVLW   0x14
        ADDWF   ip_length+1,F
        MOVLW   0x01
        BTFSC   STATUS,C
        ADDWF   ip_length,F

        MOVLW   TCP_PROTO			;TCP Packet
        MOVWF   proto
        CALL    prepare_ip			;准备IP Protocol

        MOVLW   0x04
        MOVWF   PORTC
        MOVLW   PAGE_BEGIN			;transmit page is start page
        CALL    assert_wr0

        MOVLW   PACKET_SIZE
        ADDWF   ip_length+1,F
        MOVLW   0x01
        BTFSC   STATUS,C
        ADDWF   ip_length

        MOVLW   0x06
        MOVWF   PORTC
        MOVF    ip_length,W			;HIGH
        CALL    assert_wr0
        MOVF    ip_length,F
        BTFSC   STATUS,Z
        GOTO    send_mes_foot1
send_mes_foot2:
        MOVLW   0x05
        MOVWF   PORTC
        MOVF    ip_length+1,W
        CALL    assert_wr0
        CALL    transmit			;送信

;	Additional Code
send_mes_foot3
        MOVLW   PACKET_SIZE+IP_SIZE+TCP_SIZE
        SUBWF   ip_length+1,F
        MOVLW   0x01
        BTFSS   STATUS,C
        SUBWF   ip_length,F

        MOVF    com_fsr,W
        MOVWF   FSR
        MOVLW   0x08
        ADDWF   FSR,F
        CALL    add_seq_no
        RETURN

send_mes_foot1:
        MOVLW   0x3C
        SUBWF   ip_length+1,W
        BTFSC   STATUS,C
        GOTO    send_mes_foot2

        MOVLW   0x05
        MOVWF   PORTC
        MOVLW   0x3C				;Minimum 60 bytes
        CALL    assert_wr0
        CALL    transmit
        GOTO    send_mes_foot3


;-----------------------------------------------------------------------------------
;		AD变换
;
ad_in
        RLF     getmes_wk+1,F
        RLF     getmes_wk+1,F
        RLF     getmes_wk+1,F
        MOVLW   0x38
        ANDWF   getmes_wk+1,F
        MOVLW   0x81
        IORWF   getmes_wk+1,F
        MOVF    getmes_wk+1,W
        MOVWF   ADCON1

        MOVLW   0x01
        MOVWF   wait_cn
        MOVLW   HIGH wait_ms
        MOVWF   PCLATH
        CALL    wait_ms				;等待20us的采样时间
        MOVLW   HIGH $
        MOVWF   PCLATH

        BSF     ADCON1,2			;AD变换开始
        BTFSC   ADCON1,2			;等待AD变换结束
        GOTO    $-1

        MOVF    ADRESH,W
        MOVWF   val+1
        BSF     STATUS,RP0
        MOVF    ADRESL,W
        BCF     STATUS,RP0
        MOVWF   val

        BTFSS   getmes_wk+1,5			;RA5?
        GOTO    ad_in1				;RA5以外
;
;	将AD变换的结果乘5
;
        BCF     STATUS,C
        RLF     val,F
        RLF     val+1,F
        BCF     STATUS,C
        RLF     val,F
        RLF     val+1,F

        MOVF    ADRESH,W
        ADDWF   val+1,F
        BSF     STATUS,RP0
        MOVF    ADRESL,W
        BCF     STATUS,RP0
        ADDWF   val,F
        BTFSC   STATUS,C
        INCF    val+1,F

        MOVLW   decimal_top
        MOVWF   FSR
        BSF     STATUS,IRP
        MOVLW   HIGH divide16
        MOVWF   PCLATH
        CALL    divide16
ad_in1
        MOVLW   HIGH put_decimal16
        MOVWF   PCLATH
        CALL    put_decimal16
        MOVLW   HIGH $
        MOVWF   PCLATH
        GOTO    ctrl_next

;-----------------------------------------------------------------------------------
;	SOCKET STATUS
ctrl_code5
        MOVLW   0x7F
        ANDWF   getmes_wk+1,F
        SWAPF   getmes_wk+1,F
        MOVF    getmes_wk+1,W
        MOVWF   FSR
        BSF     STATUS,IRP
        BCF     STATUS,IRP
        GOTO    ctrl_next

;-----------------------------------------------------------------------------------
;	TRIS
;	输入/输出的显示
ctrl_code4
        MOVLW   0x7F
        ANDWF   getmes_wk+1,F
        MOVF    getmes_wk+1,W
        MOVWF   FSR
        SWAPF   FSR,F
        MOVLW   0x0F
        ANDWF   FSR,F
        MOVLW   PORTA | 0x80
        ADDWF   FSR,F

        MOVF    getmes_wk+1,W
        CALL    getbitpos
        MOVF    INDF,W
        ANDWF   mdata,F
        BTFSC   STATUS,Z
        GOTO    ctrl_out
        GOTO    ctrl_in

;
;返回bit位置
getbitpos:
        MOVWF   wk
        MOVLW   0x01
        MOVWF   mdata
        MOVLW   0x07
        ANDWF   wk,F
        BTFSC   STATUS,Z
        GOTO    getbitpos9
getbitpos0
        BCF     STATUS,C
        RLF     mdata,F
        DECFSZ  wk,F
        GOTO    getbitpos0
getbitpos9
        RETURN

;-----------------------------------------------------------------------------------
;	PARALLEL
;	显示现在的High/Low
ctrl_code3
        MOVLW   0x7F
        ANDWF   getmes_wk+1,F
        MOVF    getmes_wk+1,W
        MOVWF   FSR
        SWAPF   FSR,F
        MOVLW   0x0F
        ANDWF   FSR,F
        BTFSS   STATUS,Z
        GOTO    ctrl_code31

        MOVLW   PORTA | 0x80
        ADDWF   FSR,F
        MOVF    getmes_wk+1,W
        CALL    getbitpos

        MOVF    INDF,W
        ANDWF   mdata,W
        BTFSC   STATUS,Z
        GOTO    ctrl_code32

        MOVLW   HIGH getadtable
        MOVWF   PCLATH
        CALL    getadtable
        MOVWF   wk
        MOVLW   HIGH $
        MOVWF   PCLATH

        MOVF    wk,W
        ANDWF   mdata,F
        BTFSS   STATUS,Z
        GOTO    ad_in
ctrl_code32
        CLRF    FSR
ctrl_code31
        MOVLW   PORTA
        ADDWF   FSR,F
        MOVF    getmes_wk+1,W
        CALL    getbitpos
        MOVF    INDF,W
        ANDWF   mdata,F
        BTFSC   STATUS,Z
        GOTO    ctrl_low
        GOTO    ctrl_high

;-----------------------------------------------------------------------------------
;	取得短消息
get_short_mes
        MOVLW   HIGH default_values_begin	;没有用标号?
        MOVWF   PCLATH
        MOVF    wk,W
        MOVWF   PCL

ctrl_out
        MOVLW   mes_out				;'OUT'
        GOTO    put_short_mes10
ctrl_in
        MOVLW   mes_in				;'IN'
        GOTO    put_short_mes10
ctrl_high
        MOVLW   mes_high			;'HIGH'
        GOTO    put_short_mes10
ctrl_low
        MOVLW   mes_low				;'LOW'
        GOTO    put_short_mes10
put_short_mes10
        MOVWF   wk
put_short_mes0
        CALL    get_short_mes
        MOVWF   mdata
        MOVLW   HIGH $
        MOVWF   PCLATH				;修正PCLATH

        MOVLW   0x00
        SUBWF   mdata,W
        BTFSC   STATUS,Z
        GOTO    ctrl_next			;NULL?
        MOVF    mdata,W
        CALL    assert_wr2			;送到RTL8019

        INCF    wk,F
        GOTO    put_short_mes0

;
;		META CHARACTER
ctrl_code2
        MOVLW   HIGH ctrl_code1
        MOVWF   PCLATH
        MOVF    getmes_wk+1,W
        ANDLW   0x7F
        ADDLW   0xD0

        CALL    ctrl_code1			;调用控制符输出
        MOVLW   HIGH $
        MOVWF   PCLATH
ctrl_next
        MOVLW   0x01
        ADDWF   ind,F
        BSF     STATUS,RP1
        BCF     STATUS,RP0
        BTFSC   STATUS,C
        INCF    EEADRH,F
        GOTO    send_mes0

;-----------------------------------------------------------------------------------
;		Socket作成
;
no_socket:
        BTFSS   TCP_SYN
        RETURN
;
;	SYN Packet的受信 -> SYN+ACK的送信
;
recv_syn
        MOVLW   HIGH socket_entry
        MOVWF   PCLATH
        CALL    socket_entry & 0x7ff		;检索Socket Entry
        MOVLW   HIGH $
        MOVWF   PCLATH
        BTFSC   STATUS,C
        GOTO    send_rst

        MOVLW   0x00
        MOVWF   ip_length
        MOVLW   0x2C
        MOVWF   ip_length+1

        MOVLW   TCP_PROTO
        MOVWF   proto
        CALL    prepare_ip

        MOVLW   PACKET_SIZE + IP_SIZE
        MOVWF   remote_adr
        MOVLW   PAGE_BEGIN
        MOVWF   remote_adr+1
        MOVLW   0x18
        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

        MOVLW   tcp_src_port
        MOVWF   FSR
        MOVLW   0x02
        CALL    transmit_nbytes

        MOVLW   seq_no
        MOVWF   FSR
        MOVLW   0x04
        CALL    transmit_nbytes

        CALL    inc_ack_no

        MOVF    com_fsr,W
        MOVWF   FSR
        MOVLW   0x08
        ADDWF   FSR,F

        BSF     STATUS,IRP
        BSF     STATUS,RP0
        MOVF    seq_no & 0x7F,W
        MOVWF   INDF
        INCF    FSR,F
        MOVF    seq_no+1,W
        MOVWF   INDF
        INCF    FSR,F
        MOVF    seq_no+2,W
        MOVWF   INDF
        INCF    FSR,F
        MOVF    seq_no+3,W
        MOVWF   INDF
        INCF    FSR,F
        BCF     STATUS,RP0

        MOVF    tcp_seq_no,W
        MOVWF   INDF
        INCF    FSR,F
        MOVF    tcp_seq_no+1,W
        MOVWF   INDF
        INCF    FSR,F
        MOVF    tcp_seq_no+2,W
        MOVWF   INDF
        INCF    FSR,F
        MOVF    tcp_seq_no+3,W
        MOVWF   INDF
        BCF     STATUS,IRP

        MOVF    com_fsr,W
        MOVWF   FSR
        MOVLW   0x08
        ADDWF   FSR,F
        CALL    inc_seq_no

        MOVLW   tcp_seq_no
        MOVWF   FSR
        MOVLW   0x04
        CALL    transmit_nbytes

        MOVLW   0x60				;有Option
        CALL    assert_wr
        MOVLW   0x12				;ACK+SYN
        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

        MOVLW   0x02
        CALL    assert_wr
        MOVLW   0x04
        CALL    assert_wr

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -