?? picnic.asm
字號:
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
dw 0x100
CALL assert_wr2
dw 0x100
CALL assert_wr2
dw 0x100
CALL assert_wr2
dw 0x100
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 0x1F ;沒有用標號?
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 + -