#include <mega8.h>
////////////////////////////////////////////////////////////////////////////////
// ATmega8: 
// начальное: RC - 1 МHz: Low E1; Higt D9; 
//                    RC - 8 МHz: Low E4; Higt D9; 
//               кварц - 8 МHz: Low EF; Higt C9 (CKOPT -on); XTAL2 – выход--V
//               кварц - 8 МHz: Low EF; Higt D9 (CKOPT -off); 
//               XTAL1 – вход:  Low E0; Higt D9  
////////////////////////////////////////////////////////////////////////////////
// ATmega328: 
// начальное: RC -1 МHz: Higt D9; Ext 07; Lok 3F; Low 62
//                    RC -8 МHz: Higt D9; Ext 07; Lok 3F; Low E2
//            кварц - 20 МHz: Higt D9; Ext 07; Lok 3F; Low E7(CKOUT -off); XTAL2 – выход--V
//            кварц - 20 МHz: Higt D9; Ext 07; Lok 3F; Low E7(CKOUT -on); CKOUT – выход
////////////////////////////////////////////////////////////////////////////////
// W5500:       
// 3,3 V - 80 mA.  - 10 МБит/c
// 3,3 V - 135 mA. - 100 МБит/c
// Socket_0 - MACRAW
// Socket_1 - UDP
// Socket_2 - TCP
////////////////////////////////////////////////////////////////////////////////
                                             

////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////// Socket_0 - MACRAW:
// MACRAW // len | Data 
// len - 0x00 0x00(len=len+Data).
/////////////////////////////////////////////// ICMP (ping):
unsigned char ICMP[74]={
//Destination MAC:        // 0...5
//0xff,0xff,0xff,0xff,0xff,0xff,            //Destination MAC: FF:FF:FF:FF:FF:FF 
//Source MAC:              // 6...11
0x00,0x08,0xdc,0x01,0x02,0x03,    //Source MAC: 00:08:dc:01:02:03 
//Type:  
0x08,0x00,                   // 12,13- Type: IP (0x0800) 
/////////////////////////////////////////////// Protocol IP: 
0x45,                            // 14-       Version: 4, Header length: 20 bytes
0x00,                            // 15-       Differentiated Services Field...
0x00,0x3c,                    // 16,17-  Total Length: 60
0x00,0x00,                   // 18,19-   Identification: 0 
0x00,0x00,                   // 20,21-   Fragment offset: 0
0x80,                            // 22-        Time to live: 128
0x01,                            // 23-        Protocol: ICMP (1)
0x00,0x00,                   // 24,25-   Header checksum IP:  
0xc0,0xa8,0x00,0x03,  // 26...29- Source IP:        192.168.0.3
0xc0,0xa8,0x00,0x65,  // 30...33- Destination IP:  192.168.0.101 
/////////////////////////////////////////////// Protocol ICMP: 
0x08,                            // 34-        Type: 8 (Echo (ping) request)
0x00,                            // 35-        Code: 0
0x00,0x00,                   // 36,37-    Checksum ICMP:          // начальное =0
0x00,0x00,                   // 38,39-    Identifier (BE): 0
0x00,0x00,                   // 40,41-    Sequence number (BE): 0
//////////////////////////// 42...73-  Data(32 bytes): 
0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,  
0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70,  
0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x61,  
0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69   
};     
/////////////////////////////////////////////// Header checksum IP:
//Header checksum IP = 0x00+0x00 // сброс Header checksum IP
//Version + Differentiated + Total Length + Identification + Fragment offset + 
//Time to live + Protocol + Header checksum IP + Source IP + Destination IP
//0x45+0x00+0x00+0x3c+0x00+0x00+0x00+0x00+
//0x80+0x01+0x00+0x00+0xc0+0xa8+0x00+0x03+0xc0+0xa8+0x00+0x65   
//Header checksum IP =~Header checksum IP
//Проверка КС: расчётная == FFFF
/////////////////////////////////////////////// checksum ICMP: 
//Type + Code + checksum ICMP + Identifier + Sequence + Data 
//0x08+0x00+0x00+0x00+0x00+0x00+0x00+0x00+
//0x61+0x62+0x63+0x64+0x65+0x66+0x67+0x68+
//0x69+0x6a+0x6b+0x6c+0x6d+0x6e+0x6f+0x70+  
//0x71+0x72+0x73+0x74+0x75+0x76+0x77+0x61+  
//0x62+0x63+0x64+0x65+0x66+0x67+0x68+0x69
//checksum ICMP =~checksum ICMP 
//Проверка КС: расчётная == FFFF
////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////
void main(void)
{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////// checksum_ICMP (ping):   
/*
checksum_ICMP = 0;
ICMP[36] = 0;  // начальное checksum_ICMP  =0
ICMP[37] = 0;  // начальное checksum_ICMP  =0
/////////////////////////////////////////////// 34...73
for (x=34;x<74;x+=2) {
  bufer_checksum_ICMP = ICMP[x];
  x1 = x + 1;
  bufer_checksum_ICMP = (bufer_checksum_ICMP<<8)|ICMP[x1];
  checksum_ICMP += bufer_checksum_ICMP;
  if (checksum_ICMP & 0xffff0000) {
    checksum_ICMP &= 0x0000ffff;
    checksum_ICMP += 0x00000001;
  };
};
/////////////////////////////////////////////// checksum_ICMP:
checksum_ICMP = ~checksum_ICMP;
ICMP[36] = (checksum_ICMP>>8);
ICMP[37] = checksum_ICMP;
*/
}    
 