Тему формально можно было и в форум по программированию разместить, но для меня важнее ее применение к форт-процессорам, поэтому размещаю здесь в "Железе".
Чтобы стало понятно, откуда взлись мои "верхний форт" и "нижний форт". Рассмотрим простейший "эмулятор форт-процессора".
Попробую начать строить такой эмулятор с перечисления ресурсов процессора, которые надо эмулировать (на примере EQUINOX разумеется). Эмулятор строится, естественно на Форте.
1. счетчик программ - PC - просто регистр и пара методов для работы с ним
Код:
VALUE PC \ определение регистра как переменной
: ->PC TO PC ;
: PC++ 1 +TO PC ;
2. Регистр команд - CMD - просто регистр
Код:
VALUE CMD \ регистр-переменная
: NIBBLE-1 CMD 1000 / ; \ определение для доступа
\ к командному нибблу - старшему нибблу в 16-разрядном регистре
: NIBBLE-2 CMD 1000 / ; \ доступ ко второму нибблу
\ для префиксных команд
: next-NIBBLE CMD 10 * 0FFFF AND TO CMD ;
: next-NIBBLE2 CMD 100 * 0FFFF AND TO CMD ;
(чтобы не было недомолвок - все числа 16-ричные)
3. Стек данных - DST - массив регистров
Код:
8 CONSTANT DST-WIDTH \ константа, определяющая глубину стека
\ кому захочется больше - придется переписывать эмулятор заново
CREATE DST DST-WIDTH CELLS ALLOT \ определяем массив
VALUE DST-SP \ Stack-Pointer для стека данных
: DST-PUSH \ data --> число со стека инструментального Форта
\ записывается в стек эмулируемого процессора
\ реализацию не пишу потому что это пока еще болванка
;
: DST-POP \ data --> число со стека эмулируемого процессора
\ записывается в стек инструментального Форта
\ реализацию не пишу потому что это пока еще болванка
;
4. Стек возвратов - RST - все то же самое, что для DST, но приставка DST в определениях заменяется на RST
5. Арифметическо-логическое устройство - ALU - ALU не содержит регистрров, поэтому для него не определяются переменные, а только функции:
Код:
: ALU-DUP \ data1,data2 --> rezult
\ выбор действия по второму нибблу команды
NIBBLE-2 CASE
\ только болваню
END-CASE
;
: ALU-SWAP \ data1,data2 --> rezult1,rezult2
\ выбор действия по второму нибблу команды
NIBBLE-2 CASE
\ опять только болваню
END-CASE
;
: ALU-DROP \ data1,data2 --> rezult1
\ выбор действия по второму нибблу команды
NIBBLE-2 CASE
\ опять только болваню
END-CASE
;
Теперь немного о том, как работает эмулируемый форт-процессор.
на VHDL все устроено просто. Есть набор регистров и есть большая логическая функция, которая получает на входе этот регистр и на выходе выдает его новое состояние, которое и записывается в регистр по перепаду тактового уровня на входе.
Чтобы сэмулировать такое поведение придется завести два набора ресурсов процессора. Из одного данные брать, в другой писать, а по "такотовому перепаду" второй копировать в первый, получая таким образом "копию" поведения железного форт-процессора.
Код:
4 DST-WIDTH RST-WIDTH + + CONSTANT SET-WIDTH
CREATE CPU-SET1 \ определяю первый набор ресурсов
SET-WIDTH CELLS \ ALLOT
CREATE CPU-SET2 \ определяю второй набор ресурсов
SET-WIDTH CELLS \ ALLOT
: SET.PC \ cpu-set --> PC
@ ;
: SET.CMD \ cpu-set --> PC
1+ @ ;
: SET.DST.SP \ cpu-set --> DST.SP
2 + @
: SET.RST.SP \ cpu-set --> RST.SP
3 + @
: SET.DST 4 + \ ;
: SET.RST [ 4 DST-WIDTH + ] LITERAL + \ ;
Можно, конечно, придумать систему со структурами данных, но пока нет необходимости повторять этот код для десятков разных процессоров, нет нужны и в структурах. Поэтому аккуратно выписываем все действия вручную. И сверяемся только с VHDL кодом работающего процессора.
Когда все записано, остается лишь написать:
Код:
: MAIN-CLK-FRONT
SET1 CPU-KERNEL -> SET2
SET2 -> SET1 ;
: GO BEGIN MAIN-CLK-FRONT AGAIN ;
Чтобы эмулятор не просто месил данные внутри SET1 и SET2, надо писать эмуляцию внешней памяти, и внешних устройств.
А для того, чтобы эмулируемый процессор еще и что-то делал, потребуется целевой компилятор и метод для загрузки скомпилированной программы в эмулируемую внешнюю память эмулируемого процессора.
Короче, масло-масляное, в котором без двухлитровки кока-колы не разобраться. Но для того я и завел эту тему, чтобы разобраться.
п.с. В конце маленький вопросик любителям больших стеков: Какой глубины стека достаточно, чтобы запустить вот такой эмулятор на Форте?
(ожидаемый ответ - пять-сэм, но не двадцать сэм же!)