I looked some more at that code, and I must say there was a lot of work put into it, I take my hat off to you for that!

BUT!
I can't find any obvious problem after straining my eyes on it, I am sure there is a memory intrusion that is hammering the RTL with all the twisted dynamic array reallocations that are taking place and somewhere in the soup is an error.
It's possible you have found a memory management error but at this point, I believe what is happening is you have fragmented the memory pool so bad it's hard to decide if it's your code overwriting somewhere or you have just created an unmanageable pile of fragmentation?
My suggestions are this:
Create a static CONST of your op-codes using the compiler at compile time instead of doing this dynamically.
Specs: array[0..MaxModes] of TmodeSpecs = (
(Name: 'SC1'; Trim: 1; TotalLineCount: 3965; ModeVisCode: (1, 60);
GrayScaleLines: 16;
ModeLineCount: 256; ModeGammaCount: $82; FrontPorch: 14; EndPorch: 0;
ColorSync: 0; VideoRepeats: 4; ModeMaxSync: 83; ModeSpeed: 0.0001079999831; ),
(Name: 'SC2'; Trim: 1; TotalLineCount: 2018; ModeVisCode: (1, 56);
GrayScaleLines: 16;
ModeLineCount: 256; ModeGammaCount: $82; FrontPorch: 11; EndPorch: 0;
ColorSync: 0; VideoRepeats: 2; ModeMaxSync: 65; ModeSpeed: 0.0001376070802; ),
(Name: 'SC3'; Trim: 1; TotalLineCount: 3965; ModeVisCode: (1, 52); GrayScaleLines: 8;
An example from some code to build a Op-Code table via the compiler.
Also, I see you use Allocmem(4) many times on a pointer for a field that can be represented within the structure without allocation of small chucks like that, that is what causes fragmentation.!
There is much more in code optimization that can be done. more later.
Jamie