Спасибо. В общем, желающие могут пользоваться проектом. Конкретно здесь хочу выразить благодарность всем участникам обсуждения в этой ветке. Именно здесь подсказали про тесты Rugg/Feldman, и вообще было высказано много хороших идей, которые легли в этот проект.
Куда двигать его дальше - пока думаю. Исходно в планах было довести функционал до Altair BASIC 8K (а там строковые переменные, LEFT$, RIGHT$, многомерные массивы, больше свободы с именами переменных и др.). Но комментированный дизассемблер 8К-бейсика найти не удалось. Можно было бы продизассемблировать Бейсик "Микрон" с РК-86, например. По структуре он должен во многом повторять оригинал (Altair 4K), там даже баги одни и те же, я проверял по ходу разработки.
Так что, если у кого-нибудь есть желание помочь с дизассемблированием и попутно изучить один из самых компактных и мощных классических бейсиков эры 70-80х - буду благодарен!
Кстати. В Altair BASIC используются ассемблерные трюки, которых я никогда не встречал в мире ZX Spectrum. Подучился у Билла Гейтса, что называется! Вот один пример.
Допустим, есть 2 точки входа в процедуру, для одной из них регистр A должен быть равен 0, а для другой - не нулю. Билл Гейтс и Пол Аллен делают это так:
Что получается: при вызове точки entry исполняется команда OR с ненулевым агрументом - после ее исполнения в аккумуляторе окажется ненулевое число; кроме того, будет сброшен флаг Z. Если же вызвать entry+1 - то аргумент двухбайтовой команды OR исполнится как команда - в данном случае AF = XOR A. То есть в аккумулятор будет загружен нуль, и установится флаг Z.Код:entry: or 0AFh ;do something ret use_entry_1: call entry ;... use_entry_2: call entry+1 ;...
И подобных мест в Altair BASIC много. Там часто используются трехбайтовые команды вида LD BC, nnnn, для пропуска последующих двух байт кода, если значение регистра BC впоследствии неважно. Еще для пропуска двух байт используются команды условного перехода вида JP M, nnnn, если условие перехода заведомо не соблюдается.




Ответить с цитированием