Каллисто

Материал из ПМК вики
Перейти к навигации Перейти к поиску

Каллисто — компактный диалект языка Форт с элементами colorFORTH, написанный для «Электроники МК-161» на РЯМК и предназначенный для программирования «на борту». Пока существует в альфа-версии, но уже позволяет определять новые слова, редактировать и компилировать экраны, успешно переносить на МК-161 старые программы, написанные на языке Форт. Актуальная версия — 0.3.5a.

Вместо фортовского цикла DO…LOOP Каллисто использует более простой и быстрый цикл FORNEXT из colorFORTH, а «бесконечный» стек содержит 12-разрядные десятичные числа ЭКВМ с плавающей запятой. Помимо обычной (для Форта) целочисленной операций деления, Каллисто использует традиционное для ПМК деление с плавающей запятой. Сохранены традиционные для ПМК обозначения операций умножения, подъёма стека, а также русскоязычные операции ПМК — ЗН , СЧ и т.д. Предусмотрены команды РЕГ! и РЕГ@ для обращение к функциональным и другим регистрам ЭКВМ по их привычным номерам.

В Каллисто используется единое адресное пространство, при этом размер ячейки памяти зависит от адреса и может колебаться от 1 байта до 12-разрядного десятичного числа с плавающей запятой. Беззнаковые 16-битные целые считываются в стек с помощью слова U@. Первые 10000 ячеек памяти представляют из себя память программ, в которой находится исполняемый код Каллисто. Каждая из этих 10 тысячи ячеек содержит 1 байт, доступный только для чтения. Из-за невозможности исполнять код МК-161 из области данных при написании определяющих слов вместо конструкции CREATE…DOES> используется более древний, но не менее мощный механизм <BUILDSDOES>

Вводимые слова компилируются в словарь (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 чисел с десятичной плавающей запятой.
  • + — Сложение.
  • - — Вычитание 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
  • VARIABLE
  • VALUE
  • DOES>
  • F#> — Размещает преобразованную строку сразу после словаря, возвращает адрес и число символов.
  • F#S — Преобразовывает число с плавающей запятой в строку символов.
  • <F# — Начинает преобразования чисел с плавающей запятой.
  • 0
  • 1
  • 2
  • 3
  • $\pi$ — Число пи.
  • BL
  • 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
  • $EX — Десятичное значение порядка вводимого числа
  • ERB
  • SAVIN — Сохраняем >IN в INTERPRET для NUMBER
  • , — Компилирует число n в первую свободную ячейку словаря.
  • C, — Компилирует байт c в очередной свободный байт словаря.
  • Д, — Компилирует число x в первую свободную ячейку десятичного словаря.
  • LATEST
  • SPACE — Вывод одного пробела.
  • N>LINKNFA ---> LFA
  • NAME>NFA ---> CFA
  • N>BODYNFA ---> PFA
  • ?ERROR — диагностика ошибок Форт ИТЭФ
  • ?COMP
  • ?EXEC
  • ?PAIR
  • ?CSP — Выдать ошибку "сбился указатель стека" если он не равен значению в CSP
  • ?LOAD
  • COMPILE — Компиляция 16-битного слова, следующего за оператором.
  • SMUDGE — Изменить флаг "SMUDGE" в последней созданной статье.
  • (;CODE) — Записать в поле кода последней статьи следующий адрес и закончить определение.
  • <BUILDS
  • COUNT
  • (.") — Слово, компилируемое ."
  • ." — При исполнении напечатать на терминале следующие литеры до кавычки исключительно.
  • .( — Напечатать следующие литеры до закрывающей скобки исключительно.
  • QUERY — Осуществляет ввод строки символов с клавиатуры.
  • \0 — (Пустое слово) - закончить интерпретацию.
  • PAD — Выдаёт адрес буфера для промежуточного хранения последовательностей символов
  • WORD — Считывает одно слово из входного или экранного буфера и размещает его, начиная с адреса HERE
  • CONVERT
  • FINDN — Поиск слова в активных словарях
  • NUMBER — Преобразует в число последовательность символов, начиная с a+1 с учётом BASE,
  • FL
  • ERROR — Диагностика ошибок Форт ИТЭФ
  • ID. — Печатает имя слова, записанное в соответствии с требованиями словаря Форта
  • CREATE — Формирует слово с именем XXX (заголовок и CFA), оставляя его поле параметров пустым.
  • [COMPILE] — Скомпилировать следующее слово, независимо от его признака IMMEDIATE.
  • TO
  • LITERAL
  • FLITERAL — Тоже, что и LITERAL, но для плавучки.
  • ?STACK
  • 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

Ссылки