Хм... а время еще детское, можно и еще пописать...
С учетом того, что начал в 20.00, можно примерно проследить, сколько надо времени на написание подобного процессора.

Итак, продолжаю.

Очевидно (не для всех, но для меня), что 16 команд для процессора мало, поэтому в декодер команд надо сразу же заложить возможность префиксов, и это в данной схеме делается очень просто:

[code]CASE CMD[3..0] IS
    WHEN 0 => -- команда 0
        RCMD[] = DI[];
    WHEN 1 => -- команда 1
        RCMD[] = (B"0000",RCMD[WIDTH-1..4]);
    WHEN 2 => -- команда 2
        RCMD[] = (B"0000",RCMD[WIDTH-1..4]);
    WHEN 3 => -- команда 3
        RCMD[] = (B"0000",RCMD[WIDTH-1..4]);
    WHEN 4 => -- команда 4
        RCMD[] = (B"0000",RCMD[WIDTH-1..4]);
    WHEN 5 => -- команда 5
        RCMD[] = (B"00000000",RCMD[WIDTH-5..4]);
    WHEN 6 => -- команда 6
        RCMD[] = (B"00000000",RCMD[WIDTH-5..4]);
    WHEN 7 => -- команда 7
        RCMD[] = (B"00000000",RCMD[WIDTH-5..4]);
    WHEN 8,9,10,11,12,13,14,15 => остальные команды
        RCMD[] = (B"0000",RCMD[WIDTH-1..4]);
END CASE; 
PREF[] = RCMD[7..4];
[/code]

для команд с префиксами я выбрал три кода - 5,6 и 7. Как видно, регистр команд в момент исполнения этих команд сдвигается не на 4, а на 8 бит и, таким образом из очереди исключаются четыре бита, используемых префиксами, как код префиксной команды.
Время исполнения команды с префиксом - ровно один такт, и единственное неудобство в том, что такая команда не должна быть последней в слове, иначе, префикс будет исполняться с командой 0. Впрочем это можно и использовать (иногда, если повезет).
Увеличение же длины команды - ничто против увеличения длины программы, из-за извращений которые придется делать при сокращенном наборе команд для получения нужных действий.
Для того, чтобы определиться с типами префиксов я использую предыдущую наработку (версию 6, где все было так же, но команды с префиксами не структурированы).
Итак префиксы имеют следующие типы:
 PREFIX типа 5 - DROP - команды с уменьшением использования стека данных
  в этот тип попадают все двухоперандные арифметико-логические команды, 
  а так же, с этим префиксом могут быть закодированы специальные команды загрузки спец-регистров или вывода в порты.
 PREFIX типа 6 - SWAP - команды с неизменением использования стека данных
  этот префикс для команд с одним опрандом
 PREFIX типа 7 - DUP - команды с увеличением использования стека данных
  префикс команд загрузки специальных операндов, а так же может быть использован для ввода данных из спец-портов

DROP 0, SWAP 0, DUP 0 исполняют соответствующие команды Форта, и исключительный случай с попаданием префикса на конец командного слова получает дополнительный шанс на использование.
Для команд с префиксами используются дополнительные схемы ALU5, ALU6, ALU7, которые вводятся в исходный код как инклюды:

[code]include "alu_5.inc":
include "alu_6.inc":
include "alu_7.inc":[/code]

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

