📄 picnic.asm
字号:
;
; 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 + -