豊四季タイニーBASIC mbed Edition
豊四季タイニー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
ttbasic.cpp@0:f7402df15e75, 2015-05-08 (annotated)
- Committer:
- robo8080
- Date:
- Fri May 08 06:16:48 2015 +0000
- Revision:
- 0:f7402df15e75
test1
Who changed what in which revision?
User | Revision | Line number | New 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 |