うおーるぼっと版 豊四季タイニーBASIC

Dependencies:   BufferSerial Servo TB6612FNG2 mbed

豊四季タイニーBASICをうおーるぼっとに移植してみました。

Components / Wallbot
This robot has switch, line sensors and motors. It controls by mbed.

豊四季タイニーBASICの詳細はこちらをどうぞ。 https://vintagechips.wordpress.com/2012/06/14/%E8%B1%8A%E5%9B%9B%E5%AD%A3%E3%82%BF%E3%82%A4%E3%83%8B%E3%83%BCbasic%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9%E5%85%AC%E9%96%8B/

mbedドライブに"AUTO.BAS"というファイル名でプログラムを保存しておくと電源投入時に自動実行します。 自動実行したくない時は、SW2を押したまま電源投入して下さい。

[MOVEコマンドのフォーマット]

MOVE 左車輪速度 , 右車輪速度 , WAITタイマ(ms)

速度の値 : -100 〜 100

その他詳細は、"ttbasic.cpp"を見て下さい。

Committer:
robo8080
Date:
Sat Sep 05 00:29:26 2015 +0000
Revision:
0:2206b894635f
test1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
robo8080 0:2206b894635f 1 /*
robo8080 0:2206b894635f 2 TOYOSHIKI TinyBASIC V1.0
robo8080 0:2206b894635f 3 Reference source
robo8080 0:2206b894635f 4 (C)2012 Tetsuya Suzuki, All rights reserved.
robo8080 0:2206b894635f 5 */
robo8080 0:2206b894635f 6
robo8080 0:2206b894635f 7 // Compiler requires description
robo8080 0:2206b894635f 8 //#include <stdlib.h>
robo8080 0:2206b894635f 9 //#include "sci.h"
robo8080 0:2206b894635f 10 #include "mbed.h"
robo8080 0:2206b894635f 11 #include "BufferSerial.h"
robo8080 0:2206b894635f 12 #include "Servo.h"
robo8080 0:2206b894635f 13 #include "TB6612.h"
robo8080 0:2206b894635f 14
robo8080 0:2206b894635f 15 LocalFileSystem local("local"); // Create the local filesystem under the name "local"
robo8080 0:2206b894635f 16 BufferSerial pc(USBTX, USBRX, 2000);
robo8080 0:2206b894635f 17 //BufferSerial pc(p9, p10, 2000);
robo8080 0:2206b894635f 18 Servo servo0(p25);
robo8080 0:2206b894635f 19 Servo servo1(p26);
robo8080 0:2206b894635f 20 TB6612 left(p21,p12,p11);
robo8080 0:2206b894635f 21 TB6612 right(p22,p14,p13);
robo8080 0:2206b894635f 22 DigitalOut out0(LED1);
robo8080 0:2206b894635f 23 DigitalOut out1(LED2);
robo8080 0:2206b894635f 24 DigitalOut out2(LED3);
robo8080 0:2206b894635f 25 DigitalOut out3(LED4);
robo8080 0:2206b894635f 26 DigitalIn in0(p29); //SW2
robo8080 0:2206b894635f 27 DigitalIn in1(p30); //SW3
robo8080 0:2206b894635f 28 AnalogIn ain0(p15); //Photo0
robo8080 0:2206b894635f 29 AnalogIn ain1(p16); //Photo1
robo8080 0:2206b894635f 30 AnalogIn ain2(p17); //Photo2
robo8080 0:2206b894635f 31 AnalogIn ain3(p18); //Photo3
robo8080 0:2206b894635f 32
robo8080 0:2206b894635f 33 void io_init()
robo8080 0:2206b894635f 34 {
robo8080 0:2206b894635f 35 pc.baud(115200);
robo8080 0:2206b894635f 36 in0.mode(PullUp);
robo8080 0:2206b894635f 37 in1.mode(PullUp);
robo8080 0:2206b894635f 38 out0 = 0; out1 = 0; out2 = 0; out3 = 0;
robo8080 0:2206b894635f 39 servo0.calibrate(0.0009,180.0);
robo8080 0:2206b894635f 40 servo1.calibrate(0.0009,180.0);
robo8080 0:2206b894635f 41 // servo0.calibrate(0.0006,180.0); //RS306MD
robo8080 0:2206b894635f 42 // servo1.calibrate(0.0006,180.0); //RS306MD
robo8080 0:2206b894635f 43 servo0 = 0.5; servo1 = 0.5;
robo8080 0:2206b894635f 44 left = 0;
robo8080 0:2206b894635f 45 right = 0;
robo8080 0:2206b894635f 46
robo8080 0:2206b894635f 47 }
robo8080 0:2206b894635f 48
robo8080 0:2206b894635f 49 // Depending on device functions
robo8080 0:2206b894635f 50 // TO-DO Rewrite these functions to fit your machine
robo8080 0:2206b894635f 51 // And see 'getrnd()'
robo8080 0:2206b894635f 52 //void c_putch(char c){putch2(c);}
robo8080 0:2206b894635f 53 //char c_getch(){return getch2();}
robo8080 0:2206b894635f 54 //char c_kbhit(){return(kbhit2());}
robo8080 0:2206b894635f 55 void c_putch(char c){pc.putc(c);}
robo8080 0:2206b894635f 56 char c_getch(){return pc.getc();}
robo8080 0:2206b894635f 57 char c_kbhit(){return(pc.readable());}
robo8080 0:2206b894635f 58 void newline(void){
robo8080 0:2206b894635f 59 c_putch(13); //CR
robo8080 0:2206b894635f 60 c_putch(10); //LF
robo8080 0:2206b894635f 61 }
robo8080 0:2206b894635f 62
robo8080 0:2206b894635f 63 // TOYOSHIKI TinyBASIC symbols
robo8080 0:2206b894635f 64 // TO-DO Rewrite defined values to fit your machine as needed
robo8080 0:2206b894635f 65 #define SIZE_LINE 64 //Command line buffer length + NULL
robo8080 0:2206b894635f 66 #define SIZE_IBUF 64 //i-code conversion buffer size
robo8080 0:2206b894635f 67 #define SIZE_LIST 1024 //List buffer size
robo8080 0:2206b894635f 68 #define SIZE_ARRY 32 //Array area size
robo8080 0:2206b894635f 69 #define SIZE_GSTK 6 //GOSUB stack size(2/nest)
robo8080 0:2206b894635f 70 #define SIZE_LSTK 15 //FOR stack size(5/nest)
robo8080 0:2206b894635f 71
robo8080 0:2206b894635f 72 // RAM mapping
robo8080 0:2206b894635f 73 char lbuf[SIZE_LINE]; //Command line buffer
robo8080 0:2206b894635f 74 unsigned char ibuf[SIZE_IBUF]; //i-code conversion buffer
robo8080 0:2206b894635f 75 short var[26]; //Variable area
robo8080 0:2206b894635f 76 short arr[SIZE_ARRY]; //Array area
robo8080 0:2206b894635f 77 unsigned char listbuf[SIZE_LIST]; //List area
robo8080 0:2206b894635f 78 unsigned char* clp; //Pointer current line
robo8080 0:2206b894635f 79 unsigned char* cip; //Pointer current Intermediate code
robo8080 0:2206b894635f 80 unsigned char* gstk[SIZE_GSTK]; //GOSUB stack
robo8080 0:2206b894635f 81 unsigned char gstki; //GOSUB stack index
robo8080 0:2206b894635f 82 unsigned char* lstk[SIZE_LSTK]; //FOR stack
robo8080 0:2206b894635f 83 unsigned char lstki; //FOR stack index
robo8080 0:2206b894635f 84
robo8080 0:2206b894635f 85 // Prototypes (necessity minimum)
robo8080 0:2206b894635f 86 short iexp(void);
robo8080 0:2206b894635f 87
robo8080 0:2206b894635f 88 // Keyword table
robo8080 0:2206b894635f 89 const char* kwtbl[] = {
robo8080 0:2206b894635f 90 "GOTO", "GOSUB", "RETURN",
robo8080 0:2206b894635f 91 "FOR", "TO", "STEP", "NEXT",
robo8080 0:2206b894635f 92 "IF", "REM", "STOP",
robo8080 0:2206b894635f 93 // "INPUT", "PRINT", "LET",
robo8080 0:2206b894635f 94 "INPUT", "PRINT", "OUT", "SERVO", "WAIT", "MOVE", "LET",
robo8080 0:2206b894635f 95 ",", ";",
robo8080 0:2206b894635f 96 "-", "+", "*", "/", "(", ")",
robo8080 0:2206b894635f 97 ">=", "#", ">", "=", "<=", "<",
robo8080 0:2206b894635f 98 // "@", "RND", "ABS", "SIZE",
robo8080 0:2206b894635f 99 "@", "RND", "ABS", "INP", "AIN", "SIZE",
robo8080 0:2206b894635f 100 // "LIST", "RUN", "NEW"
robo8080 0:2206b894635f 101 "LIST", "RUN", "LOAD", "NEW"
robo8080 0:2206b894635f 102 };
robo8080 0:2206b894635f 103
robo8080 0:2206b894635f 104 // Keyword count
robo8080 0:2206b894635f 105 #define SIZE_KWTBL (sizeof(kwtbl) / sizeof(const char*))
robo8080 0:2206b894635f 106
robo8080 0:2206b894635f 107 // i-code(Intermediate code) assignment
robo8080 0:2206b894635f 108 enum{
robo8080 0:2206b894635f 109 I_GOTO, I_GOSUB, I_RETURN,
robo8080 0:2206b894635f 110 I_FOR, I_TO, I_STEP, I_NEXT,
robo8080 0:2206b894635f 111 I_IF, I_REM, I_STOP,
robo8080 0:2206b894635f 112 // I_INPUT, I_PRINT, I_LET,
robo8080 0:2206b894635f 113 I_INPUT, I_PRINT, I_OUT, I_SERVO, I_WAIT, I_MOVE, I_LET,
robo8080 0:2206b894635f 114 I_COMMA, I_SEMI,
robo8080 0:2206b894635f 115 I_MINUS, I_PLUS, I_MUL, I_DIV, I_OPEN, I_CLOSE,
robo8080 0:2206b894635f 116 I_GTE, I_SHARP, I_GT, I_EQ, I_LTE, I_LT,
robo8080 0:2206b894635f 117 // I_ARRAY, I_RND, I_ABS, I_SIZE,
robo8080 0:2206b894635f 118 I_ARRAY, I_RND, I_ABS, I_INP, I_AIN, I_SIZE,
robo8080 0:2206b894635f 119 // I_LIST, I_RUN, I_NEW,
robo8080 0:2206b894635f 120 I_LIST, I_RUN, I_LOAD, I_NEW,
robo8080 0:2206b894635f 121 I_NUM, I_VAR, I_STR,
robo8080 0:2206b894635f 122 I_EOL
robo8080 0:2206b894635f 123 };
robo8080 0:2206b894635f 124
robo8080 0:2206b894635f 125 // List formatting condition
robo8080 0:2206b894635f 126 #define IS_OP(p) (p >= I_MINUS && p <= I_LT) // Operator style
robo8080 0:2206b894635f 127 #define IS_SEP(p) (p == I_COMMA || p == I_SEMI) // Separator style
robo8080 0:2206b894635f 128 #define IS_TOKSP(p) (/*p >= I_GOTO && */p <= I_LET && p != I_RETURN) // Token style
robo8080 0:2206b894635f 129
robo8080 0:2206b894635f 130 // Error messages
robo8080 0:2206b894635f 131 unsigned char err;// Error message index
robo8080 0:2206b894635f 132 const char* errmsg[] ={
robo8080 0:2206b894635f 133 "OK",
robo8080 0:2206b894635f 134 "Devision by zero",
robo8080 0:2206b894635f 135 "Overflow",
robo8080 0:2206b894635f 136 "Subscript out of range",
robo8080 0:2206b894635f 137 "Icode buffer full",
robo8080 0:2206b894635f 138 "List full",
robo8080 0:2206b894635f 139 "GOSUB too many nested",
robo8080 0:2206b894635f 140 "RETURN stack underflow",
robo8080 0:2206b894635f 141 "FOR too many nested",
robo8080 0:2206b894635f 142 "NEXT without FOR",
robo8080 0:2206b894635f 143 "NEXT without counter",
robo8080 0:2206b894635f 144 "NEXT mismatch FOR",
robo8080 0:2206b894635f 145 "FOR without variable",
robo8080 0:2206b894635f 146 "FOR without TO",
robo8080 0:2206b894635f 147 "LET without variable",
robo8080 0:2206b894635f 148 "IF without condition",
robo8080 0:2206b894635f 149 "Undefined line number",
robo8080 0:2206b894635f 150 "\'(\' or \')\' expected",
robo8080 0:2206b894635f 151 "\'=\' expected",
robo8080 0:2206b894635f 152 "Illegal command",
robo8080 0:2206b894635f 153 "Syntax error",
robo8080 0:2206b894635f 154 "Internal error",
robo8080 0:2206b894635f 155 "Abort by [ESC]"
robo8080 0:2206b894635f 156 };
robo8080 0:2206b894635f 157
robo8080 0:2206b894635f 158 // Error code assignment
robo8080 0:2206b894635f 159 enum{
robo8080 0:2206b894635f 160 ERR_OK,
robo8080 0:2206b894635f 161 ERR_DIVBY0,
robo8080 0:2206b894635f 162 ERR_VOF,
robo8080 0:2206b894635f 163 ERR_SOL,
robo8080 0:2206b894635f 164 ERR_IBUFOF,
robo8080 0:2206b894635f 165 ERR_LBUFOF,
robo8080 0:2206b894635f 166 ERR_GSTKOF,
robo8080 0:2206b894635f 167 ERR_GSTKUF,
robo8080 0:2206b894635f 168 ERR_LSTKOF,
robo8080 0:2206b894635f 169 ERR_LSTKUF,
robo8080 0:2206b894635f 170 ERR_NEXTWOV,
robo8080 0:2206b894635f 171 ERR_NEXTUM,
robo8080 0:2206b894635f 172 ERR_FORWOV,
robo8080 0:2206b894635f 173 ERR_FORWOTO,
robo8080 0:2206b894635f 174 ERR_LETWOV,
robo8080 0:2206b894635f 175 ERR_IFWOC,
robo8080 0:2206b894635f 176 ERR_ULN,
robo8080 0:2206b894635f 177 ERR_PAREN,
robo8080 0:2206b894635f 178 ERR_VWOEQ,
robo8080 0:2206b894635f 179 ERR_COM,
robo8080 0:2206b894635f 180 ERR_SYNTAX,
robo8080 0:2206b894635f 181 ERR_SYS,
robo8080 0:2206b894635f 182 ERR_ESC
robo8080 0:2206b894635f 183 };
robo8080 0:2206b894635f 184
robo8080 0:2206b894635f 185 // Standard C libraly (about same) functions
robo8080 0:2206b894635f 186 char c_toupper(char c) {return(c <= 'z' && c >= 'a' ? c - 32 : c);}
robo8080 0:2206b894635f 187 char c_isprint(char c) {return(c >= 32 && c <= 126);}
robo8080 0:2206b894635f 188 char c_isspace(char c) {return(c <= ' ' &&(c == ' ' || (c <= 13 && c >= 9)));}
robo8080 0:2206b894635f 189 char c_isdigit(char c) {return(c <= '9' && c >= '0');}
robo8080 0:2206b894635f 190 char c_isalpha(char c) {return ((c <= 'z' && c >= 'a') || (c <= 'Z' && c >= 'A'));}
robo8080 0:2206b894635f 191 char* c_strchr(char *s, char c){
robo8080 0:2206b894635f 192 while(*s) {
robo8080 0:2206b894635f 193 if(*s == c) return (s);
robo8080 0:2206b894635f 194 ++s;
robo8080 0:2206b894635f 195 }
robo8080 0:2206b894635f 196 return NULL;
robo8080 0:2206b894635f 197 }
robo8080 0:2206b894635f 198 void c_puts(const char *s) {while(*s) c_putch(*s++);}
robo8080 0:2206b894635f 199 void c_gets(){
robo8080 0:2206b894635f 200 char c;
robo8080 0:2206b894635f 201 unsigned char len;
robo8080 0:2206b894635f 202
robo8080 0:2206b894635f 203 len = 0;
robo8080 0:2206b894635f 204 while((c = c_getch()) != 13){
robo8080 0:2206b894635f 205 if( c == 9) c = ' '; // TAB exchange Space
robo8080 0:2206b894635f 206 if((c == 8) && (len > 0)){ // Backspace manipulation
robo8080 0:2206b894635f 207 len--;
robo8080 0:2206b894635f 208 c_putch(8); c_putch(' '); c_putch(8);
robo8080 0:2206b894635f 209 } else
robo8080 0:2206b894635f 210 if(c_isprint(c) && (len < (SIZE_LINE - 1))){
robo8080 0:2206b894635f 211 lbuf[len++] = c;
robo8080 0:2206b894635f 212 c_putch(c);
robo8080 0:2206b894635f 213 }
robo8080 0:2206b894635f 214 }
robo8080 0:2206b894635f 215 newline();
robo8080 0:2206b894635f 216 lbuf[len] = 0; // Put NULL
robo8080 0:2206b894635f 217
robo8080 0:2206b894635f 218 if(len > 0){
robo8080 0:2206b894635f 219 while(c_isspace(lbuf[--len])); // Skip space
robo8080 0:2206b894635f 220 lbuf[++len] = 0; // Put NULL
robo8080 0:2206b894635f 221 }
robo8080 0:2206b894635f 222 }
robo8080 0:2206b894635f 223
robo8080 0:2206b894635f 224 // GOSUB-RETURN stack
robo8080 0:2206b894635f 225 void gpush(unsigned char* pd){
robo8080 0:2206b894635f 226 if(gstki < SIZE_GSTK){
robo8080 0:2206b894635f 227 gstk[gstki++] = pd;
robo8080 0:2206b894635f 228 return;
robo8080 0:2206b894635f 229 }
robo8080 0:2206b894635f 230 err = ERR_GSTKOF;
robo8080 0:2206b894635f 231 }
robo8080 0:2206b894635f 232
robo8080 0:2206b894635f 233 unsigned char* gpop(){
robo8080 0:2206b894635f 234 if(gstki > 0){
robo8080 0:2206b894635f 235 return gstk[--gstki];
robo8080 0:2206b894635f 236 }
robo8080 0:2206b894635f 237 err = ERR_GSTKUF;
robo8080 0:2206b894635f 238 return NULL;
robo8080 0:2206b894635f 239 }
robo8080 0:2206b894635f 240
robo8080 0:2206b894635f 241 // FOR-NEXT stack
robo8080 0:2206b894635f 242 void lpush(unsigned char* pd){
robo8080 0:2206b894635f 243 if(lstki < SIZE_LSTK){
robo8080 0:2206b894635f 244 lstk[lstki++] = pd;
robo8080 0:2206b894635f 245 return;
robo8080 0:2206b894635f 246 }
robo8080 0:2206b894635f 247 err = ERR_LSTKOF;
robo8080 0:2206b894635f 248 }
robo8080 0:2206b894635f 249
robo8080 0:2206b894635f 250 unsigned char* lpop(){
robo8080 0:2206b894635f 251 if(lstki > 0){
robo8080 0:2206b894635f 252 return lstk[--lstki];
robo8080 0:2206b894635f 253 }
robo8080 0:2206b894635f 254 err = ERR_LSTKUF;
robo8080 0:2206b894635f 255 return NULL;
robo8080 0:2206b894635f 256 }
robo8080 0:2206b894635f 257
robo8080 0:2206b894635f 258 // Print OK or error message
robo8080 0:2206b894635f 259 void error()
robo8080 0:2206b894635f 260 {
robo8080 0:2206b894635f 261 newline();
robo8080 0:2206b894635f 262 c_puts(errmsg[err]);
robo8080 0:2206b894635f 263 newline();
robo8080 0:2206b894635f 264 err = 0;
robo8080 0:2206b894635f 265 }
robo8080 0:2206b894635f 266
robo8080 0:2206b894635f 267 // Print numeric specified columns
robo8080 0:2206b894635f 268 void putnum(short value, short d){
robo8080 0:2206b894635f 269 unsigned char i;
robo8080 0:2206b894635f 270 unsigned char sign;
robo8080 0:2206b894635f 271
robo8080 0:2206b894635f 272 if(value < 0){
robo8080 0:2206b894635f 273 sign = 1;
robo8080 0:2206b894635f 274 value = -value;
robo8080 0:2206b894635f 275 } else {
robo8080 0:2206b894635f 276 sign = 0;
robo8080 0:2206b894635f 277 }
robo8080 0:2206b894635f 278
robo8080 0:2206b894635f 279 lbuf[6] = 0;
robo8080 0:2206b894635f 280 i = 6;
robo8080 0:2206b894635f 281 do {
robo8080 0:2206b894635f 282 lbuf[--i] = (value % 10) + '0';
robo8080 0:2206b894635f 283 value /= 10;
robo8080 0:2206b894635f 284 } while(value > 0);
robo8080 0:2206b894635f 285
robo8080 0:2206b894635f 286 if(sign)
robo8080 0:2206b894635f 287 lbuf[--i] = '-';
robo8080 0:2206b894635f 288
robo8080 0:2206b894635f 289 //String length = 6 - i
robo8080 0:2206b894635f 290 while(6 - i < d){ // If short
robo8080 0:2206b894635f 291 c_putch(' '); // Fill space
robo8080 0:2206b894635f 292 d--;
robo8080 0:2206b894635f 293 }
robo8080 0:2206b894635f 294 c_puts(&lbuf[i]);
robo8080 0:2206b894635f 295 }
robo8080 0:2206b894635f 296
robo8080 0:2206b894635f 297 // Input numeric and return value
robo8080 0:2206b894635f 298 // Called by only INPUT statement
robo8080 0:2206b894635f 299 short getnum(){
robo8080 0:2206b894635f 300 short value, tmp;
robo8080 0:2206b894635f 301 char c;
robo8080 0:2206b894635f 302 unsigned char len;
robo8080 0:2206b894635f 303 unsigned char sign;
robo8080 0:2206b894635f 304
robo8080 0:2206b894635f 305 len = 0;
robo8080 0:2206b894635f 306 while((c = c_getch()) != 13){
robo8080 0:2206b894635f 307 if((c == 8) && (len > 0)){ // Backspace manipulation
robo8080 0:2206b894635f 308 len--;
robo8080 0:2206b894635f 309 c_putch(8); c_putch(' '); c_putch(8);
robo8080 0:2206b894635f 310 } else
robo8080 0:2206b894635f 311 if( (len == 0 && (c == '+' || c == '-')) ||
robo8080 0:2206b894635f 312 (len < 6 && c_isdigit(c))){ // Numeric or sign only
robo8080 0:2206b894635f 313 lbuf[len++] = c;
robo8080 0:2206b894635f 314 c_putch(c);
robo8080 0:2206b894635f 315 }
robo8080 0:2206b894635f 316 }
robo8080 0:2206b894635f 317 newline();
robo8080 0:2206b894635f 318 lbuf[len] = 0;
robo8080 0:2206b894635f 319
robo8080 0:2206b894635f 320 switch(lbuf[0]){
robo8080 0:2206b894635f 321 case '-':
robo8080 0:2206b894635f 322 sign = 1;
robo8080 0:2206b894635f 323 len = 1;
robo8080 0:2206b894635f 324 break;
robo8080 0:2206b894635f 325 case '+':
robo8080 0:2206b894635f 326 sign = 0;
robo8080 0:2206b894635f 327 len = 1;
robo8080 0:2206b894635f 328 break;
robo8080 0:2206b894635f 329 default:
robo8080 0:2206b894635f 330 sign = 0;
robo8080 0:2206b894635f 331 len = 0;
robo8080 0:2206b894635f 332 break;
robo8080 0:2206b894635f 333 }
robo8080 0:2206b894635f 334
robo8080 0:2206b894635f 335 value = 0; // Initialize value
robo8080 0:2206b894635f 336 tmp = 0; // Temp value
robo8080 0:2206b894635f 337 while(lbuf[len]){
robo8080 0:2206b894635f 338 tmp = 10 * value + lbuf[len++] - '0';
robo8080 0:2206b894635f 339 if(value > tmp){ // It means overflow
robo8080 0:2206b894635f 340 err = ERR_VOF;
robo8080 0:2206b894635f 341 }
robo8080 0:2206b894635f 342 value = tmp;
robo8080 0:2206b894635f 343 }
robo8080 0:2206b894635f 344 if(sign)
robo8080 0:2206b894635f 345 return -value;
robo8080 0:2206b894635f 346 return value;
robo8080 0:2206b894635f 347 }
robo8080 0:2206b894635f 348
robo8080 0:2206b894635f 349 // Byte X,L,H -> Short HL
robo8080 0:2206b894635f 350 // Used to get line number or I_NUM value
robo8080 0:2206b894635f 351 short getvalue(unsigned char* ip){
robo8080 0:2206b894635f 352 if(*ip == 0)
robo8080 0:2206b894635f 353 return 32767; // Case X = 0
robo8080 0:2206b894635f 354 return((short)*(ip + 1) + ((short)*(ip + 2) << 8));
robo8080 0:2206b894635f 355 }
robo8080 0:2206b894635f 356
robo8080 0:2206b894635f 357 // Get argument in parenthesis
robo8080 0:2206b894635f 358 short getparam(){
robo8080 0:2206b894635f 359 short value;
robo8080 0:2206b894635f 360
robo8080 0:2206b894635f 361 if(*cip != I_OPEN){
robo8080 0:2206b894635f 362 err = ERR_PAREN;
robo8080 0:2206b894635f 363 return 0;
robo8080 0:2206b894635f 364 }
robo8080 0:2206b894635f 365 cip++;
robo8080 0:2206b894635f 366 value = iexp();
robo8080 0:2206b894635f 367 if(err) return 0;
robo8080 0:2206b894635f 368
robo8080 0:2206b894635f 369 if(*cip != I_CLOSE){
robo8080 0:2206b894635f 370 err = ERR_PAREN;
robo8080 0:2206b894635f 371 return 0;
robo8080 0:2206b894635f 372 }
robo8080 0:2206b894635f 373 cip++;
robo8080 0:2206b894635f 374
robo8080 0:2206b894635f 375 return value;
robo8080 0:2206b894635f 376 }
robo8080 0:2206b894635f 377
robo8080 0:2206b894635f 378 // Search line by line number
robo8080 0:2206b894635f 379 unsigned char* getlp(short lineno){
robo8080 0:2206b894635f 380 unsigned char *lp;
robo8080 0:2206b894635f 381
robo8080 0:2206b894635f 382 lp = listbuf;
robo8080 0:2206b894635f 383 while(*lp){
robo8080 0:2206b894635f 384 if(getvalue(lp) >= lineno)
robo8080 0:2206b894635f 385 break;
robo8080 0:2206b894635f 386 lp += *lp;
robo8080 0:2206b894635f 387 }
robo8080 0:2206b894635f 388 return lp;
robo8080 0:2206b894635f 389 }
robo8080 0:2206b894635f 390
robo8080 0:2206b894635f 391 // Convert token to i-code
robo8080 0:2206b894635f 392 // Return byte length or 0
robo8080 0:2206b894635f 393 unsigned char toktoi(){
robo8080 0:2206b894635f 394 unsigned char i; // Loop counter(i-code sometime)
robo8080 0:2206b894635f 395 unsigned char len; //byte counter
robo8080 0:2206b894635f 396 short value;
robo8080 0:2206b894635f 397 short tmp;
robo8080 0:2206b894635f 398 char* pkw; // Temporary keyword pointer
robo8080 0:2206b894635f 399 char* ptok; // Temporary token pointer
robo8080 0:2206b894635f 400 char c; // Surround the string character, " or '
robo8080 0:2206b894635f 401 char* s; // Pointer to charactor at line buffer
robo8080 0:2206b894635f 402
robo8080 0:2206b894635f 403 s = lbuf;
robo8080 0:2206b894635f 404 len = 0; // Clear byte length
robo8080 0:2206b894635f 405 while(*s){
robo8080 0:2206b894635f 406 while(c_isspace(*s)) s++; // Skip space
robo8080 0:2206b894635f 407
robo8080 0:2206b894635f 408 //Try keyword conversion
robo8080 0:2206b894635f 409 for(i = 0; i < SIZE_KWTBL; i++){
robo8080 0:2206b894635f 410 pkw = (char *)kwtbl[i]; // Point keyword
robo8080 0:2206b894635f 411 ptok = s; // Point top of command line
robo8080 0:2206b894635f 412 // Compare
robo8080 0:2206b894635f 413 while((*pkw != 0) && (*pkw == c_toupper(*ptok))){
robo8080 0:2206b894635f 414 pkw++;
robo8080 0:2206b894635f 415 ptok++;
robo8080 0:2206b894635f 416 }
robo8080 0:2206b894635f 417 if(*pkw == 0){// Case success
robo8080 0:2206b894635f 418 // i have i-code
robo8080 0:2206b894635f 419 if(len >= SIZE_IBUF - 1){// List area full
robo8080 0:2206b894635f 420 err = ERR_IBUFOF;
robo8080 0:2206b894635f 421 return 0;
robo8080 0:2206b894635f 422 }
robo8080 0:2206b894635f 423 ibuf[len++] = i;
robo8080 0:2206b894635f 424 s = ptok;
robo8080 0:2206b894635f 425 break;
robo8080 0:2206b894635f 426 }
robo8080 0:2206b894635f 427 }
robo8080 0:2206b894635f 428
robo8080 0:2206b894635f 429 // Case statement needs an argument except numeric, valiable, or strings
robo8080 0:2206b894635f 430 switch(i){
robo8080 0:2206b894635f 431 case I_REM:
robo8080 0:2206b894635f 432 while(c_isspace(*s)) s++; // Skip space
robo8080 0:2206b894635f 433 ptok = s;
robo8080 0:2206b894635f 434 for(i = 0; *ptok++; i++); // Get length
robo8080 0:2206b894635f 435 if(len >= SIZE_IBUF - 2 - i){
robo8080 0:2206b894635f 436 err = ERR_IBUFOF;
robo8080 0:2206b894635f 437 return 0;
robo8080 0:2206b894635f 438 }
robo8080 0:2206b894635f 439 ibuf[len++] = i; // Put length
robo8080 0:2206b894635f 440 while(i--){ // Copy strings
robo8080 0:2206b894635f 441 ibuf[len++] = *s++;
robo8080 0:2206b894635f 442 }
robo8080 0:2206b894635f 443 return len;
robo8080 0:2206b894635f 444 default:
robo8080 0:2206b894635f 445 break;
robo8080 0:2206b894635f 446 }
robo8080 0:2206b894635f 447
robo8080 0:2206b894635f 448 if(*pkw != 0){ // Case not keyword
robo8080 0:2206b894635f 449 ptok = s; // Point top of command line
robo8080 0:2206b894635f 450
robo8080 0:2206b894635f 451 // Try numeric conversion
robo8080 0:2206b894635f 452 if(c_isdigit(*ptok)){
robo8080 0:2206b894635f 453 value = 0;
robo8080 0:2206b894635f 454 tmp = 0;
robo8080 0:2206b894635f 455 do{
robo8080 0:2206b894635f 456 tmp = 10 * value + *ptok++ - '0';
robo8080 0:2206b894635f 457 if(value > tmp){
robo8080 0:2206b894635f 458 err = ERR_VOF;
robo8080 0:2206b894635f 459 return 0;
robo8080 0:2206b894635f 460 }
robo8080 0:2206b894635f 461 value = tmp;
robo8080 0:2206b894635f 462 } while(c_isdigit(*ptok));
robo8080 0:2206b894635f 463
robo8080 0:2206b894635f 464 if(len >= SIZE_IBUF - 3){
robo8080 0:2206b894635f 465 err = ERR_IBUFOF;
robo8080 0:2206b894635f 466 return 0;
robo8080 0:2206b894635f 467 }
robo8080 0:2206b894635f 468 s = ptok;
robo8080 0:2206b894635f 469 ibuf[len++] = I_NUM;
robo8080 0:2206b894635f 470 ibuf[len++] = value & 255;
robo8080 0:2206b894635f 471 ibuf[len++] = value >> 8;
robo8080 0:2206b894635f 472 } else
robo8080 0:2206b894635f 473
robo8080 0:2206b894635f 474 // Try valiable conversion
robo8080 0:2206b894635f 475 if(c_isalpha(*ptok)){
robo8080 0:2206b894635f 476 if(len >= SIZE_IBUF - 2){
robo8080 0:2206b894635f 477 err = ERR_IBUFOF;
robo8080 0:2206b894635f 478 return 0;
robo8080 0:2206b894635f 479 }
robo8080 0:2206b894635f 480 if(len >= 2 && ibuf[len -2] == I_VAR){ // Case series of variables
robo8080 0:2206b894635f 481 err = ERR_SYNTAX; // Syntax error
robo8080 0:2206b894635f 482 return 0;
robo8080 0:2206b894635f 483 }
robo8080 0:2206b894635f 484 ibuf[len++] = I_VAR; // Put i-code
robo8080 0:2206b894635f 485 ibuf[len++] = c_toupper(*ptok) - 'A'; // Put index of valiable area
robo8080 0:2206b894635f 486 s++;
robo8080 0:2206b894635f 487 } else
robo8080 0:2206b894635f 488
robo8080 0:2206b894635f 489 // Try string conversion
robo8080 0:2206b894635f 490 if(*s == '\"' || *s == '\''){// If start of string
robo8080 0:2206b894635f 491 c = *s;
robo8080 0:2206b894635f 492 s++; // Skip " or '
robo8080 0:2206b894635f 493 ptok = s;
robo8080 0:2206b894635f 494 for(i = 0; (*ptok != c) && c_isprint(*ptok); i++) // Get length
robo8080 0:2206b894635f 495 ptok++;
robo8080 0:2206b894635f 496 if(len >= SIZE_IBUF - 1 - i){ // List area full
robo8080 0:2206b894635f 497 err = ERR_IBUFOF;
robo8080 0:2206b894635f 498 return 0;
robo8080 0:2206b894635f 499 }
robo8080 0:2206b894635f 500 ibuf[len++] = I_STR; // Put i-code
robo8080 0:2206b894635f 501 ibuf[len++] = i; // Put length
robo8080 0:2206b894635f 502 while(i--){ // Put string
robo8080 0:2206b894635f 503 ibuf[len++] = *s++;
robo8080 0:2206b894635f 504 }
robo8080 0:2206b894635f 505 if(*s == c) s++; // Skip " or '
robo8080 0:2206b894635f 506
robo8080 0:2206b894635f 507 // Nothing mutch
robo8080 0:2206b894635f 508 } else {
robo8080 0:2206b894635f 509 err = ERR_SYNTAX;
robo8080 0:2206b894635f 510 return 0;
robo8080 0:2206b894635f 511 }
robo8080 0:2206b894635f 512 }
robo8080 0:2206b894635f 513 }
robo8080 0:2206b894635f 514 ibuf[len++] = I_EOL; // Put end of line
robo8080 0:2206b894635f 515 return len; // Return byte length
robo8080 0:2206b894635f 516 }
robo8080 0:2206b894635f 517
robo8080 0:2206b894635f 518 //Listing 1 line of i-code
robo8080 0:2206b894635f 519 void putlist(unsigned char* ip){
robo8080 0:2206b894635f 520 unsigned char i;
robo8080 0:2206b894635f 521 short value;
robo8080 0:2206b894635f 522
robo8080 0:2206b894635f 523 while(*ip != I_EOL){
robo8080 0:2206b894635f 524 // Case keyword
robo8080 0:2206b894635f 525 if(*ip < SIZE_KWTBL){
robo8080 0:2206b894635f 526 c_puts(kwtbl[*ip]);
robo8080 0:2206b894635f 527 if(IS_TOKSP(*ip) || *ip == I_SEMI)c_putch(' ');
robo8080 0:2206b894635f 528 if(*ip == I_REM){
robo8080 0:2206b894635f 529 ip++;
robo8080 0:2206b894635f 530 i = *ip++;
robo8080 0:2206b894635f 531 while(i--){
robo8080 0:2206b894635f 532 c_putch(*ip++);
robo8080 0:2206b894635f 533 }
robo8080 0:2206b894635f 534 return;
robo8080 0:2206b894635f 535 }
robo8080 0:2206b894635f 536 ip++;
robo8080 0:2206b894635f 537 } else
robo8080 0:2206b894635f 538
robo8080 0:2206b894635f 539 // Case numeric
robo8080 0:2206b894635f 540 if(*ip == I_NUM){
robo8080 0:2206b894635f 541 putnum(getvalue(ip), 0);
robo8080 0:2206b894635f 542 ip += 3;
robo8080 0:2206b894635f 543 if(!IS_OP(*ip) && !IS_SEP(*ip)) c_putch(' ');
robo8080 0:2206b894635f 544 } else
robo8080 0:2206b894635f 545
robo8080 0:2206b894635f 546 // Case valiable
robo8080 0:2206b894635f 547 if(*ip == I_VAR){
robo8080 0:2206b894635f 548 ip++;
robo8080 0:2206b894635f 549 c_putch(*ip++ + 'A');
robo8080 0:2206b894635f 550 if(!IS_OP(*ip) && !IS_SEP(*ip)) c_putch(' ');
robo8080 0:2206b894635f 551 } else
robo8080 0:2206b894635f 552
robo8080 0:2206b894635f 553 // Case string
robo8080 0:2206b894635f 554 if(*ip == I_STR){
robo8080 0:2206b894635f 555 ip++;
robo8080 0:2206b894635f 556 value = 0;
robo8080 0:2206b894635f 557 i = *ip;
robo8080 0:2206b894635f 558 while(i--){
robo8080 0:2206b894635f 559 if(*(ip + i + 1) == '\"')
robo8080 0:2206b894635f 560 value = 1;
robo8080 0:2206b894635f 561 }
robo8080 0:2206b894635f 562 if(value) c_putch('\''); else c_putch('\"');
robo8080 0:2206b894635f 563 i = *ip++;
robo8080 0:2206b894635f 564 while(i--){
robo8080 0:2206b894635f 565 c_putch(*ip++);
robo8080 0:2206b894635f 566 }
robo8080 0:2206b894635f 567 if(value) c_putch('\''); else c_putch('\"');
robo8080 0:2206b894635f 568
robo8080 0:2206b894635f 569 // Nothing match, I think, such case is impossible
robo8080 0:2206b894635f 570 } else {
robo8080 0:2206b894635f 571 err = ERR_SYS;
robo8080 0:2206b894635f 572 return;
robo8080 0:2206b894635f 573 }
robo8080 0:2206b894635f 574 }
robo8080 0:2206b894635f 575 }
robo8080 0:2206b894635f 576
robo8080 0:2206b894635f 577 // Insert i-code to the list
robo8080 0:2206b894635f 578 void inslist(){
robo8080 0:2206b894635f 579 unsigned char len;
robo8080 0:2206b894635f 580 unsigned char *lp1, *lp2;
robo8080 0:2206b894635f 581
robo8080 0:2206b894635f 582 cip = ibuf;
robo8080 0:2206b894635f 583 clp = getlp(getvalue(cip));
robo8080 0:2206b894635f 584
robo8080 0:2206b894635f 585 lp1 = clp;
robo8080 0:2206b894635f 586 if(getvalue(lp1) == getvalue(cip)){
robo8080 0:2206b894635f 587 // Temporary measures of the case that
robo8080 0:2206b894635f 588 // same line numbere exists and list area full,
robo8080 0:2206b894635f 589 // existing line is deleted and new line is not inserted in.
robo8080 0:2206b894635f 590
robo8080 0:2206b894635f 591 // if((getsize() - *lp1) < *cip){
robo8080 0:2206b894635f 592 // err = ERR_LBUFOF;
robo8080 0:2206b894635f 593 // return;
robo8080 0:2206b894635f 594 // }
robo8080 0:2206b894635f 595
robo8080 0:2206b894635f 596 lp2 = lp1 + *lp1;
robo8080 0:2206b894635f 597 while((len = *lp2) != 0){
robo8080 0:2206b894635f 598 while(len--){
robo8080 0:2206b894635f 599 *lp1++ = *lp2++;
robo8080 0:2206b894635f 600 }
robo8080 0:2206b894635f 601 }
robo8080 0:2206b894635f 602 *lp1 = 0;
robo8080 0:2206b894635f 603 }
robo8080 0:2206b894635f 604
robo8080 0:2206b894635f 605 // Case line number only
robo8080 0:2206b894635f 606 if(*cip == 4)
robo8080 0:2206b894635f 607 return;
robo8080 0:2206b894635f 608
robo8080 0:2206b894635f 609 // Check insertable
robo8080 0:2206b894635f 610 while(*lp1){
robo8080 0:2206b894635f 611 lp1 += *lp1;
robo8080 0:2206b894635f 612 }
robo8080 0:2206b894635f 613 if(*cip > (listbuf + SIZE_LIST - lp1 - 1)){
robo8080 0:2206b894635f 614 err = ERR_LBUFOF;
robo8080 0:2206b894635f 615 return;
robo8080 0:2206b894635f 616 }
robo8080 0:2206b894635f 617
robo8080 0:2206b894635f 618 // Make space
robo8080 0:2206b894635f 619 len = lp1 - clp + 1;
robo8080 0:2206b894635f 620 lp2 = lp1 + *cip;
robo8080 0:2206b894635f 621 while(len--){
robo8080 0:2206b894635f 622 *lp2-- = *lp1--;
robo8080 0:2206b894635f 623 }
robo8080 0:2206b894635f 624
robo8080 0:2206b894635f 625 // Insert
robo8080 0:2206b894635f 626 len = *cip;
robo8080 0:2206b894635f 627 while(len--){
robo8080 0:2206b894635f 628 *clp++ = *cip++;
robo8080 0:2206b894635f 629 }
robo8080 0:2206b894635f 630 }
robo8080 0:2206b894635f 631 //-------------------------------------------------------------
robo8080 0:2206b894635f 632 short getinp(){
robo8080 0:2206b894635f 633 short value1;
robo8080 0:2206b894635f 634 short value2;
robo8080 0:2206b894635f 635
robo8080 0:2206b894635f 636 value1 = getparam();
robo8080 0:2206b894635f 637 if(err) return 0;
robo8080 0:2206b894635f 638
robo8080 0:2206b894635f 639 if(value1 < 0) {
robo8080 0:2206b894635f 640 err = ERR_SYNTAX;
robo8080 0:2206b894635f 641 return 0;
robo8080 0:2206b894635f 642 }
robo8080 0:2206b894635f 643
robo8080 0:2206b894635f 644 switch(value1){
robo8080 0:2206b894635f 645 case 0:
robo8080 0:2206b894635f 646 value2 = in0;
robo8080 0:2206b894635f 647 break;
robo8080 0:2206b894635f 648 case 1:
robo8080 0:2206b894635f 649 value2 = in1;
robo8080 0:2206b894635f 650 break;
robo8080 0:2206b894635f 651 default:
robo8080 0:2206b894635f 652 err = ERR_SYNTAX;
robo8080 0:2206b894635f 653 return 0;
robo8080 0:2206b894635f 654 }
robo8080 0:2206b894635f 655 return value2;
robo8080 0:2206b894635f 656 }
robo8080 0:2206b894635f 657
robo8080 0:2206b894635f 658 short getain(){
robo8080 0:2206b894635f 659 short value1;
robo8080 0:2206b894635f 660 short value2;
robo8080 0:2206b894635f 661
robo8080 0:2206b894635f 662 value1 = getparam();
robo8080 0:2206b894635f 663 if(err) return 0;
robo8080 0:2206b894635f 664
robo8080 0:2206b894635f 665 if(value1 < 0) {
robo8080 0:2206b894635f 666 err = ERR_SYNTAX;
robo8080 0:2206b894635f 667 return 0;
robo8080 0:2206b894635f 668 }
robo8080 0:2206b894635f 669
robo8080 0:2206b894635f 670 switch(value1){
robo8080 0:2206b894635f 671 case 0:
robo8080 0:2206b894635f 672 value2 = ain0.read_u16();
robo8080 0:2206b894635f 673 break;
robo8080 0:2206b894635f 674 case 1:
robo8080 0:2206b894635f 675 value2 = ain1.read_u16();
robo8080 0:2206b894635f 676 break;
robo8080 0:2206b894635f 677 case 2:
robo8080 0:2206b894635f 678 value2 = ain2.read_u16();
robo8080 0:2206b894635f 679 break;
robo8080 0:2206b894635f 680 case 3:
robo8080 0:2206b894635f 681 value2 = ain3.read_u16();
robo8080 0:2206b894635f 682 break;
robo8080 0:2206b894635f 683 default:
robo8080 0:2206b894635f 684 err = ERR_SYNTAX;
robo8080 0:2206b894635f 685 return 0;
robo8080 0:2206b894635f 686 }
robo8080 0:2206b894635f 687 return value2;
robo8080 0:2206b894635f 688 }
robo8080 0:2206b894635f 689
robo8080 0:2206b894635f 690 void iout(){
robo8080 0:2206b894635f 691 short value1, value2;
robo8080 0:2206b894635f 692
robo8080 0:2206b894635f 693 value1 = iexp();
robo8080 0:2206b894635f 694 if(err) return ;
robo8080 0:2206b894635f 695
robo8080 0:2206b894635f 696 if(*cip != I_COMMA){
robo8080 0:2206b894635f 697 err = ERR_SYNTAX;
robo8080 0:2206b894635f 698 return;
robo8080 0:2206b894635f 699 }
robo8080 0:2206b894635f 700
robo8080 0:2206b894635f 701 cip++;
robo8080 0:2206b894635f 702 value2 = iexp();
robo8080 0:2206b894635f 703 if(err) return ;
robo8080 0:2206b894635f 704
robo8080 0:2206b894635f 705 if(value1 < 0) {
robo8080 0:2206b894635f 706 err = ERR_SYNTAX;
robo8080 0:2206b894635f 707 return;
robo8080 0:2206b894635f 708 }
robo8080 0:2206b894635f 709
robo8080 0:2206b894635f 710 switch(value1){
robo8080 0:2206b894635f 711 case 0:
robo8080 0:2206b894635f 712 out0 = value2 & 0x01;
robo8080 0:2206b894635f 713 break;
robo8080 0:2206b894635f 714 case 1:
robo8080 0:2206b894635f 715 out1 = value2 & 0x01;
robo8080 0:2206b894635f 716 break;
robo8080 0:2206b894635f 717 case 2:
robo8080 0:2206b894635f 718 out2 = value2 & 0x01;
robo8080 0:2206b894635f 719 break;
robo8080 0:2206b894635f 720 case 3:
robo8080 0:2206b894635f 721 out3 = value2 & 0x01;
robo8080 0:2206b894635f 722 break;
robo8080 0:2206b894635f 723 default:
robo8080 0:2206b894635f 724 err = ERR_SYNTAX;
robo8080 0:2206b894635f 725 return ;
robo8080 0:2206b894635f 726 }
robo8080 0:2206b894635f 727 }
robo8080 0:2206b894635f 728
robo8080 0:2206b894635f 729 void iservo(){
robo8080 0:2206b894635f 730 short value1, value2;
robo8080 0:2206b894635f 731
robo8080 0:2206b894635f 732 value1 = iexp();
robo8080 0:2206b894635f 733 if(err) return ;
robo8080 0:2206b894635f 734
robo8080 0:2206b894635f 735 if(*cip != I_COMMA){
robo8080 0:2206b894635f 736 err = ERR_SYNTAX;
robo8080 0:2206b894635f 737 return;
robo8080 0:2206b894635f 738 }
robo8080 0:2206b894635f 739
robo8080 0:2206b894635f 740 cip++;
robo8080 0:2206b894635f 741 value2 = iexp();
robo8080 0:2206b894635f 742 if(err) return ;
robo8080 0:2206b894635f 743
robo8080 0:2206b894635f 744 if(value1 < 0) {
robo8080 0:2206b894635f 745 err = ERR_SYNTAX;
robo8080 0:2206b894635f 746 return;
robo8080 0:2206b894635f 747 }
robo8080 0:2206b894635f 748 if(value2 < 0) value2 = 0;
robo8080 0:2206b894635f 749 if(value2 > 180) value2 = 180;
robo8080 0:2206b894635f 750
robo8080 0:2206b894635f 751 switch(value1){
robo8080 0:2206b894635f 752 case 0:
robo8080 0:2206b894635f 753 servo0 = value2 / 180;
robo8080 0:2206b894635f 754 break;
robo8080 0:2206b894635f 755 case 1:
robo8080 0:2206b894635f 756 servo1 = value2 / 180;
robo8080 0:2206b894635f 757 break;
robo8080 0:2206b894635f 758 default:
robo8080 0:2206b894635f 759 err = ERR_SYNTAX;
robo8080 0:2206b894635f 760 return ;
robo8080 0:2206b894635f 761 }
robo8080 0:2206b894635f 762 }
robo8080 0:2206b894635f 763
robo8080 0:2206b894635f 764 void imove(){
robo8080 0:2206b894635f 765 short value1, value2, value3;
robo8080 0:2206b894635f 766
robo8080 0:2206b894635f 767 value1 = iexp();
robo8080 0:2206b894635f 768 if(err) return ;
robo8080 0:2206b894635f 769
robo8080 0:2206b894635f 770 if(*cip != I_COMMA){
robo8080 0:2206b894635f 771 err = ERR_SYNTAX;
robo8080 0:2206b894635f 772 return;
robo8080 0:2206b894635f 773 }
robo8080 0:2206b894635f 774
robo8080 0:2206b894635f 775 cip++;
robo8080 0:2206b894635f 776 value2 = iexp();
robo8080 0:2206b894635f 777 if(err) return ;
robo8080 0:2206b894635f 778
robo8080 0:2206b894635f 779 if(*cip != I_COMMA){
robo8080 0:2206b894635f 780 err = ERR_SYNTAX;
robo8080 0:2206b894635f 781 return;
robo8080 0:2206b894635f 782 }
robo8080 0:2206b894635f 783
robo8080 0:2206b894635f 784 cip++;
robo8080 0:2206b894635f 785 value3 = iexp();
robo8080 0:2206b894635f 786 if(err) return ;
robo8080 0:2206b894635f 787
robo8080 0:2206b894635f 788 if(value1 < -100) value1 = -100;
robo8080 0:2206b894635f 789 if(value1 > 100) value1 = 100;
robo8080 0:2206b894635f 790 if(value2 < -100) value2 = -100;
robo8080 0:2206b894635f 791 if(value2 > 100) value2 = 100;
robo8080 0:2206b894635f 792
robo8080 0:2206b894635f 793 if(value3 < 0) value3 = 0;
robo8080 0:2206b894635f 794
robo8080 0:2206b894635f 795 left = value1;
robo8080 0:2206b894635f 796 right = value2;
robo8080 0:2206b894635f 797 if(value3 > 0) wait_ms(value3);
robo8080 0:2206b894635f 798
robo8080 0:2206b894635f 799 }
robo8080 0:2206b894635f 800
robo8080 0:2206b894635f 801 int iload(char *filename) {
robo8080 0:2206b894635f 802 FILE * fp;
robo8080 0:2206b894635f 803 unsigned char len;
robo8080 0:2206b894635f 804
robo8080 0:2206b894635f 805 fp = fopen( filename , "r" );
robo8080 0:2206b894635f 806 if( fp == NULL ) {
robo8080 0:2206b894635f 807 err = ERR_SYS;
robo8080 0:2206b894635f 808 error();
robo8080 0:2206b894635f 809 return -1;
robo8080 0:2206b894635f 810 }
robo8080 0:2206b894635f 811
robo8080 0:2206b894635f 812 while( fgets( lbuf , sizeof( lbuf ) , fp ) != NULL ) {
robo8080 0:2206b894635f 813 // puts(lbuf);
robo8080 0:2206b894635f 814 int i = 0;
robo8080 0:2206b894635f 815 while(*(lbuf + i)!=0x00) //remove CR LF
robo8080 0:2206b894635f 816 {
robo8080 0:2206b894635f 817 if((*(lbuf + i) == 0x0a) || (*(lbuf + i) == 0x0d))
robo8080 0:2206b894635f 818 {
robo8080 0:2206b894635f 819 *(lbuf + i) = 0x00;
robo8080 0:2206b894635f 820 }
robo8080 0:2206b894635f 821 i++;
robo8080 0:2206b894635f 822 }
robo8080 0:2206b894635f 823 len = toktoi(); // Convert token to i-code
robo8080 0:2206b894635f 824 if(err){ // Error
robo8080 0:2206b894635f 825 newline();
robo8080 0:2206b894635f 826 c_puts("YOU TYPE:");
robo8080 0:2206b894635f 827 c_puts(lbuf);
robo8080 0:2206b894635f 828 error();
robo8080 0:2206b894635f 829 fclose( fp );
robo8080 0:2206b894635f 830 return -1;
robo8080 0:2206b894635f 831 }
robo8080 0:2206b894635f 832
robo8080 0:2206b894635f 833 if(*ibuf == I_NUM){ // Case the top includes line number
robo8080 0:2206b894635f 834 *ibuf = len; // Change I_NUM to byte length
robo8080 0:2206b894635f 835 inslist(); // Insert list
robo8080 0:2206b894635f 836 if(err){
robo8080 0:2206b894635f 837 fclose( fp );
robo8080 0:2206b894635f 838 error(); // List buffer overflow
robo8080 0:2206b894635f 839 return -1;
robo8080 0:2206b894635f 840 }
robo8080 0:2206b894635f 841 }
robo8080 0:2206b894635f 842 else {
robo8080 0:2206b894635f 843 fclose( fp );
robo8080 0:2206b894635f 844 err = ERR_SYS;
robo8080 0:2206b894635f 845 error(); // Print OK, and Clear error flag
robo8080 0:2206b894635f 846 return -1;
robo8080 0:2206b894635f 847 }
robo8080 0:2206b894635f 848 }
robo8080 0:2206b894635f 849 fclose( fp );
robo8080 0:2206b894635f 850 return 0;
robo8080 0:2206b894635f 851 }
robo8080 0:2206b894635f 852 //-------------------------------------------------------------
robo8080 0:2206b894635f 853
robo8080 0:2206b894635f 854 // Return free memory
robo8080 0:2206b894635f 855 short getsize(){
robo8080 0:2206b894635f 856 short value;
robo8080 0:2206b894635f 857 unsigned char* lp;
robo8080 0:2206b894635f 858
robo8080 0:2206b894635f 859 lp = listbuf;
robo8080 0:2206b894635f 860 while(*lp){
robo8080 0:2206b894635f 861 lp += *lp;
robo8080 0:2206b894635f 862 }
robo8080 0:2206b894635f 863
robo8080 0:2206b894635f 864 value = listbuf + SIZE_LIST - lp - 1;
robo8080 0:2206b894635f 865 return value;
robo8080 0:2206b894635f 866 }
robo8080 0:2206b894635f 867
robo8080 0:2206b894635f 868 // Return Absolute value
robo8080 0:2206b894635f 869 short getabs(){
robo8080 0:2206b894635f 870 short value;
robo8080 0:2206b894635f 871
robo8080 0:2206b894635f 872 value = getparam();
robo8080 0:2206b894635f 873 if(err) return 0;
robo8080 0:2206b894635f 874
robo8080 0:2206b894635f 875 if(value < 0) value *= -1;
robo8080 0:2206b894635f 876 return value;
robo8080 0:2206b894635f 877 }
robo8080 0:2206b894635f 878
robo8080 0:2206b894635f 879 // Return random number
robo8080 0:2206b894635f 880 // TO-DO Rewrite this function to fit your machine
robo8080 0:2206b894635f 881 short getrnd(void){
robo8080 0:2206b894635f 882 short value;
robo8080 0:2206b894635f 883
robo8080 0:2206b894635f 884 value = getparam();
robo8080 0:2206b894635f 885 if(err) return 0;
robo8080 0:2206b894635f 886
robo8080 0:2206b894635f 887 return(rand() % value);
robo8080 0:2206b894635f 888 }
robo8080 0:2206b894635f 889
robo8080 0:2206b894635f 890 short getarray()
robo8080 0:2206b894635f 891 {
robo8080 0:2206b894635f 892 short index;
robo8080 0:2206b894635f 893
robo8080 0:2206b894635f 894 index = getparam();
robo8080 0:2206b894635f 895 if(err) return 0;
robo8080 0:2206b894635f 896
robo8080 0:2206b894635f 897 if(index < SIZE_ARRY){
robo8080 0:2206b894635f 898 return arr[index];
robo8080 0:2206b894635f 899 } else {
robo8080 0:2206b894635f 900 err = ERR_SOL;
robo8080 0:2206b894635f 901 return 0;
robo8080 0:2206b894635f 902 }
robo8080 0:2206b894635f 903 }
robo8080 0:2206b894635f 904
robo8080 0:2206b894635f 905 short ivalue(){
robo8080 0:2206b894635f 906 short value;
robo8080 0:2206b894635f 907
robo8080 0:2206b894635f 908 switch(*cip){
robo8080 0:2206b894635f 909 case I_PLUS:
robo8080 0:2206b894635f 910 cip++;
robo8080 0:2206b894635f 911 value = ivalue();
robo8080 0:2206b894635f 912 break;
robo8080 0:2206b894635f 913 case I_MINUS:
robo8080 0:2206b894635f 914 cip++;
robo8080 0:2206b894635f 915 value = 0 - ivalue();
robo8080 0:2206b894635f 916 break;
robo8080 0:2206b894635f 917 case I_VAR:
robo8080 0:2206b894635f 918 cip++;
robo8080 0:2206b894635f 919 value = var[*cip++];
robo8080 0:2206b894635f 920 break;
robo8080 0:2206b894635f 921 case I_NUM:
robo8080 0:2206b894635f 922 value = getvalue(cip);
robo8080 0:2206b894635f 923 cip += 3;
robo8080 0:2206b894635f 924 break;
robo8080 0:2206b894635f 925 case I_ARRAY:
robo8080 0:2206b894635f 926 cip++;
robo8080 0:2206b894635f 927 value = getarray();
robo8080 0:2206b894635f 928 break;
robo8080 0:2206b894635f 929 case I_OPEN:
robo8080 0:2206b894635f 930 value = getparam();
robo8080 0:2206b894635f 931 break;
robo8080 0:2206b894635f 932 case I_RND:
robo8080 0:2206b894635f 933 cip++;
robo8080 0:2206b894635f 934 value = getrnd();
robo8080 0:2206b894635f 935 break;
robo8080 0:2206b894635f 936 case I_ABS:
robo8080 0:2206b894635f 937 cip++;
robo8080 0:2206b894635f 938 value = getabs();
robo8080 0:2206b894635f 939 break;
robo8080 0:2206b894635f 940 case I_INP:
robo8080 0:2206b894635f 941 cip++;
robo8080 0:2206b894635f 942 value = getinp();
robo8080 0:2206b894635f 943 break;
robo8080 0:2206b894635f 944 case I_AIN:
robo8080 0:2206b894635f 945 cip++;
robo8080 0:2206b894635f 946 value = getain();
robo8080 0:2206b894635f 947 break;
robo8080 0:2206b894635f 948 case I_SIZE:
robo8080 0:2206b894635f 949 cip++;
robo8080 0:2206b894635f 950 if(*cip == I_OPEN){
robo8080 0:2206b894635f 951 cip++;
robo8080 0:2206b894635f 952 if(*cip == I_CLOSE)
robo8080 0:2206b894635f 953 cip++;
robo8080 0:2206b894635f 954 else{
robo8080 0:2206b894635f 955 err = ERR_PAREN;
robo8080 0:2206b894635f 956 }
robo8080 0:2206b894635f 957 }
robo8080 0:2206b894635f 958 value = getsize();
robo8080 0:2206b894635f 959 break;
robo8080 0:2206b894635f 960
robo8080 0:2206b894635f 961 default:
robo8080 0:2206b894635f 962 value = 0;
robo8080 0:2206b894635f 963 err = ERR_SYNTAX;
robo8080 0:2206b894635f 964 break;
robo8080 0:2206b894635f 965 }
robo8080 0:2206b894635f 966 return value;
robo8080 0:2206b894635f 967 }
robo8080 0:2206b894635f 968
robo8080 0:2206b894635f 969 short icalc()
robo8080 0:2206b894635f 970 {
robo8080 0:2206b894635f 971 short value1, value2;
robo8080 0:2206b894635f 972
robo8080 0:2206b894635f 973 value1 = ivalue();
robo8080 0:2206b894635f 974
robo8080 0:2206b894635f 975 while(1){
robo8080 0:2206b894635f 976 if(*cip == I_DIV){
robo8080 0:2206b894635f 977 cip++;
robo8080 0:2206b894635f 978 value2 = ivalue();
robo8080 0:2206b894635f 979 if(value2 == 0){
robo8080 0:2206b894635f 980 err = ERR_DIVBY0;
robo8080 0:2206b894635f 981 break;
robo8080 0:2206b894635f 982 }
robo8080 0:2206b894635f 983 value1 /= value2;
robo8080 0:2206b894635f 984 } else
robo8080 0:2206b894635f 985 if(*cip == I_MUL){
robo8080 0:2206b894635f 986 cip++;
robo8080 0:2206b894635f 987 value2 = ivalue();
robo8080 0:2206b894635f 988 value1 *= value2;
robo8080 0:2206b894635f 989 } else {
robo8080 0:2206b894635f 990 break;
robo8080 0:2206b894635f 991 }
robo8080 0:2206b894635f 992 }
robo8080 0:2206b894635f 993 return value1;
robo8080 0:2206b894635f 994 }
robo8080 0:2206b894635f 995
robo8080 0:2206b894635f 996 short iexp()
robo8080 0:2206b894635f 997 {
robo8080 0:2206b894635f 998 short value1, value2;
robo8080 0:2206b894635f 999
robo8080 0:2206b894635f 1000 value1 = icalc();
robo8080 0:2206b894635f 1001
robo8080 0:2206b894635f 1002 while(*cip == I_PLUS || *cip == I_MINUS){
robo8080 0:2206b894635f 1003 value2 = icalc();
robo8080 0:2206b894635f 1004 value1 += value2;
robo8080 0:2206b894635f 1005 }
robo8080 0:2206b894635f 1006 return value1;
robo8080 0:2206b894635f 1007 }
robo8080 0:2206b894635f 1008
robo8080 0:2206b894635f 1009 void iprint(){
robo8080 0:2206b894635f 1010 short value;
robo8080 0:2206b894635f 1011 short len;
robo8080 0:2206b894635f 1012 unsigned char i;
robo8080 0:2206b894635f 1013
robo8080 0:2206b894635f 1014 len = 0;
robo8080 0:2206b894635f 1015 while(1){
robo8080 0:2206b894635f 1016 switch(*cip){
robo8080 0:2206b894635f 1017 case I_SEMI:
robo8080 0:2206b894635f 1018 case I_EOL:
robo8080 0:2206b894635f 1019 break;
robo8080 0:2206b894635f 1020 case I_STR:
robo8080 0:2206b894635f 1021 cip++;
robo8080 0:2206b894635f 1022 i = *cip++;
robo8080 0:2206b894635f 1023 while(i--){
robo8080 0:2206b894635f 1024 c_putch(*cip++);
robo8080 0:2206b894635f 1025 }
robo8080 0:2206b894635f 1026 break;
robo8080 0:2206b894635f 1027 case I_SHARP:
robo8080 0:2206b894635f 1028 cip++;
robo8080 0:2206b894635f 1029 len = iexp();
robo8080 0:2206b894635f 1030 if(err) return;
robo8080 0:2206b894635f 1031 break;
robo8080 0:2206b894635f 1032 default:
robo8080 0:2206b894635f 1033 value = iexp();
robo8080 0:2206b894635f 1034 if(err) return;
robo8080 0:2206b894635f 1035 putnum(value, len);
robo8080 0:2206b894635f 1036 break;
robo8080 0:2206b894635f 1037 }
robo8080 0:2206b894635f 1038
robo8080 0:2206b894635f 1039 if(*cip == I_COMMA){
robo8080 0:2206b894635f 1040 cip++;
robo8080 0:2206b894635f 1041 }else{
robo8080 0:2206b894635f 1042 break;
robo8080 0:2206b894635f 1043 }
robo8080 0:2206b894635f 1044 };
robo8080 0:2206b894635f 1045 newline();
robo8080 0:2206b894635f 1046 }
robo8080 0:2206b894635f 1047
robo8080 0:2206b894635f 1048 void iinput(){
robo8080 0:2206b894635f 1049 unsigned char i;
robo8080 0:2206b894635f 1050 short value;
robo8080 0:2206b894635f 1051 short index;
robo8080 0:2206b894635f 1052
robo8080 0:2206b894635f 1053 while(1){
robo8080 0:2206b894635f 1054 switch(*cip){
robo8080 0:2206b894635f 1055 case I_STR:
robo8080 0:2206b894635f 1056 cip++;
robo8080 0:2206b894635f 1057 i = *cip++;
robo8080 0:2206b894635f 1058 while(i--){
robo8080 0:2206b894635f 1059 c_putch(*cip++);
robo8080 0:2206b894635f 1060 }
robo8080 0:2206b894635f 1061 if(*cip == I_VAR){
robo8080 0:2206b894635f 1062 cip++;
robo8080 0:2206b894635f 1063 value = getnum();
robo8080 0:2206b894635f 1064 var[*cip++] = value;
robo8080 0:2206b894635f 1065 } else
robo8080 0:2206b894635f 1066 if(*cip == I_ARRAY){
robo8080 0:2206b894635f 1067 cip++;
robo8080 0:2206b894635f 1068 index = getparam();
robo8080 0:2206b894635f 1069 if(err) return;
robo8080 0:2206b894635f 1070 if(index >= SIZE_ARRY){
robo8080 0:2206b894635f 1071 err = ERR_SOL;
robo8080 0:2206b894635f 1072 return;
robo8080 0:2206b894635f 1073 }
robo8080 0:2206b894635f 1074 value = getnum();
robo8080 0:2206b894635f 1075 arr[index] = value;
robo8080 0:2206b894635f 1076 }
robo8080 0:2206b894635f 1077 break;
robo8080 0:2206b894635f 1078 case I_VAR:
robo8080 0:2206b894635f 1079 cip++;
robo8080 0:2206b894635f 1080 c_putch(*cip + 'A');
robo8080 0:2206b894635f 1081 c_putch(':');
robo8080 0:2206b894635f 1082 value = getnum();
robo8080 0:2206b894635f 1083 var[*cip++] = value;
robo8080 0:2206b894635f 1084 break;
robo8080 0:2206b894635f 1085 case I_ARRAY:
robo8080 0:2206b894635f 1086 cip++;
robo8080 0:2206b894635f 1087 index = getparam();
robo8080 0:2206b894635f 1088 if(err)
robo8080 0:2206b894635f 1089 return;
robo8080 0:2206b894635f 1090 if(index >= SIZE_ARRY){
robo8080 0:2206b894635f 1091 err = ERR_SOL;
robo8080 0:2206b894635f 1092 return;
robo8080 0:2206b894635f 1093 }
robo8080 0:2206b894635f 1094 c_putch('@');c_putch('(');
robo8080 0:2206b894635f 1095 putnum(index,0);
robo8080 0:2206b894635f 1096 c_putch(')');c_putch(':');
robo8080 0:2206b894635f 1097 value = getnum();
robo8080 0:2206b894635f 1098 arr[index] = value;
robo8080 0:2206b894635f 1099 break;
robo8080 0:2206b894635f 1100 }
robo8080 0:2206b894635f 1101
robo8080 0:2206b894635f 1102 switch(*cip){
robo8080 0:2206b894635f 1103 case I_COMMA:
robo8080 0:2206b894635f 1104 cip++;
robo8080 0:2206b894635f 1105 break;
robo8080 0:2206b894635f 1106 case I_SEMI:
robo8080 0:2206b894635f 1107 case I_EOL:
robo8080 0:2206b894635f 1108 return;
robo8080 0:2206b894635f 1109 default:
robo8080 0:2206b894635f 1110 err = ERR_SYNTAX;
robo8080 0:2206b894635f 1111 return;
robo8080 0:2206b894635f 1112 }
robo8080 0:2206b894635f 1113 }
robo8080 0:2206b894635f 1114 }
robo8080 0:2206b894635f 1115
robo8080 0:2206b894635f 1116 //char iif(){
robo8080 0:2206b894635f 1117 signed char iif(){
robo8080 0:2206b894635f 1118 short value1, value2;
robo8080 0:2206b894635f 1119 unsigned char i;
robo8080 0:2206b894635f 1120
robo8080 0:2206b894635f 1121 value1 = iexp();
robo8080 0:2206b894635f 1122 if(err) return -1;
robo8080 0:2206b894635f 1123
robo8080 0:2206b894635f 1124 i = *cip++;
robo8080 0:2206b894635f 1125
robo8080 0:2206b894635f 1126 value2 = iexp();
robo8080 0:2206b894635f 1127 if(err) return -1;
robo8080 0:2206b894635f 1128
robo8080 0:2206b894635f 1129 switch(i){
robo8080 0:2206b894635f 1130 case I_EQ:
robo8080 0:2206b894635f 1131 return value1 == value2;
robo8080 0:2206b894635f 1132 case I_SHARP:
robo8080 0:2206b894635f 1133 return value1 != value2;
robo8080 0:2206b894635f 1134 case I_LT:
robo8080 0:2206b894635f 1135 return value1 < value2;
robo8080 0:2206b894635f 1136 case I_LTE:
robo8080 0:2206b894635f 1137 return value1 <= value2;
robo8080 0:2206b894635f 1138 case I_GT:
robo8080 0:2206b894635f 1139 return value1 > value2;
robo8080 0:2206b894635f 1140 case I_GTE:
robo8080 0:2206b894635f 1141 return value1 >= value2;
robo8080 0:2206b894635f 1142 default:
robo8080 0:2206b894635f 1143 err = ERR_IFWOC;
robo8080 0:2206b894635f 1144 return -1;
robo8080 0:2206b894635f 1145 }
robo8080 0:2206b894635f 1146 }
robo8080 0:2206b894635f 1147
robo8080 0:2206b894635f 1148 void ivar(){
robo8080 0:2206b894635f 1149 short value;
robo8080 0:2206b894635f 1150 short index;
robo8080 0:2206b894635f 1151
robo8080 0:2206b894635f 1152 index = *cip++;
robo8080 0:2206b894635f 1153 if(*cip == I_EQ){
robo8080 0:2206b894635f 1154 cip++;
robo8080 0:2206b894635f 1155 value = iexp();
robo8080 0:2206b894635f 1156 if(err) return;
robo8080 0:2206b894635f 1157 } else {
robo8080 0:2206b894635f 1158 err = ERR_VWOEQ;
robo8080 0:2206b894635f 1159 return;
robo8080 0:2206b894635f 1160 }
robo8080 0:2206b894635f 1161
robo8080 0:2206b894635f 1162 if(index < 26){
robo8080 0:2206b894635f 1163 var[index] = value;
robo8080 0:2206b894635f 1164 } else {
robo8080 0:2206b894635f 1165 err = ERR_SOL;
robo8080 0:2206b894635f 1166 }
robo8080 0:2206b894635f 1167 }
robo8080 0:2206b894635f 1168
robo8080 0:2206b894635f 1169 void iarray(){
robo8080 0:2206b894635f 1170 short value;
robo8080 0:2206b894635f 1171 short index;
robo8080 0:2206b894635f 1172
robo8080 0:2206b894635f 1173 index = getparam();
robo8080 0:2206b894635f 1174 if(err) return;
robo8080 0:2206b894635f 1175 if(*cip == I_EQ){
robo8080 0:2206b894635f 1176 cip++;
robo8080 0:2206b894635f 1177 value = iexp();
robo8080 0:2206b894635f 1178 if(err) return;
robo8080 0:2206b894635f 1179 } else {
robo8080 0:2206b894635f 1180 err = ERR_VWOEQ;
robo8080 0:2206b894635f 1181 return;
robo8080 0:2206b894635f 1182 }
robo8080 0:2206b894635f 1183
robo8080 0:2206b894635f 1184 if(index < SIZE_ARRY){
robo8080 0:2206b894635f 1185 arr[index] = value;
robo8080 0:2206b894635f 1186 } else {
robo8080 0:2206b894635f 1187 err = ERR_SOL;
robo8080 0:2206b894635f 1188 }
robo8080 0:2206b894635f 1189 }
robo8080 0:2206b894635f 1190
robo8080 0:2206b894635f 1191 void ilet(){
robo8080 0:2206b894635f 1192 switch(*cip){
robo8080 0:2206b894635f 1193 case I_VAR:
robo8080 0:2206b894635f 1194 cip++;
robo8080 0:2206b894635f 1195 ivar();
robo8080 0:2206b894635f 1196 break;
robo8080 0:2206b894635f 1197 case I_ARRAY:
robo8080 0:2206b894635f 1198 cip++;
robo8080 0:2206b894635f 1199 iarray();
robo8080 0:2206b894635f 1200 break;
robo8080 0:2206b894635f 1201 default:
robo8080 0:2206b894635f 1202 err = ERR_LETWOV;
robo8080 0:2206b894635f 1203 break;
robo8080 0:2206b894635f 1204 }
robo8080 0:2206b894635f 1205 }
robo8080 0:2206b894635f 1206
robo8080 0:2206b894635f 1207 void ilist(){
robo8080 0:2206b894635f 1208 short lineno;
robo8080 0:2206b894635f 1209
robo8080 0:2206b894635f 1210 if(*cip == I_NUM){
robo8080 0:2206b894635f 1211 lineno = getvalue(cip);
robo8080 0:2206b894635f 1212 cip += 3;
robo8080 0:2206b894635f 1213 } else {
robo8080 0:2206b894635f 1214 lineno = 0;
robo8080 0:2206b894635f 1215 }
robo8080 0:2206b894635f 1216
robo8080 0:2206b894635f 1217 for( clp = listbuf;
robo8080 0:2206b894635f 1218 *clp && (getvalue(clp) < lineno);
robo8080 0:2206b894635f 1219 clp += *clp);
robo8080 0:2206b894635f 1220
robo8080 0:2206b894635f 1221 while(*clp){
robo8080 0:2206b894635f 1222 putnum(getvalue(clp), 0);
robo8080 0:2206b894635f 1223 c_putch(' ');
robo8080 0:2206b894635f 1224 putlist(clp + 3);
robo8080 0:2206b894635f 1225 if(err){
robo8080 0:2206b894635f 1226 break;
robo8080 0:2206b894635f 1227 }
robo8080 0:2206b894635f 1228 newline();
robo8080 0:2206b894635f 1229 clp += *clp;
robo8080 0:2206b894635f 1230 }
robo8080 0:2206b894635f 1231 }
robo8080 0:2206b894635f 1232
robo8080 0:2206b894635f 1233 void inew(void){
robo8080 0:2206b894635f 1234 unsigned char i;
robo8080 0:2206b894635f 1235
robo8080 0:2206b894635f 1236 for(i = 0; i < 26; i++)
robo8080 0:2206b894635f 1237 var[i] = 0;
robo8080 0:2206b894635f 1238 gstki = 0;
robo8080 0:2206b894635f 1239 lstki = 0;
robo8080 0:2206b894635f 1240 *listbuf = 0;
robo8080 0:2206b894635f 1241 clp = listbuf;
robo8080 0:2206b894635f 1242 }
robo8080 0:2206b894635f 1243
robo8080 0:2206b894635f 1244 unsigned char* iexe(){
robo8080 0:2206b894635f 1245 short lineno;
robo8080 0:2206b894635f 1246 unsigned char cd;
robo8080 0:2206b894635f 1247 unsigned char* lp;
robo8080 0:2206b894635f 1248 short vto, vstep;
robo8080 0:2206b894635f 1249 short index;
robo8080 0:2206b894635f 1250
robo8080 0:2206b894635f 1251 while(1){
robo8080 0:2206b894635f 1252 if(c_kbhit()){
robo8080 0:2206b894635f 1253 if(c_getch() == 27){
robo8080 0:2206b894635f 1254 while(*clp){
robo8080 0:2206b894635f 1255 clp += *clp;
robo8080 0:2206b894635f 1256 }
robo8080 0:2206b894635f 1257 err = ERR_ESC;
robo8080 0:2206b894635f 1258 return clp;
robo8080 0:2206b894635f 1259 }
robo8080 0:2206b894635f 1260 }
robo8080 0:2206b894635f 1261
robo8080 0:2206b894635f 1262 switch(*cip){
robo8080 0:2206b894635f 1263 case I_GOTO:
robo8080 0:2206b894635f 1264 cip++;
robo8080 0:2206b894635f 1265 lineno = iexp();
robo8080 0:2206b894635f 1266 clp = getlp(lineno);
robo8080 0:2206b894635f 1267 if(lineno != getvalue(clp)){
robo8080 0:2206b894635f 1268 err = ERR_ULN;
robo8080 0:2206b894635f 1269 return NULL;
robo8080 0:2206b894635f 1270 }
robo8080 0:2206b894635f 1271 cip = clp + 3;
robo8080 0:2206b894635f 1272 continue;
robo8080 0:2206b894635f 1273 case I_GOSUB:
robo8080 0:2206b894635f 1274 cip++;
robo8080 0:2206b894635f 1275 lineno = iexp();
robo8080 0:2206b894635f 1276 if(err) return NULL;
robo8080 0:2206b894635f 1277 lp = getlp(lineno);
robo8080 0:2206b894635f 1278 if(lineno != getvalue(lp)){
robo8080 0:2206b894635f 1279 err = ERR_ULN;
robo8080 0:2206b894635f 1280 return NULL;
robo8080 0:2206b894635f 1281 }
robo8080 0:2206b894635f 1282 gpush(clp);
robo8080 0:2206b894635f 1283 gpush(cip);
robo8080 0:2206b894635f 1284 if(err) return NULL;
robo8080 0:2206b894635f 1285 clp = lp;
robo8080 0:2206b894635f 1286 cip = clp + 3;
robo8080 0:2206b894635f 1287 continue;
robo8080 0:2206b894635f 1288 case I_RETURN:
robo8080 0:2206b894635f 1289 cip = gpop();
robo8080 0:2206b894635f 1290 lp = gpop();
robo8080 0:2206b894635f 1291 if(err) return NULL;
robo8080 0:2206b894635f 1292 clp = lp;
robo8080 0:2206b894635f 1293 break;
robo8080 0:2206b894635f 1294 case I_FOR:
robo8080 0:2206b894635f 1295 cip++;
robo8080 0:2206b894635f 1296 if(*cip++ != I_VAR){
robo8080 0:2206b894635f 1297 err = ERR_FORWOV;
robo8080 0:2206b894635f 1298 return NULL;
robo8080 0:2206b894635f 1299 }
robo8080 0:2206b894635f 1300 index = *cip;
robo8080 0:2206b894635f 1301 ivar();
robo8080 0:2206b894635f 1302 if(err) return NULL;
robo8080 0:2206b894635f 1303
robo8080 0:2206b894635f 1304 if(*cip == I_TO){
robo8080 0:2206b894635f 1305 cip++;
robo8080 0:2206b894635f 1306 vto = iexp();
robo8080 0:2206b894635f 1307 } else {
robo8080 0:2206b894635f 1308 err = ERR_FORWOTO;
robo8080 0:2206b894635f 1309 return NULL;
robo8080 0:2206b894635f 1310 }
robo8080 0:2206b894635f 1311 if(*cip == I_STEP){
robo8080 0:2206b894635f 1312 cip++;
robo8080 0:2206b894635f 1313 vstep = iexp();
robo8080 0:2206b894635f 1314 } else {
robo8080 0:2206b894635f 1315 vstep = 1;
robo8080 0:2206b894635f 1316 }
robo8080 0:2206b894635f 1317
robo8080 0:2206b894635f 1318 lpush(clp);
robo8080 0:2206b894635f 1319 lpush(cip);
robo8080 0:2206b894635f 1320 lpush((unsigned char*)vto);
robo8080 0:2206b894635f 1321 lpush((unsigned char*)vstep);
robo8080 0:2206b894635f 1322 lpush((unsigned char*)index);
robo8080 0:2206b894635f 1323 if(err) return NULL;
robo8080 0:2206b894635f 1324 break;
robo8080 0:2206b894635f 1325 case I_NEXT:
robo8080 0:2206b894635f 1326 cip++;
robo8080 0:2206b894635f 1327 if(*cip++ !=I_VAR){
robo8080 0:2206b894635f 1328 err = ERR_NEXTWOV;
robo8080 0:2206b894635f 1329 return NULL;
robo8080 0:2206b894635f 1330 }
robo8080 0:2206b894635f 1331
robo8080 0:2206b894635f 1332 if(lstki < 5){
robo8080 0:2206b894635f 1333 err = ERR_LSTKUF;
robo8080 0:2206b894635f 1334 return NULL;
robo8080 0:2206b894635f 1335 }
robo8080 0:2206b894635f 1336 index = (short)lstk[lstki - 1];
robo8080 0:2206b894635f 1337 if(index != *cip){
robo8080 0:2206b894635f 1338 err = ERR_NEXTUM;
robo8080 0:2206b894635f 1339 return NULL;
robo8080 0:2206b894635f 1340 }
robo8080 0:2206b894635f 1341 cip++;
robo8080 0:2206b894635f 1342 vstep = (short)lstk[lstki - 2];
robo8080 0:2206b894635f 1343 var[index] += vstep;
robo8080 0:2206b894635f 1344
robo8080 0:2206b894635f 1345 vto = (short)lstk[lstki - 3];
robo8080 0:2206b894635f 1346 if( ((vstep < 0) && (var[index] < vto)) ||
robo8080 0:2206b894635f 1347 ((vstep > 0) && (var[index] > vto))){
robo8080 0:2206b894635f 1348 lstki -= 5;
robo8080 0:2206b894635f 1349 break;
robo8080 0:2206b894635f 1350 }
robo8080 0:2206b894635f 1351 cip = lstk[lstki - 4];
robo8080 0:2206b894635f 1352 clp = lstk[lstki - 5];
robo8080 0:2206b894635f 1353 continue;
robo8080 0:2206b894635f 1354
robo8080 0:2206b894635f 1355 case I_IF:
robo8080 0:2206b894635f 1356 cip++;
robo8080 0:2206b894635f 1357 cd = iif();
robo8080 0:2206b894635f 1358 if(err){
robo8080 0:2206b894635f 1359 err = ERR_IFWOC;
robo8080 0:2206b894635f 1360 return NULL;
robo8080 0:2206b894635f 1361 }
robo8080 0:2206b894635f 1362 if(cd)
robo8080 0:2206b894635f 1363 continue;
robo8080 0:2206b894635f 1364 // If false, same as REM
robo8080 0:2206b894635f 1365 case I_REM:
robo8080 0:2206b894635f 1366 // Seek pointer to I_EOL
robo8080 0:2206b894635f 1367 // No problem even if it points not realy end of line
robo8080 0:2206b894635f 1368 while(*cip != I_EOL) cip++;
robo8080 0:2206b894635f 1369 break;
robo8080 0:2206b894635f 1370 case I_STOP:
robo8080 0:2206b894635f 1371 while(*clp){
robo8080 0:2206b894635f 1372 clp += *clp;
robo8080 0:2206b894635f 1373 }
robo8080 0:2206b894635f 1374 return clp;
robo8080 0:2206b894635f 1375 case I_INPUT:
robo8080 0:2206b894635f 1376 cip++;
robo8080 0:2206b894635f 1377 iinput();
robo8080 0:2206b894635f 1378 break;
robo8080 0:2206b894635f 1379 case I_PRINT:
robo8080 0:2206b894635f 1380 cip++;
robo8080 0:2206b894635f 1381 iprint();
robo8080 0:2206b894635f 1382 break;
robo8080 0:2206b894635f 1383 case I_LET:
robo8080 0:2206b894635f 1384 cip++;
robo8080 0:2206b894635f 1385 ilet();
robo8080 0:2206b894635f 1386 break;
robo8080 0:2206b894635f 1387 case I_OUT:
robo8080 0:2206b894635f 1388 cip++;
robo8080 0:2206b894635f 1389 iout();
robo8080 0:2206b894635f 1390 break;
robo8080 0:2206b894635f 1391 case I_SERVO:
robo8080 0:2206b894635f 1392 cip++;
robo8080 0:2206b894635f 1393 iservo();
robo8080 0:2206b894635f 1394 break;
robo8080 0:2206b894635f 1395 case I_MOVE:
robo8080 0:2206b894635f 1396 cip++;
robo8080 0:2206b894635f 1397 imove();
robo8080 0:2206b894635f 1398 break;
robo8080 0:2206b894635f 1399 case I_WAIT:
robo8080 0:2206b894635f 1400 cip++;
robo8080 0:2206b894635f 1401 int t = iexp();
robo8080 0:2206b894635f 1402 if(err) return NULL;
robo8080 0:2206b894635f 1403 if(t < 0) t = 0;
robo8080 0:2206b894635f 1404 wait_ms(t);
robo8080 0:2206b894635f 1405 break;
robo8080 0:2206b894635f 1406 case I_VAR:
robo8080 0:2206b894635f 1407 cip++;
robo8080 0:2206b894635f 1408 ivar();
robo8080 0:2206b894635f 1409 break;
robo8080 0:2206b894635f 1410 case I_ARRAY:
robo8080 0:2206b894635f 1411 cip++;
robo8080 0:2206b894635f 1412 iarray();
robo8080 0:2206b894635f 1413 break;
robo8080 0:2206b894635f 1414 case I_LIST:
robo8080 0:2206b894635f 1415 case I_NEW:
robo8080 0:2206b894635f 1416 case I_RUN:
robo8080 0:2206b894635f 1417 err = ERR_COM;
robo8080 0:2206b894635f 1418 return NULL;
robo8080 0:2206b894635f 1419 }
robo8080 0:2206b894635f 1420
robo8080 0:2206b894635f 1421 switch(*cip){
robo8080 0:2206b894635f 1422 case I_SEMI:
robo8080 0:2206b894635f 1423 cip++;
robo8080 0:2206b894635f 1424 break;
robo8080 0:2206b894635f 1425 case I_EOL:
robo8080 0:2206b894635f 1426 return clp + *clp;
robo8080 0:2206b894635f 1427 default:
robo8080 0:2206b894635f 1428 err = ERR_SYNTAX;
robo8080 0:2206b894635f 1429 return NULL;
robo8080 0:2206b894635f 1430 }
robo8080 0:2206b894635f 1431 }
robo8080 0:2206b894635f 1432 }
robo8080 0:2206b894635f 1433
robo8080 0:2206b894635f 1434 void irun(){
robo8080 0:2206b894635f 1435 unsigned char* lp;
robo8080 0:2206b894635f 1436
robo8080 0:2206b894635f 1437 gstki = 0;
robo8080 0:2206b894635f 1438 lstki = 0;
robo8080 0:2206b894635f 1439 clp = listbuf;
robo8080 0:2206b894635f 1440
robo8080 0:2206b894635f 1441 while(*clp){
robo8080 0:2206b894635f 1442 cip = clp + 3;
robo8080 0:2206b894635f 1443 lp = iexe();
robo8080 0:2206b894635f 1444 if(err)
robo8080 0:2206b894635f 1445 return;
robo8080 0:2206b894635f 1446 clp = lp;
robo8080 0:2206b894635f 1447 }
robo8080 0:2206b894635f 1448 }
robo8080 0:2206b894635f 1449
robo8080 0:2206b894635f 1450 void icom(){
robo8080 0:2206b894635f 1451 cip = ibuf;
robo8080 0:2206b894635f 1452 switch(*cip){
robo8080 0:2206b894635f 1453 case I_LIST:
robo8080 0:2206b894635f 1454 cip++;
robo8080 0:2206b894635f 1455 if(*cip == I_EOL || *(cip + 3) == I_EOL)
robo8080 0:2206b894635f 1456 ilist();
robo8080 0:2206b894635f 1457 else
robo8080 0:2206b894635f 1458 err = ERR_SYNTAX;
robo8080 0:2206b894635f 1459 break;
robo8080 0:2206b894635f 1460 case I_NEW:
robo8080 0:2206b894635f 1461 cip++;
robo8080 0:2206b894635f 1462 if(*cip == I_EOL)
robo8080 0:2206b894635f 1463 inew();
robo8080 0:2206b894635f 1464 else
robo8080 0:2206b894635f 1465 err = ERR_SYNTAX;
robo8080 0:2206b894635f 1466 break;
robo8080 0:2206b894635f 1467 case I_LOAD:
robo8080 0:2206b894635f 1468 cip++;
robo8080 0:2206b894635f 1469 iload("/local/AUTO.BAS");
robo8080 0:2206b894635f 1470 break;
robo8080 0:2206b894635f 1471 case I_RUN:
robo8080 0:2206b894635f 1472 cip++;
robo8080 0:2206b894635f 1473 irun();
robo8080 0:2206b894635f 1474 break;
robo8080 0:2206b894635f 1475 default:
robo8080 0:2206b894635f 1476 iexe();
robo8080 0:2206b894635f 1477 break;
robo8080 0:2206b894635f 1478 }
robo8080 0:2206b894635f 1479
robo8080 0:2206b894635f 1480 if(err && err != ERR_ESC){
robo8080 0:2206b894635f 1481 if(cip >= listbuf && cip < listbuf + SIZE_LIST && *clp)
robo8080 0:2206b894635f 1482 {
robo8080 0:2206b894635f 1483 newline(); c_puts("ERR LINE:");
robo8080 0:2206b894635f 1484 putnum(getvalue(clp), 0);
robo8080 0:2206b894635f 1485 c_putch(' ');
robo8080 0:2206b894635f 1486 putlist(clp + 3);
robo8080 0:2206b894635f 1487 }
robo8080 0:2206b894635f 1488 else
robo8080 0:2206b894635f 1489 {
robo8080 0:2206b894635f 1490 newline(); c_puts("YOU TYPE: ");
robo8080 0:2206b894635f 1491 putlist(ibuf);
robo8080 0:2206b894635f 1492 }
robo8080 0:2206b894635f 1493 }
robo8080 0:2206b894635f 1494
robo8080 0:2206b894635f 1495 }
robo8080 0:2206b894635f 1496
robo8080 0:2206b894635f 1497 void basic(){
robo8080 0:2206b894635f 1498 unsigned char len;
robo8080 0:2206b894635f 1499
robo8080 0:2206b894635f 1500 // sci2_init();
robo8080 0:2206b894635f 1501 io_init();
robo8080 0:2206b894635f 1502 inew();
robo8080 0:2206b894635f 1503 c_puts("TOYOSHIKI TINY BASIC"); newline();
robo8080 0:2206b894635f 1504 // c_puts("PIC24F EDITION"); newline();
robo8080 0:2206b894635f 1505 c_puts("Wallbot EDITION"); newline();
robo8080 0:2206b894635f 1506 error(); // Print OK, and Clear error flag
robo8080 0:2206b894635f 1507
robo8080 0:2206b894635f 1508 if(in0 == 0) //Auto Load & Run
robo8080 0:2206b894635f 1509 {
robo8080 0:2206b894635f 1510 c_puts("Auto Load & Run");
robo8080 0:2206b894635f 1511 newline();
robo8080 0:2206b894635f 1512 if(iload("/local/AUTO.BAS") == 0)
robo8080 0:2206b894635f 1513 {
robo8080 0:2206b894635f 1514 error(); // Print OK, and Clear error flag
robo8080 0:2206b894635f 1515 irun();
robo8080 0:2206b894635f 1516 }
robo8080 0:2206b894635f 1517 error(); // Print OK, and Clear error flag
robo8080 0:2206b894635f 1518 }
robo8080 0:2206b894635f 1519
robo8080 0:2206b894635f 1520 // Input 1 line and execute
robo8080 0:2206b894635f 1521 while(1){
robo8080 0:2206b894635f 1522 c_putch('>');// Prompt
robo8080 0:2206b894635f 1523 c_gets(); // Input 1 line
robo8080 0:2206b894635f 1524 len = toktoi(); // Convert token to i-code
robo8080 0:2206b894635f 1525 if(err){ // Error
robo8080 0:2206b894635f 1526 newline(); c_puts("YOU TYPE:");
robo8080 0:2206b894635f 1527 c_puts(lbuf);
robo8080 0:2206b894635f 1528 error();
robo8080 0:2206b894635f 1529 continue; // Do nothing
robo8080 0:2206b894635f 1530 }
robo8080 0:2206b894635f 1531
robo8080 0:2206b894635f 1532 if(*ibuf == I_NUM){ // Case the top includes line number
robo8080 0:2206b894635f 1533 *ibuf = len; // Change I_NUM to byte length
robo8080 0:2206b894635f 1534 inslist(); // Insert list
robo8080 0:2206b894635f 1535 if(err){
robo8080 0:2206b894635f 1536 error(); // List buffer overflow
robo8080 0:2206b894635f 1537 }
robo8080 0:2206b894635f 1538 } else {
robo8080 0:2206b894635f 1539 icom(); // Execute direct
robo8080 0:2206b894635f 1540 error(); // Print OK, and Clear error flag
robo8080 0:2206b894635f 1541 }
robo8080 0:2206b894635f 1542 }
robo8080 0:2206b894635f 1543 }
robo8080 0:2206b894635f 1544
robo8080 0:2206b894635f 1545