うおーるぼっと版 豊四季タイニーBASIC
Dependencies: BufferSerial Servo TB6612FNG2 mbed
豊四季タイニーBASICをうおーるぼっとに移植してみました。
豊四季タイニー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"を見て下さい。
ttbasic.cpp@0:2206b894635f, 2015-09-05 (annotated)
- Committer:
- robo8080
- Date:
- Sat Sep 05 00:29:26 2015 +0000
- Revision:
- 0:2206b894635f
test1
Who changed what in which revision?
User | Revision | Line number | New 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 |