豊四季タイニーBASIC mbed Edition

Dependencies:   mbed

豊四季タイニーBASICを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/

移植の詳細はこちら http://blog.goo.ne.jp/roboz80/e/b4ab8db9c3d6495d370706c28d963a40

機能拡張例はこちら http://blog.goo.ne.jp/roboz80/e/3ecb59a9d2e60e16b5048879ef238924

Committer:
robo8080
Date:
Fri May 08 06:16:48 2015 +0000
Revision:
0:f7402df15e75
test1

Who changed what in which revision?

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