Как я вижу варианты требований к точности определения версии:
1. Нужна конкретная версия и только она. Такое возможно, если программа вызывает через машинный код процедуры бейсика, адреса которых плавают от версии к версии. Пример - бейсиковский вариант Моны. В таком случае самый надежный вариант ориентироваться на 2.5.
2. Нужна версия, в которой уже исправлена определенная ошибка или ошибки. Т.е. скорее всего подойдут несколько версий начиная с такой-то. Примеры были на ретрограде, например широкое использование шестнадцатеричных чисел, которые в 2.5 очень ограниченны. Можно сделать очень просто (хотя и не очень изящно) - печатаем на экране что-то вроде
"Для данной программы требуется версия бейсика не ниже такой-то"
потом пробуем использовать исправленный вариант какого-то оператора или функции. Если бейсик старый - вылетаем с ошибкой и на экране остается вышеприведенное сообщение. Если бейсик подходящий - стираем сообщение и идем дальше.
3. Используются внутренние особенности, без которых можно обойтись. Примеры были и в классических программах и на ретрограде. Например - для картинки, которая будет выведена с использованием PUT, пишем данные прямо в массив, откуда будет PUT. Вместо этого лучше нарисовать на экране например через POKE, потом GET, потом PUT, в таком случае программа будет совместима с любым внутренним представлением картинки GET/PUT. Примеры таких адаптаций пары программ я выкладывал, это вполне осуществимо.

