Собрался уже после этой темы http://forum.agatcomp.ru//viewtopic.php?id=148 долго и беспросветно копаться в Бейсике, но мне повезло удачно этот баг загуглить.
Вот тут есть дизассемблированный листинг Applesoft Бейсика с комментариями http://www.txbobsc.com/scsc/scdocumentor/
Нужный нам кусок - здесь: http://www.txbobsc.com/scsc/scdocumentor/E597.html
Это функция VAL, адрес $E707 (в ИКП Бейсике девятки - $E6C7).
Как видно, перед конвертированием строки в ее конец принудительно записывается нулевой байт.
Вообще, в Бейсике строки хранятся с указанием адреса и длины. Но внутренние алгоритмы (видимо для экономии на счетчике) используют C-шный формат, и для этого в конец строки принудительно прописывается нулевой байт. Тот байт, который был на месте нуля, сохраняется в стеке.
Вот только есть одна проблема. Данные переменной A$ начинаются с адреса $BFFF и занимают 1 байт. Угадайте, куда запишется нулевой байт? Правильно, в $C000.
Дальше внутренние процедуры обработают введенный символ из $BFFF, а потом вместо нуля из $C000 прочтут последний введенный символ из регистра клавиатуры. И так пройдут по всем адресам $C000-$C00F. Получив в нашем случае строку из 17 повторов последнего символа.
Потом эти процедуры прочитают адрес $C010, а там - не цифра. Парсинг остановится.
Так что бага унаследована от Applesoft. В Apple она не проявляется - когда DOS загружен, рабочая область Бейсика заканчивается на $9600 и проблем не возникает. Но ИКП-шный Бейсик использует всю память от $1900 до $BFFF и бага проявляется.
* Интересно, что на семерке такого эффекта нет - там регистр клавиатуры чистится сам, и процедура парсинга получит свой нуль.
Вылечить такое поведение ИКП-шного Бейсика можно командой
Либо можно в самом начале программы завести неиспользуемую строковую переменную и присвоить ей что-нибудь (но не пустую строку, конечно).