⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtl8019as.s

📁 AVR以太网开发板中的几个例子。文件中定义了网卡芯片的IP地址,默认值是192.168.0.99。
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module rtl8019as.c
	.area text(rom, con, rel)
	.dbfile D:\hexok项目\AVRNET项目\AVRNET光盘\icc例子\rtl8019as.c
	.dbfunc e rtl8019_reset _rtl8019_reset fV
;           temp -> R20
	.even
_rtl8019_reset::
	xcall push_gset1
	.dbline -1
	.dbline 23
; #include "main.h"
; #include "rtl8019as.h"
; #include "arp.h"
; #include "ip.h"
; #include "icmp.h"
; #include "udp.h"
; 
; unsigned int count;//需要读或写的字节数
; unsigned char tempmac_d5;
; unsigned char tempmac_d4;
; unsigned char tempmac_d3;
; unsigned char tempmac_d2;
; unsigned char tempmac_d1;
; unsigned char tempmac_d0;
; 
; extern unsigned char tempip_d3;
; extern unsigned char tempip_d2;
; extern unsigned char tempip_d1;
; extern unsigned char tempip_d0;
; extern unsigned int ip_id;
; 
; void rtl8019_reset(void)
; {
	.dbline 24
;  unsigned char temp=0;
	clr R20
	.dbline 26
;  
;  RTLRST_SET;
	lds R24,101
	ori R24,8
	sts 101,R24
	.dbline 27
;  delay_100ms();
	xcall _delay_100ms
	.dbline 28
;  RTLRST_CLR;
	lds R24,101
	andi R24,247
	sts 101,R24
	.dbline 29
;  delay_100ms();
	xcall _delay_100ms
	.dbline 30
;  temp=reg_1f;//读网卡的复位端口
	lds R20,_reg_1f
	.dbline 31
;  delay_100ms();
	xcall _delay_100ms
	.dbline 32
;  reg_1f=temp; //写网卡的复位端口
	sts _reg_1f,R20
	.dbline 33
;  delay_100ms();
	xcall _delay_100ms
	.dbline -2
L1:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r temp 20 c
	.dbend
	.dbfunc e rtl8019_hotreset _rtl8019_hotreset fV
;           temp -> R16
	.even
_rtl8019_hotreset::
	.dbline -1
	.dbline 37
; }
; 
; void rtl8019_hotreset(void)
; {
	.dbline 38
;  unsigned char temp=0;
	clr R16
	.dbline 40
;  
;  temp=reg_1f;//读网卡的复位端口
	lds R16,_reg_1f
	.dbline 41
;  reg_1f=temp; //写网卡的复位端口
	sts _reg_1f,R16
	.dbline -2
L2:
	.dbline 0 ; func end
	ret
	.dbsym r temp 16 c
	.dbend
	.dbfunc e rtl8019_page _rtl8019_page fV
;           temp -> R20
;     pagenumber -> R16
	.even
_rtl8019_page::
	xcall push_gset1
	.dbline -1
	.dbline 45
; }
; 
; void rtl8019_page(unsigned char pagenumber)
; {
	.dbline 47
;  unsigned char temp;
;  temp=reg_00;
	lds R20,_reg_00
	.dbline 48
;  temp=temp&0x3B;          //TXP位要置为0.
	andi R20,59
	.dbline 49
;  pagenumber=pagenumber<<6;
	lsl R16
	lsl R16
	lsl R16
	lsl R16
	lsl R16
	lsl R16
	.dbline 50
;  temp=temp|pagenumber;
	or R20,R16
	.dbline 51
;  reg_00=temp;
	sts _reg_00,R20
	.dbline -2
L3:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r temp 20 c
	.dbsym r pagenumber 16 c
	.dbend
	.dbfunc e rtl8019_init _rtl8019_init fV
	.even
_rtl8019_init::
	.dbline -1
	.dbline 55
; }
; 
; void rtl8019_init(void)
; {
	.dbline 57
;  //rtl8019_page(0); //选择页0的寄存器 
;  reg_00=0x21; //选择页0的寄存器,网卡停止运行。
	ldi R24,33
	sts _reg_00,R24
	.dbline 58
;  reg_01=0x4d; //寄存器Pstart
	ldi R24,77
	sts _reg_01,R24
	.dbline 59
;  reg_02=0x80; //Pstop
	ldi R24,128
	sts _reg_02,R24
	.dbline 60
;  reg_03=0x4c; //BNRY
	ldi R24,76
	sts _reg_03,R24
	.dbline 61
;  reg_04=0x40; //TPSR
	ldi R24,64
	sts _reg_04,R24
	.dbline 62
;  reg_05=0xfe;   //TBCR0
	ldi R24,254
	sts _reg_05,R24
	.dbline 63
;  reg_06=0x00;   //TBCR1
	clr R2
	sts _reg_06,R2
	.dbline 64
;  reg_07=0xFF; //ISR
	ldi R24,255
	sts _reg_07,R24
	.dbline 65
;  reg_0c=0xcc; //RCR
	ldi R24,204
	sts _reg_0c,R24
	.dbline 66
;  reg_0d=0xe0; //TCR
	ldi R24,224
	sts _reg_0d,R24
	.dbline 67
;  reg_0e=0xc8; //DCR 数据配置寄存器 8位数据dma 
	ldi R24,200
	sts _reg_0e,R24
	.dbline 68
;  reg_0f=0xff; //IMR all interrupt 
	ldi R24,255
	sts _reg_0f,R24
	.dbline 69
;  rtl8019_page(1); //选择页1的寄存器
	ldi R16,1
	xcall _rtl8019_page
	.dbline 70
;  reg_07=0x4d; //CURR
	ldi R24,77
	sts _reg_07,R24
	.dbline 71
;  reg_08=0x00; //MAR0
	clr R2
	sts _reg_08,R2
	.dbline 72
;  reg_09=0x41; //MAR1
	ldi R24,65
	sts _reg_09,R24
	.dbline 73
;  reg_0a=0x00; //MAR2
	sts _reg_0a,R2
	.dbline 74
;  reg_0b=0x80; //MAR3
	ldi R24,128
	sts _reg_0b,R24
	.dbline 75
;  reg_0c=0x00; //MAR4
	sts _reg_0c,R2
	.dbline 76
;  reg_0d=0x00; //MAR5
	sts _reg_0d,R2
	.dbline 77
;  reg_0e=0x00; //MAR6
	sts _reg_0e,R2
	.dbline 78
;  reg_0f=0x00; //MAR7
	sts _reg_0f,R2
	.dbline 80
;  //rtl8019_page(0); 
;  reg_00=0x22; //选择页0寄存器,网卡执行命令。 
	ldi R24,34
	sts _reg_00,R24
	.dbline -2
L4:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e rtl8019_writemynodeid _rtl8019_writemynodeid fV
	.even
_rtl8019_writemynodeid::
	.dbline -1
	.dbline 85
; } 
; 
; void rtl8019_writemynodeid(void)
; 
; { 
	.dbline 86
;  rtl8019_page(1);
	ldi R16,1
	xcall _rtl8019_page
	.dbline 87
;  reg_01=mynodeid_0; //PAR0
	ldi R24,79
	sts _reg_01,R24
	.dbline 88
;  reg_02=mynodeid_1; //PAR1
	ldi R24,70
	sts _reg_02,R24
	.dbline 89
;  reg_03=mynodeid_2; //PAR2
	sts _reg_03,R24
	.dbline 90
;  reg_04=mynodeid_3; //PAR3
	ldi R24,73
	sts _reg_04,R24
	.dbline 91
;  reg_05=mynodeid_4; //PAR4
	ldi R24,67
	sts _reg_05,R24
	.dbline 92
;  reg_06=mynodeid_5; //PAR5
	ldi R24,69
	sts _reg_06,R24
	.dbline -2
L5:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e rtl_status _rtl_status fc
	.even
_rtl_status::
	.dbline -1
	.dbline 96
; }
; 
; unsigned char rtl_status(void)
; {
	.dbline 97
;  rtl8019_page(0);
	clr R16
	xcall _rtl8019_page
	.dbline 98
;  return reg_0c;
	lds R16,_reg_0c
	.dbline -2
L6:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e rtl_isrstatus _rtl_isrstatus fc
;   rtlisrstatus -> R20
	.even
_rtl_isrstatus::
	xcall push_gset1
	.dbline -1
	.dbline 102
; }
; 
; unsigned char rtl_isrstatus(void)
; {
	.dbline 104
;  unsigned char rtlisrstatus;
;  rtl8019_page(0);
	clr R16
	xcall _rtl8019_page
	.dbline 105
;  rtlisrstatus=reg_07;
	lds R20,_reg_07
	.dbline 106
;  reg_07=0xFF;
	ldi R24,255
	sts _reg_07,R24
	.dbline 107
;  return rtlisrstatus;
	mov R16,R20
	.dbline -2
L7:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r rtlisrstatus 20 c
	.dbend
	.dbfunc e rtl_readcurr _rtl_readcurr fc
	.even
_rtl_readcurr::
	.dbline -1
	.dbline 111
; }
; 
; unsigned char rtl_readcurr(void)
; {
	.dbline 112
;  rtl8019_page(1); //选择页1的寄存器
	ldi R16,1
	xcall _rtl8019_page
	.dbline 113
;  return reg_07;   //CURR
	lds R16,_reg_07
	.dbline -2
L8:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e rtl_setcurr _rtl_setcurr fV
	.even
_rtl_setcurr::
	.dbline -1
	.dbline 118
; }
; 
; 
; void rtl_setcurr(void)
; {
	.dbline 119
;  reg_00=0x21; //选择页0的寄存器,网卡停止运行,因为还没有初始化。
	ldi R24,33
	sts _reg_00,R24
	.dbline 120
;  reg_03=0x4c;   //bnry
	ldi R24,76
	sts _reg_03,R24
	.dbline 121
;  reg_00=0x22; //选择页0寄存器,网卡执行命令。
	ldi R24,34
	sts _reg_00,R24
	.dbline -2
L9:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e rtl8019_write _rtl8019_write fV
;              i -> R20,R21
;         offset -> y+6
;          count -> R22,R23
;           addr -> R10,R11
	.even
_rtl8019_write::
	xcall push_gset3
	movw R22,R18
	movw R10,R16
	.dbline -1
	.dbline 127
;  //rtl8019_page(1); //选择页1的寄存器
;  //reg_07=0x4e;   //CURR
; }
;  
; void rtl8019_write(unsigned int addr,unsigned int count,unsigned char offset)
; {
	.dbline 129
;     //addr为要写入到网卡里的ram的起始地址,count为要连续写入的字节数
;     unsigned int i=offset;
	ldd R20,y+6
	clr R21
	.dbline 131
; 
; 	rtl8019_page(0);
	clr R16
	xcall _rtl8019_page
	.dbline 132
;     reg_09=addr>>8;//address high
	movw R2,R10
	mov R2,R3
	clr R3
	sts _reg_09,R2
	.dbline 133
;     reg_08=addr&0xff;//address low 
	movw R24,R10
	andi R25,0
	sts _reg_08,R24
	.dbline 134
;     reg_0b=count>>8; //write count high 
	movw R2,R22
	mov R2,R3
	clr R3
	sts _reg_0b,R2
	.dbline 135
;     reg_0a=count&0xff;//write count low 
	movw R24,R22
	andi R25,0
	sts _reg_0a,R24
	.dbline 136
;     reg_00=0x12 ;//dma write 
	ldi R24,18
	sts _reg_00,R24
	.dbline 138
;     
; 	count+=offset;
	ldd R2,y+6
	clr R3
	add R22,R2
	adc R23,R3
	.dbline 139
;     for(;i<count;i++)
	xjmp L14
L11:
	.dbline 140
	.dbline 141
	ldi R24,<_buffer
	ldi R25,>_buffer
	movw R30,R20
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	sts _reg_10,R2
	.dbline 142
L12:
	.dbline 139
	subi R20,255  ; offset = 1
	sbci R21,255
L14:
	.dbline 139
	cp R20,R22
	cpc R21,R23
	brlo L11
	.dbline 143
;     {
;       reg_10=buffer[i];
;     }
;     reg_0b=0; // count high 中止DMA操作 
	clr R2
	sts _reg_0b,R2
	.dbline 144
;     reg_0a=0;// count low
	sts _reg_0a,R2
	.dbline 145
;     reg_00=0x22;//abort/complete dma page 0 
	ldi R24,34
	sts _reg_00,R24
	.dbline -2
L10:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym l offset 6 c
	.dbsym r count 22 i
	.dbsym r addr 10 i
	.dbend
	.dbfunc e rtl8019_read _rtl8019_read fV
;              i -> R20,R21
;          count -> R22,R23
;           addr -> R10,R11
	.even
_rtl8019_read::
	xcall push_gset3
	movw R22,R18
	movw R10,R16
	.dbline -1
	.dbline 149
; }
; 
; void rtl8019_read(unsigned int addr,unsigned int count)
; {
	.dbline 151
;   //address为网卡里的ram的起始地址,count为要连续读取的字节数
;   unsigned int i=0;
	clr R20
	clr R21
	.dbline 153
;    
;   rtl8019_page(0);
	clr R16
	xcall _rtl8019_page
	.dbline 154
;   reg_09=addr>>8;//address high
	movw R2,R10
	mov R2,R3
	clr R3
	sts _reg_09,R2
	.dbline 155
;   reg_08=addr&0xff;//address low 
	movw R24,R10
	andi R25,0
	sts _reg_08,R24
	.dbline 156
;   reg_0b=count>>8; //write count high 
	movw R2,R22
	mov R2,R3
	clr R3
	sts _reg_0b,R2
	.dbline 157
;   reg_0a=count&0xff;//write count low 
	movw R24,R22
	andi R25,0
	sts _reg_0a,R24
	.dbline 158
;   reg_00=0x0a ;//dma read
	ldi R24,10
	sts _reg_00,R24
	.dbline 160
; 
;   for(;i<count;i++)
	xjmp L19
L16:
	.dbline 161
	.dbline 162
	ldi R24,<_buffer
	ldi R25,>_buffer
	movw R30,R20
	add R30,R24
	adc R31,R25
	lds R2,_reg_10
	std z+0,R2
	.dbline 163
L17:
	.dbline 160
	subi R20,255  ; offset = 1
	sbci R21,255
L19:
	.dbline 160
	cp R20,R22
	cpc R21,R23
	brlo L16
	.dbline 165
;   {
;    buffer[i]=reg_10;
;   }
; 
;   reg_0b=0; // count high 中止DMA操作 
	clr R2
	sts _reg_0b,R2
	.dbline 166
;   reg_0a=0;// count low
	sts _reg_0a,R2
	.dbline 167
;   reg_00=0x22;//abort/complete dma page 0 
	ldi R24,34
	sts _reg_00,R24
	.dbline -2
L15:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r count 22 i
	.dbsym r addr 10 i
	.dbend
	.dbfunc e rtl8019_sendpack _rtl8019_sendpack fV
;         offset -> R22
;            len -> R20,R21
	.even
_rtl8019_sendpack::
	xcall push_gset2
	mov R22,R18
	movw R20,R16
	sbiw R28,1
	.dbline -1
	.dbline 171
; }
; 
; void rtl8019_sendpack(unsigned int len,unsigned char offset)
; {
	.dbline 172
;   reg_00=0x21; //选择页0的寄存器,网卡停止运行
	ldi R24,33
	sts _reg_00,R24
	.dbline 173
;   reg_04=0x40; //TPSR
	ldi R24,64
	sts _reg_04,R24
	.dbline 174
;   rtl8019_write(0x4000,len,offset);
	std y+0,R22
	movw R18,R20
	ldi R16,16384
	ldi R17,64
	xcall _rtl8019_write
	.dbline 175
;   reg_00=0x21;
	ldi R24,33
	sts _reg_00,R24
	.dbline 176
;   reg_04=0x40;     //TPSR
	ldi R24,64
	sts _reg_04,R24
	.dbline 177
;   reg_05=len&0xff; //TBCR0
	movw R24,R20
	andi R25,0
	sts _reg_05,R24
	.dbline 178
;   reg_06=len>>8;   //TBCR1
	movw R2,R20
	mov R2,R3
	clr R3
	sts _reg_06,R2
	.dbline 179
;   reg_00=0x1E;
	ldi R24,30
	sts _reg_00,R24
	.dbline -2
L20:
	adiw R28,1
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r offset 22 c
	.dbsym r len 20 i
	.dbend
	.dbfunc e buildpack _buildpack fV
;            len -> y+20
;         mac_s0 -> y+18
;         mac_s1 -> y+16
;         mac_s2 -> y+14
;         mac_s3 -> y+12
;         mac_s4 -> y+10
;         mac_s5 -> y+8

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -