This fails if m_iCurrentStrip + 1 equals 8. Apart from that, case 0 and 1 can fall through. If this was C++ I'd use a map, or a Dictionary in C#, to have one line of code that looks up the right value. You could also switch on all the values ( as in case 16: case 15: and so on ), but in C, this could be as good as it gets.
Actually, it looks to me like the only difference in the rules between cases, is how many there are. I'd drop this in to one if statement, and add checks such as:
if(m_iCurrentStrip+1 > 32)
{
if (NUM_UNITS > 4 )
port = 4;
}else{
if(m_iCurrentStrip+1 > 24mp;& NUM_UNITS > 4)
{
if (NUM_UNITS > 3 )
port = 3;
}else{
if(m_iCurrentStrip+1 > 16)
{
if (NUM_UNITS > 2 )
port = 2;
}else{
if(m_iCurrentStrip+1 > 8)
{
if (NUM_UNITS > 1 )
port = 1;
}else{
port = 0;
}