Voldemar0 пишет:И после любого IF с проверкой ошибочной ситуации стоит просто LDA#<код ошибки> / JMP на эту точку.
Кажется, все сложнее. Например, в коде LOAD есть принудительное закрытие всех открытых файлов, поэтому RUN и LOAD будут работать корректно.
К своему стыду обнаружил, что никогда не читал файлы на Агатовском Бейсике :) Пришлось повозиться с написанием тестовой программки, которая открывает 4 файла неправильных типов. Без ONERR GOTO этого не сделать (программа вылетает), но RESUME передает управление в то место, где возникла ошибка, поэтому файл начинает открываться до бесконечности. Плюс, у ONERR GOTO какие-то странные отношения с циклом FOR. Но ничего, выкрутился. Программка тоже отработала корректно - открытые файлы не накапливаются. По крайней мере, у OPEN проблем нет.
Интересный момент - это то, что в тексте кода BLOAD есть комментарий "(CHANGED 11/1/78 FOR TYPE MISMATCH)". Дело в том, что к 1 ноября 1978 разработчик ДОС над ней больше работал - он еще летом передал код Apple. То есть, эту проверку типов добавляли программисты Apple. И, видно, что-то пошло не так :)
И еще два наблюдения навеянные этой багой:
1) Если в современных операционках написать программу на C, которая открывает два раза один и тот же файл, то получится два разных дескриптора. Используя их, можно, например, читать файл из разных точек. Но если попытаться то же самое сделать в ДОС (например, через вызовы файлового менеджера), то в момент второго вызова OPEN ранее открытый файл закроется и первый дескриптор станет недействителен. То есть в ДОС в принципе другой подход (один файл - один дескриптор).
2) Файл-менеджер для ИКП явно переделывали - структуры данных для открытых файлов больше по размеру и устроены иначе. То есть, исходники у разработчиков были достаточно подробные и поправить баг они в теории могли.