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

📄 picnic.asm

📁 PIC单片机实现的一种网络单片机
💻 ASM
📖 第 1 页 / 共 5 页
字号:
;
;  Disassembly by PICDIS V0.3
;  www.picemulator.com
;
;  PICNIC.HEX
;
	__CONFIG _CP_OFF & _WDT_OFF & _HS_OSC & _BODEN_ON & _PWRTE_ON

        LIST   P=PIC16F877
        INCLUDE "P16F877.INC"
        INCLUDE "defs.inc"
;
        ORG     0x0000
;
Begin:
        MOVLW   HIGH Start
        MOVWF   PCLATH
        GOTO    Start & 0x7ff
;
        ORG     0x0004
;
interrupt:
        MOVWF   w_save
        SWAPF   STATUS,W
        CLRF    STATUS
        MOVWF   status_save
        MOVF    PCLATH,W
        MOVWF   pclath_save
        CLRF    PCLATH
        BCF     STATUS,IRP
        MOVF    FSR,W
        MOVWF   fsr_save

;-----------------------------------------------------------------------------------
;		◆RB0中断处理
        BTFSS   INTCON,INTE
        GOTO    int_next2
        BTFSS   INTCON,INTF
        GOTO    int_next2
        BCF     INTCON,INTF
        BSF     STATUS,RP0
        BSF     STATUS,RP1
        BSF     on_flow,7			; 232数据请求
        BCF     STATUS,RP1
        BCF     STATUS,RP0

;-----------------------------------------------------------------------------------
;		◆定时器中断处理(10ms)
int_next2:
        BTFSC   PIR1,TMR1IF
        GOTO    int_tmr1
        GOTO    int_next1
int_tmr1:
        BCF     PIR1,TMR1IF
        BSF     STATUS,RP0
        MOVF    dhcp_done & 0x7F,W
        ANDLW   0x7F
        BTFSS   STATUS,Z
        DECF    dhcp_done & 0x7F,F
        BCF     STATUS,RP0
int_tmr2:
        BSF     STATUS,RP0
        MOVLW   0x01
        ADDWF   timer & 0x7F,F
        BTFSC   STATUS,C
        GOTO    dec_tm
dec_tm9:
        CLRF    STATUS

;-----------------------------------------------------------------------------------
;		◆USART中断处理
int_next1:
        BTFSS   INTCON,PEIE
        GOTO    int2
        BTFSS   PIR1,RCIF			; RS232C受信?
        GOTO    int2
        BSF     STATUS,RP0
        MOVLW   fifo_bottom - fifo_top
        SUBWF   fifo_cn & 0x7F,W		; buffer overflow ?
        BTFSC   STATUS,C
        GOTO    rec_over

        MOVF    fifo_buff & 0x7F,W
        MOVWF   FSR
        BCF     STATUS,RP0
        MOVF    RCREG,W
        MOVWF   INDF
        BSF     STATUS,RP0
        INCF    fifo_buff & 0x7F,F
        MOVLW   fifo_bottom
        SUBWF   fifo_buff & 0x7F,W
        BTFSS   STATUS,C
        GOTO    int1_1
        MOVLW   fifo_top
        MOVWF   fifo_buff & 0x7F
int1_1:
        INCF    fifo_cn & 0x7F,F
        MOVLW   (fifo_bottom - fifo_top)/2
        SUBWF   fifo_cn & 0x7F,W
        BTFSS   STATUS,C
        GOTO    int2
        BSF     STATUS,RP1
        BTFSS   on_flow,0
        GOTO    int2
        CLRF    STATUS
        BSF     PORTB,1
;	bsf	PORTB,7				; for debug
int2:
        CLRF    STATUS
;-----------------------------------------------------------------------
; 	Context恢复处理
        MOVF    fsr_save,W
        MOVWF   FSR
        MOVF    pclath_save,W
        MOVWF   PCLATH
        SWAPF   status_save,W
        MOVWF   STATUS
        SWAPF   w_save,F
        SWAPF   w_save,W
        RETFIE
;-----------------------------------------------------------------------------------
;		RS232C收信缓冲区溢出
rec_over:
        BCF     STATUS,RP0
        MOVF    RCREG,W
        BCF     STATUS,RP0
        GOTO    int2
;-----------------------------------------------------------------------------------
;		Socket的超时检查
dec_tm:
        BSF     STATUS,IRP
        MOVLW   SOCKETS
        MOVWF   timer_cn & 0x7F
        MOVLW   skb+1
        MOVWF   FSR
dec_tm0:
        MOVF    INDF,W
        ANDLW   0xF0
        BTFSC   STATUS,Z
        GOTO    dec_tm1
        MOVLW   0x10
        SUBWF   INDF,F
        MOVF    INDF,W
        ANDLW   0xF0
        BTFSS   STATUS,Z
        GOTO    dec_tm1
        DECF    FSR,F
        CLRF    INDF
        INCF    FSR,F
dec_tm1:
        MOVLW   0x10
        ADDWF   FSR,F
        DECFSZ  timer_cn & 0x7F,F
        GOTO    dec_tm0
        BCF     STATUS,IRP
        GOTO    dec_tm9

;-----------------------------------------------------------------------------------
;		取得16进制的文字
;
getascii:
        ANDLW   0x0F
        ADDWF   PCL,F
        DT      "0123456789ABCDEF"

;-----------------------------------------------------------------------------------
;		决定seq_no的初始化值
next_seq_no:
        BSF     STATUS,RP0
        MOVLW   0x01
        ADDWF   seq_no+2,F
        BTFSC   STATUS,C
        ADDWF   seq_no+3,F
        BCF     STATUS,RP0
        RETURN

;-----------------------------------------------------------------------------------
;		递增TCP的seq_no
inc_seq_no:
        BSF     STATUS,IRP
        MOVLW   0x03
        ADDWF   FSR,F
        MOVLW   0x01
        ADDWF   INDF,F
        DECF    FSR,F
        BTFSC   STATUS,C
        ADDWF   INDF,F
        DECF    FSR,F
        BTFSC   STATUS,C
        ADDWF   INDF,F
        DECF    FSR,F
        BTFSC   STATUS,C
        ADDWF   INDF,F
        BCF     STATUS,IRP
        RETURN

;-----------------------------------------------------------------------------------
;		计算TCP的seq_no加ip_length
;
add_seq_no
        BSF     STATUS,IRP
        MOVLW   0x03
        ADDWF   FSR,F

        MOVF    ip_length+1,W
        ADDWF   INDF,F
        DECF    FSR,F
        MOVLW   0x01
        BTFSC   STATUS,C
        ADDWF   INDF,F
        DECF    FSR,F
        BTFSC   STATUS,C
        ADDWF   INDF,F
        DECF    FSR,F
        BTFSC   STATUS,C
        ADDWF   INDF,F

        MOVLW   0x02
        ADDWF   FSR,F
        MOVF    ip_length,W
        ADDWF   INDF,F
        DECF    FSR,F
        MOVLW   0x01
        BTFSC   STATUS,C
        ADDWF   INDF,F
        DECF    FSR,F
        BTFSC   STATUS,C
        ADDWF   INDF,F
        BCF     STATUS,IRP
        RETURN

;-----------------------------------------------------------------------------------
;		递增TCP的ack_no
;
inc_ack_no:
        MOVLW   0x01
        ADDWF   tcp_seq_no+3,F
        BTFSC   STATUS,C
        ADDWF   tcp_seq_no+2,F
        BTFSC   STATUS,C
        ADDWF   tcp_seq_no+1,F
        BTFSC   STATUS,C
        ADDWF   tcp_seq_no,F
        GOTO    copy_ack_no

;-----------------------------------------------------------------------------------
;		计算TCP的ack_no加上ip_length的值
;
add_ack_no
        MOVLW   0x28					; 20+20
        SUBWF   ip_length+1,F
        MOVLW   0x01
        BTFSS   STATUS,C
        SUBWF   ip_length,F

        MOVF    ip_length+1,W
        ADDWF   tcp_seq_no+3,F
        MOVLW   0x01
        BTFSC   STATUS,C
        ADDWF   tcp_seq_no+2,F
        BTFSC   STATUS,C
        ADDWF   tcp_seq_no+1,F
        BTFSC   STATUS,C
        ADDWF   tcp_seq_no,F

        MOVF    ip_length,W
        ADDWF   tcp_seq_no+2,F
        MOVLW   0x01
        BTFSC   STATUS,C
        ADDWF   tcp_seq_no+1,F
        BTFSC   STATUS,C
        ADDWF   tcp_seq_no,F
copy_ack_no:
        MOVF    com_fsr,W
        MOVWF   FSR
        MOVLW   .12
        ADDWF   FSR,F
        BSF     STATUS,IRP
        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
        RETURN

;-----------------------------------------------------------------------------------
;		清除checksum值
;
clear_sum:
        CLRF    sum
        CLRF    sum+1
        CLRF    bytes
        RETURN


;-----------------------------------------------------------------------------------
;		Error Recovery Routing
;-----------------------------------------------------------------------------------
overflow2
overflow:
        CLRF    STATUS
        CLRF    PORTC
        MOVLW   0x21				; RTL8019AS STOP
        CALL    assert_wr0
        MOVLW   HIGH wait_ms
        MOVWF   PCLATH
        MOVLW   0x02
        MOVWF   wait_cn
        CALL    wait_ms & 0x7ff			; 10ms wait
        CLRF    PCLATH

        MOVLW   0x0A
        MOVWF   PORTC
        dw	0x100
        CALL    assert_wr0

        MOVLW   0x0B
        MOVWF   PORTC
        dw	0x100
        CALL    assert_wr0

        CALL    initialize			; 初始化RTL8019

        MOVLW   0x0C
        MOVWF   PORTC				; RCR
        MOVLW   b'00000100'
        CALL    assert_wr0			; MONITOR解除

        MOVLW   0x0D
        MOVWF   PORTC				; TCR
        dw	0x100					; L/B解除
        CALL    assert_wr0

        GOTO    main0				; 返回通常的处理

;-----------------------------------------------------------------------------------
;		Main Routing
;-----------------------------------------------------------------------------------
main:
        CLRF    PORTC
        MOVLW   0x22
        CALL    assert_wr0			;返回PAGE0

        MOVLW   0x0C
        MOVWF   PORTC
        MOVLW   b'00000100'
        CALL    assert_wr0
        MOVLW   0x0D
        MOVWF   PORTC				;TCR
        dw	0x100					;L/B解除
        CALL    assert_wr0

        MOVLW   HIGH wait_ms
        MOVWF   PCLATH
        MOVLW   .100
        MOVWF   wait_cn
        CALL    wait_ms & 0x7ff			; 100ms Wait
        CLRF    PCLATH

        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    main0				;自己的IP地址是0.0.0.0 ?
do_dhcp:
        CLRF    STATUS
        MOVLW   HIGH dhcp
        MOVWF   PCLATH
        CALL    dhcp & 0x7ff
        MOVLW   HIGH $
        MOVWF   PCLATH
;-----------------------------------------------------------------------------------
;		Main Loop
;-----------------------------------------------------------------------------------
main0:
        BSF     STATUS,RP0
        MOVLW   0x00
        SUBWF   fifo_cn & 0x7F,W
        BTFSS   STATUS,Z			;RS232C受信?
        GOTO    receive232c
        MOVLW   0x80
        SUBWF   dhcp_done & 0x7F,W
        BTFSC   STATUS,Z			;DHCP Timeout?
        GOTO    do_dhcp
        BCF     STATUS,RP0

        CLRF    PCLATH
        MOVLW   0x07
        MOVWF   PORTC
        CALL    assert_rd			;RCR Lead

        BTFSC   mdata,4
        GOTO    overflow
        BTFSC   mdata,3
        GOTO    overflow
        BTFSC   mdata,2
        GOTO    overflow
        GOTO    get_packet			;有收到Packet
main99:
        GOTO    main0

receive232c:
        BCF     STATUS,RP0
        MOVLW   HIGH serial_tx
        MOVWF   PCLATH
        GOTO    serial_tx & 0x7ff		;转到RS232收信处理

;-----------------------------------------------------------------------------------
;		Packet收信处理
;-----------------------------------------------------------------------------------
get_packet:
;	PAGE 1
        CLRF    PORTC
        MOVLW   b'01100010'
        CALL    assert_wr0			;设置为Page1

        MOVLW   0x07
        MOVWF   PORTC
        CALL    assert_rd
        MOVF    mdata,W
        MOVWF   curr				;取得当前的Page
;	PAGE 0
        CLRF    PORTC
        MOVLW   b'00100010'
        CALL    assert_wr0			;返回Page0

        MOVLW   0x03
        MOVWF   PORTC
        CALL    assert_rd			;读入BNDY

        INCF    mdata,F				;BNDY++
        MOVLW   PAGE_STOP
        SUBWF   mdata,W
        BTFSS   STATUS,C
        GOTO    packet1				;计算overlap
        MOVLW   PAGE_START
        MOVWF   mdata
packet1:
        MOVF    curr,W
        SUBWF   mdata,W
        BTFSC   STATUS,Z			;如果(BNDY+1)==CURR的话,则没有新数据
        GOTO    main0				;中断


;-----------------------------------------------------------------------------------
; 读取RTL8019 Status 和 Ethernet Header
        CLRF    remote_adr
        MOVF    mdata,W
        MOVWF   remote_adr+1
        MOVLW   NE_SIZE+PACKET_SIZE
        MOVWF   remote_len
        CLRF    remote_len+1
        CALL    remote_read

        MOVLW   NE_SIZE+PACKET_SIZE
        MOVWF   gcn1				; Loop Counter
        BCF     STATUS,IRP
        MOVLW   ne_header
        MOVWF   FSR				;读取ne_header的地址
        MOVLW   0x10
        MOVWF   PORTC
get_packet0:
        BCF     PORTE,RE0			;RD
        BTFSS   PORTC,RC5			;RDY, ~Wait
        GOTO    $-1
        MOVF    PORTD,W
        BSF     PORTE,RE0
        MOVWF   INDF				;"indirect = data Buffer
        INCF    FSR,F				;FSR++
        DECFSZ  gcn1,F
        GOTO    get_packet0
;
;	Ethernet Header的处理判断
        BSF     STATUS,RP0
        BTFSS   ne_stat,0
        GOTO    main9
        MOVLW   COM_PROTO
        SUBWF   eth_type & 0x7F,W
        BTFSS   STATUS,Z			; 跳过type的高8bit以外
        GOTO    main9
        MOVLW   IP_PROTO
        SUBWF   eth_type+1,W
        BTFSC   STATUS,Z
        GOTO    do_ip				;处理IP协议
        MOVLW   ARP_PROTO
        SUBWF   eth_type+1,W
        BTFSC   STATUS,Z
        GOTO    do_arp				;处理ARP协议
main9:						;其他
        BCF     STATUS,IRP
        BCF     STATUS,RP1
        BSF     STATUS,RP0
        MOVLW   PAGE_START
        SUBWF   ne_next & 0x7F,W
        BTFSS   STATUS,C
        GOTO    overflow2			;Error Check and Recover
        MOVLW   PAGE_STOP
        SUBWF   ne_next & 0x7F,W
        BTFSC   STATUS,C
        GOTO    overflow			;Error Check and Recover

        DECF    ne_next & 0x7F,F		;计算下一个边界
        MOVLW   PAGE_START
        SUBWF   ne_next & 0x7F,W
        BTFSC   STATUS,C
        GOTO    packet11
        MOVLW   PAGE_STOP-1
        MOVWF   ne_next & 0x7F

packet11:

⌨️ 快捷键说明

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