BASIC MSX на Орион-128, работает под Z80

OBERON MSX-BASIC.

Продаю платы и наборы микросхем, куплю микросхемы Платы и комплектующие на ПК Орион-128

Бейсик авторский на Орион-128

Описание программирования на Basic Орион

 08/05/2022 Найден BASIC MSX, архив скачать, работает на Z80 под Ордос

MSX BASIC адаптированный для ОРИОНА от "ЯМАХИ"

Подпрограммы MSXBASIC

OBERON MSX-BASIC. Справочник

MSXBASICZ Орион-128 BASIC MSX на Орион-128, работает под Z80 OBERON MSX-BASIC MSXBASICZ Орион-128 BASIC MSX на Орион-128, работает под Z80 OBERON MSX-BASIC

 Интерпретатор MSXBASZ - это немного доработанная версия интерпретатора языка BASIC MSXZBAS. В ней переделана подпрограмма звука - теперь звук OUT 0FFH и заблокировано обращение к подпрограмме М-2 0F830H - запрос RAMTOP (из-за этого вызова интерпретатор плохо работал с М-3.5 и других M-3, что не рассчитаны для ORDOS и не имеют этой п/подпрограммы). Это обращение заменено загрузкой в регистр HL числа, которое возвращает п/п 0F830H при старте из ORDOS.

Кому-либо из владельцев МС7007 следует переделать версию интерпретатора для этой клавиатуры (т.к интерпретатор самостоятельно опрашивает клавиатуру !).

Подпрограммы MSXBASIC

0000 - рестарт бейсика
0004(2) адрес начала знакогенератора
0008 - внутренние операции
0010 - то же
0018 - запись на стандартный вывод
0020 - сравнение HL и DE (HL-DE)
0028 - внутренние операции
0038 - то же
003B - инициализация функциональных клавиш
003е - выключение экрана
0041 - включение экрана
0044 - установка режима экрана
IN: A-N режима (0-SCREEN0,1-SCREEN1,2-SCREEN2)
0047 - инициализация монохромного режима (SCREEN0)
004а - инициализация четырехцветного режима(SCREEN1)
004D - инициализация 16-ти цветного режима(SCREEN2)
0050 - вывод символа на граф. Экран ("GRP:")
IN: A - код символа
0053 - проверка статуса буфера клавиатуры
OUT: [Z] - буфер пуст
0056 - ввод символа с клавиатуры (INPUT$(1))
OUT: A - код символа
0059 - вывод символа на экран
IN: A - символ
005C - вывод символа на принтер
IN: A - символ
OUT: [C] - прервано
005F - проверка статуса принтера
OUT: [Z],A=0 - не готов; [NZ],A=FF - готов
0061 - преобразование кода графич. символов
IN: A - код символа
OUT: A - преобразованный код
[NC] - в A символ с кодом 1, т.е. переключение
на графику.
[C] и [Z] - преобразуемый код;
[C] и [NZ]- не-"-
0064 - ввод строки с клавиатуры (LINE INPUT)
OUT: HL - адрес буфера-1.строка оканчивается 0
[C] - если CTRL+STOP
0067 - почти тоже что и 0064
006а - тоже что и 0064 только выдает "? " (INPUT)
006D - проверка состояния клавиш CTRL+STOP
OUT: [C] - нажаты
0072 - проверка STOP и CTRL+STOP. Если нажата STOP то выводит
курсор и ожидает повторного нажатия. По CTRL+STOP выдает сообщение "BREAK" и выходит в BASIC
0075 - тоже. Используется бейсиком
0078 - вывод звукового сигнала (BEEP)
007B - очистка экрана (CLS)
IN: установить [Z] иначе очистка не производится
007E - установка курсора (LOCATE)
IN: H-позиция, L-строка; лев. верхн. угол экрана - (1,1)
0081 - обновляет строку функциональных клавиш
0084 - стирает стоку функцион.клавиш (KEYOFF)
0087 - выводит -"- (KEYON)
008A - внутренние операции
008D - опрос джойстика и кнопок управления курсором (STICK)
IN: A=0 - клавиатура
A=1 - джойстик
OUT: A=0 не нажат
A=1 вверх,2-вверх вправо,3-вправо,...,
8-влевво вверх
0090 - опрос пробела и кнопок джойстика
IN: A=номер кнопки (0-пробел,1-огонь,2-лев.,3-прав.)
OUT: A=0 - не нажата
A=FF - нажата
0093 - поиск заголовка на касете (OPEN"CAS:"FORINPUT)
OUT: [C] - ошибка
0096 - чтение байта с магнитофона
OUT: A-байт.[C] - ошибка
0099 - закрыть файл, открытый для чтения (CLOSE)
OUT: [C] - ошибка
009C - открыть файл для записи (OPEN"CAS:"FOROUTPUT)
IN: A=0 - короткий пилот-тон,A<>0 - длинный
OUT: [C] - ошибка
009F - запись байта на магнитофон
IN: A -байт
OUT: [C] - ошибка
00A2 - закрыть файл открытый для записи (CLOSE)
00A5 - вкл./выкл. Двигатель магнитофона (MOTOR[ON/OFF])
IN: A=0 - стоп, A=1 - старт,A=FF - изменить состояние
на противоположное
00A8 - двигает точку вправо
00AB - двигает точку влево
00AE - двигает точку вверх
00B1 - двигает точку вверх с проверкой
OUT: [C] - за пределами экрана
00B4 - двигает точку вниз
00B7 - двигает точку вниз с проверкой
OUT: [C] - за пределами экрана
00BA - масштабирование координат
IN: BC=X,DE=Y
OUT: [NC] - за экраном
00BD - перевод координат в физический адрес экрана и маску точки
IN:BC=X,DE=Y
OUT:HL=адрес,A=маска
00C0 - чтение текущей маски и адреса
OUT:HL=адрес,A=маска
00C3 - запись текущей маски и адреса
IN: HL=адрес,A=маска
00C6 - запись цвета точки
IN: A-цвет
OUT: [C] - недопустимый цвет
00C9 - прочитать точку (POINT)
OUT: A - цвет
00CC - поставить точку (PSET/PRESET)
00CF - нарисовать горизонт. Линию от текущей позиции
IN: HL - кол-во точек
00D2 - получить величину нелинейности экрана
OUT: HL=256*(LY/LX);DE=256*(LX/LY)
00D5 - инициализация функции PAINT
00D8 - сканировать точку вправо
00DB - сканировать точку влево
00DE - получить состояние ряда матрицы клавиатуры
IN: A-ряд (9-состояние ус/сс/рус)
OUT: A-состояние
00E1 - переназначен ли стандартный вывод ?
OUT: [NZ] вывод в файл,[Z] - на экран
00E4 - вывод на принтер. отличается от 005C следующим:
-символы <TAB> заменяются пробелами
-если принтер не MSX то граф.символы заменяются
пробелами
-при ошибке выдает "DEVICE I/O ERROR" и возвра-
щается в BASIC
00E7 - очистка буфера клавиатуры
- вывод программы на принтер

OBERON MSX-BASIC. Справочник

Список операторов

AUTO [N1][,[S]] - автонумерация строк.
N1=(0...65529,<.>)-начальный номер строки, S=(0...65529)-шаг

BEEP - подача звукового сигнала

BLOAD "файл"[,R][,[@]ADDR] - считать программу в машинных кодах. R - с автозапуском, ADDR - смещение,@ADDR - абс. адр.

BSAVE"файл",BG,END[,START] - запись программы в маш. Кодах BG - нач. Адрес, END - конец, START - адрес запуска

CIRCLE [@/STEP](X,Y),R[,COLOR[,BA[,EA[,RATIO]]]] - рисует окружности, эллипсы, дуги, секторы. STEP - в относительных координатах. X,Y - координаты центра, R - радиус, COLOR - цвет, BA - нач. Угол дуги (в рад.), EA - конечный угол, RATIO - отношение вертикальной к горизонтальной оси. Если BA и/или EA <0, тогда из этой точки к центру проводится радиус.

CLEAR [N[,ADDR]] - очистка памяти. N - кол-во байт под строковые переменные (изначально 200), ADDR - верхняя граница памяти, доступная бейсику.

CLOAD [?]["файл"] - считать файл с магнитофона.? - проверить правильность записи.

CLOSE[[#]N1][,[#]N2]... - закрыть файл(ы) N1,N2,...

CLS - очистка экрана/окна

COLOR [C1][,C2] - задать цвет букв (C1) и цвет фона (C2)

CONT - продолжить выполнение программы

CSAVE "файл"[,SPEED] - запись файла на ленту. SPEED - скорость обмена: 1 - 1200 бод, 2 - 2400 бод.

DATA D1,[D2,...] - задать числовые или строчные данные

DEF FN имя [(A1,...)]=выражение - задать функцию пользователя.

DEF USR [N]=ADDR - задать обращение к п/п в машинных кодах по адресу ADDR. N=0..9

DEFINT V1,V2-V3,V4... - об'явить как целые (см.описание)

DEFSNG V1,V2-V3,V4... - об'явить как од. Точн. (см.описание)

DEFDBL V1,V2-V3,V4... - об'явить как дв. Точн. (см.описание)

DEFSTR V1,V2-V3,V4... - об'явить как строковые (см.описание)

DELETE N1[-[N2]] - удалить строку(строки) программы

DIM V1[(N1,N2,...)][,V2[(M1,M2,...)]]... - об'явить массив(ы)

DRAW "команды" - рисовать фигуру:
команды:
UN - N точек вверх
DN - N точек вниз
RN - N точек вправо
LN - N точек влево
EN - N точек под углом 45
HN - N точек под углом 135
GN - N точек под углом 225
FN - N точек под углом 315
MX,Y - переместить граф курсор в точку X,Y
CN - выбор цвета N
AN - установка угла поворота всего изображения. N=0..3 при N=0 угол 0,1 - 90,2 - 180, 3 - 270. При A1 команда L рисует вниз, D - вправо и т.д.
SN - задание масштаба (по умолчанию N=3)
X переменная; - выполнение граф. Подпрограммы, находящейся в переменной. Аргументы N,X,Y - могут быть числом или именем переменой (в последнем случае перед именем переменной следует поставить знак =, а после - ;). Прим: DRAW"L5U6E=X;G=Y;м=X1;,5"
если перед командой поставить букву B, то перемещение выполняется без рисования. А если N - то после рисования курсор возвращается в исходную точку. Пример рисования крестика: DRAW"C15S3A0BM200,200NU10NL10ND10NR10"
в команде M аргументы X и Y могут задаваться в относительных координатах: M10,20 - абсолютные координаты, м+10,-20 - относительные.

END - конец программы. Закрывает все файлы.

ERASE V1[,V2...] - удаляет массив(ы) V1,V2,...

ERROR N - имитирует ошибку N

FIELD [#]файл,N1 AS A$,N2 AS B$,... - распределение буфера файла между переменными A$, B$, ...

FILES ["маска"] - вывод оглавления диска на экран

LFILES ["маска"] - вывод оглавления диска на принтер

FOR V=N1 TO N2 [STEP S] - оператор цикла. V - переменная цикла. N1 - нач. значение, N2 - кон. знач., S - шаг.

NEXT [V1[,V2...]] - конец цикла

GET [#]файл[,запись] - чтение записи с диска в буфер файла

GOSUB N - выполнить подпрограмму

GOTO N - переход на строку N

GO TO N - то же.

IF COND THEN O1:O2:... [ELSE O3:O4:...] - оператор условия

INPUT ["строка";/#файл]V1[,V2...] - ввод переменных с клавиатуры (из файла #файл)

INTERVAL ON/OFF/STOP - разрешение/запрещение/преостановка прерываний от таймера

KEY ON - разрешить вывод состояния ключей F1-F10 в послед-
ней строке экрана.

KEY OFF - запретить ---

KEY LIST - распечатать значение ключей F1-F10

KEY N,"значение" - присвоить ключу FN значение

KEY(N)ON/OFF/STOP - разрешение/запрещение/преостановка прерываний по нажатию кнопки FN

KILL"маска" - удаление файла(файлов) с диска

LET V=N - присвоение переменной V значения N

LINE [[@][STEP](X1,Y1)]-[@][STEP](X2,Y2)[,[COLOR][,B[F]]]
рисует линию из точки X1,Y1 в точку X2,Y2 цветом COLOR.
Если координаты X1,Y1 не указаны, то рисует из текущей точки. Если после параметра COLOR указать B, то рисуется не линия, а прямоугольник. Если указать BF - то закрашеный прямоугольник.

LINE INPUT ["строка";/#файл] V$ - ввод строки с клавиатуры (из файла)

LIST [N1[-[N2]]] - вывод программы на экран

LLIST [N1[-[N2]]] - вывод программы на принтер

LOAD "файл"[,R] - считать (и запустить) программу.

LOCATE [X][[,Y][,V]] - установить курсор в позицию X,Y.
Если V=0, то курсор не видим.V=1 - видим.

LSET X$=Y$ - присвоение с выравниванием по левому краю

MAXFILES=N - задает максимальное количество одновременно открытых файлов.

MERGE "файл" - слить программу в памяти и файл

MID$(X$,N1[,LEN])=Y$ - заменить LEN (или все) символы строки X$, начиная с N1 на символы из Y$

MOTOR ON/OFF - включить/выключить двигатель магнитофона

MOTOR - изменить состояние двигателя магнитофона (если включен - выключить и наоборот)

NAME "файл1" AS "файл2" - переименовать файл1 в файл2

NEW - стереть программу в памяти

ON ERROR GOTO N - задать подпрограмму обработки ошибок

ON V GOTO N1,N2,... - если V=1, пойти на строку N1, если 2 -на N2 и т.д.

ON V GOSUB N1,N2,... - то же, только производится вызов подпрограммы.

ON STOP GOSUB N - установить подпрограмму обработки прерываний от нажатия на клавиши CTRL+STOP

ON INTERVAL=V GOSUB N - установить подпрограмму обработки прерываний от таймера каждые V единиц времени

ON STRIG GOSUB N1,[N2[,N3]]- установить подпрограмму обработки прерываний от нажатия на клавишу пробела и кнопок джойстика.

ON KEY GOSUB N1[,N2,...N10]- установить подпрограмму обработки прерываний от нажатия на клавиши F1..F10

OPEN "файл" [FOR доступ]AS [#]номер - открыть файл. Доступ -OUTPUT - для записи, INPUT - для чтения, APPEND - для дозаписи.

OUT P,D - вывод данного D в порт P.

PAINT [@][STEP](X,Y)[,[COLOR][,BORDER]] - закрасить фигуру.
Параметр цвета контура BORDER можно задавать только в SCREEN1.

POKE ADDR,D - занести байт D в ячейку памяти с адресом ADDR.

PRESET [@][STEP](X,Y)[,COLOR] - удалить точку

PRINT [[#]файл,]V1,V2;V3... - вывод данных на экран (в файл)

PRINT [[#]файл,] USING "формат";V1,V2,... - форматированный
вывод данный на экран (в файл)

LPRINT V1,V2;V3... - вывод данных на принтер

LPRINT USING "формат";V1,V2,... - форматированный
вывод данный на принтер

PSET [@][STEP](X,Y)[,COLOR] - нарисовать точку

PUT [#]файл[,запись] - запись буфера файла на диск

READ V1[,V2...] - считать данные из DATA в переменные V1,V2...

RENUM [NEW[,START[,STEP]]] - перенумеровать строки программы

RESTORE [N] - восстановит указатель DATA (на строку N)

RESUME - продолжить выполнение программы после обработки ошибки

RESUME N - выйти из п/п обработки ошибок и перейти на строку N

RESUME NEXT - продолжить выполнение программы со следующего оператора.

RETURN - выход из подпрограммы

RETURN N - выход из подпрограммы и переход на строку N.

RSET X$=Y$ - присвоение с выравниванием по правому краю

RUN [N] - запустить программу (со строки N)

RUN"файл" - считать и запустить файл

SAVE"файл"[,A] - записать программу (как ASCII-файл)

SCREEN MD,CLICK,SPEED,PRNTYPE - установка различных режимов:
MD - режим экрана:
0 - 2 цвета
1 - 4 цвета
2 - 16 цветов
CLICK - щелчок клавиатуры (0-есть,1-нет)
SPEED - скорость обмера с магнитофоном (1-1200 бод,2-2400)
PRNTYPE - тип принтера:
0 - MSX (можно выводить граф. символы и символы табуляции)
1 - не MSX (граф. Символы и символы табуляции заменять на пробелы)

SOUND P,D - генерировать звук. P - высота тона, D - длительность. Чтобы нота звучала 1 сек. Необходимо указать:

Октавы звука MSXBASICZ Орион-128 BASIC MSX на Орион-128, работает под Z80 OBERON MSX-BASIC

Пятая колонка соответствует первой октаве

STOP - приостановка программы

STOP ON/OFF/STOP - разрешение/запрещение/приостановки прерываний по нажатию кнопок CTRL+STOP

STRIG(N)ON/OFF/STOP - разрешение/запрещение/приостановка прерываний по нажатию пробела (N=0) или кнопок джойстика N=1,2,3

SWAP V1,V2 - обменять содержимое переменных V1 и V2

TIME=T - задать значение времени для внутреннего таймера

VPOKE[@][STEP](X,Y),CHAR[,COLOR] - вывести символ CHAR на экран (в окно) с координатами X,Y (цветом COLOR). CHAR
может быть символом или его кодом

WAIT P,A[,X] - ожидание состояния порта

WIDTH W,H,X,Y - задание размеров и положения окна. X,Y - координаты верхнего левого угла, W - ширина, H - высота.
Любой параметр может быть опущен.

Функции и системные переменные
------------------------------
ABS(X) - модуль X

ASC(X$) - код первого символа строки X$

ATN(X) - арктангенс

ATTR[@][STEP](X,Y) - атрибут символа на экране (в окне) в позиции X,Y

BIN$(X) - двоичное представление X

CDBL(X) - преобразование X в вещественное двойной точности

CSNG(X) - преобразование X в вещественное одинарной точности

CINT(X) - преобразование X в целое

CHR$(X) - символ с кодом X

COS(X) - косинус X. X - в рад.

CSRLIN - номер строки на которой находится курсор

CVI(X$) - преобразование двухсимвольной строки в целое

CVS(X$) - преобразование четырехсимвольной строки в вещественное число одинарной точности

CVD(X$) - преобразование восьмисимвольной строки в вещественное число двойной точности

DSKF(N) - свободное пространство на диске (в байтах)

EOF(файл) - =0,если не достигнут конец файла.иначе =-1.

ERL - номер строки, в которой возникла ошибка

ERR - номер ошибки

EXP(X) - E^X

FIX(X) - целая часть от X

FRE(X) - кол-во свободной памяти

FRE(X$) - кол-во свободной памяти в буфере строковых переменных.

HEX$(X) - шестнадцатиричное представление X

INKEY$ - код нажатой клавиши. "" если не нажата.

INP(X) - содержимое порта X

INPUT$(N[,[#]файл)-считать N символов с клавиатуры (из файла)

INSTR([N,]X$,Y$) - позиция вхождения строки Y$ в X$ (начиная
с позиции N)

INT(X) - ближайшее целое не превосходящее X

LEFT$(X$,N) - N левых символов X$

LEN(X$) - длина X$

LOG(X) - натуральный логарифм X

LOC(N) - количество несчитанных байт в буфере файла

LOF(N) - количество байт до конца файла

LPOS(N) - позиция печатающей головки принтера

MID$(X$,N[,L]) - L символов строки X$ начиная с N. Если L не указано, то возвращает все символы X$ начиная с N и до конца

MKI$(X) - преобразование целого X в двухсимвольныю строку

MKS$(X) - преобразование вещественного X одинарной точности в четырехсимвольную строку

MKD$(X) - преобразование вещественного X двойной точности в восьмисимвольную строку

OCT$(X) - восьмиричное представление X

PEEK(X) - содержимое ячейки X

POINT[@][STEP](X,Y) - цвет точки с координатами X,Y

POS(X) - позиция курсора на экране

RIGHT$(X$,N) - N правых символов строки X$

RND(X) - псевдослучайное число из диапазона 0..1. При X>0 - генерируется новое число из последовательности. X=0 -
предыдущее число. X<0 - задать новую последовательность.

SGN(X) - знак числа X (=-1,X<0;0,X=0;1,X>0)

SIN(X) - синус X

SPC(X) - в операторе PRINT - X пробелов

SPACE$(X) - X пробелов

SQR(X) - квадратный корень из X

STICK(N) - состояние кнопок управления курсором (N=0) или джойстика (N=1). =0 - не нажаты.1 - вверх,2-вверх/вправо, 3-вправо,...,8-влево/вверх

STRIG(N) - состояние пробела (N=0) или кнопок джойстика (N=1,2,3). =0 - не нажата,=-1 - нажата

STR$(X) - преобразование числа в строку

STRING$(N,X) - генерирует строку, состоящую из N символов с кодом X

STRING$(N,X$) - генерирует строку, состоящую из N символов, образованных из первого символа строки X$

TAB(N) - в операторе PRINT перемещает курсор в N-ю позицию

TAN(X) - тангенс X

TIME - счетчик времени

USR[N](X1) - вызов подпрограммы в машинных кодах и передача ей параметра X. возвращает результат выполнения п/п

VAL(X$) - преобразует строку в число

VARPTR(V) - возвращает адрес размещения переменной V

VARPTR(#N) - возвращает адрес буфера файла номер N

VPEEK[@][STEP](X,Y) - возвращает код символа, который находит-
ся на экране (в окне) в позиции X,Y

Арифметические и логические операции
------------------------------------

X+Y - сложение X и Y
X$+Y$ - соединение строк X$ и Y$
X-Y - разность X и Y
X*Y - произведение X и Y
X/Y - деление X на Y
X\Y - целочисленное деление X на Y (X и Y - целые)
X MOD Y - остаток от деления X на Y
X^Y - возведение в степень
X AND Y - логическое и
X OR Y - логическое или
X XOR Y - исключающее или
NOT X - отрицание X
X EQV Y - эквивалентность
X IMP Y - импликация
X>Y равно -1, если X больше Y. 0 в противном случае
X>=Y равно -1, если X больше или равно Y.0 в противном случае
X<Y равно -1, если X меньше Y. 0 в противном случае
X>=Y равно -1, если X меньше или равно Y.0 в противном случае
X=Y равно -1, если X равно Y. 0 в противном случае
X<>Y равно -1, если X не равно Y.0 в противном случае
операции отношения >,>=,<,<=,=,<> можно проводить и над
строковыми величинами.

Имена устройств:
---------------

CAS: - магнитофон
LPT: - принтер
CRT: - текстовый экран
GRP: - графический экран
MEM: - квази-диск ORDOS (по умолчанию)

Типы данных:
-----------

% - целые
! - вещественные одинарной точности
# - вещественные двойной точности
$ - строковые

Управляющие символы драйвера экрана
-----------------------------------

1 - переключение на вывод граф символов. Чтобы вывести символ с кодом N (N<32) необходимо: PRINT CHR$(1)+CHR$(64+N)
7 - подача звукового сигнала (BEEP)
8 - курсор влево
9 - горизонтальня табуляция
10 - перевод строки
11 - курсор в позицию 0,0
12 - очистка экрана
13 - возврат каретки (курсор - в начало тек. Строки)
27 - вывод ESC-последовательности (см. Ниже)
28 - курсор вправо
29 - курсор влево
30 - курсор вверх
31 - курсор вниз
127 - удаление символа слева от курсора со смещением послед-
него на одну позицию влево

ESC-последовательности:
----------------------

Символ код действие
A 65 курсор вверх
B 66 курсор вниз
C 67 курсор вправо
D 68 курсор влево
E 69 очистка экрана
H 72 курсор в позицию 0,0
J 74 очистка до конца экрана
K 75 очистка до конца строки
L 76 вставка пустой строки
M 77 удаление строки
O# 79;N изменение атрибута символов на значение N (третий
байт команды). PRINT CHR$(27)+"O"+CHR$(&H1F) -
установит режим вывода белые буквы на синем фоне.
Y## 89;Y;X установка курсора в позицию X-32,Y-32. Опера-
тор PRINT CHR$(27)+"Y"+CHR$(32+6)+CHR$(32+8);
установит курсор в позицию 8,6
л 108 очистка текущей строки
ы4 121;52 узкий курсор
ь4 120;52 полный курсор
ы5 121;53 видимый курсор
ь5 120;53 невидимый курсор

-----------------------------------------------------------------------------------------------------------------------
OBERON MSX-BASIC является зарезервированным названием программного продукта OBERON INC.

COPYRIGHT 1992,1993,1994 BY ALEX I.VAKULENKO, OBERON INC.
-----------------------------------------------------------------------------------------------------------------------

MSX BASIC адаптированный для ОРИОНА от "ЯМАХИ"

Датой рождения наиболее популярного диалогового языка программирования бейсик считается 1 мая 1964 г. Авторы языка - сотрудники дартмутского колледжа во главе с Дж.Кемени и Т. Куртцем.
Это был интерпретатор Бейсика. Языки высокого уровня вообще были придуманы для упрощения труда прогрммиста, ибо писать программы на ассемблере - не легкая задача. Но, к сожалению, для компьютера не понятно то, что так естественно для человека. Сам по себе компьютер не знает как это нарисовать линию или вычислить синус, для этого необходимы программы, в которых заложен алгоритм рисования той же линии или вычисления SIN. Эти функции написаны авторами языка высокого уровня и программисту достаточно указать компьютеру что он хочет нарисовать линию и этого достаточно; на ассемблере же нужно всякий раз указывать не только что вы хотите сделать, но и как это делать. Для того, чтобы компьютер понимал ваши желания создаются программы-трансляторы (переводчики), которые переводят ваше "что" в компьютерное "как", т.е помогают компьютеру понять ваши команды. Трансляторы бывают двух типов: интерпретаторы и компиляторы. Их главное отличие в самом принципе перевода программ. Так, интерпретатор переводит команду за командой по мере выполнения программы, причем выполненные команды "забываются". Это значит, что если выполнение программы проходит по одному и тому же участку, то он каждый раз будет транслироваться заново. Компилятор производит трансляцию всей программы до ее выполнения и в результате получается программа на ассемблере, которая потом может запускаться отдельно от компилятора. Таким образом откомпилированные программы работают быстрее, нежели те же программы под управлением интерпретатора. Но зачастую разрабатывать и отлаживать программы в интерпретаторе легче, т.к можно оперативно модифицировать программу в любой момент ее выполнения. Но не следует забывать, что существуют хорошие компиляторы. Поэтому не всегда удобнее работать с интерпретатором.

Вызов интерпретатора
~~~~~~~~~~~~~~~~~~~~

Данная версия интерпретатора может работать под управлением Монитора (1,2,3), ORDOS или CP/M и использует стандарт компьютера ОРИОН-128 в том виде в котором он был опубликован в журнале "Радио".
- если вы работаете в Мониторе, то считайте с ленты файл бейсика и запустите его с адреса 0.
- если вы работаете в ORDOS, считайте в RAM-диск (если бейсик не находится в ROM-диске) с ленты файл MSXBAS$ и запустите его.
- если вы работаете в CP/M, то вставьте в дисковод диск с файлом MSXBAS.COM и запустите этот файл.

Внимание !

При запуске включается цветной режим и область памяти 0C000H-0EFFFH затирается в 0 и 1-й страницах ОЗУ.

После этого на экране появится надпись:

MSX SYSTEM
VERSION 1.0
COPYRIGHT 1983,1993 BY MICROSOFT,OBERON INC

MSXBASICZ Орион-128 BASIC MSX на Орион-128, работает под Z80 OBERON MSX-BASIC

и далее через 2-3 секунды на экран будет выдано сообщение:

MSXBASICZ Орион-128 BASIC MSX на Орион-128, работает под Z80 OBERON MSX-BASIC

MSX BASIC VERSION 1.0
COPYRIGHT 1983,1993 BY MICROSOFT,OBERON INC
10250 BYTES FREE
OK
=

 Примечание: количество памяти определяется по верхнему адресу ОЗУ, отведенному пользователю (функция F830 Монитора) и поэтому надпись "ххххх BYTES FREE" может изменяться в каждом конкретном случае.

Сообщение "OK" и курсор (инвертированное знакоместо) информируют о том, что бейсик готов к приему команд от программиста. В последней строке экрана выводится состояние функциональных ключей F1,F2,... F10 - это кнопки F1, F2, F3, F4, F5, SHIFT+F1,
SIFT+F2, SHIFT+F3, SHIFT+F4 ,SHIFT+F5.
Эти кнопки имеют особое значение и выполняют следующие функции:
- при нажатии на одну из функциональных клавиш в режиме ввода строки на экране появится слово, закрепленное за этой клавишей.
- возможно инициирование прерывания при нажатии функциональной клавиши во время выполнения программы (см.дальше).

Примечание: клавиша "F5" может быть включена в неиспользуемое место в матрице клавиатуры (0-регистр, 7-бит). Далее клавиша "УС" называется "SHIFT", а "СС" - "CTRL".

Всего есть 10 функциональных клавиш (F1-F10), причём первые 5 соответствуют одноименным кнопкам F1-F5, а функциональные клавиши F6-F10 - это комбинация одновременно нажатых клавиш "SHIFT" и соответственно F1-F5, т.е :

F1=F1 F6=SHIFT+F1
F2=F2 F7=SHIFT+F2
F3=F3 F8=SHIFT+F3
F4=F4 F9=SHIFT+F4
F5=F5 F10=SHIFT+F5.

При нажатии клавиши "SHIFT" строка состояния меняется, показывая состояние ключей F6-F10.
Состояние по умолчанию:

F1 - LOAD" F6 - SAVE"
F2 - AUTO<пробел> F7 - CLOAD"
F3 - GOTO<------> F8 - CONT<ВК>
F4 - LIST<------> F9 - LIST<ВК><вверх><вверх>
F5 - RUN<ВК> F10- <очистка экрана>RUN<ВК>

Вводить текст программы и команды языка можно непосредственно в режиме ввода строки. Причем производить исправления можно в любом месте экрана не перебирая всю команду заново.

Команды редактирования
~~~~~~~~~~~~~~~~~~~~~~
- "\"(CTRL+"к") - курсор в положение "домой" (левый верхий угол рабочего поля)
- "SHIFT"+"\"("CTRL"+"L") - очистка экрана.
- "СТР"(далее INS),("CTRL"+"R") - изменение режима вставки/замены. В режиме замены курсор имеет вид прямоугольника(8 инверсных линий). При вводе символов с клавиатуры они накладываются "поверх старой" информации. В режиме вставки курсор представляется в виде полосы(3 инвертированных линий растра). При этом вводимые символы вставляются между введенными ранее символами. Например, до ввода у нас была строка: ABC и вот результат ввода буквы "X":

ABC ==> AXC
ABC ==> AXBC

- "ЗБ" (далее DEL) - удаление символа в позиции курсора. Остаток строки смещается влево.
- "SHIFT"+"DEL"("CTRL"+"H") - удаление символа слева от курсора.
И курсор и остаток строки смещается влево:

ABCD ==> "DEL" ==> ABD
ABCD ==> "SHIFT"+"DEL" ==> ACD

- "CTRL"+"E" - очистка конца логической строки.
- "CTRL"+"U" - очистка всей логической строки.
- "CTRL"+"B" - на начало предыдущего слова.
- "CTRL"+"F" - на начало следующего слова.
- "CTRL"+"N" - в конец строки.
- <ВК>("CTRL"+"M") - ввод команды.
- <таб>("CTRL"+"I") - табуляция.
- "CTRL"+"G" - подача звукового сигнала.

Структура языка, алфавит
~~~~~~~~~~~~~~~~~~~~~~~~

Алфавит бейсика включает в себя все отображаемые и управляющие символы.
Каждому символу алфавита присвоен код - число от 0 до 255, называемый кодом символа. Условно все символы можно разделить на 2 группы:
- символы с кодом от 0 до 127
- и символы от 128 до 255.

Состав и порядок символов первой половины кодировочной таблицы определены американским стандартом на коды обмена информацией, известного под названием ASCII (AMERICAN STANDARD CODе FOR INF- ORMATION INTERCHANGе). В него входят:
символы с кодами от 1 до 31 - неотображаемые управляющие символы. Это символы управления курсором, внешними устройствами и т.д. Так, при выводе символа с кодом 7 выдается звуковой сигнал, при выдаче символа 12 - очистка экрана или прогон до конца страницы на принтере и т.д.

Во всех командах и выражениях бейсика, кроме комментариев и текстовых констант применение русских букв запрещено.
Для бейсика нет разницы между прописными и строчными буквами. Но для второй половины кодировочной таблицы нет единого стандарта. она содержит символы псевдографики и русские буквы. С пятью возможными вариантами таких таблиц можно ознакомиться по статье В.Э. Фигурного, опубликованной в первом номере за 1990 год журнала "Компьютер".
В данном варианте выбран стандарт КОИ-8, с некоторой модификацией - введены символы украинского алфавита. Чтобы узнать набор всех символов наберите и выполните следующую программу:

10 KEY OFF:COLOR 5,1:WIDTH 48,32,0,0:SCREEN 2:DEFINT A-Z
20 PRINT TAB(8)"Таблица ASCII на вашем компьютере"
30 LX=8:LY=29
40 FOR I=0 TO LY-1:LOCATE 1,I+2
50 FOR J=I TO I+LX*LY STEP LY
60 IF J>255 THEN 100
70 COLOR 6:? USING " \\ ";HEX$(J);
80 IF J<32 THEN ?CHR$(1);
90 COLOR 7:IF J=127 THEN ?".";ELSE ?CHR$(J-64*(J<32));
100 NEXT J,I
110 LOCATE 42,28:COLOR 14:?"?";:C=0:T=10
120 IF INKEY$<>"" THEN COLOR 6:CLS:END
130 T=T-1:IF T=0 THEN T=10:C=1-C
140 VPOKE(44,28),95+63*(C=0)
150 GOTO 120

Интерпретатор работает в двух режимах - непосредственном и программном.
В непосредственном режиме команды выполняются сразу после их ввода. Последовательность команд можно собрать воедино и выполнить их все вместе. Это и будет программным режимом. Программа состоит из строк, состоящих из:

- номера строки(число из диапазона от 0 до 65529)
- набор команд
Так если CLS очистить экран; а PRINT 2*2 - напечатать результат арифметического действия 2*2, тогда чтобы очистить экран и напечатать результат на экране надо набрать:

1 CLS
2 PRINT 2*2
3 END

Набор таких пронумерованных строк и является программой на бейсике. Чтобы ее выполнить необходимо набрать команду RUN и произвести ввод(клавиша<ВК>). При этом, если программа была правильно составлена, экран должен очиститься и появится цифра 4 в левом верхнем углу экрана. Под ней сообщение "OK" и курсор -признак готовности интерпретатора к приему следующей команды.
Часто возникает потребность запомнить промежуточные данные.
Для этого существуют переменные. Переменная - это имя состоящее из одного или двух символов, первый из которых - латинская буква второй - буква или цифра. Так, правильные переменные (их часто называют еще идентификаторами): A,CD,B5. Неверно: 5B (первый символ не буква), X: (нельзя использовать другие символы кроме A,B,..., Z,0,1,...9). Если длина переменной больше двух символов, то остальные не учитываются, поэтому COR и CO одно и тоже.
Чтобы записать в переменную какое то значение необходимо написать:

LET A=5.

команда LET (пусть) не обязательна и ее можно опустить, т.е:

LET A=5
и
A=5

Приводят к одинаковым результатам.
Теперь можно узнать содержимое переменной A:

PRINT A
5
OK
=

или использовать его в других арифметических выражениях:

B=A+7
ок
PRINT B
12
ок
=

Типы данных
~~~~~~~~~~~

Бейсик оперирует с четырьмя базовыми типами данных:
- числовые:
- целые;
- с плавающей запятой:
- одинарной точности;
- двойной точности;
- символьные (строковые, текстовые, литерные).
Целые числа - это числа из диапазона -32768... +32767.
Числа с плавающей запятой одинарной точности - это числа из диапазона (по модулю): 1.00000 е-64; 9.99999 е+62.

Примечание: запись 1.2 е+10 означает 1.2 * 10000000000;
~~~~~~~~~~ -2.78 е-5 = -2.78 * 0.00001.

Числа с плавающей запятой двойной точности - это числа из
диапазона: 1.0000000000000 е-64; 9.9999999999999 е+62, т.е отличаются только числом знаков после запятой.
Константа представляет собой обьект, значение которого не может быть изменено в процессе выполнения программы:

10 A=3.1415
20 PRINT A

Число 3.1415 является константой.
Чтобы конкретизировать тип, как константу, так и переменной используют символы:
% - целый тип;
! - одинарная точность вещественных чисел;
# - двойная точность вещественных чисел;
$ - строковый тип(см. Дальше);
Таким образом запись: A! говорит о том, что этот обьект - переменная A, числовая с одинарной точностью. Причем следует заметить, что A целая, A одинарной и A двойной точности (т.е А%, A!, A#) разные обьекты. Поэтому:

а%=3
а!=4
а#=5
PRINT а%;A!;а#

напечатает:

3 4 5

Символы ! и # могут появляться в программе автоматически, если можно перепутать типы констант. Так число 1 всегда число целое и набрав в программе:

10 A=1

и выполнив команду LIST (вывести программу на экран), мы изменений не увидим. Но если набрать:

10 A=100000
LIST
10 A=100000!
OK

Это показывает, что хоть в константе и не присутствует десятичная точка, это число выходит из диапазона целых чисел и поэтому является вещественным числом, аналогично:

10 A=3.14 10 A=3.1415926
LIST LIST
10 A=3.14 10 A=3.1415926#
OK OK

Второй пример показывает, что в константе больше знаков после запятой, нежели может быть у константы одинарной точности, поэтому она является константой двойной точности. И не пытайтесь удалить этот знак "#" из программы у вас все-равно ничего не выйдет. Целочисленные константы могут быть представлены из системы в двоичной, восьмиричной или шестнадцатиричной системе исчисления. Перед константой достаточно указать идентификатор системы исчисления: &H - шестнадцатиричная, &O - восьмиричная, &B - двоичная; например: &H3F6, &01777, &B1100100, &B11+&HFFFF, &H5F\60. Заметим, что операции над числами одинарной точности выполняютстя быстрее, нежели над числами двойной точности. Еще быстрее бейсик работает с целыми числами. Поэтому целесообразно тип # использовать когда необходима точность вычислений. Строковый тип ($) - это набор символов. Константы этого типа - это строка символов заключенных в кавычки ("). Максимальная длина строки 255 символов. Так символьными константами являются:

"ОРИОН-128", "OBERON INC", "INTPROSERVICE", "123", "".

Последний пример особый случай - строка, не содержащая символов (так называемая пустая строка). Над строковыми типами определена операция сложения, присваивания и сравнения. Так:

A$="ОРИОН-"
B$="128"
C$=A$+B$

После этого C$ имеет значение "ОРИОН-128", т.е "сумма" двух строк. Сравнение строк будет рассмотрено несколько позже. По умолчанию все переменные - вещественные двойной точности, т.е А, CL, RX - все это вещественные с двойной точностью. Но существует возможность задания типов переменных, начинающихся с определенной буквы. Это операторы:

DEFINT (OT INTEGER - целые;)
DEFSNG (OT SINGLE - одинарной точности;)
DEFDBL (OT DOUBLE - двойной точности;)
DEFSTR (OT STRING - строковые;)

Выражение DEFINT A значит, что все переменные, начинающиеся с буквы а - целые, т.е A, AN, APR, A12, ARC - целые. Это однако не исключает существования строковых и вещественных переменных, начинающихся с A. Но для этого надо явно указывать тип переменной:

AL# - двойная точность;
AS$ - строковая;
ARC! - одинарная точность (не забывайте, что это то же, что и AR! - только первые два символа имеют значение).

Можно задавать несколько букв или целый интервал DEFXXX.
Так :

DEFSNG B,F-Q,Y

Означает, что все переменные, начинающиеся с B,F,G,K,...,Q,Y имеют вещественный тип одинарной точности.
Пользуясь описателями типов надо быть внимательными. Пример:

10 A=3
20 DEFINT A-Z
30 B=1/A

В строке 30 возникает ошибка "DIVISION BY ZERO" (деление на нуль). Почему ? Оказывается, как упоминалось выше, по умолчанию вначале все переменные типа DOUBLE. И строка 10 фактически означает запись:

10 A#=3

После строки 20 все переменные по умолчанию стали целыми и стро-
ка 30 фактически имеет смысл:

30 B%=1/A%

А так как переменные различных типов хоть и с одинаковыми
именами - разные обьекты, то переменные A# и A% ничем не связаны. В начале все числовые переменные обнулены (равны 0) и к строке 30 переменной A% не было ничего присвоено. Вот и получилось деление на нуль. Чтобы устранить эту ошибку необходимо изменить программу:

10 A=3 10 DEFINT A-Z
20 DEFINT A-Z или 20 A=3
30 B=1/A# 30 B=1/A

Mассивы
~~~~~~~~~

Массивы представляют собой набор однотипных переменных, компактно расположенных в оперативной памяти. Все элементы массива снабжаются общим именем, вслед за которыми записывается один или несколько индексов взятых в круглые скобки. Эти индексы определяют местоположение элемента в массиве. так записи :

AA(2); B%(3,7); QSR#(0,1,2,7)

Являются массивами.
Наиболее просто организованы одномерные массивы, являющиеся эквивалентом векторов. Все их элементы пронумерованы последовательными натуральными числами, которые и выполняют роль индексов. Минимальное значение индекса - 0, максимальное (теоретически) - 32767, но обычно хранить такие массивы не хватает памяти и максимальный индекс всегда меньше. Это значение, определяющее размер массива, задается в явном виде при обьявлении массива, либо принимается равным 10 при неявном описании (по умолчанию).
Для обьявления массива используется оператор DIM.

DIM ALEX%(3,5)

обьявление целочисленого двумерного массива AL с 4-мя строками и 6-ю столбцами (минимальный индекс 0, а не 1), т.е :

ALEX%
0 1 2 3 4 5
------------------
0 ! !
1 ! !
2 ! X !
3 ! !
------------------

доступ к помеченному элементу осуществляется путем:

? AL%(2,2)

(? - аналог оператора PRINT)
Максимальное значение индексов - 255. Если мы хотим задать новую размерность массива AL%, то необходимо удалить старый массив командой ERASE и завести новый, например:

ERASE AL%
DIM AL%(7,4,1)


Преобразование типов данных
~~~~~~~~~~~~~~~~~~~~~~~~~~~
При присваивании одних величин другим происходит, при надобности, неявное преобразование типов. Это диктуется тем, что в машине данные разных типов представляются в разном формате. Так целые кодируются двумя байтами, вещественные одинарной точности - 4, двойной - 8 байтами. Обычно не приходится прибегать к явному преобразованию типов с помощью функций:

CINT - преобразование в целый;
CSNG - преобразование в числа с одинарной точностью;
CDBL - преобразование в числа с двойной точностью;

Так два следующих оператора приведут к совершенно идентичным
последствиям:

B#=2%
B#=CDBL(2%)

Но иногда эти функции могут быть полезны. Так, по правилам преобразования типов результат двухместной операции (операции с двумя аргументами) определяться более длинным форматом аргумента. То есть:

INT*INT=INT INT*DBL=DBL
SNG*INT=SNG DBL*INT=DBL
INT*SNG=SNG DBL*SNG=DBL
SNG*SNG=SNG SNG*DBL=DBL
DBL*DBL=DBL

Скорость вычисления зависит от длины аргумента, над которыми
выполняются действия. И если нам не нужна большая точность тогда нет смысла проводить все операции с точностью до 14 знака (DBL), а потом округлять результат. Можно смело округлять, а потом проделывать операции над, скажем, 6-ти значными числами (SNG). Арифметические функции (SIN,COS,LOG,...) всегда выдают результат типа DBL и тогда:

10 A!=2*EXP(2)

Будет вычисляться так:
Вычислится EXP(2). Результат будет иметь 14 значащих цифр
т.к один аргумент типа DBL, то и второй(2) тоже преобразуется к
типу DBL, и только после этого выполнится умножение числа
7.389056098920 на 2.0000000000000 с точностью до последнего знака. А не лучше ли округлить экспоненту до 7.38906 и умножить на 2.00000. Явно это будет быстрее. Поэтому целесообразно модифицировать формулу следующим образом:

10 A!=2*CSNG(EXP(2))

Преобразование из числового в символьный тип и наоборот не
предусматривает преобразование по умолчанию. Для этого существуют специальные функции VAL и STR$, описание которых будет
приведено ниже в разделе справочник.

Стандартные и нестандартные функции
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Кроме констант и переменных и более сложных обьектов типа массивов к числу операндов, над которыми можно выполнять те или иные операции относятся стандартные и нестандартные функции. По аналогии с математическим определением функцию можно представить себе как некую вычислительную процедуру, на вход которой подается набор допустимых параметров - аргументов, получается единственный результат - значение числового или символьного типа. Любая функция представляет собой некоторую программу, которая является либо составной частью интерпретатора (стандартный набор функций), либо определяется пользователем. Список стандартных функций приведен ниже, смысл которых будет приведен ещё позже:

ABS ASC ATTR BIN$ CBDL
CHR$ CINT COS CSNG CVD
CVI CVS EOF EXP FIX
FRE HEX$ INP INPUT$ INSTR
INT LEFT$ LEN LOC LOF
LOG LPOS MID$ MKD$ MKI$
MKS$ OCT$ PEEK POINT POS
RIGHT$ RND SGN SIN SPACE$
SPC * SQR STICK STR$ STRIG
STRING$ TAB * TAN USR VAL
VARPTR VPEEK

----
* - функции SPC и TAB не являются функциями в полном смысле.

Арифметические и логические выражения
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Арифметическое выражение состоит из операндов числового типа (константы, переменные, функции), перечень которых приведен ниже. Возможно применение круглых скобок для управлением порядком вычисления.

Знак операнда действие
------------- --------
+ сложение
- вычитание
* умножение
/ деление
\ целочисленное деление
MOD остаток деления
^ возведение в степень

Результат операции деления (/) всегда является вещественное
число одинарной или удвоиной точности. Если же используется целочисленое деление (\) или нахождение остатка от деления (MOD), то перед вычислением операции оба аргумента приводятся к целому типу и далее выполняется операция, результат которой тоже целое число. Как уже указывалось выше тип результата арифметической операции определяется по типу более "сложного" среди операндов.

Порядок возрастания "сложности типов":

целочисленный ==> вещественный с одинарной точностью ==> вещественный с двойной точностью.

Возведение в целочисленную степень производится путем последовательных умножений (X^N=X*X*X*X*...*X). Если же показатель степени - вещественное число, то X^Y=EXP(Y*LOG(X)). Поэтому X должен быть больше нуля.
В качестве аргументов могут входить и логические выраже-
ния.результатом элементарных логических операций отношения является целое число, равное 0, если выражение ложно, и -1, если
истинно. Так выражение 2=3 равно 0, а 7<>3 равно - 1. Вообще-то
в логическом операторе IF (см.дальше) любое значение аргумента, отличное от 0 считается истиной.
Элементарные логические операнды могут обьединяться в выражения с помощью логических операций: NOT, AND, OR, XOR, EQV, IMP. Таблица истиности для этих операций приводится в справочнике.
Приведем некоторые примеры:

10 A=3
20 B=7
30 C=A=B
40 D=C<>A AND C<>B
50 E=C=A OR C=B

После выполнения программы A=3, B=7 т.к. 3<>7 то C=0 (ложь).
Т.к С<>3 и C<>7 то D=-1 (истина). И в конце концов ни 0<>3 ни 0<>7 и следовательно E=0. Советуем вам поэксперементировать с логическими операциями.

Операторы
~~~~~~~~~

Операторы представляют собой синтаксические конструкции, из которых составлена программа. Как правило такие конструкции начинаются с одного или двух служебных слов, определяющих характер действия предписываемое оператором. Действие это может носить как декларативный, так и исполнительный характер.
В первом случае оно адресовано интерпретатору и должно быть
обработано до начала выполнения программы. К декларативным относятся операторы описания типов DEFDBL, DEFINT, DEFSNG, DEFSTR формирования внутреннего блока данных (DATA), описатель нестандартных функций (DEF FN), указание программ обработки прерываний (событий) (ON ERROR GOTO; ON KEY; ON STRIG; ON INTERVAL; ON
STOP GOSUB) включение комментариев (REM и апостроф (')).
На декларативные операторы распространяется довольно естественное правило по поводу их расположения в программе: сначала опиши (обьяви), а затем используй. Поэтому они чаще всего идут в
начале программы. Указанное правило не относится к комментариям, которые призваны пояснять определенный участок программы, и оператору DATA, который может находиться в любом месте не зависимо от того, где происходит чтение данных (READ).

Непосредственные действия и программа
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Бейсик позволяет превратить компьютер в арифмометр, который выполнять оператор сразу же после набора. Для этого программная строка набирается без номера и после нажатия клавиши <ВК> сразу же обрабатывается и на экране появляется результат (если вы, конечно, об этом просили). С помощью непосредственных команд можно отобразить на экране или изменить значение любых переменных, изменить режим работы экрана и т.д. Текст операторов, непосредственно выполняемых интерпретатором, в памяти не сохраняется.
Поэтому при повторении какого-либо ранее проведенного вычисления текст строки придётся набирать заново, или, в лучшем случае, подводить курсор к сохранившейся на экране строке и модифицировать её.
Но не любой оператор можно выполнить в непосредственном режиме. Так оператор DEF FN... Работает только в программном режиме. Для удобства за раз можно набрать несколько операторов, разделив их двоеточием (:). Например:

PRINT 2*2:PRINT 3*6
4
18
OK
=

Операторы, которые набираются с номерами строк, участвуют в формировании текста исходной программы. Выполнение такой программы может быть отложено на неопределенный срок, конечно при условии, что текст программы будет сохранен. Эту программу можно выполнить в любой момент запустив её с помощью команды RUN.
Она может быть выполнена многократно без повторного набора текста программы.
Как уже упоминалось, номера строк могут быть в диапазоне от 0 до 65529. Нулевой номер строки используется для специальных целей (например, для блокировки переходов на подпрограммы обработки событий) и поэтому обычно не используется.

Директивы управления системой MSX BASIC
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Помимо операторов общего назначения описанных в справочнике, MSX BASIC располагает еще набором команд-директив для работы с самим текстом программы - изменением, сохранением на внешних носителях и т.д.

Ввод новой программы
~~~~~~~~~~~~~~~~~~~~
Ввод новой программы начинается с директивы NEW, которая производит очистку оперативной памяти от предшествующей программы и ее переменных. Время набора программы можно сократить, воспользовавшись директивой AUTO, которая устанавливает режим автоматической нумерации строк. Первый ее аргумент определяет новый начальный номер строки, или воспринимает в виде точки (.) номер только что модифицированной строки, или строки в которой возникла ошибка. По умолчанию начальный номер принимается равным 10. Второй аргумент задает шаг нумерации. При его отсутствии шаг принимается равным 10. Строки обычно нумеруют через 10, для того, чтобы легко можно было вставить строку между двумя существующими. Так, если необходимо вставить строку между строками:

10 CLS
20 PRINT 2*2

Необходимо набрать, скажем, строку с номером 15:

15 PRINT 3*7

В результате получим:

10 CLS
15 PRINT 3*7
20 PRINT 2*2

Если первый аргумент завершается запятой, а второй аргумент отсутствует (например AUTO 200, ), то устанавливается шаг нумерации выбранный ранее по директеве AUTO.
Отмена режима автоматической нумерации поизводится нажатием клавиш CTRL+STOP или CTRL+C (под клавишей STOP подразумевается ненужная клавиша ПС).
Одной из наиболее распространенных ошибок начинающих пользователей является исправления, удаления или замена фрагментов ранее набранной программы без нажатия клавиши <ВК>. При такого рода коррекциях курсор необходимо установить на исправленную строку (в любом ее месте) и нажать <ВК>. В противном случае исправление останется только на экране, а в программу не попадет.
Одиночную строку проще удалить, набрав ее номер (без ничего)
и нажав <ВК>, т.е введя пустую программную строку. Для удаления
фрагмента программы лучше воспользоваться директивой DELETE. Так DELETE 10 удалит 10-ю строку. DELETE 100-300 удалит все строки с 100 по 300 включительно. DELETE -50 удалит все строки сначала и до 50-ой включительно.

Примечание: вводить директиву DELETE в формате DELETE N-нельзя (т.е. удалить все строки начиная с N и до конца
программы). Это сделано для предотвращения случайного удаления больших обьектов программы.

Ход программы можно приостановить нажав клавишу STOP (ПС).
При этом на экране высветится курсор. Но программа не прервалась насовсем (сообщение "OK" не вывелось). Повторное нажатие
STOP продолжит выполнение программы. Комбинация клавиш CTRL+STOP
прерывает выполнение программы. Продолжить ее выполнение можно
по директиве CONT.
Чтобы просмотреть всю программу или только ее часть используется оператор LIST. Эта команда без параметров выводит на
экран текст всей программы. Вывод можно приостановить клавишей STOP (ПС) и прервать CTRL+STOP. Можно, однако, конкретизировать
интересующий вас фрагмент.
LIST N1-N2 - текст программы со строки N1 по N2;
LIST N1- - текст программы со строки N1 и до конца программы;
LIST -N2 - текст программы от начала и до N2;
LIST N - вывод строки N;
Команда LLIST аналог LIST, но текст выдается на принтер.

Запоминание и загрузка программных файлов
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Чтобы сохранить текущую программу на внешних носителях (магнитофон, RAM-диск) используется команда SAVE или CSAVE.

SAVE "имя"[,A]
CSAVE "имя"[,скорость]

SAVE записывает программу в любой файл, CSAVE - только на кассетный магнитофон.
Просто SAVE "имя" записывает программу на RAM-диск используя функции ORDOS. Если в памяти нет ORDOS, то реакция компьютера на эту команду неопределенная (может быть самая плачевная).
Если параметр A не указан, тогда файл записывается во внутреннем формате, т.е так, как программа хранится в памяти. Разница между текстом программы, выводимой оператором LIST и внутренним его представлением заключается в том, что бейсик заменяет отдельные служебные слова-операторы кодами, числовые константы переводятся в машинное представление и т.д. Таким образом обьем требуемой памяти уменьшается (оператор PRINT требовал бы 5 байт, а так только 1). Если же указан параметр A, то формируется файл, имеющий такой же вид что мы получаем при операторе LIST. Эту программу можно распечатать, отредактировать в текстовом редакторе, или переслать на другой интерпретатор. Если имя имеет вид "CAS: имя" тогда запись будет вестись на кассетный магнитофон. При этом скорость передачи данных устанавливается оператором SCREEN (см.справочник). На кассету программа записывается только в ASCII формате независимо от того, указан оператор A или нет. Запись ведется блоками по 256 байт, что позволяет потом считывать эти данные в программе, обращаясь к ним как к файлу (подробнее смотри работу с файлами). Чтобы производить запись программ на кассету во внутреннем представлении предусмотрен оператор CSAVE (в имени необязательно использовать идентификатор магнитофона "саS:"). Скорость указывается в виде параметра 1-1200 бод, 2-2400 бод.

Загрузка программ производится с помощью операторов:

LOAD"имя"[,R]
RUN"имя"
CLOAD["имя"]
MERGE"имя"

Команды LOAD и RUN очищают память и загружают программу с
диска (кассеты). После этого по команде RUN она запускается. Если у оператора LOAD присутствует параметр R тогда действие анологично RUN "имя". Если имя содержит идентификатор кассетного
магнитофона, например:

LOAD"CAS:PROG",R

тогда считывание происходит с кассеты. Оператор CLOAD или CLOAD "имя" считывают с кассеты программы, записанные по CSAVE (при этом скорость подстраивается автоматически). Прервать чтение можно, нажав CTRL+STOP. Если указан просто оператор CLOAD или RUN или LOAD с именем файла "CAS:" тогда выполняется считывание первого попавшегося файла. Если же имя указано явно, то будет проводится чтение только указанного файла, а все остальные будут игнорироваться. При этом выдается сообщение:

SKIP: имя - если имя отличается от указанного, то файл пропускается;
FOUND: имя - найден интересующий файл, началось считывание;

По директиве MERGE "имя" можно соеденить программу находящуюся в памяти с программой, находящейся на ленте (диске). При этом файл должен быть записан обязательно в ASсII формате иначе содержимое памяти очистится и произойдет обыкновенная загрузка. Если в подгружаемой программе есть строки с номерами которые есть в существующей программе, то они заменяют прежние операторы. Команда RENUM [N1][,N2][,N3] позволяет перенумеровать строки программы. Эта команда без параметров нумерует строки, начиная с 10 через 10. Так программа:

1 PRINT 5
7 LIST

после выполнния RENUM<ВК> будет иметь вид:

10 PRINT 5
20 LIST

Первый параметр (N1) указывает с какой строки начинать нумерацию. Так наша же программа после выполнения директивы RENUM 100
примет вид:

100 PRINT 5
110 LIST

второй параметр указывает с какой строки программы начинать замену строк:

1 CLS 1 CLS
2 PRINT 7 ==> RENUM 200,2 ==> 200 PRINT 7
3 GOTO 2 210 GOTO 200

И наконец, третий параметр задает шаг перенумерации:

1 CLS 1 CLS
2 PRINT 7 ==> RENUM 200,2,1 ==> 200 PRINT 7
3 GOTO 2 201 GOTO 200

Процедура RENUM заменяет не только номера строк программы, но и производит замену условных и безусловных переходов (THEN, GOTO, GOSUB), выход из подпрограмм (RETURN, RESUME), восстановление указателей данных (RESTORE) и указание строк, используемые с системной переменной ERL.

Отладка программы
~~~~~~~~~~~~~~~~~

Существуют две директивы позволяющие облегчить отладку программы, это:

ТRON и TROFF.

Первая включает, а вторая выключает режим трассировки. При
включенном режиме трассировки бейсик каждый раз, переходя к обработке новой строки выводит ее номер в квадратных скобках:

10 PRINT 7*7
20 PRINT 5
30 END
TRON
RUN
[10] 49
[20] 5
[30]
OK
_

По последовательности выдаваемых номеров можно судить о правильности выполнения программы. И наконец, запуск программы, осуществляется командой:

RUN [номер строки]

Просто команда RUN очищает все переменные и запускает программу с самой первой строки. Если указать номер строки, то запуск производится с этой строки.
Заканчивается программа оператором END. При этом, END может стоять необязательно последним. Он может находится в любом месте программы. Как только выполнение доходит до END программа останавливается.
Команда STOP прерывает выполнение программы и выдает сообщение "BREAK IN..." (останов в такой-то строке). Фактически, все происходит, так как будто-бы вы нажали CTRL+STOP в этом месте программы. Продолжить выполнение можно по директиве CONT.

 

 

Купить платы, наборы микросхем на Орион-128, КР565РУ5В, КР565ру7В, к565ру5г AU, к565ру7г Au в позолоте, куплю микросхемы

 

Полезные и интересные статьи

На предыдущую страницу  На главную страницу  На следующую страницу