STABLE an extreme small an fast FORTH-VMarithmetic
+ ( a b--a+b) addition
- ( a b--a-b) subtraction
* ( a b--a*b) multiply
/ ( a b--a/b) division
% ( a b--a%b) modulo (division reminder)
_ ( n-- -n) negate
bit manipulation
& ( a b--a&b) 32 bits and
| ( a b--a|b) 32 bits or
~ ( n -- n') not, all bits inversed (0=>1 1=>0)
stack
# ( a--a a) duplicate top of stack
\ ( a b--a) drop top of stack
$ ( a b--b a) swap top of stack
@ ( a b--a b a) (over) copy next of stack on top
register
x ( --) select register x (x: a..z)
; ( --value) fetch from selected register
: ( value--) store into selected register
? ( --value) selected register contains an address. Fetch value from there
! ( value--) selected register contains an address. Store value there.
+ ( --) immediately after register, increment content by 1
- ( --) immediately after register, decrement content by 1
functions
{X ( --) start function definition for function X (A..Z)
} ( --) end of function definition
X ( --) call function X (A..Z)
I/O
. ( value--) display value as decimal number on stdout
, ( value--) send value to terminal, 27 is ESC, 10 is newline, etc.
^ ( --key) read key from terminal, don't wait for newline.
" ( --) read string until next " put it on stdout
0..9 ( --value) scan decimal number until non digit. to push two values
on stack separete those by space (4711 3333)
to enter negative numbers call _ (negate) after the number
0..9.0 ( --value) to enter float numbers digits must contain one . (only
available if float module is active, see 0`)
conditions
< ( a b--f) true (-1) if b is < a, false (0) otherwise
> ( a b--f) true (-1) if b is > a, false (0) otherwise
= ( a b--f) true (-1) if a is queal to b, flase (0) otherwise
( ( f--) if f is true, execute content until ), if false
skip code until )
[ ( f--f) begin while loop only if f is true. keep flag on stack
if f is false, skip code until ]
] ( f--) repeat the loop if f is true. If f is false, continue
with code after ]
extensions (expermiental)
` ( n--) call extension function n
0 ... switch to floating point mode
+ - * / . _ < >
1 ... switch back to interger mode
2 ... dbg, function dbg() to set breakpoint for debugging
3 ... switch traceing on (IP, TOKEN, SP, STACK) (not in stable_fast)
4 ... switch traceing off. Tracing int file trace
5 ... < = > without dropping their 2nd operand (NOS). This
is the behavior of Santors original virtual engine.
6 ... mstime, time in milliseconds, for timing
7 ... ( n--) edit block number n
8 ... ( n--) load block number n. Data segment remains. So this
is a kind of shared memory. Registers could be used as arguments.
After leaving the application and 0 is on TOS, STABLE will be
terminated. A value not equal 0 on TOS will load this block.
If the block is not valid, the command block will be loaded
Use block 0 as an index for all your block numbers
9 ... ( n 9--) copy block n (1000 cells) into memory begining of 1000.
write back the old content before. At exit write back current
data block. STABLE is starting with block 0 loaded.
10 ... trace only current state (ip, rp, sp, ..) on stdout
11 ... quit VM ( n--) n is exit code to os
12 ... ( --n) push current data block number on stack
13 ... ( --) copy 1000 cells from address 1000 to 2000
14 ... ( --) copy 1000 cells from address 2000 to 1000
P.S.
. Вопросы автора проектаПохожий по некоторым идеям топик
uf \ micro forth \Добавлено спустя 35 минут 50 секунд:До сих пор на рынке нет "массовки" MISC контроллеров/процессоров.
После распада CCCP в Минском Интеграле осталась линейка Дофин процессоров (K1881BE1T (IN16C) - последний? в линейке), а в России есть и свой сделанный "процессор" в "MISC" исполнении TF-16 (К1894 номенклатура 5-я приёмка)
Дизайн-центр «Проектирование интегральных микроэлектронных систем» в МИЭТ (ДЦ ПМС) с презентацией разработокВозможно в "нашем" космосе, к примеру, используют RTX2010
по получаемым результатам к затратам MISC вполне годная архитектура.
MISC против RISC против CISCPhilip J. Koopman, Jr. "Стековые компьютеры, новая волна" (1989)MuP21 MISC (компьютер с минимальным набором команд, Minimal Instruction Set Computer) — архитектура для проектирования процессора, которая отличается наилучшей эффективностью и простотой в сравнении с CISC и RISC. Может содержать в себе блок RISC, обрабатывающий в себе от 10 базовых команд (+, —, /, *, if, else & etc), из которых формируются более сложные операции над значениями, методом ветвления полученных результатов в ПЗУ. С точки зрения быстродействия, время выполнения инструкции, скорость записи и передачи данных в память, сократилось бы в разы, так как не нужно было бы ожидать, пока заполнится и очистится конвейер, а выполнять всё «потоково» без задержек.
Причиной, по которой данная архитектура не стала популярной в компьютерных технологиях – сложность написания программ под различные процессоры. Ведь все нюансы по подбору методов вычисления и оптимизаций возлагались на плечи программистов. К тому же, с повышением сложности выполняемых задач, требовалось более сложное ПО, что тормозило бы развитие микропроцессорного рынка. Поэтому, было разумнее переложить и стандартизировать процессы выполнения стандартных формул (инструкций) на плечи процессорных специализированных блоков и написать программу «дирижёр», которая управляла бы этими процессами (как в CISC).
Тем не менее, если встроить в данные процессоры более совершенный блок инструкций, который декодировал бы их на аппаратном уровне, то равных по производительности энергоэффективности и простоте, данному процессору практически не нашлось бы.
Первая вариация данного процессора под названием MuP21 (1995г)
, имеет вычислительную способность 100 MIPS, при техпроцессе 1.2 мкм (!), энергопотребление 50 мВт. Работа процессорa на 100 мГц и количество транзисторов равно 7000 штук (!).
Впечатляет. У Pentium 1 (60 МГц) с 3.1 млн. транзисторов, 0,8 мкм и до 15 ватт энергопотреблением, вычислительные возможности были примерно на том же уровне.
144-ядерный процессор Чарльза Мура поступил в продажу по $20Лекция Чарльза Мура, создателя Forth: 144-ядерный процессор, зачем? Сложно ли запрограммировать 144 вычислительных ядра?GA144: русские спецификации процессоровMISC легко имплантируется в FPGA решения.
Добавлено спустя 7 минут 42 секунды:Прагматичные процессоры (статья от 2001г)
...
В отличие и от самых эффективных эмуляторов Java-машины, и от лучших JIT-компиляторов
(осуществляющих трансляцию Java-кодов в коды целевой платформы в ходе загрузки
задачи), аппаратные стековые машины привлекательны не только (и не столько) очень
высокой производительностью, хотя их быстродействие впечатляет. Так, при потреблении
в 5 раз (!) меньшей мощности они уверенно — почти в 2 раза — обходят своих далеко
не самых медленных конкурентов из регистрового мира RISC: классическая стековая
машина "выдает" на тестах CM (CaffeineMark) 1900 единиц против 1000
единиц очень удачного процессора ARM7TDMI при тактовой частоте 100 MHz (для сравнения,
этот показатель соответствует уровню производительности процессора Intel Pentium
150 MHz или даже Pentium Pro 200 MHz — в зависимости от качества реализации виртуальной
машины Java). При этом следует учесть, что тесты CM комплексные, и полученная
оценка является интегрированной, включающей и интенсивные вычисления с плавающей
точкой, которые обычно производителями стековых машин аппаратно не поддерживаются!
Но все же главная привлекательность безадресных архитектур кроется в исключительно
высоких показателях скорости переключения между задачами/потоками в многозадачных/поточных
программных системах. Каноническим регистровым машинам в таких случаях надо сохранить
текущий контекст в стеке, размещающемся в некоторой области оперативной памяти.
Так как контекст современных процессоров достаточно объемен (обычно у них много
регистров), а операции записи во внешнюю память относительно медленны, то и время
переключения получается (в терминах процессора) очень продолжительным. Стековым
машинам такие операции не нужны — их контекст уже хранится в стеке, поэтому переключение
обычно осуществляется за один такт. Чтобы понять порядок величин, следует привести
такой пример: переключение между потоками даже в весьма неплохих ОС реального
времени, написанных на компилируемых языках и тщательно оптимизированных, отнимает
одну-две миллисекунды процессорного времени. Для процессора aJ-100 и программы,
написанной на Java, переключение между двумя потоками занимает строго 1 микросекунду.
Такая разница (на три порядка!) означает, что процессору легче "справляться"
со множеством разных задач, что исключительно важно уже не только для "настольных"
машин, но и для самых разнообразных персональных устройств.
..
P.S. В истории стековых процессоров (2000e года) был ptsc1000 (от Patriot Scintific)
так вот он участвовал в тестах от EMBC и показывал приличные результаты.
Х.З. почему его убрали с рынка и кто этому поспособствовал.
Тот же TF-16 (К1894 реализованный ещё на FPGA) сравнивался в тестах с 486DX в серии статей журнала "Компоненты и Технологии" в 2003-2004г (Стековые процессоры, или новое — это хорошо забытое новое)
т.е. стековые (MISC) процессоры почему то никак не представлены в нише МК, а теже Форт системы делаются и запускаются в рамках регистровой архитектуры.
У Atmel был 4-ёх битный стековый контроллер Marc4 (в автомобильном исполнении ), но его не развивали и не выводили особо на рынок возможно в угоду AVR.
Возможно XMOS (чем то близок MISC) более менее удачно зашёл на рынок некоторого индустриального применения.