The problem of this version of Marlin can be shown in the following piece of code (which is inside EEPROM_RetrieveSettings function):
for (short i=0;i<4;i++)
{
axis_steps_per_unit[i]=tmp1[i];
max_feedrate[i]=tmp2[i];
max_acceleration_units_per_sq_second[i]=tmp3[i];
max_length[i]=tmp4[i];
}
Here max_length is an array of 3 elements, not 4 (the X,Y and Z axes have a max length to avoid hitting the edge, but the extrude axis dodoes not have such a limit - you should be able to extrude as many filament as you can supply), so the last statement in the loop overrides other variable(s).
The solution is
for (short i=0;i<4;i++)
{
axis_steps_per_unit[i]=tmp1[i];
max_feedrate[i]=tmp2[i];
max_acceleration_units_per_sq_second[i]=tmp3[i];
if(i<3)
max_length[i]=tmp4[i];
}
Or
for (short i=0;i<4;i++)
{
axis_steps_per_unit[i]=tmp1[i];
max_feedrate[i]=tmp2[i];
max_acceleration_units_per_sq_second[i]=tmp3[i];
if(i < sizeof(tmp4)/sizeof(tmp4[0]))
max_length[i]=tmp4[i];
}
Greate thanks to the answer writer and commenter. Without your help I couldn't follow the right track.