📄 web51.asm
字号:
.nolist.include "param.inc".include "8019.inc".list .section buf_data, #alloc.global buf.global bufendbuf: .ds.b sizeofbufbufend:.global slowtimer .comm slowtimer, 1 .bcomm stateFlg, 1 ;; stateFlg bit enum .equ flagARP, 0 .equ flagICMP,1 .equ flagUDP, 2 .equ flagTCP, 3; RSEG CPU_BIT;;***** ARP/IP/TCP *****.global rx_eth_bit.global flagArpGwRq.global flagSynRq.global flag1WaitForAck.global flagIPactive .bitcomm rx_eth_bit, 1 ;Packet driver .bitcomm flagArpGwRq, 1 .bitcomm flagSynRq, 1 .bitcomm flag1WaitForAck, 1 ;Wait for Ack state (Psh send, wait for Ack rcv) .bitcomm flagIPactive, 1 ;flash_ip_point != 0 .comm activity1, 1 ; TCP1 activity timer.ifdef ACTIVESTACK.global flagArpPoiRq .bitcomm flagArpPoiRq, 1.else .ifdef ACTIVEUDP.global flagArpPoiRq .bitcomm flagArpPoiRq, 1 .endif.endif.ifdef DUALSTACK.global flag2WaitForAck.global activity2 .bitcomm flag2WaitForAck, 1 ; Wait for Ack state (Psh send, wait for Ack rcv) .comm activity2, 1 ; TCP2 activity timer.endif;;***** timer ***** .bitcomm bit1ms, 1 .section vectors, #alloc;************************************************************* .org 0x00 LJMP reset .org 0x03 LJMP intIE0 ; external interrupt 0 .org 0x0B LJMP intTF0 ; timer 0 .org 0x13 LJMP intIE1 ; external interrupt 1 .org 0x1B LJMP intTF1 ; timer 1 .org 0x23 LJMP intRITI ; serial port; .section reset_begin, #alloc;************************************************************* .global resetreset: MOV R7,#20 ;ISP DELAY for AT89S8252 CPUISP_Ra: MOV R6,#0xFF ; 255 x 255 x 25 = 650 ms for 22.1184 MHz XtalISP_Rb: MOV R5,#0xFFISP_Rc: DJNZ R5,ISP_Rc DJNZ R6,ISP_Rb DJNZ R7,ISP_Ra MOV P0,#-1 MOV P1,#0 MOV P2,#-1 MOV P3,#-1 MOV SP,#stack MOV R0,#0resLP: MOV @R0,#0 INC R0 MOV A,R0 JNZ resLP; mov PCON,#0 ; default mov TMOD,#0b00000001; timer 0, 16 bit mode ; timer 1, default mov tl0,#LOW(SysTik) mov th0,#HIGH(SysTik) mov TCON,#0x30 ; start timer0, other bits set to default mov IE,#0b00000010 ; enable timer0 int.if RD2 mov CKCON, #C2SETUP; mov AUXR1, #0 ;select DPTR mov AUXR, #X2SETUP .endif .section reset_end, #alloc;************************************************************* orl IE,#0b10000000 ; enable interrupt.ifdef SERIAL clr rxint ; clear interrupt flags clr txint.endif clr bit1ms mov slowtimer,#slowtiming INIT_WD;; ajmp main .section fast_begin, #alloc;************************************************************* .global mainmain: RESTART_WD ;restart Watchdog.ifdef SERIAL lcall sstat ;scan RTS/CTS,....endif mov stateFlg,#0 ;flagARP..flagTCP clr rx_eth_bit LCALL rcv_pkt jnb rx_eth_bit,NoRxEth acall ProcessEthPacket;cpl LED0 jnb B2B(stateFlg, flagICMP),.+6 lcall ProcessICMP jnb B2B(stateFlg, flagTCP),.+6 lcall ProcessTCP jnb B2B(stateFlg, flagUDP),.+6 lcall ProcessUDP jnb B2B(stateFlg, flagARP),.+6 lcall ProcessARP;cpl LED1NoRxEth:jnb bit1ms,main clr bit1ms;~1 ms loopfastloop: jnb flagArpGwRq,.+6 lcall ProcessArpGwRq.ifdef ACTIVESTACK jnb flagArpPoiRq,.+6 lcall ProcessArpPoiRq.else .ifdef ACTIVEUDP jnb flagArpPoiRq,.+6 lcall ProcessArpPoiRq .endif.endif.ifdef ACTIVESTACK jnb flagSynRq,.+6 lcall ProcessSynRq.endif .section fast_end, #alloc;************************************************************* djnz slowtimer,main mov slowtimer,#slowtiming;~50 ms loopslowloop: .section slow_begin, #alloc;************************************************************* clr B2B(tcpState, stateSyn).ifdef DUALSTACK clr B2B(tcpStateXX, stateSyn) clr B2B(tcpStateXX+1, stateSyn).endif .section slow_end, #alloc;************************************************************************** ajmp main .section cpu_rom, #alloc;**************************************************************************ProcessEthPacket:;;if (rx_eth_pkt.pktType == 0x0800) goto IPPacket; //IP;;else if (rx_eth_pkt.pktType == 0x0806) goto ArpPacket; //ARP;;else goto UnknownEthType; mov a,eth_pkt_hdr_type xrl a,#0x08 ;high ARP and IP ID jnz UnknownEthType mov a,eth_pkt_hdr_type+1 jz IPPacket xrl a,#0x06 ;low ARP ID jz ArpPacketUnknownEthType: ret ;Unknown ID of Ethernet packet;**************************************************************************;Type of ethernet packet = 0806h ARPArpPacket: setb B2B(stateFlg, flagARP) ret;**************************************************************************;Type of ethernet packet = 0800h IPNoMyIP: DISABLE_EE ret ;IP with IP_DSTADDR != flash_my_ipIPPacket:;;if (rx_eth_pkt.pkt.ip.ipheader.DstAddr == flash_my_ip) { mov R7,#buf ;buffer_addr mov R5,#IP_TTL ;source_packet_offset mov R3,#12 ;length lcall short_pr2s ;read IP_TTL & IP_PROTO & IP_CKSUM ;IP_SRCADDR & IP_DSTADDR to temp var mov dptr,#flash_my_ip mov r0, #buf+(IP_DSTADDR-IP_TTL) mov r1, #IP_ADDR_LEN ENABLE_EEmyiploop:movx a,@dptr xrl a,@r0 jnz NoMyIP inc dptr inc r0 djnz r1,myiploop;;if (((rx_eth_pkt.pkt.ip.ipheader.SrcAddr ^ flash_my_ip) & flash_ip_mask) != 0) { mov dptr,#flash_my_ip mov r0, #buf+(IP_SRCADDR-IP_TTL) mov r1, #IP_ADDR_LENgwloop1:movx a,@dptr xrl a,@r0 mov @r0,a inc dptr inc r0 djnz r1,gwloop1 mov dptr,#flash_ip_mask mov r0, #buf+(IP_SRCADDR-IP_TTL) mov r1, #IP_ADDR_LENgwloop2:movx a,@dptr anl a,@r0 jnz gwloopbreak inc dptr inc r0 djnz r1,gwloop2gwloopbreak: DISABLE_EE jz noneedgw;; if(!valid_mac_gateway) { jb validMACgateway, noneedarpgw;; MakeArpGwRq(); return; setb flagArpGwRq ;Arp Gateway Request ret;; } else {;; EthRcvHdr.pktSrc = flash_mac_gateway;noneedarpgw: mov r7, #eth_pkt_hdr_src ;TO mov r4, #HIGH(flash_mac_gateway) ;FROM mov r5, #LOW(flash_mac_gateway) mov r3, #ETHER_ADDR_LEN ;LENGTH lcall pe2s;; };;}noneedgw:;; switch (rx_eth_pkt.pkt.ip.Proto) {;; case IPT_ICMP: goto protoICMP; mov R0,#buf+(IP_PROTO-IP_TTL) mov a,@R0 xrl a,#IPT_ICMP ;proto ICMP jz protoICMP;; case IPT_TCP: goto protoTCP; xrl a,#(IPT_ICMP ^ IPT_TCP) ;proto TCP jz protoTCP;; case IPT_UDP: goto protoUDP; xrl a,#(IPT_TCP ^ IPT_UDP) ;proto UDP jz protoUDP retprotoICMP: setb B2B(stateFlg, flagICMP) retprotoTCP: setb B2B(stateFlg, flagTCP) retprotoUDP: setb B2B(stateFlg, flagUDP) ret;; };;};;;###########################################;# Timer 0 Interrupt service #;###########################################; .section cpu_rom, #alloc;*************************************************************.global intTF0.global _reti_intTF0: push psw push acc mov tl0,#LOW(SysTik) mov th0,#HIGH(SysTik) mov a,activity1 jz noDecAct1 dec activity1noDecAct1:.ifdef DUALSTACK mov a,activity2 jz noDecAct2 dec activity2noDecAct2:.endif setb bit1ms pop acc pop psw.ifdef SERIAL.else.global intRITIintRITI: ;don't link serial.obj.endif_reti_: reti ;; END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -