📄 rtl8019as.s
字号:
.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 + -