Каллисто
Каллисто — компактный диалект языка Форт с элементами colorFORTH, написанный для «Электроники МК-161» на РЯМК и предназначенный для программирования «на борту». Пока существует в альфа-версии, но уже позволяет определять новые слова, редактировать и компилировать экраны, успешно переносить на МК-161 старые программы, написанные на Форте. Актуальная версия — 0.3.5a.
Вместо фортовского цикла DO…LOOP Каллисто использует более простой и быстрый цикл FOR…NEXT из colorFORTH, а «бесконечный» стек содержит 12-разрядные десятичные числа ЭКВМ с плавающей запятой. Помимо обычной (для Форта) целочисленной операций деления, Каллисто использует традиционное для ПМК деление с плавающей запятой. Сохранены традиционные для ПМК обозначения операций умножения, подъёма стека, а также русскоязычные операции ПМК — ЗН , СЧ и т.д. Предусмотрены команды РЕГ! и РЕГ@ для обращение к функциональным и другим регистрам ЭКВМ по их привычным номерам.
В Каллисто используется единое адресное пространство, при этом размер ячейки памяти зависит от адреса и может колебаться от 1 байта до 12-разрядного десятичного числа с плавающей запятой. Беззнаковые 16-битные целые считываются в стек из двух последовательных ячеек (байт) памяти с помощью слова U@. Как принято в ЭКВМ, старший байт идёт по младшему адресу. Первые 10000 ячеек памяти представляют из себя память программ, в которой находится исполняемый код Каллисто. Каждая из этих 10 тысячи ячеек содержит 1 байт, доступный только для чтения. Из-за невозможности исполнять код МК-161 из области данных при написании определяющих слов вместо конструкции CREATE…DOES> используется более древний, но не менее мощный механизм <BUILDS … DOES>
После нажатия клавиши ВВОД введённые слова либо исполняются сразу, либо компилируются в словарь (dictionary), находящийся в области двоичных данных. В этой же области располагается стек возвратов. «Бесконечный» стек данных располагается в области десятичных регистров. Там же располагается «десятичный словарь», где хранятся удобные десятичные переменные типа VALUE
Помимо ввода с клавиатуры, исходный текст на языке Каллисто может располагаться на электронном диске в виде экрана, в пронумерованном блоке (текстовом файле).
В отличии от ранних диалектов Форта экран Каллисто содержит 48 строк, занимает 3 Кб и при интерпретации считывается из буфера в области текста. Из-за того, что строка экрана занимает традиционные 64 символа, использование встроенного в ЭКВМ редактора является затруднительным. Программистам Каллисто предлагает строковый редактор EDIT, а также возможность написать собственный редактор экранов. Каллисто использует накладную алфавитно-цифровую клавиатуру для быстрого посимвольного ввода команд и данных.
При разработке Каллисто учитывались черновики готовящегося стандарта Forth 200x — например, с помощью стандартных префиксов Форта для каждого числа можно индивидуально задавать систему счисления. Также в Каллисто можно обнаружить наследие Форта ИТЭФ, от реализации которого отталкивались первые версии Каллисто. Несмотря на явное влияние стандартов языка Форт, при разработке Каллисто приоритет отдавался удобству и скорости работы на ЭКВМ — вообще говоря, не предназначенной разработчиками для алгоритмических языков высокого уровня.
Словарь Каллисто
- COLD — Первая словарная статья
- WARM
- BYE — Выход из системы может использоваться как временный, отладочный останов.
- VERSION — Кладёт в стек номер версии Каллисто.
- EXECUTE — Исполняет слово, CFA которого хранится в стеке.
- ?BREAK — Проверяем клавиатуру на паузу и аварийную остановку.
- (LITERAL) — Код периода выполнения для литерала.
- TYPE — Передаёт u символов начиная с адреса a на выходное устройство.
- TYPE1 — Вывести строку из памяти данных, заменяя управляющие коды и строго в одну строчку, до конца индикатора.
- ?BRANCH — Условный переход в шитом коде.
- BRANCH — Безусловный переход в шитом коде.
- (FOR)
- (NEXT)
- (FIND) — Искать слово a1 в списке a2. При успехе дать NFA его статьи и c - байт длины с флагами.
- DIGIT — ASCII-DIGIT BASE => DIGIT-VALUE TRUE / FALSE
- РЕГ! — Запись в регистр ЭКВМ Rn при стеке ЭКВМ, заполненном на основе стека Форта.
- РЕГ@ — Чтение из регистра ЭКВМ Rn с сохранением стека ЭКВМ в переменных RX RY RZ RT
- 0=
- 0>
- 0<
- =
- <
- >
- ENCL
- EMI
- EMIT — Отображает на индикаторе символ, код которого находится в стеке.
- C. — Выводит символ как в дампе, управляющие символы заменяются на "."
- ↵
- BELL
- BEEP
- (PLAY)
- PLOT — Отображение точки на индикаторе
- DRAW — Рисует прямые линии, X и Y - координаты конца линии; L - код цвета/яркости, как и в случае PLOT
- ГРФ — Вывод графической информации.
- ↖ — Очищаем индикатор, оба курсора в левый верхний угол
- AT-XY — Позиционирование курсора: COL ROW AT-XY
- DISKOFF
- KEY — Ожидает ввод символа с клавиатуры, при вводе посылает его код в стек.
- ACCEPT
- 1+ — Прибавление 1.
- 2+ — Прибавление 2.
- 1- — Вычитание 1.
- 2× — Умножение на 2 (двоичный сдвиг влево).
- 2/ — Целочисленное деление на 2 (двоичный сдвиг вправо).
- 2÷ — Деление на 2 чисел с десятичной плавающей запятой.
- + — Сложение.
- - — Вычитание b из a.
- × — Умножение.
- ÷ — Деление с десятичной плавающей запятой.
- / — Целочисленное деление a на b, помещение частного в стек.
- MOD — Получение остатка от деления a на b.
- /MOD — Деление с остатком a на b.
- ×/ — Операция масштабирования -- умножение n1 на n2 с последующим делением на n3.
- ×/MOD — Остаток и частное от деления произведения n1*n2 на n3.
- NEGATE — Смена знака числа в стеке.
- ><
- S>D
- |X| — Получение абсолютного значения.
- AND — 32-битное побитовое логическое умножение (И).
- OR — 32-битное побитовое логическое сложение (ИЛИ).
- XOR — 32-битное побитовое логическое исключающее ИЛИ (XOR).
- INVERT — 32-битное побитовое логическое отрицание (НЕ).
- MIN — Выделение минимума.
- MAX — Выделение максимума.
- 10x — Десятичный антилогарифм.
- Ex — Экспонента.
- LG — Десятичный логарифм.
- LN — Натуральный логарифм.
- X2 — Возведение в квадрат.
- √ — Квадратный корень.
- 1/X — Обратная величина.
- Yx — Степенная функция.
- СЧ — Случайное число.
- ЗН — Знак числа.
- [X] — Целая часть числа.
- {X} — Дробная часть числа.
- DEGREES — Даёт указание Форту (и ЭКВМ) принимать углы в градусах
- RADIANS — Даёт указание Форту (и ЭКВМ) принимать углы в радианах
- ARCSIN
- ARCCOS
- ARCTG
- SIN — Синус.
- COS — Косинус.
- TG — Тангенс.
- SP@ — Записывает в стек адрес вершины стека, до исполнения команды SP@
- !SP — Устанавливает указатель стека в исходное состояние из переменной S0.
- RP@ — Адрес текущей вершины стека возвратов.
- !RP — Присваивает указателю стека возвратов исходное (базовое) значение из переменной R0.
- EXIT — Закончить исполнение текущего определения.
- LEAVE — Досрочно прерывает цикл FOR .. NEXT (только для области данных)
- UNLOOP
- >R — Переносит 16-битное число из стека данных в стек возвратов.
- R> — Переносит 16-битное число из стека возвратов в стек данных.
- I — Копирует верхнее 16-битное число из стека возвратов в стек данных.
- LEV
- PICK — Копирует элемент стека с номером u и записывает его наверх стека.
- OVER — Копирует 2-й элемент стека и заносит его наверх.
- ↔ — Меняет местами два верхних элемента стека.
- 2SWAP — Меняет местами верхние две пары чисел в стеке.
- ↑ — Дублирует верхний элемент стека.
- ?DUP — Осуществляет операцию ↑ если x<>0
- 2DUP — Дублирует верхнюю пару чисел в стеке.
- ROT — Переносит 3-й элемент стека наверх.
- 2DROP — Удаляет из стека число двойной длины.
- DROP — Удаляет верхний элемент стека.
- CMOVE — Копирует побайтно область памяти размером u байт начиная с a1 и записывает её начиная с a2.
- CMOVE>
- FILL — Записывает u байт c в память начиная с адреса a
- ERASE — Записывает u нулевых байтов в память начиная с адреса a.
- BLANK — Записывает n кодов пробела (32) в память, начиная с адреса a.
- HOLD — Вводит в текущую ячейку выходного буфера PAD символ, код которого в стеке
- TIB — Занесение в стек начального адреса входного буфера терминала (Terminal Input Buffer).
- +! — Добавляет к содержимому ячейки с адресом a число n
- TOGGLE
- @ — Замещает адрес в стеке его содержимым, двухбайтовая ячейка содержит число со знаком.
- U@ — Считываем в стек 2-х байтовое целое без знака.
- C@ — Извлекает байт информации из ячейки, адрес которой находится в стеке.
- ! — Записывает число x в ячейку с адресом a.
- C! — Записывает байт c по адресу a.
- BODY> — PFA ---> CFA
- !CSP — Запомнить адрес вершины стека в CSP.
- HERE — Выдаёт адрес первой свободной ячейки в словаре.
- ALLOT — Добавляет n байт к полю параметров слова, описанного последним.
- ДHERE — Выдаёт адрес первого свободного десятичного регистра в десятичном словаре.
- ДALLOT — Резервирует n десятичных регистров в десятичном словаре.
- [ — Переключить текстовый интерпретатор в режим исполнения
- ] — Переключить текстовый интерпретатор в режим компиляции.
- HEX — Устанавливает шестнадцатеричную систему счисления для ввода-вывода.
- DECIMAL — Устанавливает десятичную систему счисления для ввода-вывода.
- -TRAILING — Отсечь конечные пробелы.
- UPPER
- DEFINITIONS — Контекстный словарь VOCABULARY становится текущим, все последующие описания связаны с этим словарём.
- UPDATE — Устанавливает в буфере флаг "спасения".
- X — Даёт номер загруженного блока.
- : — Начать определение слова через двоеточие.
- ; — Закончить определение через двоеточие.
- CONSTANT — Определить следующее слово как константу со значением W.
- VARIABLE — Определить следующее слово как переменную с начальным значением нуль.
- VALUE — Определить следующее слово как десятичную переменную типа VALUE.
- DOES> — Начало «исполнения» в определяющем слове.
- F#> — Размещает преобразованную строку сразу после словаря, возвращает адрес и число символов.
- F#S — Преобразовывает число с плавающей запятой в строку символов.
- <F# — Начинает преобразования чисел с плавающей запятой.
- 0 — Константа нуль (значение «ложь»).
- 1 — Константа один.
- 2 — Константа два.
- 3 — Константа три.
- $\pi$ — Число пи.
- BL — Константа, код пробела (32).
- C/L — Количество символов в одной строке экрана Форта.
- B/BUF — Константа, число байт в блочном буфере.
- RT
- RZ
- RY
- RX
- S0 — Переменная, содержит адрес дна стека данных.
- R0 — Переменная, адрес дна стека возвратов.
- ДDP — Указатель десятичного словаря.
- WIDTH
- WARNING
- FENCE — Служит для защиты базового словаря от стирания с помощью оператора FORGET
- DP
- VOCL
- AUTOEXEC — Слово, xt которого хранится в переменной AUTOEXEC, будет выполнено после загрузки сохранения по LOAD"
- GRXY — Графический курсор
- BLK — Переменная, номер входного блока-экрана.
- >IN — Переменная, смещение очередной литеры во входном текстовом буфере или экране.
- SCR — Служит для хранения текущего значения номера редактируемого экрана.
- OFFSET — Переменная, содержащая смещение, добавляемое к номеру блоку на стеке словом BLOCK для получения физического номера блока.
- CONTEXT — Переменная указывает на словарь VOCABULARY, в котором происходит поиск слов во время интерпретации входного потока.
- CURRENT — Переменная указывает словарь VOCABULARY, в который вводятся определения новых слов.
- STATE — Переменная с состоянием текстового интерпретатора: «Истина» — компиляция.
- BASE — Переменная, текущее основание системы счисления при вводе-выводе чисел.
- DPL — Переменная, позиция последней запятой в последнем введённом числе от конца.
- CSP — Переменная для контрольного хранения значения указателя стека.
- R# — Позиция курсора при редактировании экрана.
- HLD — Переменная — позиция последней литеры, перенесённой в буфер PAD по HOLD.
- $EX — Десятичное значение порядка вводимого числа
- ERB
- SAVIN — Сохраняем >IN в INTERPRET для NUMBER
- , — Компилирует число n в первую свободную ячейку словаря.
- C, — Компилирует байт c в очередной свободный байт словаря.
- Д, — Компилирует число x в первую свободную ячейку десятичного словаря.
- LATEST — Дать NFA последней созданной статьи.
- SPACE — Вывод одного пробела.
- N>LINK — NFA ---> LFA
- NAME> — NFA ---> CFA
- N>BODY — NFA ---> PFA
- ?ERROR — диагностика ошибок Форт ИТЭФ
- ?COMP — проверить, что текущий режим — компиляция.
- ?EXEC
- ?PAIR
- ?CSP — Выдать ошибку "сбился указатель стека" если он не равен значению в CSP
- ?LOAD
- COMPILE — Компиляция 16-битного слова, следующего за оператором.
- SMUDGE — Изменить флаг "SMUDGE" в последней созданной статье.
- (;CODE) — Записать в поле кода последней статьи следующий адрес и закончить определение.
- <BUILDS
- COUNT — Дать адрес первой литеры и число литер N строки со счётчиком T.
- (.") — Слово, компилируемое ."
- ." — При исполнении напечатать на терминале следующие литеры до кавычки исключительно.
- .( — Напечатать следующие литеры до закрывающей скобки исключительно.
- QUERY — Осуществляет ввод строки символов с клавиатуры.
- \0 — (Пустое слово) - закончить интерпретацию.
- PAD — Выдаёт адрес буфера для промежуточного хранения последовательностей символов
- WORD — Считывает одно слово из входного или экранного буфера и размещает его, начиная с адреса HERE
- CONVERT
- FINDN — Поиск слова в активных словарях
- NUMBER — Преобразует в число последовательность символов, начиная с a+1 с учётом BASE,
- FL
- ERROR — Диагностика ошибок Форт ИТЭФ
- ID. — Печатает имя слова, записанное в соответствии с требованиями словаря Форта
- CREATE — Формирует слово с именем XXX (заголовок и CFA), оставляя его поле параметров пустым.
- [COMPILE] — Скомпилировать следующее слово, независимо от его признака IMMEDIATE.
- TO — Запись в переменную типа VALUE.
- LITERAL
- FLITERAL — Тоже, что и LITERAL, но для плавучки.
- ?STACK — Выдать ошибку «Исчерпание стека», если он менее, чем пуст и «Исчерпание памяти» при зазоре, меньшем 10(?) байт.
- INTERPRET — Интерпретирует последовательность слов, пока там что-то есть.
- IMMEDIATE — Преобразует слово, за описанием которого следует, в оператор, исполняемый при компиляции.
- VOCABULARY — Слово-описатель, которое создаёт новый словарь.
- ( — Комментарий -- пропустить следующий текст до закрывающей круглой скобки.
- QUIT — Очищает стек возвратов, устанавливает режим исполнения и возвращает управление терминалу.
- ABORT — Прерывает исполнение, делает словарь FORTH контекстным, исполняет QUIT
- EMPTY-BUFFERS — Буфер отмечается как пустой, независимо от содержания. Обновлённый блок на диск не записывается.
- SAVE-BUFFERS — Если находящийся в буфере экран был изменён, скидывает его на диск.
- FLUSH — Если экран изменён, скидывает его на диск и выкидывает его из памяти.
- BUFFER — Резервирует блок в памяти и приписывает ему номер u (как и BLOCK ), но сам блок с диска не считывается.
- BLOCK — Записывает в стек адрес первого байта в буфере с блоком, номером которого u.
- (LINE) — Выдаёт адрес a и длину u строки L с экрана S.
- MESSAGE
- LOAD — Загружает экран с номером u (компилирует или исполняет)
- \ — Закончить интерпретацию строки.
- \S — Закончить интерпретацию экрана.
- --> — Даёт команду немедленно приступить к интерпретации следующего по порядку экрана.
- 'N — Ищет слово с именем XXX (из входного или экранного буфера) в словаре Форта.
- ['] — Скомпилировать CFA следующего слова как числовой литерал.
- >MARK — Отметить текущий адрес для ссылки вперёд.
- >RESOLVE — Разрешить ссылку вперёд в адресе a.
- <MARK — Отметить текущий адрес для ссылки назад.
- <RESOLVE — Разрешить ссылку назад в адрес a.
- UNTIL — Конец цикла "BEGIN UNTIL".
- AGAIN — Конец бесконечного цикла "BEGIN AGAIN".
- BEGIN — Начало циклов "BEGIN".
- THEN — Конец ветвления "IF".
- ELSE — Начало 2-ой ветви ветвления "IF".
- IF — Начало ветвления "IF".
- WHILE — Ветвление "WHILE" в цикле "BEGIN WHILE REPEAT".
- REPEAT — Конец цикла "BEGIN WHILE REPEAT".
- FOR — Начало цикла со счётчиком. Цикл исполнится ровно n раз.
- NEXT — Конец цикла со счётчиком.
- SPACES — Вывод заданного числа "цифровых" (шириной в цифру) пробелов на индикатор.
- I#> — Завершает преобразование целого числа
- SIGN — Вводит знак "минус" в выходной буфер PAD, если n<0
- I# — Преобразует одну цифру целого числа и записывает её в выходной буфер PAD
- I#S — Преобразует целое число до тех пор, пока не будет получен 0
- <I# — Начинает процесс преобразования целого числа в последовательность кодов символов.
- (.) — Как I. -- только не выводит число на индикатор, а возвращает нам адрес и длину строки.
- I. — Вывод целого числа, за которым следует один пробел.
- . — Вывод числа, за которым следует один пробел.
- I.R — Напечатать n на терминале в поле длиной p справа.
- LIST — Распечатывает экран с номером u и записывает его номер в переменную SCR
- INDEX — Выводит на экран верхние строчки экранов, номера блоков которых входят в диапазон от нач до кон.
- WORDS — Просмотр полного списка операторов, хранящихся в данный момент в словаре
- COPY — Копирует экран n на экран m
- DEPTH — Выдаёт в стек полное количество чисел, хранившихся в стеке до исполнения этой команды.
- DUMP — Отображает u байт памяти начиная с адреса a
- .S — Распечатка всего содержимого стека, оставляющая стек без изменений.
- КАТ — Поиск каталога Форта и переход в него. Если каталога нет, он создаётся.
- SAVE-TEXT — Сохранить область текста в энергонезависимую память.
- RGRW — Чтение/запись файла регистров (словаря) в загруженном каталоге.
- LORW — Чтение/запись блока из файла в загруженном каталоге.
- R/W
- SAVE" — Сохранить в файлы словарь Форта и десятичный словарь.
- LOAD" — Считать из файла словарь Форта и десятичный словарь.
- ;CODE
- FORTH — Делает словарь FORTH контекстным.
- TASK — Последнее стандартное слово в словаре.
Ссылки
- Обсуждение Каллисто в Контакте, в живом журнале и на сайте Арбинады
- Каллисто v0.3.5a, последняя актуальная версия Каллисто
- Языки Форт и colorFORTH в Википедии
- Каллисто в Википедии — спутник Юпитера, в честь которого назван язык Каллисто