MK-BASIС

 

язык программирования для компьютеров ChipBasic-16M, ChipBasic-128.

v1.01 (c) 2020-2022 Фаиль Айсулов

 

Лицензия    

Программа регулируется GPL (GNU General Public Licence) версии 3 или более поздней, любое использование программного обеспечения/информации, не соответствующей GPL или за пределами сферы GPL, запрещено! MK-BASIC основан на проекте AVR-ChipBasic, и является его измененной версией. Программа модифицировалась исключительно для собственных нужд. Авторы не дают никаких гарантий на свои программы и не несут ответственности за проблемы, возникшие в результате их использования, даже без подразумеваемой гарантии зрелости рынка или удобства использования для определенной цели.

 

Общие сведения. 

Каждая программа состоит из количества строк максимально допустимых для определнного контроллера, для ATmega328P - 39 строк, ATmega64/128 - 80 строк. Все ключевые слова, кроме функции могут быть сокращены до двух символов. После каждого ключевого слова должен быть пробел.

 

Числа, переменные и функции

ChipBasic знает только один тип данных,int (от -32767 до 32767 включительно). Доступно 26 переменных (A-Z). Константы могут вводится как в десятичной, так и в шестнадцатеричной форме, причем в последней отрицательные значения не допускаются. Шестнадцатеричные числа начинаются с $. Разрешены следующие операции:

+ Сложение

- Вычитание

* Умножение

/ Деление

% Остаток от деления

& Логическая И

# Логическое ИЛИ

Сравнения (=,<>,<,<=,>,>=)

 

Названия функций сокращать нельзя.После имени функции в скобках указывается выражение.

ABS      абсолютное значение

SGN      вычисляет знак (-1,0,1) выражения

NOT      инверсия

SQR      квадратный корень

RND      генератор случайных чисел

DIN      считывание данных IOport

ADC      возвращает аналоговое значение напряжения на указанном пине IOport

XPEEK    считывает данные из внешней микросхемы памяти (пятая микросхема EEPROM)

XPOKE    сохраняет данные на внешнюю микросхему памяти (пятая микросхема EEPROM)

LO       возвращает младший байт

HI       возвращает старший байт

KEY      считывание клавиатуры

COL      флаг столкновения для спрайта 1...4 (0/1)
 

Ключевые слова

LIMIT v,min,max - ограничение диапазона значений переменной.v-переменная, min-минимальное значение, max-максимальное
BREAK – прерывает выполнение программы
END -  завершает работу программы в текущем месте
GOTO -  безусловный переход к определенной строке программы
IF - THEN - условный оператор,  состоит из IF за этим следует выражение. 
FOR - NEXT Для цикла  существует только основная форма без указания ширины шага. Поскольку стек ограничен 9 записями, в программе могут быть только 9 циклов.
CALL - RETURN Оператор перехода в подпрограмму с возвращением из нее. В отличие от большинства диалектов языка basic, GOSUB здесь называется CALL. Так же как и предыдущий оператор, программа ограничена 9 циклами.
CLS - очищает экран
POS Y,X - курсор устанавливается на место с координатами  Y, X
PRINT – вывод  на экран или на последовательный порт
PRINT “HELLO” – вывод на экран
? “HELLO” – сокращенный ввод оператора PRINT
PRINT #0;”HELLO” – вывод на экран
PRINT #1;”HELLO” – вывод на последовательный порт
PRINT @10,10;”HELLO” – Вывод на экран с указанием координат.
PRINT %16 – вывод символа с указанием адреса в таблице символов

SCREEN n - переключение таблицы символов.0-только для системы,1-первая таблица,2-вторая таблица
EMIT - выводит символы по горизонтали, разделенные запятыми, на экран/последовательный порт, в зависимости от того что было выбрано в последний раз.
YEMIT -Выводит символы по вертикали, разделенные запятыми, на экран/последовательный порт, в зависимости от того что было выбрано в последний раз.
LCHAR n - (Начиная с верхней части изображения), n строк символов перемещаются на один символ влево. 
GCHAR v,y,x - определяет символ в позиции y, x и записывает его в переменную v
COLOR v Изменение цвета работает только для операторов  PLOT, BOX и FBOX
Где n 0 до 7,  0=черный, 1=синий, 2=красный, 3=пурпурный, 4=зеленый, 5=голубой, 4=желтый и 7=белый. Если цвет равен 0, пиксели удаляются, информация о цвете не изменяется
PLOT Y,X – рисует «пиксель» в координатах X,Y
DRAW Y1,X1,Y2,X2 - Рисует линию
BOX Y1,X1,Y2,X2 - рисует прямоугольник 
FBOX Y1,X1,Y2,X2 - рисует заполненный прямоугольник 
SDEF n,t,c - определяет спрайт, где n-это номер спрайта (1-4), t- тип (см. ниже) и c- положение знака в таблице символов. Тип t может варьироваться от 0 до 15:
0,8        Один символ
1-7        От 2 до 8 символов по горизонтали
9-15    От 2 до 8 символов по вертикали

Спрайты – состоят  из одного символа, но несколько раз бок о бок по горизонтали или друг на друге по вертикали. Доступны 4 спрайта. Отображается ли спрайт в новом месте, он будет удален заранее на старом месте, если он был виден.
SSHOW n,y,x - спрайт n изображается в позицию Y,X. Если спрайт  нарисован в новой позиции, то он будет удален из предыдущей позиции. Если в новой позиции уже находился другой символ, то спрайт не рисуется в новой позиции, а поднимается флаг столкновения. 
SHIDE n – прячет (удаляет) спрайт
COL(n) – запрос флага на столкновение спрайта n
NOTE n - выводится звук с высотой тона n (полутоновые шаги  от 220 Гц), n=от 0 до 63 выводятся ноты, при N=255 шум. 
INPUT – оператор ввода. Могут быть указаны переменные, разделенные запятыми, вызывают курсор ввода. 
RKEY V - нажатая в данный момент клавиша записывается в переменную V. Если клавиша не нажата, записывается 0. 
WKEY V - ожидается нажатие клавиши, и нажатая клавиша записывается в переменную V. 
KEY - эта функция обеспечивает различные запросы клавиатуры как значение -1,0,1.  Если ни одна из двух кнопок не задействована, возвращается 0 в качестве значения функции. 
KEY(0)    левая Shift возвращает 1, левая CTRL возвращает -1, оба 0 
KEY(1)    правая Shift возвращает 1, правая CTRL возвращает -1, оба 0 
KEY(2)    Клавиша «ВЛЕВО» возвращает -1, клавиша «Вправо» 1 
KEY(3)    Клавиша «ВНИЗ» возвращает -1, клавиша «ВВЕРХ» 1     
WAIT n – пауза на n * 0,1 секунд.  
SYNC n – ожидание n синхронизации изображений 
TSET n - внутренний таймер (10 Гц) устанавливается в значение N 
TGET n - внутренний таймер (10 Гц) считывается и сохраняется в переменную
DIR n - устанавливает направление ввода / вывода IOport
OUT n,b -установка (b=1) или сброс (b=0) пина n для IOport

LED n - управление светодиодом на порту PD5, 1 включить, 0 выключить
SPUT n - байт выводится на последовательный порт 
SGET n –считывается символ с последовательного порта и сохраняется в переменную
ESET A - сохраняет значение переменной A во внутреннем EEPROM
EGET B -считывает значение из внутреннего EEPROM в переменную B

Анимация.

В памяти компьютера две таблицы символов незначительно отличающихся друг от друга, имеющие одинаковую адресацию. Ключевое слово SCREEN используется для выбора таблицы символов, что позволяет анимировать персонаж.

SCREEN 1 – использовать первую таблицу символов для всей системы.

SCREEN 2 – использовать вторую таблицу символов для всей системы.

Программа выводит в середине экрана бегущего кота

Blink

Для управления светодиодом на порту PD5, используется ключевое слово LED.

PROGRAM: BLINK     
01 'BLINK
02 LED 0
03 WAIT 10
04 LED 1
05 WAIT 10
06 GOTO 2
#

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

 

Промежуточное хранение переменной.

В внутреннем EEPROM можно хранить одну переменную типа int (от -32767 до 32767 включительно).

ESET A Сохраняет значение переменной A во внутреннем EEPROM.

EGET B Считывает значение из внутреннего EEPROM в переменную B.

Ключевые слова ESET и EGET можно использовать для хранения промежуточных данных, в условиях ограниченного количества имен переменных.

Пример:

01 A=1:B=2

02 ESET A

03 A=B

04 EGET B

05 PRINT A,B

Результат A=2,B=1

Примеры программ

PROGRAM: CATRUN

01 POS 12,14

02 SCREEN 1

03 EMIT 117,118

04 WAIT 3

05 POS 12,14

06 SCREEN 2

07 EMIT 117,118

08 WAIT 3

09 GOTO 1

#

Программа для считывания сканкода клавиатуры

PROGRAM: SCANCODE
01 '------------------------
02 'MINIKOT MK-1
03 'PROGRAM "SCANCODE"
04 '(C) FAIL' AYSULOV
05 'WWW.AYSULOV.RU
06 '------------------------
07 X=-1:Y=3:A=-4:B=7
08 PRINT @0,10;"SCANCODE"
09 COLOR 5:DRAW 1,0,1,29 
10 '------------------------
11 WKEY P
12 X=X+1:A=A+4
13 IF X>29 Y=Y+1:X=0
14 IF A>27 B=B+1:A=0
15 LI X,0,29:LI Y,2,21
16 LI A,0,29:LI B,7,21
17 PRINT @Y,X;%P
18 PRINT @B,A;P
19 IF P=233 CLS :GOTO 01 
20 GOTO 10
#

Spacecat

 

Динамичная игра. Персонаж по прозвищу Миникот летит сквозь метеоритный дождь на своем звездолете. Вам необходимо пролететь не врезаясь в куски метеорита. Управление клавишами "ВВЕРХ", "ВНИЗ", "ВЛЕВО", "ВПРАВО".

 

PROGRAM: SPACECAT  
01 CO 1:DRAW 21,0,21,29:U=1
02 Y=0:X=30:H=0:V=0:P=10:G=0
03 IF U=1 U=2:SCREEN U:GO 5
04 IF U=2 U=1:SCREEN U:GO 5
05 Y=RND(20):S=RND(6)+9
06 POS Y,X:EMIT S:LCHAR 21
07 GC F,V,H+3:POS V,H:EM 0,0,0
08 K=KEY(3):V=V-K:LIMIT V,0,19
09 L=KEY(2):H=H+L:LIMIT H,1,27
10 IF (F>8)&(F<16) CALL 16
11 POS V,H: EMIT 0,29,30,31
12 NO V+H:IF P<0 GOTO 20
13 IF G>50 P=P+1:G=0:CALL 18
14 IF P>20 NO 55:NO 56:GOTO 22
15 WAIT 1:G=G+1:GOTO 3
16 POS V,H+2:EMIT 122:NO 255
17 WAIT 5:EMIT 0,0,0:P=P-1
18 POS 22,2
19 PRINT "SKILL -";P;"  ";:RE
20 CLS :BOX 8,8,12,20
21 POS 10,10:? "GAME OVER":EN
22 POS 10,10:? "YOU WIN!"
#

Keysim

 

Клавиатурный тренажер. Вам необходимо нажать на клавишу с буквой, пока падает соответствующая буква.

PROGRAM: KEYSIM    
01 CLS :COLOR 5:BOX 0,0,22,29
02 COLOR 1:DRAW 2,4,2,23
03 FOR E=1 TO 28
04 POS 20,E:YEMIT 9,12:NEXT 
05 FOR E=0 TO 50
06 POS 1,4:? "RIGHT";T
07 POS 1,16:? "MISSED";E-T
08 X=RND(26)+2:I=RND(25)+65
09 FOR Y=4 TO 20
10 POS Y-1,X: EMIT 0
11 POS Y,X: EMIT I
12 WAIT 1:RKEY P
13 IF P=I T=T+1:NOTE 255
14 IF P=I POS Y,X:EMIT 121
15 IF P=I WAIT 1
16 IF P=I POS Y,X:? " ":Y=20
17 NEXT :NEXT 
18 IF T<26 POS 10,10:?"LOST"
19 IF T>25 POS 10,12:?"WIN"
20 WKEY Z:
#

Drawmap

Графический редактор.

"ВВЕРХ", "ВНИЗ", "ВЛЕВО", "ВПРАВО"- перемещение по экрану. Page Up, Page Down – выбор графического символа,

С — очистить экран, «ПРОБЕЛ» - зафиксировать символ в позиции(нарисовать).

PROGRAM: DRAWMAP

01 X=0:Y=0:A=1

02 PRINT @Y,X;%A

03 WKEY P

04 IF P=230 A=A+1

05 IF P=231 A=A-1

06 IF A<0 A=128

07 IF A>128 A=0

08 PRINT @Y,X;%0

09 IF P=32 CALL 15

10 IF P=67 CLS

11 Y=Y-KEY(3):X=X+KEY(2)

12 LI Y,0,21:LI X,0,29

13 GOTO 2

14

15 PRINT @Y,X;%A

16 X=X+1:IF X>29 X=29

17 RETURN

#

Pong

Классическая игра PONG, управление Alt, Shift.

PROGRAM: PONG      
01 SD 1,11,1:SD 2,11,2
02 BOX 1,0,22,29:SD 3,0,12
03 X=15:Y=10:E=1:F=1
04 IF RND(1)=1 E=-1
05 SY 2:A=A-KEY(0):LI A,2,18
06 SSHOW 1,A,1:B=B-KEY(1)
07 LI B,2,18:SSHOW 2,B,28
08 P=(P+1)%2:IF P>0 GO 5
09 X=X+E:Y=Y+F:SSHOW 3,Y,X
10 IF (Y=2)#(Y=21) THEN F=-F
11 IF (Y=2)#(Y=21) NO 20
12 IF COL(3)=1 E=-E:GO 20
13 IF (X>1)&(X<28) GO 5
14 IF X=1 TH R=R+1:X=25:E=-1
15 IF X=28 TH L=L+1:X=2:E=1
16 PO 0,1:?L:PO 0,24:?R
17 NO 255:IF (L=15)#(R=15) EN
18 IF RND(1)=1 THEN F=-1
19 Y=RND(10)+6:GOTO 5
20 X=X+E:NO 13:GO 5
#