I think it came down to a single flag that gets set by the video chip for any two objects that collide. Once the flag is set, the game code needs to figure out which two sprite objects in the scene could have possibly collided. Some time elapses between the flag being set, and the code checking for the collision, allowing for other things to happen in the game (even if only briefly). Ultimately this creates a lot of room for errors because the software is analyzing the game in a slightly different state than when the collision actually occurred, and it may infer a collision between two objects that did not actually collide, due to some other limitations on resources and using object boundary boxes that do not perfectly map to the actual pixels occupied by an object.