User Tag List

Показано с 1 по 10 из 180

Тема: Почему компилированный Бейсик выполняется быстро?

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #33

    Регистрация
    08.05.2007
    Адрес
    Dnepropetrovsk
    Сообщений
    1,089
    Спасибо Благодарностей отдано 
    281
    Спасибо Благодарностей получено 
    70
    Поблагодарили
    49 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Спасибо. В общем, желающие могут пользоваться проектом. Конкретно здесь хочу выразить благодарность всем участникам обсуждения в этой ветке. Именно здесь подсказали про тесты Rugg/Feldman, и вообще было высказано много хороших идей, которые легли в этот проект.

    Куда двигать его дальше - пока думаю. Исходно в планах было довести функционал до Altair BASIC 8K (а там строковые переменные, LEFT$, RIGHT$, многомерные массивы, больше свободы с именами переменных и др.). Но комментированный дизассемблер 8К-бейсика найти не удалось. Можно было бы продизассемблировать Бейсик "Микрон" с РК-86, например. По структуре он должен во многом повторять оригинал (Altair 4K), там даже баги одни и те же, я проверял по ходу разработки.

    Так что, если у кого-нибудь есть желание помочь с дизассемблированием и попутно изучить один из самых компактных и мощных классических бейсиков эры 70-80х - буду благодарен!

    Кстати. В Altair BASIC используются ассемблерные трюки, которых я никогда не встречал в мире ZX Spectrum. Подучился у Билла Гейтса, что называется! Вот один пример.

    Допустим, есть 2 точки входа в процедуру, для одной из них регистр A должен быть равен 0, а для другой - не нулю. Билл Гейтс и Пол Аллен делают это так:

    Код:
    entry:   or   0AFh
                ;do something
                ret
    
    use_entry_1: call entry
                ;...
    use_entry_2: call entry+1
                ;...
    Что получается: при вызове точки entry исполняется команда OR с ненулевым агрументом - после ее исполнения в аккумуляторе окажется ненулевое число; кроме того, будет сброшен флаг Z. Если же вызвать entry+1 - то аргумент двухбайтовой команды OR исполнится как команда - в данном случае AF = XOR A. То есть в аккумулятор будет загружен нуль, и установится флаг Z.

    И подобных мест в Altair BASIC много. Там часто используются трехбайтовые команды вида LD BC, nnnn, для пропуска последующих двух байт кода, если значение регистра BC впоследствии неважно. Еще для пропуска двух байт используются команды условного перехода вида JP M, nnnn, если условие перехода заведомо не соблюдается.

    Этот пользователь поблагодарил Barmaley_m за это полезное сообщение:

    Conan(05.01.2024)

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 47
    Последнее: 02.02.2021, 14:06
  2. Как быстро летит время.
    от Mick в разделе Новости
    Ответов: 18
    Последнее: 25.02.2020, 08:43
  3. Почему Спектрум-бейсик такой медленный?
    от mmxdmv в разделе ZX Концепции
    Ответов: 53
    Последнее: 07.07.2018, 19:39
  4. Как быстро добраться до мыши?
    от TomCaT в разделе Для начинающих
    Ответов: 38
    Последнее: 02.03.2010, 11:00
  5. Быстро переместить 384b
    от Aprisobal в разделе Программирование
    Ответов: 6
    Последнее: 23.01.2005, 15:23

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •