Очередной вариант Бейсика для ORduino168 c дополнительным ППЗУ 2К. Если дополнительной памяти не имеется, то следует все просто заменить обращениями к внутренней памяти. Комментарии не вычищал, чтобы было видно, что менялось.
Спорные команды SEQ/MSEQ пока отключены, но добавились PUT/GET, по свойствам аналогичные DATA/READ, только работают с байтом данных. Указатель адреса сбрасывается по команде STOP в значение 256. Оператор RESTORE устанавливает значение по параметру.
Новый оператор '@' позволяет запускать команды из ППЗУ, причем, в отличие от ECHAIN, не сбрасывая текущую программу. После выполнения команды из ППЗУ интерпретатор начинает выполнение программы в ОЗУ. Так удобно запускать программы с параметрами, записав их предварительно, например командами:
- Код: Выделить всё
RESTORE512:PUT"A=100",10,13
PUT"Е=100:B=256",10,13,0
Запускаем программу с установленными параметрами:
- Код: Выделить всё
@512
или
- Код: Выделить всё
A=512:@A
Как уже упоминалось, пока не планируется оптимизация кода для сохранения операторов одним байтом. Сделано это для наглядности. Однако объем памяти ограничен, и пришлось идти на небольшую хитрость. В язык были введены синонимы, с помощью которых можно существенно сократить объем программы.
Список синонимов операторов:
'R' аналог RETURN
'C' аналог GOSUB
'H' аналог DWRITE HIGH // Не перестраивает порт в режим OUTPUT
'L' аналог DWRITE LOW // Не перестраивает порт в режим OUTPUT
'W' аналог AWRITE
'M' аналог RESTORE
'D' аналог DELAY
'N' аналог NEXT
'F' аналог FOR
'J' аналог GOTO
'G' аналог GET
'P' аналог PUT
'T' аналог TONE
'I' аналог INPUT
'E' аналог EPOKE
Отдельно следует упомянуть оператор '_', который позволяет выполнить оператор с заданным номером. Например, команды 'TONEW' и '_26' аналогичны. Если переменная А=26, то '_A' тоже будет аналогом TONEW.
Также добавлены синонимы функций
'A' аналог AREAD // Не перестраивает порт в режим INPUT
'D' аналог DREAD // Не перестраивает порт в режим INPUT
'E' аналог EPEEK
Добавлены операторы OR, AND, MOD.
Для примера, программа распечатки дампа памяти.
Начальный код (свободно 58 байт из 256):
- Код: Выделить всё
5 ?@2041,A,"-",A+255:FOR J=0TO15:?A+J*16,$9;
10 FOR I=0TO15:?#EPEEK(I+A+J*16)," ";:NEXT I:?' ';
20 FOR I=0TO15:Q=EPEEK(I+A+J*16):IFQ<0 GOTO60
30 IFQ<31Q=46
60 ?$Q;:NEXT I:?"":NEXT J:?FRE(),@2027
Сжатый код (свободно 91 байт):
- Код: Выделить всё
5 ?@2041,A,"-",A+255:FJ=0TO15:?A+J*16,$9;
10 FI=0TO15:?#E(I+A+J*16)," ";:NI:?' ';
20 FI=0TO15:Q=E(I+A+J*16):IFQ<0J60
30 IFQ<31Q=46
60 ?$Q;:NI:?"":NJ:?FRE(),@2027
?# - печатает форматированное десятизначное число, вида 000,
?@ - выводит на печать цепочку символов из ППЗУ, начиная с заданного адреса,
?$ - выводит на печать символ с заданным кодом.
С помощью интерпретатора легко пишутся короткие программки для управления железом. Для сравнения, программа печати дампа ПЗУ занимает менее 200 байт. Аналогичный кусок кода на Wiring поглотил более 500 (см.метку mem). Его можно сократить, но на Бейсике код располагается, помимо прочего, в ППЗУ, и это, как мне кажется, немного удобнее.
Соединяй и здравствуй.