📄 rtl8019.s
字号:
.even
_rtl8019BeginPacketRetreive::
xcall push_gset4x
sbiw R28,4
.dbline -1
.dbline 371
; }
;
;
;
;
; // pointers to locations in the RTL8019 receive buffer
; static unsigned char nextPage;
; static unsigned int currentRetreiveAddress;
;
; // location of items in the RTL8019's page header
; #define enetpacketstatus 0x00
; #define nextblock_ptr 0x01
; #define enetpacketLenL 0x02
; #define enetpacketLenH 0x03
;
; unsigned int rtl8019BeginPacketRetreive(void)
; {
.dbline 379
; unsigned char i;
; unsigned char bnry;
;
; unsigned char pageheader[4];
; unsigned int rxlen;
;
; // check for and handle an overflow
; rtl8019ProcessInterrupt();
xcall _rtl8019ProcessInterrupt
L54:
.dbline 382
.dbline 382
ldi R24,98
sts 49152,R24
.dbline 382
L55:
.dbline 382
;
; // read CURR from page 1
; rtl8019Write(CR,0x62);
.dbline 383
; i = rtl8019Read(CURR);
lds R10,50944
L57:
.dbline 386
.dbline 386
ldi R24,34
sts 49152,R24
.dbline 386
L58:
.dbline 386
;
; // return to page 0
; rtl8019Write(CR,0x22);
.dbline 389
;
; // read the boundary register - pointing to the beginning of the packet
; bnry = rtl8019Read(BNRY) ;
lds R12,49920
.dbline 392
;
; // return if there is no packet in the buffer
; if( bnry == i )
cp R12,R10
brne L60
.dbline 393
; return 0;
clr R16
clr R17
xjmp L53
L60:
L62:
.dbline 397
.dbline 397
ldi R24,1
sts 50944,R24
.dbline 397
L63:
.dbline 397
;
;
; // clear the packet received interrupt flag
; rtl8019Write(ISR, (1<<ISR_PRX));
.dbline 400
;
; // the boundary pointer is invalid, reset the contents of the buffer and exit
; if( (bnry >= RXSTOP_INIT) || (bnry < RXSTART_INIT) )
mov R24,R12
cpi R24,96
brsh L67
cpi R24,70
brsh L65
L67:
.dbline 401
; {
L68:
.dbline 402
.dbline 402
ldi R24,70
sts 49920,R24
.dbline 402
L69:
.dbline 402
; rtl8019Write(BNRY, RXSTART_INIT);
L71:
.dbline 403
.dbline 403
ldi R24,98
sts 49152,R24
.dbline 403
L72:
.dbline 403
; rtl8019Write(CR, 0x62);
L74:
.dbline 404
.dbline 404
ldi R24,70
sts 50944,R24
.dbline 404
L75:
.dbline 404
; rtl8019Write(CURR, RXSTART_INIT);
L77:
.dbline 405
.dbline 405
ldi R24,34
sts 49152,R24
.dbline 405
L78:
.dbline 405
; rtl8019Write(CR, 0x22);
.dbline 407
;
; return 0;
clr R16
clr R17
xjmp L53
L65:
L80:
.dbline 411
.dbline 411
ldi R24,4
sts 51712,R24
.dbline 411
L81:
.dbline 411
; }
;
; // initiate DMA to transfer the RTL8019 packet header
; rtl8019Write(RBCR0, 4);
L83:
.dbline 412
.dbline 412
clr R2
sts 51968,R2
.dbline 412
L84:
.dbline 412
; rtl8019Write(RBCR1, 0);
L86:
.dbline 413
.dbline 413
clr R2
sts 51200,R2
.dbline 413
L87:
.dbline 413
; rtl8019Write(RSAR0, 0);
L89:
.dbline 414
.dbline 414
sts 51456,R12
.dbline 414
L90:
.dbline 414
; rtl8019Write(RSAR1, bnry);
L92:
.dbline 415
.dbline 415
ldi R24,10
sts 49152,R24
.dbline 415
L93:
.dbline 415
; rtl8019Write(CR, 0x0A);
.dbline 416
; for(i=0;i<4;i++)
clr R10
xjmp L98
L95:
.dbline 417
movw R24,R28
mov R30,R10
clr R31
add R30,R24
adc R31,R25
lds R2,53248
std z+0,R2
L96:
.dbline 416
inc R10
L98:
.dbline 416
mov R24,R10
cpi R24,4
brlo L95
L99:
.dbline 420
.dbline 420
ldi R24,34
sts 49152,R24
.dbline 420
L100:
.dbline 420
; pageheader[i] = rtl8019Read(RDMAPORT);
;
; // end the DMA operation
; rtl8019Write(CR, 0x22);
.dbline 421
; for(i = 0; i <= 20; i++)
clr R10
xjmp L105
L102:
.dbline 422
; if(rtl8019Read(ISR) & 1<<6)
lds R2,50944
sbrs R2,6
rjmp L106
.dbline 423
; break;
xjmp L104
L106:
L103:
.dbline 421
inc R10
L105:
.dbline 421
ldi R24,20
cp R24,R10
brsh L102
L104:
L108:
.dbline 424
.dbline 424
ldi R24,64
sts 50944,R24
.dbline 424
L109:
.dbline 424
; rtl8019Write(ISR, 1<<6);
.dbline 427
;
;
; rxlen = (pageheader[enetpacketLenH]<<8) + pageheader[enetpacketLenL];
ldd R2,y+2
ldd R3,y+3
mov R11,R3
mov R10,R2
.dbline 428
; nextPage = pageheader[nextblock_ptr] ;
ldd R2,y+1
sts _nextPage,R2
.dbline 430
;
; currentRetreiveAddress = (bnry<<8) + 4;
ldi R24,4
mov R3,R12
mov R2,R24
sts _currentRetreiveAddress+1,R3
sts _currentRetreiveAddress,R2
.dbline 433
;
; // if the nextPage pointer is invalid, the packet is not ready yet - exit
; if( (nextPage >= RXSTOP_INIT) || (nextPage < RXSTART_INIT) )
lds R24,_nextPage
cpi R24,96
brsh L116
cpi R24,70
brsh L114
L116:
.dbline 434
; return 0;
clr R16
clr R17
xjmp L53
L114:
.dbline 436
;
; return rxlen-4;
movw R16,R10
subi R16,4
sbci R17,0
.dbline -2
L53:
adiw R28,4
xcall pop_gset4x
.dbline 0 ; func end
ret
.dbsym r rxlen 10 i
.dbsym l pageheader 0 A[4:4]c
.dbsym r bnry 12 c
.dbsym r i 10 c
.dbend
.dbfunc e rtl8019RetreivePacketData _rtl8019RetreivePacketData fV
; i -> R10,R11
; length -> R18,R19
; localBuffer -> R16,R17
.even
_rtl8019RetreivePacketData::
xcall push_gset3x
.dbline -1
.dbline 441
; }
;
;
; void rtl8019RetreivePacketData(unsigned char * localBuffer, unsigned int length)
; {
L118:
.dbline 445
.dbline 445
sts 51712,R18
.dbline 445
L119:
.dbline 445
; unsigned int i;
;
; // initiate DMA to transfer the data
; rtl8019Write(RBCR0, (unsigned char)length);
L121:
.dbline 446
.dbline 446
movw R2,R18
mov R2,R3
clr R3
sts 51968,R2
.dbline 446
L122:
.dbline 446
; rtl8019Write(RBCR1, (unsigned char)(length>>8));
L124:
.dbline 447
.dbline 447
lds R2,_currentRetreiveAddress
lds R3,_currentRetreiveAddress+1
sts 51200,R2
.dbline 447
L125:
.dbline 447
; rtl8019Write(RSAR0, (unsigned char)currentRetreiveAddress);
L127:
.dbline 448
.dbline 448
lds R2,_currentRetreiveAddress
lds R3,_currentRetreiveAddress+1
mov R2,R3
clr R3
sts 51456,R2
.dbline 448
L128:
.dbline 448
; rtl8019Write(RSAR1, (unsigned char)(currentRetreiveAddress>>8));
L130:
.dbline 449
.dbline 449
ldi R24,10
sts 49152,R24
.dbline 449
L131:
.dbline 449
; rtl8019Write(CR, 0x0A);
.dbline 450
; for(i=0;i<length;i++)
clr R10
clr R11
xjmp L136
L133:
.dbline 451
movw R30,R10
add R30,R16
adc R31,R17
lds R2,53248
std z+0,R2
L134:
.dbline 450
movw R24,R10
adiw R24,1
movw R10,R24
L136:
.dbline 450
cp R10,R18
cpc R11,R19
brlo L133
L137:
.dbline 454
.dbline 454
ldi R24,34
sts 49152,R24
.dbline 454
L138:
.dbline 454
; localBuffer[i] = rtl8019Read(RDMAPORT);
;
; // end the DMA operation
; rtl8019Write(CR, 0x22);
.dbline 455
; for(i = 0; i <= 20; i++)
clr R10
clr R11
xjmp L143
L140:
.dbline 456
; if(rtl8019Read(ISR) & 1<<6)
lds R2,50944
sbrs R2,6
rjmp L144
.dbline 457
; break;
xjmp L142
L144:
L141:
.dbline 455
movw R24,R10
adiw R24,1
movw R10,R24
L143:
.dbline 455
ldi R24,20
ldi R25,0
cp R24,R10
cpc R25,R11
brsh L140
L142:
L146:
.dbline 458
.dbline 458
ldi R24,64
sts 50944,R24
.dbline 458
L147:
.dbline 458
.dbline 460
lds R2,_currentRetreiveAddress
lds R3,_currentRetreiveAddress+1
add R2,R18
adc R3,R19
sts _currentRetreiveAddress+1,R3
sts _currentRetreiveAddress,R2
.dbline 461
movw R24,R2
cpi R24,0
ldi R30,96
cpc R25,R30
brlo L149
.dbline 462
subi R24,0
sbci R25,26
sts _currentRetreiveAddress+1,R25
sts _currentRetreiveAddress,R24
L149:
.dbline -2
L117:
xcall pop_gset3x
.dbline 0 ; func end
ret
.dbsym r i 10 i
.dbsym r length 18 i
.dbsym r localBuffer 16 pc
.dbend
.dbfunc e rtl8019EndPacketRetreive _rtl8019EndPacketRetreive fV
; i -> R16
.even
_rtl8019EndPacketRetreive::
.dbline -1
.dbline 468
; rtl8019Write(ISR, 1<<6);
;
; currentRetreiveAddress += length;
; if( currentRetreiveAddress >= 0x6000 )
; currentRetreiveAddress = currentRetreiveAddress - (0x6000-0x4600) ;
; }
;
;
;
; void rtl8019EndPacketRetreive(void)
; {
L152:
.dbline 472
.dbline 472
ldi R24,34
sts 49152,R24
.dbline 472
L153:
.dbline 472
; unsigned char i;
;
; // end the DMA operation
; rtl8019Write(CR, 0x22);
.dbline 473
; for(i = 0; i <= 20; i++)
clr R16
xjmp L158
L155:
.dbline 474
; if(rtl8019Read(ISR) & 1<<6)
lds R2,50944
sbrs R2,6
rjmp L159
.dbline 475
; break;
xjmp L157
L159:
L156:
.dbline 473
inc R16
L158:
.dbline 473
ldi R24,20
cp R24,R16
brsh L155
L157:
L161:
.dbline 476
.dbline 476
ldi R24,64
sts 50944,R24
.dbline 476
L162:
.dbline 476
; rtl8019Write(ISR, 1<<6);
L164:
.dbline 479
.dbline 479
lds R2,_nextPage
sts 49920,R2
.dbline 479
L165:
.dbline 479
;
; // set the boundary register to point to the start of the next packet
; rtl8019Write(BNRY, nextPage);
.dbline -2
L151:
.dbline 0 ; func end
ret
.dbsym r i 16 c
.dbend
.dbfunc e rtl8019Overrun _rtl8019Overrun fV
; resend -> R10
; data_L -> R12
.even
_rtl8019Overrun::
xcall push_gset4x
.dbline -1
.dbline 484
; }
;
;
; void rtl8019Overrun(void)
; {
.dbline 487
; unsigned char data_L, resend;
;
; data_L = rtl8019Read(CR);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -