📄 v12.asm
字号:
INCF FSR,1
MOVLW HIGH (job_ESTAB)
MOVWF PCLATH
MOVF INDF,0
andlw 0fh
ADDWF 2,1 ;jmp pc+w
goto ESTAB_00
goto ESTAB_01
goto ESTAB_02
goto ESTAB_03
goto ESTAB_99
recv_fin
MOVLW 0
MOVWF INDF
bcf STATUS,IRP
call inc_ack_no
call send_ack
RETURN
;-----------------------------------------------------------------------------------
;
;
job_CLOSE_WAIT
MOVLW 0
MOVWF INDF
bcf STATUS,IRP
call send_fin
RETURN
ESTAB_99
decF FSR,1
MOVLW FIN_WAIT_1
MOVWF INDF
bcf STATUS,IRP
call send_fin
MOVF com_fsr,0
MOVWF FSR
MOVLW .8
ADDWF FSR,1
call inc_seq_no
RETURN
;-----------------------------------------------------------------------------------
; ESTABLISH
;
ESTAB_00
incF INDF,1
bcf STATUS,IRP
estab0
MOVLW HIGH(get_nextbyte)
MOVWF PCLATH
call get_nextbyte ; バッファからデータを取得
MOVLW HIGH (estab0)
MOVWF PCLATH
MOVLW 0 ; 終了?
SUBWF data0,0
BTFSC 3,2
GOTO estab1
; 改行文字?
MOVLW 0AH
SUBWF data0,0
BTFSC 3,2
GOTO estab1
; '?'文字を発見?(=GETコマンドの処理)
MOVLW '?'
SUBWF data0,0
BTFSC 3,2
GOTO parse_cgi_tag
goto estab0
parse9
;-----------------------------------------------------------------------------------
;
;
estab1
call abort ; バッファ転送中止
call add_ack_no ; ACK NOを加算
; call send_ack ; ACKを送信
MOVLW 014H ;バンクアドレス=14h fan
MOVWF wk
goto send_mes ; メッセージ送信
;
; バンク間ジャンプ用
parse_cgi_tag
MOVLW HIGH(parse_cgi)
MOVWF PCLATH
goto parse_cgi
ESTAB_01
incF INDF,1
bcf STATUS,IRP
; call send_ack
;
MOVLW 017H
MOVWF wk
goto send_mes ; メッセージ送信
ESTAB_02
incF INDF,1
bcf STATUS,IRP
; call send_ack
;mov wk,#01Ah ; バンクアドレス=19h
MOVLW 01AH
MOVWF wk
goto send_mes ; メッセージ送信
ESTAB_03
incF INDF,1
bcf STATUS,IRP
; call send_ack
;mov wk,#01Dh ; バンクアドレス=1bh
MOVLW 01DH
MOVWF wk
goto send_mes ; メッセージ送信
;
; リモートDMA転送中止
abort
CLRF PORTC
movlw 22h
call assert_wr0 ; PAGE0に戻す
MOVLW 0ah
MOVWF PORTC
DB 01,00 ;clrw
call assert_wr0
MOVLW 0bh
MOVWF PORTC
DB 01,00 ;clrw
call assert_wr0
RETURN
;-----------------------------------------------------------------------------------
; RSTパケットの送信
send_rst
MOVLW B'000100' ; RST
MOVWF state
goto send_common
;-----------------------------------------------------------------------------------
; FINパケットの送信
send_fin
MOVLW B'010001' ; ACK+FIN
MOVWF state
goto send_common
;-----------------------------------------------------------------------------------
; ACKパケットの送信
send_ack
MOVLW B'010000' ; ACK
MOVWF state
; goto send_common
send_common
MOVLW 0
MOVWF ip_length
;mov ip_length[1],#IP_SIZE + TCP_SIZE
MOVLW IP_SIZE + TCP_SIZE
MOVWF ip_length1
MOVLW TCP_PROTO
MOVWF proto
call prepare_ip
MOVLW PACKET_SIZE + IP_SIZE
MOVWF remote_adr
;mov remote_adr[1],#PAGE_BEGIN
MOVLW PAGE_BEGIN
MOVWF remote_adr1
;mov remote_len[0],#20 ; 20バイト
MOVLW .20
MOVWF remote_len
;mov remote_len[1],#0
MOVLW 0
MOVWF remote_len1
call remote_write
call clear_sum ; チェックサムの値をクリア
MOVLW http_port & 0ffh
MOVWF FSR
movlw 2
call transmit_nbytes ; 自分のポート番号
MOVLW tcp_src_port
MOVWF FSR
movlw 2
call transmit_nbytes ; 相手のポート番号
MOVF com_fsr,0
MOVWF FSR
MOVLW .8
ADDWF FSR,1
bsf STATUS,IRP
movlw 4+4
call transmit_nbytes ; 自分のSEQNO
bcf STATUS,IRP
movlw 50h ; 20bytes
call assert_wr
MOVF state,0 ;mov w,state
call assert_wr
movlw 08h ; window(high)
call assert_wr
movlw 00h ; window(low)
call assert_wr
call assert_wr2times ; tcp sum
call assert_wr2times ; 緊急ポインタ
call calc_tcp_sum ; TCP SUMの計算
MOVLW 4h
MOVWF PORTC
movlw PAGE_BEGIN ; transmit page is start page
call assert_wr0
MOVLW 5
MOVWF PORTC
movlw .60 ; 60バイト送信
call assert_wr0
MOVLW 6
MOVWF PORTC
DB 01,00 ;clrw ; 上位転送バイト=0
call assert_wr0
call transmit ; 送信!!
RETURN
;-----------------------------------------------------------------------------------
;
;
send_mes
MOVLW assert_wr2x & 0ffh ; 送信jobをRTL8019に
MOVWF dest
MOVLW HIGH (assert_wr2x)
MOVWF dest1
send_mes_head
; 仮に65535バイト転送に設定
;-------
MOVLW PACKET_SIZE + IP_SIZE
MOVWF remote_adr
MOVLW PAGE_BEGIN
MOVWF remote_adr1
MOVLW 0FFH
MOVWF remote_len
MOVLW 0FFH
MOVWF remote_len1
;-------
;mov remote_len[1],#0ffh ;
call remote_write
;clr remote_len[0]
;clr remote_len[1]
CLRF remote_len
CLRF remote_len1
call clear_sum ; チェックサムの値をクリア
MOVLW http_port & 0ffh
MOVWF FSR
movlw 2
call transmit_nbytes2 ; 自分のポート番号
MOVLW tcp_src_port
MOVWF FSR
movlw 2
call transmit_nbytes2 ; 相手のポート番号
bsf STATUS,IRP
MOVF com_fsr,0
MOVWF FSR
MOVLW .8
ADDWF FSR,1
movlw 4
call transmit_nbytes2 ; 自分のSEQNO
bcf STATUS,IRP
MOVLW tcp_seq_no
MOVWF FSR
movlw 4
call transmit_nbytes2 ; 相手のSEQNO+1
movlw 50h ; 20bytes
call assert_wr2
movlw B'011000'
call assert_wr2
movlw 08h ; window(high)
call assert_wr2
movlw 00h ; window(low)
call assert_wr2
DB 01,00 ;clrw
call assert_wr2 ; tcp sum
DB 01,00 ;clrw
call assert_wr2 ; tcp sum
DB 01,00 ;clrw
call assert_wr2 ; 緊急ポインタ
DB 01,00 ;clrw
call assert_wr2 ; 緊急ポインタ
CLRF ind
bsf STATUS,RP1
bcf STATUS,RP0
MOVF wk,0 ; 読み出すアドレス=[wk:ind]
MOVWF EEADRH
send_mes0
bsf STATUS,RP1
bcf STATUS,RP0
MOVF ind,0
MOVWF EEADR
bsf STATUS,RP0
bsf EECON1,7 ;eepgd
bsf EECON1,0 ;eecon1.0 ; コードエリアからデータを読み出す
nop ; ダミーサイクル
nop
bcf STATUS,RP0
MOVF EEDATH,0 ; (読んだデータを)作業領域へ移動
MOVWF getmes_wk
MOVF EEDATA,0
MOVWF getmes_wk1
bcf STATUS,RP1
RLF getmes_wk1,0
RLF getmes_wk,1
MOVF getmes_wk,0 ; 上位7ビットが0か?
MOVWF data0
MOVLW 7FH
ANDWF data0,1
MOVF data0,1
btfsc STATUS,Z
goto send_mes9 ; 上位7ビットが0なら終了
;
; 上位7ビットがメタ文字なら処理を分岐
MOVLW '$'
SUBWF data0,0
BTFSC 3,2
GOTO ctrl_code2
MOVLW '@'
SUBWF data0,0
BTFSC 3,2
GOTO ctrl_code3
MOVLW '%'
SUBWF data0,0
BTFSC 3,2
GOTO ctrl_code4
MOVLW '~'
SUBWF data0,0
BTFSC 3,2
GOTO ctrl_code5
MOVF data0,0 ;
call assert_wr2
MOVF getmes_wk1,0 ; 下位7ビットをRTL8019バッファへ転送
andlw 7fh
call assert_wr2
MOVLW 1 ; ind++
ADDWF ind,1
bsf STATUS,RP1
bcf STATUS,RP0
btfsc STATUS,C
INCF EEADRH,1
goto send_mes0
send_mes9
send_mes_foot
call abort ; リモートDMA転送の中止
MOVF remote_len,0
MOVWF ip_length1
MOVF remote_len1,0
MOVWF ip_length
call calc_tcp_sum ; TCP SUMを計算する
MOVLW .20 ;add ip_length[1],#20; 20を加算
ADDWF ip_length1,1
movlw 1
btfsc STATUS,C
addwf ip_length,1 ;addwf ip_length[0]
MOVLW TCP_PROTO ; TCP packet
MOVWF proto
call prepare_ip ; IPプロトコルの準備
MOVLW 4h
MOVWF PORTC
movlw PAGE_BEGIN ; transmit page is start page
call assert_wr0
MOVLW PACKET_SIZE ; パケットサイズ6+6+2を送信バイト数に加算1
addWF ip_length1,1
movlw 1
btfsc STATUS,C
addwf ip_length,1
MOVLW 6
MOVWF PORTC
MOVF ip_length,0
call assert_wr0
MOVF ip_length,1
btfsc STATUS,Z
goto send_mes_foot1
send_mes_foot2
MOVLW 5
MOVWF PORTC
MOVF ip_length1,0
call assert_wr0
call transmit ; 送信!!
;
; Additional Code
send_mes_foot3
MOVLW PACKET_SIZE+IP_SIZE+TCP_SIZE
SUBWF ip_length1,1
movlw 1
btfss STATUS,C
SUBWF ip_length,1
MOVF com_fsr,0
MOVWF FSR
MOVLW .8
ADDWF FSR,1
call add_seq_no ; seq noに加算
RETURN
send_mes_foot1
MOVLW .60
SUBWF ip_length1,0
BTFSC 3,0
GOTO send_mes_foot2
MOVLW 5
MOVWF PORTC
movlw .60 ; MINIMUM 60bytes
call assert_wr0
call transmit
goto send_mes_foot3
;-----------------------------------------------------------------------------------
; AD変換
;
ad_in
RLF getmes_wk1,1
RLF getmes_wk1,1
RLF getmes_wk1,1
MOVLW B'00111000'
ANDWF getmes_wk1,1
MOVLW B'10000001'
IORWF getmes_wk1,1
MOVF getmes_wk1,0 ; ADCON1に値を設定
MOVWF ADCON1
MOVLW 1
MOVWF wait_cn
MOVLW HIGH (wait_ms)
MOVWF PCLATH
call wait_ms ; サンプリング時間20us待機
MOVLW HIGH (ad_in)
MOVWF PCLATH
bsf ADCON1,2 ; AD変換開始
btfsc ADCON1,2 ; AD変換待ち
goto $-1
MOVF ADRESH,0 ; 変換結果をval[1]:val[0]へ
MOVWF val1
bsf STATUS,RP0
MOVF ADRESL,0
bcf STATUS,RP0
movwf val
btfss getmes_wk1,5 ; RA5かどうか?
goto ad_in1 ; RA5以外
;
;AD変換結果を5倍する
;
BCF 3,0
RLF val,1
RLF val1,1
BCF 3,0
RLF val,1
RLF val1,1
MOVF ADRESH,0
ADDWF val1,1
bsf STATUS,RP0
MOVF ADRESL,0
bcf STATUS,RP0
addwf val,1
btfsc STATUS,C
INCF val1,1
MOVLW decimal_top & 0ffh ; 格納場所初期値
MOVWF FSR
bsf STATUS,IRP ; IRP=1
MOVLW HIGH (divide16)
MOVWF PCLATH
call divide16
ad_in1
MOVLW HIGH (put_decimal16)
MOVWF PCLATH
call put_decimal16 ; 10進数に変換
MOVLW HIGH (ad_in1)
MOVWF PCLATH
goto ctrl_next
;-----------------------------------------------------------------------------------
; SOCKET STATUS
ctrl_code5
MOVLW 7FH
ANDWF getmes_wk1,1
swapf getmes_wk1,1
movf getmes_wk1,0
movwf FSR
bsf STATUS,IRP
; movlw put_socket_stat >> 8
; MOVWF PCLATH
; call put_socket_stat ; socketステータスを表示
bcf STATUS,IRP
goto ctrl_next
;--------------------------------------------------------------------------
; TRIS
; 入力?出力の表示
ctrl_code4
MOVLW 7FH
ANDWF getmes_wk1,1
MOVF getmes_wk1,0
MOVWF FSR
SWAPF FSR,1
MOVLW 0FH
ANDWF FSR,1
MOVLW PORTA | 80H
ADDWF FSR,1
MOVF getmes_wk1,0
call getbitpos
MOVF INDF,0
ANDWF data0,1
BTFSC 3,2
GOTO ctrl_out
goto ctrl_in
;
; ビット位置返す
;
getbitpos
movwf wk
MOVLW 1
MOVWF data0
MOVLW 07H
ANDWF wk,1
BTFSC 3,2
GOTO getbitpos9
getbitpos0
BCF 3,0
RLF data0,1
DECFSZ wk,1
GOTO getbitpos0
getbitpos9 RETURN
;-----------------------------------------------------------------------------------
; PARALLEL
; 現在のHigh/Lowの表示
ctrl_code3
MOVLW 7FH
ANDWF getmes_wk1,1
MOVF getmes_wk1,0
MOVWF FSR
SWAPF FSR,1
MOVLW 0FH
ANDWF FSR,1
BTFSS 3,2
GOTO ctrl_code31
MOVLW 80h | PORTA
ADDWF FSR,1
MOVF getmes_wk1,0
call getbitpos
MOVF INDF,0
andwf data0,0 ; TRIS_RAのチェック
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -