>>1010930'Doom III' together with 'Half Life II' is a early examples of direct x 9 'shader model 3' graphics, it has a fully scriptable 'pixel shader' (often reffered to as 'fragment program' in documentaion).
If you could go back to then from today you could do very modern 'PBR' looking graphics using 'sm3' as everything you need is there already, you'd only had to known what to write.
Today it'd be common knowledge and easily done but back then this was new and many people jumping into shading had to learn the basics from documentation for offline rendering
as this stuff hadn't been exposed for the masses to play around with like this and there was a learning curve before masses of people could start contribute to do it smarter.
But ultimatly The normalmap was expanded/unpacked in the fragment program with the same 'normalize((normalTexure.rgb+1)*0.5)' way we still use.
You do specular via some formula based on 'NdotH' like we've done since Blinn/Phong in the 1970's, the blinn specular formula is availible everywhere, don't remember it off the top of my head.
you just don't do it in the fancy nice way that gives it a proper 'long tail' falloff like current used models such as GGX, you just stop at a more naive (and computationally inexpensive) stage.
If you want softer falloff from lighting calculations against a normal map wihtout using ambient light probes etc just let the light wrap around further towards the back of the model to fit your taste.
Valve used a method called 'half lambert' that was/is very popular it's just 'NdotL*0.5 + 0.5' and make the model look like it is in a space that is bouncing light onto it from nearby surfaces.