Need help with HLSL (ps_3_0) d3d9 bug (discard vs return)

Hi, I need help with understanding what is wrong with my hlsl shader (ps_3_0 for d3d9).

Here is part of my shader.
It makes color part middle of the quad in GREEN.
Make outside of sides of the “ships” RED.
Make space between ships BLUE.
As you see on one of screenshot.

float4 PS_CivilianTrafficConnectionLine_Corris(VS_OUT In) : COLOR
{
    float blindZoneStart = CTCL_SolidZone + CTCL_HalfZone;
    float blindZoneEnd = 1.0f - blindZoneStart;

    if (In.Tex.x > blindZoneStart && In.Tex.x < blindZoneEnd)
    {
        return float4(0.0f, 1.0f, 0.0f, 1.0f); // WIDE GREEN LINE  (AT BLINDZONE)
    }
    else
    {
        // ...
        if (shipUnderPixelOnLine.shipIndex == -1)
        {
            return float4(0.0f, 0.0f, 1.0f, 1.0f); // BLUE SPACE BETWEEN SHIPS (swap with discard)

            // BUGGED DISCARD - TURN ON TO SEE THE BUG
          //  discard; 
          //  return float4(0.0f, 0.0f, 1.0f, 1.0f); 
        }
        else
        {
            // ...
            if (In.Tex.y < (yLowHighBounds.x + marginY) || In.Tex.y > (yLowHighBounds.y - marginY))
            {
                return float4(1.0f, 0.0f, 0.0f, 1.0f); // RED SPACE OUTSIDE OF SHIP BoundBox
            }
            else
            {
                float4 color;
                // ...
                return color; // SHIP
            }
        }
    }

}

technique CivilianTrafficConnectionLine
{
    pass P0
    {
        ALPHATESTENABLE = TRUE;
        ALPHABLENDENABLE = TRUE;
        CULLMODE = NONE;
        VertexShader = compile vs_3_0 VS_DrawOnScreen();
        PixelShader = compile ps_3_0 PS_CivilianTrafficConnectionLine_Corris();
    }
}

Problem is - If i change

          return float4(0.0f, 0.0f, 1.0f, 1.0f);

to

          discard; 
          return float4(0.0f, 0.0f, 1.0f, 1.0f); 

I will see the bug. Instead of loosing all BLUE I loose most of GREEN as well.
And I don’t see the way it happened ?
Green part is in another part of the IF operator.

Result of the bug you may see on another screenshot.

Does anybody knows how this happening?

Shader compile with string:
fxc.exe /T fx_2_0 /Od /Fo Shaders.fxo /Zi /Fc Shaders.asm Shaders.vsh

I use PIX for windows to see what happening with rest of GREEN line - but there is nothing.
As if no shaders apply for pixels outside of small green line.
I think - because of ‘discard’.

I hope I can find here someone who remember ancient techs ).