In Delphi, unsigned types are just subrange types of the next larger signed type. In Delphi 3, there is no 64-bit type, so there is no next larger type for Cardinal to be a subrange of. Cardinal is a signed type in Delphi 3 because of a technical limitation in the language. Delphi 4 introduced Int64, and Cardinal was made to be an unsigned subrange of that type (and then the limitation was that the was no unsigned 64-bit type).
In short, you were never getting true unsigned behavior in the first place. Now that you've upgraded, you've exposed long-present problems that have always been in your code.
That your code compiled is no proof that your code was correct. Delphi 3 cannot enforce rules that require types it doesn't really have.