За прошедшие пару месяцев я перешел на разработку в trunk ветку LLVM. Часть кода была переписана, другая часть изменена. Была добавлена генерация машинного кода, который сейчас можно увидеть в ассемблерных листингах, а в дальнейшем будет возможность получать бинарные файлы. В целом сейчас имеются пожалуй два основных вопроса, которые нужно решить:
  • Реализовать инструкции для работа с памятью (чтение/запись данных). Здесь основная проблема сейчас в том, что у Z80 есть много команд для чтения/записи данных, но сами опкоды имеют разный формат и при этом они еще используют лишь определенные регистры. Например команды чтения:
    Код:
    LD A,(BC/DE)
    LD r,(HL)
    LD r,(IX/IY+offset)
    LD A,(nn)
    LD HL,(nn)
    LD rp,(nn)
    Тут с точки зрения простоты реализации для LLVM лучше всего было бы иметь команды вида LD rp,(nn), т.е. где нет явно определенных операндов.

  • Как использовать альтернативный набор регистров и стоит ли это делать вообще.

В остальном уже сейчас можно получать рабочий код, правда на данный момент он будет местами громоздкий и не эффективный, но это уже дело оптимизации, которая будет следующим этапом.

Весь проект находится здесь: https://github.com/earl1k/llvm-z80