📄 v12.asm
字号:
BTFSC 3,2 ; 出力ピン?
GOTO ctrl_code32
MOVLW 1FH
MOVWF PCLATH
call getadtable
MOVWF wk
MOVLW HIGH (ctrl_code3)
MOVWF PCLATH
MOVF wk,0
ANDWF data0,1
BTFSS 3,2 ; 1ならアナログ入力
GOTO ad_in
;
;
ctrl_code32
CLRF FSR
ctrl_code31 MOVLW PORTA ; + 05h
ADDWF FSR,1
MOVF getmes_wk1,0
call getbitpos
MOVF INDF,0
ANDWF data0,1
BTFSC 3,2
GOTO ctrl_low
goto ctrl_high
;-----------------------------------------------------------------------------------
; ショートメッセージの取得
get_short_mes
MOVLW 1FH ; バンク=1h
MOVWF PCLATH
MOVF wk,0
MOVWF PCL
ctrl_out
movlw mes_out & .255 ; 'OUT'
goto put_short_mes10
ctrl_in
movlw mes_in & .255 ; 'IN'
goto put_short_mes10
ctrl_high
movlw mes_high & .255 ; 'HIGH'
goto put_short_mes10
ctrl_low
movlw mes_low & .255 ; 'LOW'
goto put_short_mes10
put_short_mes10
MOVWF wk
put_short_mes0
call get_short_mes
MOVWF data0
MOVLW HIGH (put_short_mes0)
MOVWF PCLATH ; PCLATHの修正
MOVLW 0 ; NULL?
SUBWF data0,0
BTFSC 3,2
GOTO ctrl_next
MOVF data0,0
call assert_wr2 ; RTL8019へ転送
INCF wk,1 ; ; wk++
goto put_short_mes0
;
; META CHARACTER
ctrl_code2
MOVLW HIGH (ctrl_code1)
MOVWF PCLATH
MOVF getmes_wk1,0
andlw 7fh
addlw -'0' ;不明
call ctrl_code1 ; コントロール文字出力ルーチンへ
MOVLW HIGH (ctrl_code2)
MOVWF PCLATH
ctrl_next
MOVLW 1 ; ind++
ADDWF ind,1
bsf STATUS,RP1
bcf STATUS,RP0
btfsc STATUS,C
INCF EEADRH,1
goto send_mes0
;-----------------------------------------------------------------------------------
; ソケットの作成
;
no_socket
btfss tcp_flags,TCP_SYN
RETURN
;
; SYNパケットの受信→SYN+ACKの送信
;
recv_syn
MOVLW HIGH (socket_entry)
MOVWF PCLATH
call socket_entry ; ソケットのエントリーを検索
MOVLW HIGH (recv_syn)
MOVWF PCLATH
btfsc STATUS,C
goto send_rst ; ソケットの空きなし
;
MOVLW 0
MOVWF ip_length
; IPヘッダ=20+24
MOVLW .20 + .24
MOVWF ip_length1
MOVLW TCP_PROTO ; TCP packet
MOVWF proto
call prepare_ip
;
;-------
MOVLW PACKET_SIZE + IP_SIZE ;mov remote_adr[0],#PACKET_SIZE + IP_SIZE
MOVWF remote_adr
MOVLW PAGE_BEGIN
MOVWF remote_adr1
MOVLW .20 + .4
MOVWF remote_len
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 ; 相手のポート番号
MOVLW seq_no
MOVWF FSR
movlw 4
call transmit_nbytes ; 自分のSEQNO
call inc_ack_no ; tcp_seq_no++;
MOVF com_fsr,0
MOVWF FSR
MOVLW .8
ADDWF FSR,1
bsf STATUS,IRP
bsf STATUS,RP0
MOVF seq_no,0 ; 自分のSEQ NOを自分のソケット+8に
MOVWF INDF
INCF FSR,1
MOVF seq_no1,0
MOVWF INDF
INCF FSR,1
MOVF seq_no2,0
MOVWF INDF
INCF FSR,1
MOVF seq_no3,0
MOVWF INDF
INCF FSR,1
bcf STATUS,RP0
MOVF tcp_seq_no,0
MOVWF INDF
INCF FSR,1
MOVF tcp_seq_no1,0
MOVWF INDF
INCF FSR,1
MOVF tcp_seq_no2,0
MOVWF INDF
INCF FSR,1
;mov INDF,tcp_seq_no[3]
MOVF tcp_seq_no3,0
MOVWF INDF
bcf STATUS,IRP
MOVF com_fsr,0
MOVWF FSR
MOVLW .8
ADDWF FSR,1
call inc_seq_no
MOVLW tcp_seq_no
MOVWF FSR
movlw 4
call transmit_nbytes ; 相手のSEQNO+1
movlw 60h ; オプション有り
call assert_wr
movlw B'010010' ; ACK+SYN
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 ; 緊急ポインタ
movlw 2h
call assert_wr
movlw 4h
call assert_wr
movlw 5h
call assert_wr
movlw 0b4h
call assert_wr
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
call assert_wr0
call transmit ; 送信!
call next_seq_no ; seq_no++
RETURN
;-----------------------------------------------------------------------------------
; チェックサム計算
calc_tcp_sum
CLRF bytes ;clr bytes ;2バイトアラインの調整
MOVLW this_ip ;mov fsr,#this_ip; 自分のIPアドレスを加算
MOVWF FSR
MOVF INDF,0
call calc_sum
INCF FSR,1
MOVF INDF,0
call calc_sum
INCF FSR,1
MOVF INDF,0
call calc_sum
INCF FSR,1
MOVF INDF,0
call calc_sum
MOVF ip_src,0 ; 相手のIPアドレスを加算
call calc_sum
MOVF ip_src1,0
call calc_sum
MOVF ip_src2,0
call calc_sum
MOVF ip_src3,0
call calc_sum
DB 01,00 ;clrw ; プロトコル番号を加算
call calc_sum
MOVLW TCP_PROTO
call calc_sum
MOVF remote_len1,0 ; バイト数を加算
call calc_sum
MOVF remote_len,0
call calc_sum
;-------
MOVLW PACKET_SIZE + IP_SIZE + .16
MOVWF remote_adr
MOVLW PAGE_BEGIN
MOVWF remote_adr1
;-------
call set_checksum ; RTL8019バッファに設定
RETURN
;===================================================================================
; NICの初期化ルーチン
;===================================================================================
initialize
call init_nic ; NICリセット
call getmac ; MACアドレス取得
call setmac ; MACアドレスセット
; リングバッファ初期化 [2004/10/30]
bsf STATUS,RP0
MOVLW fifo_top
MOVWF fifo_buff
MOVWF fifo_poi
MOVWF fifo_line
clrF fifo_cn
clrF fifo_line_cn
bcf STATUS,RP0
RETURN
;-----------------------------------------------------------------------------------
; RTL8019のリセット
;-----------------------------------------------------------------------------------
reset_nic
clrF PORTC
movlw 21h
call assert_wr0 ; STOP OPERATION
MOVLW 1Fh
MOVWF PORTC
call assert_rd ; 1ehを読む
MOVLW 1Fh
MOVWF PORTC
MOVF data0,0
call assert_wr0 ; それを書き戻す(RESET)
reset_nic0
MOVLW 07h
MOVWF PORTC
call assert_rd ; ステータスを読む
btfss data0,7 ;data.7 ; RESET 終了チェック
goto reset_nic0
RETURN
;-----------------------------------------------------------------------------------
; RTL8019の初期化
;-----------------------------------------------------------------------------------
init_nic
call reset_nic
MOVLW 0eh ; DCR(Data Conifguration Register)
MOVWF PORTC
movlw 68h
call assert_wr0
MOVLW 0ah
MOVWF PORTC
DB 01,00 ;clrw
call assert_wr0 ; for over flow
MOVLW 0bh
MOVWF PORTC
DB 01,00 ;clrw
call assert_wr0 ; for over flow
MOVLW 01h
MOVWF PORTC
movlw PAGE_START ; PAGE START
call assert_wr0
MOVLW 02h
MOVWF PORTC
movlw PAGE_STOP ; PAGE STOP
call assert_wr0
MOVLW 03h
MOVWF PORTC
movlw PAGE_START ; BDRY
call assert_wr0
MOVLW 0ch ; RCR
MOVWF PORTC
movlw 0h ; 20h
call assert_wr0
MOVLW 0dh ; TCR
MOVWF PORTC
movlw 2 ; LOOPBACK
call assert_wr0
MOVLW 0fh ; IMR
MOVWF PORTC
movlw B'11111'
call assert_wr0
MOVLW 7 ; ISR
MOVWF PORTC
movlw 0ffh
call assert_wr0
clrF PORTC ; CR(Command Regster)
movlw 22h ; START OPERATION with L/B
call assert_wr0
RETURN
;-----------------------------------------------------------------------------------
; MACアドレス取得
;-----------------------------------------------------------------------------------
getmac
clrF PORTC
movlw 22h
call assert_wr0
CLRF remote_adr
CLRF remote_adr1
MOVLW .12 ;12bytes転送
MOVWF remote_len
clrF remote_len1
call remote_read
MOVLW 6 ; MACアドレスは6バイト
MOVWF gcn1
MOVLW mymac ; アドレスにmymacに設定
MOVWF FSR
get_mac0
MOVLW 10h
MOVWF PORTC
call assert_rd ; から読み
call assert_rd ;
MOVF data0,0 ;mov INDF,data ; MACアドレスをPICに読み込む
MOVWF INDF
INCF FSR,1
DECFSZ gcn1,1
GOTO get_mac0
RETURN
;-----------------------------------------------------------------------------------
; MACアドレス設定
;-----------------------------------------------------------------------------------
setmac
; PAGE 1
clrF PORTC
movlw B'01100010'
call assert_wr0
;
MOVLW 01h
MOVWF PORTC
MOVLW mymac
MOVWF FSR
MOVLW 6 ; MACアドレスは6バイト
MOVWF gcn1
setmac0
MOVF INDF,0
call assert_wr0 ; MACアドレスの設定
INCF FSR,1
INCF PORTC,1
DECFSZ gcn1,1
GOTO setmac0
MOVLW 7
MOVWF PORTC
movlw PAGE_START + 1 ; ついでに
call assert_wr0 ; カレントページのセット
MOVLW 8
MOVWF PORTC
DB 01,00 ;clrw
call assert_wr0
INCF PORTC,1
DB 01,00 ;clrw
call assert_wr0
INCF PORTC,1
DB 01,00 ;clrw
call assert_wr0
INCF PORTC,1
DB 01,00 ;clrw
call assert_wr0
INCF PORTC,1
DB 01,00 ;clrw
call assert_wr0
INCF PORTC,1
DB 01,00 ;clrw
call assert_wr0
INCF PORTC,1
DB 01,00 ;clrw
call assert_wr0
INCF PORTC,1
DB 01,00 ;clrw
call assert_wr0
clrF PORTC
movlw 22h
call assert_wr0
RETURN
;-----------------------------------------------------------------------------------
; リモートDMA書き込み準備
;-----------------------------------------------------------------------------------
remote_write
MOVLW 8
MOVWF PORTC
MOVF remote_adr,0
call assert_wr0
MOVLW 9
MOVWF PORTC
MOVF remote_adr1,0
call assert_wr0
MOVLW 0ah
MOVWF PORTC
MOVF remote_len,0
call assert_wr0
MOVLW 0bh
MOVWF PORTC
MOVF remote_len1,0
call assert_wr0
clrF PORTC
movlw B'00010010'
call assert_wr0 ; write now!
MOVLW 10h
MOVWF PORTC
RETURN
;-----------------------------------------------------------------------------------
; リモートDMA読み込み準備
;-----------------------------------------------------------------------------------
remote_read
MOVLW 8
MOVWF PORTC
MOVF remote_adr,0
call assert_wr0
MOVLW 9
MOVWF PORTC
MOVF remote_adr1,0
call assert_wr0
MOVLW 0ah
MOVWF PORTC
MOVF remote_len,0
call assert_wr0
MOVLW 0bh
MOVWF PORTC
MOVF remote_len1,0
call assert_wr0
clrF PORTC
movlw B'00001010'
call assert_wr0 ; read now!
MOVLW 10h
MOVWF PORTC
RETURN
;-----------------------------------------------------------------------------------
; チェックサムの計算
;-----------------------------------------------------------------------------------
calc_sum
BTFSS bytes,0 ;btfss bytes.0 ;アラインメントチェック
goto calc_sum_high
; LOWバイト
ADDWF sum,1 ;データを(sum[1],sum[0])に加算
movlw 1
btfsc STATUS,C
addwf sum1,1
btfsc STATUS,C ; 1の補数の計算
addwf sum,1
btfsc STATUS,C
addwf sum1,1
INCF bytes,1 ; アラインを次に
RETURN
; HIGHバイト
calc_sum_high
ADDWF sum1,1 ; データを(sum[1],sum[0])に加算
movlw 1
btfsc STATUS,C ; 1の補数の計算
ADDWF sum,1
btfsc STATUS,C
ADDWF sum1,1
INCF bytes,1 ; アラインを次に
RETURN
assert_wr2times
DB 01,00 ;clrw
call assert_wr
DB 01,00 ;clrw
goto assert_wr
;-----------------------------------------------------------------------------------
; 送信データ=data
assert_wr2x
MOVLW 1 ; remote_len++
ADDWF remote_len,1
btfsc STATUS,C
INCF remote_len1,1
MOVF data0,0 ; data変数を媒介
goto assert_wr
; 送信データ=W
assert_wr2 movwf data0 ; 一度しまう
MOVLW 1 ; remote_len++
ADDWF remote_len,1
btfsc STATUS,C
INCF remote_len1,1
MOVF data0,0
;----------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -