Простой процессор - первая VM машина для τ-lang

Posted on August 6, 2019

Процессор не стековый, есть память, 128к, адресация через регистры и собственно сами регисты. Память 16 разрядная, то есть каждый адрес указывает на границу 16-битного слова.

Порт ввода/вывода - 1, 16-ти разрядный, в случае если в нем появляются данные(извне) - возникает прерывание(исключение)

регистров 16, 16 разрядные

  • FX - регистр флагов
    • ZF
    • CF
    • EF(разрешает/запрещает обработку исключений)
    • FF - выставлен в 1 при старте, нужен для того что бы безусловно выполнять команды. сброс флага приведет к тому что все команды, выполнение которых зависит от этого флага выполняться не будут
  • EX - регистр обработки исключения. Содержит адрес по которому будет осуществлен переход при внешнем событии
  • DX - адрес следующей команды. Запись значения в этот регистр равносильна команде goto
  • 0X-CX - общего назначения (13 регистров)

команды:

ld reg1, reg2 - загружает в reg1 значение (2 байта) расположенное по адресу указанному в reg2 save reg1 reg2 сохраняет в память значение reg1 по адресу хранящемуся в reg2 cp reg1 reg2 - копирует значение reg1 в reg2

let reg value записывает в reg значение value (задается прямо в коде)

add reg1 reg2 складывает два регистра, результат в reg1. Устанавливает флаги ZF CF sub reg1 reg2 вычитает reg2 из reg1. Устанавливает ZF CF флаги регистра FX

and reg1 reg2 логическое побитовое AND результат в reg1 Устанавливает ZF or reg1 reg2 логическое побитовое OR результат в reg1 Устанавливает ZF xor reg1 reg2 логическое побитовое XOR результат в reg1 Устанавливает ZF

test bit reg - устанавливает ZF в значение равное биту bit (4 бита адресация) в регистре reg

rl offset reg - сдвигает биты регистра на offset влево старшие биты помещаются в младшие rr offset reg - сдвигает биты регистра на offset вправо младшие биты помещаются в старшие

if flag op - условный префикс. Команда op выполняется если flag (4 бита адресация) регистра FX установлен в 1

in reg - читает значение из порта в регистр out reg - пишет значение регистра в порт

стека нет, его легко сэмулировать

условный префикс код команды reg1/bit/offset reg2 доп. операнд(16 бит)
x x x x x x x x x x x x x x x x
let reg 0 0 0 0 value
ld reg1 reg2
save reg1 reg2
cp reg1 reg2
- - - - -
add reg1 reg2
sub reg1 reg2
and reg1 reg2
or reg1 reg2
xor reg1 reg2
not reg 0 0 0 1
test bit reg
rl offset reg
rr offset reg
in reg 0 0 1 0
out reg 0 0 1 1

осталось пространство для 4-х 2-арных команд + 12-ти 1-арных команд

Ок, выглядит несложно. Реализация очевидна. Теперь надо понять как будет происходить процесс компиляции.