📄 tcpip.lst
字号:
\ In segment CODE, align 2
201 void DoNetworkStuff(void)
\ DoNetworkStuff:
202 {
\ 000000 0A12 PUSH.W R10
203 unsigned int ActRxEvent; // copy of cs8900's RxEvent-Register
204
205 Write8900(ADD_PORT, PP_RxEvent); // point to RxEvent
\ 000002 3E402401 MOV.W #0x124, R14
\ 000006 7C400A00 MOV.B #0xa, R12
\ 00000A B012.... CALL #Write8900
206 ActRxEvent = Read8900(DATA_PORT); // read, implied skip of last frame
\ 00000E 7C400C00 MOV.B #0xc, R12
\ 000012 B012.... CALL #Read8900
\ 000016 0A4C MOV.W R12, R10
207
208 if (ActRxEvent & RX_OK)
\ 000018 3AB00001 BIT.W #0x100, R10
\ 00001C 0A28 JNC ??DoNetworkStuff_0
209 {
210 if (ActRxEvent & RX_IA) ProcessEthIAFrame();
\ 00001E 3AB00004 BIT.W #0x400, R10
\ 000022 0228 JNC ??DoNetworkStuff_1
\ 000024 B012.... CALL #ProcessEthIAFrame
211 if (ActRxEvent & RX_BROADCAST) ProcessEthBroadcastFrame();
\ ??DoNetworkStuff_1:
\ 000028 3AB00008 BIT.W #0x800, R10
\ 00002C 0228 JNC ??DoNetworkStuff_0
\ 00002E B012.... CALL #ProcessEthBroadcastFrame
212 }
213
214 if (TCPFlags & TCP_TIMER_RUNNING)
\ ??DoNetworkStuff_0:
\ 000032 E2B2.... BIT.B #0x4, &TCPFlags
\ 000036 2028 JNC ??DoNetworkStuff_2
215 if (TCPFlags & TIMER_TYPE_RETRY)
\ 000038 F2B2.... BIT.B #0x8, &TCPFlags
\ 00003C 1328 JNC ??DoNetworkStuff_3
216 {
217 if (TCPTimer > RETRY_TIMEOUT)
\ 00003E F2900900.... CMP.B #0x9, &TCPTimer
\ 000044 1928 JNC ??DoNetworkStuff_2
218 {
219 TCPRestartTimer(); // set a new timeout
\ 000046 B012.... CALL #TCPRestartTimer
220
221 if (RetryCounter)
\ 00004A C293.... CMP.B #0x0, &RetryCounter
\ 00004E 0524 JEQ ??DoNetworkStuff_4
222 {
223 TCPHandleRetransmission(); // resend last frame
\ 000050 B012.... CALL #TCPHandleRetransmission
224 RetryCounter--;
\ 000054 F253.... ADD.B #0xff, &RetryCounter
\ 000058 0F3C JMP ??DoNetworkStuff_2
225 }
226 else
227 {
228 TCPStopTimer();
\ ??DoNetworkStuff_4:
\ 00005A B012.... CALL #TCPStopTimer
229 TCPHandleTimeout();
\ 00005E B012.... CALL #TCPHandleTimeout
\ 000062 0A3C JMP ??DoNetworkStuff_2
230 }
231 }
232 }
233 else if (TCPTimer > FIN_TIMEOUT)
\ ??DoNetworkStuff_3:
\ 000064 F2900300.... CMP.B #0x3, &TCPTimer
\ 00006A 0628 JNC ??DoNetworkStuff_2
234 {
235 TCPStateMachine = CLOSED;
\ 00006C C243.... MOV.B #0x0, &TCPStateMachine
236 TCPFlags = 0; // reset all flags, stop retransmission...
\ 000070 C243.... MOV.B #0x0, &TCPFlags
237 SocketStatus &= SOCK_DATA_AVAILABLE; // clear all flags but data available
\ 000074 E2F2.... AND.B #0x4, &SocketStatus
238 }
239
240 switch (TCPStateMachine)
\ ??DoNetworkStuff_2:
\ 000078 5E42.... MOV.B &TCPStateMachine, R14
\ 00007C 4E83 SUB.B #0x0, R14
\ 00007E 0A24 JEQ ??DoNetworkStuff_5
\ 000080 5E83 SUB.B #0x1, R14
\ 000082 0824 JEQ ??DoNetworkStuff_5
\ 000084 6E83 SUB.B #0x2, R14
\ 000086 3824 JEQ ??DoNetworkStuff_6
\ 000088 5E83 SUB.B #0x1, R14
\ 00008A 3624 JEQ ??DoNetworkStuff_6
\ 00008C 7E800300 SUB.B #0x3, R14
\ 000090 5D24 JEQ ??DoNetworkStuff_7
\ 000092 813C JMP ??DoNetworkStuff_8
241 {
242 case CLOSED :
243 case LISTENING :
244 if (TCPFlags & TCP_ACTIVE_OPEN) // stack has to open a connection?
\ ??DoNetworkStuff_5:
\ 000094 D2B3.... BIT.B #0x1, &TCPFlags
\ 000098 7E28 JNC ??DoNetworkStuff_8
245 if (TCPFlags & IP_ADDR_RESOLVED) // IP resolved?
\ 00009A E2B3.... BIT.B #0x2, &TCPFlags
\ 00009E 7B28 JNC ??DoNetworkStuff_8
246 if (!(TransmitControl & SEND_FRAME2)) // buffer free?
\ 0000A0 E2B3.... BIT.B #0x2, &TransmitControl
\ 0000A4 782C JC ??DoNetworkStuff_8
247 {
248 TCPSeqNr = ((unsigned long)ISNGenHigh << 16) | TAR; // set local ISN
\ 0000A6 1E427001 MOV.W &0x170, R14
\ 0000AA 1F42.... MOV.W &ISNGenHigh, R15
\ 0000AE 824E.... MOV.W R14, &TCPSeqNr
\ 0000B2 824F.... MOV.W R15, &TCPSeqNr + 2
249 TCPUNASeqNr = TCPSeqNr;
\ 0000B6 9242........ MOV.W &TCPSeqNr, &TCPUNASeqNr
\ 0000BC 9242........ MOV.W &TCPSeqNr + 2, &TCPUNASeqNr + 2
250 TCPAckNr = 0; // we don't know what to ACK!
\ 0000C2 8243.... MOV.W #0x0, &TCPAckNr
\ 0000C6 8243.... MOV.W #0x0, &TCPAckNr + 2
251 TCPUNASeqNr++; // count SYN as a byte
\ 0000CA 9253.... ADD.W #0x1, &TCPUNASeqNr
\ 0000CE 8263.... ADDC.W #0x0, &TCPUNASeqNr + 2
252 PrepareTCP_FRAME(TCPSeqNr, TCPAckNr, TCP_CODE_SYN); // send SYN frame
\ 0000D2 2312 PUSH.W #0x2
\ 0000D4 1E42.... MOV.W &TCPAckNr, R14
\ 0000D8 1F42.... MOV.W &TCPAckNr + 2, R15
\ 0000DC 1C42.... MOV.W &TCPSeqNr, R12
\ 0000E0 1D42.... MOV.W &TCPSeqNr + 2, R13
\ 0000E4 B012.... CALL #PrepareTCP_FRAME
253 LastFrameSent = TCP_SYN_FRAME;
\ 0000E8 D243.... MOV.B #0x1, &LastFrameSent
254 TCPStartRetryTimer(); // we NEED a retry-timeout
\ 0000EC B012.... CALL #TCPStartRetryTimer
255 TCPStateMachine = SYN_SENT;
\ 0000F0 E243.... MOV.B #0x2, &TCPStateMachine
\ 0000F4 2153 ADD.W #0x2, SP
\ 0000F6 4F3C JMP ??DoNetworkStuff_8
256 }
257 break;
258 case SYN_RECD :
259 case ESTABLISHED :
260 if (TCPFlags & TCP_CLOSE_REQUESTED) // user has user initated a close?
\ ??DoNetworkStuff_6:
\ 0000F8 F2B01000.... BIT.B #0x10, &TCPFlags
\ 0000FE 4B28 JNC ??DoNetworkStuff_8
261 if (!(TransmitControl & (SEND_FRAME2 | SEND_FRAME1))) // buffers free?
\ 000100 F2B00300.... BIT.B #0x3, &TransmitControl
\ 000106 4720 JNE ??DoNetworkStuff_8
262 if (TCPSeqNr == TCPUNASeqNr) // all data ACKed?
\ 000108 9292........ CMP.W &TCPUNASeqNr, &TCPSeqNr
\ 00010E 4320 JNE ??DoNetworkStuff_8
\ 000110 9292........ CMP.W &TCPUNASeqNr + 2, &TCPSeqNr + 2
\ 000116 3F20 JNE ??DoNetworkStuff_8
263 {
264 TCPUNASeqNr++;
\ 000118 9253.... ADD.W #0x1, &TCPUNASeqNr
\ 00011C 8263.... ADDC.W #0x0, &TCPUNASeqNr + 2
265 PrepareTCP_FRAME(TCPSeqNr, TCPAckNr, TCP_CODE_FIN | TCP_CODE_ACK);
\ 000120 30121100 PUSH.W #0x11
\ 000124 1E42.... MOV.W &TCPAckNr, R14
\ 000128 1F42.... MOV.W &TCPAckNr + 2, R15
\ 00012C 1C42.... MOV.W &TCPSeqNr, R12
\ 000130 1D42.... MOV.W &TCPSeqNr + 2, R13
\ 000134 B012.... CALL #PrepareTCP_FRAME
266 LastFrameSent = TCP_FIN_FRAME;
\ 000138 F2400300.... MOV.B #0x3, &LastFrameSent
267 TCPStartRetryTimer();
\ 00013E B012.... CALL #TCPStartRetryTimer
268 TCPStateMachine = FIN_WAIT_1;
\ 000142 F2400500.... MOV.B #0x5, &TCPStateMachine
\ 000148 2153 ADD.W #0x2, SP
\ 00014A 253C JMP ??DoNetworkStuff_8
269 }
270 break;
271 case CLOSE_WAIT :
272 if (!(TransmitControl & (SEND_FRAME2 | SEND_FRAME1))) // buffers free?
\ ??DoNetworkStuff_7:
\ 00014C F2B00300.... BIT.B #0x3, &TransmitControl
\ 000152 2120 JNE ??DoNetworkStuff_8
273 if (TCPSeqNr == TCPUNASeqNr) // all data ACKed?
\ 000154 9292........ CMP.W &TCPUNASeqNr, &TCPSeqNr
\ 00015A 1D20 JNE ??DoNetworkStuff_8
\ 00015C 9292........ CMP.W &TCPUNASeqNr + 2, &TCPSeqNr + 2
\ 000162 1920 JNE ??DoNetworkStuff_8
274 {
275 TCPUNASeqNr++; // count FIN as a byte
\ 000164 9253.... ADD.W #0x1, &TCPUNASeqNr
\ 000168 8263.... ADDC.W #0x0, &TCPUNASeqNr + 2
276 PrepareTCP_FRAME(TCPSeqNr, TCPAckNr, TCP_CODE_FIN | TCP_CODE_ACK); // we NEED a retry-timeout
\ 00016C 30121100 PUSH.W #0x11
\ 000170 1E42.... MOV.W &TCPAckNr, R14
\ 000174 1F42.... MOV.W &TCPAckNr + 2, R15
\ 000178 1C42.... MOV.W &TCPSeqNr, R12
\ 00017C 1D42.... MOV.W &TCPSeqNr + 2, R13
\ 000180 B012.... CALL #PrepareTCP_FRAME
277 LastFrameSent = TCP_FIN_FRAME; // time to say goodbye...
\ 000184 F2400300.... MOV.B #0x3, &LastFrameSent
278 TCPStartRetryTimer();
\ 00018A B012.... CALL #TCPStartRetryTimer
279 TCPStateMachine = LAST_ACK;
\ 00018E F2400900.... MOV.B #0x9, &TCPStateMachine
\ 000194 2153 ADD.W #0x2, SP
280 }
281 break;
282 }
283
284 if (TransmitControl & SEND_FRAME2)
\ ??DoNetworkStuff_8:
\ 000196 E2B3.... BIT.B #0x2, &TransmitControl
\ 00019A 1C28 JNC ??DoNetworkStuff_9
285 {
286 RequestSend(TxFrame2Size);
\ 00019C 5C42.... MOV.B &TxFrame2Size, R12
\ 0001A0 3CF0FF00 AND.W #0xff, R12
\ 0001A4 B012.... CALL #RequestSend
287
288 if (Rdy4Tx()) // NOTE: when using a very fast MCU,
\ 0001A8 B012.... CALL #Rdy4Tx
\ 0001AC 0C93 CMP.W #0x0, R12
\ 0001AE 0924 JEQ ??DoNetworkStuff_10
289 { // maybe the CS8900 isn't ready yet
290 CopyToFrame8900((unsigned char *)TxFrame2Mem, TxFrame2Size);
\ 0001B0 5E42.... MOV.B &TxFrame2Size, R14
\ 0001B4 3EF0FF00 AND.W #0xff, R14
\ 0001B8 3C40.... MOV.W #TxFrame2Mem, R12
\ 0001BC B012.... CALL #CopyToFrame8900
\ 0001C0 073C JMP ??DoNetworkStuff_11
291 }
292 else
293 {
294 TCPStateMachine = CLOSED;
\ ??DoNetworkStuff_10:
\ 0001C2 C243.... MOV.B #0x0, &TCPStateMachine
295 SocketStatus = SOCK_ERR_ETHERNET; // indicate an error to user
\ 0001C6 F2405000.... MOV.B #0x50, &SocketStatus
296 TCPFlags = 0; // clear all flags, stop timers etc.
\ 0001CC C243.... MOV.B #0x0, &TCPFlags
297 }
298
299 TransmitControl &= ~SEND_FRAME2; // clear tx-flag
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -