Hmm.. ofcourse. Using / turns the result into a float, and the components of D are bytes.

Does your sollution with DIV really work. DIV's result can only be an integer. :?
I assume that your alpha value is a byte (0-255). So dividing it by 255, will give you a result inside the 0..1 range. If you use DIV, i assume all results in this range will be rounded to zero.

I think this will be more accurate:

Code:
//Include the math unit to use "Floor"
D.R := Floor(B.R + (S.R - B.R)*(S.A/255));
D.G := Floor(B.G + (S.R - B.G)*(S.A/255));
D.B := Floor(B.B + (S.R - B.B)*(S.A/255));
Edit: I noticed you removed the brackets around "S.A div 255". I guess that'll make the difference. But could you try my snippet? I wonder wether it works.