С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Не был, а это оно и есть. То есть два в одном.
Меня заинтересовал данный бейсик. Поскольку документации нет, пришлось дизассемблировать (люблю я это дело, всякие там бейсики/форты дизассемблировать).
Странное оно. С виду, в коде довольно много оригинальных идей, но некоторые части написаны откровенно плохо. Например умножение/деление сделано итеративным сложением/вычитанием.
В паре мест тоже есть вопросы, походу файл немного битый. Полагаю, работает не всё.
Написал свою документацию на SBASIC - MICROPOSOL 04.91:
Скрытый текст
Список операторов командной строки (не могут встречатся в тексте программы или быть скомпилированы):
MAIN ARRAY MONITOR ASSEMBLER BASIC CSAVE CLOAD LIST CONT NEW RUN RENUM REGION SLOAD SSAVE AUTO ASAVE ALOAD VARIABLE
Список операторов бейсика:
COPY DPOKE NEXT LET IF GOTO GOSUB RETURN REM READ RESTORE FOR INPUT PRINT POKE STOP END CALL OUT DATA DEF EI DI INTERRUPT EXIT RST ON ORG
Список функций бейсика:
SGN INP RND ABS SIZE PEEK DPEEK RLC RRC
Операторы бейсика:
+ - * / >= <> > = <= < ^ ! & %
Директивы ассемблера:
ORG END SET DS DB DW
----------------------------------------------------------------
Краткое описание операторов командной строки
----------------------------------------------------------------
NEW
Очистка программы
LIST
LIST num
LIST num,count
Вывод программы, num - с какой строки, count - максимальное количество строк
RUN
Запуск (интерпретация) программы
CONT
Продолжение выполнения после STOP
CLOAD
CSAVE
Загрузка/сохранение программы на кассету в бинарном виде. Параметров (например имя программы) нет.
SLOAD
SSAVE
Загрузка/сохранение программы на кассету в виде текста.
ALOAD
ALOAD start
ALOAD start,step
ASAVE
Загрузка/сохранение программы на кассету в виде текста без номеров строк, для программ на ассемблере. Номера строк при загрузке формируются автоматически, start - номер первой строки, step - шаг нумерации
AUTO
AUTO start
AUTO start,step
Автонумерация строк, параметры аналогично ALOAD. Полезно при вводе программ на ассемблере.
RENUM
RENUM start
RENUM start,step
Перенумерация строк, параметры аналогично AUTO, большого смысла для программ на бейсике не имеет, т.к. GOTO не модифицируются. Полезно при вводе программ на ассемблере.
REGION size
Задаёт максимальный размер региона для скомпилированной программы. По-умолчанию 2Кб.
MAIN
MAIN (h,l)
Задаёт начальный адрес (см. директиву ORG) скомпилированной программы. h - старший байт адреса, l - младший. По-умолчанию определяется командой REGION.
ARRAY
ARRAY (h,l)
Задаёт начальный адрес массива, этот адрес используется только для скомпилированной программы, в режиме интерпретации массивом будет вся свободная память. По-умолчанию 0, в этом случае желательно не использовать массив в скомпилированной программе.
MONITOR
MONITOR (h,l)
Задаёт начальный адрес векторов runtime подпрограмм для скомпилированной программы. Возможно, эта runtime могла располагаться в ПЗУ. По-умолчанию 103h.
VARIABLE
VARIABLE (h,l)
Задаёт начальный адрес блока памяти для переменных. По-умолчанию 38DCh. Используется только для режима интерпретации. Теоретически, если установить этот адрес равным адресу блока переменных в скомпилированной программе, можно считывать переменные после завершения работы программы.
BASIC opts
ASSEMBLER opts
Компилирует программу, написанную на бейсике/ассемблере. Опции могут быть такие:
0 первый проход с сохранением таблицы символов (?)
1 первый проход ассемблера
2 второй проход с выдачей листинга
3 второй проход с выдачей листинга на магнитофон
4 второй проход с записью кода по заданному адресу (см. MAIN)
5 запись исходного текста на ассемблере на магнитофон
S выдать таблицу символов
Т.е. для компиляции нужно ввести BASIC 14
----------------------------------------------------------------
Краткое описание операторов бейсика
----------------------------------------------------------------
LET var=expr [, var2=expr2 ...]
Оператор присваивания, LET можно не писать.
PRINT "текст" [, ...]
PRINT expr [, ...]
PRINT #width, expr [, ...]
Оператор вывода. Можно ставить несколько запятых подряд, на каждую "лишнюю" будет выведен пробел. Текст может быть в одинарных или двойных кавычках, а также символы вида ^X (без кавычек).
INPUT ["текст",] var [, ...]
Оператор ввода. Текст - аналогично PRINT, однако нельзя несколько раз подряд, между текстами обязательно должна быть переменная.
FOR var=expr TO expr2 [STEP expr3]
NEXT var
Оператор цикла. Имя переменной в NEXT обязательно.
IF expr AnotherOps
Условный оператор. Если выражение равно нулю (или чётное) остаток строки пропускается, иначе выполняется. THEN отсутствует.
GOTO line
GOSUB line
Операторы перехода/вызова подпрограмм.
RETURN
Выход из подпрограммы.
ON expr GOTO line,line[,line ...]
ON expr GOSUB line,line[,line ...]
ON ERROR GOTO line
Переход по индексу/ошибке.
REM любой текст
Комментарий.
DATA expr,expr[,expr]
Данные. Можно использовать выражения. При компиляции пропускается (до конца строки, не используются).
READ var
Считывает данные. При компиляции пропускается (до конца строки, не используются).
RESTORE
Переносит указатель данных на первый DATA в программе. При компиляции пропускается (до конца строки, не используются).
STOP
Останов программы, продолжить можно при помощи CONT. При компиляции игнорируется.
END
Останов программы без возможности продолжить.
DEF FN X(var)=expr
Определение функции X (однобуквенная).
POKE (h,l),expr
DPOKE (h,l),expr
Запись байта/слова в память по адресу h*256+l.
CALL
CALL (h,l)
Вызов скомпилированной/произвольной подпрограммы.
OUT port,val
Вывод в порт.
EI
DI
Разрешение/запрещение прерываний.
INTERRUPT num,line[,num2]
Устанавливает обработчик прерывания num. num2 - непонятно пока.
EXIT
Выход из прерывания. Возможен вход в другой обработчик, если во время обработки возникло другое прерывание.
RST num
Выполняет инструкцию RST процессора. В данной версии вектора прерываний располагаются как раз в области 0008-0038, так что например командой RST 1 можно симулировать прерывание номер 1.
ORG (h,l)
Аналогична ассемблерной директиве ORG, за исключением формата параметра. В режиме интерпретации игнорируется.
COPY text
Копирует text непосредственно в ассемблерный листинг, т.е. фактически, это ассемблерная вставка. В режиме интерпретации игнорируется.
----------------------------------------------------------------
Краткое описание математических операторов и функций бейсика
----------------------------------------------------------------
+ - * / >= <> > = <= <
Стандартные математических операторы для целых чисел. Кроме того имеются:
^ унарный оператор инверсии бит
! операция побитового OR
& операция побитового AND
% операция побитового XOR
ABS(expr)
Абсолютное значение expr.
SGN(expr)
Знак expr в виде чисел -1,0,1
RND(expr)
Псевдослучайное число, expr делитель, на него делится случайное число из диапазона 0-65535. Возвращается остаток от деления. Алгоритм случайного числа очень плохой.
SIZE
Выдаёт количество свободной памяти.
PEEK(h,l)
DPEEK(h,l)
Считывает байт/слово из памяти по адресу h*256+l.
RLC(val,count)
RRC(val,count)
Циклически сдвигает байт val на count бит.
INP(port)
Считывает байт из порта port.
----------------------------------------------------------------
Переменные и другие особенности бейсика.
----------------------------------------------------------------
В данном бейсике есть только целочисленные (двухбайтовые) однобуквенные переменные A-Z, а также однобайтовые переменные A$-Z$ с побитовым доступом, т.е. например A$[4,2] это два бита расположенные со сдвигом на 4 бита влево. Однако адрес блока переменных можно менять оператором VARIABLE. Этот оператор единственный, который можно также использовать в программе, но только в режиме интерпретации. В режиме компиляции он недопустим.
Массивов, как таковых, в этом бейсике нет, но есть специальная переменная @, которую можно считать массивом. В режиме интерпретации она даёт доступ ко всей свободной памяти, т.е. максимальный индекс можно вычислить как SIZE/2-1. Для режима компиляции её адрес задаётся командой ARRAY. Аналогично однобайтовым переменным с побитовым доступом, можно использовать массив как байты, но в отличие от переменных это будут те-же байты свободной памяти, максимальный индекс SIZE-1. Примеры обращения к массиву:
@(0)=1
PRINT @(0)
@$[1,2](1)=3
PRINT @(0)
PRINT @$[2,2](1)
Например @$[0,8](3) это старший байт числа @(1).
Особенностью этого бейсика является также возможность сокращать операторы при помощи точки. Например можно писать ASS. вместо ASSEMBLER, например:
ASS. 12
покажет листинг программы на ассемблере.
[свернуть]
Последний раз редактировалось b2m; 13.11.2025 в 13:48.
Спасибо за документацию. Исходя из части этих сведений:
Скрытый текст
REGION size
Задаёт максимальный размер региона для скомпилированной программы. По-умолчанию 2Кб.
MAIN
MAIN (h,l)
Задаёт начальный адрес (см. директиву ORG) скомпилированной программы. h - старший байт адреса, l - младший. По-умолчанию определяется командой REGION.
ARRAY
ARRAY (h,l)
Задаёт начальный адрес массива, этот адрес используется только для скомпилированной программы, в режиме интерпретации массивом будет вся свободная память. По-умолчанию 0, в этом случае желательно не использовать массив в скомпилированной программе.
MONITOR
MONITOR (h,l)
Задаёт начальный адрес векторов runtime подпрограмм для скомпилированной программы. Возможно, эта runtime могла располагаться в ПЗУ. По-умолчанию 103h.
VARIABLE
VARIABLE (h,l)
Задаёт начальный адрес блока памяти для переменных. По-умолчанию 38DCh. Используется только для режима интерпретации. Теоретически, если установить этот адрес равным адресу блока переменных в скомпилированной программе, можно считывать переменные после завершения работы программы.
BASIC opts
ASSEMBLER opts
Компилирует программу, написанную на бейсике/ассемблере. Опции могут быть такие:
0 первый проход с сохранением таблицы символов (?)
1 первый проход ассемблера
2 второй проход с выдачей листинга
3 второй проход с выдачей листинга на магнитофон
4 второй проход с записью кода по заданному адресу (см. MAIN)
5 запись исходного текста на ассемблере на магнитофон
S выдать таблицу символов
Т. е. для компиляции нужно ввести BASIC 14[свернуть]
...этот диалект Бейсика для Радио-86РК компилируемый? Возможно ли сохранение компилированной программы? Будет ли таковая запускаться в РК ДОС?
÷)
Да, программа на Бейсике или Ассемблере может быть скомпилирована. Результат будет лежать в памяти адресу, указанному оператором MAIN. Сохранить эту программу можно было бы на магнитофон из монитора, и работает она тоже по тем же адресам (предположительно, есть ещё ORG, скорее всего можно компилировать для размещения программы по другим адресам).
Какие условия должны соблюдаться, чтобы программа работала из РК ДОС, я не знаю.
yevrowl(06.12.2025)
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)