📄 final.asm
字号:
mov R6,A
mov DPH,20h
mov DPL,21h
call pac_send
mov R0,#0D4h
mov R1,#64h
mov R2,#4
lop1058:
mov A,@R0
mov @R1,A
inc R0
inc R1
djnz R2,lop1058
ret
ping_reply:
;--------------
mov DPH,2Ah
mov DPL,2Bh
clr A
movx @DPTR,A
inc DPTR
movx @DPTR,A
inc DPTR
movx A,@DPTR
add A,#8 ;校验和+8
movx @DPTR,A
inc DPTR
movx A,@DPTR
addc A,#0
movx @DPTR,A
mov A,DPL
clr C
subb A,#11
mov DPL,A
mov A,DPH
subb A,#0
mov DPH,A
mov 2Ah,DPH
mov 2Bh,DPL
mov R0,#0D0h ;对方ip
mov R1,#4
Loopa:
movx A,@DPTR
mov @R0,A
inc R0
inc DPTR
djnz R1,loopa
mov R0,#0D0h
mov R1,#4
loopb:
mov A,@R0
movx @DPTR,A
inc R0
inc DPTR
djnz R1,loopb
mov DPH,2AH
mov DPL,2BH
mov R0,#60h
mov R1,#4
loopc:
mov A,@R0
movx @DPTR,A
inc R0
inc DPTR
djnz R1,loopc
mov A,DPL
clr C
subb A,#30
mov DPL,A
mov A,DPH
subb A,#0
mov DPH,A
mov 2AH,DPH
mov 2BH,DPl
mov R0,#0AAh
mov R1,#6
loopd:
mov A,@R0
movx @DPTR,A
inc R0
inc DPTR
djnz R1,loopd
mov R0,#056h
mov R1,#6
loope:
mov A,@R0
movx @DPTR,A
inc R0
inc DPTR
djnz R1,loope
mov DPH,2AH
mov DPL,2BH
mov A,R7
add A,#34
mov R7,A
mov A,R6
addc A,#0
mov R6,A
call pac_send
ret
ping_return:
;----------
inc DPTR
inc dPTR
inc DPTR
movx A,@DPTR
cjne A,#12h,ret1539
inc DPTR
movx A,@DPTR
cjne A,#34h,ret1539
inc DPTR
movx A,@DPTR
mov B,A
mov A,#2Fh
clr C
subb A,B
mov B,#8
div AB
mov B,A ;时间 ?ms
mov R0,#0CAh
mov @R0,#1
mov DPTR,#s19
mov R0,#11
call cout
mov A,2BH
clr C
subb A,#8
mov DPL,A
mov A,2Ah
subb A,#0
mov DPH,A
mov R0,#0C0H
mov R1,#4
l1569:
movx A,@DPTR
mov @R0,A
inc R0
inc DPTR
djnz R1,l1569
mov R0,#0C0H
mov R2,#4
call i_to_S
mov A,#':'
call com_send
mov A,#' '
call com_send
mov DPTR,#s21
mov R0,#5
call cout
mov R2,B
mov R0,#2
mov R2,#1
call i_to_s
mov DPTR,#s22
mov R0,#7
call cout
mov R0,#5Eh ;TTL
mov R2,#1
call i_to_s
mov A,#0Dh
call com_send
mov A,#0Ah
call com_send
ret1539:
ret
;------------ICMP----------
;**********UDP*********
udp_rec:
;----------
mov 28h,DPH ;UDP部分开始处
mov 29h,DPL
inc DPTR
inc DPTR
movx A,@DPTR
cjne A,68H,L1455
inc DPTR
movx A,@DPTR
cjne A,69H,L1455
sjmp L1453
;端口号不对
L1455:
ret
L1453:
inc DPTR
movx A,@DPTR
cjne A,06h,exit1162
inc DPTR
movx A,@DPTR
cjne A,07h,exit1162
inc DPTR
movx A,@DPTR
inc DPTR
jnz L1166
movx A,@DPTR
jz L1168 ;no checksum
L1166:
mov A,DPL
clr C
subb A,#17
mov DPL,A
jnc L1176
dec dPH
L1176:
mov A,R6
movx @DPTR,A
inc DPTR
mov A,R7
movx @DPTR,A
mov A,DPL
clr C
subb A,#3
mov DPL,A
jnc L1188
dec dPH
L1188:
clr A
movx @DPTR,A
mov A,R7
add A,#12
mov R3,A
mov A,R6
addc A,#0
mov R2,A
call checksum
mov A,R4
jnz exit1162
mov A,R5
jnz exit1162
;校验无误
L1168:
mov DPH,28h
mov DPL,29h
mov A,DPL
add A,#08
mov DPL,A
jnc L1213
dec DPH
L1213:
mov A,R7
clr C
subb A,#8 ;得到数据长度
mov R7,A
mov A,R6
subb A,#0
mov R6,A
call buffer_send ;将数据直接发到串口上
exit1162:
ret
;***********UDP*********
tcp_rec:
;-------
ret
;************************net***************************
net_initial:
;----------------------------------
;-----------initial_start------------------
reset:
setb T0
call delay
clr T0
mov DPTR,#8000h
mov A,#21h
movx @DPTR,A
call delay
;reg0A=00 --RBCR0
mov DPL,#0ah
mov A,#00h
movx @DPTR,A
;reg0B=00 --RBCR1
mov DPL,#0bh
mov A,#00h
movx @DPTR,A
;reg0C=0xE0 --RCR
mov DPL,#0ch
mov A,#0E0h
movx @DPTR,A
;reg0d=0XE2 ---TCR
mov DPL,#0dh
mov A,#0E2h
movx @DPTR,A
;reg01=0x4C --PSTART
mov DPL,#01h
mov A,#4ch
movx @DPTR,A
;reg02=0x80 --PSTOP
mov DPL,#02h
mov A,#80h
movx @DPTR,A
;reg03=0x4C --BNRY
mov DPL,#03h
mov A,#4Ch
movx @DPTR,A
;reg04=0x40 --TPSR
mov DPL,#04h
mov A,#40h
movx @DPTR,A
;reg07=0xFF ---ISR
mov DPL,#07h
mov A,#0FFh
movx @DPTR,A
;reg0F=0x00 ----IMR
mov DPL,#0fh
mov A,#00h
movx @DPTR,A
;reg0e=0xC8 ---DCR
mov DPL,#0eh
mov A,#0C8h
movx @DPTR,A
;page(1)
mov DPTR,#8000h
movx A,@DPTR
anl A,#3Bh
mov B,#40h ;0100 0000
orl A,B
movx @DPTR,A
;mac:56H-5Bh
mov DPL,#01h
mov A,56H
movx @DPTR,A
inc DPl
mov A,57H
movx @DPTR,A
inc DPl
mov A,58H
movx @DPTR,A
inc DPl
mov A,59H
movx @DPTR,A
inc DPl
mov A,5AH
movx @DPTR,A
inc DPl
mov A,5Bh
movx @DPTR,A
mov DPL,#07H
;Curr=0x4D ---Curr
mov A,#4Dh
movx @DPTR,A
;mar=00-41-00-80-00-00-00-00
inc DPl
mov A,#00h
movx @DPTR,A
inc DPl
mov A,#41h
movx @DPTR,A
inc DPl
mov A,#00h
movx @DPTR,A
inc DPl
mov A,#80h
movx @DPTR,A
inc DPl
mov A,#00h
movx @DPTR,A
inc DPl
mov A,#00h
movx @DPTR,A
inc DPl
mov A,#00h
movx @DPTR,A
inc DPl
mov A,#00h
movx @DPTR,A
;---------------------
;page(0)
mov DPL,#00h
movx A,@DPTR
anl A,#3Bh
movx @DPTR,A
;reg0c=0xcc --RCR
mov DPL,#0ch
mov A,#0cch ;---- 接收广播和多播
movx @DPTR,A
;reg0d=0xE0 ---TCR
mov DPL,#0dh
mov A,#0E0h
movx @DPTR,A
;reg07=0xFF 中断状态清零
mov DPl,#07h
mov A,#0FFh
movx @DPTR,A
;reg0F=0x11 中断屏蔽设置
mov DPl,#0Fh
mov A,#11h ;只开接收中断
movx @DPTR,A
;reg00=0x22
mov DPl,#00h
mov A,#22h
movx @DPTR,A
call delay
ret
;-----------------------initial_End-----------------------------------
delay:
;----------------延时约0.5s ----------
mov R2,#05h
lp2:
mov R1,#241
lp1:
mov R0,#255
loop0:
nop
djnz R0,loop0
djnz R1,lp1
djnz R2,lp2
ret
;------------------------
pac_send:
;----------------*********************-------------------
;--------------从XRAM 中复制一段数据,写入8019 长度:R6,R7 位置 DPTR
clr EX0
mov 46h,R6
mov 47h,R7
PUSH 20H
PUSH 21H
mov 20H,DPH
mov 21h,DPL
PUSH DPH
PUSH DPL
mov A,R6
jnz c35
mov A,R7
subb A,#60
jNC c35
mov R7,#60
c35:
mov DPTR,#8008h
clr A
movx @DPTR,A
inc dpl
mov A,#40h ;<----dma页面
movx @DPTR,A
inc dpl
mov A, R7 ; <----------length
movx @DPTR,A
inc dpl
mov A,R6
movx @DPTR,A
mov DPTR,#8004h
mov A,#40h
movx @DPTR,A
inc dpl
mov A,R7 ;<----=-------length
movx @DPTR,A
inc dpl
mov A,R6
movx @DPTR,A
mov dpl,#0
mov A,#12h
movx @DPTR,A
inc R6
lp101:
mov dpH,20h
mov dpl,21h
movx A,@DPTR
inc DPTR
mov 20h,DPH
mov 21h,DPL
mov DPTR,#8010h
movx @DPTR,A
djnz R7,lp101
djnz R6,lp101
mov dpl,#0
mov A,#22h
movx @DPTR,A
;--------------数据包写入完成
;--------------------发送数据包-------------------
l000p:
mov dpl,#0
mov A,#3Eh ;<-------注意是3EH,11EH时会有错误,不能写入新的包.
movx @DPTR,A
l00p:
movx A,@DPTR ;<--------此处约等待1ms,视数据包大小而有所改变
ANL A,#04h
jnz l00p
mov DPL,#04h
movx A,@DPTR
ANL A,#01h
jz l000p
POP DPL
POP DPH
POP 21H
POP 20H
mov R6,46h
mov R7,47h
setb EX0
ret
;---------------------
pac_receive:
;----------------------------------------
;收取数据包
;(BNRY+1==CURR)? return:receive&continue
mov DPTR,#8003h
movx A,@DPTR ;BNRY
;if (BNRY==0x7F) BNRY=0x4C; else BNRY++
mov B,A
inc B
mov A,B
cjne A,#80h,L1426 ;if bnry==80h , bnry=4ch
mov B,#4Ch
L1426:
;page(1)
mov DPL,#0
mov A,#62h
movx @DPTR,A
;CURR
mov DPL,#07
movx A,@DPTR
clr C
subb A,B
jnz L1251
LJMP Empty ;没有新的数据包了
L1251:
;page(0)
mov dpl,#0
mov A,#22h
movx @DPTR,A
mov dpl,#08h ;DMA起始地址
clr A
movx @DPTR,A
inc dpl
mov A,B ;<-----BNRY+1
movx @DPTR,A
inc dpl ;DMA 字节数
mov A,#18 ;先读出前18个字节
movx @DPTR,A
inc dpl
clr A
movx @DPTR,A
mov dpl,#0
mov A,#0Ah ;DMA read
movx @DPTR,A
mov R0,#0A0h ;前18字节读出放入0A0-0B1H
mov R1,#18
mov DPTR,#8010h
loop325:
movx A,@DPTR
mov @R0,A
inc R0
djnz R1,loop325
mov dpl,#0
mov A,#22h ;DMA complete
movx @DPTR,A
mov R0,#0BFh ;收到的帧数
mov A,@R0
add A,#1
mov @R0,A
dec R0
jnc L1891
mov A,@R0
add A,#1
mov @R0,A
dec R0
jnc L1891
mov A,@R0
inc A
mov @R0,A
L1891:
mov R0,#0A0h
mov A,@R0
inc R0
mov A,@R0
mov B,A ;nextpage ->B
inc R0
mov A,@R0 ;length
clr C
subb A,#04
mov R7,A
inc R0
mov A,@R0
subb A,#0
mov R6,A
mov A,B ;if (nextpage>=80h or <4Ch or len >1500 )
clr C ;drop all packets & return
subb A,#80h
jnc bug
mov A,B
clr C
subb A,#4Ch
jc bug
mov A,R6
clr C
subb A,#6
jc L1913
bug:
;page(1)
mov DPL,#0
mov A,#62h
movx @DPTR,A
;CURR
mov DPL,#07
movx A,@DPTR
dec A
mov B,A
;page(0)
mov DPL,#0
mov A,#22h
movx @DPTR,A
mov A,B
mov DPL,#3
movx @DPTR,A
ret
L1913:
mov R0,#0B0h
mov A,@R0
clr C
subb A,#08h
jnz rec_next
inc R0
mov A,@R0
jz type_is_ip ;0800 IP
mov A,@R0
clr C
subb A,#06h
jnz rec_next
mov A,#0FFH ;0806
PUSH ACC
sjmp L1314
type_is_ip:
mov R0,#0A4h
mov A,@R0
clr C
subb A,#0FFH
jz rec_next
clr A
PUSH ACC
L1314:
mov DPl,#08h
mov A,#4
movx @DPTR,A
mov dpl,#0Ah
mov A,R6
movx @DPTR,A
inc dpl
mov A,R7
movx @DPTR,A
mov dpl,#0
mov A,#0Ah
movx @DPTR,A
mov 26H,24H
mov 27H,25H
inc R6
loop3025:
mov DPTR,#8010h
movx A,@DPTR
mov DPH,26H
mov DPL,27H
movx @DPTR,A
inc DPTR
mov 26H,DPH
mov 27H,DPL
djnz R7,loop3025
djnz R6,loop3025
mov DPTR,#8000h
mov A,#22h
movx @DPTR,A
mov A,25H
add A,#0EH ;去掉头部14字节
mov DPL,A
mov A,24H
addc A,#0
mov DPH,A
POP ACC
jz is_ip_packet
call arp_rec
mov 24h,#40
mov 25h,#00h
sjmp rec_next
is_ip_packet:
call ip_rec
nop
rec_next:
mov R0,#0A1H
mov A,@R0 ;next page
dec A
mov B,A
cjne A,#4Bh, d101 ; if BNRY=0x4B BNRY=0x7F
mov B,#7Fh
d101:
mov A,B
mov DPTR,#8003h
movx @DPTR,A ; write to BRNY
Ljmp pac_receive
Empty:
;page(0)
mov dpl,#0
mov A,#22h
movx @DPTR,A
ret
;***************************************
org 1000h
;*******************************数据区域**********************************
ether_data:
;--------mac
DB 00h,00h,00h,00h,00h,00h
DB 00h,11h,22h,033h,44h,55h
DB 08h,00h
ip_data:
DB 192,168,0,2 ; 源IP
DB 192,168,0,3
DW 1234,1234 ;端口号
;--------
subnet_data:
DB 192,168,0,2
DB 255,255,255,0
DB 192,168,0,1
;--------------
arp_data:
DB 08h,06h,00h,01h,08h,00h,06h,04h,00h,01h
Data_segment:
s1:
DB '欢迎使用串口服务器!',0Dh,0Ah
s2:
DB '初始化......',0Dh,0Ah
s3:
DB '**************************',0Dh,0Ah
DB '默认配置:',0Dh,0Ah
DB 'MAC:00-11-22-33-44-55',0Dh,0Ah
DB 'IP:192.168.0.2',0Dh,0Ah
DB '子网掩码:255.255.255.0',0Dh,0Ah
DB '网关:192.168.0.1',0Dh,0Ah
DB '目的IP:192.168.0.3',0Dh,0Ah
DB '传输协议:UDP',0Dh,0Ah
DB '本地端口:1234,远程端口:1234',0Dh,0Ah
DB '***************************',0Dh,0Ah
s4:
DB '要修改配置,请在5秒内按下任意键... ',0Dh,0Ah
s5:
DB '帮助信息:',0Dh,0Ah
DB 'cmd',0Dh,0Ah
DB 'exit',0Dh,0Ah
DB 'set (mac,ip,mask,gate,destip,sourport,destport) *',0Dh,0Ah
DB 'ping ip',0Dh,0Ah
DB 'send ip port udp/tcp',0Dh,0Ah
DB 'help',0Dh,0Ah
;----------------------------
s6:
DB '?*欢迎使用串口服务器*?',0dh,0ah,'welcome to serial server !! ',0dh,0ah
;
s8:
DB 'OK!',0Dh,0Ah
s9:
DB 'Wrong!Input again!',0Dh,0Ah
s7:
DB '本机IP '
s10:
DB '目的IP '
s11:
DB '子网掩码 '
s12:
DB '网关 '
s13:
DB '修改完毕!',0Dh,0Ah ;11
s14:
DB 0Dh,0Ah,'请逐项修改,直接<ENTER>保留原来设置',0Dh,0Ah,0Dh,0Ah ;40
s15:
DB '开始正常运行......',0Dh,0AH
s16:
DB 'Pinging ' ;8
s17:
DB ' with 32 bytes of data:',0Dh,0Ah, ;25
s18:
DB 'Ping 请求超时!',0Dh,0Ah ;16
s19:
DB 'Reply from ' ; 11
s20:
DB '找不到对方主机!',0Ah,0DH
s21:
DB 'time='
s22:
DB 'ms,TTL='
end0:
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -