====== MSX X-BASIC ======
%% X-BASIC %%, известный как %% MSX-BASIC KUN %%, %% KUN BASIC %% или %% TURBO BASIC (Turbo-BASIC) %% это run-time компилятор для [[msx:basic:|]], который обычно используется для ускорения существующих программ на [[msx:basic:|]] и создания [[msx:demo:demo|демо]] и игр.
{{:msx:x-basic:x-basic-2.1.rom|}}, [[https://zx-pk.ru/attachment.php?attachmentid=68289&d=1551454539|оригинал]]
Его развитием является [[msx:nestor_basic:|]].
====== KUN BASIC ======
%%MSX-BASIC-KUN%% (Компилятор BASIC)
автор J.Suzuki 1989
\\ этот документ и примеры составлены Sho Endo
\\ перевод на английский выполнен LASP((Смотри [[#xbasic1|Примечание 1]]))
\\ текст перепечатан из LASP без изменений Нестором Сориано
\\ корректура и перевод на русский — ATroubleshooter
%%MSX-BASIC-KUN%% это потрясающий компилятор BASIC. Он компилирует программу на [[msx:basic:|]] в ОЗУ за считанные секунды и она работает в 15-100 раз быстрее!! %%X-BASIC%% может компилировать почти все операторы и функции [[msx:basic:|]] и поддерживает строки и числа с плавающей запятой. Попробовав его, вы поймете, что вам теперь ни к чему учить ассемблер Z-80. Игры в реальном времени, компьютерная графика, [[msx:demo:demo|демонстрационные программы]] могут быть написаны, сочетая простоту [[msx:basic:|]] и скорость машинного кода.
===== Применение =====
==== 1. Установка и Общие сведения ====
Данный компилятор продается в Японии в виде картриджа за 4500 йен. Для использования, вам нужно просто вставить его в слот. Также, вы можете найти этот компилятор в MSX2+ компьютерах Sanyo, в ПЗУ. А ещё, он может быть загружен в ОЗУ (с 4000h по 7FFFh) из [[msx:dos:|]], что мы сейчас и проделаем. Просто запустите ''X.BAT'' из [[msx:dos:|]].
A>x
set40 xbasic.bin
basic
.
.
Ok
{{:msx:x-basic:xbasic.bin1.0.zip |Скачать X-BASIC 1.0 в формате .bin и утилиту SET40.COM}}
Теперь вы в режиме Бейсика, всё как обычно — за исключением того, что вам доступны две
новые команды:
CALL RUN
CALL TURBO ON/OFF
''CALL'' может быть записано как "_" (подчеркивание). Будем использовать такую запись далее.
''_RUN'' это команда для компиляции и запуска всей программы в памяти. Если она находит ошибку она останавливается и выдает сообщение.
''_TURBO ON'' это оператор, определяющий начало турбо-блока.
\\ ''_TURBO OFF'' обозначает конец турбо-блока.
Турбо–блок это часть программы, которую вы хотите исполнять быстро. Если, программа в целом, содержит какие-то некомпилируемые операторы, вы можете определить блок для компиляции, используя эту конструкцию.
Пример:
100 SCREEN 8:DEFINT A-Z
110 BLOAD"PICTURE",S
120 _TURBO ON
130 FOR X=0 TO 255
140 LINE(X,0)-(X,211),0
150 NEXT X
160 _TURBO OFF
170 GOTO 170
Эта программа не может быть запущена с помощью ''_RUN'', потому что ''BLOAD'' это одна из команд, которые не могут компилироваться. Если запустить это с помощью ''RUN'', участок программы с 130–й по 150–ю строки будет исполнен быстро.
Поскольку ''_RUN"FILE"'' не поддерживается, вам придется добавить ''_TURBO ON'' и ''_TURBO OFF'' в начале и в конце программы, если вы хотите использовать ''RUN"FILE"'' и получить эффект.
100 FOR I=0 TO 999
110 ...
.
.
.
890 'END OF THE PROGRAM
Итак, это может быть запущено через _RUN, или, после добавления ''10 _TURBO ON'' и ''900 _TURBO OFF'', через ''RUN"FILE"''.
Если попробовать запустить посредством ''_RUN'' программу, содержащую ''_TURBO ON/OFF'', произойдет ошибка.
''_TURBO ON/OFF'' нельзя писать в одну строку с другими операторами.
Конструкции ''_TURBO ON/OFF'' не могут быть вложенными. Но можно иметь много турбо–блоков в программе.
Переменные и массивы существуют отдельно для турбо–блоков и остальной программы.
После завершения турбо–блока, переменные и массивы, используемые в турбо–блоке, будут потеряны. Только переменные целочисленного типа могут быть определены как общие.
100 DEFINT A-Z:DIM C(2),D(2)
110 A=1:B=2:C(0)=3:D(0)=4
120 _TURBO ON(A,C())
130 DIM D(2)
140 PRINT A,B,C(0),D(0)
150 A=5:B=6:C(0)=7:D(0)=8
160 _TURBO OFF
170 PRINT A,B,C(0),D(0)
RUN
1 0 3 0
5 2 7 4
Ok
Числа с плавающей запятой, используемые в компиляторе, имеют особый трехбайтовый формат. Его точность примерно 4.5 знака. Двойная точность не поддерживается.
Массивы должны статически объявляться в начале.
Этот компилятор работает с программой на BASIC в ОЗУ, и помещает сгенерированный объектный код и переменные в незанятую часть ОЗУ. Поэтому есть ограничение на размер исходной программы примерно в 10Кб. Большие массивы, строковые переменные (каждая занимает 256 байт), ''CLEAR ???,&H????'' сделает ситуацию ещё напряженней, как вы понимаете. Скомпилированные объектные файлы не могут быть сохранены как самостоятельные программы.
Поддерживаются прерывания, такие как ''KEY(1) ON, OFF'' и т.п. Но их использование понизит качество исполняемого объектного кода в плане размера и скорости.
Некоторые операторы могут работать некорректно.
100 GOTO 130
110 A=3/2
120 END
130 DEFINT A-Z
140 GOTO 110
Если запустить это через RUN, то A будет 1. Если запустить через _RUN, A будет 1.5. В случае интерпретатора, DEF??? сработает в порядке его очереди исполнения, тогда как в противном случае это зависит от номера строки.
Мало-мальски сложная строковая операция легко может вызвать ошибку "String formula too
complex". Потому что данный компилятор имеет только один уровень стэка для этого. Разбейте длинную строковую формулу на несколько небольших, в таком случае.
Если запустить посредством ''_RUN'' бесконечную программу, вы не сможете её прервать. Сделайте выход по нажатой клавише.
100 GOTO 100 'Нажмите ресет или выключите питание чтобы остановить
100 IF INKEY$="" THEN 100
110 END
будет лучше.
==== 2. Отличия от интерпретатора MSX-BASIC ====
Список операторов, команд и функций, которые не могут быть откомпилированы:
AUTO
BASE
BLOAD
BSAVE
CALL
CDBL
CINT
CLEAR
CLOAD
CLOAD?
CLOSE
CONT
CSAVE
CSNG
CVD
CVI
CVS
DEFFN
DELETE
DRAW
DSKF
EOF
ERASE
ERL
ERR
ERROR
EQV
FIELD
FILES
FPOS
FRE
GET
IMP
INPUT#
KEY LIST
LFILES
LINEINPUT#
LIST
LLIST
LOAD
LOC
LOF
LPRINT USING
LSET
MAXFILES
MERGE
MOTOR
MKD$
MKI$
MKS$
NAME
NEW
ON ERROR GOTO
ON INTERVAL GOSUB (из-за ошибки)
OPEN
PLAY
PRINT#
PRINT USING
PUT KANJI
RENUM
RESUME
RSET
SAVE
SPC
TAB
TRON
TROFF
WIDTH
Список тех, которые имеют ограничения:
|''CIRCLE''|Только окружности, никаких дуг или эллипсов.|
|''COPY''|Только пересылки в видеопамяти.|
|''DEFDBL''|То же что и ''DEFSNG''.|
|''DIM''|Должен определяться только вначале программы либо внутри блока компиляции.|
|''INPUT''|Может принимать только одну переменную.|
|''KEY''|Только для ''ON KEY GOSUB'', ''KEY(n) ON/OFF''.|
|''LOCATE''|Обе координаты должны быть определены. Параметр переключения курсора недоступен.|
|''NEXT''|Имя переменной цикла после ''NEXT'' не может быть опущено.|
|''ON''|''ON STOP GOSUB'', ''ON INTERVAL GOSUB'' не поддерживаются.|
|''PRINT''|Разделители обрабатываются иначе. Нет выравнивания для цифр.|
|PUT|Только ''PUT SPRITE''|
|RUN|Переменные не инициализируются.|
|''SCREEN''|Только номер режима и размер спрайтов.|
|SET|Только ''SET PAGE''|
|''STOP''|Такое же поведение как у ''END''|
|''USR''|Параметром может быть только Intrger|
|''VARPTR''|Дескриптор файла не может быть передан в качестве параметра.|
В остальном, нет существенной разницы.
Мы видим, что, как правило, не могут быть скомпилированы команды и функции ввода–вывода, а также команды редактирования. Конечно же они доступны в интерактивном режиме, и вне турбо–блоков. Вы можете редактировать, отлаживать и сохранять программы в [[msx:basic:|]] и запускать их, используя ''_RUN''.
Если вы хотите использовать ''PRINT#'' для вывода символов на ''GRP:'', используйте его вне турбо-блока. Иначе, изучите пример PRINT.TRB.
Если нужно использовать ''PLAY'', используйте расширение CompileBGM, и выводите звук с помощью ''USR(n)''.
==== 3. Новые возможности, которые были добавлены ====
Появились 3 специальные команды, которые вводятся как строка комментария, начинающаяся с определенного символа:
* #I — Означает INLINE. Позволяет написать короткую программу в машинных кодах.
100 DEFINT A-Z
110 K=1
120 '#I &H2A,K
130 '#I &HF3,&HCD,@150,&HFB
140 END
150 'SUB
160 RETURN
120 означает LD HL,(K) ; K должна быть простой переменной целого типа.
130 означает DI
CALL @150 ; Будьте осторожны, эта строка не будет переименована с помощью RENUM.
EI
* #C — Означает CLIP (отсечение). В экранных режимах с 5 по 8 (за исключением ''PAINT'' и ''CIRCLE''), это будет включать и отключать отсечение.
10 SCREEN 8
20 '#C-
30 LINE(0,0)-(255,255) 'Y CLIPPED
40 IF INKEY$="" THEN 40
50 '#C+
60 LINE(0,0)-(255,255) 'NOT CLIPPED
70 IF INKEY$="" THEN 70
* #N — Проверка на переполнение в ходе NEXT.
10 FOR I%=0 TO &H7FFF
20 NEXT I%
\\ Эта программа завершится ошибкой "Overflow error" в [[msx:basic:|]]. А будучи запущена путем ''_RUN'', она войдет в бесконечный цикл. Если указано ''#N+'', то она завершится нормально. Этот прием тоже снизит эффективность объектного кода. Лучше не использовать без реальной нужды. Чтобы сбросить, нужно указать ''#N-''.
К сведению: В Sanyo MSX-2+ вы найдете новую команду: ''CALL BC''
Эта команда задействует BASIC COMPILER.
Данный текст представляет собой синтез переводов двух источников, датированных [[https://www.msxcomputermagazine.nl/mccm/millennium/milc/basic/topic_0.htm|1986]] и [[http://www.konamiman.com/msx/msx2th/kunbasic.txt|1989]] годами.
{{anchor:xbasic1}} __//Примечание 1//__ \\
Довольно сомнительно, что текст был переведен LASP (бумажный каталог-прейскурант, выходивший в Испании). Этот текст в английском варианте существовал с 1986 года, и был, с минимальными изменениями, напечатан в LASP в 1989 году.
====== Ссылки ======
[[https://www.msxcomputermagazine.nl/mccm/millennium/milc/basic/topic_0.htm|MSX-BASIC-KUN (BASIC COMPILER) | MSX INFORMATIE & LINSTINGS COLLECTIE]]
[[https://konamiman.github.io/MSX2-Technical-Handbook/md/KunBASIC.html|MSX-BASIC-KUN (BASIC COMPILER) | MSX2-Technical-Handbook]]
[[msxorg>wiki/X-BASIC|X-BASIC]]
[[zxpkru>/threads/30182-traktat-o-x-basic-e.html|Трактат о X-Basic'е]]
{{tag>MSX BASIC X-BASIC}}